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.
- package/AGENTS.md +13 -1
- package/DOMAINS.md +7 -3
- package/GOVERNANCE.md +13 -11
- package/LICENSE-DOCS +2 -2
- package/README.md +23 -10
- package/consumer-reference/agent-native/v2/admission-policy.json +32 -37
- package/consumer-reference/agent-native/v2/material-registry.json +1 -1
- package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +3 -3
- package/consumer-reference/agent-native/v2/schema/material-record.schema.json +1 -1
- package/design-engineering/state-management/index.md +1 -1
- package/design-engineering/state-management/patterns/derived-state.md +1 -1
- package/design-engineering/state-management/patterns/draft-and-baseline.md +1 -1
- package/design-engineering/state-management/patterns/id-selection.md +1 -1
- package/design-engineering/state-management/patterns/identity-reset.md +1 -1
- package/design-engineering/state-management/patterns/latest-request-wins.md +1 -1
- package/design-engineering/state-management/patterns/optimistic-overlay.md +1 -1
- package/design-engineering/state-management/patterns/single-flight.md +1 -1
- package/design-engineering/state-management/patterns/single-owner.md +1 -1
- package/design-engineering/state-management/patterns/submitted-snapshot.md +1 -1
- package/design-engineering/state-management/patterns/unsaved-navigation.md +1 -1
- package/design-engineering/state-management/patterns/url-state.md +1 -1
- package/design-engineering/state-management/patterns/versioned-restore.md +1 -1
- package/design-engineering/state-management/verification.md +1 -1
- package/design-terminology/conflict-cases.md +1 -1
- package/design-terminology/source-kinds.md +1 -1
- package/expression/brand-studies.md +50 -0
- package/expression/direction-brief.md +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 +35 -0
- package/motion/index.md +2 -0
- package/motion/techniques/kinetic-type.md +145 -0
- package/motion/techniques/scroll-choreography.md +154 -0
- package/package.json +17 -14
- package/platform-guides/compatibility-matrix.md +1 -1
- package/quality/claim-records/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 +5 -5
- 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
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
"media_type": { "const": "text/markdown" },
|
|
14
14
|
"allowed_materials": {
|
|
15
15
|
"type": "array",
|
|
16
|
-
"minItems":
|
|
17
|
-
"maxItems":
|
|
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", "
|
|
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", "
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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, `
|
|
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);
|
|
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)
|
|
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).
|