stylegallery 0.1.7 → 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.
Files changed (60) hide show
  1. package/AGENTS.md +13 -1
  2. package/DOMAINS.md +7 -3
  3. package/GOVERNANCE.md +13 -11
  4. package/LICENSE-DOCS +2 -2
  5. package/README.md +23 -10
  6. package/consumer-reference/agent-native/v2/admission-policy.json +32 -37
  7. package/consumer-reference/agent-native/v2/material-registry.json +1 -1
  8. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +3 -3
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +1 -1
  10. package/design-engineering/state-management/index.md +1 -1
  11. package/design-engineering/state-management/patterns/derived-state.md +1 -1
  12. package/design-engineering/state-management/patterns/draft-and-baseline.md +1 -1
  13. package/design-engineering/state-management/patterns/id-selection.md +1 -1
  14. package/design-engineering/state-management/patterns/identity-reset.md +1 -1
  15. package/design-engineering/state-management/patterns/latest-request-wins.md +1 -1
  16. package/design-engineering/state-management/patterns/optimistic-overlay.md +1 -1
  17. package/design-engineering/state-management/patterns/single-flight.md +1 -1
  18. package/design-engineering/state-management/patterns/single-owner.md +1 -1
  19. package/design-engineering/state-management/patterns/submitted-snapshot.md +1 -1
  20. package/design-engineering/state-management/patterns/unsaved-navigation.md +1 -1
  21. package/design-engineering/state-management/patterns/url-state.md +1 -1
  22. package/design-engineering/state-management/patterns/versioned-restore.md +1 -1
  23. package/design-engineering/state-management/verification.md +1 -1
  24. package/design-terminology/conflict-cases.md +1 -1
  25. package/design-terminology/source-kinds.md +1 -1
  26. package/expression/brand-studies.md +50 -0
  27. package/expression/direction-brief.md +71 -0
  28. package/expression/directions/nocturne-editorial.md +80 -0
  29. package/expression/directions/warm-print.md +73 -0
  30. package/expression/index.md +40 -0
  31. package/expression/techniques/gradient-atmosphere.md +107 -0
  32. package/expression/techniques/grain-and-texture.md +83 -0
  33. package/expression/techniques/webgl-hero.md +123 -0
  34. package/guides/vocabulary.md +1 -1
  35. package/index.md +3 -3
  36. package/log.md +35 -0
  37. package/motion/index.md +2 -0
  38. package/motion/techniques/kinetic-type.md +145 -0
  39. package/motion/techniques/scroll-choreography.md +154 -0
  40. package/package.json +17 -14
  41. package/platform-guides/compatibility-matrix.md +1 -1
  42. package/quality/claim-records/stylegallery-multidomain-scope.md +2 -2
  43. package/quality/evidence/executable-evidence.md +1 -1
  44. package/quality/index.md +1 -2
  45. package/scripts/agent-native/v2/material-admission.mjs +1 -1
  46. package/scripts/agent-native/v2/material-identity.mjs +2 -2
  47. package/scripts/compiler/README.md +5 -5
  48. package/showcase/README.md +113 -0
  49. package/game-ui/classification.md +0 -82
  50. package/game-ui/decision-tree.md +0 -81
  51. package/game-ui/index.md +0 -45
  52. package/game-ui/reference-record.md +0 -62
  53. package/game-ui/screen-hierarchy.md +0 -107
  54. package/game-ui/screen-recipes.md +0 -101
  55. package/game-ui/unity/architecture.md +0 -166
  56. package/game-ui/unity/cli-loop.md +0 -84
  57. package/game-ui/unity/org-wiki.md +0 -146
  58. package/game-ui/unity/repository-map.md +0 -102
  59. package/game-ui/unity/ui-systems.md +0 -85
  60. package/game-ui/verification-workflow.md +0 -100
@@ -13,15 +13,15 @@
13
13
  "media_type": { "const": "text/markdown" },
