-
Notifications
You must be signed in to change notification settings - Fork 0
feat: add accessible Storybook UX contracts #246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
seonghobae
wants to merge
728
commits into
main
Choose a base branch
from
feat/storybook-ux-contracts
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
728 commits
Select commit
Hold shift + click to select a range
8d40f1f
docs: record bounded organization lineage export
seonghobae f48e4b4
ui: explain incomplete provider sync blockers
seonghobae 285ec04
fix: accept resumable upload progress responses
seonghobae ee55149
fix: honor resumable upload acknowledgement semantics
seonghobae 5fda919
docs: record fresh icloud materialization receipt
seonghobae 1411c36
test: reject assumed OneDrive upload progress
seonghobae 8b95a2d
fix: bind OneDrive resume offsets to server evidence
seonghobae cc693e4
docs: record scheduler oidc startup failure
seonghobae 190239a
test: cover release SBOM Cargo manifest
seonghobae 39ad42e
test: cover cache cleanup help without home
seonghobae 80fd8c2
fix: terminate cache cleanup help before environment lookup
seonghobae 26ca6e5
fix: bind release SBOM metadata to Rust manifest
seonghobae 6140fec
test: reject disk-full numeric prefix collisions
seonghobae 33eaee5
fix: bound provider disk-full numeric codes
seonghobae 5bb576e
test: cover disk-full numeric marker boundaries
seonghobae 98d4ca8
feat: add ontology-bound orphan cache cleanup (#245)
seonghobae 64e58c9
fix: bound resumable upload no-progress loops
seonghobae 682fff3
feat: add accessible Storybook UX contracts
seonghobae eb89d67
test: execute Storybook interaction contracts
seonghobae dc5a900
ci: install Chromium for Storybook checks
seonghobae 9b7422a
fix: enforce Storybook accessibility edges
seonghobae 5882c6e
test: assert mobile Storybook viewport
seonghobae f718620
fix: make Storybook checks test built output
seonghobae 0a2c22d
docs: bind ADR to static Storybook checks
seonghobae e086965
test: isolate Storybook viewport state
seonghobae 35e7005
fix: isolate Storybook viewport per story
seonghobae 6a46a2c
refactor: use Svelte 5 layout children
seonghobae 21b143d
docs: refresh Storybook test evidence
seonghobae 0a1506a
test: keep checking state non-cancellable
seonghobae 9317023
fix: keep checking provider state non-cancellable
seonghobae fcff463
fix: expose finder cancellation for provider errors
seonghobae fcb57a7
test: isolate design-system button styling
seonghobae c2dc2eb
fix: scope design-system button visuals
seonghobae 3b13600
fix: opt scan actions into design controls
seonghobae 9f2644a
fix: opt provider action into design controls
seonghobae 800da44
docs: record exact-head ecosystem audit
seonghobae ef30368
docs: bind ecosystem audit to current head
seonghobae 2a4ed38
fix: style provider card headings consistently
seonghobae 2c57310
docs: refresh UX test evidence
seonghobae aa7437f
docs: bind ecosystem audit to latest UX head
seonghobae e13714e
docs: clarify implementation head binding
seonghobae 8daf766
docs: point audit at UX implementation head
seonghobae 0b4a1db
test: cover brctl summary without last sync
seonghobae 0758690
fix: parse brctl sync token without last sync
seonghobae 201dc9d
docs: record OneDrive provider stall evidence
seonghobae 3704dd1
fix: isolate native cloud copy staging
seonghobae e6c6e34
docs: bind native staging hardening to live evidence
seonghobae 957464d
Merge provider sync hardening into UX branch
seonghobae c14dfd1
docs: bind provider audit to exact PR head
seonghobae 4cbccf2
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 9cf9665
fix: lock projection reads with paired writes
seonghobae 81d5136
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 2e2d510
docs: record paired projection read locking
seonghobae e9db532
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae b710000
docs: record OneDrive post-headroom reconciliation
seonghobae 57eef9d
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae a8247dd
test: require readable skip-link contrast
seonghobae 4fe49d5
fix: preserve skip-link contrast in dark mode
seonghobae b0869e0
test: bind Storybook viewport runner to globals
seonghobae 15cf8c3
fix: follow Storybook 10 viewport globals
seonghobae 45a5a00
fix: use Storybook 10 viewport configuration
seonghobae 49cd202
fix: select mobile viewport through Storybook globals
seonghobae fe9e21a
test: follow Storybook 10 viewport globals
seonghobae 532bef3
fix: back off blocked provider probes
seonghobae 4177b3b
fix: type Storybook viewport globals
seonghobae 859bbfa
fix: back off blocked provider probes
seonghobae 7b24f74
fix: disclose provider retry backoff
seonghobae 5313f55
fix: disclose provider retry backoff
seonghobae 8cc113d
merge: converge Storybook stack on provider probe owner
seonghobae c6cde11
test: keep control sizing opt-in
seonghobae 25cf033
fix: read Storybook 10 viewport globals
seonghobae 3f80c4b
fix: disclose all regenerable cache targets
seonghobae a66c456
feat: add accessible Storybook UX contracts
seonghobae 16c3422
test: execute Storybook interaction contracts
seonghobae 3ac4e42
ci: install Chromium for Storybook checks
seonghobae fc497ad
fix: enforce Storybook accessibility edges
seonghobae 5e6a4a0
test: assert mobile Storybook viewport
seonghobae c7739ce
fix: make Storybook checks test built output
seonghobae 533c22b
docs: bind ADR to static Storybook checks
seonghobae 42273e4
test: isolate Storybook viewport state
seonghobae eba8610
fix: isolate Storybook viewport per story
seonghobae 6d51fea
refactor: use Svelte 5 layout children
seonghobae 0362c37
docs: refresh Storybook test evidence
seonghobae fc86557
test: keep checking state non-cancellable
seonghobae 66ed175
fix: keep checking provider state non-cancellable
seonghobae 3d79a39
test: isolate design-system button styling
seonghobae 8c990b4
fix: scope design-system button visuals
seonghobae 910a36e
fix: opt scan actions into design controls
seonghobae f771c1b
fix: opt provider action into design controls
seonghobae 6caaa39
docs: record exact-head ecosystem audit
seonghobae ae93d00
docs: bind ecosystem audit to current head
seonghobae 9baf095
fix: style provider card headings consistently
seonghobae 7fb3748
docs: refresh UX test evidence
seonghobae dd0ccd2
docs: bind ecosystem audit to latest UX head
seonghobae 3e8dae2
docs: clarify implementation head binding
seonghobae 7bda7b3
docs: point audit at UX implementation head
seonghobae 6d37714
docs: record OneDrive provider stall evidence
seonghobae 0ee5b93
test: require readable skip-link contrast
seonghobae 3ca39c6
fix: preserve skip-link contrast in dark mode
seonghobae 800fe81
test: bind Storybook viewport runner to globals
seonghobae e5a5608
fix: follow Storybook 10 viewport globals
seonghobae 1326ee1
fix: use Storybook 10 viewport configuration
seonghobae debeb5e
fix: select mobile viewport through Storybook globals
seonghobae e40bfec
test: follow Storybook 10 viewport globals
seonghobae 538a40f
fix: back off blocked provider probes
seonghobae 325bf03
fix: type Storybook viewport globals
seonghobae efd552e
test: keep control sizing opt-in
seonghobae eeca3d0
fix: read Storybook 10 viewport globals
seonghobae f265cc9
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae 4677811
test: prove native finalize race safety
seonghobae b44dfb5
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae dbfaff7
fix: bind control size token to styled controls
seonghobae 8703719
feat: classify iCloud sync exclusion stalls
seonghobae 6508170
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 0a6bd39
fix: retain iCloud exclusion diagnostics
seonghobae c81f6fa
test: expose global control styling regression
seonghobae f97865c
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 99a3894
fix: keep legacy control sizing opt-in
seonghobae b69c342
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae f947dae
Merge remote-tracking branch 'origin/feat/storybook-ux-contracts' int…
seonghobae e9c7d9b
feat: version iCloud activity evidence
seonghobae 6aae29f
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 4a548c2
feat: show iCloud exclusion stall evidence
seonghobae 108bba0
docs: correct bounded provider dump comment
seonghobae 2298bc6
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 9c4d679
feat: surface iCloud indexing backlog in UX
seonghobae 52a0c22
feat: surface provider stall state in running UX
seonghobae 94ecd07
docs: bind provider stall UX amendment
seonghobae b24549c
test: cover provider stall status rendering
seonghobae 278b62b
docs: bind UX implementation head
seonghobae 32e5222
docs: refresh exact-head provider and PR audit
seonghobae 67fa7ed
docs: refresh current iCloud backlog evidence
seonghobae 5126c87
docs: bind latest iCloud runtime receipt
seonghobae 3a8ee65
docs: distinguish implementation and binding heads
seonghobae 64b067d
fix: align provider stall duration with evidence time
seonghobae 768c750
docs: record provider status card clock fix
seonghobae 97533ad
fix(ux): keep provider status safe during probe and dark mode
seonghobae 14e99fc
docs: bind UX and governance heads
seonghobae 58db694
fix(ux): apply dark tokens to legacy panels
seonghobae b0c71f0
docs: record UX coverage evidence
seonghobae 6281ea3
docs: distinguish functional and documentation heads
seonghobae 117432f
test: protect newly written provider evidence during retention
seonghobae 76ab80a
fix: preserve newly written provider evidence during retention
seonghobae 33160c2
fix(ux): preserve iCloud admission blocker duration
seonghobae afce9f3
docs: record restart-safe iCloud UX duration
seonghobae 7e3c28a
fix(ux): use provider observation time fallback
seonghobae eb553ed
docs: bind UX fallback to current head
seonghobae 56de7f5
docs: refresh provider follow-up head
seonghobae bda817d
fix(ux): retain iCloud stall clock for legacy reports
seonghobae d6d3142
docs: record legacy iCloud stall compatibility
seonghobae 8002e2c
test: preserve active-use signal after slow lsof
seonghobae d267ee9
fix: reserve active-use probe deadline slices
seonghobae e4c4e11
test: bound provider disk-full numeric markers
seonghobae fc9f4a4
fix(ux): reset stall clock when iCloud progress changes
seonghobae a37a1df
test: cover all provider disk-full numeric forms
seonghobae 76479ed
fix: bound provider disk-full numeric markers
seonghobae fa5fbfc
fix(ux): keep iCloud stall warnings through counter churn
seonghobae 0b77490
fix(scan): prefer local roots before filesystem root
seonghobae 76d2189
fix(ux): keep iCloud admission card fail closed
seonghobae 6b01f6f
fix(ci): keep readiness verifier includable
seonghobae 51973c3
fix(ci): keep readiness verifier includable
seonghobae 570924c
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 3e72277
test: use production cloud copy approval boundary
seonghobae b00c67e
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 741ab30
fix: kill timed-out lsof process groups
seonghobae a6ec6e2
fix: kill timed-out lsof process groups
seonghobae 2b9833c
docs: record current Finder stall evidence
seonghobae 0c2ca13
Merge remote-tracking branch 'origin/feat/provider-sync-dynamic-goals…
seonghobae 44756d1
fix: keep indexing backlog growth in stall clock
seonghobae b4bca2f
docs: record backlog stall clock semantics
seonghobae 09a6391
docs: describe backlog stall semantics
seonghobae 992894a
test: require destination-volume copy headroom
seonghobae 06421c8
feat: bind copy headroom to destination filesystem
seonghobae 3a925a9
fix: probe cloud copy destination headroom
seonghobae 70a3ff6
repair: restore complete commands module
seonghobae f40bd90
fix: probe native copy destination headroom
seonghobae 894624f
test: run active-use probes under coverage
seonghobae 0584bcc
revert: keep coverage fix in canonical evidence owner
seonghobae 1a4e3e1
test: carry destination headroom authority into UX stack
seonghobae 2bf1dd2
test: preserve destination headroom regression in UX stack
seonghobae af92061
merge: advance Storybook UX onto provider headroom authority
seonghobae e869ba2
test: reject cancel affordance on clear provider state
seonghobae a822033
fix: suppress cancel action on clear provider state
seonghobae b2e5589
fix: remove duplicate list_roots tauri command definition
seonghobae 36d7a8f
fix: stop mislabeling a failed provider probe as materialization-stalled
seonghobae 476678c
fix: remove reintroduced shopping-domain wording in new module
seonghobae bbf5f4b
merge: resolve main conflicts for Storybook UX contracts
seonghobae 61f779f
fix: restore known-green CloudArchive merge resolution
seonghobae 9cf11c0
merge: converge Storybook UX with current main
seonghobae 6e908d6
fix: keep product terminology customer-safe
seonghobae 308be49
test: avoid dynamic token regex
seonghobae 1972614
fix: retain coverage dead-code allowance for navigation
seonghobae b67ea3b
fix(cloud): expose indexing stall cancellation
seonghobae 5eaeda1
docs(ux): record provider indexing cancel event
seonghobae 2037c91
fix(cloud): reset stall clock after restart
seonghobae 74f9f3f
fix(ui): preserve persisted iCloud stall age
seonghobae cf005f1
docs(adr): record persisted iCloud stall recovery
seonghobae 2d39135
fix(ui): keep one provider cancel control
seonghobae 976d930
docs: scope scan-root contract to non-windows
seonghobae 3936cd9
docs(adr): record provider card ownership
seonghobae d38ed05
fix(ui): keep Finder cancel confirmation visible
seonghobae cbb9dc0
fix: adopt late iCloud blocker timestamps
seonghobae 9ef6d21
fix: disable repeated provider cancel requests
seonghobae 64a255b
fix: apply dark-mode text tokens to legacy panels
seonghobae 9124e01
fix: distinguish transfer completion from progress
seonghobae 1ae5a35
fix: show provider sync checking state
seonghobae 57eb6c1
Merge branch 'main' into feat/storybook-ux-contracts
opencode-agent[bot] d7e4176
merge: sync Storybook UX branch with current main
seonghobae 3402360
Merge origin/main into feat/storybook-ux-contracts (restack PR #246)
seonghobae 6f47fdf
docs: assign Storybook UX decision ADR-0012
seonghobae 3349f83
fix: enforce customer-safe action copy contract
seonghobae 6c5e0c6
Merge remote-tracking branch 'refs/remotes/origin/pr-246' into HEAD
seonghobae 7d34c6a
docs: record customer-action copy contract
seonghobae f8bb71d
fix: align customer copy and scan lifecycle
seonghobae b062255
fix: guard scan listeners during teardown
seonghobae 51b2706
fix: keep Finder cancel available for iCloud blockers
seonghobae 92b9d6b
fix: ignore late scan events after teardown
seonghobae 73070c0
test: audit nested customer screens
seonghobae ccab8da
fix: preserve stall clock when provider timestamps are absent
seonghobae a6c6d53
fix: make cloud failure guidance customer actionable
seonghobae 2616cef
fix: use theme tokens for form guidance
seonghobae 293cc99
fix: verify Windows release artifact namespace
seonghobae 9b8bf0e
fix: bind release artifacts to platform directories
seonghobae 384f6f1
fix: verify tag artifacts before sbom
seonghobae 7e5910d
fix: keep customer guidance implementation-neutral
seonghobae df3c231
test: lock customer-safe cloud status copy
seonghobae 9d82358
fix(ui): keep customer guidance implementation-neutral
seonghobae 276f674
chore: restore Storybook owner boundary
seonghobae ebbbc2f
test: reject raw duplicate-item errors
seonghobae 1a8ca96
fix: keep duplicate errors customer-safe
seonghobae 591c570
test(ux): keep terminology checks with canonical docs owner
seonghobae 07333d4
test: scope customer copy contract to UX owner
seonghobae 9b9f0ed
test: keep Storybook contracts inside UX ownership
seonghobae c958c0b
ci: exercise Storybook accessibility contract
seonghobae b085f9e
test(ci): require exact-head Storybook accessibility evidence
seonghobae fbe72f6
fix(ci): bind Storybook evidence to exact PR head
seonghobae 5f17cad
chore(ux): return duplicates privacy to canonical owner
seonghobae eb5c248
chore(ux): return inventory privacy to canonical owner
seonghobae fc0fa9f
test(ux): scope customer copy contract to owned screens
seonghobae 04352bc
chore(ux): return Homebrew feedback to canonical owner
seonghobae 8636c47
chore(ux): return worktree feedback to canonical owner
seonghobae 220bfcd
chore(ux): return organize feedback to canonical owner
seonghobae b265899
test(ux): exclude canonical feedback owners
seonghobae 8a67252
test(a11y): require a focusable skip-link target
seonghobae 9814109
fix(a11y): wire skip link to main content
seonghobae 3f4f878
chore(ux): drop orphaned iCloud stall-clock test
seonghobae e1856c0
chore(ux): drop orphaned iCloud stall clock
seonghobae 6fdd1d7
fix: keep Storybook guidance customer-facing
seonghobae 36b8d2d
Merge remote-tracking branch 'origin/main' into pr246
seonghobae 6571447
fix(a11y): announce provider recovery guidance
seonghobae File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| name: Storybook Accessibility | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: storybook-accessibility-${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| storybook-accessibility: | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 15 | ||
| env: | ||
| EXPECTED_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} | ||
| SOURCE_REPOSITORY: ${{ github.event.pull_request.head.repo.full_name || github.repository }} | ||
| steps: | ||
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | ||
| with: | ||
| repository: ${{ env.SOURCE_REPOSITORY }} | ||
| ref: ${{ env.EXPECTED_HEAD_SHA }} | ||
| persist-credentials: false | ||
| - name: Verify exact source checkout | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| actual_head="$(git rev-parse HEAD)" | ||
| test "$actual_head" = "$EXPECTED_HEAD_SHA" | ||
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | ||
| with: | ||
| node-version: 20.19.0 | ||
| cache: npm | ||
| - run: npm ci | ||
| - name: Build static Storybook | ||
| run: npm run build-storybook | ||
| - name: Install Chromium for Storybook interaction tests | ||
| run: npx playwright install --with-deps chromium | ||
| - name: Run Storybook accessibility and interaction tests | ||
| shell: bash | ||
| run: | | ||
| set -euo pipefail | ||
| python3 -m http.server 6006 --directory storybook-static >/tmp/disksage-storybook.log 2>&1 & | ||
| server_pid=$! | ||
| trap 'kill "$server_pid" 2>/dev/null || true' EXIT | ||
|
|
||
| for attempt in {1..30}; do | ||
| if curl --fail --silent --show-error http://127.0.0.1:6006/ >/dev/null; then | ||
| break | ||
| fi | ||
| if [[ "$attempt" == "30" ]]; then | ||
| cat /tmp/disksage-storybook.log | ||
| exit 1 | ||
| fi | ||
| sleep 1 | ||
| done | ||
|
|
||
| npm run test-storybook -- --url http://127.0.0.1:6006 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| import type { StorybookConfig } from "@storybook/sveltekit"; | ||
|
|
||
| const config: StorybookConfig = { | ||
| stories: ["../src/**/*.stories.@(js|ts|svelte)"], | ||
| addons: ["@storybook/addon-a11y"], | ||
| framework: { | ||
| name: "@storybook/sveltekit", | ||
| options: {}, | ||
| }, | ||
| docs: { | ||
| autodocs: "tag", | ||
| }, | ||
| }; | ||
|
|
||
| export default config; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| import type { Preview } from "storybook"; | ||
| import "../src/lib/ui/design-tokens.css"; | ||
|
|
||
| const preview: Preview = { | ||
| parameters: { | ||
| a11y: { | ||
| test: "error", | ||
| }, | ||
| controls: { | ||
| expanded: true, | ||
| }, | ||
| viewport: { | ||
| options: { | ||
| desktop: { name: "Desktop", styles: { width: "1280px", height: "800px" } }, | ||
| mobile: { name: "Mobile", styles: { width: "375px", height: "812px" } }, | ||
| }, | ||
| }, | ||
|
devin-ai-integration[bot] marked this conversation as resolved.
|
||
| }, | ||
| initialGlobals: { | ||
| viewport: { value: "desktop", isRotated: false }, | ||
| }, | ||
| tags: ["autodocs"], | ||
| }; | ||
|
|
||
| export default preview; | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| import { getStoryContext, type TestRunnerConfig } from "@storybook/test-runner"; | ||
|
|
||
| const MOBILE_VIEWPORT = { width: 375, height: 812 }; | ||
| const DESKTOP_VIEWPORT = { width: 1280, height: 800 }; | ||
| type StoryGlobals = { viewport?: { value?: string } }; | ||
| type StoryContextWithGlobals = { storyGlobals?: StoryGlobals }; | ||
|
|
||
| const config: TestRunnerConfig = { | ||
| async preVisit(page, story) { | ||
| const context = await getStoryContext(page, story); | ||
| const storyGlobals = (context as unknown as StoryContextWithGlobals).storyGlobals; | ||
| const viewport = | ||
| storyGlobals?.viewport?.value === "mobile" | ||
| ? MOBILE_VIEWPORT | ||
| : DESKTOP_VIEWPORT; | ||
| await page.setViewportSize(viewport); | ||
|
seonghobae marked this conversation as resolved.
|
||
| }, | ||
|
seonghobae marked this conversation as resolved.
|
||
| }; | ||
|
devin-ai-integration[bot] marked this conversation as resolved.
|
||
|
|
||
| export default config; | ||
77 changes: 77 additions & 0 deletions
77
docs/architecture/adr/0012-accessible-storybook-ux-contracts.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| # ADR-0012: Accessible Storybook UX contracts and design tokens | ||
|
|
||
| **Status:** Proposed | ||
| **Date:** 2026-08-21 | ||
| **Figma File ID:** N/A — no Figma artifact was supplied for this slice; the token file and | ||
| Storybook scenes are the reviewable design source until a Figma handoff is approved. | ||
|
|
||
| ## Context | ||
|
|
||
| DiskSage's desktop shell had repeated raw spacing, color, focus, and control styles spread across | ||
| Svelte components. The provider-stall incident also needs a stable, testable visual state for | ||
| `provider-sync-incomplete`, `materialization-stalled`, and `checking`, not a color-only warning. | ||
| The existing cloud and eviction authority must not be moved into the browser layer. | ||
|
|
||
| ## Decision | ||
|
|
||
| 1. Keep computation, provider evidence, and destructive authority in Rust and existing Tauri | ||
| commands. The UI only renders state and emits bounded callbacks. | ||
| 2. Adopt a three-level CSS token hierarchy (primitive → semantic → component) in | ||
| `src/lib/ui/design-tokens.css`, with dark preference, forced-colors focus, reduced-motion, and | ||
| 44px control minimums. | ||
| 3. Add `ProviderStatusCard` as a pure state renderer and maintain one Storybook story per clear, | ||
| incomplete, stalled, checking, action, narrow-layout, and feedback edge state. | ||
| 4. Run Storybook's accessibility addon in error mode against the built static output. The | ||
| Chromium test runner must prove the cancel callback, disabled checking state, and 375px mobile | ||
| viewport; stories do not call providers or mutate user files. | ||
| 5. Keep Figma optional for this change because no approved Figma file exists. When a visual handoff | ||
| is supplied, record its File ID in a superseding ADR and reconcile tokens before implementation. | ||
|
|
||
| ## Consequences | ||
|
|
||
| - Every new customer-facing status can be reviewed at desktop and mobile widths before it is wired | ||
| to a provider receipt. | ||
| - Keyboard, screen-reader, reduced-motion, dark-mode, and forced-colors behavior has one reusable | ||
| contract instead of per-component guesses. | ||
| - Storybook and its dependencies increase development tooling size; they are dev-only and never | ||
| become a runtime cloud or LLM dependency. | ||
| - Automated a11y is a first pass, not proof of complete WCAG conformance; VoiceOver, keyboard, | ||
| zoom, and real File Provider states remain release acceptance work. | ||
|
|
||
| ## Rejected alternatives | ||
|
|
||
| - Adding a UI framework solely for buttons/cards: existing Svelte and CSS custom properties cover | ||
| the required surface with less runtime and dependency risk. | ||
| - Making the browser decide whether a provider is safe to evict: this would violate the existing | ||
| receipt/identity/approval boundary. | ||
| - Treating Storybook green output as a substitute for hosted exact-head checks: stories only prove | ||
| the rendered UI contract and event wiring. | ||
|
|
||
| ## Standards and research basis (APA 7th) | ||
|
|
||
| World Wide Web Consortium. (2024, December 12). *Web Content Accessibility Guidelines (WCAG) 2.2*. | ||
| https://www.w3.org/TR/2024/REC-WCAG22-20241212/ | ||
|
|
||
| World Wide Web Consortium. (n.d.). *ARIA Authoring Practices Guide*. Retrieved August 21, 2026, | ||
| from https://www.w3.org/WAI/ARIA/apg/ | ||
|
|
||
| Design Tokens Community Group. (2025, October 28). *Design Tokens Format Module 2025.10*. | ||
| https://www.w3.org/community/reports/design-tokens/CG-FINAL-format-20251028/ | ||
|
|
||
| Storybook. (n.d.). *Accessibility tests*. Retrieved August 21, 2026, from | ||
| https://storybook.js.org/docs/writing-tests/accessibility-testing | ||
|
|
||
| ## Amendment: provider-indexing cancellation event (2026-08-25 11:31 +0900) | ||
|
|
||
| The provider status contract includes `provider-global-sync-indexing-pending` in the existing | ||
| bounded Finder-cancel event path. This keeps the Storybook event model aligned with the runtime | ||
| provider-global blocker set without granting the browser cloud-write or source-eviction authority. | ||
| The exact-head contract and Svelte checks pass at `b67ea3be`. | ||
|
|
||
| ## Amendment: customer-action copy contract (2026-08-26) | ||
|
|
||
| Customer screens must describe the next safe action without exposing Rust command names, provider | ||
| internals, ontology identifiers, receipt/attestation fields, or implementation-only error text. | ||
| `cleanupCustomerCopyContract.test.ts` scans every Svelte customer surface, including dynamic | ||
| messages and static warnings, and requires bounded recovery guidance. Technical evidence remains | ||
| available to the backend and audit records; it is not rendered as customer instruction. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| # DiskSage UI/UX and Storybook event inventory | ||
|
|
||
| **Status:** In progress, exact source head `feat/storybook-ux-contracts` | ||
| **Scope:** desktop Svelte shell and provider-status feedback states | ||
| **Visual source:** no Figma file was supplied for this product slice; the code token file is the | ||
| reviewable source of truth until a Figma handoff exists. | ||
|
|
||
| This inventory turns customer-visible states into repeatable Storybook scenes. It is not cloud or | ||
| eviction authority: every destructive action remains behind the Rust evidence and approval gates. | ||
|
|
||
| ## Story and event matrix | ||
|
|
||
| | Story | Trigger/event | Expected customer action | Accessibility and edge assertion | | ||
| | --- | --- | --- | --- | | ||
| | `Clear` | Provider observation is complete and quiet | Continue to per-file review; do not assume eviction | Status is announced politely; no destructive action is shown | | ||
| | `IncompleteEvidence` | Cloud status is missing or stale | Check the cloud app and connection, then recheck | State is text, not color alone; last-check time is visible | | ||
| | `MaterializationStalled` | File preparation has stopped | Cancel the Finder copy, then recheck; do not retry immediately | Cancel button has an accessible name and invokes one bounded callback | | ||
| | `CheckingWithoutAction` | A read-only provider probe is running | Wait; do not cancel an operation that has no cancel authority | Action is disabled and exposes `aria-disabled` | | ||
| | Scan start | Scan button activates | Review progress and wait for completion | Root is labelled; unavailable roots disable the action | | ||
| | Scan failure | IPC/start or post-scan load fails | Read the error and retry | `role=alert` presents the next action; no `alert()` steals focus | | ||
| | Navigation | Breadcrumb or directory button activates | Move to the selected directory | Landmark and button names are keyboard reachable | | ||
| | Reduced motion | `prefers-reduced-motion: reduce` is enabled | Use the same controls without animation | Global token contract disables transitions/animations | | ||
| | Narrow viewport | 375px viewport | Scroll and operate controls without horizontal clipping | Controls become full width and retain 44px touch targets | | ||
|
|
||
| ## Required review dimensions | ||
|
|
||
| - **Accessibility:** WCAG 2.2 AA target; semantic headings, labels, skip link, focus-visible ring, | ||
| live regions, keyboard operation, non-color status text, and forced-colors support. | ||
| - **Touch & interaction:** controls use the shared minimum size token; every async action has a | ||
| disabled/loading state and a bounded, reversible next action. | ||
| - **Performance:** the shell does not poll during a scan; provider polling/backoff remains in the | ||
| existing CloudArchive state machine; CSS uses no new runtime animation or layout library. | ||
| - **Style selection:** primitive, semantic, and component tokens live in one CSS contract; raw | ||
| colors are not introduced in the new shell paths. | ||
| - **Layout & responsive:** mobile-first wrapping is tested by Storybook's mobile viewport and the | ||
| shell has a readable max width. | ||
| - **Typography & color:** system font stack, semantic text colors, dark preference, and contrast | ||
| review are centralized in `design-tokens.css`. | ||
| - **Animation:** reduced-motion media query is a global contract; no status relies on motion. | ||
| - **Forms & feedback:** labels precede controls; errors use `role=alert`; progress uses polite | ||
| status text and never hides the actionable reason. | ||
| - **Navigation patterns:** skip link, `main` landmark, and labelled breadcrumb navigation are | ||
| present; directory navigation remains a button rather than a mouse-only gesture. | ||
| - **Charts & data:** existing treemap and tabular summaries remain text-backed; future chart | ||
| changes must provide a table or equivalent text summary in the same story. | ||
|
|
||
| ## Running the review scenes | ||
|
|
||
| ```bash | ||
| npm run storybook | ||
| npm run build-storybook | ||
| python3 -m http.server 6006 --directory storybook-static | ||
| npm run test-storybook -- --ci --url http://127.0.0.1:6006 --browsers chromium --testTimeout 30000 | ||
| ``` | ||
|
|
||
| The a11y addon is configured with `a11y.test = "error"`. The interaction stories assert the | ||
| materialization-stall cancel event and the disabled checking state. A real VoiceOver/keyboard and | ||
| 375px/200% zoom pass is still required before a release claim. | ||
|
|
||
| ## References (APA 7th) | ||
|
|
||
| World Wide Web Consortium. (2024, December 12). *Web Content Accessibility Guidelines (WCAG) 2.2*. | ||
| https://www.w3.org/TR/2024/REC-WCAG22-20241212/ | ||
|
|
||
| World Wide Web Consortium. (n.d.). *ARIA Authoring Practices Guide*. Retrieved August 21, 2026, | ||
| from https://www.w3.org/WAI/ARIA/apg/ | ||
|
|
||
| Design Tokens Community Group. (2025, October 28). *Design Tokens Format Module 2025.10*. | ||
| https://www.w3.org/community/reports/design-tokens/CG-FINAL-format-20251028/ | ||
|
|
||
| Storybook. (n.d.). *Accessibility tests*. Retrieved August 21, 2026, from | ||
| https://storybook.js.org/docs/writing-tests/accessibility-testing |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.