Repository navigation
Design the new-archive draft workspace and its save sheet (#293) - #297
Conversation
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
left a comment
There was a problem hiding this comment.
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.
|
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. |
Integrated validation
Merged into
mainin sequence #295–#300. Final main commit7c5393672d028f31bc76f83911a02e1407a53cf7has the same file tree as tested integration commit8fb4dda. 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 ofApp/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 (
.title2semibold). 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.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….Quick Pack is unchanged: without a draft, the sheet still shows the sentence, Save as and Pack… (current capture below).
zh-Hans and Increase Contrast
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
status); the last one is scrolled into view (no scroll animation under Reduce Motion)status200 ms); none after a key press, so ⌘Z and ⌘⌫ don't animatetargetspring, scale 1.015 + tint (fade only under Reduce Motion)token180 ms); the icon cross-fadesstatus) and out (exit)rise)Behaviour changes (called out per AGENTS.md)
ArchiveDraft.chooseSources()now passesforAdding: 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.draft.problem.restore()already applies to a draft's format. Splitting is set only in More Options there; the sentence still offers it in quick Pack.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 ownbuild/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 keepLocalizable.xcstringsmerges small for the sibling PRs.draft-empty,draft,draft-save(README scene list updated).-StowIncreaseContrastoverride 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