14
14
  "allowed_materials": {
15
15
  "type": "array",
16
- "minItems": 181,
17
- "maxItems": 181,
16
+ "minItems": 180,
17
+ "maxItems": 180,
18
18
  "items": {
19
19
  "type": "object",
20
20
  "additionalProperties": false,
21
21
  "required": ["repository_path", "domain", "lifecycle"],
22
22
  "properties": {
23
23
  "repository_path": { "type": "string", "pattern": "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._ -]+(?:/[A-Za-z0-9._ -]+)*\\.md$" },
24
- "domain": { "enum": ["layout", "motion", "design-engineering", "game-ui", "platform-guides", "design-terminology", "shared"] },
24
+ "domain": { "enum": ["layout", "motion", "design-engineering", "platform-guides", "design-terminology", "expression", "shared"] },
25
25
  "lifecycle": { "enum": ["draft", "stable", "deprecated", "experimental", "generated"] }
26
26
  }
27
27
  }
@@ -15,6 +15,6 @@
15
15
  "source_sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
16
16
  "byte_length": { "type": "integer", "minimum": 0 },
17
17
  "lifecycle": { "enum": ["draft", "stable", "deprecated", "experimental", "generated"] },
18
- "domain": { "enum": ["layout", "motion", "design-engineering", "game-ui", "platform-guides", "design-terminology", "shared"] }
18
+ "domain": { "enum": ["layout", "motion", "design-engineering", "platform-guides", "design-terminology", "expression", "shared"] }
19
19
  }
20
20
  }
@@ -49,7 +49,7 @@ Neither a reducer nor a state machine guarantees race freedom. No library is the
49
49
 
50
50
  ## Verification Contract
51
51
 
52
- A reader should find a pattern from a failure symptom, identify its owner and minimal implementation, compose it into a screen, and locate a repeatable acceptance sequence. Run `npm run test:state-management` for the 12 local examples; record browser and backend checks separately.
52
+ A reader should find a pattern from a failure symptom, identify its owner and minimal implementation, compose it into a screen, and locate a repeatable acceptance sequence. Run `bun run test:state-management` for the 12 local examples; record browser and backend checks separately.
53
53
 
54
54
  ## Source, License, And Attribution
55
55
 
@@ -31,7 +31,7 @@ Only source items and filter are writable. Visible items and total are computed.
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The form owns a draft, persistence supplies the baseline, and dirty is derived u
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The screen owns `selectedId`; the data owner supplies current entities. Detail i
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The screen owner stores identity and generation. Entering a new identity clears
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -33,7 +33,7 @@ The read owner stores a monotonically increasing identity, status, and last acce
33
33
 
34
34
  ### Minimal Executable Example
35
35
 
36
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
36
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
37
37
 
38
38
  ```js
39
39
  import assert from "node:assert/strict";
@@ -32,7 +32,7 @@ The cache owns base; the operation owns an overlay and ID. The displayed value i
32
32
 
33
33
  ### Minimal Executable Example
34
34
 
35
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
36
36
 
37
37
  ```js
38
38
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The operation owner holds one pending promise per declared scope. This example s
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The owner stores `value`; controls receive it and emit an intent. Temporary text
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -33,7 +33,7 @@ The form owns draft and baseline; an active operation owns a copied snapshot and
33
33
 
34
34
  ### Minimal Executable Example
35
35
 
36
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
36
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
37
37
 
38
38
  ```js
39
39
  import assert from "node:assert/strict";
@@ -33,7 +33,7 @@ The form owns dirty; the router integration owns a pending destination and guard
33
33
 
34
34
  ### Minimal Executable Example
35
35
 
36
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
36
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
37
37
 
38
38
  ```js
39
39
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ The route owns committed query state; a text field may own an uncommitted buffer
31
31
 
32
32
  ### Minimal Executable Example
33
33
 
34
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
34
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
35
 
36
36
  ```js
37
37
  import assert from "node:assert/strict";
@@ -32,7 +32,7 @@ The persistence adapter owns a versioned envelope and scope key. Decoding valida
32
32
 
33
33
  ### Minimal Executable Example
34
34
 
35
- Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `npm run test:state-management`. The assertions exercise the local model, not a browser or backend.
35
+ Run this standalone JavaScript block with Node.js 22 or newer, or run all pattern examples from a repository checkout with `bun run test:state-management`. The assertions exercise the local model, not a browser or backend.
36
36
 
37
37
  ```js
