Skip to content

feat(extract): the extraction window is an open sheet (#336) - #337

Merged
Maxaubert merged 6 commits into
mainfrom
feat/336-extract-sheet
Oct 10, 2026
Merged

Maxaubert merged 6 commits into
mainfrom
feat/336-extract-sheet

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #336.

The owner picked variant B, "Open sheet" (mockups: research/prism/mockups/2026-10-09-extract-dialog/round2/index.html, overview.png beside it). Brief: "clean, fits every theme, minimal text": the bar, the percentage, one live line naming the file being extracted right now (WinRAR style), and Cancel.

What changed

  • ExtractWindow: no title, no caption, no destination line. The archive is the box's title and its aria-label ("Extracting X to D" / "Couldn't extract X").
  • Top row, 40px fixed: the percentage at 34px weight 400 with a small % in --p-text-soft (blank until the engine speaks), Cancel at its end.
  • The bar is a 12px recessed well: --p-control ground, --p-dim2 inset edge, --p-accent-solid fill, corners var(--p-radius). It is the widest and thickest thing in the window. The old pulse before the first number is gone (the well is simply empty, per the mockup).
  • File line under it: UI face, tabular figures, 12.5px, fixed 18px, --p-dim. Fitted by a canvas measure in the MIDDLE so the member's own name is kept (fitPath, pure, unit-tested; replaces the character-count middleEllipsis). It is written in a layout effect and refits on resize or zoom. Main's existing 60ms progress cap (PROGRESS_EVERY_MS) keeps renders under one per frame, so no extra throttle was needed.
  • Cancelling: the file line says "Cancelling" and Cancel dims (disabled, 50%).
  • Failed: "Couldn't extract" (17px semibold, --p-text) takes the number's place, the well keeps the fill where it stopped, hatched in --p-dim (the reducer now keeps pct on failure), the file line is the reason alone (failureText no longer repeats "That couldn't be extracted."), and Close is --p-sel-bg with --p-on-accent.
  • Padding 20px top and bottom, 22px at the sides, width 456px.
  • Unchanged: cannot be dismissed (scrim, inert root, key guard), focus on the box at every phase, Cancel is a request that waits for the clean-up, success closes silently, the 700ms minimum showing, failure turns the same window into the error, keyed Cancel/Close.
  • CLAUDE.md: a note under the extraction window rule. Version 0.100.0 (minor, feature; main is 0.99.1 and fix(explorer): coming back out of a zip shows it in the preview again (#334) #335 takes 0.99.2).

Tests

  • npm run typecheck: clean. npm run lint: 0 errors (7 existing warnings). npm test: 2657 passed, 2 skipped.
  • e2e (parked runner, one process at a time): extract (extract, extractWindow, extractCancel) all passed; zip =treeVerbs =drag (sevenZip, flatZip, zipMenus, zipWrites, zipProject, zipRestore, zipLocked, zipFolder, drag, treeVerbs) all passed.
  • New e2e assertions: every route's window has no heading and no drawn archive name, its label names the archive and destination and its tooltip the archive; through a real 7-Zip run the box and the well are sampled every 25ms and never change size or move; the file line ticks through at least three members; the number is only ever a percentage, 34px at 400; the well is 12px and the widest thing, --p-control with an --p-accent-solid fill; padding 20/20; the file line is in the UI face; the cancelling state is caught at its commit (line says Cancelling, Cancel disabled at 0.5); the failure shows "Couldn't extract", the hatched stopped well, the reason alone, and Close on --p-sel-bg.
  • Screenshots in .e2e/shots/: extract-sheet-running-aurora.png, extract-sheet-running-sand.png, extract-sheet-failed-{aurora,sand,jade,midnight-hc}.png, plus the full-window extract-window-running.png and extract-window-error.png. Compared with the mockup's B; they match.

Not machine-testable, for the hands-on pass: how the ticking file line reads zoomed in on a real large archive.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

Maxaubert and others added 6 commits October 9, 2026 21:12
The owner's pick of round 2 (B): no title and no caption, a large regular
percentage with Cancel on the top row, a 12px recessed well as the bar, and
one live line naming the member being written, fitted in the middle so its
own name stays. Failed: "Couldn't extract" in the number's place, the well
hatched where it stopped, the reason on the file line, Close on the accent
fill. Every behaviour of the window is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
The file line rebuilt its ResizeObserver on every progress event, and a new observer fires on observe, so every tick was fitted twice with a style read each time. Now the observer lives as long as the window, skips its first call, and the font is read once.

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

Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
# Conflicts:
#	CLAUDE.md
#	package-lock.json
#	package.json
# Conflicts:
#	package-lock.json
#	package.json
@Maxaubert
Maxaubert merged commit 9378370 into main Oct 10, 2026
3 checks passed
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.

Extraction window: the open sheet look (bar, percentage, file line, Cancel)

1 participant