stylegallery 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/AGENTS.md +15 -1
  2. package/DOMAINS.md +7 -3
  3. package/GOVERNANCE.md +13 -11
  4. package/LICENSE-DOCS +2 -2
  5. package/README.md +23 -10
  6. package/consumer-reference/agent-native/v2/admission-policy.json +32 -37
  7. package/consumer-reference/agent-native/v2/material-registry.json +1 -1
  8. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +3 -3
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +1 -1
  10. package/design-engineering/state-management/index.md +1 -1
  11. package/design-engineering/state-management/patterns/derived-state.md +1 -1
  12. package/design-engineering/state-management/patterns/draft-and-baseline.md +1 -1
  13. package/design-engineering/state-management/patterns/id-selection.md +1 -1
  14. package/design-engineering/state-management/patterns/identity-reset.md +1 -1
  15. package/design-engineering/state-management/patterns/latest-request-wins.md +1 -1
  16. package/design-engineering/state-management/patterns/optimistic-overlay.md +1 -1
  17. package/design-engineering/state-management/patterns/single-flight.md +1 -1
  18. package/design-engineering/state-management/patterns/single-owner.md +1 -1
  19. package/design-engineering/state-management/patterns/submitted-snapshot.md +1 -1
  20. package/design-engineering/state-management/patterns/unsaved-navigation.md +1 -1
  21. package/design-engineering/state-management/patterns/url-state.md +1 -1
  22. package/design-engineering/state-management/patterns/versioned-restore.md +1 -1
  23. package/design-engineering/state-management/verification.md +1 -1
  24. package/design-terminology/conflict-cases.md +1 -1
  25. package/design-terminology/source-kinds.md +1 -1
  26. package/expression/brand-studies.md +50 -0
  27. package/expression/direction-brief.md +83 -0
  28. package/expression/directions/nocturne-editorial.md +81 -0
  29. package/expression/directions/warm-print.md +73 -0
  30. package/expression/index.md +52 -0
  31. package/expression/techniques/gradient-atmosphere.md +107 -0
  32. package/expression/techniques/grain-and-texture.md +83 -0
  33. package/expression/techniques/webgl-hero.md +123 -0
  34. package/guides/vocabulary.md +1 -1
  35. package/index.md +3 -3
  36. package/log.md +45 -0
  37. package/motion/index.md +71 -0
  38. package/motion/techniques/kinetic-type.md +145 -0
  39. package/motion/techniques/scroll-choreography.md +154 -0
  40. package/package.json +17 -14
  41. package/platform-guides/compatibility-matrix.md +1 -1
  42. package/quality/claim-records/samples.md +50 -0
  43. package/quality/claim-records/stylegallery-multidomain-scope.md +2 -2
  44. package/quality/claims.md +24 -1
  45. package/quality/evidence/executable-evidence.md +1 -1
  46. package/quality/index.md +1 -2
  47. package/scripts/agent-native/v2/material-admission.mjs +1 -1
  48. package/scripts/agent-native/v2/material-identity.mjs +2 -2
  49. package/scripts/compiler/README.md +5 -5
  50. package/showcase/README.md +127 -0
  51. package/game-ui/classification.md +0 -82
  52. package/game-ui/decision-tree.md +0 -81
  53. package/game-ui/index.md +0 -45
  54. package/game-ui/reference-record.md +0 -62
  55. package/game-ui/screen-hierarchy.md +0 -107
  56. package/game-ui/screen-recipes.md +0 -101
  57. package/game-ui/unity/architecture.md +0 -166
  58. package/game-ui/unity/cli-loop.md +0 -84
  59. package/game-ui/unity/org-wiki.md +0 -146
  60. package/game-ui/unity/repository-map.md +0 -102
  61. package/game-ui/unity/ui-systems.md +0 -85
  62. package/game-ui/verification-workflow.md +0 -100
@@ -0,0 +1,154 @@
1
+ ---
2
+ type: Domain Recipe
3
+ title: Scroll Choreography Technique
4
+ description: Copy-ready GSAP ScrollTrigger and Lenis setup, pinned horizontal travel, scrubbed scenes, and a native CSS scroll-timeline equivalent.
5
+ domain: motion
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Scroll Choreography Technique
11
+
12
+ Primary role: executable motion technique.
13
+
14
+ ## Repository Boundary
15
+
16
+ Product-layer script and CSS for `showcase/` works and consumer pages. The document keeps vertical scroll ownership; this technique never adds animation to reusable Layout pattern CSS. For scene contracts and briefs, use [Scroll-driven Story](../interaction-recipes.md#scroll-driven-story) and the [Motion Brief](../motion-brief.md).
17
+
18
+ ## Reusable Method
19
+
20
+ ### 1. Load As Enhancement
21
+
22
+ ```html
23
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js" defer></script>
24
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js" defer></script>
25
+ <script src="https://cdn.jsdelivr.net/npm/lenis@1.1.13/dist/lenis.min.js" defer></script>
26
+ <script type="module" src="app.js"></script>
27
+ ```
28
+
29
+ ```js
30
+ const reduceMotion = matchMedia("(prefers-reduced-motion: reduce)").matches;
31
+ const { gsap, ScrollTrigger, Lenis } = window;
32
+ if (gsap && ScrollTrigger && !reduceMotion) {
33
+ gsap.registerPlugin(ScrollTrigger);
34
+ document.documentElement.classList.add("motion"); // CSS hides pre-animation states only under .motion
35
+ startMotion();
36
+ }
37
+ ```
38
+
39
+ ```css
40
+ .motion [data-reveal] { opacity: 0; transform: translateY(24px); }
41
+ ```
42
+
43
+ Initial hidden states live behind the `.motion` class. With no script, a failed CDN, or reduced motion, the page stays fully visible.
44
+
45
+ ### 2. One Ticker For Smooth Scroll And Triggers
46
+
47
+ ```js
48
+ const lenis = new Lenis({ lerp: 0.11, wheelMultiplier: 0.9 });
49
+ lenis.on("scroll", ScrollTrigger.update);
50
+ gsap.ticker.add((time) => lenis.raf(time * 1000));
51
+ gsap.ticker.lagSmoothing(0);
52
+ ```
53
+
54
+ Driving Lenis from GSAP's ticker keeps pinned scenes in step with the smoothed scroll. Two separate `requestAnimationFrame` loops make pins jitter.
55
+
56
+ In-page links should go through Lenis and still move focus:
57
+
58
+ ```js
59
+ for (const link of document.querySelectorAll('a[href^="#"]')) {
60
+ link.addEventListener("click", (event) => {
61
+ const target = document.querySelector(link.getAttribute("href"));
62
+ if (!target) return;
63
+ event.preventDefault();
64
+ lenis.scrollTo(target, { duration: 1.4 });
65
+ target.setAttribute("tabindex", "-1");
66
+ target.focus({ preventScroll: true });
67
+ });
68
+ }
69
+ ```
70
+
71
+ ### 3. Reveal On Enter
72
+
73
+ ```js
74
+ gsap.to("[data-reveal]", {
75
+ opacity: 1, y: 0, duration: 1.1, ease: "expo.out", stagger: 0.12,
76
+ scrollTrigger: { trigger: ".section", start: "top 80%" },
77
+ });
78
+ ```
79
+
80
+ ### 4. Scrubbed Scene
81
+
82
+ Tie a property directly to scroll progress; `scrub: true` follows exactly, a number adds catch-up smoothing in seconds.
83
+
84
+ ```js
85
+ gsap.to(".hero_inner", {
86
+ yPercent: -18, opacity: 0.25, ease: "none",
87
+ scrollTrigger: { trigger: ".hero", start: "top top", end: "bottom top", scrub: true },
88
+ });
89
+ ```
90
+
91
+ ### 5. Pinned Horizontal Travel
92
+
93
+ Vertical scroll moves a horizontal track while the section is pinned. Enable it only where it fits and keep a vertical list otherwise.
94
+
95
+ ```js
96
+ const media = gsap.matchMedia();
97
+ media.add("(min-width: 64rem)", () => {
98
+ const track = document.querySelector(".schedule_track");
99
+ const distance = () => track.scrollWidth - document.documentElement.clientWidth;
100
+ gsap.to(track, {
101
+ x: () => -distance(), ease: "none",
102
+ scrollTrigger: { trigger: ".schedule", start: "top top", end: () => `+=${distance()}`, pin: true, scrub: 0.6, invalidateOnRefresh: true },
103
+ });
104
+ });
105
+ ```
106
+
107
+ ```css
108
+ .schedule_viewport { overflow: clip; } /* the track never widens the document */
109
+ @media (min-width: 64rem) { .schedule_track { display: flex; inline-size: max-content; } }
110
+ ```
111
+
112
+ Keep focusable controls out of the moving track, or they can receive focus while translated off-screen.
113
+
114
+ ### 6. Native Alternative: CSS Scroll-Driven Animation
115
+
116
+ For a single scrubbed property with no library:
117
+
118
+ ```css
119
+ @supports (animation-timeline: view()) {
120
+ @media (prefers-reduced-motion: no-preference) {
121
+ .reveal {
122
+ animation: reveal linear both;
123
+ animation-range: entry 10% cover 35%;
124
+ animation-timeline: view();
125
+ }
126
+ }
127
+ }
128
+ @keyframes reveal { from { opacity: 0; transform: translateY(40px); } }
129
+ ```
130
+
131
+ ## Opinionated Guidance
132
+
133
+ Choose three or four scroll scenes per page and make each one say something. A page where everything fades up on scroll has no choreography, only delay.
134
+
135
+ ## Platform-Specific Guidance
136
+
137
+ Lenis smooths wheel input but leaves native touch scrolling alone by default, which is the right choice on phones. `ScrollTrigger.refresh()` runs on resize; functions for `x` and `end` plus `invalidateOnRefresh` let pinned distances recompute. CSS `animation-timeline` is not available in every engine; wrap it in `@supports`.
138
+
139
+ ## Unsupported Absolutes
140
+
141
+ Durations, easings, and trigger offsets here were tuned for one page. Pinning is not appropriate for content that must be read at the reader's own pace.
142
+
143
+ ## Verification Contract
144
+
145
+ A page using this technique passes `node scripts/check-showcase.mjs`: no horizontal overflow while pinned, focus order intact with Lenis active, and all text visible under reduced motion. Review the middle-scroll screenshot to confirm the pinned section clears any fixed header.
146
+
147
+ ## Source, License, And Attribution
148
+
149
+ Locally authored technique. GSAP and Lenis are loaded at runtime under their own licenses; no library source is reproduced.
150
+
151
+ ## IA Navigation
152
+
153
+ Parent: [Motion](../index.md).
154
+ Next: [Kinetic Type Technique](kinetic-type.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stylegallery",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "A governed gallery of portable interface knowledge with knowledge CLIs, website compilation, and MCP servers.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,6 +23,7 @@
23
23
  "engines": {
24
24
  "node": ">=22"
25
25
  },
26
+ "packageManager": "bun@1.3.14",
26
27
  "files": [
27
28
  "AGENTS.md",
28
29
  "CATALOG.md",
@@ -94,18 +95,14 @@
94
95
  "design-terminology/source-vocabularies.md",
95
96
  "design-terminology/token-semantics.md",
96
97
  "design-terminology/typography-semantics.md",
97
- "game-ui/classification.md",
98
- "game-ui/decision-tree.md",
99
- "game-ui/index.md",
100
- "game-ui/reference-record.md",
101
- "game-ui/screen-hierarchy.md",
102
- "game-ui/screen-recipes.md",
103
- "game-ui/unity/architecture.md",
104
- "game-ui/unity/cli-loop.md",
105
- "game-ui/unity/org-wiki.md",
106
- "game-ui/unity/repository-map.md",
107
- "game-ui/unity/ui-systems.md",
108
- "game-ui/verification-workflow.md",
98
+ "expression/brand-studies.md",
99
+ "expression/direction-brief.md",
100
+ "expression/directions/nocturne-editorial.md",
101
+ "expression/directions/warm-print.md",
102
+ "expression/index.md",
103
+ "expression/techniques/gradient-atmosphere.md",
104
+ "expression/techniques/grain-and-texture.md",
105
+ "expression/techniques/webgl-hero.md",
109
106
  "guides/decision-tree.md",
110
107
  "guides/documentation-mode-taxonomy.md",
111
108
  "guides/layout-brief.md",
@@ -124,6 +121,8 @@
124
121
  "motion/practice-reference.md",
125
122
  "motion/rendering-and-performance.md",
126
123
  "motion/review-workflow.md",
124
+ "motion/techniques/kinetic-type.md",
125
+ "motion/techniques/scroll-choreography.md",
127
126
  "motion/vocabulary.md",
128
127
  "patterns/centering/center.md",
129
128
  "patterns/centering/index.md",
@@ -263,7 +262,8 @@
263
262
  "scripts/sg-mcp.mjs",
264
263
  "scripts/sg-server.mjs",
265
264
  "scripts/sg.mjs",
266
- "scripts/strict-json.mjs"
265
+ "scripts/strict-json.mjs",
266
+ "showcase/README.md"
267
267
  ],
268
268
  "bin": {
269
269
  "sg": "scripts/sg-entry.mjs",
@@ -304,6 +304,9 @@
304
304
  "validate": "node scripts/validate-reference-artifacts.mjs --manifest consumer-reference/generated/manifest.json --json",
305
305
  "validate:component-state": "node scripts/validate-component-state.mjs --json && node scripts/generate-consumer-reference-evidence.mjs --check --json",
306
306
  "test:state-management": "node --test scripts/test-state-management-examples.mjs",
307
+ "test:showcase": "node scripts/check-showcase.mjs",
308
+ "test:showcase:self": "node scripts/test-check-showcase.mjs",
309
+ "showcase:serve": "node scripts/serve-showcase.mjs",
307
310
  "test:compiler": "node --test scripts/test-sg-compiler.mjs",
308
311
  "sg:v1": "node scripts/sg.mjs",
309
312
  "sg:mcp:v1": "node scripts/sg-mcp.mjs"
@@ -75,7 +75,7 @@ Test fallback paths deliberately rather than waiting for accidental unsupported
75
75
 
76
76
  ## Platform-Specific Guidance
77
77
 
78
- Apple, Android, and Windows guide pages own their dated official-source sets. Recheck them for native claims and separately verify the target runtime. Game-engine adaptation routes to [Game UI](../game-ui/index.md).
78
+ Apple, Android, and Windows guide pages own their dated official-source sets. Recheck them for native claims and separately verify the target runtime.
79
79
 
80
80
  ## Unsupported Absolutes
81
81
 
@@ -33,6 +33,12 @@ Boundary or limitation: The image cannot prove usability, accessibility, brand f
33
33
  Debt or escalation: If the visual reference conflicts with source order, focus order, accessibility, or content stress behavior, regenerate the prompt or record a blocked decision.
34
34
 
35
35
  Decision: pass when the harmony gate is complete before the image is generated.
36
+ Evidence refs: `quality/gates/harmony-evaluation.md`
37
+ Verified by: human
38
+ Reviewed at: 2026-10-15
39
+ Review by: not applicable
40
+ Source revision: not applicable
41
+ Conflicts with: not applicable
36
42
 
37
43
  ## Claim Record 2 - Screenshot Diff Limits
38
44
 
@@ -59,6 +65,12 @@ Boundary or limitation: A screenshot can hide focus order, screen-reader output,
59
65
  Debt or escalation: Escalate to accessibility or user evidence when the claim says readable, usable, accessible, clear, good, better, or harmonious for a person or task.
60
66
 
61
67
  Decision: review_required when screenshots are the only evidence for a human-outcome claim.
68
+ Evidence refs: `quality/evidence/visual-qa.md`, `quality/gates/visual-evidence.md`
69
+ Verified by: mixed
70
+ Reviewed at: 2026-10-15
71
+ Review by: not applicable
72
+ Source revision: not applicable
73
+ Conflicts with: not applicable
62
74
 
63
75
  ## Claim Record 3 - Accessibility Scan Limits
64
76
 
@@ -85,6 +97,44 @@ Boundary or limitation: The scan cannot prove accessibility for every user, devi
85
97
  Debt or escalation: Accessibility debt must name affected users, owner, review trigger, and the evidence gap before it can be accepted.
86
98
 
87
99
  Decision: blocked when a known accessibility failure is treated as a taste tradeoff or ordinary visual debt.
100
+ Evidence refs: `quality/evidence/accessibility.md`, `quality/gates/accessibility-evidence.md`
101
+ Verified by: human
102
+ Reviewed at: 2026-10-15
103
+ Review by: not applicable
104
+ Source revision: not applicable
105
+ Conflicts with: not applicable
106
+
107
+ ## Claim Record 4 - Scroll-Body-Shell Scroll Ownership
108
+
109
+ Principle: A layout pattern owns its named scroll container.
110
+
111
+ Claim: The `scroll-body-shell` pattern keeps header and footer regions fixed while only the named body region scrolls, with no horizontal overflow and keyboard focus following DOM order, at 320, 768, and 1440 CSS pixels.
112
+
113
+ Context: Viewport-shell patterns regress silently when a layout change hands scroll to the document root, traps focus, or overflows a narrow viewport; prose alone cannot catch this.
114
+
115
+ Use case: not applicable.
116
+
117
+ Warrant: A browser render oracle loads a faithful demo of the pattern at three widths and asserts the body is the only scroll owner, the document root does not overflow, Tab order matches DOM order, reduced motion shows no running infinite animation, and axe-core reports no serious or critical violation.
118
+
119
+ Evidence family: `validator`, `rendered`.
120
+
121
+ Verification protocol: `node scripts/check-pattern-oracle.mjs --json` renders the demo fixture and fails when any width breaks the contract; `node scripts/test-check-pattern-oracle.mjs` guards the oracle with positive and negative fixtures.
122
+
123
+ Implementation handoff: not applicable.
124
+ Consumer reference: not_applicable
125
+ Consumer reference reason: This pattern-oracle sample contains no consumer-specific reference record.
126
+
127
+ Boundary or limitation: The oracle proves the demo's rendered layout contract on one Chromium engine; it does not prove the pattern is usable, accessible for every assistive technology, or correct in browsers it does not render.
128
+
129
+ Debt or escalation: Extend the oracle to more patterns only after measuring CI time and render stability; a flaky render is a blocking defect, not an accepted cost.
130
+
131
+ Decision: pass when the oracle is green at all three widths.
132
+ Evidence refs: `scripts/check-pattern-oracle.mjs`, `scripts/test-check-pattern-oracle.mjs`, `tests/fixtures/pattern-oracle/scroll-body-shell/index.html`
133
+ Verified by: auto
134
+ Reviewed at: 2026-10-15
135
+ Review by: not applicable
136
+ Source revision: not applicable
137
+ Conflicts with: not applicable
88
138
 
89
139
  ## IA Navigation
90
140
 
@@ -8,11 +8,11 @@ description: Decision to supersede the layout-only repository identity with a go
8
8
 
9
9
  ## Decision
10
10
 
11
- StyleGallery supersedes the repository-wide `layout-gallery` identity with five explicit domains: Layout, Motion, Design Engineering, Game UI, and Platform Guides. The prior layout-only rules remain authoritative inside Layout instead of being deleted or silently weakened.
11
+ StyleGallery supersedes the repository-wide `layout-gallery` identity with six explicit domains: Layout, Motion, Design Engineering, Platform Guides, Design Terminology, and Expression. The prior layout-only rules remain authoritative inside Layout instead of being deleted or silently weakened.
12
12
 
13
13
  ## Context
14
14
 
15
- The repository name and intended collection now exceed a single spatial corpus. Treating motion, interface craft, game-interface knowledge, engine-specific Game UI implementation, or platform comparison as Layout patterns would violate the existing pattern boundary, while leaving them ungoverned would bypass source-of-truth, ownership, lifecycle, and evidence rules.
15
+ The repository name and intended collection now exceed a single spatial corpus. Treating motion, interface craft, art direction, terminology comparison, or platform comparison as Layout patterns would violate the existing pattern boundary, while leaving them ungoverned would bypass source-of-truth, ownership, lifecycle, and evidence rules.
16
16
 
17
17
  ## Warrant
18
18
 
package/quality/claims.md CHANGED
@@ -63,13 +63,36 @@ Consumer reference reason: This blank claim template declares no consumer-specif
63
63
  Boundary or limitation:
64
64
  Debt or escalation:
65
65
  Decision:
66
+ Evidence refs:
67
+ Verified by:
68
+ Reviewed at:
69
+ Review by: not applicable
70
+ Source revision: not applicable
71
+ Conflicts with: not applicable
66
72
  ```
67
73
 
68
74
  `Use case` and `Implementation handoff` are required for harmony claims. For other claim types, write `not applicable` rather than deleting the fields.
69
75
 
76
+ ## Machine Fields
77
+
78
+ Records under `claim-records/` carry machine-readable fields so a validator can check them in CI. `scripts/validate-claim-records.mjs` enforces these fields; `scripts/test-validate-claim-records.mjs` guards the validator with positive and negative fixtures.
79
+
80
+ - `Evidence refs`: one or more backticked refs, comma-separated. A ref is a repository-relative path that must resolve to an existing file, or an agent-native StableRef-style id (for example `sg://...` or a dotted `domain.kind`). At least one ref is required. Inline code is used so link checking does not treat a ref as a navigable link.
81
+ - `Verified by`: exactly one of `auto`, `human`, or `mixed`.
82
+ - `Reviewed at`: a real `YYYY-MM-DD` date (the freshness review date).
83
+ - `Review by`: a real `YYYY-MM-DD` date or `not applicable`.
84
+ - `Source revision`: a commit SHA, URL, or `not applicable`, recorded for the deferred external-source drift audit.
85
+ - `Conflicts with`: backticked claim refs or `not applicable`, recorded for the deferred conflict index.
86
+
87
+ Automation certifies only what it can check: `Verified by: auto` is allowed only when the `Decision` is `pass`, and every `Evidence refs` entry must then be executable (a `scripts/` or `tests/` path, or a StableRef id). A `review_required` or `blocked` decision needs `human` or `mixed` verification, which in turn must cite at least one human-review artifact under `quality/evidence/` or `quality/gates/`. This keeps the repository's own rule that a scan cannot certify complete accessibility.
88
+
89
+ ## Source Of Truth
90
+
91
+ Markdown claim records under `quality/claim-records/*.md` are the canonical, human-authored source of truth for claims, consistent with the governance matrix (quality docs are a Manual `quality/**/*.md` family). The agent-native epistemic graph under `consumer-reference/agent-native/` is a separate machine representation; the machine field names here align with its `claim` record (`evidence_refs`, `validation_refs`, `observed_at`) so the two can converge through a future projection, without making either import the other.
92
+
70
93
  ## Review Rule
71
94
 
72
- A record is complete only when the evidence family names what the artifact can support and the boundary says what it cannot prove. Evidence without a warrant remains a blocking condition.
95
+ A record is complete only when the evidence family names what the artifact can support and the boundary says what it cannot prove. Evidence without a warrant remains a blocking condition, and a machine-readable record is complete only when its machine fields pass `scripts/validate-claim-records.mjs`.
73
96
 
74
97
  ## IA Navigation
75
98
 
@@ -37,7 +37,7 @@ Executable evidence identifies which claims are machine-enforced, which are only
37
37
  | Promotion governance remains a closed JSON-only, invariant-scoped, deferred example contract. | `scripts/validate-promotion-rfc.mjs` and `scripts/test-validate-promotion-rfc.mjs` | `node scripts/validate-promotion-rfc.mjs --json`; `node scripts/test-validate-promotion-rfc.mjs --json` | The manifest-declared policy and two canonical examples pass with deferred decisions, zero attestations, exact support commitment, and no promotion claim. | Manifest-declared invalid fixtures plus forged, unregistered, duplicate, path, extension, support, evidence, canonical-drift, and lifecycle mutations exit non-zero with named findings. | Synthetic validation does not authenticate adoption, organizations, owners, support capacity, provenance, or a promotion decision; the current canonical inventory supplies no real independent consumers. |
38
38
  | Portable token source and generated CSS agree through the pinned restricted adapter. | `scripts/build-reference-artifacts.mjs`, `scripts/validate-reference-artifacts.mjs`, and `scripts/test-reference-adapters.mjs` | Build with `--fail-on-warning`, validate the generated manifest, then run the adapter fixture harness. | Dimension, color, duration, tested border values, and whole-token curly aliases emit nonzero CSS declarations with matching counts and hashes; output references remain CSS variable references. | `$extends`, JSON Pointer, resolver/modifier/theme documents, unknown reserved fields, non-string descriptions, adapter-unsafe path segments, untested type/unit, partial/dangling/cyclic/type-mismatched aliases, missing output, zero count, warning, scaffold/unknown manifest fields, missing/duplicate declaration, object sentinel, unresolved or forged value, and count drift must fail with named findings and non-zero child exit. | Proves the pinned adapter preserves this tested subset and that committed artifacts independently rebuild from their canonical source, not that tokens are product defaults, portable beyond the tested adapters, visually suitable, or adopted by a consumer. |
39
39
  | The proposed Chromium sentinel preserves canonical card-grid geometry and truth-derived calibration evidence. | `tests/consumer-reference-sentinels.spec.mjs`, `scripts/test-consumer-reference-sentinel.mjs`, `scripts/validate-baseline-manifest.mjs`, and strict raw calibration harnesses. | Run the ordinary sentinel and semantic negatives in the digest-pinned nonblocking Chromium job; validate manifest/raw evidence in the contract job. | Computed visibility/cardinality/grid/gap/geometry/overflow checks precede a locator screenshot; raw DOM and AX bytes are recorded and hash-checked across runs; completion and zero diff derive only from a zero child exit, the exact passing Playwright identity, verified raw hashes, and post-assertion comparison proof. | Hidden layout, long-content overflow, fake/malformed Playwright, missing or nonzero exit, absent comparison/artifact, tampered hash, duplicate/unknown metadata, malformed recursive records, and incomplete run sets must fail without writing a completed aggregate. | Local DOM/AX/rendered evidence does not prove semantic DOM/AX conformance, product suitability, accessibility, or owner approval. Completed-CI repository, workflow, run ID and attempt, SHA, and artifact-name fields are workflow-recorded, self-asserted metadata, not an external attestation. The self-asserted repository field names the canonical upstream changeroa/StyleGallery; the self-asserted execution_repository field names the actual GitHub Actions repository and is limited to changeroa/StyleGallery or ark-jo/StyleGallery. The committed calibration's external_verification object records an independently checked GitHub Actions run and artifact API identity; artifact.api_digest is distinct from committed_ci.raw_evidence_sha256. Future CI aggregates remain awaiting_external_verification until their uploaded artifact API identity is independently checked. Linux/amd64 repeatability is externally verified only for committed run 29260372260; it does not establish baseline-owner approval or product suitability. Baseline-owner approval remains unclaimed until the named owner explicitly approves it. Synthetic fixtures validate rejection and acceptance behavior only; they are not authenticated provenance. Both Chromium jobs are nonblocking and CI never updates snapshots. |
40
- | Governed-local button states retain source-bound visual, DOM, and accessibility-tree evidence across both example profiles. | `scripts/create-component-state-session.mjs`, `scripts/finalize-component-state-evidence.mjs`, `scripts/validate-component-state.mjs`, and the component-state source, contract, artifact, generator, and sentinel harnesses. | `npm run test:component-state`; `npm run validate:component-state`; run the digest-pinned component-state browser capture and `npm run test:component-state:runtime-negative`. | Editorial and terminal each declare the five compound scenarios `action-disabled-busy`, `action-focused`, `action-loading-busy`, `disclosure-expanded-loading`, and `toggle-focused-pressed`; their environment-scoped approved PNG hashes and dimensions are canonical pre-capture inputs; the generated state, keyboard, and evidence matrices match their records; one clean capture session binds the browser artifacts to the governed source inventory. | Missing or altered source bindings, missing executable source manifests, invalid state/profile records, scenario drift, coordinated PNG/manifest/sidecar substitution, unapproved environment-specific raster identity, malformed or replayed runtime artifacts, hash/count mismatch, insufficient focus clearance, and sentinel mutations must exit non-zero with named findings. | Proves the declared examples and captured channels agree for an explicitly approved browser environment. Legacy source-less receipts are intentionally rejected by the capture receipt, `session_link`, and `completed_session` schemas and by executable finalization and validation. Environment-scoped PNG identity does not imply cross-platform pixel equivalence. It does not prove product suitability, independent adoption, full accessibility, cross-browser behavior, or owner approval; synthetic negative fixtures are not authenticated provenance. |
40
+ | Governed-local button states retain source-bound visual, DOM, and accessibility-tree evidence across both example profiles. | `scripts/create-component-state-session.mjs`, `scripts/finalize-component-state-evidence.mjs`, `scripts/validate-component-state.mjs`, and the component-state source, contract, artifact, generator, and sentinel harnesses. | `bun run test:component-state`; `bun run validate:component-state`; run the digest-pinned component-state browser capture and `bun run test:component-state:runtime-negative`. | Editorial and terminal each declare the five compound scenarios `action-disabled-busy`, `action-focused`, `action-loading-busy`, `disclosure-expanded-loading`, and `toggle-focused-pressed`; their environment-scoped approved PNG hashes and dimensions are canonical pre-capture inputs; the generated state, keyboard, and evidence matrices match their records; one clean capture session binds the browser artifacts to the governed source inventory. | Missing or altered source bindings, missing executable source manifests, invalid state/profile records, scenario drift, coordinated PNG/manifest/sidecar substitution, unapproved environment-specific raster identity, malformed or replayed runtime artifacts, hash/count mismatch, insufficient focus clearance, and sentinel mutations must exit non-zero with named findings. | Proves the declared examples and captured channels agree for an explicitly approved browser environment. Legacy source-less receipts are intentionally rejected by the capture receipt, `session_link`, and `completed_session` schemas and by executable finalization and validation. Environment-scoped PNG identity does not imply cross-platform pixel equivalence. It does not prove product suitability, independent adoption, full accessibility, cross-browser behavior, or owner approval; synthetic negative fixtures are not authenticated provenance. |
41
41
 
42
42
  ## Validator Severity Contract
43
43
 
package/quality/index.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Quality Gates
2
2
 
3
- `quality/` is shared StyleGallery infrastructure for deciding whether Layout, Motion, Design Engineering, Game UI, Platform Guides, and Design Terminology claims are admissible.
3
+ `quality/` is shared StyleGallery infrastructure for deciding whether Layout, Motion, Design Engineering, Platform Guides, Design Terminology, and Expression claims are admissible.
4
4
 
5
5
  This shared layer does not make the repository a visual design system. Layout pattern files still own spatial structure only; domain guidance cannot bypass these gates. Quality gates explain how claims are framed, what evidence can support them, and when review or debt is required.
6
6
 
@@ -50,6 +50,5 @@ Use this script for lightweight tree tests:
50
50
  | Compare an Apple interaction convention. | [README](../README.md) | [Apple Interaction](../platform-guides/apple-interaction.md) | The first selected route is Platform Guides and source/version limits are reached within two hops. |
51
51
  | Declare whether a consumer reference applies. | [README](../README.md) | [Consumer Reference](../consumer-reference/index.md) | The handoff reaches the shared contract without classifying it as a seventh domain. |
52
52
  | Prove a consumer migration preserves declared behavior. | [README](../README.md) | [Consumer Migration Readiness](../design-engineering/consumer-migration-readiness.md) | The reader reaches the Design Engineering method and its evidence gate within two hops. |
53
- | Find the authority route for uGUI, UI Toolkit, or NGUI. | [README](../README.md) | [Unity UI Systems](../game-ui/unity/ui-systems.md) | The first selected route is Game UI, and the system-specific source and version boundary is reached within three hops. |
54
53
 
55
54
  Record `PASS` only when the expected primary route is the first route selected. A link resolving successfully is not enough; the selected route must match the task intent.
@@ -17,7 +17,7 @@ const MANIFEST_REF = "sg:manifest/material-admission-v2";
17
17
  const MATERIAL_REF_PATTERN = /^sg:material\/path-sha256-[a-f0-9]{64}$/;
18
18
  const MATERIAL_VERSION_PATTERN = /^sg:material\/path-sha256-[a-f0-9]{64}@sha256:[a-f0-9]{64}$/;
19
19
  const HASH_PATTERN = /^[a-f0-9]{64}$/;
20
- const DOMAINS = new Set(["layout", "motion", "design-engineering", "game-ui", "platform-guides", "design-terminology", "shared"]);
20
+ const DOMAINS = new Set(["layout", "motion", "design-engineering", "platform-guides", "design-terminology", "expression", "shared"]);
21
21
  const LIFECYCLES = new Set(["draft", "stable", "deprecated", "experimental", "generated"]);
22
22
  const RECORD_KEYS = new Set(["schema_version", "record_kind", "stable_ref", "version_id", "repository_path", "media_type", "source_sha256", "byte_length", "lifecycle", "domain"]);
23
23
  const MANIFEST_KEYS = new Set(["schema_version", "record_kind", "stable_ref", "version_id", "admission_policy_ref", "admission_policy_version_id", "materials"]);
@@ -6,7 +6,7 @@ export const MATERIAL_STABLE_REF_KINDS = Object.freeze(["domain", "page", "patte
6
6
  const KIND_SET = new Set(MATERIAL_STABLE_REF_KINDS);
7
7
  const KEBAB = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
8
8
  const PATH_ID = /^path-sha256-[a-f0-9]{64}$/;
9
- const DOMAIN_IDS = new Set(["layout", "motion", "design-engineering", "game-ui", "platform-guides", "design-terminology"]);
9
+ const DOMAIN_IDS = new Set(["layout", "motion", "design-engineering", "platform-guides", "design-terminology", "expression"]);
10
10
  const MATERIAL_ID = PATH_ID;
11
11
 
12
12
  export class MaterialIdentityError extends TypeError {
@@ -56,7 +56,7 @@ export function materialIdentityForRecord(record) {
56
56
  if (typeof repositoryPath !== "string") fail("material_record_identity_invalid", "record has no bound source path");
57
57
  let kind = "page";
58
58
  let id = `path-sha256-${sha256(Buffer.from(repositoryPath, "utf8"))}`;
59
- const domainMatch = /^(layout|motion|design-engineering|game-ui|platform-guides|design-terminology)\/index\.md$/.exec(repositoryPath);
59
+ const domainMatch = /^(layout|motion|design-engineering|platform-guides|design-terminology|expression)\/index\.md$/.exec(repositoryPath);
60
60
  if (domainMatch) { kind = "domain"; id = domainMatch[1]; }
61
61
  else if (/^patterns\/[^/]+\/[^/]+\.md$/.test(repositoryPath)) kind = "pattern";
62
62
  return deepFreeze({
@@ -12,13 +12,13 @@ Use `sg compile`, `sg timeline`, and the other commands below directly. The `sty
12
12
 
13
13
  ## Setup
14
14
 
15
- Install StyleGallery with Node.js 22 or newer using `npm install --global stylegallery`. For an unreleased StyleGallery checkout, run commands from that checkout as `npm run sg -- <command>` instead. If another program already owns the `sg` command, use the equivalent `stylegallery` executable or the npm script. The compiler is a [separate private repository](https://github.com/changeroa/site-compiler); an account with access must install it once:
15
+ Install StyleGallery with Node.js 22 or newer using `npm install --global stylegallery`. For an unreleased StyleGallery checkout, run commands from that checkout as `bun run sg -- <command>` instead. If another program already owns the `sg` command, use the equivalent `stylegallery` executable or the npm script. The compiler is a [separate private repository](https://github.com/changeroa/site-compiler); an account with access must install it once:
16
16
 
17
17
  ```sh
18
18
  gh repo clone changeroa/site-compiler /absolute/path/to/site-compiler
19
19
  cd /absolute/path/to/site-compiler
20
- npm ci --ignore-scripts --no-audit --no-fund
21
- npx playwright install chromium
20
+ bun install --frozen-lockfile --ignore-scripts
21
+ bunx playwright install chromium
22
22
  export SG_COMPILER_ROOT=/absolute/path/to/site-compiler
23
23
  sg discover --format json
24
24
  ```
@@ -90,13 +90,13 @@ Use `sg discover` or `sg ops` for the full input schemas. CLI options use hyphen
90
90
 
91
91
  Call `compile` with `{"url":"https://example.com","out":"/absolute/path/to/captures/example"}` or `gate` with `{"in":"/absolute/path/to/captures/example"}`. Prefer absolute paths because the MCP client's launch directory may differ from your terminal. Long captures require a client request timeout longer than the capture; the runner's timeout does not change client settings. `workflow` and the knowledge tools are read-only; execution tools are marked as potentially destructive and non-idempotent because existing artifacts may be replaced.
92
92
 
93
- From the StyleGallery checkout, use `npm run sg -- compile ...` and `npm run sg:mcp` for local development. To connect an MCP client to that unreleased checkout, use `"command": "node"` and `"args": ["/absolute/path/to/StyleGallery/scripts/sg-server.mjs"]` with the same environment settings. The frozen six-tool v1 server is `npm run sg:mcp:v1`, and its CLI is `npm run sg:v1 -- ...`.
93
+ From the StyleGallery checkout, use `bun run sg -- compile ...` and `bun run sg:mcp` for local development. To connect an MCP client to that unreleased checkout, use `"command": "node"` and `"args": ["/absolute/path/to/StyleGallery/scripts/sg-server.mjs"]` with the same environment settings. The frozen six-tool v1 server is `bun run sg:mcp:v1`, and its CLI is `bun run sg:v1 -- ...`.
94
94
 
95
95
  ## Contracts And Verification
96
96
 
97
97
  The adapter follows the handoff fields in [Component Contract](../../design-engineering/component-contract.md): explicit inputs, outputs, process ownership, cancellation, and observable failure. Motion transcription remains governed by [Observed Choreography](../../motion/observed-choreography.md). These are routes into the existing domains; the transport creates no new domain or reusable Layout styling.
98
98
 
99
- From the StyleGallery checkout, run `npm run test:compiler` for subprocess, argument, cancellation, JSON, and MCP transport checks. With a compiler installation and Chromium available, run `SG_COMPILER_INTEGRATION_ROOT=/absolute/path/to/site-compiler npm run test:compiler` to also capture a local fixture with the real upstream scripts. Model transcription, model builds, and product release packaging are separate upstream operations and are not exercised by that smoke test.
99
+ From the StyleGallery checkout, run `bun run test:compiler` for subprocess, argument, cancellation, JSON, and MCP transport checks. With a compiler installation and Chromium available, run `SG_COMPILER_INTEGRATION_ROOT=/absolute/path/to/site-compiler bun run test:compiler` to also capture a local fixture with the real upstream scripts. Model transcription, model builds, and product release packaging are separate upstream operations and are not exercised by that smoke test.
100
100
 
101
101
  Implementation handoff:
102
102
 
@@ -0,0 +1,127 @@
1
+ ---
2
+ type: Showcase Guide
3
+ title: Showcase
4
+ description: Free-form, single-page expressive works checked by outcome instead of authoring rules.
5
+ lifecycle: experimental
6
+ ---
7
+
8
+ # Showcase
9
+
10
+ Primary role: expressive work area.
11
+
12
+ `showcase/` holds complete, expressive pages: brand studies, landing pages, and art-directed experiments. The Layout authoring rules do not apply here. A work may use any CSS property, any selector, gradients, blend modes, WebGL, GSAP, Lenis, or its own fonts. Layout still sets the floor: a work has to pass the outcome checks below. It does not have to follow the pattern CSS style guide.
13
+
14
+ ## Why It Exists
15
+
16
+ Reusable Layout patterns exclude decorative styling so they stay portable. That rule is correct for `patterns/**`, but it made the repository unable to express a finished product page. Showcase is the product layer where the finished page lives. It depends on Layout and Expression. Nothing depends on it.
17
+
18
+ ## Work Contract
19
+
20
+ Each work is one directory, `showcase/<slug>/`, containing:
21
+
22
+ - `index.html`: the entry page. It may load local files or pinned CDN libraries.
23
+ - `brief.md`: the direction, frontmatter with `type: Showcase Brief`, `title`, `description`, and `brand_study: true|false`.
24
+ - Any other local assets the page needs.
25
+
26
+ A brand study (`brand_study: true`) reinterprets a named real brand. It additionally requires:
27
+
28
+ - `subject:` in the brief frontmatter, naming the brand being studied.
29
+ - `<meta name="robots" content="noindex, nofollow">` in `index.html`.
30
+ - Visible text containing "Unofficial" on the page.
31
+ - No copied logos, trademarks as artwork, or verbatim marketing copy. Write original copy in the brand's register instead.
32
+
33
+ See [Brand Studies](../expression/brand-studies.md) for the reasoning and limits.
34
+
35
+ ## Asset Selection
36
+
37
+ Reuse existing assets first: reference-site media, supplied files, and project assets. Record the source and selected file for each image/video slot in the brief. Cropping, sizing, compression, masks, and grading adapt an existing asset to the page.
38
+
39
+ Create new assets only for intentionally graphical/vector work: icons, diagrams, patterns, abstract graphics, and vector illustrations. Do not generate photography, video, or realistic product renders, or replace them with CSS/SVG/canvas stand-ins. If the right asset is missing, find an existing one or record the gap rather than drawing a substitute to pass the richness check. Working product UI can still be implemented as behavior; it is not a replacement for photographic media. See [Image Weight](../expression/techniques/image-weight.md).
40
+
41
+ ## Brief Template
42
+
43
+ ```md
44
+ ---
45
+ type: Showcase Brief
46
+ title: <Work name>
47
+ description: <One sentence: what the page is and what it should feel like.>
48
+ brand_study: false
49
+ ---
50
+
51
+ # <Work name>
52
+
53
+ ## Direction
54
+ Reference, mood, and the one thing a visitor should remember.
55
+
56
+ ## System
57
+ Type pairing, palette, texture, and motion density, with actual values or a link to an Expression direction.
58
+
59
+ ## Techniques
60
+ Expression and Motion technique pages the work uses.
61
+
62
+ ## Assets
63
+ Existing source URL/path and selected local file per slot; list any intentionally graphical/vector assets to create and any missing media.
64
+
65
+ ## Layout Floor
66
+ Scroll owner, pinned or sticky regions, and how the page collapses at 320px.
67
+ ```
68
+
69
+ ## Preview
70
+
71
+ ```sh
72
+ bun run showcase:serve # http://localhost:4180/ (hub) and one URL per work
73
+ bun run showcase:serve -- --port 4190
74
+ ```
75
+
76
+ Working on a remote machine over SSH? Run this on your own machine, then open `http://localhost:4180/` in your local browser:
77
+
78
+ ```sh
79
+ ssh -N -L 4180:127.0.0.1:4180 <user>@<remote-host>
80
+ ```
81
+
82
+ The serve command prints this line with the right user and host filled in. Fonts and libraries load from CDNs in the visitor's browser, so the local machine needs internet access.
83
+
84
+ Once any work exists, `showcase/index.html` is the hub that lists every work: the first work creates it, every later work adds a card, and each work's footer links back to `../`.
85
+
86
+ ## Outcome Checks
87
+
88
+ `bun run test:showcase` (or `node scripts/check-showcase.mjs --work <slug>`) runs the hub and every work in headless Chromium. Each check maps to a scenario in the [QA contract](QA.md):
89
+
90
+ | Check | Failure |
91
+ | --- | --- |
92
+ | Brief contract | Missing brief fields, or a brand study without `subject`, `noindex`, or visible "Unofficial" text. |
93
+ | Runtime and assets | Any uncaught page error, or any same-origin request answered with 4xx. Failed CDN requests alone are tolerated. |
94
+ | Horizontal overflow | Document wider than the viewport at 320, 768, or 1440 CSS pixels, at the top, middle, or bottom. |
95
+ | Focus | A tabbable element with no box, outside the viewport, covered by another element (such as a sticky header), or reached out of DOM order. |
96
+ | Reduced motion | With `prefers-reduced-motion: reduce`, a heading or paragraph invisible on arrival, or an infinite animation running. |
97
+ | Contrast | Text over a solid background below WCAG AA: 4.5:1, or 3:1 for large text. |
98
+ | Links and actions | A link to raw Markdown, an empty `#`, a missing `#id`, or `#top` outside the header; a `[data-demo]` action that is not a button, shows no visible `role="status"` message, or moves the page. |
99
+ | Identity | No title or no favicon. |
100
+ | Hash navigation | Clicking the first header nav link does not update the URL hash or lands its heading under the header or below the top half; Back does not return near the top; opening the last nav target's URL directly does not land on it. |
101
+ | Short viewport | At 1280x620, a fixed or pinned element that contains text is taller than the viewport. |
102
+ | Offscreen ambient | At 1440 wide, an infinite CSS animation or repeating GSAP tween still running on an element entirely offscreen. Mark ambient containers `data-ambient` and pause them with an IntersectionObserver. |
103
+ | Offline | With every non-local request blocked: page errors, hidden text, or overflow at 390 wide. |
104
+ | No script | With every script blocked: hidden text or overflow at 390 wide. |
105
+ | Hub | Works exist but `showcase/index.html` is missing, or a work directory it does not link. With no works, the check passes and reports that there is nothing to check. |
106
+ | Richness: empty screen | At 1440x900, a screen where images, video, canvas, SVG of at least 120x80, background images, and elements marked `data-surface` cover under 8% and text covers under 10%. |
107
+ | Richness: response | Fewer than 4 elements with transitions per screen of page length (at least 12), or link and button transitions with a median above 350ms. |
108
+ | Richness: surface detail | Fewer than 2 elements with a mask or clip-path, or fewer than 3 with 1px hairline borders. |
109
+
110
+ Richness findings are warnings by default so older works keep passing; run with `--richness error` to make them failures, which new works must pass. Mark a drawn scene or a live product mock built from HTML with `data-surface` so the check counts it; never mark a gradient or an empty panel.
111
+
112
+ Fictional actions (subscribe, book, get a key) must be `<button type="button" data-demo="...">` elements that show an honest message in a `role="status"` region, never links that jump to the top.
113
+
114
+ Screenshots are taken after entrance tweens and CSS transitions settle and are written to `.tmp/showcase/<slug>/`. The checks do not judge taste: review the screenshots. `bun run test:showcase:self` proves each check can fail by running the checker against fixtures built to violate it.
115
+
116
+ ## Works
117
+
118
+ The repository ships the contract, the checker, and the guidance, but no committed works. Works are built per project in `showcase/<slug>/` and must pass the checks above before they are shared.
119
+
120
+ ## Starting A Work Fast
121
+
122
+ Read this page, the [Expression Direction Brief](../expression/direction-brief.md), one [Expression direction](../expression/index.md), and the [Motion techniques](../motion/techniques/scroll-choreography.md) you need. Skip governance, provenance, and consumer-reference documents: a showcase work creates no governed record. Plan one image, drawn scene, or product surface per screen before writing CSS ([Image Weight](../expression/techniques/image-weight.md)). Build, add a hub card, run `bun run showcase:serve` and `node scripts/check-showcase.mjs --work <slug> --richness error`, look at the screenshots, and iterate.
123
+
124
+ ## IA Navigation
125
+
126
+ Parent: [StyleGallery](../index.md).
127
+ Next: [Expression](../expression/index.md).