Repository navigation
Restyle Android with the Pinakes 2026 design - #41
fabiodalez-dev wants to merge 8 commits into
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Important
The new resting style for text fields removes their only visible boundary. On the sign-in, registration and onboarding cards, and in the profile dialogs, an unfocused field now looks identical to the surface around it.
Reviewed changes
I reviewed the full restyle in 709250c: theme tokens, fonts, shared components, the home, catalog, detail and auth screens, i18n, and the new tests.
- Theme system:
ThemePalette, the sRGBmix()andreadableColor()helpers,PinakesColorsexposed throughLocalPinakesColors, and light/dark M3 schemes derived from the palette. - Typography: Inter is replaced by Geist (UI) and Fraunces (headings). The static TTFs and their OFL licences are bundled.
- Book artwork:
BookCoverdraws a 3D book with fitted (uncropped) artwork.BookCardGridsupports classic and tinted styles, with optional sampling of the cover tone. - Home and catalog: the home screen gets a hero with search and a cover fan, and search hands its query to the catalog tab. The catalog gains a grid/list toggle and keeps sort, filters and pagination.
- Book detail: adds the kicker row, author chips, a grouped availability box, quick facts, and one
DigitalFileCardper audio or e-book file. - Auth screens: login, registration, forgot-password and onboarding now share the
AuthFormwash and card. - Dark-mode fix:
LoanCalendarandStatusLinenow follow the in-app dark preference instead ofisSystemInDarkTheme(). - Tests:
ThemePaletteTestchecks contrast across all seven palettes, andRestylingUiTestadds Compose device tests.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
Important
The new soft field fill fixes the auth cards and screens. It doesn't fix the profile and review dialogs, because their default container is the same colour as the fill. In dark mode, those fields are still invisible at rest.
Reviewed changes
I reviewed what changed in 197d717 since the last review (611f7ea).
- Text fields: Removed the outer focus ring from the outlined fields. Their resting fill is now
surfaceVariant(soft), and Material's accent outline marks focus. - Dark action fill: Lifted
darkin dark mode to 3:1 againstsurfacewhile it keeps 4.5:1 with white text.ThemePaletteTestnow covers this and also checks text onsoft. - Home: Split out
HomeContentand movedheroQueryabove the phaseCrossfade, so a search draft now survives Loading → Content. Loading now scrolls, and Empty is now aLazyColumn. Added two device tests for this. - Book detail: Shown the
·separator before the year only when there is a publisher. ReplacedGenreChipwith aGenrePathrow (grandparent › parent › name › subgenre). - Typography: Added
PublicationTitleStyle(Fraunces 17/21) for publication titles in periodical, issue, article, review and club rows. - Docs: Updated DESIGN.md (inputs, dark fill pairing) and the README feature table and test counts.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ No new issues found. The last open finding about field visibility is fixed, and I have resolved both related threads.
Reviewed changes
I reviewed what changed in 0703cd2 since the last review (197d717).
- Profile dialogs: Set
containerColor = MaterialTheme.colorScheme.surfaceonEditProfileDialogandChangePasswordDialog. Thesoftfield fill now differs from the dialog in both light and dark mode. The review text field inBookReviewsSectionsits on asurfaceContainerLowcard, not a dialog, so it never had this problem. - Docs: Updated the DESIGN.md inputs section to say the two dialogs use
surfaceexplicitly.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ No new issues found. The profile date and gender selectors now look like the other fields in the dialog.
Reviewed changes
I reviewed what changed in 678d104 since the last review (0703cd2).
- Profile selectors: Changed
GenderFieldandDateFieldtoshapes.smallwith asurfaceVariant(soft) fill, which matchesPinakesTextField. Before this, theirsurfaceContainerLowfill was the same colour as thesurfacecontainer ofEditProfileDialog, so they had no visible edge at rest. Now they stand out from the dialog in both light and dark mode.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ No new issues found. Article covers, subtitles and published resources follow the server data, and resource links open only when the address is HTTP(S) with a host.
Reviewed changes
I reviewed what changed in c6a485d since the last review (678d104).
- Article model: Added
subtitle,coverUrland the published-resource fields toStandaloneArticle.publicResourceAddressneedshas_public_resourceand a non-blank address.publicResourceUrlis set only for an HTTP(S) URI with a host, the same checkpublicPdfUrluses. - Article detail: Added the cover and subtitle and moved the PDF action above the metadata. A published resource is either a button (web URL) or selectable text (local archive reference), shown with its access conditions.
- Website action: Added
StandaloneArticlesSource.articleWebUrl(id), which returnsnullby default.PeriodicalsRepositorybuilds it frominstanceOrigin, as the Book Club poll links already do, so the bearer token never goes into a URL. - Article list: Changed
StandaloneArticleRowto aRowwith a compactBookCoverand a subtitle line. - Tests and docs: Added
StandaloneArticleUiTest(published, unpublished and local-reference cases) and contract tests for decoding and URL filtering. Added the four-language strings and updated README, STATUS and the article integration notes.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
✅ No new issues found. The new emulator launcher is development tooling only, and its signal handling and exit codes work correctly.
Reviewed changes
I reviewed what changed in 075c65c since the last review (c6a485d). No app code changed.
- Emulator launcher: Added an executable
tools/run-emulator.sh. It finds the emulator throughANDROID_HOME/ANDROID_SDK_ROOTorPATHand starts the AVD in the background. On macOS it also runscaffeinate -i -w <pid>, which ties the power assertion to that emulator. If the emulator exits with an error,set -eand the finalwaitreturn that error code. OnINT/TERMthe script stops the emulator and exits with 130 or 143. TheEXITtrap always ends thecaffeinateprocess. - Docs: Added a README section about running the standalone emulator on macOS and a STATUS bullet with the startup measurements. Both say that this only helps the development emulator and does not fix ANRs on real devices.
claude-opus-5-5 | 𝕏
There was a problem hiding this comment.
ℹ️ No critical issues. There is one small consistency suggestion inline.
Reviewed changes
I reviewed what changed in e188b9c since the last review (075c65c).
- Typeset placeholder cover: Added
BookPlaceholder. It draws a cloth binding with a ruled border, a faint texture and an arc, and sets the title in Fraunces. Author and publisher appear only on wide, non-compact covers. The binding colour comes frombookPlaceholderTone(title), a UTF-8 byte hash that matches the browser. The placeholder clears its own semantics, so the image'scontentDescriptionannounces the title once. ThroughonToneit reports its paper colour, which tinted cards then use. - Legacy placeholder filtering: Added
bookCoverImageUrl. It trims the URL and treats a blank value or a serverplaceholder.{jpg,png,svg}file name as no artwork. It ignores case, query and fragment, so real files such asplaceholder-history.jpgstill load.BookCoveruses it to build the image request. Book detail uses it to decide whether the cover can be zoomed. - Callers: Changed
BookCard,BookCardGridand book detail to passauthorandpublishertoBookCover. - Tests and docs: Added
BookPlaceholderTestfor the hash keys, URL filtering and ink contrast under the gloss, and a device test for the binding tone and the single announcement. Added a README and STATUS note that the emulator power assertion does not fix an unhealthy AVD.
claude-opus-5-5 | 𝕏
| PrimaryButton(stringResource(R.string.cd_search), { onSearch(query) }, modifier = Modifier.fillMaxWidth(), | ||
| leadingIcon = Icons.Outlined.Search) | ||
| if (!centered) { | ||
| val fan = books.filter { !it.coverUrl.isNullOrBlank() }.take(4) |
There was a problem hiding this comment.
Book detail now treats a legacy placeholder.* URL as having no artwork, but this filter still counts it as a cover. If a library's newest books have legacy placeholder URLs, they take up hero fan slots that real covers further down the list should fill. Using the new helper here makes both screens agree.
| val fan = books.filter { !it.coverUrl.isNullOrBlank() }.take(4) | |
| val fan = books.filter { com.pinakes.app.ui.components.bookCoverImageUrl(it.coverUrl) != null }.take(4) |

The Android client still used Inter and elevated thumbnail cards, while the public site has moved to the 2026 design. This change brings the existing app screens into that visual language and preserves the circulation, authentication, account and plugin flows.
Bundle Geist and Fraunces with their OFL licences; introduce theme-derived warm neutrals, readable accent/button pairs and the existing opt-in dark mode.
Show complete artwork in 3D book frames, including tall covers and album art. Add classic/tinted card styles, a searchable home hero with real shelf covers, and catalog grid/list controls while retaining sort, filters and pagination.
Restyle book detail with author chips, grouped availability/actions, quick facts and a separate card per exposed digital file. Keep cover zoom, the date-based loan flow, wishlist, reviews, PDF reading and audio playback.
Apply the same controls and typography to authentication, account rows and plugin screens; update four-language copy, design documentation and screenshots.
Keep resting inputs borderless with a visible neutral fill, including profile/password dialogs with an explicit surface container; preserve native field focus outlines and readable dark action fills. Make loading/empty home states scroll on short screens and retain the search draft between phases.
The current Mobile API does not expose theme/CMS settings or the richer web-only facets and book sections. The app defaults to Classic / Covers, with a
ThemePaletteready for those settings; supported data and actions remain backed by the existing endpoints.Validation:
assembleDebugandassembleRelease(R8 and resource shrinking) pass.lintDebugpasses with zero errors.The installable debug APK is generated locally. This PR does not publish a store release.
Article viewing and management entry (#461)
Article lists and details use server-resolved covers and subtitles. Published online resources show their label and access conditions; local archive references remain text, and unpublished resources stay hidden. PDF actions appear before the metadata. The article website action opens the full page for the existing staff editing and private-PDF flows, without placing the mobile token in a URL.
The Home, Catalog, Library, Wishlist and Profile bottom navigation remains in place.
Validation: 171 unit tests and 15 Compose device tests pass; lint has zero errors, and debug plus R8 release builds succeed. Device tests ran on a separate Android 15 emulator so the Bibliodoc demonstration session was preserved.
Standalone macOS emulator startup
A standalone emulator became throttled by the host background power policy, causing slow process/class loading and system-wide stalls.
tools/run-emulator.shstarts the AVD with a power assertion scoped to its PID on macOS; the assertion ends when the emulator exits, and Ctrl+C stops both processes. Android runtime code and ANR reporting stay unchanged.Validation: the identical debug APK timed out after 21 seconds at host priority 4 without the assertion, then completed three cold starts in 2.3–3.1 seconds with it. After restarting the VM through the launcher, five more cold starts completed in 1.66–1.80 seconds with no ANR events. Bash syntax, ShellCheck, failure propagation and signal cleanup pass. This addresses the demonstrated development-emulator problem; other device ANRs require their own diagnosis.