@design-intelligence/ghost 0.20.0 → 0.22.0
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/README.md +47 -33
- package/dist/commands/checks-command.d.ts.map +1 -1
- package/dist/commands/checks-command.js +8 -1
- package/dist/commands/checks-command.js.map +1 -1
- package/dist/commands/fingerprint-commands.d.ts.map +1 -1
- package/dist/commands/fingerprint-commands.js +1 -6
- package/dist/commands/fingerprint-commands.js.map +1 -1
- package/dist/commands/gather-command.d.ts.map +1 -1
- package/dist/commands/gather-command.js +26 -30
- package/dist/commands/gather-command.js.map +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +23 -13
- package/dist/commands/init-command.js.map +1 -1
- package/dist/commands/pull-command.d.ts.map +1 -1
- package/dist/commands/pull-command.js +12 -19
- package/dist/commands/pull-command.js.map +1 -1
- package/dist/commands/pulse-command.js +1 -10
- package/dist/commands/pulse-command.js.map +1 -1
- package/dist/commands/review-command.d.ts.map +1 -1
- package/dist/commands/review-command.js +1 -0
- package/dist/commands/review-command.js.map +1 -1
- package/dist/ghost-core/catalog/assemble.d.ts +0 -4
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.js +0 -10
- package/dist/ghost-core/catalog/assemble.js.map +1 -1
- package/dist/ghost-core/catalog/index.d.ts +1 -1
- package/dist/ghost-core/catalog/index.d.ts.map +1 -1
- package/dist/ghost-core/catalog/index.js +1 -1
- package/dist/ghost-core/catalog/index.js.map +1 -1
- package/dist/ghost-core/catalog/menu.d.ts +1 -11
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
- package/dist/ghost-core/catalog/menu.js +1 -6
- package/dist/ghost-core/catalog/menu.js.map +1 -1
- package/dist/ghost-core/catalog/types.d.ts +0 -6
- package/dist/ghost-core/catalog/types.d.ts.map +1 -1
- package/dist/ghost-core/glossary.d.ts +0 -13
- package/dist/ghost-core/glossary.d.ts.map +1 -1
- package/dist/ghost-core/glossary.js +0 -7
- package/dist/ghost-core/glossary.js.map +1 -1
- package/dist/ghost-core/index.d.ts +2 -2
- package/dist/ghost-core/index.d.ts.map +1 -1
- package/dist/ghost-core/index.js +1 -1
- package/dist/ghost-core/index.js.map +1 -1
- package/dist/ghost-core/package-manifest.d.ts +7 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -1
- package/dist/ghost-core/package-manifest.js +10 -0
- package/dist/ghost-core/package-manifest.js.map +1 -1
- package/dist/init-payloads/median/cliche.median.md +86 -0
- package/dist/init-payloads/median/median-tells.md +117 -0
- package/dist/init-payloads/skeleton/brand.md +22 -0
- package/dist/init-payloads/skeleton/context.conversation.md +24 -0
- package/dist/init-payloads/skeleton/foundation.color.md +39 -0
- package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
- package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
- package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
- package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
- package/dist/init-payloads/skeleton/foundation.type.md +44 -0
- package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
- package/dist/init-payloads/skeleton/glossary.md +39 -0
- package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
- package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
- package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
- package/dist/init-payloads/vessel-light/checks/values.md +51 -0
- package/dist/init-payloads/vessel-light/glossary.md +44 -0
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
- package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
- package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
- package/dist/init-payloads/vessel-light/index.md +33 -0
- package/dist/init-payloads/vessel-light/manifest.yml +3 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
- package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
- package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
- package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
- package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
- package/dist/init-payloads/vessel-light/register.email.md +43 -0
- package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
- package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
- package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
- package/dist/init-payloads/vessel-light/signature.type.md +37 -0
- package/dist/observability-events.d.ts +0 -3
- package/dist/observability-events.d.ts.map +1 -1
- package/dist/observability-events.js.map +1 -1
- package/dist/review/resolve.d.ts +3 -4
- package/dist/review/resolve.d.ts.map +1 -1
- package/dist/review/resolve.js +12 -9
- package/dist/review/resolve.js.map +1 -1
- package/dist/review/review-packet.d.ts +2 -1
- package/dist/review/review-packet.d.ts.map +1 -1
- package/dist/review/review-packet.js +9 -20
- package/dist/review/review-packet.js.map +1 -1
- package/dist/scan/check-files.d.ts.map +1 -1
- package/dist/scan/check-files.js +0 -15
- package/dist/scan/check-files.js.map +1 -1
- package/dist/scan/check-scaffold.d.ts +1 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -1
- package/dist/scan/check-scaffold.js +17 -1
- package/dist/scan/check-scaffold.js.map +1 -1
- package/dist/scan/fingerprint-package-lint.d.ts +8 -0
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-lint.js +284 -0
- package/dist/scan/fingerprint-package-lint.js.map +1 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-loader.js +2 -29
- package/dist/scan/fingerprint-package-loader.js.map +1 -1
- package/dist/scan/fingerprint-package.d.ts +16 -8
- package/dist/scan/fingerprint-package.d.ts.map +1 -1
- package/dist/scan/fingerprint-package.js +41 -241
- package/dist/scan/fingerprint-package.js.map +1 -1
- package/dist/scan/node-files.d.ts.map +1 -1
- package/dist/scan/node-files.js +1 -3
- package/dist/scan/node-files.js.map +1 -1
- package/dist/scan/packed-payloads.d.ts +4 -0
- package/dist/scan/packed-payloads.d.ts.map +1 -0
- package/dist/scan/packed-payloads.js +55 -0
- package/dist/scan/packed-payloads.js.map +1 -0
- package/dist/scan/templates.d.ts +20 -2
- package/dist/scan/templates.d.ts.map +1 -1
- package/dist/scan/templates.js +106 -26
- package/dist/scan/templates.js.map +1 -1
- package/dist/skill-bundle/SKILL.md +16 -13
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +42 -5
- package/dist/skill-bundle/references/blocks.md +1 -1
- package/dist/skill-bundle/references/brief.md +5 -6
- package/dist/skill-bundle/references/capture.md +52 -41
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +6 -12
- package/dist/skill-bundle/references/schema.md +15 -24
- package/dist/skill-bundle/references/self-check.md +2 -2
- package/dist/skill-bundle/references/steering-audit.md +7 -10
- package/package.json +2 -2
- package/dist/scan/steering-template.d.ts +0 -8
- package/dist/scan/steering-template.d.ts.map +0 -1
- package/dist/scan/steering-template.js +0 -266
- package/dist/scan/steering-template.js.map +0 -1
- package/dist/skill-bundle/references/wild.md +0 -30
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Median tells
|
|
3
|
+
description: Flags the measured defaults of unsteered generation and current model-signature tells — hover-lift, default accents, unprompted dark theme, gradient text, frequency tells, and per-model signatures.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- anti-goal.median > Hover-lift
|
|
7
|
+
- anti-goal.median > Indigo accent
|
|
8
|
+
- anti-goal.median > Dark theme
|
|
9
|
+
- anti-goal.median > Gradients
|
|
10
|
+
- anti-goal.median > Glassmorphism
|
|
11
|
+
- anti-goal.median > Side-stripe
|
|
12
|
+
- anti-goal.median > Cream surface
|
|
13
|
+
- anti-goal.median > Chat bubbles
|
|
14
|
+
- anti-goal.median > Stock copy
|
|
15
|
+
- anti-goal.median > Celebration
|
|
16
|
+
- anti-goal.median > Hero metric
|
|
17
|
+
- anti-goal.median > Eyebrow kicker
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
This is Vessel's adaptation of the shared median check; the fidelity carve-outs
|
|
21
|
+
below are the body's own. These flags target the measured convergence patterns
|
|
22
|
+
of unsteered model generation, plus tells specific to individual models. Each
|
|
23
|
+
is mechanically detectable in a diff. Pruning a rule from `anti-goal.median`
|
|
24
|
+
orphans its paired reference here — `ghost validate` warns; delete the flag and
|
|
25
|
+
its reference together.
|
|
26
|
+
|
|
27
|
+
Flag `transform` with `translateY` inside a `:hover` rule on cards, buttons,
|
|
28
|
+
or list items, especially paired with a shadow increase. Hover confirmation
|
|
29
|
+
in Vessel is color and background change, not lift.
|
|
30
|
+
(`anti-goal.median > Hover-lift`)
|
|
31
|
+
|
|
32
|
+
Flag accent values in the indigo/blue/purple default family (`#4f46e5`,
|
|
33
|
+
`#6366f1`, `#2563eb`, `#3b82f6`, `#8b5cf6`, and close neighbors) unless the
|
|
34
|
+
diff shows the user asked for them. They are model defaults, not palette
|
|
35
|
+
members. (`anti-goal.median > Indigo accent`)
|
|
36
|
+
|
|
37
|
+
Flag whole-page dark backgrounds when the ask did not request dark mode.
|
|
38
|
+
Dark surfaces in Vessel are the editorial dark band or an explicit `.dark`
|
|
39
|
+
theme, never an unprompted default. (`anti-goal.median > Dark theme`)
|
|
40
|
+
|
|
41
|
+
Flag `linear-gradient` or `radial-gradient` as page or section backgrounds,
|
|
42
|
+
and gradient-filled buttons. (`anti-goal.median > Gradients`)
|
|
43
|
+
|
|
44
|
+
Flag `backdrop-filter: blur` used for glassmorphism cards.
|
|
45
|
+
(`anti-goal.median > Glassmorphism`)
|
|
46
|
+
|
|
47
|
+
Flag `background-clip: text` (with or without the `-webkit-` prefix) paired
|
|
48
|
+
with a gradient. Emphasis comes from weight or size in a single solid color.
|
|
49
|
+
|
|
50
|
+
Flag a thick colored border on one side of an element (`border-left` or a
|
|
51
|
+
`border-l-*` utility at 2px or more in a non-neutral color) while the other
|
|
52
|
+
sides stay thin. (`anti-goal.median > Side-stripe`)
|
|
53
|
+
|
|
54
|
+
Flag warm off-white page backgrounds in the cream/sand/beige band, and token
|
|
55
|
+
names like `--cream`, `--sand`, `--parchment`, `--linen` introduced by the
|
|
56
|
+
diff. (`anti-goal.median > Cream surface`)
|
|
57
|
+
|
|
58
|
+
Flag assistant messages rendered as bubbles with initials-circle avatars.
|
|
59
|
+
(`anti-goal.median > Chat bubbles`)
|
|
60
|
+
|
|
61
|
+
Flag emoji used as icons or imagery in interface chrome. Text labels carry
|
|
62
|
+
meaning.
|
|
63
|
+
|
|
64
|
+
Flag stock template copy in headings: "Simple, transparent pricing",
|
|
65
|
+
"Welcome back", and interchangeable-with-a-competitor phrasing. Recommend
|
|
66
|
+
copy that states what this product specifically does.
|
|
67
|
+
(`anti-goal.median > Stock copy`)
|
|
68
|
+
|
|
69
|
+
Flag exclamation-marked success copy, confetti language, and celebratory UI
|
|
70
|
+
("You did it!", "Awesome!"). Confirmation is quiet and factual.
|
|
71
|
+
(`anti-goal.median > Celebration`)
|
|
72
|
+
|
|
73
|
+
Flag the hero-metric template — a big number, small label, and supporting
|
|
74
|
+
stats as default proof — unless the metric shows real user data. Recommend
|
|
75
|
+
evidence specific to the product, or nothing.
|
|
76
|
+
(`anti-goal.median > Hero metric`)
|
|
77
|
+
|
|
78
|
+
Frequency tells — the crime is repetition, not the move (advisory):
|
|
79
|
+
|
|
80
|
+
Flag three or more uppercase, tracked eyebrow kickers above section headings
|
|
81
|
+
in one page. One named kicker is voice; a kicker on every section is model
|
|
82
|
+
grammar. (`anti-goal.median > Eyebrow kicker`)
|
|
83
|
+
|
|
84
|
+
Flag five or more em-dashes in body copy in one view.
|
|
85
|
+
|
|
86
|
+
Flag three or more instances of the aphoristic rebuttal cadence ("Not X. Y."
|
|
87
|
+
/ "Sentence. No qualifiers.") in one page's copy.
|
|
88
|
+
|
|
89
|
+
Model-signature tells — skip any block whose model did not produce the diff
|
|
90
|
+
(advisory):
|
|
91
|
+
|
|
92
|
+
Codex: flag a 1px border paired with a box-shadow of 16px blur or more on
|
|
93
|
+
the same element — pick a solid border or a tight shadow, not both. Flag
|
|
94
|
+
border-radius of 32px or more on cards, sections, or inputs. Flag 1px
|
|
95
|
+
linear-gradient grid or repeating-stripe backgrounds used as decoration.
|
|
96
|
+
|
|
97
|
+
Gemini: flag `transform` (scale, rotate, translate) on `img` inside a
|
|
98
|
+
`:hover` rule, including group-hover utilities targeting a child image.
|
|
99
|
+
Animate the card's background, border, or shadow instead.
|
|
100
|
+
|
|
101
|
+
Do not flag pill-shaped controls or fluid clamp display headings — those
|
|
102
|
+
median patterns are deliberately shared by Vessel and their presence is
|
|
103
|
+
fidelity.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Motion restraint
|
|
3
|
+
description: Flags non-token motion, looping decoration, and keyframes that do not explain state change.
|
|
4
|
+
severity: medium
|
|
5
|
+
references:
|
|
6
|
+
- grammar.motion
|
|
7
|
+
- signature.temperature
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Review changed transitions and animations for vocabulary first.
|
|
11
|
+
|
|
12
|
+
Flag durations that do not use `--duration-fast`, `--duration-normal`, or `--duration-slow`. A hard-coded millisecond value is a drift even when it matches the token today.
|
|
13
|
+
|
|
14
|
+
Flag custom easing unless it uses the fingerprint's one ease or a browser default already required by the primitive.
|
|
15
|
+
|
|
16
|
+
Flag looping animations outside explicit loading states. Loading must be tied to ongoing work, not ambient motion.
|
|
17
|
+
|
|
18
|
+
Flag decorative keyframes: glow, float, shimmer, bounce, pulse, parallax, or any motion that can be removed without making a state change harder to understand.
|
|
19
|
+
|
|
20
|
+
Recommend the smallest opacity or transform transition that explains the state change.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Relationship discipline
|
|
3
|
+
description: Flags structural violations of the grammar — emphasis-ladder breaks, sibling margins, decorative borders, nested cards. These rules survive any adaptation.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- grammar.hierarchy
|
|
7
|
+
- grammar.rhythm
|
|
8
|
+
- grammar.surfaces
|
|
9
|
+
- anti-goal.median > Nested cards
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
These assertions test relationships between token roles, not the values behind
|
|
13
|
+
them. They hold for any brand built on this grammar; an adapted package keeps this check
|
|
14
|
+
unchanged.
|
|
15
|
+
|
|
16
|
+
Flag more than one primary-variant button per view. Secondary actions step
|
|
17
|
+
down the emphasis ladder: secondary, outline, ghost, or link.
|
|
18
|
+
|
|
19
|
+
Flag `margin` set on siblings inside a stack in changed CSS or inline styles.
|
|
20
|
+
Rhythm comes from the gap scale; recommend changing the stack gap or splitting
|
|
21
|
+
the stack.
|
|
22
|
+
|
|
23
|
+
Flag borders, fills, gradients, glass effects, or colored accents used to make
|
|
24
|
+
ordinary structure feel designed. Recommend semantic surfaces, stack spacing,
|
|
25
|
+
text tone, or the existing elevation tier instead.
|
|
26
|
+
|
|
27
|
+
Flag card-like surfaces nested inside card-like surfaces. One surface level
|
|
28
|
+
per region; interior hierarchy comes from spacing and type, not another
|
|
29
|
+
container.
|
|
30
|
+
|
|
31
|
+
Flag `box-shadow` values that belong to no declared elevation tier and no
|
|
32
|
+
component-owned shadow. Do not accept a custom shadow because it is visually
|
|
33
|
+
close to a tier — elevation is a closed set, whatever the values are.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Shape matches the job
|
|
3
|
+
description: Flags views composed for the wrong reader job — a form styled as a table, an announcement headline over a reviewable artifact, a live state presented as settled fact, a second primary, or a skeleton loader standing in for content.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- grammar.job
|
|
7
|
+
- grammar.deletion
|
|
8
|
+
- grammar.hierarchy
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Apply this check to diffs that add or restructure a view. Classify the
|
|
12
|
+
reader's job first — what they do next with the view — then judge the
|
|
13
|
+
composition against the ref that job routes to. These flags catch the
|
|
14
|
+
template-convergence failure: a plausible layout applied to a job it does
|
|
15
|
+
not fit.
|
|
16
|
+
|
|
17
|
+
Flag a view whose job routes to one ref but whose composition imitates
|
|
18
|
+
another — a submit-and-done task laid out as a dashboard of cards, a
|
|
19
|
+
records-scanning task rendered as prose sections, a stop-and-decide moment
|
|
20
|
+
inlined into the page instead of interrupting it. (`grammar.job`)
|
|
21
|
+
|
|
22
|
+
Flag an announcement headline in display or headline type above an artifact
|
|
23
|
+
the reader will review — "Here's your draft", "Your plan is ready", "All
|
|
24
|
+
set". The artifact opens the view; status lives in quiet metadata or
|
|
25
|
+
nowhere. (`grammar.job`)
|
|
26
|
+
|
|
27
|
+
Flag a live or ongoing value presented without its freshness — no timestamp
|
|
28
|
+
or "updated" line in muted metadata near the figure. A moving value styled
|
|
29
|
+
as a settled fact misleads. (`grammar.job`)
|
|
30
|
+
|
|
31
|
+
Flag recommendation or verdict framing where the decision belongs to the
|
|
32
|
+
reader and the system cannot honestly rank the options. Present the
|
|
33
|
+
material; withhold the verdict. (`grammar.job`)
|
|
34
|
+
|
|
35
|
+
Flag a second primary-variant action in a view, and flag a promoted primary
|
|
36
|
+
on a view that honestly earns none — a steady status view, an open
|
|
37
|
+
comparison. Zero is a valid spend of `--primary-budget`.
|
|
38
|
+
(`grammar.hierarchy`)
|
|
39
|
+
|
|
40
|
+
Flag skeleton loaders, placeholder shimmer, or staged construction where
|
|
41
|
+
content will land — and any element that cannot name what breaks if it is
|
|
42
|
+
removed. The fix is demotion or deletion, never more emphasis.
|
|
43
|
+
(`grammar.deletion`)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Value discipline
|
|
3
|
+
description: Flags off-signature values — non-pill controls, off-palette hues, raw color literals, expression over budget. Adapting the dials rewrites this check alongside the signature nodes.
|
|
4
|
+
severity: high
|
|
5
|
+
references:
|
|
6
|
+
- signature.shape
|
|
7
|
+
- signature.palette
|
|
8
|
+
- grammar.color-roles
|
|
9
|
+
- register.data-density
|
|
10
|
+
- register.editorial
|
|
11
|
+
- register.email
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
These assertions test Vessel's current answers to the signature dials. A
|
|
15
|
+
adaptation that changes the dials rewrites this check with them; the paired
|
|
16
|
+
relationship check stays.
|
|
17
|
+
|
|
18
|
+
Review changed HTML and CSS by view, not just by file. Classify the register
|
|
19
|
+
of each changed view first: table layout, `bgcolor`, or a 600px wrapper means
|
|
20
|
+
email; display-scale headings, `--section-padding-vertical`, or
|
|
21
|
+
`--surface-dark-*` means editorial; compressed smallest-gap-step layouts with
|
|
22
|
+
mono numerals means data-density; otherwise product.
|
|
23
|
+
|
|
24
|
+
Flag buttons or text inputs that are not pill-radius (`--radius-control`).
|
|
25
|
+
A rectangular control is a token violation, not a style choice.
|
|
26
|
+
|
|
27
|
+
Flag surfaces that carry a radius other than `--radius-surface`, and radius
|
|
28
|
+
roles swapped across the boundary: control radius on a surface, surface
|
|
29
|
+
radius on a control.
|
|
30
|
+
|
|
31
|
+
Count distinct non-gray colors visible in each view, then judge against that
|
|
32
|
+
register's expression budget: product views get one functional accent, with
|
|
33
|
+
expression hues permitted only inside chart or visualization markup; data
|
|
34
|
+
consoles get one status hue family with the same chart carve-out; email gets
|
|
35
|
+
one expressive moment in one hue; editorial pages get at most two expression
|
|
36
|
+
hues. Flag anything over budget, and flag expression hues used
|
|
37
|
+
atmospherically outside their register. Status colors count toward the total
|
|
38
|
+
unless the view compares two or more distinct statuses side by side.
|
|
39
|
+
|
|
40
|
+
Flag any color that is neither a gray, a status token, nor one of the five
|
|
41
|
+
expression hues (`--expression-1` through `--expression-5`, or their hex
|
|
42
|
+
values in email). Invented hues are drift in every register.
|
|
43
|
+
|
|
44
|
+
Flag expression hues on buttons, inputs, or links in every register. Controls
|
|
45
|
+
stay monochrome; no budget covers them.
|
|
46
|
+
|
|
47
|
+
Flag raw hex, rgb, hsl, or named color values in changed CSS or inline styles
|
|
48
|
+
when a Vessel token could express the same role. The authoring vocabulary is
|
|
49
|
+
semantic tokens, not literal color. Exception: email files — hardcoded values
|
|
50
|
+
transcribed from tokens are the contract there; flag only values that
|
|
51
|
+
correspond to no token and no expression hue.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
kinds:
|
|
3
|
+
- name: grammar
|
|
4
|
+
- name: signature
|
|
5
|
+
- name: register
|
|
6
|
+
- name: anti-goal
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# grammar
|
|
10
|
+
|
|
11
|
+
The brand's decision logic: closed sets, role vocabularies, and assembly
|
|
12
|
+
rules, stated in token roles and never in literal values. Grammar survives an
|
|
13
|
+
adaptation unchanged — adapt the package, swap every value, and these nodes still
|
|
14
|
+
hold. Gather grammar before inventing structure.
|
|
15
|
+
|
|
16
|
+
# signature
|
|
17
|
+
|
|
18
|
+
The dials: the choices that make this brand this brand, each stated as a
|
|
19
|
+
current answer that stands until you replace it. Signature nodes name real
|
|
20
|
+
values because they are the values — on adaptation, edit the token roles in
|
|
21
|
+
`materials/tokens.css` and restate the node. Gather signature before setting
|
|
22
|
+
any value a dial governs.
|
|
23
|
+
|
|
24
|
+
# register
|
|
25
|
+
|
|
26
|
+
A condition-scoped contract: a situation — data-dense consoles, editorial
|
|
27
|
+
pages, transactional email — where parts of the default rules invert. Each
|
|
28
|
+
register names its condition first. Truths from the wrong register are
|
|
29
|
+
poison, not context; gather a register only when its condition matches the
|
|
30
|
+
task.
|
|
31
|
+
|
|
32
|
+
# anti-goal
|
|
33
|
+
|
|
34
|
+
What this package refuses, each reject paired with its replacement.
|
|
35
|
+
`anti-goal.median` is the model's floor, not the brand's taste;
|
|
36
|
+
`anti-goal.tells` is the near-miss map of this brand's own signature. Gather
|
|
37
|
+
anti-goals before styling anything greenfield.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
To adapt this package to another brand, follow the `adapting-a-starter`
|
|
42
|
+
recipe in the ghost skill bundle. In short: new manifest id, prune the
|
|
43
|
+
median rules your brand legitimately violates, answer each signature node,
|
|
44
|
+
edit `materials/tokens.css`, regenerate the refs, rewrite the tells.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Semantic color roles and the rules that govern them — gather before choosing any color; roles not raw values, status is meaning, expression is register-gated and never on controls."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/tokens.css
|
|
5
|
+
- "**/*.css"
|
|
6
|
+
- "**/*.html"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
The token file is the source of truth. An agent may combine tokens, but it
|
|
10
|
+
may not author around them. Raw color values are implementation detail, never
|
|
11
|
+
product language.
|
|
12
|
+
|
|
13
|
+
Author with semantic roles: `background`, `foreground`, `card`, `popover`,
|
|
14
|
+
`primary`, `secondary`, `muted`, `border`, `input`, `ring`, and the status
|
|
15
|
+
roles. If a container needs a color, it first needs a role.
|
|
16
|
+
|
|
17
|
+
The status roles — destructive, success, warning, info — exist only when
|
|
18
|
+
meaning demands them. Destructive means destructive or error. Success means
|
|
19
|
+
success. Warning means warning. Info means information. None of them are
|
|
20
|
+
brand accents, and they never moonlight as atmosphere, in any register.
|
|
21
|
+
|
|
22
|
+
One view should not perform a color palette. If a status color is present,
|
|
23
|
+
let the rest of the view stay on the base roles. Richness beyond this is
|
|
24
|
+
register-gated: a closed expression set (`--expression-*`) exists, but its
|
|
25
|
+
size, members, and volume ladder are a brand answer — see the palette
|
|
26
|
+
signature — and each register caps how loud they may be.
|
|
27
|
+
|
|
28
|
+
The constant that holds across every register: expression never touches what
|
|
29
|
+
you click. Buttons, inputs, and links stay on the base roles everywhere. A
|
|
30
|
+
colored control is a different design system.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Conversation grammar — plain assistant text, compact user surfaces, collapsed tool calls, one structured prompt input; gather for any AI thread, agent console, review assistant, or prompt composer."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/ref/composition.conversation.html
|
|
5
|
+
- "**/*.html"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Conversation UI is not chat cosplay. The assistant speaks on the page surface
|
|
9
|
+
as plain text: no bubble, no border, no fill.
|
|
10
|
+
|
|
11
|
+
User turns are compact muted surfaces aligned right. They mark authorship
|
|
12
|
+
without turning the thread into alternating balloons.
|
|
13
|
+
|
|
14
|
+
Assistant hierarchy comes from prose, spacing, and type. Wrapping assistant
|
|
15
|
+
messages in cards makes the system look defensive and wastes density.
|
|
16
|
+
|
|
17
|
+
Tool calls are operational evidence. Collapse them to a labeled one-line
|
|
18
|
+
summary with status. Expand only when the user asks for detail, then show
|
|
19
|
+
mono content inside the disclosed area.
|
|
20
|
+
|
|
21
|
+
The prompt input is one bordered surface. The textarea region stays empty of
|
|
22
|
+
controls so writing remains the focus. Attachments, model choices, secondary
|
|
23
|
+
tools, and send live in a single row below it.
|
|
24
|
+
|
|
25
|
+
There is one primary send action. Stop and send are mutually exclusive states
|
|
26
|
+
of the same action area, not two competing primary buttons.
|
|
27
|
+
|
|
28
|
+
Use the conversation reference when building any AI thread, agent console,
|
|
29
|
+
review assistant, or prompt composer. It carries the grammar that agents most
|
|
30
|
+
often get wrong.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "The deletion pass — every element must name what breaks if it goes; the fix for a crowded view is always demotion or deletion, never more emphasis; surfaces arrive settled, with no skeleton theater. Gather as the final pass over any composition, and whenever a view feels crowded, busy, or dressed up."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Restraint is not a mood; it is a test every element has to pass. Before a
|
|
6
|
+
view ships, run the pass: each label, divider, icon, caption, and helper
|
|
7
|
+
line must name what breaks if it is removed. If nothing breaks, delete it.
|
|
8
|
+
Convention is not a reason — "forms usually have this" keeps nothing.
|
|
9
|
+
|
|
10
|
+
The test has a direction. When a view is crowded, or two elements compete
|
|
11
|
+
for attention, the fix is always demotion or deletion — never adding
|
|
12
|
+
emphasis to the loser. Raising the volume of one element to beat another
|
|
13
|
+
starts an arms race the composition always loses; removing the weaker claim
|
|
14
|
+
ends it.
|
|
15
|
+
|
|
16
|
+
Some deletions we have already made, permanently: no decorative dividers
|
|
17
|
+
where a gap step states the relationship; no icons that restate their
|
|
18
|
+
adjacent label; no tooltips explaining obvious controls; no onboarding
|
|
19
|
+
chrome on routine views; no credibility costume — a small factual source or
|
|
20
|
+
timestamp line beats a dashboard of gauges.
|
|
21
|
+
|
|
22
|
+
A view also arrives settled. No skeleton loaders, no placeholder shimmer
|
|
23
|
+
promising content that is not there — a fake page is hedging rendered as UI.
|
|
24
|
+
While work is genuinely pending, show the smallest true statement (a quiet
|
|
25
|
+
loading state, per the motion doctrine's loop exception) and nothing else.
|
|
26
|
+
When content lands, it lands in its final position: no reflow, no staggered
|
|
27
|
+
construction, no element arriving late to shift its neighbors.
|
|
28
|
+
|
|
29
|
+
Do: a settings page whose every row survives the what-breaks question, with
|
|
30
|
+
one primary action and gaps doing the dividing. Never: the same page with
|
|
31
|
+
icon-per-row decoration, a divider under every group, a progress shimmer on
|
|
32
|
+
load, and a bolded second CTA competing for the eye.
|
|
33
|
+
|
|
34
|
+
After everything deletable is gone, whatever remains is unmistakably the
|
|
35
|
+
point.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "The closed hierarchy vocabulary — six text variants, seven tones, a five-rung control emphasis ladder, one primary per view — gather for any view that contains text or actions."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/primitives.css
|
|
5
|
+
- materials/ref/composition.form.html
|
|
6
|
+
- "**/*.html"
|
|
7
|
+
- "**/*.css"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Hierarchy is a closed vocabulary, not a size slider. Every piece of text and
|
|
11
|
+
every control picks from a named set; anything outside the set is a broken
|
|
12
|
+
primitive, not a variant.
|
|
13
|
+
|
|
14
|
+
The text variants are exactly six: display, headline, title, body, label,
|
|
15
|
+
mono. Variant names are jobs, not decoration. Display leads a rare editorial
|
|
16
|
+
moment. Headline names a section. Title anchors a card, dialog, or compact
|
|
17
|
+
region. Body carries reading. Label names structure — category tags, field
|
|
18
|
+
labels, bylines, metadata, compact status. Mono carries code and machine
|
|
19
|
+
detail. Do not fake hierarchy with arbitrary font sizes; choose the tier that
|
|
20
|
+
matches the job, then use tone, weight, and spacing for the rest.
|
|
21
|
+
|
|
22
|
+
The tones are exactly seven: default, muted, inverse, success, warning, info,
|
|
23
|
+
destructive. Tone is part of the message. Default is the main reading plane.
|
|
24
|
+
Muted carries secondary information. Inverse is for dark or primary surfaces.
|
|
25
|
+
The four status tones appear only when the words have that state meaning.
|
|
26
|
+
Hierarchy starts with tone and weight before size — a secondary note usually
|
|
27
|
+
wants muted body or label, not a smaller custom font. If the prose needs
|
|
28
|
+
emphasis, improve the sentence before adding a style.
|
|
29
|
+
|
|
30
|
+
The control emphasis ladder is exactly five rungs: primary, secondary,
|
|
31
|
+
outline, ghost, link. At most one primary action per view is the rule
|
|
32
|
+
(`--primary-budget: 1`); everything else steps down the ladder. Primary is
|
|
33
|
+
for the action the screen exists to complete — if two buttons both look
|
|
34
|
+
primary, the hierarchy failed. And some views honestly earn none: a steady
|
|
35
|
+
status view or an open comparison has no action the screen exists to
|
|
36
|
+
complete, and promoting one anyway puts the system's thumb on the scale.
|
|
37
|
+
Zero is a valid spend.
|
|
38
|
+
Destructive is a meaning, not a rung: it is rare, it names the destructive
|
|
39
|
+
act directly, and it is never borrowed for urgency, emphasis, or brand heat.
|
|
40
|
+
|
|
41
|
+
Fields are quiet until they are active: hairline border, muted placeholder,
|
|
42
|
+
clear label, and a focused ring when the user engages. The focus ring is
|
|
43
|
+
guidance, not decoration. Errors state facts next to the field that caused
|
|
44
|
+
them — do not hide field errors in modals, toasts, or generic banners when
|
|
45
|
+
the user needs to fix one input.
|
|
46
|
+
|
|
47
|
+
Figures that will be compared or scanned — amounts, counts, dates in
|
|
48
|
+
columns, any metric — set in tabular numerals (`--numeric-tabular`), with
|
|
49
|
+
the unit tight to the number. Proportional figures in a data column wobble,
|
|
50
|
+
and a wobbling column reads as sloppy arithmetic. Mono already carries this
|
|
51
|
+
for machine detail; the rule extends to any numeric data in product UI.
|
|
52
|
+
|
|
53
|
+
Balanced text is for headings and compact statements. Do not balance long
|
|
54
|
+
body copy into jagged reading.
|
|
55
|
+
|
|
56
|
+
The form reference shows the intended decision order: stacked labels and
|
|
57
|
+
fields, compact helper text, one submit, secondary escape. Copy the decision
|
|
58
|
+
order before adjusting surface detail.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "The routing rule — name the reader's job before composing anything; the job picks the ref to imitate and the register that applies, never the topic. Gather first for any new view, before structure exists."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/ref/composition.form.html
|
|
5
|
+
- materials/ref/composition.table.html
|
|
6
|
+
- materials/ref/composition.editorial.html
|
|
7
|
+
- materials/ref/composition.overlay.html
|
|
8
|
+
- materials/ref/composition.conversation.html
|
|
9
|
+
- materials/ref/email.html
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Before any structure exists, name what the reader does next with the view.
|
|
13
|
+
The topic never picks the shape; the reader's job does. A billing question
|
|
14
|
+
is not "a billing page" — it is a form to fill, a table to scan, a decision
|
|
15
|
+
to confirm, or a thread to continue, and each of those is a different
|
|
16
|
+
composition. A view built for the wrong job does not merely look off; it
|
|
17
|
+
misleads.
|
|
18
|
+
|
|
19
|
+
The jobs and where they route:
|
|
20
|
+
|
|
21
|
+
- **Fill something in** — settings, signup, any submit-and-done task → the
|
|
22
|
+
form ref. Stacked labels and fields, one submit, secondary escape.
|
|
23
|
+
- **Scan and compare records** — lists, audits, anything with rows and
|
|
24
|
+
figures → the table ref, in the data-density register.
|
|
25
|
+
- **Read a narrative** — a landing page, an announcement, a story → the
|
|
26
|
+
editorial ref, in the editorial register.
|
|
27
|
+
- **Stop and decide** — a confirmation, a destructive act, a choice that
|
|
28
|
+
interrupts the task → the overlay ref. The decision is the view.
|
|
29
|
+
- **Converse with the system** — an AI thread, an agent console, a prompt
|
|
30
|
+
composer → the conversation ref.
|
|
31
|
+
- **Be notified elsewhere** — receipts, alerts, anything that lands in an
|
|
32
|
+
inbox → the email ref, in the email register.
|
|
33
|
+
|
|
34
|
+
Read the request's verbs, not its nouns: "edit / set up / submit" routes to
|
|
35
|
+
form; "compare / list / review the records" to table; "announce / tell the
|
|
36
|
+
story" to editorial; "confirm / are you sure" to overlay; "ask / draft with
|
|
37
|
+
me" to conversation. When two jobs fold into one request, build for the job
|
|
38
|
+
the reader performs on this view, now — the other job is the next view. When
|
|
39
|
+
a job fits none of these, compose from the grammar and say so; do not force
|
|
40
|
+
the nearest ref.
|
|
41
|
+
|
|
42
|
+
Three shapes lie about the job, and we refuse them everywhere:
|
|
43
|
+
|
|
44
|
+
- A view whose content is an artifact the reader will review — a draft, a
|
|
45
|
+
filled form, a generated plan — leads with the artifact, never with an
|
|
46
|
+
announcement headline. "Here's your draft" in display type demotes the
|
|
47
|
+
actual deliverable; the artifact sitting there with its actions is the
|
|
48
|
+
statement that it is ready.
|
|
49
|
+
- A view reporting a live or ongoing state carries its freshness — "updated
|
|
50
|
+
2 min ago" — in quiet metadata. Presenting a moving value as a settled
|
|
51
|
+
fact is a small lie the reader eventually catches.
|
|
52
|
+
- A view where the decision belongs to the reader presents the material and
|
|
53
|
+
withholds the verdict. Recommendation framing on a choice the system
|
|
54
|
+
cannot honestly make is manufactured confidence, and it reads that way.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Motion doctrine — motion is evidence of state change, never decoration; a closed vocabulary of three duration roles and one ease; gather for any transition, animation, or hover treatment."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/tokens.css
|
|
5
|
+
- "**/*.css"
|
|
6
|
+
- "**/*.html"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Motion is evidence of a state change. It confirms hover, press, reveal,
|
|
10
|
+
collapse, entrance, exit, and spatial movement. It does not entertain.
|
|
11
|
+
|
|
12
|
+
The entire vocabulary is three duration roles and one ease. Fast is for hover
|
|
13
|
+
and press. Normal is for reveals, fades, and small state changes. Slow is
|
|
14
|
+
reserved for spatial transitions where the user needs to understand movement.
|
|
15
|
+
Do not introduce novelty easings because a surface feels static; the ease's
|
|
16
|
+
character is a brand answer — see the temperature signature.
|
|
17
|
+
|
|
18
|
+
Nothing loops except explicit loading states. A spinner may continue because
|
|
19
|
+
work continues. Decorative pulsing, floating, glowing, and attention-seeking
|
|
20
|
+
keyframes are off-language.
|
|
21
|
+
|
|
22
|
+
Prefer opacity and small transform changes. If removing an animation does not
|
|
23
|
+
reduce comprehension, the animation was decoration.
|
|
24
|
+
|
|
25
|
+
Condition: marketing and editorial surfaces may stage entrances — scroll reveals and
|
|
26
|
+
section transitions are part of editorial rhythm, still built from the three
|
|
27
|
+
durations and the one ease. In product UI the same staging is decoration.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Layout rhythm — all layout is stacks with a closed gap step set; gather before laying anything out; never ad-hoc sibling margins."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/primitives.css
|
|
5
|
+
- "**/*.html"
|
|
6
|
+
- "**/*.css"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
All layout is stacks. Rhythm comes from relationships between siblings, not
|
|
10
|
+
from isolated margins pasted onto whichever element was last touched.
|
|
11
|
+
|
|
12
|
+
The gap steps are exactly five: `--gap-xs`, `--gap-sm`, `--gap-md`,
|
|
13
|
+
`--gap-lg`, `--gap-xl`. Choose the gap that states the relationship. Do not
|
|
14
|
+
tune by single pixels to make a screenshot pass.
|
|
15
|
+
|
|
16
|
+
The default is column, medium gap, stretch alignment, start justification.
|
|
17
|
+
That is the ordinary reading rhythm.
|
|
18
|
+
|
|
19
|
+
Columns are for almost everything: forms, cards, message lists, modal bodies,
|
|
20
|
+
settings, empty states, and page sections. A column lets the user scan.
|
|
21
|
+
|
|
22
|
+
Rows are conditional. Use them for controls, metadata lines, compact status,
|
|
23
|
+
and paired label/value moments. If a row starts wrapping awkwardly, it
|
|
24
|
+
probably wanted to be a column.
|
|
25
|
+
|
|
26
|
+
Ad-hoc margins between siblings are forbidden because they hide the rhythm.
|
|
27
|
+
When spacing feels wrong, change the stack gap or split the stack.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Surface roles and the closed elevation set — gather for any card, popover, modal, dialog, scrim, or bordered container; flat is the default, borders are structural, exactly three elevation tiers."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/primitives.css
|
|
5
|
+
- materials/ref/composition.overlay.html
|
|
6
|
+
- "**/*.html"
|
|
7
|
+
- "**/*.css"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Surface is the only way an element gets a background, border, radius, or
|
|
11
|
+
shadow. If a container needs visual treatment, it first needs a surface role.
|
|
12
|
+
|
|
13
|
+
The vocabulary is closed: role, padding, radius, border, and elevation. These
|
|
14
|
+
axes create enough range for page flow, cards, popovers, muted blocks,
|
|
15
|
+
accents, and dark moments without inventing one-off boxes.
|
|
16
|
+
|
|
17
|
+
The default surface is flat: no border, no shadow. We do not outline
|
|
18
|
+
everything to prove layout exists.
|
|
19
|
+
|
|
20
|
+
The elevation tiers are exactly three: card, popover, modal. Elevation
|
|
21
|
+
implies hierarchy — a card sits in the document flow, a popover floats above
|
|
22
|
+
the flow, a modal interrupts the task. Pick the tier that matches the
|
|
23
|
+
interaction; never write a custom shadow because the composition feels flat,
|
|
24
|
+
and never pair a low tier with an interrupting role or give a routine card
|
|
25
|
+
modal gravity. Component shadows belong to the primitives that own them;
|
|
26
|
+
never borrow them for layout.
|
|
27
|
+
|
|
28
|
+
Borders are structural, especially for inputs and overlays. They are not
|
|
29
|
+
decorative frames around ordinary text — reject borders as decoration,
|
|
30
|
+
especially around assistant text, and use space, tone, and type hierarchy
|
|
31
|
+
instead.
|
|
32
|
+
|
|
33
|
+
The overlay reference shows the interrupting end of the system: background
|
|
34
|
+
scrim, modal radius, modal shadow, compact header, clear footer. Copy its
|
|
35
|
+
hierarchy when a user must stop and decide.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Always read first: Vessel's design language as a raw HTML/CSS steering packet for agents."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/tokens.css
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
vessel-light is Vessel without the React package: the design language as a
|
|
8
|
+
steering packet for agents writing raw HTML and CSS.
|
|
9
|
+
|
|
10
|
+
The contract is narrow. Style only with the tokens. Compose only with the
|
|
11
|
+
closed sets the grammar enumerates. Imitate the refs when the task matches —
|
|
12
|
+
worked examples to copy from, not a framework to import.
|
|
13
|
+
|
|
14
|
+
Grammar and the median floor are safe verbatim, unchanged by any adaptation.
|
|
15
|
+
Signature nodes state Vessel's current answer and stand until you replace
|
|
16
|
+
them. Registers — editorial, email, and data-density — name the situations
|
|
17
|
+
where parts of the default contract invert; pull only the nodes whose
|
|
18
|
+
conditions match the task, because truths from the wrong register are
|
|
19
|
+
poison, not context.
|
|
20
|
+
|
|
21
|
+
Monochrome comes first. Status color is functional language — danger,
|
|
22
|
+
success, warning, information — never atmosphere. Atmosphere is catered: a
|
|
23
|
+
five-hue expression palette whose volume rises with the register, from
|
|
24
|
+
charts-only in product to two hues in editorial, and never on controls.
|
|
25
|
+
|
|
26
|
+
It protects the taste that disappears when an agent freehands: quiet
|
|
27
|
+
surfaces, deliberate spacing, one obvious action, restrained motion.
|
|
28
|
+
|
|
29
|
+
Name the reader's job before composing anything — the job picks the ref and
|
|
30
|
+
the register, never the topic. When a requested UI is not covered by a ref,
|
|
31
|
+
compose from the grammar; do not invent a new styling system. Before
|
|
32
|
+
anything ships, run the deletion pass: every element names what breaks if
|
|
33
|
+
it goes, and the view arrives settled.
|