@design-intelligence/ghost 0.29.0 → 0.31.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 +2 -2
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/command-discovery.d.ts.map +1 -1
- package/dist/commands/command-discovery.js +10 -3
- package/dist/commands/command-discovery.js.map +1 -1
- package/dist/commands/gather-command.js +5 -5
- 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 +2 -2
- 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 +8 -7
- package/dist/commands/pull-command.js.map +1 -1
- package/dist/commands/review-command.d.ts.map +1 -1
- package/dist/commands/review-command.js +1 -2
- package/dist/commands/review-command.js.map +1 -1
- package/dist/commands/stats-command.d.ts +3 -0
- package/dist/commands/stats-command.d.ts.map +1 -0
- package/dist/commands/{pulse-command.js → stats-command.js} +59 -39
- package/dist/commands/stats-command.js.map +1 -0
- package/dist/commands/stats-observations.d.ts +10 -0
- package/dist/commands/stats-observations.d.ts.map +1 -0
- package/dist/commands/stats-observations.js +47 -0
- package/dist/commands/stats-observations.js.map +1 -0
- package/dist/embed/gather.d.ts.map +1 -1
- package/dist/embed/gather.js +3 -4
- package/dist/embed/gather.js.map +1 -1
- package/dist/embed/pull.d.ts.map +1 -1
- package/dist/embed/pull.js +1 -3
- package/dist/embed/pull.js.map +1 -1
- package/dist/embed/types.d.ts +2 -6
- package/dist/embed/types.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.js +1 -5
- package/dist/ghost-core/catalog/assemble.js.map +1 -1
- package/dist/ghost-core/catalog/closest.d.ts +1 -1
- package/dist/ghost-core/catalog/closest.js +1 -1
- package/dist/ghost-core/catalog/menu.d.ts +7 -9
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
- package/dist/ghost-core/catalog/menu.js +4 -6
- package/dist/ghost-core/catalog/menu.js.map +1 -1
- package/dist/ghost-core/catalog/types.d.ts +2 -6
- package/dist/ghost-core/catalog/types.d.ts.map +1 -1
- package/dist/ghost-core/node/schema.d.ts +4 -4
- package/dist/ghost-core/node/schema.d.ts.map +1 -1
- package/dist/ghost-core/node/schema.js +10 -4
- package/dist/ghost-core/node/schema.js.map +1 -1
- package/dist/ghost-core/node/serialize.d.ts +5 -7
- package/dist/ghost-core/node/serialize.d.ts.map +1 -1
- package/dist/ghost-core/node/serialize.js +9 -18
- package/dist/ghost-core/node/serialize.js.map +1 -1
- package/dist/ghost-core/node/types.d.ts +5 -7
- package/dist/ghost-core/node/types.d.ts.map +1 -1
- package/dist/init-payloads/median/median-tells.md +27 -26
- package/dist/init-payloads/{vessel-light/anti-goal.median.md → median/standard.model-defaults.md} +8 -4
- package/dist/init-payloads/skeleton/brand.md +8 -4
- package/dist/init-payloads/skeleton/context.conversation.md +23 -14
- package/dist/init-payloads/skeleton/foundation.color.md +37 -29
- package/dist/init-payloads/skeleton/foundation.composition.md +18 -16
- package/dist/init-payloads/skeleton/foundation.controls.md +21 -13
- package/dist/init-payloads/skeleton/foundation.layout.md +33 -29
- package/dist/init-payloads/skeleton/foundation.motion.md +23 -17
- package/dist/init-payloads/skeleton/foundation.type.md +36 -29
- package/dist/init-payloads/skeleton/foundation.voice.md +17 -12
- package/dist/init-payloads/skeleton/glossary.md +33 -21
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +2 -2
- package/dist/init-payloads/vessel-light/checks/median-tells.md +25 -25
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +2 -2
- package/dist/init-payloads/vessel-light/checks/relationships.md +4 -4
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +9 -9
- package/dist/init-payloads/vessel-light/checks/values.md +6 -6
- package/dist/init-payloads/vessel-light/context.conversation.md +53 -0
- package/dist/init-payloads/vessel-light/context.data-density.md +51 -0
- package/dist/init-payloads/vessel-light/context.editorial.md +53 -0
- package/dist/init-payloads/vessel-light/context.email.md +53 -0
- package/dist/init-payloads/vessel-light/foundation.color-roles.md +41 -0
- package/dist/init-payloads/vessel-light/foundation.deletion.md +53 -0
- package/dist/init-payloads/vessel-light/foundation.hierarchy.md +73 -0
- package/dist/init-payloads/vessel-light/foundation.job.md +65 -0
- package/dist/init-payloads/vessel-light/foundation.motion.md +46 -0
- package/dist/init-payloads/vessel-light/foundation.palette.md +57 -0
- package/dist/init-payloads/vessel-light/foundation.rhythm.md +39 -0
- package/dist/init-payloads/vessel-light/foundation.shape.md +39 -0
- package/dist/init-payloads/vessel-light/foundation.surfaces.md +45 -0
- package/dist/init-payloads/vessel-light/foundation.tells.md +39 -0
- package/dist/init-payloads/vessel-light/foundation.temperature.md +62 -0
- package/dist/init-payloads/vessel-light/{signature.type.md → foundation.type.md} +28 -13
- package/dist/init-payloads/vessel-light/glossary.md +27 -30
- package/dist/init-payloads/vessel-light/index.md +19 -16
- package/dist/init-payloads/{median/cliche.median.md → vessel-light/standard.model-defaults.md} +1 -1
- package/dist/observability-events.js +2 -2
- package/dist/review/baseline.d.ts +1 -1
- package/dist/review/baseline.d.ts.map +1 -1
- package/dist/review/baseline.js +2 -2
- package/dist/review/baseline.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 +6 -4
- package/dist/review/review-packet.js.map +1 -1
- package/dist/scan/check-scaffold.d.ts.map +1 -1
- package/dist/scan/check-scaffold.js +25 -3
- package/dist/scan/check-scaffold.js.map +1 -1
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-lint.js +9 -17
- package/dist/scan/fingerprint-package-lint.js.map +1 -1
- package/dist/scan/templates.js +4 -4
- package/dist/scan/templates.js.map +1 -1
- package/dist/skill-bundle/SKILL.md +28 -45
- package/dist/skill-bundle/references/authoring.md +7 -7
- package/dist/skill-bundle/references/ground.md +58 -0
- package/dist/skill-bundle/references/making.md +71 -103
- package/dist/skill-bundle/references/{concrete.md → materials.md} +2 -2
- package/dist/skill-bundle/references/nodes.md +39 -15
- package/dist/skill-bundle/references/schema.md +10 -6
- package/dist/skill-bundle/references/steering-audit.md +9 -15
- package/dist/untrusted-framing.d.ts +9 -0
- package/dist/untrusted-framing.d.ts.map +1 -0
- package/dist/untrusted-framing.js +15 -0
- package/dist/untrusted-framing.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/pulse-command.d.ts +0 -3
- package/dist/commands/pulse-command.d.ts.map +0 -1
- package/dist/commands/pulse-command.js.map +0 -1
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +0 -38
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +0 -28
- package/dist/init-payloads/vessel-light/grammar.conversation.md +0 -29
- package/dist/init-payloads/vessel-light/grammar.deletion.md +0 -35
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +0 -56
- package/dist/init-payloads/vessel-light/grammar.job.md +0 -54
- package/dist/init-payloads/vessel-light/grammar.motion.md +0 -25
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +0 -25
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +0 -33
- package/dist/init-payloads/vessel-light/register.data-density.md +0 -39
- package/dist/init-payloads/vessel-light/register.editorial.md +0 -41
- package/dist/init-payloads/vessel-light/register.email.md +0 -43
- package/dist/init-payloads/vessel-light/signature.palette.md +0 -45
- package/dist/init-payloads/vessel-light/signature.shape.md +0 -27
- package/dist/init-payloads/vessel-light/signature.temperature.md +0 -44
- package/dist/skill-bundle/references/brief.md +0 -50
- package/dist/skill-bundle/references/recall.md +0 -36
- package/dist/skill-bundle/references/self-check.md +0 -64
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Any view containing text or actions.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/primitives.css
|
|
5
|
-
- materials/examples/composition.form.html
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Hierarchy is a closed vocabulary, not a size slider. Every piece of text and
|
|
9
|
-
every control picks from a named set; anything outside the set is a broken
|
|
10
|
-
primitive, not a variant.
|
|
11
|
-
|
|
12
|
-
The text variants are exactly six: display, headline, title, body, label,
|
|
13
|
-
mono. Variant names are jobs, not decoration. Display leads a rare editorial
|
|
14
|
-
moment. Headline names a section. Title anchors a card, dialog, or compact
|
|
15
|
-
region. Body carries reading. Label names structure — category tags, field
|
|
16
|
-
labels, bylines, metadata, compact status. Mono carries code and machine
|
|
17
|
-
detail. Do not fake hierarchy with arbitrary font sizes; choose the tier that
|
|
18
|
-
matches the job, then use tone, weight, and spacing for the rest.
|
|
19
|
-
|
|
20
|
-
The tones are exactly seven: default, muted, inverse, success, warning, info,
|
|
21
|
-
destructive. Tone is part of the message. Default is the main reading plane.
|
|
22
|
-
Muted carries secondary information. Inverse is for dark or primary surfaces.
|
|
23
|
-
The four status tones appear only when the words have that state meaning.
|
|
24
|
-
Hierarchy starts with tone and weight before size — a secondary note usually
|
|
25
|
-
wants muted body or label, not a smaller custom font. If the prose needs
|
|
26
|
-
emphasis, improve the sentence before adding a style.
|
|
27
|
-
|
|
28
|
-
The control emphasis ladder is exactly five rungs: primary, secondary,
|
|
29
|
-
outline, ghost, link. At most one primary action per view is the rule
|
|
30
|
-
(`--primary-budget: 1`); everything else steps down the ladder. Primary is
|
|
31
|
-
for the action the screen exists to complete — if two buttons both look
|
|
32
|
-
primary, the hierarchy failed. And some views honestly earn none: a steady
|
|
33
|
-
status view or an open comparison has no action the screen exists to
|
|
34
|
-
complete, and promoting one anyway puts the system's thumb on the scale.
|
|
35
|
-
Zero is a valid spend.
|
|
36
|
-
Destructive is a meaning, not a rung: it is rare, it names the destructive
|
|
37
|
-
act directly, and it is never borrowed for urgency, emphasis, or brand heat.
|
|
38
|
-
|
|
39
|
-
Fields are quiet until they are active: hairline border, muted placeholder,
|
|
40
|
-
clear label, and a focused ring when the user engages. The focus ring is
|
|
41
|
-
guidance, not decoration. Errors state facts next to the field that caused
|
|
42
|
-
them — do not hide field errors in modals, toasts, or generic banners when
|
|
43
|
-
the user needs to fix one input.
|
|
44
|
-
|
|
45
|
-
Figures that will be compared or scanned — amounts, counts, dates in
|
|
46
|
-
columns, any metric — set in tabular numerals (`--numeric-tabular`), with
|
|
47
|
-
the unit tight to the number. Proportional figures in a data column wobble,
|
|
48
|
-
and a wobbling column reads as sloppy arithmetic. Mono already carries this
|
|
49
|
-
for machine detail; the rule extends to any numeric data in product UI.
|
|
50
|
-
|
|
51
|
-
Balanced text is for headings and compact statements. Do not balance long
|
|
52
|
-
body copy into jagged reading.
|
|
53
|
-
|
|
54
|
-
The form reference shows the intended decision order: stacked labels and
|
|
55
|
-
fields, compact helper text, one submit, secondary escape. Copy the decision
|
|
56
|
-
order before adjusting surface detail.
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Any new view before its structure or register is chosen.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/examples/composition.form.html
|
|
5
|
-
- materials/examples/composition.table.html
|
|
6
|
-
- materials/examples/composition.editorial.html
|
|
7
|
-
- materials/examples/composition.overlay.html
|
|
8
|
-
- materials/examples/composition.conversation.html
|
|
9
|
-
- materials/examples/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 example. Stacked labels and fields, one submit, secondary escape.
|
|
23
|
-
- **Scan and compare records** — lists, audits, anything with rows and
|
|
24
|
-
figures → the table example, in the data-density register.
|
|
25
|
-
- **Read a narrative** — a landing page, an announcement, a story → the
|
|
26
|
-
editorial example, in the editorial register.
|
|
27
|
-
- **Stop and decide** — a confirmation, a destructive act, a choice that
|
|
28
|
-
interrupts the task → the overlay example. The decision is the view.
|
|
29
|
-
- **Converse with the system** — an AI thread, an agent console, a prompt
|
|
30
|
-
composer → the conversation example.
|
|
31
|
-
- **Be notified elsewhere** — receipts, alerts, anything that lands in an
|
|
32
|
-
inbox → the email example, 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 example.
|
|
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.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Any transition, animation, or hover treatment.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/tokens.css
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Motion is evidence of a state change. It confirms hover, press, reveal,
|
|
8
|
-
collapse, entrance, exit, and spatial movement. It does not entertain.
|
|
9
|
-
|
|
10
|
-
The entire vocabulary is three duration roles and one ease. Fast is for hover
|
|
11
|
-
and press. Normal is for reveals, fades, and small state changes. Slow is
|
|
12
|
-
reserved for spatial transitions where the user needs to understand movement.
|
|
13
|
-
Do not introduce novelty easings because a surface feels static; the ease's
|
|
14
|
-
character is a brand answer — see the temperature signature.
|
|
15
|
-
|
|
16
|
-
Nothing loops except explicit loading states. A spinner may continue because
|
|
17
|
-
work continues. Decorative pulsing, floating, glowing, and attention-seeking
|
|
18
|
-
keyframes are off-language.
|
|
19
|
-
|
|
20
|
-
Prefer opacity and small transform changes. If removing an animation does not
|
|
21
|
-
reduce comprehension, the animation was decoration.
|
|
22
|
-
|
|
23
|
-
Condition: marketing and editorial surfaces may stage entrances — scroll reveals and
|
|
24
|
-
section transitions are part of editorial rhythm, still built from the three
|
|
25
|
-
durations and the one ease. In product UI the same staging is decoration.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Laying out any view.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/primitives.css
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
All layout is stacks. Rhythm comes from relationships between siblings, not
|
|
8
|
-
from isolated margins pasted onto whichever element was last touched.
|
|
9
|
-
|
|
10
|
-
The gap steps are exactly five: `--gap-xs`, `--gap-sm`, `--gap-md`,
|
|
11
|
-
`--gap-lg`, `--gap-xl`. Choose the gap that states the relationship. Do not
|
|
12
|
-
tune by single pixels to make a screenshot pass.
|
|
13
|
-
|
|
14
|
-
The default is column, medium gap, stretch alignment, start justification.
|
|
15
|
-
That is the ordinary reading rhythm.
|
|
16
|
-
|
|
17
|
-
Columns are for almost everything: forms, cards, message lists, modal bodies,
|
|
18
|
-
settings, empty states, and page sections. A column lets the user scan.
|
|
19
|
-
|
|
20
|
-
Rows are conditional. Use them for controls, metadata lines, compact status,
|
|
21
|
-
and paired label/value moments. If a row starts wrapping awkwardly, it
|
|
22
|
-
probably wanted to be a column.
|
|
23
|
-
|
|
24
|
-
Ad-hoc margins between siblings are forbidden because they hide the rhythm.
|
|
25
|
-
When spacing feels wrong, change the stack gap or split the stack.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Any card, popover, modal, dialog, scrim, or bordered container.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/primitives.css
|
|
5
|
-
- materials/examples/composition.overlay.html
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Surface is the only way an element gets a background, border, radius, or
|
|
9
|
-
shadow. If a container needs visual treatment, it first needs a surface role.
|
|
10
|
-
|
|
11
|
-
The vocabulary is closed: role, padding, radius, border, and elevation. These
|
|
12
|
-
axes create enough range for page flow, cards, popovers, muted blocks,
|
|
13
|
-
accents, and dark moments without inventing one-off boxes.
|
|
14
|
-
|
|
15
|
-
The default surface is flat: no border, no shadow. We do not outline
|
|
16
|
-
everything to prove layout exists.
|
|
17
|
-
|
|
18
|
-
The elevation tiers are exactly three: card, popover, modal. Elevation
|
|
19
|
-
implies hierarchy — a card sits in the document flow, a popover floats above
|
|
20
|
-
the flow, a modal interrupts the task. Pick the tier that matches the
|
|
21
|
-
interaction; never write a custom shadow because the composition feels flat,
|
|
22
|
-
and never pair a low tier with an interrupting role or give a routine card
|
|
23
|
-
modal gravity. Component shadows belong to the primitives that own them;
|
|
24
|
-
never borrow them for layout.
|
|
25
|
-
|
|
26
|
-
Borders are structural, especially for inputs and overlays. They are not
|
|
27
|
-
decorative frames around ordinary text — reject borders as decoration,
|
|
28
|
-
especially around assistant text, and use space, tone, and type hierarchy
|
|
29
|
-
instead.
|
|
30
|
-
|
|
31
|
-
The overlay reference shows the interrupting end of the system: background
|
|
32
|
-
scrim, modal radius, modal shadow, compact header, clear footer. Copy its
|
|
33
|
-
hierarchy when a user must stop and decide.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Tables, dashboards, logs, monitoring, or other data-dense consoles.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/examples/composition.table.html
|
|
5
|
-
- materials/primitives.css
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Condition: this node applies to data-dense surfaces — tables, dashboards,
|
|
9
|
-
transaction logs, and admin consoles.
|
|
10
|
-
|
|
11
|
-
Data density inverts the settings-page rhythm. Operators need scan speed
|
|
12
|
-
before they need breathing room.
|
|
13
|
-
|
|
14
|
-
Use the two smallest gap steps (`--gap-xs`, `--gap-sm`) where forms use the
|
|
15
|
-
medium step. Tight adjacency is meaning when rows compare against rows.
|
|
16
|
-
|
|
17
|
-
Numerals are mono so columns align. A ragged amount column is a broken
|
|
18
|
-
instrument.
|
|
19
|
-
|
|
20
|
-
Hierarchy is muted-first. Data is the default plane, labels are muted, and
|
|
21
|
-
emphasis is rare enough to stay useful.
|
|
22
|
-
|
|
23
|
-
Data surfaces take the small radius. A surface-radius table cell is costume —
|
|
24
|
-
the signature radius (see signature.shape) belongs on cards, not cells.
|
|
25
|
-
|
|
26
|
-
Status is a text label with at most one functional color family per view.
|
|
27
|
-
|
|
28
|
-
Charts inside a console follow the product carve-out from the palette
|
|
29
|
-
signature: expression hues live inside the plot area only. Outside the plot,
|
|
30
|
-
the one-status-hue cap holds — chart color never leaks into rows, badges, or
|
|
31
|
-
headers. More status color turns monitoring into confetti.
|
|
32
|
-
|
|
33
|
-
No zebra striping. Hairline borders carry rows with less noise and more
|
|
34
|
-
trust.
|
|
35
|
-
|
|
36
|
-
Hover confirmation uses the fast duration. It should acknowledge targeting,
|
|
37
|
-
not animate the table.
|
|
38
|
-
|
|
39
|
-
Generous whitespace is drift here. Wasted density makes operators scroll.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Heroes, marketing pages, pull quotes, or full-bleed dark moments.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/examples/composition.editorial.html
|
|
5
|
-
- materials/tokens.css
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Condition: this node applies to marketing, landing, and editorial surfaces —
|
|
9
|
-
never to product UI.
|
|
10
|
-
|
|
11
|
-
Editorial surfaces invert the product type rules. Display scale is not an
|
|
12
|
-
indulgence here; it is the job.
|
|
13
|
-
|
|
14
|
-
Use the `--heading-display-*` tokens — size, line height, and weight — when
|
|
15
|
-
the words are the composition. The display tier belongs to this register (see
|
|
16
|
-
signature.type for the scale's character).
|
|
17
|
-
|
|
18
|
-
Section rhythm uses `--section-padding-vertical`, not a product stack
|
|
19
|
-
stretched until it looks important.
|
|
20
|
-
|
|
21
|
-
The sanctioned dramatic moment is the full-bleed dark section. Use the
|
|
22
|
-
`--surface-dark-*` family and let contrast carry the scene.
|
|
23
|
-
|
|
24
|
-
Pull quotes are visual punctuation for longform. They interrupt reading with
|
|
25
|
-
judgment, not decoration.
|
|
26
|
-
|
|
27
|
-
The tracked uppercase label is the kicker grammar. It gives the page a hard
|
|
28
|
-
editorial edge before the headline lands.
|
|
29
|
-
|
|
30
|
-
Monochrome remains the spine, but editorial is the loud end of the expression
|
|
31
|
-
ladder (see signature.palette): up to two expression hues per page as
|
|
32
|
-
atmosphere — a tinted dark section, a colored pull-quote accent, a duotone
|
|
33
|
-
image moment. Commit to few colors at scale; variety is where expression
|
|
34
|
-
collapses into decoration.
|
|
35
|
-
|
|
36
|
-
There is one primary action per page, and it keeps the control radius from
|
|
37
|
-
signature.shape. Editorial confidence does not excuse competing calls to
|
|
38
|
-
action.
|
|
39
|
-
|
|
40
|
-
A hero built at product scale reads as timid. Timidity is drift here, exactly
|
|
41
|
-
as spectacle is drift in product UI.
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Transactional email only.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/examples/email.html
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Condition: this node applies only to email. In any other medium, everything
|
|
8
|
-
below is a violation.
|
|
9
|
-
|
|
10
|
-
Email clients do not honor the web contract. Custom properties, external
|
|
11
|
-
stylesheets, flex layout, and webfonts are unreliable materials here.
|
|
12
|
-
|
|
13
|
-
Email inverts the material contract deliberately. Transcribe token values by
|
|
14
|
-
hand instead of referencing tokens — every hex below is a transcription of
|
|
15
|
-
`materials/tokens.css`, which stays the single source; if a token changes,
|
|
16
|
-
re-transcribe.
|
|
17
|
-
|
|
18
|
-
Use `#1a1a1a` (`--color-gray-900`, foreground) for text, `#999999`
|
|
19
|
-
(`--color-gray-500`, muted) for muted text, and `#e8e8e8` (`--color-gray-200`,
|
|
20
|
-
border) for borders when the email needs the Vessel palette.
|
|
21
|
-
|
|
22
|
-
Keep the surface radius on cards and the control radius on buttons (see
|
|
23
|
-
signature.shape). The values survive even when the token names cannot travel.
|
|
24
|
-
|
|
25
|
-
Build with table layout, a 600px wrapper, predictable cells, and bulletproof
|
|
26
|
-
buttons. Email fidelity is made from boring structure.
|
|
27
|
-
|
|
28
|
-
HK Grotesk falls back to the system stack. The voice must survive without the
|
|
29
|
-
font file.
|
|
30
|
-
|
|
31
|
-
The soul survives the body swap: monochrome spine, quiet factual copy, one
|
|
32
|
-
primary action, no celebration.
|
|
33
|
-
|
|
34
|
-
Email gets exactly one expressive moment: a header band or the figure that
|
|
35
|
-
matters, in one expression hue, transcribed by hand like every value here —
|
|
36
|
-
amber is `#f6b44a` (`--expression-1`). One moment, one hue. A receipt is
|
|
37
|
-
allowed one degree of warmth; it is not allowed a palette.
|
|
38
|
-
|
|
39
|
-
Do not add further color to compensate for email constraints. Constraint is
|
|
40
|
-
not permission to perform.
|
|
41
|
-
|
|
42
|
-
Hardcoding hex here is fidelity, not drift. The check exemption is the
|
|
43
|
-
condition itself.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Color beyond the base roles, in any register.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/tokens.css
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
This is Vessel's answer to palette — it stands until you replace it.
|
|
8
|
-
|
|
9
|
-
The relationship is fixed: one brand at different volumes. A monochrome spine
|
|
10
|
-
is the default atmosphere in every medium — calm, legible, and resistant to
|
|
11
|
-
novelty — and a closed expression set supplies the atmosphere, with volume
|
|
12
|
-
set by register, never by taste.
|
|
13
|
-
|
|
14
|
-
Vessel's current answer: the base palette is monochrome gray, and the
|
|
15
|
-
expression palette is five named hues and only these — amber
|
|
16
|
-
(`--expression-1`), periwinkle (`--expression-2`), clay (`--expression-3`),
|
|
17
|
-
orchid (`--expression-4`), sage (`--expression-5`). Expressive color outside
|
|
18
|
-
this set is not expression; it is another brand. An invented hue is not a
|
|
19
|
-
bolder Vessel; it is a different brand.
|
|
20
|
-
|
|
21
|
-
The volume ladder, by register:
|
|
22
|
-
|
|
23
|
-
Product UI: expression lives only in data visualization. A chart may use the
|
|
24
|
-
hues; the interface around it stays monochrome.
|
|
25
|
-
|
|
26
|
-
Data-dense consoles: one hue family may mark status. Nothing atmospheric.
|
|
27
|
-
Charts inside a console keep the product carve-out — hues stay inside the
|
|
28
|
-
plot area and never leak into rows, badges, or headers.
|
|
29
|
-
|
|
30
|
-
Email: exactly one expressive moment per message — a header band or the
|
|
31
|
-
figure that matters. One hue, quiet everywhere else.
|
|
32
|
-
|
|
33
|
-
Editorial: expression is sanctioned atmosphere — a tinted dark section, a
|
|
34
|
-
colored pull-quote accent, a duotone moment. Never more than two hues per
|
|
35
|
-
page. Loudness comes from commitment to few colors at scale, not variety.
|
|
36
|
-
|
|
37
|
-
Two constants that outrank the ladder: expression never touches what you
|
|
38
|
-
click — buttons, inputs, and links stay monochrome in every register — and
|
|
39
|
-
the status roles are not expression; they keep their meanings everywhere and
|
|
40
|
-
never moonlight as atmosphere.
|
|
41
|
-
|
|
42
|
-
To adapt: edit the `--expression-*` values (and the gray ramp, if the spine
|
|
43
|
-
changes) in `materials/tokens.css` and restate this node's current answer.
|
|
44
|
-
The ladder — a quiet spine, a closed hue set, register-gated volume — is the
|
|
45
|
-
part worth keeping.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Choosing or implementing any radius or corner treatment.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/tokens.css
|
|
5
|
-
- materials/primitives.css
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
This is Vessel's answer to shape — it stands until you replace it.
|
|
9
|
-
|
|
10
|
-
The relationship is fixed: controls and surfaces carry different radius
|
|
11
|
-
roles, and the two never swap. Buttons and text inputs use
|
|
12
|
-
`--radius-control`; cards and other surfaces use `--radius-surface`.
|
|
13
|
-
|
|
14
|
-
Vessel's current answer: controls are pills (`--radius-control: 999px`) and
|
|
15
|
-
surfaces take the 20px signature radius (`--radius-surface: 20px`). The pill
|
|
16
|
-
is Vessel's most visible control signature; a rectangular button is not a
|
|
17
|
-
variant, it is a different design system. Never give a button the surface
|
|
18
|
-
radius — a rectangular button is the fastest tell that the output is not
|
|
19
|
-
Vessel.
|
|
20
|
-
|
|
21
|
-
20px is a considered position: rounder than default shadcn, but not bubbly.
|
|
22
|
-
Use the radius system as restraint, not as decoration.
|
|
23
|
-
|
|
24
|
-
To adapt: edit the `--radius-control` and `--radius-surface` values in
|
|
25
|
-
`materials/tokens.css` and restate this node's current answer. The
|
|
26
|
-
role split — one radius for what you click, one for what contains — is the
|
|
27
|
-
part worth keeping.
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
context: Writing any copy or choosing the character of motion.
|
|
3
|
-
materials:
|
|
4
|
-
- materials/tokens.css
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
This is Vessel's answer to temperature — it stands until you replace it.
|
|
8
|
-
|
|
9
|
-
The relationship is fixed: voice and motion carry the same temperature. Copy
|
|
10
|
-
states what happened, what is possible, or what the user must decide — it
|
|
11
|
-
does not perform personality — and motion confirms rather than entertains.
|
|
12
|
-
|
|
13
|
-
Vessel's current answer in words: product UI is the default register —
|
|
14
|
-
factual, quiet, sentence case, and free of applause. No exclamation marks;
|
|
15
|
-
celebration is not reassurance. Confirmations are quiet: "Changes saved",
|
|
16
|
-
never "Awesome!" The system should sound reliable, not excited by basic
|
|
17
|
-
competence. Errors name the problem and the fix in the place where the user
|
|
18
|
-
can act; a vague failure banner is evasion. Buttons name the act — "Delete
|
|
19
|
-
account", "Save changes", "Invite member", not "Do it" or "Let's go".
|
|
20
|
-
Destructive copy is direct because the risk is direct; softening the verb
|
|
21
|
-
makes the interface less honest. Vessel never celebrates at the user. Trust
|
|
22
|
-
comes from precision, restraint, and naming the truth plainly.
|
|
23
|
-
|
|
24
|
-
The voice is a mechanical edit, not a mood — apply it as transformations:
|
|
25
|
-
"Sorry, nothing here yet!" → "Nothing yet". "Awesome, your changes have been
|
|
26
|
-
saved!" → "Changes saved". "Oops! Something went wrong" → "Payment failed —
|
|
27
|
-
card expired". "You might want to consider updating your billing info" →
|
|
28
|
-
"Update your billing info". Strip the apology, the applause, and the hedge;
|
|
29
|
-
keep the fact and the fix.
|
|
30
|
-
|
|
31
|
-
Vessel's current answer in motion: three durations — `--duration-fast`,
|
|
32
|
-
`--duration-normal`, `--duration-slow` — and one ease, `--ease-spring`, which
|
|
33
|
-
should feel resolved without feeling elastic. Hover confirms with color and
|
|
34
|
-
background shifts at the fast duration, not levitation.
|
|
35
|
-
|
|
36
|
-
Condition: editorial surfaces switch register. Short declarative confident
|
|
37
|
-
fragments are correct in heroes and section headings. That same editorial
|
|
38
|
-
confidence is wrong in a settings form — product copy serves the task before
|
|
39
|
-
it serves the voice. Email copy uses the product voice: factual, not
|
|
40
|
-
campaign-like.
|
|
41
|
-
|
|
42
|
-
To adapt: rewrite this node's current answers in your brand's voice and edit
|
|
43
|
-
the duration and ease values in `materials/tokens.css`. The coupling — words
|
|
44
|
-
and motion sharing one temperature — is the part worth keeping.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: brief
|
|
3
|
-
description: Build a compact pre-generation packet from pulled ghost guidance.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Recipe: Brief Work From ghost Package
|
|
7
|
-
|
|
8
|
-
A brief is an ephemeral steering packet for the generating pass. It is not a new
|
|
9
|
-
schema and is never written back into `.ghost/`.
|
|
10
|
-
|
|
11
|
-
1. Run `ghost gather <ask> --format json` and select against contexts.
|
|
12
|
-
2. The cover is already in context and outside selection. Pull every applicable
|
|
13
|
-
node with `ghost pull <id> [<id>…]`; skip nodes whose stated situation does
|
|
14
|
-
not apply. Topic overlap alone is not applicability.
|
|
15
|
-
3. Note gather payload labels where present: `materials`, substantial fenced
|
|
16
|
-
examples, or a `## Skeleton`. If there is no concrete material for this
|
|
17
|
-
surface, the readiness ceiling is **Yellow**.
|
|
18
|
-
4. If no node applies, name the package's silence, follow the cover silence
|
|
19
|
-
posture, and keep provisional reasoning separate from ghost-backed claims.
|
|
20
|
-
|
|
21
|
-
## The packet: five sections only
|
|
22
|
-
|
|
23
|
-
Return this shape:
|
|
24
|
-
|
|
25
|
-
```markdown
|
|
26
|
-
## Grounded in
|
|
27
|
-
- `node.id` — why it was selected
|
|
28
|
-
|
|
29
|
-
## Non-negotiables
|
|
30
|
-
- ≤5 lines, each cited to a node id
|
|
31
|
-
|
|
32
|
-
## Materials inline
|
|
33
|
-
- concrete locators, inlined snippets, inspect-pointers, and what to view/use
|
|
34
|
-
|
|
35
|
-
## Skeleton
|
|
36
|
-
- matching pulled Skeleton, or "none pulled"
|
|
37
|
-
|
|
38
|
-
## Silent / provisional
|
|
39
|
-
- what ghost does not cover and what local evidence carries
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Rules:
|
|
43
|
-
|
|
44
|
-
- Do not add sections for every kind. Sections dilute instruction weight.
|
|
45
|
-
- Treat `ghost pull` ordering as packet structure: stance first, concrete-material
|
|
46
|
-
nodes next, prose rules, Skeletons dead last.
|
|
47
|
-
- If a pulled Skeleton matches the surface, begin the artifact from it verbatim
|
|
48
|
-
before filling.
|
|
49
|
-
- Anti-goals are review-critical: state the positive replacement, not just the
|
|
50
|
-
rejected pattern.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: recall
|
|
3
|
-
description: Gather and pull the applicable ghost brand guidance for a task.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Recipe: Recall ghost Package
|
|
7
|
-
|
|
8
|
-
1. Run `ghost gather <ask>` for the actual task. The cover is inlined by gather;
|
|
9
|
-
do not pull it separately. Read the coverage line: all-prose packages are
|
|
10
|
-
weak steering.
|
|
11
|
-
2. Select against `context`; ghost never selects for you. Pull every node
|
|
12
|
-
whose stated situation applies and whose guidance, material, structure, or
|
|
13
|
-
refusal governs the work. Skip inapplicable nodes. Topic overlap alone is not
|
|
14
|
-
applicability.
|
|
15
|
-
3. Run `ghost pull <id> [<id>…]`. Prefer `pull` over reading files directly: it
|
|
16
|
-
orders the packet for steering, inlines small local materials, emits
|
|
17
|
-
inspect-pointers for binary materials, extracts Skeletons last, and logs the
|
|
18
|
-
pull to `.ghost/.events`.
|
|
19
|
-
|
|
20
|
-
## Read order = pull emission order
|
|
21
|
-
|
|
22
|
-
`ghost pull` emits selected nodes in steering order:
|
|
23
|
-
|
|
24
|
-
1. Cover first, when explicitly selected; normally it is already inlined by
|
|
25
|
-
gather and should not be pulled separately.
|
|
26
|
-
2. Concrete-material nodes: `materials`, substantial fenced examples, or
|
|
27
|
-
`## Skeleton` sections, with materials inlined or pointed to inspect.
|
|
28
|
-
3. Prose-only rules: principles, conditions, decisions, and other rules without
|
|
29
|
-
concrete material.
|
|
30
|
-
4. Skeleton fences dead last: if one matches the surface, start from that
|
|
31
|
-
structure verbatim.
|
|
32
|
-
|
|
33
|
-
Return the selected guidance with node ids, how each applies, and where the
|
|
34
|
-
package is silent. If no node applies, say so and do not invent ghost-backed
|
|
35
|
-
guidance. If silence is safe, proceed provisionally and label it;
|
|
36
|
-
if it is brand-defining or high-risk, ask or author a node first.
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: self-check
|
|
3
|
-
description: A pre-generation check that reveals whether you have actually gathered and reasoned about the brand guidance before you build.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Recipe: Self-Check Before Generating
|
|
7
|
-
|
|
8
|
-
Before writing UI, copy, email, or any output, check whether you are grounded in
|
|
9
|
-
the guidance or about to fall back on generic instincts. These questions test
|
|
10
|
-
your **grounding and provenance**, not the package's contents, so they hold
|
|
11
|
-
for any ghost package, however sparse, whatever the medium, whoever authored it.
|
|
12
|
-
|
|
13
|
-
Ask yourself:
|
|
14
|
-
|
|
15
|
-
1. **What did you gather?** Which ghost nodes did you pull for this task (from
|
|
16
|
-
`ghost gather`), and can you cite them by id? If you have not gathered, you
|
|
17
|
-
are not grounded. Gather first.
|
|
18
|
-
2. **What is ghost-backed vs. provisional?** For each claim you are about to
|
|
19
|
-
encode, is it backed by a gathered node (cite the id), or is it your own
|
|
20
|
-
provisional local reasoning? You must be able to label every claim as one or
|
|
21
|
-
the other.
|
|
22
|
-
3. **Do the conditions apply?** For each conditional node you pulled, does its
|
|
23
|
-
stated situation actually hold for this task? For each kind with conditional
|
|
24
|
-
or scoped meaning **per the glossary**, apply it only when its stated
|
|
25
|
-
situation holds; do not apply it where it does not, and do not ignore it
|
|
26
|
-
where it does.
|
|
27
|
-
4. **Where is the package silent?** What does the package not cover for
|
|
28
|
-
your task, and what will carry the reasoning in those gaps? Naming the silence
|
|
29
|
-
is part of being grounded; pretending coverage you do not have is not.
|
|
30
|
-
|
|
31
|
-
## Steering readiness
|
|
32
|
-
|
|
33
|
-
Before generating, can you cite:
|
|
34
|
-
|
|
35
|
-
- the governing principle, stance, or tradeoff?
|
|
36
|
-
- the concrete materials, if exactness matters?
|
|
37
|
-
- the applicable pattern, if structure matters?
|
|
38
|
-
- the anti-goal that blocks the generic version?
|
|
39
|
-
- the hard invariants?
|
|
40
|
-
- the conditions that apply or do not apply?
|
|
41
|
-
- any decision trace for ambiguous tradeoffs?
|
|
42
|
-
- where the package is silent?
|
|
43
|
-
|
|
44
|
-
Classify readiness:
|
|
45
|
-
|
|
46
|
-
- **Green:** enough ghost-backed guidance and concrete material for this surface
|
|
47
|
-
to generate.
|
|
48
|
-
- **Yellow:** generation is safe, but some reasoning must be labeled
|
|
49
|
-
provisional; if there is no concrete material for this surface, readiness is
|
|
50
|
-
at most Yellow.
|
|
51
|
-
- **Red:** missing brand-defining, high-risk, or irreversible guidance; ask a
|
|
52
|
-
human or author a node first.
|
|
53
|
-
|
|
54
|
-
When you cannot answer the grounding questions:
|
|
55
|
-
|
|
56
|
-
1. Run `ghost gather <ask>` to emit the menu for the actual task, then match the
|
|
57
|
-
work to nodes by their contexts.
|
|
58
|
-
2. Read the selected nodes' bodies and re-ask the questions, citing node ids.
|
|
59
|
-
|
|
60
|
-
A genuinely silent package is an expected state, not a blocker. When it does
|
|
61
|
-
not cover the task, say so plainly and proceed with provisional local reasoning
|
|
62
|
-
when safe; label it non-ghost-backed. If the package's cover declares a stricter
|
|
63
|
-
silence posture, honor it over this default. Ask a human before
|
|
64
|
-
high-risk or brand-defining choices.
|