Stow — Design Language

Current creation and entry-point direction — 2026-11-05

Follow the current Pack/Browser brief.
The user wants a Browser-consistent creation workspace, Pack… for new output, the original
sentence builder as the primary configuration, and unrestricted format controls inside More
Options
. Add General Sharing; recommendations must not be hard format restrictions. The
previous compact draft composition and separate Save form from #297 are superseded. Claude Code's
Browser-consistent treatment (#302) is in › New archive draft; Codex owns functional integration. Status-menu Open Tray is removed;
Open Stow/Settings must come to the front. Dock lists existing recent archives directly at the top
of its menu, followed by current windows with the current-window checkmark; recent files do not
require an Open Recent submenu (user correction, 2026-11-06).

Independent archive windows — 2026-11-06

The user chose one independent window per archive, with side-by-side Browser workspaces and
cross-archive drag copy into the destination's pending edits. Source files remain unchanged;
the target supports Undo/Redo and writes only on Save. Reuse the current Browser vocabulary and
composition. Follow the functional handoff for session,
password, close/quit and staging contracts. Codex owns those functional changes; Claude Code
retains visual and motion ownership. This supersedes earlier single-archive window assumptions.

Where windows open, and what they keep

A window on screen is never moved or resized by Stow; only the person does that. What decides a
window's frame is how it comes up:

Window Opens Keeps
Welcome Centred, fixed 640 × 600 Nothing to keep: it can't be resized
Browser (first archive) Where and as large as it was left (NSWindow Frame Browser); 1120 × 700 the first time Size and place
Browser (another archive) The front Browser's size, 28 pt down and to the right of it; a step that would leave the visible area starts again from the near edge. With no Browser on screen, the saved Browser frame. Never placed from Settings, Welcome, Glance or a sheet that happens to be key It doesn't write the saved frame
Glance At the pointer, pulled inside the visible area. A second archive's Glance that would land on another's steps 28 pt down and right, wrapping at the visible area's edges, so several opened at once don't hide each other when there is room Its size (GlanceWindowSize), across archives and launches; the place is always the pointer's
Glance, already on screen Comes forward where it stands (the same archive opened again, Open Stow, a question before quitting). It goes to the pointer only when it opens —
Create Archive Where and as large as it was left (NSWindow Frame Draft); 980 × 620 the first time Size and place
Settings Fixed width, 600 pt tall at least; pages never resize it Its frame (the system's)

Design snapshots ignore the saved Glance size and draft frame.

Tray, creation and entry-point functional handoff — #286

The functional implementation brief records the new interfaces and bounded
native evidence for #287–#294. Tray gains a master switch and optional residency; the user
reconfirmed outside-click dismissal without an idle timer. Welcome exposes Open/Create/Settings;
New/Create opens an editable draft sharing Pack internals, while gathered inputs keep quick Pack.
Sample leaves production bundles and becomes an explicit browser download. Search gains a
separate Close action. These changes supersede primary Welcome sample placement and mandatory
production bundling; they do not require copying ArcZip's visual composition.

Claude Code owns final visual treatment and motion. The draft workspace, settings form and
functional controls are implementation scaffolding, not approved visual designs. Preserve the
state/routing/close/undo/security contracts in the brief. The current user direction above restores
the Pack sentence for both draft creation and quick Pack. See #286 for task dependencies and #38 for remaining
physical-input/signed-integration checks. No collaborator session or visual acceptance is claimed.

Working name. Check trademarks before launch.

Ownership: Claude Code owns UI visual design and motion. Codex provides interaction
intent and functional constraints; see AGENTS.md and the
current handoff.

Stow is an archive tool for macOS. The design goal is not "a nicer file list". It is an app that
answers the three questions people actually have when they meet an archive:

  1. What's in it? — see contents instantly, preview without extracting.
  2. Is it safe? — know before extracting whether anything is odd.
  3. What do I do next? — the right next step is already on screen.

And when packing: "Will it work on their computer?"


Principles

Principle What it means here
Native first SwiftUI + AppKit, Liquid Glass, SF Symbols, system font, system controls. No web views, no custom chrome that fights the OS.
Content is the hero Keep archive content readable and give navigation, Details and floating actions coherent depth and Liquid Glass treatment. Claude Code owns the surface composition, including purposeful overlapping controls.
Say it in a sentence Options are expressed as a readable sentence ("Pack 12 items as ZIP for Windows PCs"), not a dialog of checkboxes.
Trust is visible Every opened archive gets a safety summary. Risky things are explained in plain words, not error codes.
Fast hands, no animation Keyboard actions and things done 100×/day never animate. Motion is reserved for spatial changes and rare moments.
Forgiving Nothing touches the original until "Save". Every destructive step is undoable or staged.

Vocabulary (our own — do not borrow competitor names)

Concept Name in Stow Notes
Main window Browser File workspace and a fixed Details pane; no left navigation pane in the current direction
Information pane Details File preview, identity and properties; archive information when nothing is selected
Compact quick window Glance Small floating window near the pointer for quick extract
Context actions Actions Coherent floating action region for the current selection
Drop shelf Tray Floating panel that collects files from anywhere
Purpose presets "For…" destinations Windows PCs · Macs · Linux & servers · Web upload
Compression dialog Pack sentence Sentence-builder with tappable tokens
Archive findings Archive Info Background checks remain; relevant notices appear with the files, ordinary findings are disclosed in archive information. Checkup remains an internal name.

Clarity update, confirmed 2026-10-31 (#229/#230): remove the permanent Checkup button
and prominent normal-status report. Keep archive checks and concrete notices, without implying
malware scanning or general safety. Archive Info remains reachable from the title menu during
selection; Details labels its archive/file/folder/selection scope. This supersedes the historical
always-visible shield guidance. See the functional implementation handoff.
The title bar's composition is now #242's floating-path direction, under Browser layout; the
centered-search proposal (#231, PR #241) is superseded.

Current direction after the user's PR #177 review, 2026-10-24: the full Browser remains
the default; Glance is optional. (Since 2026-11-02 archives open in the window used last, which is
the Browser until someone switches; see Browser layout › Opening an archive.) The full Browser has a file workspace and fixed, visible
Details
, with no Details collapse toggle. Remove the separate left folder-navigation pane
from the proposed Browser composition; retain navigation through the files, breadcrumbs,
history, parent navigation and search. This supersedes the earlier optional-left/optional-right
pane studies. Claude Code owns the final visual composition and motion.

The user chose Actions as the English public name and confirmed floating Actions. The
bottom action region should contain commands, without repeating the selected filename/size
summary next to Quick Look; those facts belong in Details. The supplied ArcZip collapsed and
expanded action-stack crops are the preferred interaction reference to investigate. Neither
a single enclosing capsule nor fidelity to Codex's earlier mockups is required. See the
current direction and evidence.

The app, Settings, the More menu, File › Actions and the website say Actions (Simplified
Chinese 快捷操作); issue #161 tracked the
transition. Internal NextStep* types and stored preference keys keep their existing names. Preserve explicit
user preferences where compatible with these newer product decisions. The
earlier product design review retains historical
evidence; its optional-pane composition and mockups are superseded.

Ellipses on commands

The Mac rule, applied the same way to menu items, buttons in content, floating glass and title-bar
buttons that carry a word: a label ends in … when the command asks for more before it does
anything — an Open or Save panel, a sheet, a sentence to finish, a share picker, Settings.

Browser layout (#160, #161)

Floating-path direction (#242, user's choice 2026-10-31). The user compared interactive
alternatives and chose this one; it supersedes the centered Search of #231/PR #241 and the
plain path-row and bottom-path studies.

Shape (#242). One set of shape tokens, concentric where surfaces nest, not one radius
everywhere. Details, the path capsule and the bottom capsules all stand 8 pt (Radius.windowInset)
off the window's and the files' edges, so their edges line up, and the top of Details is level
with the top of the path. Details is the panel in the window's corner, so its radius is the
window's (≈ 26 pt) less that inset: 18 pt. Every floating capsule is 38 pt tall (radius 19,
also ≈ window radius − inset) with 30 pt buttons concentric inside at a 4 pt inset. The system
inspector's own edge (its glass, side shadow and hairline) is replaced by the window's background,
so Details' rounded rim is its only outline: no square strip beside it, no doubled edge. It is the
window's own background material, not a flat colour, so in dark mode it takes the same wallpaper
tint as the files' side and the title bar reads as one surface from edge to edge.

Toolbar Search and editing (#215/#216, 2026-10-30). Search moved from the navigation row to
the title bar (where in the title bar is now #242's, above). The navigation row keeps its whole
width for the path.
Delete and Save sit in their own capsule after the view modes from the moment an
archive opens, disabled when there's nothing to delete or save, so editing is found before the
first edit. Save is the one Save in the full window: with changes pending it becomes a prominent
Save pill (accent, with its name). The name unrolls from the icon over 0.26 s (folds back over
0.18 s), stepped like Search so the controls before it slide aside instead of jumping; a key press
or Reduce Motion makes the change at once (ToolbarNamedAction). The draft's Pack… does the
same, and stays lit behind its own sheet: a prominent toolbar button that goes disabled is redrawn
by the toolbar and blinks out for a moment. The bottom bar keeps the change count, "Nothing changes on
disk until you save." and Revert, and shows saving progress. Glance has no title bar, so its bar
keeps its own Save. Delete stays quiet: it only stages a change. Add Files, Rename and Replace
stay in the Edit menu and the item's context menu. The
native comparison and functional brief records the
ArcZip observations behind this.

Region Holds
Title bar Leading: archive name/menu and subtitle, then the password control when encrypted. Trailing: Search (a button that opens leftward), view modes, Delete · Save. Narrow windows give up the view modes first (the View menu has them, ⌘1–3); Search, editing and password access stay
Navigation, floating over the files Back · Forward · Up and the path; a short path takes only its width, a deep path uses the whole row and folds its middle folders into a ⋯ menu
Files The main surface: grid, list or columns. In the list, the name takes the spare width before size, kind and date grow
Details (always there, right) An inset panel, not a strip of the window, 8 pt off the window's edges with an 18 pt radius. Its heading names the subject with a glyph and words: Archive Info, File Info, Folder Info or Selection Info. Then a content-sized preview, the name and kind, and properties as label ↔ value rows with hairlines (Size, Packed file data with the saving underneath, Modified, Location in archive stacked under its label at full width: “Showcase.zip › Showcase › Docs”). A note that qualifies a figure sits under that figure, in the accent when it counts unsaved changes. An app leads Developer Verification with the developer, then what was verified. Archive Info when nothing is selected: the three figures, the password control, then routine facts and ordinary notes behind More Archive Information. No toggle, no close button, no action buttons
Window switch, floating bottom leading Glance in a glass circle of its own: switching windows isn't done to the archive. Glance has Open in Full Window among its window controls in the same corner
Archive capsule, floating bottom trailing Quick Look (eye, icon only) · Extract All, fixed and never changing, as in Glance (user's call, 2026-11-07: the full window follows Glance's layout). Quick Look is dimmed until items of this archive are selected, and gone only when hidden in Settings › Actions; Extract All keeps the accent until Actions shows, staying semibold so only its fill fades
Actions, just before the capsule ⋯ More, then the stack: the front action in the accent with the edges of the others showing behind it, easing out of the capsule. Quick Look isn't one of the stack's actions here or in Glance (it has the capsule's eye; ⋯ still lists it), so the next flow — Copy to, Open Inside, Install, Extract — takes its slot. No name or size: Details says what's selected. With nothing selected, Install App alone when the archive is one app

The Actions stack. The front button is what the selection is most likely for: Install for
an app, fonts or an installer package, otherwise Extract. The other shown steps wait behind it,
nearest first, and fan out above it, the same width as the front, when the pointer rests on the
stack or its edges are clicked; leaving folds them back, and Esc folds them before it clears the
selection. Only the strip above the front button opens the stack, so a click or an accessibility
press aimed at it can never land on the front action. Pointing only reveals: every action takes a
click, and the existing install confirmations and signature checks are unchanged. The front
button's help tag names what it acts on ("Install App: Harbor Prototype.app"). More (⋯) lists
every action except the front one; File › Actions lists all of them, front first, so the
keyboard reaches every action without macOS's keyboard navigation turned on. ⌘E still extracts
from the menu bar whichever button is in front.

With nothing selected, an archive that's one app offers Install App for that app, as ArcZip
does. It's the app Stow selects on opening: the only app or package at the top, beside at most
two other items, or any number on a disk image. It shows as a single button, with no edges and
no ⋯, since Extract All is already beside it. Its help tag names the app, and it runs the same
install, with the same confirmations and checks, on that app only. Hiding Install App or Actions
in Settings removes it; File › Actions still lists it. Glance shows Install App just before its
Quick Look · Extract All capsule.

A disk image's own window (#344). An image whose author laid out its Finder window opens on
that window in Icons, at the volume's top: the author's artwork, the apps' own icons and the
"drag here" shortcut where the author placed them, on one rounded card with the panel radius and
a soft shadow. Artwork and icons scale as one, never stretched, from full size down to half; past
that the files scroll. Names keep Finder's look: plain text over the artwork, dark or light by
what's under it, in the accent capsule when selected. Items the author didn't place sit under the
card in Other Items. The shortcut shows the real folder's icon and lights in the accent, with
a little give (Motion.target), only while this image's app is held over it; dropping there runs
Install App with every check. Nothing installs by selecting, pointing or starting a drag. List
and Columns, Search and folders inside the volume browse as usual; someone who picked another view
before the canvas arrived keeps it. An image without a usable layout opens on the plain grid.
As in ArcZip, the window stays on its opening status until the layout is read (up to 5 s), so
the image arrives as its author's window rather than as plain icons that turn into it; a slower
read shows the files first and fades the canvas in. Apps anywhere in any archive show their own
icon (the one their Info.plist names) in the grid, the list, Columns, Details, Glance and drag
images; the generic app icon only stands in until it's read, or for an app with none Stow can read. Glance
shows the same window, scaled to fit, as ArcZip's Mini does, with the same drop target and Install App.
An archive tool shows everything in an image: its window dressing (.background, .DS_Store,
.VolumeIcon.icns, the Applications shortcut, drawn as the folder it points at and called a
Shortcut) is listed by default, dimmed like helper items, as ArcZip lists it. A switch at the
far end of the path's row (Browser and Glance), in its own glass, says how many there are (“4 shown”,
lit like Pin on Top; “4 hidden” with the eye crossed out) and flips them, as View › Show macOS
Helper Items (⇧⌘.) does; it appears only where there are some, and not over the installer window. The last
choice is remembered: the next disk image opens the same way (browse.showsDiskImageHelpers, shown
until someone hides them). Other archives open with them hidden, as before. It never lands on the canvas, never counts as the image's app, and
Extract All still leaves it out; choosing one on purpose extracts it. File-system bookkeeping
(.fseventsd, .Trashes, HFS+ private data) stays hidden.

One prominent action at a time: Extract All carries the accent while Actions is down; once
Actions is up, for a selection or an archive's app, the stack's front does and Extract All stays
put, unaccented (in Glance it keeps its weight and only the fill fades; see Glance layout). Archive facts live in one place, Archive Info, reached from Details with nothing
selected and the title menu. Everything floating shares one family: glass
capsules, buttons concentric inside them (button radius + inset = capsule radius), all 38 pt tall.
Details is a solid reading surface with the same light rim, brighter along its top edge.

Actions' states, all in the same place. Ready is the stack. A step that has started but measured
nothing yet (a password, the engine starting) shows its capsule with a turning ring and no
percentage; then the ring fills with the percentage beside it, and Stop. Done says where things
went, with Show in Finder; a failure grows into a card with what happened, its one action, Copy
Details and Dismiss. Stopping leaves nothing behind and the stack comes straight back. While a step
runs, Extract All waits, dimmed, its help tag saying why; while the archive is still being listed,
Actions and Extract All are dimmed the same way. A dimmed stack button gives up the accent rather
than fading. In a narrow window the words give way first: stacked labels shorten in the middle
(280 pt at most), a failure card puts Copy Details under its action, and several results inside
other archives say only "Select one result to show it".

Dragging files out and in (#332, replacing draft #320). The list and Glance drag the way
Finder's list does, because the table itself starts the drag (its own gestures choose between a drag
and a range selection; a second watcher beside them made later drags select). From a selected row
the whole selection goes, as many times in a row as you like; from any other row that row alone goes
and becomes the selection. The drag image is each row's icon and name lifted from where they sit, not
the Size, Kind and Modified cells; several rows travel as a list under the pointer, one name per
line, and the system adds the count (the default pile printed the names over each other). Columns
are rows too and travel the same way; the icon grid's tiles travel as Finder's icon view's, a pile
of their pictures with the count (ArcZip Mini shows the same pile, without names, for every view).
Where a drop would do nothing (an archive's own items over itself) nothing lights up and the items
slide back to their rows. Over another archive's list, a folder's row takes the drop into that
folder with the system's row highlight; anywhere else the files surface draws the accent edge it
shows over the path and floating controls, meaning the folder on show. (The table's own outline
for that was square inside the rounded window and ran under the path capsule, so it is turned off.) The icon grid and columns follow the same rule with the accent edge: a folder
tile or row is a target of its own, a file is not (the surface or column around it lights up
instead). Peek stays away while files are being dragged and for 0.6 s after a drop lands, so a
drop never opens a preview the pointer didn't ask for; the next hover waits the usual delay.

Opening an archive (#265, user's choice 2026-11-02). Finder, Quick Look, Recent and a drop on
the welcome open an archive straight into its window, picked before anything shows: the window used
last (the full Browser until someone switches to Glance, and still remembered after Stow quits), or
always the Browser, or always Glance, as Settings › Glance says. The welcome never shows in between;
launching Stow without an archive still shows it, and design snapshots never change the remembered
window. The Browser comes up already in its own shape: its title bar's height with the bar hidden,
the traffic lights where they'll stay, and the archive's name and kind ("ZIP archive") where its
title menu will be. The files, the path and Details arrive with the listing, which only adds the
chevron and the file count to the title. A read that takes longer than 0.4 s fades in a small spinner
and Opening “Harbor.zip”… in the middle, with Cancel (Esc); Glance shows the same words above its
window controls, and its Close stops it. A quick open shows neither.

Tray dismissal — direction confirmed 2026-11-04

The user accepted outside-click dismissal for an unpinned Tray and Keep Tray Open
for persistent display. A manually opened Tray must not disappear just because time
passes or the pointer leaves. The local functional implementation removes idle dismissal;
pinning controls persistence, not window level. Keep drag reveal, protect active drags
and Tray-owned dialogs/previews, and retain explicit Close/Escape while pinned.
Successful drops stay visible for confirmation until the next dismissal action.

The current Tray brief separates confirmed
decisions, native ArcZip 1.2.1 evidence and engineering requirements. It supersedes
older idle-dismissal guidance, not the actual-home drag activation contract.
Codex / Grok Bot owns behavior, state, tests and accessibility semantics; Claude Code
owns visual expression and motion.

How it looks (#282). Back, Keep Tray Open and Close are Glance's circular window
controls (ActionButtonStyle, 26 pt, hover fill). Kept open is pin.fill in the accent
inside an accent ring, the same on-state as Glance's Pin on Top, so it reads by shape as well
as colour; not kept open is the plain pin. Close stays right beside it: it still closes a
Tray that's kept open. Clicking the pin says what changed for 2 s in a small glass capsule
hanging under it — Stays open until you close it / Hides when you click elsewhere — that
takes no clicks and covers only the top of the first row. The help tags say the same at more
length, and Settings › Tray explains it in the Showing and Hiding footer (no setting of its
own any more). Chinese calls the Tray 托盘 everywhere and the pin 保持打开.

Glance layout (#159)

Glance is the Browser made small: the same archive, folder, selection and history, the same
floating family, and no Details or Search. It's borderless, as ArcZip's Mini is (user's
choice, 2026-10-27): no title bar and no traffic lights. The archive is named in a header inside
the window and the folder in a bar under it, with Stow's own pieces.

Selection scope when switching from Columns (#160): Columns can select a folder in
one column while showing its contents in the next. Glance shows that folder's parent list
with the folder selected, so selection actions always refer to a visible row. Returning to
Columns opens the currently selected folder's contents again; selections and navigation made
in Glance take precedence. These presentation transfers add no Back/Forward history entries
and retain the archive level and Browser view preference.

Region Holds
Header (no title bar) The archive's format badge (32 pt), its name semibold with “ZIP archive · 17 files” under it, wherever you are inside it; when encrypted, a 20 pt lock badge right after the name: accent-filled while locked, a spinner while a password is checked, a quiet open lock once one has worked. Dragging the header moves the window; the window keeps its title for the Window menu
Navigation, floating under the header The Browser's capsule: Back · Forward · Up │ the path from the archive down, running the window's width (no Search beside it); a deep path folds its middle folders into a ⋯ menu and keeps where you are in view (#242)
Files Name and size, straight on the window's one surface: Liquid Glass with a wash of the window colour for legibility, or classic frosted (Settings › Glance); solid under Reduce Transparency. No card, no frame. The badge and the rows' icons share the 16 pt margin
Window controls, floating bottom leading Close · Pin on Top · Open in Full Window in one glass capsule of icon buttons, like the navigation capsule's. Pinned: the pin fills in the accent with a ring round it
Archive capsule, floating bottom trailing Quick Look (eye, icon only) · Extract All, in one glass capsule that never moves or changes (user's call, 2026-11-07, after ArcZip's Mini, whose Preview · Extract All capsule stays put and dims Preview with nothing selected). Quick Look is dimmed until items of this archive are selected; its help tag names them. Extract All carries the accent until a selection's action shows, or while changes are pending or saving (the bar's Save is then the one); it stays semibold either way, so only the fill fades and the capsule keeps its width. Without room for its words, Extract All keeps its icon alone. File › Extract All is ⇧⌘E (#249)
Selection's action, just before the capsule The front action alone — ⚡ Extract, or Install App for an app — easing out of the capsule; no stack edges and no ⋯ (no room beside the capsule at 440 pt): a row's right-click menu and File › Actions list every action. Supersedes #248's one extraction button at a time: with Extract's bolt, Extract and Extract All no longer read as the same button. With nothing selected, an archive that's one app shows Install App here. A step's progress takes this place
Under the files The full window's unsaved-changes and changed-on-disk bars

Colourful window controls (Settings › Glance) fill the same three buttons, in the same
capsule, with the traffic lights' colours: red Close, yellow Pin on Top and green Open in Full
Window, their symbols always showing, dark as the traffic lights' are (white wouldn't read on
yellow). Nothing moves or changes size when the setting changes. Pinned adds a darker ring round
the pin's button. Not ArcZip's separate circles (user's call, 2026-10-27): the capsule keeps the
window's controls one group, and a compact Extract All would otherwise read as a fourth window
control.

Glance asks for a password with a card in the window, as ArcZip's Mini does, over everything else
dimmed; see Encrypted archives.

Encrypted archives (#104)

One lock, the same in every place it shows, and it never moves when its state changes:

State Title bar (full window) Glance header Archive Info A locked file's preview (Details)
Locked The lock glyph in the accent, on the title bar's plain glass button: findable, but not a second filled accent beside Extract All 20 pt badge filled with the accent, white lock Accent lock, “Encrypted”, Enter Password… in the accent The file's icon with an accent lock badge, the reason, Enter Password…
Checking A small spinner in the lock's place; clicking it cancels Spinner in the badge; clicking cancels Spinner, “Unlocking…”, Cancel The button keeps its size, shows the spinner and “Unlocking…”; clicking it cancels
A password has worked The open lock, quiet (secondary) Quiet open lock on a faint circle “Password available”, no action (a ZIP can still have files with another password) The preview itself

Asking. The full window asks in the system sheet (PasswordSheet, 460 pt). Glance is narrower
than that sheet (440 pt, 400 at the least) and has no title bar for a sheet to drop from, so it asks
with the same card in the window: centred, the window colour with a hairline rim and a soft
shadow, everything behind it dimmed (black 20 %, 36 % in dark) and taking no clicks. The card fills
the window less a 12 pt margin, at most 420 pt, and puts its footnote on its own line, under the
words, above Cancel · Unlock. Same words, field, Show password, keys (Return unlocks, Esc cancels)
and answers as the sheet. A rejected password says so right under the field. While a password is
checked the card is gone and the lock spins: the checking belongs to the lock. If it's wrong the
card comes back where it was, only fading in, so asking again doesn't look like a new start.

Preparing a preview. An encrypted file's Quick Look waits until it's read, so the window can
ask for the password first. For anything that takes a while, a small glass capsule (32 pt) floats
over the top of the files, under the path: Preparing “Report.pdf” for Quick Look (or Preparing 3
files…
) with Actions' ring, turning until the engine measures something, then filling with the
percentage beside it, and × to stop (so does Esc, as before). It waits 0.4 s before showing, and
the wait starts again after a password is typed, so a quick read never flashes it; it stays hidden
while the password is asked for. It isn't a step: it takes nothing from Actions' place, and Extract
All stays ready.

Settings layout (#162)

Thirteen pages are too many for toolbar tabs, so Settings is System Settings' shape: a fixed sidebar
beside one page. The window is 756 pt wide (a 196-pt sidebar, a 560-pt page) and keeps its size
when the page changes; a long page scrolls, and the window can be made taller (its width is fixed).
Switching pages doesn't animate.

Sidebar group (SettingsCategory) Pages
General General: appearance, the Browser's first view, app language, updates
Archive work Extraction · Installing · Packing
Interaction Actions · Glance · Tray · Previews
Security Passwords
System integration File Types · Finder & Permissions
Advanced Advanced (cache, reset) · Licenses

The groups are separated by space, not headings, so no heading repeats the name of the only page
under it. Every page is a grouped form: one choice per row, its explanation in the section's
footer right under it, no boxes of our own. Plain sidebar symbols, no coloured tiles.

New archive draft (#293, revised 2026-11-05)

The current contract is Pack creation direction.
New/Create opens one editable draft of real sources; Pack… opens the same sentence builder
as quick Pack. Name/format choices carry through unchanged unless the user changes them. The
More Options controls bind to that same state and expose all supported output formats without
silently changing the recipient. General Sharing adds a neutral cross-platform purpose. Existing
archive edits retain Save. Cancel/failure preserves the draft and source access; success opens
the real archive. The title format menu uses direct actions rather than an inline picker nested
inside a menu.

Layout (#302). The draft is the Browser with an archive that has nothing in it yet, as ArcZip's
Create Archive is its browser over an empty archive (inspected natively 2026-11-05: the same view
modes, Delete, Save and Search in the title bar, Back/Forward/Up with the path, the list's columns,
Add Files at the bottom and its details pane). The user asked for the same consistency with the
Browser after the first #302 pass trimmed the title bar. The previous #297 card/heading
composition and its separate Save form are superseded.

Browser Draft
Title: name ⌄ over "ZIP archive · 28 files" Name (a field that reads as the title) and the Pack sentence's .zip ⌄ token, over "Not packed yet · 5 items · 884 kB before compression"
Search · Icons/List/Columns · Delete · Save The same controls in the same capsules: Search (the draft's names), the view modes (⌘1–3), Delete (trash; takes items out of the plan, ⌘⌫, Undo puts them back) · Pack… (prominent and titled once there's something to pack, icon-only and disabled while empty)
Path capsule: Back, Forward, Up, archive › folders The same, starting at the archive-to-be (Harbor Handoff.zip)
Icons, List, Columns The same three, from the real originals: Finder icons and Quick Look thumbnails (icon mode), Finder's kind and date. A double-click opens a folder; Search lists matches with where they are
Bottom-leading glass: Extract All Add Files… (hidden while empty, where the centred button is the one prominent action)
Bottom-trailing: Actions / activity Packing's progress capsule
Details: Archive Info / File Info / Selection Info The same panel and headings. Archive Info: badge, Files to pack, Total file size — Before compression, Archive file size — Known after packing. File Info: thumbnail, kind, size before compression, date, Location in archive, Original location. Nothing claims a packed size or a password before Pack makes them

Preserve file selection, add/remove/undo, source safety, keyboard routing and system
display/motion preferences.

Color

Type

System font (SF Pro), Dynamic sizes via text styles. Hierarchy is weight + size together.

Role Style
Archive title on card .title3, semibold
Section headers .subheadline, semibold, secondary
Row title .body
Metadata .callout / .caption, secondary, monospaced digits for sizes & counts
Pack sentence .title2, regular; tokens semibold in accent, each with a small pull-down chevron so it reads as a menu

Numbers that change (counts, sizes, progress) use .monospacedDigit() and
.contentTransition(.numericText()) so they don't jitter.

Space & shape

Motion

Values from Apple's fluid-interface guidance and Emil Kowalski's design-engineering rules
(see .claude/skills/apple-design, .claude/skills/emil-design-eng).

Moment Motion Value
Actions region appears or goes (full window and Glance) Eases out of the archive capsule beside it: from 14 pt to the right, scale 0.94 → 1 from its trailing edge + opacity; back 6 pt with scale 0.97, quicker (AnyTransition.emerge). The capsule never moves; Extract All's accent fades across. None for arrow keys, ⌘A and Esc appear in, exit out; accent status 200 ms
Actions content changes on selection None (frequent) — numbers use numeric text transition —
Floating chrome leaves (Actions, pack capsule, batch panel) Ease-out fade with a smaller drop — faster than it came 180 ms
A step finishes or fails on its own Ease-out, never a spring (nobody touched it) 200 ms
A step has started but measured nothing yet A quarter arc turns in the progress ring; it stands still under Reduce Motion 1 turn/s, linear
Actions shown/hidden or its stack opened/closed by a key (arrows, ⌘A, Esc) None —
Actions stack fans out (pointer rests 140 ms on it, or its edges clicked) Spring: each action rises out of its edge: it starts at the edge's top and width, behind the front button, and grows to full width on its way up while the edge travels with it and its tint fades off, so the edge becomes the button (its glass follows the rise rather than materializing). Folding sinks it back into the edge the same way; it's removed only once hidden there. Folds back with an ease-out 450 ms after the pointer leaves (ArcZip lingers 0.5–1 s; it also opens at once, which flashes on every pass, so Stow waits 140 ms). Choosing an action or a new selection folds it at once, unanimated. Fade only under Reduce Motion response 0.32, damping 1.0 in, 180 ms out
Drop target on drag-over Spring scale 1.0 → 1.015, accent tint fades in; on Welcome, Open and Create Archive fade to 35 % in place (nothing moves) so the drop is the one ask response 0.25, damping 0.9
Tray rows a drop (or Add Files…) brought in, new or already there Accent ring and faint tint at once; fade out after 1.2 s; scrolled into view if below the fold (no scroll animation under Reduce Motion) fade Motion.status 200 ms
Hover preview 450 ms delay for the first; instant & unanimated for neighbours while one is open; closes instantly 140 ms fade
Tray panel show/hide, including an outside click or app switch hiding it Same edge in, same edge out: scale 0.96 → 1 from the menu bar + opacity (Motion.presence). Hiding on an outside click uses the same quick exit: the click has already reached what it was aimed at, and the Tray only gets out of its way appear in, exit out; none for ⌥⌘T and Esc
Keep Tray Open toggled The pin's symbol swaps with the system replace effect, its accent ring fades in or out, and the note under it drops 4 pt into place (scale 0.96 → 1 from its top-trailing corner) and fades out 2 s later. None when Space toggled it (the note still shows, unanimated); under Reduce Motion the symbol swaps at once and the ring and note only fade status 200 ms in, exit 180 ms out
Files dragged in another app (#180) Nothing comes out at the start, and nothing comes out for a drag passing by. The menu-bar icon becomes tray.and.arrow.down; over the icon it highlights. Dropped on the icon, the files go into the Tray without bringing it out, and the icon shows tray.full for 1 s. Held over the icon for the system's spring-loading delay (0.5 s unless set, kept to 0.2–1.5 s, as Finder opens a folder), the Tray comes out (under the icon, or where it was put), stays for the rest of the drag and goes back 0.8 s after the drag ends if nothing was dropped. There is no hint or approach zone, and without a visible icon a drag leaves the Tray alone: ArcZip's wide zone, a 64 pt area around the icon and Stow's earlier screen-edge hint (160 pt in, as tall as the Tray) all caught drags only passing by on a laptop screen. ArcZip's Box: no reveal at drag start; opens at once ~150–165 pt under its icon, about its own width; stays while dragging; gone within ~3 s of a drag with no drop Symbol swaps, no motion; the Tray uses its own show/hide
Password card in Glance appears / goes A click: scale 0.96 → 1 + opacity, dimming fades in; it eases out. Asked again after a wrong password: fade only. None when a key (Return, Esc, Space) caused it appear in, exit out
Preparing-a-preview capsule appears / goes (after 0.4 s) Ease-out fade with a 4 pt drop and scale 0.96 → 1 from its top; fades out. Its ring as Actions' status in, exit out
An archive's opening card (Browser, Glance) A Liquid Glass card over the files' column: the format badge, the name, what's being read (“Reading the disk image…”, then “Preparing the installer window…” for a laid-out image; the words swap with a blur) and a soft accent band crossing its track, linear, 1.6 s a pass (resting mid-track under Reduce Motion), as ArcZip's opening card has. Waits 0.4 s, then settles in: 4 pt drop, scale 0.96 → 1 + opacity. The title bar and Details' column are already in place, so the window keeps its shape status in; band linear
The archive arrives after the card was seen The window's first frame keeps the same card over the files, laid out but hidden; after 60 ms the card steps back (scale 0.97) and fades, and 60 ms later the files fade in (fade only: the list and columns are AppKit tables, which mustn't be scaled), about 300 ms in all. Glance's window controls stay put. An archive that arrives before the card shows appears at once exit card, status files
Glance opens (click, Finder) Content springs out of the pointer, scale 0.96 → 1 + opacity; glass fades in response 0.32, damping 1.0
Glance via ⌥⌘G, Esc, Glance ↔ full window by keyboard None —
Pack sentence token change Blur-crossfade of the token text (the chevron stays put) 180 ms
Pack password check rows (re-enter, mismatch) appear or go Ease-out fade, never a spring; none when typed 200 ms
Pack part-size editor (Custom…) The system popover, out of the control that was clicked: the sentence's last words, the Split archives menu, Settings › Packing. Nothing changes until Use system
More Options opened on a short screen Once the section has opened, the middle scrolls its heading to the top so the opened rows are in view; none (a jump) when a key opened it or under Reduce Motion response 0.32, damping 1.0
Details' disclosures (More Archive Information) and the notices card open or close Ease-out, never a spring; none when a key (Space) toggled it status 200 ms
The password control changes state (locked → checking → open) Ease-out as a check finishes; the symbol swap cross-fades under Reduce Motion; none when Return started the check or Esc cancelled it status 200 ms
Folder access wasn't saved: the card comes and goes Fade; none when dismissed from the keyboard exit 180 ms
Welcome and Browser windows replace each other (an archive opens or closes) The system's own window opening and closing; none when a key press switched them —
View-mode switch, keyboard nav, search filtering No animation —
Button press System controls handle it —

Reduced Motion: springs become 150 ms opacity fades (exits 100 ms); nothing translates or scales.
Glass that morphs from one shape into another (Actions' front button into its progress capsule)
cross-fades instead, the lock's symbol swap cross-fades, Search opens at once, the password card
and the preparing-a-preview capsule only fade, and the preparing ring stands still.
Reduced Transparency: Stow's glass and materials fall back to the solid window background with a
hairline edge (accessibleGlass); Glance is solid whatever material Settings chose. System glass
buttons do this themselves.
Increase Contrast: the floating capsules, Details, notices and the Tray take a visible border, the
accent pill is outlined, metadata steps up from tertiary to secondary, and the accent deepens to
#A8551C in light and dark, so white words on it reach 5.3 : 1 (4.5 : 1 needed; the usual light
amber gives 3.1). Accent words in dark mode lift to 7 : 1.
Design snapshots force Stow's side of all three with -StowReduceMotion YES,
-StowReduceTransparency YES and -StowIncreaseContrast YES (#104): views read Reduce Motion as
\.reducesMotion, models and controllers as DisplayPreferences.reducesMotionNow, never the system
value directly. What AppKit draws only follows the real setting: system controls, the accent's
high-contrast variant, the system's window opening and closing (Glance → full window by click, Welcome ↔
Browser). -StowBurst <transition> (scripts/motion-bursts.sh) records a
transition frame by frame, by click and as after a key press, for review.

Signature details

Not doing (on purpose)