Skip to content

feat: UI themes, Lyra#528

Merged
daveallie merged 6 commits intocrosspoint-reader:masterfrom
CaptainFrito:feature/ui-theme
Feb 5, 2026
Merged

feat: UI themes, Lyra#528
daveallie merged 6 commits intocrosspoint-reader:masterfrom
CaptainFrito:feature/ui-theme

Conversation

@CaptainFrito
Copy link
Contributor

@CaptainFrito CaptainFrito commented Jan 24, 2026

Summary

What is the goal of this PR?

  • Visual UI overhaul
  • UI theme selection

What changes are included?

IMG_7649 Medium
IMG_7746 Medium
IMG_7651 Medium

Additional Context

  • Only the Home, Library and main Settings screens have been implemented so far, this will be extended to the transfer screens and chapter selection screen later on, but we need to get the ball rolling somehow :)
  • Loading extra covers on the home screen in the Lyra theme takes a little more time (about 2 seconds), I added a loading bar popup (reusing the Indexing progress bar from the reader view, factored into a neat UI component) but the popup adds ~400ms to the loading time.
  • Home screen thumbnails will need to be generated separately for each theme, because they are displayed in different sizes. Because we're using dithering, displaying a thumb with the wrong size causes the picture to look janky or dark as it does on the screenshots above. No worries this will be fixed in a future PR. Thumbs are now generated with a size parameter
  • UI Icons will need to be implemented in a future PR.

AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? PARTIALLY
This is not a vibe coded PR. Copilot was used for autocompletion to save time but I reviewed, understood and edited all generated code.

@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 6 times, most recently from ec0ce9d to 5d8178c Compare January 25, 2026 07:51
@el
Copy link
Contributor

el commented Jan 25, 2026

Amazing work,

I tried this out and I have a few feedback:

  • Everytime you go back to the home screen there are two separate "loading" screens before the book covers pop up
  • Book covers should be cropped imo, otherwise we get a white part below or on the right
  • When a book does not have a book cover, it appears blank. There should be a default book cover
  • Bottom bar buttons do not align with the physical buttons I think they should be a bit wider to match the actual ones
  • Nit: Right buttons should be a few pixels higher to match the physical ones.
  • I find it a bit counterintuitive to have Left-Right (< / >) buttons on the right and up down buttons on the bottom because of the positions of the buttons. I think they should be switched

Overall really liked the theme and how quick it is to browse around. I think all of my feedback can be taken care of very easily even as a follow-up PR.

@DavidOrtmann
Copy link

Great job with the Themes. Agreeing with @el's observations here, don't want to repeat everything, but things I found most noticable:

  • Switching left-right, up-down is not intuitive yet for switching categories and settings, respectively.
  • The active status of the category (Display, Reader) is too faint, I find it barely noticeable (only when switching). I think the selected category should also be filled with gray or be bolded.
  • Browse files/ File Transfer in the main menu look a bit too minimalistic and lost, especially with very few books (I only have two), so there is a lot of white space underneath. It feels like this part of the menu should be separated more with some kind of border or fill

IMG_20260125_214132

Apart from this, I think this looks really professional, and I love the introduction of Themes.

@CaptainFrito
Copy link
Contributor Author

CaptainFrito commented Jan 26, 2026

Thanks a lot for the detailed feedback guys!

The two separate "Loading" popups you get every time you return to the home screen, is that the plain popup and then the popup with the progress bar? The way it works is we show the plain popup when we're loading existing thumbnails (which should be most of the time) and the progress bar one when we have to generate the thumbnails (which should be the first time only, or whenever a new book is added to the list). I didn't test the case where a book doesn't have a cover, it might try to generate it every time and show you the progress bar, is that what's happening? We need a special case for that then.

On the subject of button bindings, we had initially set the side buttons for Up and Down and the front buttons for Left and Right, which would seem more intuitive. But while using it that way all of us found it almost unusable. Switching tabs will happen a lot less than scrolling the list so in the end it makes sense that it's bound to the less prominent side buttons. We could make this a setting too if you'd like.