38
38
  import assert from "node:assert/strict";
@@ -31,7 +31,7 @@ Start with the selected pattern's invariant. Use controlled promises or an injec
31
31
 
32
32
  ### Executable Local Coverage
33
33
 
34
- From a repository checkout, `npm run test:state-management` extracts and executes the standalone `js` block from each of the 12 pattern pages in an isolated Node process. The examples assert model outcomes for ownership, projections, selection, drafts, save snapshots, navigation decisions, stale completions, duplicate effects, optimistic recovery, URL parsing, identity generations, and restore validation.
34
+ From a repository checkout, `bun run test:state-management` extracts and executes the standalone `js` block from each of the 12 pattern pages in an isolated Node process. The examples assert model outcomes for ownership, projections, selection, drafts, save snapshots, navigation decisions, stale completions, duplicate effects, optimistic recovery, URL parsing, identity generations, and restore validation.
35
35
 
36
36
  The four recipes declare integration acceptance sequences; they are not runnable browser fixtures. Existing [Interaction Lab](../../examples/domain-interactions/README.md) is a separate prototype with its own evidence scope. New recipe acceptance remains unexecuted until adapted to a consumer.
37
37
 
@@ -127,7 +127,7 @@ Query phrasing: `Dynamic Type typography token`, `Material Typography Fluent typ
127
127
 
128
128
  ## Platform-Specific Guidance
129
129
 
130
- When a case involves a platform guideline source, cite that platform's surface and route deeper convention comparison to [Platform Guides](../platform-guides/index.md); engine terms route to Game UI; motion terms to Motion.
130
+ When a case involves a platform guideline source, cite that platform's surface and route deeper convention comparison to [Platform Guides](../platform-guides/index.md); motion terms route to Motion.
131
131
 
132
132
  ## Unsupported Absolutes
133
133
 
@@ -54,7 +54,7 @@ This guide classifies what kind of thing a vocabulary source is before any of it
54
54
 
55
55
  ## Platform-Specific Guidance
56
56
 
57
- Platform guideline sources are recorded here only for terminology. Bounded comparison of their interaction conventions belongs to [Platform Guides](../platform-guides/index.md); engine vocabulary belongs to Game UI.
57
+ Platform guideline sources are recorded here only for terminology. Bounded comparison of their interaction conventions belongs to [Platform Guides](../platform-guides/index.md).
58
58
 
59
59
  ## Unsupported Absolutes
60
60
 
@@ -0,0 +1,50 @@
1
+ ---
2
+ type: Domain Policy
3
+ title: Brand Studies
4
+ description: Rules for unofficial reinterpretations of real brands in showcase works.
5
+ domain: expression
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Brand Studies
11
+
12
+ Primary role: brand-study policy.
13
+
14
+ ## Repository Boundary
15
+
16
+ A brand study reinterprets a real, named brand as an unofficial design exercise. It is allowed only in `showcase/`. It is not allowed in any governed domain page, Layout pattern, or reference profile. Platform Guides' prohibition on brand imitation still applies to Platform Guides.
17
+
18
+ ## Reusable Method
19
+
20
+ 1. Set `brand_study: true` and `subject: <brand name>` in the work's `brief.md`.
21
+ 2. Add `<meta name="robots" content="noindex, nofollow">` to `index.html`.
22
+ 3. Show the word "Unofficial" in visible page text, typically in the title and footer, e.g. "Unofficial brand study".
23
+ 4. Study the brand's register, then write original copy in that register. Do not paste taglines, product copy, or press text.
24
+ 5. Do not use the brand's logo files, icon sets, trademarked artwork, or product photography. Draw an original wordmark in a web font, or use the plain brand name as text.
25
+ 6. Run `node scripts/check-showcase.mjs --work <slug>`. The brief and page checks fail if steps 1-3 are missing.
26
+
27
+ ## Opinionated Guidance
28
+
29
+ A good study answers "what if this brand leaned harder into X?" rather than cloning the current site. Pick the X, write it in the brief's `signature` field, and let the page argue for it.
30
+
31
+ ## Platform-Specific Guidance
32
+
33
+ `noindex` keeps search engines from ranking the study for the brand's name. It does not stop people from sharing a public URL, so deploy studies to preview hosts, not to a domain that could be mistaken for the brand's.
34
+
35
+ ## Unsupported Absolutes
36
+
37
+ Following these steps reduces confusion and copying risk. It is not legal advice and does not create a license to any trademark.
38
+
39
+ ## Verification Contract
40
+
41
+ The showcase checker enforces the machine-checkable steps (subject, `noindex`, visible Unofficial text). A reviewer checks the rest from the source and screenshots: no copied logos, artwork, or verbatim copy.
42
+
43
+ ## Source, License, And Attribution
44
+
45
+ Locally authored policy. No upstream source.
46
+
47
+ ## IA Navigation
48
+
49
+ Parent: [Expression](index.md).
50
+ Next: [Showcase](../showcase/README.md).
@@ -0,0 +1,71 @@
1
+ ---
2
+ type: Domain Guide
3
+ title: Expression Direction Brief
4
+ description: Decide what a finished page should feel like, with concrete values, before building it.
5
+ domain: expression
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Expression Direction Brief
11
+
12
+ Primary role: art-direction handoff template.
13
+
14
+ ## Repository Boundary
15
+
16
+ This brief records one product page's direction. Its values belong to that page or to a named direction. They never become reusable Layout values, and they are not consumer-reference tokens.
17
+
18
+ ## Reusable Method
19
+
20
+ A strong one-shot page comes from committing to a few specific choices. Fill every field with an actual value; "modern" or "clean" is not a value.
21
+
22
+ ```yaml
23
+ subject: # what the page is for, in one sentence
24
+ memory: # the one image or moment a visitor should remember
25
+ reference: # a real site, film, print piece, or place, plus what to take from it
26
+ register: # the voice of the copy, e.g. "late-night radio host, warm and dry"
27
+ type:
28
+ display: # family, weight, tracking, line height, largest size
29
+ body: # family, weight, size, line height
30
+ label: # family, case, tracking
31
+ palette: # 3-6 hex values with roles: ground, text, accent, secondary accent
32
+ texture: # grain, noise, paper, halftone, or none, with strength
33
+ atmosphere: # gradient field, WebGL, photography, illustration, or none
34
+ motion_density: # entrance sequence count, scroll scenes, ambient loops
35
+ signature: # the one unusual move this page makes that a template would not
36
+ constraints: # performance budget, accessibility floor, brand rules
37
+ consumer_reference: not_applicable
38
+ consumer_reference_reason: A direction brief selects no consumer reference record.
39
+ ```
40
+
41
+ ### Choosing Values Fast
42
+
43
+ - Pair one expressive display face with one quiet body face and one mono or small-caps label face. Three families is the ceiling.
44
+ - Set display type larger and tighter than feels safe: `clamp()` from about 3rem at 320px up to 9-13rem at 1440px, tracking around -0.03em, line height 0.85-0.95.
45
+ - Pick a ground that is not pure black or pure white (`#07070a`, `#f4efe6`). Use one hot accent and at most one cool counter-accent.
46
+ - Spend expression in a few places: one hero moment, one signature scroll scene, one closing moment. Leave the rest quiet so those land.
47
+
48
+ ## Opinionated Guidance
49
+
50
+ Write the `signature` field first. If you cannot name one move a template would not make, the page will read as a template no matter how polished it is.
51
+
52
+ ## Platform-Specific Guidance
53
+
54
+ Variable and web fonts may fail to load. Name a system fallback with similar width so layout does not jump, and check the page with fonts blocked.
55
+
56
+ ## Unsupported Absolutes
57
+
58
+ No palette, type pairing, or density is correct for every subject. A filled brief is a plan, not evidence that the page works.
59
+
60
+ ## Verification Contract
61
+
62
+ The brief is ready when every field has a concrete value and `signature` names a specific move. The built page is verified by `node scripts/check-showcase.mjs --work <slug>` and by reviewing its screenshots against `memory` and `signature`.
63
+
64
+ ## Source, License, And Attribution
65
+
66
+ Locally authored template. No upstream source.
67
+
68
+ ## IA Navigation
69
+
70
+ Parent: [Expression](index.md).
71
+ Next: [Nocturne Editorial Direction](directions/nocturne-editorial.md).
@@ -0,0 +1,80 @@
1
+ ---
2
+ type: Domain Guide
3
+ title: Nocturne Editorial Direction
4
+ description: A dark, glowing, editorial direction with concrete type, color, texture, and motion-density values.
5
+ domain: expression
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Nocturne Editorial Direction
11
+
12
+ Primary role: named art direction with starting values.
13
+
14
+ ## Repository Boundary
15
+
16
+ These values are a starting point for product pages in `showcase/` or a consumer's own CSS. They are not tokens, defaults, or Layout inputs.
17
+
18
+ ## Reusable Method
19
+
20
+ Mood: a city at 3am seen through glass. Dark ground, warm glowing accents, oversized serif display, and quiet mono labels.
21
+
22
+ ```css
23
+ :root {
24
+ /* Ground and text */
25
+ --ink: #07070a;
26
+ --ink-2: #111118; /* raised surfaces */
27
+ --paper: #efe9df; /* primary text: warm, never pure white */
28
+ --paper-dim: rgb(239 233 223 / 0.62);
29
+ --line: rgb(239 233 223 / 0.14);
30
+ /* Accents: one hot, one cool, one highlight */
31
+ --ember: #ff5a36;
32
+ --violet: #7b5cff;
33
+ --haze: #9bd1ff;
34
+ /* Type */
35
+ --serif: "Instrument Serif", "Iowan Old Style", Georgia, serif;
36
+ --sans: "Inter Tight", "Helvetica Neue", Arial, sans-serif;
37
+ --mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
38
+ /* Rhythm */
39
+ --gutter: clamp(1.25rem, 4vw, 3.5rem);
40
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
41
+ }
42
+ ```
43
+
44
+ | Role | Value |
45
+ | --- | --- |
46
+ | Hero display | `--serif` 400, `clamp(3.1rem, 11.5vw, 11rem)`, tracking -0.035em, line height 0.9, `text-wrap: balance` |
47
+ | Section display | `--serif` 400, `clamp(2.6rem, 7vw, 7rem)`, tracking -0.03em, line height 0.95 |
48
+ | Body | `--sans` 350, `clamp(1rem, 0.95rem + 0.25vw, 1.125rem)`, line height 1.55, dimmed to `--paper-dim` for secondary copy |
49
+ | Labels | `--mono` 0.75rem, uppercase, tracking 0.14em |
50
+ | Accent word | Italic serif with `linear-gradient(100deg, var(--ember), #ffb454 40%, var(--violet))` clipped to text, one word per headline |
51
+ | Surfaces | `--ink-2` with 1px `--line` border, radius 1.5rem, two corner radial gradients from the card's own accent pair |
52
+ | Buttons | Pill radius, primary is `--paper` on `--ink`, ghost is a `--line` border only |
53
+ | Texture | [Grain](../techniques/grain-and-texture.md) at 0.22 opacity, `mix-blend-mode: overlay` |
54
+ | Atmosphere | [Gradient aurora](../techniques/gradient-atmosphere.md) behind the hero, optional [WebGL field](../techniques/webgl-hero.md) |
55
+ | Motion density | One entrance sequence, three to four scroll scenes, one ambient loop. Easing `expo.out`, entrances 1.1-1.3s, 0.06s word stagger |
56
+
57
+ ## Opinionated Guidance
58
+
59
+ Use the gradient only on one italic word per headline; used on whole sentences it turns into a gaming UI. Keep body copy dim and let display type carry the contrast.
60
+
61
+ ## Platform-Specific Guidance
62
+
63
+ `background-clip: text` still needs the `-webkit-` prefix in some engines; declare both. Large blurred gradients are expensive on low-end GPUs; keep them to three blobs and stop their animation under reduced motion.
64
+
65
+ ## Unsupported Absolutes
66
+
67
+ These values produced one legible reference page. They are not proven for long-form reading, data-dense UI, or light-mode contexts.
68
+
69
+ ## Verification Contract
70
+
71
+ A page using this direction passes `node scripts/check-showcase.mjs`. Check `--paper-dim` body text against the actual ground in its screenshots; over bright aurora areas it may need a darkening gradient layer, as the reference hero uses.
72
+
73
+ ## Source, License, And Attribution
74
+
75
+ Locally authored direction. Font families are Google Fonts under the SIL Open Font License; no upstream prose or code is reproduced.
76
+
77
+ ## IA Navigation
78
+
79
+ Parent: [Expression](../index.md).
80
+ Next: [Warm Print Direction](warm-print.md).
@@ -0,0 +1,73 @@
1
+ ---
2
+ type: Domain Guide
3
+ title: Warm Print Direction
4
+ description: A light, warm, print-inspired direction with concrete type, color, texture, and motion-density values.
5
+ domain: expression
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Warm Print Direction
11
+
12
+ Primary role: named art direction with starting values.
13
+
14
+ ## Repository Boundary
15
+
16
+ These values are a starting point for product pages in `showcase/` or a consumer's own CSS. They are not tokens, defaults, or Layout inputs.
17
+
18
+ ## Reusable Method
19
+
20
+ Mood: a well-made independent magazine. Off-white paper, heavy grotesk display, ink-black text, one saturated spot color, visible grid lines, halftone texture.
21
+
22
+ ```css
23
+ :root {
24
+ --paper: #f4efe6;
25
+ --paper-2: #ebe4d6; /* inset panels */
26
+ --ink: #141210;
27
+ --ink-dim: rgb(20 18 16 / 0.64);
28
+ --rule: rgb(20 18 16 / 0.18);
29
+ --spot: #1f4bff; /* one spot color, used sparingly */
30
+ --spot-2: #ff4a1c; /* optional second spot, never beside the first */
31
+ --grotesk: "Bricolage Grotesque", "Arial Narrow", Arial, sans-serif;
32
+ --text: "Newsreader", Georgia, serif;
33
+ --mono: "IBM Plex Mono", ui-monospace, monospace;
34
+ --gutter: clamp(1rem, 3vw, 2.5rem);
35
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
36
+ }
37
+ ```
38
+
39
+ | Role | Value |
40
+ | --- | --- |
41
+ | Hero display | `--grotesk` 800, `clamp(3rem, 12vw, 12.5rem)`, tracking -0.05em, line height 0.85, uppercase optional |
42
+ | Section display | `--grotesk` 700, `clamp(2.2rem, 6vw, 6rem)`, tracking -0.04em |
43
+ | Body | `--text` 400, 1.125rem, line height 1.6, max 34rem measure |
44
+ | Labels | `--mono` 0.72rem, uppercase, tracking 0.1em, preceded by a `--rule` hairline |
45
+ | Grid | Visible 1px `--rule` column lines on a 12-column grid at 64rem and wider |
46
+ | Surfaces | Flat `--paper-2`, no shadows, no radius or at most 0.25rem |
47
+ | Images | Duotone via `mix-blend-mode: multiply` over `--spot`, or grayscale plus [halftone](../techniques/grain-and-texture.md#halftone) |
48
+ | Motion density | Few entrances, crisp: 0.6-0.8s, `--ease-out`, line-by-line reveals, one horizontal marquee of headlines |
49
+
50
+ ## Opinionated Guidance
51
+
52
+ Light editorial pages die from timidity. Make the display type uncomfortably big, let one headline break the grid, and keep everything else strictly on it.
53
+
54
+ ## Platform-Specific Guidance
55
+
56
+ Multiply blending needs an opaque ancestor background to blend against; set `--paper` on the section, not only on `body`, or the effect disappears inside isolated stacking contexts.
57
+
58
+ ## Unsupported Absolutes
59
+
60
+ No reference build exists yet for this direction; its values are proposals until a showcase work uses them and passes review.
61
+
62
+ ## Verification Contract
63
+
64
+ A page using this direction passes `node scripts/check-showcase.mjs`. Check `--ink-dim` text contrast on `--paper-2` panels and confirm the grid lines disappear below 64rem.
65
+
66
+ ## Source, License, And Attribution
67
+
68
+ Locally authored direction. Font families are Google Fonts under the SIL Open Font License; no upstream prose or code is reproduced.
69
+
70
+ ## IA Navigation
71
+
72
+ Parent: [Expression](../index.md).
73
+ Next: [Gradient Atmosphere](../techniques/gradient-atmosphere.md).
@@ -0,0 +1,40 @@
1
+ # Expression
2
+
3
+ The Expression domain owns art direction for finished product pages: type pairing, palette, gradient and texture, WebGL atmosphere, copy register, and the density of expressive moments.
4
+
5
+ ## Scope Boundary
6
+
7
+ In scope: art-direction briefs, named directions with concrete starting values, visual technique recipes with copy-ready code, and the policy for unofficial brand studies.
8
+
9
+ Out of scope: layout mechanics and scroll ownership (Layout), timing, interruption, and motion review (Motion), component state contracts (Design Engineering), shared token schemas (consumer reference), and any decorative value inside reusable Layout pattern CSS.
10
+
11
+ ## Start Here
12
+
13
+ | Task | Route |
14
+ | --- | --- |
15
+ | Decide what a page should feel like before building it. | [Expression Direction Brief](direction-brief.md) |
16
+ | Start from a complete dark editorial system. | [Nocturne Editorial Direction](directions/nocturne-editorial.md) |
17
+ | Start from a complete light, warm, print-like system. | [Warm Print Direction](directions/warm-print.md) |
18
+ | Add glowing, drifting color behind content. | [Gradient Atmosphere](techniques/gradient-atmosphere.md) |
19
+ | Add film grain, noise, or paper texture. | [Grain And Texture](techniques/grain-and-texture.md) |
20
+ | Put a live WebGL field behind a hero. | [WebGL Hero Field](techniques/webgl-hero.md) |
21
+ | Reinterpret a real brand as an unofficial study. | [Brand Studies](brand-studies.md) |
22
+
23
+ Build the result in [Showcase](../showcase/README.md) and add motion from [Motion techniques](../motion/techniques/scroll-choreography.md).
24
+
25
+ ## How Expression Relates To Other Domains
26
+
27
+ - Layout is the floor. An Expression direction never changes a Layout pattern; a page composes patterns and adds expression in its own product CSS.
28
+ - Motion owns how things move. Expression names the motion density a direction wants, and Motion techniques implement it.
29
+ - Design Engineering reference profiles are governed token fixtures. Expression directions are starting points for product work and are not validated tokens.
30
+
31
+ These pages are experimental. Their values are proposals chosen for a mood, not measured outcomes. Review a direction when a showcase work built on it fails its outcome checks or reads poorly in its screenshots.
32
+
33
+ ## Domain Contract
34
+
35
+ See [StyleGallery Domains](../DOMAINS.md) for lifecycle, provenance, page membership, and staleness rules.
36
+
37
+ ## IA Navigation
38
+
39
+ Parent: [StyleGallery](../index.md).
40
+ Next: [Expression Direction Brief](direction-brief.md).
@@ -0,0 +1,107 @@
1
+ ---
2
+ type: Domain Recipe
3
+ title: Gradient Atmosphere
4
+ description: Copy-ready blurred gradient fields, card glows, and gradient text for expressive product pages.
5
+ domain: expression
6
+ lifecycle: experimental
7
+ provenance_kind: local
8
+ ---
9
+
10
+ # Gradient Atmosphere
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
+ ### Aurora Field
21
+
22
+ Three large radial gradients, blurred together and slowly drifting behind a section.
23
+
24
+ ```html
25
+ <section class="hero">
26
+ <div class="aurora" aria-hidden="true"><span></span><span></span><span></span></div>
27
+ <!-- content -->
28
+ </section>
29
+ ```
30
+
31
+ ```css
32
+ .hero { isolation: isolate; overflow: clip; position: relative; }
33
+ .aurora { filter: blur(70px) saturate(140%); inset: 0; opacity: 0.55; position: absolute; z-index: -2; }
34
+ .aurora span { animation: drift 18s ease-in-out infinite alternate; border-radius: 50%; position: absolute; }
35
+ .aurora span:nth-child(1) { background: radial-gradient(circle, #ff5a36, transparent 65%); block-size: 60vmax; inline-size: 60vmax; inset-block-start: -20vmax; inset-inline-end: -15vmax; }
36
+ .aurora span:nth-child(2) { animation-duration: 24s; background: radial-gradient(circle, #7b5cff, transparent 65%); block-size: 55vmax; inline-size: 55vmax; inset-block-end: -25vmax; inset-inline-start: -10vmax; }
37
+ .aurora span:nth-child(3) { animation-duration: 30s; background: radial-gradient(circle, #1f6fff, transparent 60%); block-size: 35vmax; inline-size: 35vmax; inset-block-start: 30%; inset-inline-start: 40%; }
38
+ @keyframes drift { to { transform: translate3d(-6vmax, 4vmax, 0) scale(1.15); } }
39
+ @media (prefers-reduced-motion: reduce) { .aurora span { animation: none; } }
40
+ ```
41
+
42
+ `overflow: clip` on the section keeps the oversized blobs from widening the document; without it the page scrolls sideways at 320px.
43
+
44
+ ### Legibility Scrim
45
+
46
+ When copy sits over the field, add a gradient between the atmosphere and the copy instead of dimming the atmosphere everywhere.
47
+
48
+ ```css
49
+ .hero::after {
50
+ background: linear-gradient(to top, rgb(7 7 10 / 0.7), transparent 55%), linear-gradient(to right, rgb(7 7 10 / 0.55), transparent 60%);
51
+ content: ""; inset: 0; pointer-events: none; position: absolute; z-index: -1;
52
+ }
53
+ ```
54
+
55
+ ### Card Glow
56
+
57
+ Two corner radial gradients per card, colored by custom properties set on the card, so each card gets its own light without new classes.
58
+
59
+ ```css
60
+ .card {
61
+ background:
62
+ radial-gradient(120% 90% at 100% 0%, color-mix(in oklab, var(--hue-a) 55%, transparent), transparent 60%),
63
+ radial-gradient(90% 80% at 0% 100%, color-mix(in oklab, var(--hue-b) 45%, transparent), transparent 60%),
64
+ #111118;
65
+ }
66
+ ```
67
+
68
+ ```html
69
+ <li class="card" style="--hue-a:#ff5a36; --hue-b:#7b5cff">...</li>
70
+ ```
71
+
72
+ ### Gradient Text
73
+
74
+ ```css
75
+ .accent {
76
+ background: linear-gradient(100deg, #ff5a36, #ffb454 40%, #7b5cff);
77
+ -webkit-background-clip: text;
78
+ background-clip: text;
79
+ color: transparent;
80
+ padding-inline-end: 0.06em; /* keeps italic overhang from being clipped */
81
+ }
82
+ ```
83
+
84
+ ## Opinionated Guidance
85
+
86
+ One atmosphere per viewport. An aurora behind the hero plus glowing cards plus gradient text in the same view reads as noise; stagger them down the page.
87
+
88
+ ## Platform-Specific Guidance
89
+
90
+ `filter: blur()` on large layers costs GPU memory. Blur the container once, not each blob, and keep blob sizes in `vmax` so the effect scales without re-rasterizing at many sizes. `color-mix()` needs a current engine; provide a plain `rgb()` fallback if you target older browsers.
91
+
92
+ ## Unsupported Absolutes
93
+
94
+ Blur radius, opacity, and drift duration here were tuned for one dark page. Light grounds need lower opacity and usually no `saturate()`.
95
+
96
+ ## Verification Contract
97
+
98
+ In the showcase check, the page has no horizontal overflow at 320px, and under reduced motion no infinite drift animation is running. Review the screenshots for text contrast over the brightest part of the field.
99
+
100
+ ## Source, License, And Attribution
101
+
102
+ Locally authored recipe. No upstream source.
103
+
104
+ ## IA Navigation
105
+
106
+ Parent: [Expression](../index.md).
107
+ Next: [Grain And Texture](grain-and-texture.md).