Repository navigation
feat(compact): lay the entry screen out as the platform’s grouped list - #576
Merged
alchaplinsky merged 4 commits intoOct 11, 2026
Merged
Conversation
The phone's read screen was the desktop's detail pane folded narrow: a 60px tile beside a two-line header repeating the kind and the host, tracked uppercase labels as big as the values they captioned, a copy button on every row making the right side heavier than the left, the one-time code in a desktop dial panel dropped under the credentials, and tags, files and dates in three different idioms under it all. Now, with Passwords and 1Password as the references: a one-line header (44px tile, title, 44px star), with a subtitle only where the kind adds something no row says; rows in the grouped list's geometry (sentence-case 12px captions, 2px over the value, 8px over and under, the rail pulled into the padding so glyphs sit 16px from the edge) with no copy button — the value is the copy control; the code as a row under the password with a countdown ring in its rail, on both shells; files, passkeys, custom fields and tags as sections with one card-row cell for every "add"; and the dates as a single centred meta line at the end. Everything in the rows, header and sections is scoped to the phone (max-md: or phone-only components). The desktop sees two changes: the one-time code reads as a row with a ring rather than a dial column, and the editor's row is labelled "One-time code" rather than "OTP".
Contributor
|
… phone The rows that draw their own value — a custom pair, an env variable, a key's comment and fingerprint, a scope list — kept a copy button on the phone and, for the custom and env rows, the desktop's geometry. One element now renders every row's value as the copy control (fields/CopyValue), one token wraps every row's copy button so the phone hides it (ROW_COPY), and the phone grid is exported from fields/Row for the two rows that do not render through FieldRow. Compact tests cover a custom field and an env variable. Also keeps the password row's slot wrapping on the phone, so the history panel takes a line of its own again; the stamp and the history toggle keep to the meter's line by a zero flex basis instead.
The history's rows kept a standalone copy button on the phone beside a value that already copies when pressed. The value renders through CopyValue like every other row's, and the button sits in ROW_COPY, which hides it there. The history test covers the press and the wrapper.
alchaplinsky
added this pull request to stack #580
October 11, 2026 00:30
…o feat/compact-entry-detail # Conflicts: # src/components/Main/Body/Aside/Show/Attachments/index.tsx # src/styles/theme.css # src/test/compact.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The phone's entry screen, laid out as the platform's grouped list — Apple Passwords and 1Password 8 are the references. Stacked on #574 (it uses the header-action tier from there); target
mainonce that merges.Header. One row: a 44px tile, the title, and the star as a 44px header action, so the row's two ends weigh the same. The "Login · host" line is gone — the rows already say what the entry is and where it belongs.
Eyebrowgains abaremode that prints only what the kind adds (an identity's document type), and the phone header draws it only for kinds that have one.Rows. The grouped list's geometry, all
max-md:infields/Rowandtokens.ts:ROW_LABEL), 2px over the value, 8px over and under — about 56px a row, down from 69.One-time code. A row under the password, the grouped digits as its value and a countdown ring in its rail (
fields/Otp/Countdown: a conic gradient on a registered--otp-left, so the per-second steps glide). The value copies when pressed. This read face applies on both shells — it is the same pattern on desktop in both reference apps and removes the two-column special case. The editor keeps the dial as the live preview of a pasted secret.Under the rows. Files, passkeys, custom fields and tags are sections (
SECTION_LABEL: 12px uppercase with the tracking pulled in, inset to the rows). Every "add" — "Attach file", "Add tag" — is the same card-row cell (ACTION_ROW). The dates are one centred meta line at the end.Compact/Detail/Metarenders that;Show/Bodytakes it as itsFooter, reading the same facts the desktop strip does.Desktop. Unchanged except for two things: the one-time code reads as a row with a ring rather than the dial column, and the editor's row is labelled "One-time code" rather than "OTP" (added to all ten locales). The edit form's footer on the phone still uses the desktop strip, as before.
Verification
bun run typecheck,bun run lint(0 warnings),bun run build: cleanbun run test: 1074 passed, including new cases for the OTP row (both shells) and the phone layoutDecisions