Repository navigation
Phase 31 slice A: the desktop-app type, the 24px spacing exception, folded results - #245
Merged
Merged
Conversation
Phase 31 slice A. A third canvas type for tools you work in, with a window profile and a ruleset that turns off the type-scale ratio. On web and desktop-app the 24px floor measures every pointer target with WCAG 2.5.8's spacing exception (detailed mode tests it, fast mode warns). Lists that lead with a mark stop reading as tables. Evaluate folds repeated findings with their fixes, import groups its report, and generation adds state tokens, focus-ring and border-strong. The viewer baseline is committed as fixtures.
Verify round 1 on slice A. Unfixed findings fold only when they read the same (a looser key showed one ratio for three). An undersized target whose neighbour, or whose own tab, the layout cannot place keeps a blocking warning. Docs, spec as-built notes and the stale usability test follow.
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Slice A of Phase 31 (docs/specs/PHASE-31-SPEC.md, FR-A1 to FR-A9 and FR-I1). It adds a third canvas type for application screens and fixes three things the viewer baseline found wrong on every type. The spec's "Slice A — as built" block records one approved spec change and twelve build decisions.
What changes
desktop-apptype. It is for a tool you work in, such as an editor, an admin console or a file browser, whether it runs in a browser tab or a native window.canvas_create({ type: "desktop-app" })gives a 1440×900 window from thewindow-1440profile, with no insets.canvas_set_type,list_structuresandapply_structureaccept the new type. A profile is taken only from the table that matches its type, so a phone profile on a desktop-app canvas is refused. Declaring the type never changes the render.type-scale-ratio. The desktop-app ruleset turns it off, because dense apps step 12, 13 and 14px on purpose. A new base rule,desktop-app-artboard, warns when a desktop-app canvas is narrower than 1024px.button,list-row, thetab-bartabs, thenav-baractions). A lone control still grows to its padded row first. A target that is still below 24px passes only when a 24px circle centred on it reaches no other target. That test needs rendered positions, so detailed mode runs it and reports an error when it fails. Fast mode warns instead, and the warning names detailed mode. Mobile keeps its 44px rule unchanged.canvas_evaluatenow folds repeated warnings and infos into one entry that carriesnodeIds,countandfixes. Findings that carry a fix fold on the shape of their message, because each fix op holds its own node's values. Findings without a fix fold only when they read the same. Errors never fold, andcanvas_autofixstill works from the unfolded list. The import tools now returnsnapped,literalsandscaleMatchesgrouped by token or value, and a newverbose: trueinput returns the full lists.generate_design_systemgives a desktop-app canvas a 14px body, or 13px fordata-dense. Every generated system now writes astatesection of element-state opacities (Material 3's values) and two control colors.focus-ringreaches 3:1 against every surface and tint token, andborder-strongreaches 3:1 against the page and surface, in both themes.The identity-dot correction (FR-A6) moved to slice B, because it depends on the
nav-itemprimitive that slice adds.Decisions worth a look
fixes. Verification then found that the first fold key merged findings with different numbers under one message. For example, a 1.07 ratio and a 2.67 ratio appeared as one warning. The final key never does that, which costs a few points of compression: the baseline detail page goes from 74,609 to 41,008 characters (55%). The spec's acceptance is amended to at most 58% and records the measured numbers.test-usability.tsis the only existing test whose expectations moved; it now checks both modes.Fixtures
The four viewer pages imported from framesmith 2.4.0 on 2026-11-08 are committed under
test-fixtures/viewer-baseline/. Each embeds the repo workspace's design system so it resolves in the isolated test store. SHA-256:archive.json02c57c249c7d17a6ed81c77c90b5641a07588782a827ab240139d70da2cb34b5detail-mobile-ridgeline.json0845969623551d9f1c50c33189b82b035bdefc5f82da115b4bd50343390a8c40detail-web-dashboard.json30bc603a44946c2fcaa09bf6117ff5f00823c56cb89e1e287d2bdd8d75c6b851gallery-pattern-library.json2dc6523fda7eecec53542e24fc1acdf7731d6ff2fda20b1dfa714b087725800aTesting
test-desktop-app.ts(fast tier) covers the type, the ruleset, the artboard rule, the fast-mode census, the table discriminator, folding, the import summary, generation and contrast across four personalities, six seeds and both themes, the fixtures, and the viewer buttons.test-pointer-targets.ts(Chrome tier) covers the circle test in detailed mode on web and desktop-app. It checks spaced, touching and only-touching targets, overlapping circles, disabled neighbours, a too-narrow tab bar, and a neighbour the layout cannot place.npm run test:fast: 83/83.npm run test:full: 121/121.