I will leave the designers respond to the visual feedback. I can update the PR today with corrections. Thanks team!

@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 2 times, most recently from 83f0ff6 to 7f802de Compare January 26, 2026 04:49
@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 2 times, most recently from 63eabae to c6640aa Compare January 26, 2026 07:15
@CaptainFrito
Copy link
Contributor Author

I updated the PR with a fix for the crashes some users were experiencing while testing, and an empty thumbnail is now created when the book has no cover, so that you don't get the loading popup repeatedly on the home screen. This is now stable and awaiting a response from the design team for the rest of the feedback.

@Uri-Tauber
Copy link
Contributor

Switching tabs will happen a lot less than scrolling the list so in the end it makes sense that it's bound to the less prominent side buttons. We could make this a setting too if you'd like.

I agree with @el and @DavidOrtmann that this feels a bit unintuitive. Additionally, I tend to use the side buttons more easily, maybe because I'm left-handed. Adding a setting to control this would be a good idea.

@DavidOrtmann
Copy link

Another thought I've had: Maybe we just don't separate category and setting navigation from each other? We could do all these with the same button pair:
Select category > Select > Select setting
Go to start or end of list to change the category.
(I would prefer a button logic most people "get" instead of too many granular settings.)

@CaptainFrito
Copy link
Contributor Author

Another thought I've had: Maybe we just don't separate category and setting navigation from each other? We could do all these with the same button pair: Select category > Select > Select setting Go to start or end of list to change the category. (I would prefer a button logic most people "get" instead of too many granular settings.)

You mean like in the 0.15 release where there's a first settings menu with the 4 categories, and then another screen for each of them?

@DavidOrtmann
Copy link

You mean like in the 0.15 release where there's a first settings menu with the 4 categories, and then another screen for each of them?

Not like an extra page, no. The page layout would stay the same as in the current dev version. This currently has Settings Categories and the settings themselves on one screen. Now imagine you can reach the categories and the settings with the same button. It would feel like this:

(Symbol ↓ means "clicking down button"; bold text is a category)

DisplayReader [click select = enters Reader settings] ↓ ControlsSystem ↓ Font Family ↓ Font Size

The above would be the path to change the font size. It would only need the up/down button and the select button, no need for left/right.

@CaptainFrito
Copy link
Contributor Author

You mean like in the 0.15 release where there's a first settings menu with the 4 categories, and then another screen for each of them?

Not like an extra page, no. The page layout would stay the same as in the current dev version. This currently has Settings Categories and the settings themselves on one screen. Now imagine you can reach the categories and the settings with the same button. It would feel like this:

(Symbol ↓ means "clicking down button"; bold text is a category)

DisplayReader [click select = enters Reader settings] ↓ ControlsSystem ↓ Font Family ↓ Font Size

The above would be the path to change the font size. It would only need the up/down button and the select button, no need for left/right.

Dude this is actually a step in the right direction! To expand on that we could even treat the tab bar as just another line, meaning you can highlight the tab bar when you land on it with the up/down arrows, and when it's highlighted you can press enter to change tabs. The selection cursor would be the same as any other lines, light grey background and selected tab on black background.

Thanks man this sounds like it would be way more intuitive than what we have now, but since we're not using the side buttons at all we could probably keep them as a shortcut to change tabs still.

@daveallie
Copy link
Member

Really neat work @CaptainFrito! Agree with a lot of the feedback already here, but counter to a few of the others, I actually prefer the new tab/item navigation button layout for basically the reason you mentioned, the side buttons feel like a "higher-order" control and them controlling the sections makes more intuitive sense to me, that being said, I'm sure I'd adjust to either option.

@el
Copy link
Contributor

el commented Jan 27, 2026

Not sure if it is related to my device, but the Calibre URL screen is broken for this branch.

Also, instead of hiding the button completely, can we hide partially like the Figma mocks?

SCR-20260127-pezw

@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 2 times, most recently from 14d5580 to 9443edf Compare January 29, 2026 06:54
@CaptainFrito
Copy link
Contributor Author

