Skip to content

Restyle Android with the Pinakes 2026 design - #41

Open
fabiodalez-dev wants to merge 8 commits into
mainfrom
fix/restyling-2026
Open

fabiodalez-dev wants to merge 8 commits into
mainfrom
fix/restyling-2026

Conversation

@fabiodalez-dev

@fabiodalez-dev fabiodalez-dev commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

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 ThemePalette ready for those settings; supported data and actions remain backed by the existing endpoints.

Validation:

  • assembleDebug and assembleRelease (R8 and resource shrinking) pass.
  • 171 unit tests pass; 15 Compose tests pass on an Android 15 emulator at 360 dp, including complete cover artwork, missing metadata, tinted-cover sampling, grid/list semantics, narrow search, digital cards, theme pairings, scrolling on short screens and home query preservation.
  • lintDebug passes with zero errors.
  • Theme contrast checked across all seven documented palettes in light and dark modes.
  • Manual fixture smoke verifies discovery, login, home search transfer, catalog grid/list, filters, book detail and the loan calendar, audio playback and rendered PDF reading and profile/password forms in both light and dark modes; the release variant is installed with a local debug signature for runtime checks.

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.sh starts 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.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 758711b7-1870-4bdd-b370-1ae3015d3683
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 sRGB mix() and readableColor() helpers, PinakesColors exposed through LocalPinakesColors, 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: BookCover draws a 3D book with fitted (uncropped) artwork. BookCardGrid supports 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 DigitalFileCard per audio or e-book file.
  • Auth screens: login, registration, forgot-password and onboarding now share the AuthForm wash and card.
  • Dark-mode fix: LoanCalendar and StatusLine now follow the in-app dark preference instead of isSystemInDarkTheme().
  • Tests: ThemePaletteTest checks contrast across all seven palettes, and RestylingUiTest adds Compose device tests.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt
Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/theme/Color.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/screens/home/HomeScreen.kt Outdated
Comment thread app/src/main/java/com/pinakes/app/ui/screens/detail/BookDetailScreen.kt Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 dark in dark mode to 3:1 against surface while it keeps 4.5:1 with white text. ThemePaletteTest now covers this and also checks text on soft.
  • Home: Split out HomeContent and moved heroQuery above the phase Crossfade, so a search draft now survives Loading → Content. Loading now scrolls, and Empty is now a LazyColumn. Added two device tests for this.
  • Book detail: Shown the · separator before the year only when there is a publisher. Replaced GenreChip with a GenrePath row (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.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using claude-opus-5-5 | 𝕏

Comment thread app/src/main/java/com/pinakes/app/ui/components/TextFields.kt

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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.surface on EditProfileDialog and ChangePasswordDialog. The soft field fill now differs from the dialog in both light and dark mode. The review text field in BookReviewsSection sits on a surfaceContainerLow card, not a dialog, so it never had this problem.
  • Docs: Updated the DESIGN.md inputs section to say the two dialogs use surface explicitly.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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 GenderField and DateField to shapes.small with a surfaceVariant (soft) fill, which matches PinakesTextField. Before this, their surfaceContainerLow fill was the same colour as the surface container of EditProfileDialog, so they had no visible edge at rest. Now they stand out from the dialog in both light and dark mode.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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, coverUrl and the published-resource fields to StandaloneArticle. publicResourceAddress needs has_public_resource and a non-blank address. publicResourceUrl is set only for an HTTP(S) URI with a host, the same check publicPdfUrl uses.
  • 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 returns null by default. PeriodicalsRepository builds it from instanceOrigin, as the Book Club poll links already do, so the bearer token never goes into a URL.
  • Article list: Changed StandaloneArticleRow to a Row with a compact BookCover and 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.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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 through ANDROID_HOME/ANDROID_SDK_ROOT or PATH and starts the AVD in the background. On macOS it also runs caffeinate -i -w <pid>, which ties the power assertion to that emulator. If the emulator exits with an error, set -e and the final wait return that error code. On INT/TERM the script stops the emulator and exits with 130 or 143. The EXIT trap always ends the caffeinate process.
  • 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.

Pullfrog  | View workflow run | Using claude-opus-5-5 | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ℹ️ 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 from bookPlaceholderTone(title), a UTF-8 byte hash that matches the browser. The placeholder clears its own semantics, so the image's contentDescription announces the title once. Through onTone it 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 server placeholder.{jpg,png,svg} file name as no artwork. It ignores case, query and fragment, so real files such as placeholder-history.jpg still load. BookCover uses it to build the image request. Book detail uses it to decide whether the cover can be zoomed.
  • Callers: Changed BookCard, BookCardGrid and book detail to pass author and publisher to BookCover.
  • Tests and docs: Added BookPlaceholderTest for 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.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using 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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

Suggested change
val fan = books.filter { !it.coverUrl.isNullOrBlank() }.take(4)
val fan = books.filter { com.pinakes.app.ui.components.bookCoverImageUrl(it.coverUrl) != null }.take(4)

This branch has not been deployed

No deployments
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.

1 participant