Skip to content

feat(compact): lay the entry screen out as the platform’s grouped list - #576

Merged
alchaplinsky merged 4 commits into
feat/compact-header-actionsfrom
feat/compact-entry-detail
Oct 11, 2026
Merged

alchaplinsky merged 4 commits into
feat/compact-header-actionsfrom
feat/compact-entry-detail

Conversation

@alchaplinsky

Copy link
Copy Markdown
Member

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 main once 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. Eyebrow gains a bare mode 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: in fields/Row and tokens.ts:

  • Captions are sentence case at 12px (ROW_LABEL), 2px over the value, 8px over and under — about 56px a row, down from 69.
  • The rail is pulled 12px into the padding so a glyph sits 16px from the card's edge, the same as the caption on the left.
  • No copy button on a phone row. The value is the copy control (already the product decision), the toast confirms it, and the bottom button covers the main secret. A rail holds only the eye and the open-link.
  • The strength meter and the "Changed" stamp keep to one line; the stamp truncates.

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/Meta renders that; Show/Body takes it as its Footer, 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: clean
  • bun run test: 1074 passed, including new cases for the OTP row (both shells) and the phone layout
  • Not run on a device. Worth a look: the ring's sweep, the rail alignment on rows with two actions (password), and the tag pills in dark mode.

Decisions

  • adopted · implementation · [compact-shell] — The phone entry screen is the platform's grouped list: one-line header, sentence-case 12px captions, glyphs 16px from both card edges, sections for files/passkeys/custom fields/tags, one centred meta line for dates. — The folded desktop pane read as a responsive page, not a phone screen; this is the idiom Passwords and 1Password share.
  • adopted · implementation · [compact-shell] — No per-row copy button on the phone; the value is the copy control. — Passwords and 1Password draw rows without one; the icon on every row was what unbalanced the grid.
  • adopted · implementation · [compact-shell] — The one-time code reads as a row under the password with a countdown ring in its rail, on both shells; the editor keeps the dial preview. — Same pattern as the reference apps on every platform, and one layout instead of a side column that collapsed on narrow containers.
  • adopted · architectural · [compact-shell] — Show/Body takes its footer as a component (Footer prop), so a shell lays the same facts out its own way without the body knowing which shell it is in. — Structure is composition decided in the shell; the facts are read in one place.

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".
@greptile-apps

greptile-apps Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable issues remain from this review.

Summary

The phone entry screen now uses a grouped list with tighter rows, section headings, tag pills, and one dates line.

  • The phone entry header takes less space and repeats less.
  • One-time codes appear as copyable rows with a countdown ring.
  • Phone rows use matching captions and copy from their values.
  • Phone details group tags, files, and dates below the fields.

Reviews (3) · Last reviewed commit: "Merge remote-tracking branch 'origin/fea..." · Reviewed by Greptile

Comment thread src/components/elements/fields/Row.tsx Outdated
… 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
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
@alchaplinsky
alchaplinsky merged commit 91c38e3 into main Oct 11, 2026
13 checks passed
@alchaplinsky
alchaplinsky deleted the feat/compact-entry-detail branch October 11, 2026 00:47
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