CaptainFrito commented Jan 29, 2026

Not sure if it is related to my device, but the Calibre URL screen is broken for this branch.

Also, instead of hiding the button completely, can we hide partially like the Figma mocks?

Thanks @el it is now fixed, and I added the little inactive button indicator which looks pretty cool!

I worked on the controls for the tab bar, and I think we're now at a point where it's a lot more usable:
IMG_7798 Medium
IMG_7799 Medium

So when we land on a screen with tabs, they are in a selected state first, which lets you change tabs with the confirm button. You can move up and down normally to select the settings, and the tab bar is considered the first item in the list, so when you move your selection to the top they get selected. It's really nice overall to be able to control everything with just up/down/confirm.
So now we can decide what to do with the side buttons, they can either be also linked to up/down, just like the left/right buttons, for people who like to use the side buttons for scrolling, or we can link them to tab left/right for a quick shortcut when you're down the list and want to change tab.

The selected tab was also made more visible.

@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 2 times, most recently from 45dd22e to db2a7f4 Compare January 30, 2026 09:34
@CaptainFrito
Copy link
Contributor Author

In order to simplify interactions on the Library screen, the design team proposed we split the My Library screen into Browse Files and Recents. Both are accessible from the home screen which also gives the main menu a bit more substance. I have updated the PR with this change.

This will leave extra room on either screen for extra features that are included in the Lyra mockups:

  • In the File browser, icons and a toolbar with the current path
  • In the Recents screen, a grid of book cover thumbnails

Most of the other feedback has been addressed, except for:

  • Different cover aspect ratios cause a white bar under the cover when selected
  • No default cover for books without one

These things could be added in a separate PR to avoid having this one drag on too long and accumulating conflicts with master.

@CaptainFrito
Copy link
Contributor Author

@CaptainFrito Awesome work! Personally, I prefer a fast, responsive UI over thumbnails. Would it be possible to add a setting to disable thumbnails on the home screen?

Maybe it could show simple book icons with the names of recent books instead. That would allow instant loading, while still giving users the option to enable thumbnails if they prefer.

Oh yeah good idea! Let's save this for another PR though so we don't pile features into this one

@CaptainFrito CaptainFrito force-pushed the feature/ui-theme branch 2 times, most recently from 29d1b0d to 40eeead Compare February 2, 2026 01:00
@CaptainFrito
Copy link
Contributor Author

PR updated with UITheme as a singleton

Copy link
Member

@daveallie daveallie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small change needed for recents

serialization::readString(inputFile, title);
serialization::readString(inputFile, author);
recentBooks.push_back({path, title, author});
serialization::readString(inputFile, coverBmpPath);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line will crash when reading existing recent book files. We'll need to bump RECENT_BOOKS_FILE_VERSION and then handle the version as 2 / 3.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed! Thanks

Copy link
Member

@daveallie daveallie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's possible to get blank covers for books as part of moving from master to this branch, and as far as I can tell there's no way to fix them.

Replication:

  • Checkout and build master
  • Open a few books to populate recents
  • Swap to this branch and build
  • Swap to Lyra theme
  • Check home screen

IMG_6010

It'll be because empty string is treated as no cover available.

Additionally, the same thing happens to books when you delete their metadata, they become coverless.

I won't be able to have another look tonight, but if you could make sure to test the upgrade pathway for people moving from master -> this branch -> Lyra for a bunch of common usecase and ensure they work properly, that would help the review.

@CaptainFrito
Copy link
Contributor Author

CaptainFrito commented Feb 2, 2026

I've improved the upgrade path for recent books coming from versions 1 and 2. Now it will reload the books to get the title, author and cover.

@lepislepis
Copy link

Since some people only read one book at a time, would it be possible to display just a single featured book on the homepage?

daveallie
daveallie previously approved these changes Feb 5, 2026
@daveallie
Copy link
Member

Single featured book can come as a followup PR, keen to get this one merged to close out this monster

