stylegallery 0.1.6 → 0.1.8
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 +13 -1
- package/DOMAINS.md +10 -6
- package/GOVERNANCE.md +14 -12
- package/LICENSE +28 -0
- package/LICENSE-DOCS +42 -0
- package/NOTICE +38 -0
- package/README.md +47 -15
- package/consumer-reference/agent-native/README.md +7 -7
- package/consumer-reference/agent-native/v2/admission-policy.json +196 -31
- 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/component-contract.md +19 -3
- package/design-engineering/decision-tree.md +1 -0
- package/design-engineering/index.md +48 -0
- package/design-engineering/loading-and-feedback.md +91 -0
- package/design-engineering/native-interaction-contracts.md +94 -0
- package/design-engineering/state-management/decision-tree.md +60 -0
- package/design-engineering/state-management/index.md +61 -0
- package/design-engineering/state-management/patterns/derived-state.md +85 -0
- package/design-engineering/state-management/patterns/draft-and-baseline.md +86 -0
- package/design-engineering/state-management/patterns/id-selection.md +85 -0
- package/design-engineering/state-management/patterns/identity-reset.md +89 -0
- package/design-engineering/state-management/patterns/latest-request-wins.md +94 -0
- package/design-engineering/state-management/patterns/optimistic-overlay.md +98 -0
- package/design-engineering/state-management/patterns/single-flight.md +92 -0
- package/design-engineering/state-management/patterns/single-owner.md +89 -0
- package/design-engineering/state-management/patterns/submitted-snapshot.md +107 -0
- package/design-engineering/state-management/patterns/unsaved-navigation.md +100 -0
- package/design-engineering/state-management/patterns/url-state.md +96 -0
- package/design-engineering/state-management/patterns/versioned-restore.md +95 -0
- package/design-engineering/state-management/recipes/delete-undo.md +65 -0
- package/design-engineering/state-management/recipes/index.md +64 -0
- package/design-engineering/state-management/recipes/multi-step-form.md +65 -0
- package/design-engineering/state-management/recipes/search-detail.md +65 -0
- package/design-engineering/state-management/recipes/settings-save.md +64 -0
- package/design-engineering/state-management/state-brief.md +83 -0
- package/design-engineering/state-management/verification.md +65 -0
- package/design-engineering/text-input-and-internationalization.md +91 -0
- package/design-engineering/worked-examples.md +2 -0
- package/design-terminology/conflict-cases.md +51 -8
- package/design-terminology/index.md +6 -0
- package/design-terminology/interaction-semantics.md +87 -0
- package/design-terminology/source-kinds.md +1 -1
- package/design-terminology/source-vocabularies.md +17 -1
- package/design-terminology/token-semantics.md +90 -0
- package/design-terminology/typography-semantics.md +86 -0
- package/expression/brand-studies.md +50 -0
- package/expression/direction-brief.md +71 -0
- package/expression/directions/nocturne-editorial.md +80 -0
- package/expression/directions/warm-print.md +73 -0
- package/expression/index.md +40 -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 +64 -0
- package/motion/accessible-motion.md +90 -0
- package/motion/index.md +9 -0
- package/motion/interaction-recipes.md +8 -2
- package/motion/interruption-and-retargeting.md +90 -0
- package/motion/observed-choreography.md +73 -0
- package/motion/rendering-and-performance.md +89 -0
- package/motion/techniques/kinetic-type.md +145 -0
- package/motion/techniques/scroll-choreography.md +154 -0
- package/package.json +76 -21
- package/platform-guides/adaptive-navigation.md +85 -0
- package/platform-guides/compatibility-matrix.md +1 -1
- package/platform-guides/index.md +6 -0
- package/platform-guides/input-and-focus.md +91 -0
- package/platform-guides/preferences-and-accessibility.md +90 -0
- package/quality/claim-records/stylegallery-multidomain-scope.md +2 -2
- 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 +112 -0
- package/scripts/compiler/cli.mjs +51 -0
- package/scripts/compiler/mcp.mjs +53 -0
- package/scripts/compiler/operations.mjs +70 -0
- package/scripts/compiler/runtime.mjs +156 -0
- package/scripts/sg-entry.mjs +20 -0
- package/scripts/sg-server.mjs +20 -0
- package/showcase/README.md +113 -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,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Domain Recipe
|
|
3
|
+
title: Grain And Texture
|
|
4
|
+
description: Copy-ready film grain, noise, and halftone textures without image files.
|
|
5
|
+
domain: expression
|
|
6
|
+
lifecycle: experimental
|
|
7
|
+
provenance_kind: local
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Grain And Texture
|
|
11
|
+
|
|
12
|
+
Primary role: visual technique recipe.
|
|
13
|
+
|
|
14
|
+
## Repository Boundary
|
|
15
|
+
|
|
16
|
+
Product-layer CSS for `showcase/` works and consumer pages. Never add these declarations to reusable Layout pattern CSS.
|
|
17
|
+
|
|
18
|
+
## Reusable Method
|
|
19
|
+
|
|
20
|
+
### Film Grain Overlay
|
|
21
|
+
|
|
22
|
+
An SVG turbulence filter as a data URI, tiled over the whole page. No image file, about 400 bytes.
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<div class="grain" aria-hidden="true"></div>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```css
|
|
29
|
+
.grain {
|
|
30
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
31
|
+
inset: 0;
|
|
32
|
+
mix-blend-mode: overlay;
|
|
33
|
+
opacity: 0.22;
|
|
34
|
+
pointer-events: none;
|
|
35
|
+
position: fixed;
|
|
36
|
+
z-index: 90;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Tuning: `baseFrequency` 0.6 is coarse and filmic, 0.9 is fine and digital. Opacity 0.15-0.25 on dark grounds, 0.08-0.12 on light grounds with `mix-blend-mode: multiply` and a black `feColorMatrix` (replace the three `1` channel values with `0`).
|
|
41
|
+
|
|
42
|
+
### Halftone
|
|
43
|
+
|
|
44
|
+
Dots from a repeating radial gradient, masked onto an image or a flat color block.
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
.halftone {
|
|
48
|
+
background-image: radial-gradient(circle at center, #141210 0.9px, transparent 1.1px);
|
|
49
|
+
background-size: 6px 6px;
|
|
50
|
+
mix-blend-mode: multiply;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Place the `.halftone` layer over a grayscale image (`filter: grayscale(1) contrast(1.2)`) for a print look.
|
|
55
|
+
|
|
56
|
+
### Paper Tooth
|
|
57
|
+
|
|
58
|
+
For light directions, a very low-frequency turbulence adds unevenness without visible grain: `baseFrequency='0.02'`, `numOctaves='2'`, opacity 0.35, `mix-blend-mode: multiply`.
|
|
59
|
+
|
|
60
|
+
## Opinionated Guidance
|
|
61
|
+
|
|
62
|
+
Grain should be felt, not seen. If someone notices it in a screenshot at 100% zoom, it is too strong.
|
|
63
|
+
|
|
64
|
+
## Platform-Specific Guidance
|
|
65
|
+
|
|
66
|
+
A fixed full-viewport overlay is composited on every scroll frame. With `pointer-events: none` it never blocks input; if scrolling stutters on low-end devices, switch `position: fixed` to `absolute` on a page-height container.
|
|
67
|
+
|
|
68
|
+
## Unsupported Absolutes
|
|
69
|
+
|
|
70
|
+
Grain strength that works on a large desktop display can look dirty on a small high-density phone screen. Check both sizes.
|
|
71
|
+
|
|
72
|
+
## Verification Contract
|
|
73
|
+
|
|
74
|
+
The overlay is `aria-hidden`, has `pointer-events: none`, and does not intercept focus. The showcase focus-order check passes with the overlay present.
|
|
75
|
+
|
|
76
|
+
## Source, License, And Attribution
|
|
77
|
+
|
|
78
|
+
Locally authored recipe. No upstream source.
|
|
79
|
+
|
|
80
|
+
## IA Navigation
|
|
81
|
+
|
|
82
|
+
Parent: [Expression](../index.md).
|
|
83
|
+
Next: [WebGL Hero Field](webgl-hero.md).
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Domain Recipe
|
|
3
|
+
title: WebGL Hero Field
|
|
4
|
+
description: A three.js point field behind a hero, with pointer parallax, offscreen pausing, and safe fallbacks.
|
|
5
|
+
domain: expression
|
|
6
|
+
lifecycle: experimental
|
|
7
|
+
provenance_kind: local
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# WebGL Hero Field
|
|
11
|
+
|
|
12
|
+
Primary role: visual technique recipe.
|
|
13
|
+
|
|
14
|
+
## Repository Boundary
|
|
15
|
+
|
|
16
|
+
Product-layer script for `showcase/` works and consumer pages. The canvas is decorative atmosphere; no content or control may live only inside it.
|
|
17
|
+
|
|
18
|
+
## Reusable Method
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<section class="hero">
|
|
22
|
+
<canvas class="hero_canvas" aria-hidden="true"></canvas>
|
|
23
|
+
<!-- content -->
|
|
24
|
+
</section>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```css
|
|
28
|
+
.hero { isolation: isolate; overflow: clip; position: relative; }
|
|
29
|
+
.hero_canvas { block-size: 100%; inline-size: 100%; inset: 0; position: absolute; z-index: -1; }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
const reduceMotion = matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
34
|
+
|
|
35
|
+
async function startHeroField(canvas) {
|
|
36
|
+
let THREE, renderer;
|
|
37
|
+
try {
|
|
38
|
+
THREE = await import("https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js");
|
|
39
|
+
renderer = new THREE.WebGLRenderer({ canvas, alpha: true, antialias: true, powerPreference: "low-power" });
|
|
40
|
+
} catch {
|
|
41
|
+
return; // CSS atmosphere behind the canvas remains
|
|
42
|
+
}
|
|
43
|
+
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
|
|
44
|
+
const scene = new THREE.Scene();
|
|
45
|
+
const camera = new THREE.PerspectiveCamera(55, 1, 0.1, 100);
|
|
46
|
+
camera.position.set(0, 1.4, 7);
|
|
47
|
+
|
|
48
|
+
const columns = 140, rows = 70;
|
|
49
|
+
const positions = new Float32Array(columns * rows * 3);
|
|
50
|
+
const colors = new Float32Array(columns * rows * 3);
|
|
51
|
+
const a = new THREE.Color("#ff5a36"), b = new THREE.Color("#7b5cff");
|
|
52
|
+
for (let r = 0; r < rows; r++) for (let c = 0; c < columns; c++) {
|
|
53
|
+
const i = (r * columns + c) * 3;
|
|
54
|
+
positions[i] = (c / (columns - 1) - 0.5) * 18;
|
|
55
|
+
positions[i + 2] = (r / (rows - 1) - 0.5) * 12;
|
|
56
|
+
const color = a.clone().lerp(b, c / (columns - 1));
|
|
57
|
+
colors.set([color.r, color.g, color.b], i);
|
|
58
|
+
}
|
|
59
|
+
const geometry = new THREE.BufferGeometry();
|
|
60
|
+
geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
|
|
61
|
+
geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
|
|
62
|
+
const points = new THREE.Points(geometry, new THREE.PointsMaterial({
|
|
63
|
+
size: 0.045, vertexColors: true, transparent: true, blending: THREE.AdditiveBlending, depthWrite: false,
|
|
64
|
+
}));
|
|
65
|
+
scene.add(points);
|
|
66
|
+
|
|
67
|
+
const pointer = { x: 0, y: 0 };
|
|
68
|
+
addEventListener("pointermove", (e) => { pointer.x = e.clientX / innerWidth - 0.5; pointer.y = e.clientY / innerHeight - 0.5; }, { passive: true });
|
|
69
|
+
|
|
70
|
+
function resize() {
|
|
71
|
+
renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
|
|
72
|
+
camera.aspect = canvas.clientWidth / Math.max(canvas.clientHeight, 1);
|
|
73
|
+
camera.updateProjectionMatrix();
|
|
74
|
+
points.position.y = camera.aspect < 1 ? -3.2 : -1.2; // keep the field under portrait copy
|
|
75
|
+
}
|
|
76
|
+
function frame(time) {
|
|
77
|
+
const t = time * 0.00045, p = geometry.attributes.position.array;
|
|
78
|
+
for (let i = 0; i < p.length; i += 3) {
|
|
79
|
+
p[i + 1] = Math.sin(p[i] * 0.55 + t * 2) * 0.35 + Math.cos(p[i + 2] * 0.7 + t * 1.4) * 0.3;
|
|
80
|
+
}
|
|
81
|
+
geometry.attributes.position.needsUpdate = true;
|
|
82
|
+
camera.position.x += (pointer.x * 1.6 - camera.position.x) * 0.04;
|
|
83
|
+
camera.position.y += (1.4 - pointer.y * 0.8 - camera.position.y) * 0.04;
|
|
84
|
+
camera.lookAt(0, 0, 0);
|
|
85
|
+
renderer.render(scene, camera);
|
|
86
|
+
}
|
|
87
|
+
resize();
|
|
88
|
+
addEventListener("resize", resize);
|
|
89
|
+
if (reduceMotion) return frame(0); // one still frame
|
|
90
|
+
let visible = true;
|
|
91
|
+
new IntersectionObserver(([entry]) => { visible = entry.isIntersecting; }).observe(canvas);
|
|
92
|
+
renderer.setAnimationLoop((time) => { if (visible) frame(time); });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
startHeroField(document.querySelector(".hero_canvas"));
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Variations: swap the plane for `THREE.SphereGeometry` vertices for a globe of points, raise `size` and lower the count for bokeh, or map `scrollY` into `t` for a scroll-scrubbed field.
|
|
99
|
+
|
|
100
|
+
## Opinionated Guidance
|
|
101
|
+
|
|
102
|
+
Put a [CSS gradient atmosphere](gradient-atmosphere.md) behind the canvas. When WebGL fails, the hero still looks intentional instead of empty.
|
|
103
|
+
|
|
104
|
+
## Platform-Specific Guidance
|
|
105
|
+
|
|
106
|
+
Cap device pixel ratio at 2, request `low-power`, and pause rendering offscreen; a 10k-point field updated on the CPU is fine on laptops but should drop to about half the points on phones if frame rate matters. Import three.js as an ES module from a pinned version, never `@latest`.
|
|
107
|
+
|
|
108
|
+
## Unsupported Absolutes
|
|
109
|
+
|
|
110
|
+
Point counts and wave constants were tuned for one hero. They are not a performance guarantee; measure on the slowest device you care about.
|
|
111
|
+
|
|
112
|
+
## Verification Contract
|
|
113
|
+
|
|
114
|
+
The showcase check reports no page errors with or without network access to the CDN. Under reduced motion, only a still frame renders. The canvas is `aria-hidden` and holds no focusable content.
|
|
115
|
+
|
|
116
|
+
## Source, License, And Attribution
|
|
117
|
+
|
|
118
|
+
Locally authored recipe. three.js is MIT licensed and loaded at runtime; no three.js source is reproduced.
|
|
119
|
+
|
|
120
|
+
## IA Navigation
|
|
121
|
+
|
|
122
|
+
Parent: [Expression](../index.md).
|
|
123
|
+
Next: [Brand Studies](../brand-studies.md).
|
package/guides/vocabulary.md
CHANGED
|
@@ -15,7 +15,7 @@ Primary role: vocabulary and scannability contract.
|
|
|
15
15
|
- Canonical: `domain`
|
|
16
16
|
- Concept: top-level knowledge ownership
|
|
17
17
|
- Definition: A governed StyleGallery decision surface with a named scope, exclusions, lifecycle, source-of-truth, validator, and review owner.
|
|
18
|
-
- Use for: Layout, Motion, Design Engineering,
|
|
18
|
+
- Use for: Layout, Motion, Design Engineering, Platform Guides, Design Terminology, Expression, root routing, and `domain` frontmatter on governed leaves.
|
|
19
19
|
- Canonical: `category`
|
|
20
20
|
- Concept: domain-local browse placement
|
|
21
21
|
- Definition: A canonical grouping inside one domain; it cannot change the owning domain or its evidence boundary.
|
package/index.md
CHANGED
|
@@ -4,7 +4,7 @@ okf_version: "0.1"
|
|
|
4
4
|
|
|
5
5
|
# StyleGallery
|
|
6
6
|
|
|
7
|
-
StyleGallery is an OKF-style knowledge bundle organized into governed interface-knowledge domains. Existing Layout paths remain canonical while Motion, Design Engineering,
|
|
7
|
+
StyleGallery is an OKF-style knowledge bundle organized into governed interface-knowledge domains. Existing Layout paths remain canonical while Motion, Design Engineering, Platform Guides, Design Terminology, and Expression own separate product and reference boundaries. Finished expressive pages live in the Showcase work area.
|
|
8
8
|
|
|
9
9
|
Primary role: OKF bundle map.
|
|
10
10
|
|
|
@@ -14,9 +14,10 @@ Primary role: OKF bundle map.
|
|
|
14
14
|
- [Layout](layout/index.md) - Existing spatial patterns, recipes, planning guides, and layout quality routes.
|
|
15
15
|
- [Motion](motion/index.md) - Motion terminology, review workflow, and evidence-bounded practice reference.
|
|
16
16
|
- [Design Engineering](design-engineering/index.md) - Product-layer interface-craft decisions and verification questions.
|
|
17
|
-
- [Game UI](game-ui/index.md) - Game-interface classification, hierarchy, reference records, and named engine implementation guides.
|
|
18
17
|
- [Platform Guides](platform-guides/index.md) - Bounded comparative references for named platforms.
|
|
19
18
|
- [Design Terminology](design-terminology/index.md) - Source-kind and concept-family classification, typed term relations, and cross-system conflict cases for named vocabulary sources.
|
|
19
|
+
- [Expression](expression/index.md) - Art-direction briefs, named directions with starting values, visual technique recipes, and brand-study policy.
|
|
20
|
+
- [Showcase](showcase/README.md) - Free-form expressive works checked by outcome instead of Layout authoring rules.
|
|
20
21
|
- [Consumer reference](consumer-reference/index.md) - Shared non-domain receiver contract for declared repository-local JSON records or reasoned non-applicability.
|
|
21
22
|
- [Agent-Native StyleGallery](consumer-reference/agent-native/README.md) - Machine-facing identity, retrieval, operation, CLI, read-only MCP, task projection, and governed-learning contracts.
|
|
22
23
|
- [Consumer migration readiness](design-engineering/consumer-migration-readiness.md) - Experimental Design Engineering method for consumer-owned conformance, runtime proof, and source-bound page evidence.
|
|
@@ -40,6 +41,5 @@ Primary role: OKF bundle map.
|
|
|
40
41
|
|
|
41
42
|
- [Motion Decision Tree](motion/decision-tree.md) - Choose a behavior from the user task.
|
|
42
43
|
- [Design Engineering Decision Tree](design-engineering/decision-tree.md) - Route the uncertain product decision.
|
|
43
|
-
- [Game UI Decision Tree](game-ui/decision-tree.md) - Choose by player task and ownership.
|
|
44
44
|
- [Platform Adaptation Workflow](platform-guides/adaptation-workflow.md) - Record native facts, target decisions, and fallbacks.
|
|
45
45
|
- [Design Term Comparison Workflow](design-terminology/comparison-workflow.md) - Resolve a source-specific question and produce a scoped handoff.
|
package/log.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# StyleGallery Log
|
|
2
2
|
|
|
3
|
+
## 2026-09-28
|
|
4
|
+
|
|
5
|
+
Understood as: switch the repository package manager from npm to Bun and release `stylegallery@0.1.8`.
|
|
6
|
+
|
|
7
|
+
- Replaced `package-lock.json` with `bun.lock`, migrated from the npm lockfile so every one of the 184 resolved package versions and the `brace-expansion` override are unchanged, and declared `"packageManager": "bun@1.3.14"`. Scripts still run on Node.js 22; Bun installs dependencies and runs package scripts.
|
|
8
|
+
- CI workflows add `oven-sh/setup-bun` pinned by commit, install with `bun install --frozen-lockfile --ignore-scripts`, and run `bun run` and `bunx playwright`. Playwright container jobs install `unzip` first because the pinned image does not include it. The setup-bun pin joins the immutable action pins.
|
|
9
|
+
- New capture sessions and the conformance matrix source binding hash `bun.lock` in place of `package-lock.json`; the capture-session schema accepts `bun.lock` as a source path and still accepts `package-lock.json` for earlier sessions. Existing capture evidence remains bound to its recorded revision.
|
|
10
|
+
- With owner approval, the sentinel-calibration and page-evidence records and their validator constants were refreshed for the new workflow bytes, including the calibration and page-evidence job hashes and the protected hashes of `scripts/run-consumer-page-evidence-ci.mjs` and `quality/evidence/executable-evidence.md`, whose commands now name Bun. Owners, deadlines, and decisions are unchanged.
|
|
11
|
+
- Development commands in the documentation now use `bun run`. Consumer install commands such as `npx stylegallery` and `npm install --global stylegallery` are unchanged because the package is still published to the npm registry.
|
|
12
|
+
|
|
13
|
+
Consumer reference: not_applicable
|
|
14
|
+
Consumer reference reason: This change replaces the repository package manager and selects no consumer-reference profile or record.
|
|
15
|
+
|
|
16
|
+
Understood as: remove the Game UI domain from the repository together with the Expression change.
|
|
17
|
+
|
|
18
|
+
- Removed the Game UI domain: its thirteen governed files under `game-ui/`, the Unity organization-wiki and Unity source-contract validators with their fixture tests and CI steps, and every route, manifest row, governance row, ownership entry, quality scenario, validator requirement, example link, and packaged path that referred to it. Earlier log entries remain as history.
|
|
19
|
+
- The domain set is Layout, Motion, Design Engineering, Platform Guides, Design Terminology, and Expression. Domain-count sentences return to six governed domains, so `quality/evidence/executable-evidence.md` returns to its previously sealed bytes. Material v2 admits 180 documents.
|
|
20
|
+
- Removing the two Unity steps changed `.github/workflows/validate.yml`. With owner approval, only the whole-file active and derived retired workflow hashes were refreshed in the sentinel-calibration and page-evidence records and their validator constants; the calibration and page-evidence job bytes, owners, deadlines, and decisions are unchanged. The A2A and AG-UI extension source inventories were regenerated for the edited documents.
|
|
21
|
+
|
|
22
|
+
Consumer reference: not_applicable
|
|
23
|
+
Consumer reference reason: This change removes a documentation domain and its validators and selects no consumer-reference profile or record.
|
|
24
|
+
|
|
25
|
+
## 2026-09-27
|
|
26
|
+
|
|
27
|
+
Understood as: let StyleGallery produce finished, expressive pages without loosening the Layout contract, and keep only the parts that belong in the official repository.
|
|
28
|
+
|
|
29
|
+
- Added Expression as a governed domain: a direction brief, an unofficial brand-study policy, two named directions with concrete values (Nocturne Editorial, Warm Print), and three visual technique recipes (gradient atmosphere, grain and texture, WebGL hero field). Expression owns art direction; it owns no Layout mechanics, motion timing, or governed tokens.
|
|
30
|
+
- Added two executable Motion techniques: scroll choreography (GSAP ScrollTrigger with Lenis on one ticker, pinned horizontal travel, a CSS scroll-timeline alternative) and kinetic type (split-word rises, scroll-lit paragraphs, count-ups, marquees).
|
|
31
|
+
- Added the `showcase/` work area, which is not a domain: a work contract, a QA contract with fifteen ideal-state properties and twenty-one scenarios, the outcome checker `scripts/check-showcase.mjs`, its fixture self-test, and `scripts/serve-showcase.mjs`. Layout authoring rules do not apply to showcase CSS; outcome checks for overflow, focus, contrast, reduced motion, honest actions, hash navigation, short viewports, offscreen loops, and offline and no-script reading do. No works are committed.
|
|
32
|
+
- Added the Creative Build Route to AGENTS.md and registered the domain in the manifest, root routes, governance, ownership, IA, and domain validators and fixtures, and admitted the eleven new documents to Material v2.
|
|
33
|
+
- The A2A and AG-UI extension source inventories were regenerated for the edited caller documents, as in the 2026-09-21 research expansion.
|
|
34
|
+
|
|
35
|
+
Consumer reference: not_applicable
|
|
36
|
+
Consumer reference reason: This change adds domain guidance and showcase tooling and selects no consumer-reference profile or record.
|
|
37
|
+
|
|
38
|
+
## 2026-09-22
|
|
39
|
+
|
|
40
|
+
- Prepared `stylegallery@0.1.7` with direct website capture, transcription, and workflow commands in the SG CLI and MCP. The compiler remains a separately installed checkout; frozen v1 knowledge entrypoints remain available.
|
|
41
|
+
- Routed faithful reconstruction, adaptation, and sale-package work through the compiler's task-aware workflow. Reconstruction prioritizes usable original media, additional observation, explicit replacement decisions, and visual QA. The automatic sale-edition builder is labeled as a package preview.
|
|
42
|
+
- Added compiler transport, cancellation, packaged-install, and local real-capture checks. These verify the integration; they do not establish an improvement in clone quality.
|
|
43
|
+
|
|
44
|
+
Implementation handoff: `consumer_reference: consumer-reference/agent-native/registry.json`.
|
|
45
|
+
|
|
46
|
+
Consumer reference: declared
|
|
47
|
+
Consumer reference record: consumer-reference/agent-native/registry.json
|
|
48
|
+
|
|
49
|
+
## 2026-09-21
|
|
50
|
+
|
|
51
|
+
Understood as: substantially enrich Motion, Design Engineering, Platform Guides, and Design Terminology with primary-source research integrated into governed local documents. The user excluded Layout and Game UI from this work.
|
|
52
|
+
|
|
53
|
+
- Added twelve local research guides: motion accessibility/interruption/rendering; native interaction contracts, multilingual input, and asynchronous feedback; platform adaptation/preferences/input; and token, interaction, and typography semantics. Each separates source-backed findings, local proposals, failure cases, and unexecuted verification scenarios.
|
|
54
|
+
- Inspected 66 cited official source pages on 2026-09-21. Recorded source status and target-version limits; read Apple page bodies through official documentation JSON when the HTML reader exposed a JavaScript shell. Preserved prior source-review dates for unrelated term records.
|
|
55
|
+
- Added fourteen source-qualified terms and nine scoped relations, bringing the terminology tables to twenty-five terms and seventeen relations. These are author-reviewed experimental judgments, not independent semantic approval.
|
|
56
|
+
- Registered the twelve leaves in domain membership, local navigation, the closed Material v2 admission set, and npm packaging. The admitted corpus has 181 documents. New guidance remains experimental and does not add profile values, native implementations, or a domain.
|
|
57
|
+
- Verified Markdown structure, links, IA, governance, domain membership, terminology, consumer handoffs, and material admission in an isolated checkout of the research changes. Domain/terminology/governance, consumer/evidence, and frozen-v1 regression suites passed; package installation and CLI/MCP retrieval passed. Fixed the package inventory test's omission of the three existing license/notice files while preserving its exact allow-list assertion.
|
|
58
|
+
- Checked every cited URL and fragment. Applied two fresh-reader corrections to the term-comparison method and contributor verification route. Eight author-selected search probes retrieved the intended guide within the first two results; these are retrieval smoke checks, not an independent usability evaluation. No browser, native IME, assistive-technology, or product performance execution is claimed.
|
|
59
|
+
|
|
60
|
+
Implementation handoff: `consumer_reference: consumer-reference/agent-native/registry.json`.
|
|
61
|
+
|
|
62
|
+
Consumer reference: declared
|
|
63
|
+
Consumer reference record: consumer-reference/agent-native/registry.json
|
|
64
|
+
|
|
65
|
+
Terminology reliance: `dtcg.alias`, `fluent.alias-token`, `fluent.global-token`, `carbon.color-token`, `dtcg.resolver-modifier`, `html.popover`, `apple.popover`, `html.dialog`, `aria.dialog`, `apple.text-style`, `fluent.type-ramp`, `material3.typography`, `dtcg.typography`, `css.font`, `dtcg.token`, `dtcg.group`, and `css.custom-property`. Relation types used: `partial_overlap`, `implementation_representation`, and `not_comparable`. Named sources for these terms were rechecked on 2026-09-21; the older Figma, historical-format, component/pattern, and Layout relations retain their original review scope. Direct locators and boundaries are in [Term Cases](design-terminology/conflict-cases.md).
|
|
66
|
+
|
|
3
67
|
## 2026-09-09
|
|
4
68
|
|
|
5
69
|
- Added a full-page fixed-viewport scene-navigation example with chapter hashes/history, wheel-burst gating, keyboard and art-surface swipe navigation, native copy overflow, immediate reduced-motion transitions, and a complete reading escape.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Domain Guide
|
|
3
|
+
title: Accessible Motion And Equivalent Feedback
|
|
4
|
+
description: Separate motion preferences, automatic updates, flashing, and semantic feedback before designing reduced-motion behavior.
|
|
5
|
+
domain: motion
|
|
6
|
+
lifecycle: experimental
|
|
7
|
+
provenance_kind: local
|
|
8
|
+
reviewed_on: 2026-09-21
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Accessible Motion And Equivalent Feedback
|
|
12
|
+
|
|
13
|
+
Primary role: source-backed motion accessibility decision guide.
|
|
14
|
+
|
|
15
|
+
## Repository Boundary
|
|
16
|
+
|
|
17
|
+
This page owns product-motion decisions and their evidence requirements. Shared [accessibility evidence](../quality/evidence/accessibility.md) governs conformance claims. No motion values or decorative declarations become reusable Layout CSS.
|
|
18
|
+
|
|
19
|
+
## Reusable Method
|
|
20
|
+
|
|
21
|
+
Inventory each effect by trigger, duration, affected area, information conveyed, and available controls. Evaluate the separate source conditions below; one reduced-motion media query is not a complete accessibility review. Then specify an equivalent path that exposes the same information and actions with less movement.
|
|
22
|
+
|
|
23
|
+
### What The Sources Establish
|
|
24
|
+
|
|
25
|
+
| Source | Bounded finding | Decision it informs |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| [WCAG 2.2 SC 2.3.3 explanation](https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html) | The AAA criterion concerns disabling interaction-triggered motion animation unless essential. | Identify extra movement induced by scrolling, dragging, expanding, or changing routes. |
|
|
28
|
+
| [SC 2.2.2 explanation](https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html) | The A criterion has distinct conditions for automatically moving information and automatically updating information. The latter has no five-second exception. | Audit rotating content and live updates separately from a short transition. |
|
|
29
|
+
| [SC 2.3.1 explanation](https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html) | Flash evaluation includes frequency and defined area/luminance thresholds. | A pause button cannot substitute for evaluating flashing content. |
|
|
30
|
+
| [Media Queries Level 5](https://www.w3.org/TR/mediaqueries-5/#prefers-reduced-motion) | `prefers-reduced-motion` exposes a preference; it does not select an application-specific replacement. | Author the replacement and verify preference changes. |
|
|
31
|
+
| [SC 4.1.3 explanation](https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html) | Status information can require programmatic exposure without moving focus. | Preserve feedback when a spinner, movement, or success effect disappears. |
|
|
32
|
+
|
|
33
|
+
WCAG Understanding pages are informative explanations of the [normative WCAG 2.2 requirements](https://www.w3.org/TR/WCAG22/). Media Queries Level 5 is a Working Draft. These sources do not establish implementation support for a particular browser or certify a product.
|
|
34
|
+
|
|
35
|
+
### Classify Before Replacing
|
|
36
|
+
|
|
37
|
+
| Product behavior | Local replacement proposal | Failure to look for |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Scroll-linked zoom into a product detail | Keep the reading sequence; switch details at explicit boundaries or expose them together. | Essential copy is available only at an intermediate animation frame. |
|
|
40
|
+
| Reordering a list | Update the order and selection immediately; provide a concise completion message if needed. | Visual order changes while reading order or selected identity does not. |
|
|
41
|
+
| Loading shimmer | Use a stationary placeholder and textual waiting state. | The placeholder is mistaken for loaded content or the request appears to have stopped. |
|
|
42
|
+
| Modal entrance | Present the usable modal immediately, with the same focus and dismissal contract. | Focus is delayed until a completion event that never fires in reduced mode. |
|
|
43
|
+
| Automatically advancing announcement | Provide durable stop/control behavior appropriate to the applicable criterion. | Moving focus elsewhere restarts an update the user had paused. |
|
|
44
|
+
| Success celebration | Retain the durable success state and next action. | Removing confetti also removes the only completion signal. |
|
|
45
|
+
|
|
46
|
+
These are proposed product choices, not W3C-prescribed recipes. A fade is another effect to evaluate; reducing translation does not prove that every replacement is comfortable.
|
|
47
|
+
|
|
48
|
+
### Preference Changes During Work
|
|
49
|
+
|
|
50
|
+
Record whether an in-product setting inherits the system preference or further reduces motion. Define how an active effect settles when the effective preference changes. The settlement must preserve the current task, release transient visual resources, and make the destination usable. Avoid replaying an entrance merely because the preference changed back.
|
|
51
|
+
|
|
52
|
+
Separate pausing the presentation from pausing the underlying process. A dashboard may stop replacing visible figures while data collection continues. A resumed display must say whether it shows current information or replays buffered history. For transaction feedback, stopping an animation never means a server write was cancelled.
|
|
53
|
+
|
|
54
|
+
## Opinionated Guidance
|
|
55
|
+
|
|
56
|
+
Start with a complete stationary interaction, then add motion with a named explanatory purpose. This makes the no-motion path directly inspectable. Keep user-chosen pauses durable across focus changes and make preference controls reachable before the effect they govern.
|
|
57
|
+
|
|
58
|
+
Do not infer an accessibility need from a device class. The effective preference, explicit user action, and actual interaction matter more than a touch/desktop label.
|
|
59
|
+
|
|
60
|
+
## Platform-Specific Guidance
|
|
61
|
+
|
|
62
|
+
Web CSS and script-driven effects need a coordinated preference owner. Native Reduce Motion behavior belongs to its named OS/API; see [Preferences And Accessibility](../platform-guides/preferences-and-accessibility.md). Animated media, canvas, and embedded content require their own controls and evidence because disabling a CSS transition does not govern them.
|
|
63
|
+
|
|
64
|
+
## Unsupported Absolutes
|
|
65
|
+
|
|
66
|
+
“Under five seconds is accessible,” “a crossfade is always safe,” and “the media query makes the page WCAG AA compliant” are unsupported. A criterion's conformance level is not a reason to claim that another criterion covers its behavior.
|
|
67
|
+
|
|
68
|
+
## Verification Contract
|
|
69
|
+
|
|
70
|
+
The following cases are unexecuted test designs. Record actual outcomes in the consumer's evidence, including source revision, browser/OS, input, effective preference, and the asserted result.
|
|
71
|
+
|
|
72
|
+
| Case | Required observation |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| Reduced motion is active before load | Essential content and actions appear without waiting for motion. |
|
|
75
|
+
| Preference changes halfway through a transition | The active task settles once; no stranded overlay, stale focus, or rejected-promise error remains. |
|
|
76
|
+
| Keyboard activates the same action | The destination and feedback match the pointer path. |
|
|
77
|
+
| Animation support is removed | The state transition still completes. |
|
|
78
|
+
| User pauses automatic information, then tabs away | The pause persists; resumption follows the documented policy. |
|
|
79
|
+
| Visual completion feedback is removed | The result remains available visually and through relevant assistive technology. |
|
|
80
|
+
|
|
81
|
+
Source inspection verifies the criterion distinctions. DOM checks can verify state and focus; recordings can reveal movement. Neither alone establishes vestibular comfort or screen-reader announcement behavior. Re-review when source conditions, effect ownership, or the target runtime changes.
|
|
82
|
+
|
|
83
|
+
## Source, License, And Attribution
|
|
84
|
+
|
|
85
|
+
Locally authored synthesis. All linked external sources were inspected on 2026-09-21. No upstream prose, example code, or assets are reproduced. `consumer_reference: not_applicable` because this guide selects no consumer implementation record.
|
|
86
|
+
|
|
87
|
+
## IA Navigation
|
|
88
|
+
|
|
89
|
+
Parent: [Motion](index.md).
|
|
90
|
+
Next: [Interruption And Retargeting](interruption-and-retargeting.md).
|
package/motion/index.md
CHANGED
|
@@ -17,6 +17,8 @@ Out of scope: universal timing or easing rules, unmeasured performance claims, a
|
|
|
17
17
|
| Build a scroll-driven product story and inspect runnable examples. | [Scroll-driven Story](interaction-recipes.md#scroll-driven-story) and [Scroll Story Lab](../examples/scroll-story/README.md) |
|
|
18
18
|
| Keep the page fixed while navigating between full-screen chapters. | [Full-viewport Scene Navigation](interaction-recipes.md#full-viewport-scene-navigation) and [runnable example](../examples/scene-navigation/README.md) |
|
|
19
19
|
| Apply feedback, disclosure, modal, reorder, progress, and drag contracts. | [Motion Interaction Recipes](interaction-recipes.md) |
|
|
20
|
+
| Copy a working GSAP ScrollTrigger and Lenis setup, pinned horizontal travel, or a CSS scroll-timeline scrub. | [Scroll Choreography Technique](techniques/scroll-choreography.md) |
|
|
21
|
+
| Copy split-word headline rises, scroll-lit paragraphs, count-ups, or a marquee. | [Kinetic Type Technique](techniques/kinetic-type.md) |
|
|
20
22
|
|
|
21
23
|
These workflows and worked cases are usable experimental guidance. Expected-result tables are test designs; actual product, engine, and reader evidence must be recorded separately. Review on a failed task, a source change, or a changed ownership contract.
|
|
22
24
|
|
|
@@ -25,6 +27,13 @@ These workflows and worked cases are usable experimental guidance. Expected-resu
|
|
|
25
27
|
- [Motion Vocabulary](vocabulary.md) maps observed behavior to implementation-neutral terms while preserving ambiguity.
|
|
26
28
|
- [Motion Review Workflow](review-workflow.md) structures evidence-first review and remediation.
|
|
27
29
|
- [Motion Practice Reference](practice-reference.md) classifies mechanics, heuristics, platform notes, and unsupported claims.
|
|
30
|
+
- [Observed Choreography Transcription](observed-choreography.md) transcribes an observed scroll choreography into Scene Composition Contract vocabulary.
|
|
31
|
+
|
|
32
|
+
## Source-Backed Deep Dives
|
|
33
|
+
|
|
34
|
+
- [Accessible Motion And Equivalent Feedback](accessible-motion.md). Separate motion preferences, automatic updates, and equivalent feedback.
|
|
35
|
+
- [Interruption And Retargeting](interruption-and-retargeting.md). Resolve repeated input, cancellation, and stale completion callbacks.
|
|
36
|
+
- [Motion Rendering And Performance](rendering-and-performance.md). Choose native mechanisms and diagnose measured delivery failures.
|
|
28
37
|
|
|
29
38
|
## Domain Contract
|
|
30
39
|
|
|
@@ -60,7 +60,13 @@ Trace: pending → cancellation requested → confirmed cancelled or completed;
|
|
|
60
60
|
|
|
61
61
|
Use when direct manipulation previews a change before commitment. Separate the preview value from the committed value. Release on a valid target commits; cancellation restores or reconciles with the current model. A new gesture retargets from the presented position where continuity is intended. Provide a task-equivalent non-drag operation.
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
The non-drag operation has two separate audiences. [WCAG 2.2 Success Criterion 2.5.7 Dragging Movements](https://www.w3.org/TR/WCAG22/#dragging-movements) (Level AA) asks that functionality operated by dragging also be achievable with a single pointer without dragging: a click or tap, not a held path. Its [Understanding document](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html) states that keyboard equivalence does not meet this criterion by itself unless those controls can also be clicked or tapped, and that the keyboard and single-pointer requirements are evaluated independently. A sortable list with arrow-key reordering therefore still needs pointer-operable move controls, and move buttons that only respond to a pointer still need keyboard operation.
|
|
64
|
+
|
|
65
|
+
Two exceptions bound the criterion. Dragging may remain the only pointer method when it is essential to the task, and the criterion does not cover dragging that the user agent determines and the author has not modified, such as native scrolling. The alternative cannot itself be a path-based gesture such as a swipe or flick; the Understanding document's own examples are tapping a slider track, move controls beside a sortable item, and a text input for a precise value. It does cover content that suppresses native scrolling and interprets the drag itself, which includes a custom carousel, a canvas pan, or the art-surface swipe in [full-viewport scene navigation](#full-viewport-scene-navigation). Record an essential claim with its reason rather than assuming it.
|
|
66
|
+
|
|
67
|
+
Failure cases: the alternative exists only in a keyboard handler; the alternative appears only on hover, so touch cannot reach it; the alternative commits a different value or skips the validation that release performs; the alternative moves the item but leaves focus or the announced position on the old location.
|
|
68
|
+
|
|
69
|
+
Test release inside/outside, cancellation, pointer loss, a changing destination, and repeated reversal. Run the same task three ways (drag, single-pointer activation without movement, keyboard only) and compare the committed value and the final focus. Focus and the selected item must remain traceable while visual position changes. The engine or browser adapter owns gesture events; the product owns acceptance of the new value.
|
|
64
70
|
|
|
65
71
|
### Scroll-Driven Story
|
|
66
72
|
|
|
@@ -156,7 +162,7 @@ The [Interaction Lab](../examples/domain-interactions/README.md) provides a boun
|
|
|
156
162
|
|
|
157
163
|
## Source, License, And Attribution
|
|
158
164
|
|
|
159
|
-
Locally authored recipes and HTML. The linked W3C APG pages and Media Queries Level 5 were rechecked on 2026-09-08 for the specific semantics and preference signal above. No upstream examples or timing prescriptions are copied.
|
|
165
|
+
Locally authored recipes and HTML. The linked W3C APG pages and Media Queries Level 5 were rechecked on 2026-09-08 for the specific semantics and preference signal above. WCAG 2.2 (W3C Recommendation, 12 December 2024) and its Understanding page for Success Criterion 2.5.7 (updated 10 August 2026) were rechecked on 2026-09-19 for the criterion text, its two exceptions, and its relationship to keyboard operation; the Understanding page is informative, and the failure cases above are local and unexecuted. No upstream examples or timing prescriptions are copied.
|
|
160
166
|
|
|
161
167
|
## IA Navigation
|
|
162
168
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Domain Guide
|
|
3
|
+
title: Interruption And Retargeting
|
|
4
|
+
description: Keep semantic intent, presented motion, cancellation, and teardown consistent under repeated input.
|
|
5
|
+
domain: motion
|
|
6
|
+
lifecycle: experimental
|
|
7
|
+
provenance_kind: local
|
|
8
|
+
reviewed_on: 2026-09-21
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Interruption And Retargeting
|
|
12
|
+
|
|
13
|
+
Primary role: motion lifecycle and ownership guide.
|
|
14
|
+
|
|
15
|
+
## Repository Boundary
|
|
16
|
+
|
|
17
|
+
This page describes presentation behavior when an interaction is interrupted. Application state and request authority remain in [State Management](../design-engineering/state-management/index.md). A presentation controller cannot silently cancel a transaction or overwrite newer semantic intent.
|
|
18
|
+
|
|
19
|
+
## Reusable Method
|
|
20
|
+
|
|
21
|
+
For each transition, record four independent facts: the committed application state, the current user intent, the presented visual state, and the current transition identity. Choose which fact authorizes each callback. A visible intermediate frame is not necessarily a valid application state.
|
|
22
|
+
|
|
23
|
+
### Source Findings
|
|
24
|
+
|
|
25
|
+
| Source | Bounded finding | Consequence |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| [Web Animations, cancellation](https://www.w3.org/TR/web-animations-1/#canceling-an-animation-section) | Cancelling a non-idle animation rejects its current finished promise with `AbortError` and resets timing state. | Treat expected cancellation separately from an implementation failure. |
|
|
28
|
+
| [Web Animations, playback](https://www.w3.org/TR/web-animations-1/#the-animation-interface) | Play, pause, reverse, finish, and cancel are distinct operations. | Select an operation by desired lifecycle behavior, not its convenient name. |
|
|
29
|
+
| [CSS Transitions Level 2](https://www.w3.org/TR/css-transitions-2/) | Transition events include cancellation; entry styling can be supplied with `@starting-style` when prior rendered styling is absent. | A normal end event is not the only exit path. |
|
|
30
|
+
| [View Transitions Level 1](https://www.w3.org/TR/css-view-transitions-1/#viewtransition) | Skipping the visual transition does not prevent its DOM update callback. | Visual cancellation is not transaction rollback. |
|
|
31
|
+
| [Pointer Events Level 3](https://www.w3.org/TR/pointerevents3/#the-pointercancel-event) | A pointer stream can be cancelled by the user agent. | A drag needs an explicit cancellation path, not only pointer-up handling. |
|
|
32
|
+
|
|
33
|
+
These are specification contracts at the documents read on 2026-09-21. Draft maturity and API presence do not prove behavior on a target browser; name the tested implementation separately.
|
|
34
|
+
|
|
35
|
+
### Choose The Interruption Policy
|
|
36
|
+
|
|
37
|
+
| Policy | Suitable local scenario | Cost or boundary |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Retarget from current presentation | A panel is asked to close before it finishes opening. | Sample or preserve the current pose; do not restart from a stale endpoint. |
|
|
40
|
+
| Reverse the same effect | The underlying states and path are genuinely reversible. | Reversing visual time cannot undo committed external effects. |
|
|
41
|
+
| Settle immediately | Motion is disabled, the surface is disposed, or presentation continuity is unimportant. | Preserve semantic state and focus even when no animation runs. |
|
|
42
|
+
| Coalesce pending presentation | Several updates describe only the newest displayed reading. | Do not drop independent operation acknowledgements. |
|
|
43
|
+
| Queue meaningful steps | The user explicitly needs a sequential demonstration. | Provide interruption or escape; state which queued events can be discarded. |
|
|
44
|
+
|
|
45
|
+
The policy is a product proposal. Keep the queue bounded and its meaning explicit. A list of queued animations is not an audit log of business actions.
|
|
46
|
+
|
|
47
|
+
### Worked Race: Open, Close, Open
|
|
48
|
+
|
|
49
|
+
The user opens a details pane, closes it during entrance, and opens it again during exit. Give each new intent an identity. The oldest entrance completion may release its own animation handle, but it cannot mark the current pane closed, move focus, or remove the latest pane instance.
|
|
50
|
+
|
|
51
|
+
| Event | Owner action | Invariant |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| Open A | Commit open intent; establish an accessible pane and entrance effect. | Required semantics do not wait for an effect to finish. |
|
|
54
|
+
| Close B during A | Invalidate A's authority; choose the exit policy and focus destination. | A's completion cannot restore open intent. |
|
|
55
|
+
| Open C during B | Invalidate B; retarget or settle from the current presentation. | B cannot remove C's DOM instance. |
|
|
56
|
+
| B's delayed completion | Clean up only B's resources. | Current intent remains C. |
|
|
57
|
+
| Dispose surface | Invalidate all callbacks; release listeners and handles. | No later callback changes focus or another surface. |
|
|
58
|
+
|
|
59
|
+
Specify when leaving content stops accepting input. If an exiting visual remains on screen after the semantic close, it must not leave a second active focus surface. Conversely, a modal's focus containment must remain correct until the chosen modal-close operation occurs. Review that timing with the [native interaction contract](../design-engineering/native-interaction-contracts.md).
|
|
60
|
+
|
|
61
|
+
## Opinionated Guidance
|
|
62
|
+
|
|
63
|
+
Prefer one owner per animated property and one lifecycle owner per surface. When multiple effects compose, explicitly name the composite rule and cleanup ownership. Do not use a timer equal to a nominal duration as the authority for saving data, unlocking an action, or removing a currently reused element.
|
|
64
|
+
|
|
65
|
+
For direct manipulation, preserve the position reached by the user. Whether a release should preserve velocity, overshoot, or snap is a local perceptual decision; no spring parameter follows from this ownership model.
|
|
66
|
+
|
|
67
|
+
## Platform-Specific Guidance
|
|
68
|
+
|
|
69
|
+
CSS events, Web Animations promises, framework unmount hooks, and native gesture callbacks have different lifecycle semantics. Bind them through the same declared policy without claiming interchangeable APIs. Coordinate reduced-motion settlement through [Accessible Motion](accessible-motion.md).
|
|
70
|
+
|
|
71
|
+
## Unsupported Absolutes
|
|
72
|
+
|
|
73
|
+
`cancel()` does not mean “restore the original screen.” A resolved animation promise does not prove a server operation succeeded. A reverse animation does not guarantee that focus, history, or side effects were reversed.
|
|
74
|
+
|
|
75
|
+
## Verification Contract
|
|
76
|
+
|
|
77
|
+
Run repeated input at several points in the effect, including immediately before completion. The points are race probes, not statistically representative samples. Record request/intent identity, callback identity, final state, focused element, and remaining active effects.
|
|
78
|
+
|
|
79
|
+
Exercise normal completion, cancellation, reversal, removal, reduced-motion change, and pointer cancellation. Inject a late callback from the previous transition and verify it cannot remove or refocus the current instance. Compare the no-animation path against the same semantic outcomes.
|
|
80
|
+
|
|
81
|
+
These are unexecuted scenarios. A model test can prove callback acceptance rules in that model; actual event order and visual continuity require browser evidence. Re-review after a lifecycle adapter or animation API changes.
|
|
82
|
+
|
|
83
|
+
## Source, License, And Attribution
|
|
84
|
+
|
|
85
|
+
Locally authored synthesis of the linked specifications, inspected 2026-09-21. No upstream implementation is copied. `consumer_reference: not_applicable` because the example specifies a proposed interaction and selects no consumer record.
|
|
86
|
+
|
|
87
|
+
## IA Navigation
|
|
88
|
+
|
|
89
|
+
Parent: [Motion](index.md).
|
|
90
|
+
Next: [Rendering And Performance](rendering-and-performance.md).
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Domain Guide
|
|
3
|
+
title: Observed Choreography Transcription
|
|
4
|
+
description: Transcribe an observed scroll choreography into Scene Composition Contract vocabulary without copying assets or claiming implementation knowledge.
|
|
5
|
+
domain: motion
|
|
6
|
+
lifecycle: experimental
|
|
7
|
+
provenance_kind: local
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Observed Choreography Transcription
|
|
11
|
+
|
|
12
|
+
Primary role: observed scroll-choreography transcription workflow.
|
|
13
|
+
|
|
14
|
+
## Repository Boundary
|
|
15
|
+
|
|
16
|
+
This workflow turns an externally observed scroll-driven presentation into a transcription record written in the [Scroll-Driven Story](interaction-recipes.md#scroll-driven-story) vocabulary: `start`, `distance`, `scene_ranges`, progress-derived state, and static path. It exists so that a reimplementation study, a review, or an automated capture pipeline can hand a builder one document instead of raw pixels.
|
|
17
|
+
|
|
18
|
+
It does not authorize copying an observed site's assets, copy, code, or brand into this repository or into a study; it does not add motion or decorative properties to reusable Layout pattern CSS; and a transcription record is an observation of an unaffiliated external artifact, not evidence about this repository's own examples. The consuming study owns its own imagery, copy, and visual values.
|
|
19
|
+
|
|
20
|
+
## Reusable Method
|
|
21
|
+
|
|
22
|
+
### Capture Protocol
|
|
23
|
+
|
|
24
|
+
Record the capture identity before transcribing: URL, capture date, viewport, tool, wait strategy, and total scroll height. Capture in two passes:
|
|
25
|
+
|
|
26
|
+
1. A coarse scene pass segments the page into scene y-ranges using layout landmarks (full-width blocks) and per-scene representative frames.
|
|
27
|
+
2. A dense timeline pass scrubs at a fixed step (small enough that at least three frames land inside the shortest choreography of interest) and records a frame-difference score between consecutive frames.
|
|
28
|
+
|
|
29
|
+
Difference-score plateaus near zero indicate static regions; sustained non-zero runs indicate scrubbed choreography; isolated spikes indicate discrete swaps. Keep every frame file; the transcription must cite frames by file name.
|
|
30
|
+
|
|
31
|
+
### Transcription Record
|
|
32
|
+
|
|
33
|
+
For each observed scene, write:
|
|
34
|
+
|
|
35
|
+
- **Scene identity**: name, document y-range, one-sentence job.
|
|
36
|
+
- **Pin observation**: whether a stage visually holds position while the document advances (`start` and `distance` in document pixels), or the scene scrolls through normally (`distance` not applicable).
|
|
37
|
+
- **Scene ranges**: sub-segments as fractions of scene progress, each with the observed state it presents.
|
|
38
|
+
- **Keyframe observations**: for each boundary between sub-segments, the property-level change observed across adjacent frames — content swap, translation, scale, opacity, counter/number roll, media frame advance — stated as direction and rough magnitude, not invented exact values.
|
|
39
|
+
- **Transition profile**: for each sub-segment boundary, how the states mix — `cut` (adjacent frames show only completed states), `blend` (a mid-transition frame shows both states partially visible; record the observed blend width in scroll pixels, bounded below by the capture step), or `slide` (a mid-transition frame shows a state displaced along an axis; record the direction). A consumer without a profile defaults to whatever its own contract prefers, so an omitted profile is a gap worth naming.
|
|
40
|
+
- **Static path**: what a non-animated reading order of the same content would present, so the consumer can build the reduced-motion and no-script alternative required by the [Scroll-Driven Story](interaction-recipes.md#scroll-driven-story) contract.
|
|
41
|
+
- **Asset inventory**: the kind of media carrying the effect (photograph, video, rendered UI, image sequence) and its role. Kinds only; the record never embeds or links a copy of the asset for reuse.
|
|
42
|
+
- **Frame evidence**: the frame files supporting each claim.
|
|
43
|
+
|
|
44
|
+
Mark anything the captured frames cannot establish as `not observable in captured frames` instead of interpolating a guess. A claim without a citable frame is a gap, not a fact.
|
|
45
|
+
|
|
46
|
+
### Handoff
|
|
47
|
+
|
|
48
|
+
A transcription record travels with the capture manifest and difference curve. A consumer maps scene ranges onto the [Scene Composition Contract](interaction-recipes.md#scene-composition-contract): document scroll and sticky geometry stay with Layout responsibilities, progress mapping and teardown with Motion, and all visual values with the consuming product.
|
|
49
|
+
|
|
50
|
+
## Opinionated Guidance
|
|
51
|
+
|
|
52
|
+
Transcribe jobs and relationships, not pixel values; a reimplementation that inherits observed exact timings inherits unverified choices. Derive every described state from scene progress so reversal and mid-entry stay well defined in the eventual build. Sampling density bounds what a record may claim: a 500px step cannot support statements about effects shorter than 500px of scroll.
|
|
53
|
+
|
|
54
|
+
## Platform-Specific Guidance
|
|
55
|
+
|
|
56
|
+
Record the capture browser, OS, headless mode, and device scale separately from the observed site's behavior; headless rendering, missing fonts, and disabled video autoplay can all change what frames show. For client-rendered pages, note that DOM text accumulates as sections mount, so per-scene text dumps overstate what is visible; treat frames as the primary evidence for visibility.
|
|
57
|
+
|
|
58
|
+
## Unsupported Absolutes
|
|
59
|
+
|
|
60
|
+
A transcription proves what frames show at sampled positions, never how the original is implemented — no easing curve, frame rate, library, or performance claim survives from frame differences alone. There is no universal scrub step, difference threshold, or scene count; each capture declares its own. Frame similarity in one direction does not prove reversibility. A transition profile is bounded by sampling: a capture step wider than a transition can prove `blend` only when a mid-transition frame happens to land inside it, and can never prove `cut`.
|
|
61
|
+
|
|
62
|
+
## Verification Contract
|
|
63
|
+
|
|
64
|
+
A transcription record is usable when every scene declares a y-range and pin observation, every motion claim cites frame files, every scene has a static path, and every unknown is marked `not observable in captured frames`. Reversibility claims require frames captured in both scroll directions; otherwise mark reversal untested. The record is stale when the source site changes; re-verification means a fresh capture compared against the recorded capture date, never editing old observations in place.
|
|
65
|
+
|
|
66
|
+
## Source, License, And Attribution
|
|
67
|
+
|
|
68
|
+
Locally authored workflow, generalized from an internal capture-and-reimplementation study of an external homepage on 2026-09-10. Transcription records describe unaffiliated external sites; they carry the capture identity for provenance and reproduce no external assets, copy, or code.
|
|
69
|
+
|
|
70
|
+
## IA Navigation
|
|
71
|
+
|
|
72
|
+
Parent: [Motion](index.md).
|
|
73
|
+
Next: [Scroll-Driven Story](interaction-recipes.md#scroll-driven-story).
|