Skip to content

Design the new-archive draft workspace and its save sheet (#293) - #297

Merged
skyswordw merged 2 commits into
mainfrom
claude/293-draft-design-f53903
Nov 6, 2026
Merged

skyswordw merged 2 commits into
mainfrom
claude/293-draft-design-f53903

Conversation

@skyswordw

@skyswordw skyswordw commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

Integrated validation

Merged into main in sequence #295–#300. Final main commit 7c5393672d028f31bc76f83911a02e1407a53cf7 has the same file tree as tested integration commit 8fb4dda. Full local validation passed 687 tests in 102 suites with zero failures/skips, 0/1,261 missing zh-Hans strings, unchanged generated plists and clean diff checks. Bounded native CUA/AX draft creation and Search Clear/Close checks passed, including independent ZIP byte verification; this is not VoiceOver testing. See the review comment for scope and remaining native checks. Final main CI and the integrated #300 snapshot run supersede cancelled intermediate reruns.

Design side of #293, using the functional foundation from #295. Claude Code owns this visual/motion treatment; functional ownership of the draft model, routing, security, cancellation and tests stays with Codex / Grok Bot. This PR does not claim functional acceptance of #293.

Files: App/Pack/ArchiveDraftView.swift (replaces the scaffolding), the draft path of App/Pack/PackSheet.swift, demo scenes, zh-Hans strings, DESIGN.md › New archive draft.

Draft window

Heading. The format's Finder icon, then the name as the window's title (.title2 semibold). It's an inline field that looks like the title until you hover or click it. The extension follows as a Pack-sentence token (.zip ⌄, amber) that picks any format. Under it: Not saved yet · 5 items · 884 kB before compression. That's the originals' size, never a final archive size, and there's no encryption claim. Save… sits at the trailing edge, where the Browser keeps Save.

Hierarchy. Empty: the card's Add Files… is the prominent button and Save steps back to plain glass, disabled. Filled: Save… becomes the prominent button, and Add/Remove move to a list bar attached to the list (+ Add Files…, − Remove / Remove N Items, "Drop more to add them"). The keys stay in the Edit menu (⇧⌘A, ⌘⌫, ⌘Z).

Contents card is the drop target, like the Tray card and the Welcome drop zone: a dashed edge while empty, then accent edge + tint + 1.015 scale while a drag is over it. Filled, it's a native outline: top-level items in the order they were added, folders openable (contents sorted by name, with item counts), each file's real Finder icon and size, and collision-numbered names (Notes 2.txt). Context menu: Remove ("The originals stay where they are") and Show in Finder. A problem shows as a yellow-tinted card above the list, with selectable text and a × to dismiss.

empty, light
empty, dark
filled, light
filled, dark

Save sheet for a draft

The draft already has a name and format, so the sentence ("Pack 5 items as a…") doesn't fit. In draft mode the sheet leads with what will be saved: the icon and the purpose-safe file name (Harbor Handoff.zip) over the planned contents. Then a short form with labels aligned like More Options: Name (with extension, and a caption when characters get replaced), Format (any format), For, Password (the existing password/confirm fields open under it), and Where (the suggested folder, "Suggested. You'll confirm the folder next."). The report card, More Options, the "About 810 kB" estimate and the folder chooser are reused unchanged. The primary button reads Save….

save sheet, light
save sheet, dark

Quick Pack is unchanged: without a draft, the sheet still shows the sentence, Save as and Pack… (current capture below).

quick pack, unchanged

zh-Hans and Increase Contrast

zh empty
zh filled
zh save sheet
Increase Contrast (Stow override)

Captures were taken while Stow was not the active app, so prominent buttons (Add Files…, Save…, and Pack… in the quick-Pack reference) and the selection render in their inactive grey. They are enabled and show the accent in a key window.

Motion

Moment Motion
Rows an add or Undo brings in The Tray's accent ring + faint tint at once, fading after 1.2 s (status); the last one is scrolled into view (no scroll animation under Reduce Motion)
Empty ↔ filled Cross-fade (status 200 ms); none after a key press, so ⌘Z and ⌘⌫ don't animate
Drag over the card target spring, scale 1.015 + tint (fade only under Reduce Motion)
Format changes The token blurs over to the new format (token 180 ms); the icon cross-fades
Problem card Fades in (status) and out (exit)
Packing Pack capsule rises over the list (rise)
Save sheet System sheet; the password rows keep Pack's existing transitions

Behaviour changes (called out per AGENTS.md)

  • ArchiveDraft.chooseSources() now passes forAdding: true, so the draft's panel says Add Files / "Choose files and folders to add." instead of Choose / "…to pack." The model is otherwise untouched.
  • The draft's context menu adds Show in Finder (read-only: it reveals the source files).
  • The problem card's × clears draft.problem.
  • In the draft sheet, Format lists every format. Picking one the current purpose doesn't offer switches to the first purpose that does, the same rule restore() already applies to a draft's format. Splitting is set only in More Options there; the sentence still offers it in quick Pack.
  • Unchanged: one shared ArchiveDraft, Undo/Redo, subtree removal, collision naming, cancel keeps the draft, passwords never persisted, the window delegate's close protection and undo manager, the Save/Add/Delete menu commands, and the save → folder chooser → conflict → engine path.

Checks

  • xcodebuild … build: succeeds.
  • xcodebuild … test (with -derivedDataPath ~/Library/Developer/Xcode/DerivedData/stow-293-draft): 685 tests in 102 suites passed (2026-11-05, commit e6f770e). Builds into the worktree's own build/ hung before connecting: a spindump showed the test host stuck in dyld waiting on a sandbox approval for files under ~/Downloads, where this worktree lives. Building outside Downloads avoids that.
  • scripts/check-localizations.sh zh-Hans: 0 of 1249 strings missing. The 17 new strings have zh-Hans and comments. Two strings the old scaffolding used ("Unsaved archive", "Add files or folders to create an archive.") are now unused. I left them in the catalog to keep Localizable.xcstrings merges small for the sibling PRs.
  • New demo scenes: draft-empty, draft, draft-save (README scene list updated).
  • Not done: native mouse/drag passes in a key window, real Reduce Motion / Reduce Transparency switches (only Stow's -StowIncreaseContrast override was captured), and VoiceOver (deferred under Accessibility: AX label recursion crashes archive activation and Browser failure states #93). No frame bursts were recorded for these transitions.

All captures: pr-assets/293-draft.

🤖 Generated with Claude Code

The draft window gets a heading (format icon, the name as an inline title
field, the extension as a sentence token, "Not saved yet" with the planned
contents' size before compression) and Save at the trailing edge. Its
contents card is the drop target: an empty state with Add Files, then a
native outline of the real files with Finder icons, a list bar for Add and
Remove, the Tray's arrival ring, and a dismissible problem card.

PackSheet keeps the Pack sentence for quick Pack. For a draft it shows
what will be saved and a short form (Name, Format, For, Password, Where)
over the same report, More Options, estimate and folder chooser.

Adds draft-empty, draft and draft-save demo scenes, zh-Hans strings and
a DESIGN.md section. The draft's Add panel now uses the existing
"Add Files" wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@skyswordw skyswordw left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Functional integration review completed with no remaining blocking findings. Reviewed outline selection/removal, source identity, name/format changes, compatibility/password reconciliation, cancellation, and preservation of quick Pack. The two draft recovery findings were fixed in dependency #295 (ae3547d, 7de295e).

The combined tree passed 687 tests with no failures/skips and complete zh-Hans export. In an isolated ad-hoc app, CUA/AX exercised Add Files, selection, Remove/Undo, Save, cancellation preserving the edited name/files, and real ZIP creation followed by Browser opening. Independent ZIP reading matched the source bytes. The zh-Hans dark Save-sheet snapshot was inspected for readable controls. This is functional integration/AX evidence, not VoiceOver or final visual/motion acceptance; Claude Code owns the design.

@skyswordw
skyswordw changed the base branch from claude/288-tray-settings-design-21beb4 to main November 6, 2026 00:46
@skyswordw
skyswordw merged commit 32ac187 into main Nov 6, 2026
0 of 3 checks passed
@skyswordw

Copy link
Copy Markdown
Member Author

Creation direction superseded by the user's native review, 2026-11-05 (Pacific/Honolulu). The separate draft Save form and compact draft composition in this PR are no longer the design acceptance direction. Preserve the draft's functional contracts, but restore Stow's sentence builder as the primary Pack configuration; put direct controls/all-format choice inside More Options; use Pack for creation and Save for existing-archive edits. The draft workspace should feel consistent with Browser. General Sharing is requested alongside existing recipient purposes. The new current visual task is #302; its linked brief replaces the conflicting guidance here. Codex is implementing functional state/routing/control changes; Claude Code owns the Browser/draft visual redesign. No Claude session or acceptance is implied.

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