@daveallie daveallie merged commit bf87a7d into crosspoint-reader:master Feb 5, 2026
1 check passed
@CaptainFrito CaptainFrito deleted the feature/ui-theme branch February 5, 2026 10:50
jdk2pq added a commit to jdk2pq/crosspoint-reader that referenced this pull request Feb 5, 2026
* master:
  feat: add shift lock to KeyboardEntryActivity (crosspoint-reader#513)
  feat: rename and move in file manager (crosspoint-reader#630)
  feat: Implement fix for sunlight fading issue (crosspoint-reader#603)
  chore: Add PR title check on sync (crosspoint-reader#698)
  feat: Go To Position for epubs (crosspoint-reader#666)
  feat: Calibre Web Automated (CWA) koreader sync server support (crosspoint-reader#594)
  chore: Add CI check job to consolidate status (crosspoint-reader#696)
  chore: CI Build Summary - firmware stats, firmware artifact (crosspoint-reader#601)
  feat: quick rotate option in epub reader menu (crosspoint-reader#685)
  feat(settings): add "Cover + Custom" sleep screen mode (crosspoint-reader#582)
  fix: Artifacts on Thumb on Home Screen (crosspoint-reader#662)
  feat: holding back button while booting, boots to home screen as a mean of escaping boot loop (crosspoint-reader#587)
  docs: Add small SCOPE.md and GOVERNANCE.md documents (crosspoint-reader#640)
  feat: front button remapper (crosspoint-reader#664)
  feat: UI themes, Lyra (crosspoint-reader#528)
  feat: Add CSS parsing and CSS support in EPUBs (crosspoint-reader#411)
  fix: move http upload state to heap (crosspoint-reader#657)
Unintendedsideeffects pushed a commit to Unintendedsideeffects/crosspoint-reader that referenced this pull request Feb 17, 2026
## Summary

### What is the goal of this PR?

- Visual UI overhaul
- UI theme selection

### What changes are included?

- Added a setting "UI Theme": Classic, Lyra
- The classic theme is the current Crosspoint theme
- The Lyra theme implements these mockups:
https://www.figma.com/design/UhxoV4DgUnfrDQgMPPTXog/Lyra-Theme?node-id=2003-7596&t=4CSOZqf0n9uQMxDt-0
by Discord users yagofarias, ruby and gan_shu
- New functions in GFXRenderer to render rounded rectangles, greyscale
fills (using dithering) and thick lines
- Basic UI components are factored into BaseTheme methods which can be
overridden by each additional theme. Methods that are not overridden
will fallback to BaseTheme behavior. This means any new
features/components in CrossPoint only need to be developed for the
"Classic" BaseTheme.
- Additional themes can easily be developed by the community using this
foundation

![IMG_7649
Medium](https://github.com/user-attachments/assets/b516f5a9-2636-4565-acff-91a25b93b39b)
![IMG_7746
Medium](https://github.com/user-attachments/assets/def41810-ab6e-4952-b40f-b9ce7d62bea8)
![IMG_7651
Medium](https://github.com/user-attachments/assets/518a9a6d-107a-4be3-9533-43a2b64b944b)



## Additional Context

- Only the Home, Library and main Settings screens have been implemented
so far, this will be extended to the transfer screens and chapter
selection screen later on, but we need to get the ball rolling somehow
:)
- Loading extra covers on the home screen in the Lyra theme takes a
little more time (about 2 seconds), I added a loading bar popup (reusing
the Indexing progress bar from the reader view, factored into a neat UI
component) but the popup adds ~400ms to the loading time.
- ~~Home screen thumbnails will need to be generated separately for each
theme, because they are displayed in different sizes. Because we're
using dithering, displaying a thumb with the wrong size causes the
picture to look janky or dark as it does on the screenshots above. No
worries this will be fixed in a future PR.~~ Thumbs are now generated
with a size parameter
- UI Icons will need to be implemented in a future PR.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**PARTIALLY**_
This is not a vibe coded PR. Copilot was used for autocompletion to save
time but I reviewed, understood and edited all generated code.

---------

Co-authored-by: Dave Allie <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants