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.
- package/AGENTS.md +15 -1
- package/DOMAINS.md +7 -3
- package/GOVERNANCE.md +13 -11
- package/LICENSE-DOCS +2 -2
- package/README.md +23 -10
- package/consumer-reference/agent-native/v2/admission-policy.json +32 -37
- package/consumer-reference/agent-native/v2/material-registry.json +1 -1
- package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +3 -3
- package/consumer-reference/agent-native/v2/schema/material-record.schema.json +1 -1
- package/design-engineering/state-management/index.md +1 -1
- package/design-engineering/state-management/patterns/derived-state.md +1 -1
- package/design-engineering/state-management/patterns/draft-and-baseline.md +1 -1
- package/design-engineering/state-management/patterns/id-selection.md +1 -1
- package/design-engineering/state-management/patterns/identity-reset.md +1 -1
- package/design-engineering/state-management/patterns/latest-request-wins.md +1 -1
- package/design-engineering/state-management/patterns/optimistic-overlay.md +1 -1
- package/design-engineering/state-management/patterns/single-flight.md +1 -1
- package/design-engineering/state-management/patterns/single-owner.md +1 -1
- package/design-engineering/state-management/patterns/submitted-snapshot.md +1 -1
- package/design-engineering/state-management/patterns/unsaved-navigation.md +1 -1
- package/design-engineering/state-management/patterns/url-state.md +1 -1
- package/design-engineering/state-management/patterns/versioned-restore.md +1 -1
- package/design-engineering/state-management/verification.md +1 -1
- package/design-terminology/conflict-cases.md +1 -1
- package/design-terminology/source-kinds.md +1 -1
- package/expression/brand-studies.md +50 -0
- package/expression/direction-brief.md +83 -0
- package/expression/directions/nocturne-editorial.md +81 -0
- package/expression/directions/warm-print.md +73 -0
- package/expression/index.md +52 -0
- package/expression/techniques/gradient-atmosphere.md +107 -0
- package/expression/techniques/grain-and-texture.md +83 -0
- package/expression/techniques/webgl-hero.md +123 -0
- package/guides/vocabulary.md +1 -1
- package/index.md +3 -3
- package/log.md +45 -0
- package/motion/index.md +71 -0
- package/motion/techniques/kinetic-type.md +145 -0
- package/motion/techniques/scroll-choreography.md +154 -0
- package/package.json +17 -14
- package/platform-guides/compatibility-matrix.md +1 -1
- package/quality/claim-records/samples.md +50 -0
- package/quality/claim-records/stylegallery-multidomain-scope.md +2 -2
- package/quality/claims.md +24 -1
- package/quality/evidence/executable-evidence.md +1 -1
- package/quality/index.md +1 -2
- package/scripts/agent-native/v2/material-admission.mjs +1 -1
- package/scripts/agent-native/v2/material-identity.mjs +2 -2
- package/scripts/compiler/README.md +5 -5
- package/showcase/README.md +127 -0
- package/game-ui/classification.md +0 -82
- package/game-ui/decision-tree.md +0 -81
- package/game-ui/index.md +0 -45
- package/game-ui/reference-record.md +0 -62
- package/game-ui/screen-hierarchy.md +0 -107
- package/game-ui/screen-recipes.md +0 -101
- package/game-ui/unity/architecture.md +0 -166
- package/game-ui/unity/cli-loop.md +0 -84
- package/game-ui/unity/org-wiki.md +0 -146
- package/game-ui/unity/repository-map.md +0 -102
- package/game-ui/unity/ui-systems.md +0 -85
- 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.
|
|
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
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"
|
|
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.
|
|
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
|
|
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,
|
|
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. | `
|
|
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,
|
|
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", "
|
|
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", "
|
|
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|
|
|
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 `
|
|
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
|
-
|
|
21
|
-
|
|
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 `
|
|
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 `
|
|
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).
|