@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.
Files changed (142) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +2 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/command-discovery.d.ts.map +1 -1
  5. package/dist/commands/command-discovery.js +10 -3
  6. package/dist/commands/command-discovery.js.map +1 -1
  7. package/dist/commands/gather-command.js +5 -5
  8. package/dist/commands/gather-command.js.map +1 -1
  9. package/dist/commands/init-command.d.ts.map +1 -1
  10. package/dist/commands/init-command.js +2 -2
  11. package/dist/commands/init-command.js.map +1 -1
  12. package/dist/commands/pull-command.d.ts.map +1 -1
  13. package/dist/commands/pull-command.js +8 -7
  14. package/dist/commands/pull-command.js.map +1 -1
  15. package/dist/commands/review-command.d.ts.map +1 -1
  16. package/dist/commands/review-command.js +1 -2
  17. package/dist/commands/review-command.js.map +1 -1
  18. package/dist/commands/stats-command.d.ts +3 -0
  19. package/dist/commands/stats-command.d.ts.map +1 -0
  20. package/dist/commands/{pulse-command.js → stats-command.js} +59 -39
  21. package/dist/commands/stats-command.js.map +1 -0
  22. package/dist/commands/stats-observations.d.ts +10 -0
  23. package/dist/commands/stats-observations.d.ts.map +1 -0
  24. package/dist/commands/stats-observations.js +47 -0
  25. package/dist/commands/stats-observations.js.map +1 -0
  26. package/dist/embed/gather.d.ts.map +1 -1
  27. package/dist/embed/gather.js +3 -4
  28. package/dist/embed/gather.js.map +1 -1
  29. package/dist/embed/pull.d.ts.map +1 -1
  30. package/dist/embed/pull.js +1 -3
  31. package/dist/embed/pull.js.map +1 -1
  32. package/dist/embed/types.d.ts +2 -6
  33. package/dist/embed/types.d.ts.map +1 -1
  34. package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
  35. package/dist/ghost-core/catalog/assemble.js +1 -5
  36. package/dist/ghost-core/catalog/assemble.js.map +1 -1
  37. package/dist/ghost-core/catalog/closest.d.ts +1 -1
  38. package/dist/ghost-core/catalog/closest.js +1 -1
  39. package/dist/ghost-core/catalog/menu.d.ts +7 -9
  40. package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
  41. package/dist/ghost-core/catalog/menu.js +4 -6
  42. package/dist/ghost-core/catalog/menu.js.map +1 -1
  43. package/dist/ghost-core/catalog/types.d.ts +2 -6
  44. package/dist/ghost-core/catalog/types.d.ts.map +1 -1
  45. package/dist/ghost-core/node/schema.d.ts +4 -4
  46. package/dist/ghost-core/node/schema.d.ts.map +1 -1
  47. package/dist/ghost-core/node/schema.js +10 -4
  48. package/dist/ghost-core/node/schema.js.map +1 -1
  49. package/dist/ghost-core/node/serialize.d.ts +5 -7
  50. package/dist/ghost-core/node/serialize.d.ts.map +1 -1
  51. package/dist/ghost-core/node/serialize.js +9 -18
  52. package/dist/ghost-core/node/serialize.js.map +1 -1
  53. package/dist/ghost-core/node/types.d.ts +5 -7
  54. package/dist/ghost-core/node/types.d.ts.map +1 -1
  55. package/dist/init-payloads/median/median-tells.md +27 -26
  56. package/dist/init-payloads/{vessel-light/anti-goal.median.md → median/standard.model-defaults.md} +8 -4
  57. package/dist/init-payloads/skeleton/brand.md +8 -4
  58. package/dist/init-payloads/skeleton/context.conversation.md +23 -14
  59. package/dist/init-payloads/skeleton/foundation.color.md +37 -29
  60. package/dist/init-payloads/skeleton/foundation.composition.md +18 -16
  61. package/dist/init-payloads/skeleton/foundation.controls.md +21 -13
  62. package/dist/init-payloads/skeleton/foundation.layout.md +33 -29
  63. package/dist/init-payloads/skeleton/foundation.motion.md +23 -17
  64. package/dist/init-payloads/skeleton/foundation.type.md +36 -29
  65. package/dist/init-payloads/skeleton/foundation.voice.md +17 -12
  66. package/dist/init-payloads/skeleton/glossary.md +33 -21
  67. package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +2 -2
  68. package/dist/init-payloads/vessel-light/checks/median-tells.md +25 -25
  69. package/dist/init-payloads/vessel-light/checks/motion-restraint.md +2 -2
  70. package/dist/init-payloads/vessel-light/checks/relationships.md +4 -4
  71. package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +9 -9
  72. package/dist/init-payloads/vessel-light/checks/values.md +6 -6
  73. package/dist/init-payloads/vessel-light/context.conversation.md +53 -0
  74. package/dist/init-payloads/vessel-light/context.data-density.md +51 -0
  75. package/dist/init-payloads/vessel-light/context.editorial.md +53 -0
  76. package/dist/init-payloads/vessel-light/context.email.md +53 -0
  77. package/dist/init-payloads/vessel-light/foundation.color-roles.md +41 -0
  78. package/dist/init-payloads/vessel-light/foundation.deletion.md +53 -0
  79. package/dist/init-payloads/vessel-light/foundation.hierarchy.md +73 -0
  80. package/dist/init-payloads/vessel-light/foundation.job.md +65 -0
  81. package/dist/init-payloads/vessel-light/foundation.motion.md +46 -0
  82. package/dist/init-payloads/vessel-light/foundation.palette.md +57 -0
  83. package/dist/init-payloads/vessel-light/foundation.rhythm.md +39 -0
  84. package/dist/init-payloads/vessel-light/foundation.shape.md +39 -0
  85. package/dist/init-payloads/vessel-light/foundation.surfaces.md +45 -0
  86. package/dist/init-payloads/vessel-light/foundation.tells.md +39 -0
  87. package/dist/init-payloads/vessel-light/foundation.temperature.md +62 -0
  88. package/dist/init-payloads/vessel-light/{signature.type.md → foundation.type.md} +28 -13
  89. package/dist/init-payloads/vessel-light/glossary.md +27 -30
  90. package/dist/init-payloads/vessel-light/index.md +19 -16
  91. package/dist/init-payloads/{median/cliche.median.md → vessel-light/standard.model-defaults.md} +1 -1
  92. package/dist/observability-events.js +2 -2
  93. package/dist/review/baseline.d.ts +1 -1
  94. package/dist/review/baseline.d.ts.map +1 -1
  95. package/dist/review/baseline.js +2 -2
  96. package/dist/review/baseline.js.map +1 -1
  97. package/dist/review/review-packet.d.ts +2 -1
  98. package/dist/review/review-packet.d.ts.map +1 -1
  99. package/dist/review/review-packet.js +6 -4
  100. package/dist/review/review-packet.js.map +1 -1
  101. package/dist/scan/check-scaffold.d.ts.map +1 -1
  102. package/dist/scan/check-scaffold.js +25 -3
  103. package/dist/scan/check-scaffold.js.map +1 -1
  104. package/dist/scan/fingerprint-package-lint.d.ts.map +1 -1
  105. package/dist/scan/fingerprint-package-lint.js +9 -17
  106. package/dist/scan/fingerprint-package-lint.js.map +1 -1
  107. package/dist/scan/templates.js +4 -4
  108. package/dist/scan/templates.js.map +1 -1
  109. package/dist/skill-bundle/SKILL.md +28 -45
  110. package/dist/skill-bundle/references/authoring.md +7 -7
  111. package/dist/skill-bundle/references/ground.md +58 -0
  112. package/dist/skill-bundle/references/making.md +71 -103
  113. package/dist/skill-bundle/references/{concrete.md → materials.md} +2 -2
  114. package/dist/skill-bundle/references/nodes.md +39 -15
  115. package/dist/skill-bundle/references/schema.md +10 -6
  116. package/dist/skill-bundle/references/steering-audit.md +9 -15
  117. package/dist/untrusted-framing.d.ts +9 -0
  118. package/dist/untrusted-framing.d.ts.map +1 -0
  119. package/dist/untrusted-framing.js +15 -0
  120. package/dist/untrusted-framing.js.map +1 -0
  121. package/package.json +1 -1
  122. package/dist/commands/pulse-command.d.ts +0 -3
  123. package/dist/commands/pulse-command.d.ts.map +0 -1
  124. package/dist/commands/pulse-command.js.map +0 -1
  125. package/dist/init-payloads/vessel-light/anti-goal.tells.md +0 -38
  126. package/dist/init-payloads/vessel-light/grammar.color-roles.md +0 -28
  127. package/dist/init-payloads/vessel-light/grammar.conversation.md +0 -29
  128. package/dist/init-payloads/vessel-light/grammar.deletion.md +0 -35
  129. package/dist/init-payloads/vessel-light/grammar.hierarchy.md +0 -56
  130. package/dist/init-payloads/vessel-light/grammar.job.md +0 -54
  131. package/dist/init-payloads/vessel-light/grammar.motion.md +0 -25
  132. package/dist/init-payloads/vessel-light/grammar.rhythm.md +0 -25
  133. package/dist/init-payloads/vessel-light/grammar.surfaces.md +0 -33
  134. package/dist/init-payloads/vessel-light/register.data-density.md +0 -39
  135. package/dist/init-payloads/vessel-light/register.editorial.md +0 -41
  136. package/dist/init-payloads/vessel-light/register.email.md +0 -43
  137. package/dist/init-payloads/vessel-light/signature.palette.md +0 -45
  138. package/dist/init-payloads/vessel-light/signature.shape.md +0 -27
  139. package/dist/init-payloads/vessel-light/signature.temperature.md +0 -44
  140. package/dist/skill-bundle/references/brief.md +0 -50
  141. package/dist/skill-bundle/references/recall.md +0 -36
  142. package/dist/skill-bundle/references/self-check.md +0 -64
@@ -0,0 +1,46 @@
1
+ ---
2
+ for: Any transition, animation, or hover treatment.
3
+ materials:
4
+ - materials/tokens.css
5
+ ---
6
+
7
+ ## Usage
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. The ease's
13
+ character is a brand answer — see the temperature signature.
14
+
15
+ Prefer opacity and small transform changes. If removing an animation does not
16
+ reduce comprehension, the animation was decoration.
17
+
18
+ Condition: marketing and editorial surfaces may stage entrances — scroll
19
+ reveals and section transitions are part of editorial rhythm, still built
20
+ from the three durations and the one ease. In product UI the same staging is
21
+ decoration.
22
+
23
+ ## Rules
24
+
25
+ - The vocabulary is exactly three duration roles and one ease.
26
+ - Fast is for hover and press.
27
+ - Normal is for reveals, fades, and small state changes.
28
+ - Slow is reserved for spatial transitions where the user needs to
29
+ understand movement.
30
+ - Nothing loops except explicit loading states. A spinner may continue
31
+ because work continues.
32
+
33
+ ## Never
34
+
35
+ - Never introduce novelty easings because a surface feels static — instead
36
+ stay on the one ease; its character is a brand answer (see the temperature
37
+ signature).
38
+ - Never ship decorative pulsing, floating, glowing, or attention-seeking
39
+ keyframes — they are off-language; instead loop nothing except explicit
40
+ loading states.
41
+ - Never keep an animation whose removal does not reduce comprehension — it
42
+ was decoration; instead delete it and prefer opacity and small transform
43
+ changes where motion earns its place.
44
+ - Never stage entrances in product UI — that staging is decoration there;
45
+ instead reserve scroll reveals and section transitions for marketing and
46
+ editorial surfaces.
@@ -0,0 +1,57 @@
1
+ ---
2
+ for: Color beyond the base roles, in any register.
3
+ materials:
4
+ - materials/tokens.css
5
+ ---
6
+
7
+ ## Usage
8
+
9
+ This is Vessel's answer to palette — it stands until you replace it.
10
+
11
+ The relationship is fixed: one brand at different volumes. A monochrome spine
12
+ is the default atmosphere in every medium — calm, legible, and resistant to
13
+ novelty — and a closed expression set supplies the atmosphere, with volume
14
+ set by context, never by taste.
15
+
16
+ Expressive color outside the closed set is not expression; it is another
17
+ brand. An invented hue is not a bolder Vessel; it is a different brand.
18
+
19
+ Loudness comes from commitment to few colors at scale, not variety.
20
+
21
+ To adapt: edit the `--expression-*` values (and the gray ramp, if the spine
22
+ changes) in `materials/tokens.css` and restate this node's current answer.
23
+ The ladder — a quiet spine, a closed hue set, context-gated volume — is the
24
+ part worth keeping.
25
+
26
+ ## Rules
27
+
28
+ - The base palette is monochrome gray.
29
+ - The expression palette is five named hues and only these — amber
30
+ (`--expression-1`), periwinkle (`--expression-2`), clay
31
+ (`--expression-3`), orchid (`--expression-4`), sage (`--expression-5`).
32
+ - Product UI: expression lives only in data visualization. A chart may use
33
+ the hues; the interface around it stays monochrome.
34
+ - Data-dense consoles: one hue family may mark status. Nothing atmospheric.
35
+ Charts inside a console keep the product carve-out — hues stay inside the
36
+ plot area and never leak into rows, badges, or headers.
37
+ - Email: exactly one expressive moment per message — a header band or the
38
+ figure that matters. One hue, quiet everywhere else.
39
+ - Editorial: expression is sanctioned atmosphere — a tinted dark section, a
40
+ colored pull-quote accent, a duotone moment. Never more than two hues per
41
+ page.
42
+ - Two constants that outrank the ladder: expression never touches what you
43
+ click — buttons, inputs, and links stay monochrome in every context — and
44
+ the status roles are not expression; they keep their meanings everywhere.
45
+
46
+ ## Never
47
+
48
+ - Never use expressive color outside the five named hues — an invented hue
49
+ is not a bolder Vessel; it is a different brand; instead stay inside the
50
+ `--expression-*` set at the context's sanctioned volume.
51
+ - Never put expression on what you click — instead keep buttons, inputs, and
52
+ links monochrome in every context.
53
+ - Never let the status roles moonlight as atmosphere — they are not
54
+ expression; instead keep their meanings everywhere and draw atmosphere
55
+ from the expression set.
56
+ - Never set expression volume by taste — instead set it by context, per the
57
+ ladder above.
@@ -0,0 +1,39 @@
1
+ ---
2
+ for: Laying out any view.
3
+ materials:
4
+ - materials/primitives.css
5
+ ---
6
+
7
+ ## Usage
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
+ Choose the gap that states the relationship. Ad-hoc margins between siblings
13
+ are forbidden because they hide the rhythm. When spacing feels wrong, change
14
+ the stack gap or split the stack.
15
+
16
+ Columns are for almost everything: forms, cards, message lists, modal bodies,
17
+ settings, empty states, and page sections. A column lets the user scan.
18
+
19
+ Rows are conditional. Use them for controls, metadata lines, compact status,
20
+ and paired label/value moments. If a row starts wrapping awkwardly, it
21
+ probably wanted to be a column.
22
+
23
+ ## Rules
24
+
25
+ - The gap steps are exactly five: `--gap-xs`, `--gap-sm`, `--gap-md`,
26
+ `--gap-lg`, `--gap-xl`.
27
+ - The default is column, medium gap, stretch alignment, start justification.
28
+ That is the ordinary reading rhythm.
29
+ - Rows are for controls, metadata lines, compact status, and paired
30
+ label/value moments.
31
+
32
+ ## Never
33
+
34
+ - Never place ad-hoc margins between siblings — they hide the rhythm;
35
+ instead change the stack gap or split the stack.
36
+ - Never tune by single pixels to make a screenshot pass — instead choose the
37
+ gap step that states the relationship.
38
+ - Never keep a row that starts wrapping awkwardly — it probably wanted to be
39
+ a column; instead convert it.
@@ -0,0 +1,39 @@
1
+ ---
2
+ for: Choosing or implementing any radius or corner treatment.
3
+ materials:
4
+ - materials/tokens.css
5
+ - materials/primitives.css
6
+ ---
7
+
8
+ ## Usage
9
+
10
+ This is Vessel's answer to shape — it stands until you replace it.
11
+
12
+ The relationship is fixed: controls and surfaces carry different radius
13
+ roles, and the two never swap. The pill is Vessel's most visible control
14
+ signature; a rectangular button is not a variant, it is a different design
15
+ system.
16
+
17
+ 20px is a considered position: rounder than default shadcn, but not bubbly.
18
+ Use the radius system as restraint, not as decoration.
19
+
20
+ To adapt: edit the `--radius-control` and `--radius-surface` values in
21
+ `materials/tokens.css` and restate this node's current answer. The
22
+ role split — one radius for what you click, one for what contains — is the
23
+ part worth keeping.
24
+
25
+ ## Rules
26
+
27
+ - Buttons and text inputs use `--radius-control`; cards and other surfaces
28
+ use `--radius-surface`.
29
+ - Controls are pills (`--radius-control: 999px`).
30
+ - Surfaces take the 20px signature radius (`--radius-surface: 20px`).
31
+
32
+ ## Never
33
+
34
+ - Never give a button the surface radius — a rectangular button is the
35
+ fastest tell that the output is not Vessel; instead controls take
36
+ `--radius-control`, the pill.
37
+ - Never swap the two radius roles — instead keep `--radius-control` on what
38
+ you click and `--radius-surface` on what contains.
39
+ - Never use the radius system as decoration — instead use it as restraint.
@@ -0,0 +1,45 @@
1
+ ---
2
+ for: Any card, popover, modal, dialog, scrim, or bordered container.
3
+ materials:
4
+ - materials/primitives.css
5
+ - materials/examples/composition.overlay.html
6
+ ---
7
+
8
+ ## Usage
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
+ Elevation implies hierarchy — a card sits in the document flow, a popover
18
+ floats above the flow, a modal interrupts the task. Pick the tier that
19
+ matches the interaction.
20
+
21
+ Borders are structural, especially for inputs and overlays. They are not
22
+ decorative frames around ordinary text.
23
+
24
+ The overlay reference shows the interrupting end of the system: background
25
+ scrim, modal radius, modal shadow, compact header, clear footer. Copy its
26
+ hierarchy when a user must stop and decide.
27
+
28
+ ## Rules
29
+
30
+ - The default surface is flat: no border, no shadow. We do not outline
31
+ everything to prove layout exists.
32
+ - The elevation tiers are exactly three: card, popover, modal.
33
+ - Component shadows belong to the primitives that own them.
34
+ - Borders are structural, especially for inputs and overlays.
35
+
36
+ ## Never
37
+
38
+ - Never write a custom shadow because the composition feels flat — instead
39
+ pick the elevation tier that matches the interaction.
40
+ - Never pair a low tier with an interrupting role or give a routine card
41
+ modal gravity — instead match the tier to the interaction's hierarchy.
42
+ - Never borrow component shadows for layout — they belong to the primitives
43
+ that own them; instead take layout elevation from the three tiers.
44
+ - Never use borders as decoration, especially around assistant text —
45
+ instead use space, tone, and type hierarchy.
@@ -0,0 +1,39 @@
1
+ ---
2
+ for: Any work applying this brand's signature.
3
+ ---
4
+
5
+ ## Usage
6
+
7
+ These are the near-misses of Vessel's own signature: outputs that got close
8
+ enough to cite the brand and still missed it. Each reject names its
9
+ replacement. When a tell fires, the fix direction is always toward the
10
+ token, the role, or deletion — never toward adding a compensating style on
11
+ top of the miss.
12
+
13
+ Fidelity note: pills and fluid clamp display headings are medians Vessel
14
+ deliberately shares — their presence is fidelity, not drift. Convergence is
15
+ not the crime; surrendering the choice is.
16
+
17
+ ## Never
18
+
19
+ - Never ship rectangular buttons. A rectangular button is not a variant; it
20
+ is a different design system — instead controls take `--radius-control`,
21
+ the pill.
22
+ - Never swap radius roles: the surface radius on a control, the pill on a
23
+ surface, or 20px cells in a data table — instead `--radius-control` on
24
+ what you click, `--radius-surface` on what contains, small radius on data
25
+ cells.
26
+ - Never put expression hues on interactive controls, invent a sixth hue, or
27
+ pass off a tinted gray as monochrome — instead use the five named
28
+ expression hues at the context's sanctioned volume, and a true gray spine.
29
+ An invented hue is not a bolder Vessel; it is a different brand.
30
+ - Never write custom shadows that sit near a tier — instead use the exact
31
+ tier — card, popover, or modal — chosen by interaction importance.
32
+ - Never borrow `--shadow-btn` for layout — component shadows belong to the
33
+ primitives that own them; instead take layout elevation from the three
34
+ tiers.
35
+ - Never use editorial display type in product UI, or product type timidity
36
+ in editorial — instead each context keeps its own vocabulary; a modal
37
+ title is not a poster, and a hero at product scale reads as timid.
38
+ - Never put borders around assistant text — instead the assistant speaks as
39
+ plain text on the page surface; use space, tone, and type hierarchy.
@@ -0,0 +1,62 @@
1
+ ---
2
+ for: Writing any copy or choosing the character of motion.
3
+ materials:
4
+ - materials/tokens.css
5
+ ---
6
+
7
+ ## Usage
8
+
9
+ This is Vessel's answer to temperature — it stands until you replace it.
10
+
11
+ The relationship is fixed: voice and motion carry the same temperature. Copy
12
+ states what happened, what is possible, or what the user must decide — it
13
+ does not perform personality — and motion confirms rather than entertains.
14
+
15
+ The system should sound reliable, not excited by basic competence.
16
+ Destructive copy is direct because the risk is direct; softening the verb
17
+ makes the interface less honest. Vessel never celebrates at the user. Trust
18
+ comes from precision, restraint, and naming the truth plainly.
19
+
20
+ The voice is a mechanical edit, not a mood — apply it as transformations:
21
+ "Sorry, nothing here yet!" → "Nothing yet". "Awesome, your changes have been
22
+ saved!" → "Changes saved". "Oops! Something went wrong" → "Payment failed —
23
+ card expired". "You might want to consider updating your billing info" →
24
+ "Update your billing info". Strip the apology, the applause, and the hedge;
25
+ keep the fact and the fix.
26
+
27
+ Condition: editorial surfaces switch context. Short declarative confident
28
+ fragments are correct in heroes and section headings. That same editorial
29
+ confidence is wrong in a settings form — product copy serves the task before
30
+ it serves the voice. Email copy uses the product voice: factual, not
31
+ campaign-like.
32
+
33
+ To adapt: rewrite this node's current answers in your brand's voice and edit
34
+ the duration and ease values in `materials/tokens.css`. The coupling — words
35
+ and motion sharing one temperature — is the part worth keeping.
36
+
37
+ ## Rules
38
+
39
+ - Product UI is the default context — factual, quiet, sentence case, and
40
+ free of applause.
41
+ - No exclamation marks; celebration is not reassurance.
42
+ - Confirmations are quiet: "Changes saved", never "Awesome!"
43
+ - Errors name the problem and the fix in the place where the user can act.
44
+ - Buttons name the act — "Delete account", "Save changes", "Invite member",
45
+ not "Do it" or "Let's go".
46
+ - Motion carries three durations — `--duration-fast`, `--duration-normal`,
47
+ `--duration-slow` — and one ease, `--ease-spring`, which should feel
48
+ resolved without feeling elastic.
49
+ - Hover confirms with color and background shifts at the fast duration.
50
+
51
+ ## Never
52
+
53
+ - Never ship a vague failure banner — it is evasion; instead name the
54
+ problem and the fix in the place where the user can act.
55
+ - Never soften the verb on destructive copy — it makes the interface less
56
+ honest; instead name the destructive act directly.
57
+ - Never celebrate at the user — instead let trust come from precision,
58
+ restraint, and naming the truth plainly.
59
+ - Never confirm hover with levitation — instead confirm with color and
60
+ background shifts at the fast duration.
61
+ - Never carry editorial confidence into a settings form — instead let
62
+ product copy serve the task before it serves the voice.
@@ -1,5 +1,5 @@
1
1
  ---
2
- context: Any text, hero, landing page, or editorial moment.
2
+ for: Any text, hero, landing page, or editorial moment.
3
3
  materials:
4
4
  - materials/tokens.css
5
5
  - materials/fonts/HKGrotesk-Black.woff2
@@ -11,6 +11,8 @@ materials:
11
11
  - materials/fonts/HKGrotesk-SemiBold.woff2
12
12
  ---
13
13
 
14
+ ## Usage
15
+
14
16
  This is Vessel's answer to type — it stands until you replace it.
15
17
 
16
18
  The relationship is fixed: one typeface is the voice of the interface,
@@ -19,19 +21,9 @@ output. The heading scale is editorial — its tokens exist for pages composed
19
21
  outside the text variants — and product UI never mixes the two vocabularies
20
22
  in one view.
21
23
 
22
- Vessel's current answer: HK Grotesk. vessel-light ships it as its embedded
23
- voice — here, `tokens.css` is canonical.
24
-
25
- The heading scale is editorial: display, section, and sub each carry their
26
- own rhythm (`--heading-display-*`, `--heading-section-*`, `--heading-sub-*`).
27
24
  Display sizes use tight tracking and sub-1 line heights because the words
28
- behave like composition, not paragraph text. Card-level headings inside
29
- editorial features use the product `title` variant — the scale does not reach
30
- below sub.
31
-
32
- Labels are small, semibold, and tracked wide. They should feel precise, never
33
- loud. Body text keeps the established reading sizes with relaxed line height;
34
- do not shrink important prose until it becomes legal copy.
25
+ behave like composition, not paragraph text. Labels should feel precise,
26
+ never loud.
35
27
 
36
28
  Condition: display and section scale are for editorial or hero moments.
37
29
  Product UI lives in headline, title, body, label, and mono. A modal title is
@@ -41,3 +33,26 @@ To adapt: swap the font files, edit `--font-sans`, `--font-mono`, and the
41
33
  heading tokens in `materials/tokens.css`, and restate this node's current
42
34
  answer. The one-voice rule and the editorial/product vocabulary split are the
43
35
  parts worth keeping.
36
+
37
+ ## Rules
38
+
39
+ - The typeface is HK Grotesk. vessel-light ships it as its embedded voice —
40
+ here, `tokens.css` is canonical.
41
+ - The heading scale is editorial: display, section, and sub each carry their
42
+ own rhythm (`--heading-display-*`, `--heading-section-*`,
43
+ `--heading-sub-*`).
44
+ - Card-level headings inside editorial features use the product `title`
45
+ variant — the scale does not reach below sub.
46
+ - Labels are small, semibold, and tracked wide.
47
+ - Body text keeps the established reading sizes with relaxed line height.
48
+ - Product UI lives in headline, title, body, label, and mono.
49
+
50
+ ## Never
51
+
52
+ - Never mix the editorial heading scale and the product text variants in one
53
+ view — instead keep each vocabulary in its own context; a modal title is
54
+ not a poster.
55
+ - Never shrink important prose until it becomes legal copy — instead keep
56
+ body text at the established reading sizes with relaxed line height.
57
+ - Never make labels loud — instead keep them small, semibold, and tracked
58
+ wide so they feel precise.
@@ -1,44 +1,41 @@
1
1
  ---
2
2
  kinds:
3
- - name: grammar
4
- - name: signature
5
- - name: register
6
- - name: anti-goal
3
+ - name: standard
4
+ - name: foundation
5
+ - name: context
7
6
  ---
8
7
 
9
- # grammar
8
+ # standard
10
9
 
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.
10
+ Shared guidance that is not specific to this brand. Every rule carries one of
11
+ two authority labels. An **Obligation** is a requirement brand preference
12
+ cannot waive. A **Default** is a starting position that protects unsteered
13
+ work from generic model behavior; explicit brand guidance may deliberately
14
+ replace it. When a default with a paired check is overridden, adapt or remove
15
+ the check flag in the same change.
15
16
 
16
- # signature
17
+ # foundation
17
18
 
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.
19
+ Vessel's load-bearing decisions: the closed sets, role vocabularies, and
20
+ assembly rules, plus the answered identity dials shape, palette, type,
21
+ temperature each stating Vessel's current answer, which stands until you
22
+ replace it. The role logic survives an adaptation unchanged; the answered
23
+ values do not on adaptation, edit the token roles in `materials/tokens.css`
24
+ and restate each answer. Gather foundations before inventing structure or
25
+ setting any value a dial governs.
23
26
 
24
- # register
27
+ # context
25
28
 
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
29
+ A named situation — data-dense consoles, editorial pages, transactional
30
+ email, conversation UI — where parts of the default rules bend or invert.
31
+ Each context names its condition first. Truths from the wrong context are
32
+ poison, not guidance; read a context only when its condition matches the
30
33
  task.
31
34
 
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
35
  ---
40
36
 
41
37
  To adapt this package to another brand, follow the starter section of the
42
- `authoring` 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 examples, rewrite the tells.
38
+ `authoring` recipe in the ghost skill bundle. In short: new manifest id, prune
39
+ the shared model-defaults rules your brand legitimately violates, restate each
40
+ answered foundation dial, edit `materials/tokens.css`, regenerate the
41
+ examples, rewrite the tells.
@@ -1,5 +1,5 @@
1
1
  ---
2
- context: Any task using the complete Vessel design language.
2
+ for: Any task using the complete Vessel design language.
3
3
  materials:
4
4
  - materials/tokens.css
5
5
  ---
@@ -7,22 +7,25 @@ materials:
7
7
  vessel-light is Vessel without the React package: the design language as a
8
8
  steering packet for agents writing raw HTML and CSS.
9
9
 
10
- Style only with the tokens. Compose only with the closed sets the grammar
11
- enumerates. Use the examples when the task matches; they are not a framework.
10
+ Style only with the tokens. Compose only with the closed sets the foundations
11
+ enumerate. Use the examples when the task matches; they are not a framework.
12
12
 
13
- Grammar and the median floor are safe verbatim, unchanged by any adaptation.
14
- Signature nodes state Vessel's current answer and stand until you replace
15
- them. Registers editorial, email, and data-density name the situations
16
- where parts of the default contract invert; pull only the nodes whose
17
- conditions match the task, because truths from the wrong register are
18
- poison, not context.
13
+ Foundations carry Vessel's load-bearing decisions. Their role logic survives
14
+ adaptation; the answered shape, palette, type, and temperature values stand
15
+ until you replace them. `standard.model-defaults` is shared guidance: prune a
16
+ Default only when explicit brand guidance replaces it, then adapt its paired
17
+ check in the same change. Contexts editorial, email, data-density, and
18
+ conversation name the situations where parts of the default contract bend;
19
+ pull only the nodes whose conditions match the task, because guidance from the
20
+ wrong context is contamination.
19
21
 
20
- Monochrome comes first. Status color is functional language — danger,
21
- success, warning, information — never atmosphere. Atmosphere is catered: a
22
- five-hue expression palette whose volume rises with the register, from
23
- charts-only in product to two hues in editorial, and never on controls.
22
+ Monochrome comes first. Status color is functional language — danger, success,
23
+ warning, information — never atmosphere. Atmosphere is catered: a five-hue
24
+ expression palette whose volume rises with the context, from charts-only in
25
+ product to two hues in editorial, and never on controls.
24
26
 
25
27
  Name the reader's job before composing anything. The job picks the example and
26
- the register, never the topic. When no example fits, compose from the grammar;
27
- do not invent a new styling system. Before anything ships, run the deletion
28
- pass: every element names what breaks if it goes, and the view arrives settled.
28
+ the context, never the topic. When no example fits, compose from the
29
+ foundations; do not invent a new styling system. Before anything ships, run the
30
+ deletion pass: every element names what breaks if it goes, and the view arrives
31
+ settled.
@@ -1,5 +1,5 @@
1
1
  ---
2
- context: Any greenfield visual surface or first-draft copy.
2
+ for: Any greenfield visual surface or first-draft copy.
3
3
  ---
4
4
 
5
5
  This is the model's median, not your brand. Each rule is reject→replace.
@@ -1,7 +1,7 @@
1
1
  import { access, appendFile, readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { GHOST_EVENTS_FILENAME } from "./scan/constants.js";
4
- const FIRST_WRITE_NOTICE = `ghost: logging selection events locally to .ghost/${GHOST_EVENTS_FILENAME} (gitignored; never leaves your machine). Summarize with \`ghost pulse\`.`;
4
+ const FIRST_WRITE_NOTICE = `ghost: logging selection events locally to .ghost/${GHOST_EVENTS_FILENAME} (gitignored; never leaves your machine). Summarize with \`ghost stats\`.`;
5
5
  /**
6
6
  * Resolve the run identifier for event attribution: explicit --run flag
7
7
  * wins, then GHOST_RUN_ID from the environment. Returns undefined when
@@ -51,7 +51,7 @@ export async function readGhostEvents(packageDir) {
51
51
  events.push(parsed);
52
52
  }
53
53
  catch {
54
- // Ignore malformed events tape lines; pulse should still be useful.
54
+ // Ignore malformed events tape lines; stats should still be useful.
55
55
  }
56
56
  }
57
57
  return events;
@@ -3,7 +3,7 @@ export interface BaselineProse {
3
3
  ref: string;
4
4
  nodeId: string;
5
5
  heading?: string;
6
- context?: string;
6
+ for?: string;
7
7
  body: string;
8
8
  warning?: string;
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/review/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,GACpB,aAAa,GAAG,IAAI,CA0BtB"}
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/review/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,GACpB,aAAa,GAAG,IAAI,CA0BtB"}
@@ -10,7 +10,7 @@ export function resolveBaseline(raw, catalog) {
10
10
  return {
11
11
  ref: raw,
12
12
  nodeId: ref.nodeId,
13
- ...(node.context !== undefined ? { context: node.context } : {}),
13
+ ...(node.for !== undefined ? { for: node.for } : {}),
14
14
  body: node.body,
15
15
  };
16
16
  }
@@ -19,7 +19,7 @@ export function resolveBaseline(raw, catalog) {
19
19
  ref: raw,
20
20
  nodeId: ref.nodeId,
21
21
  heading: ref.heading,
22
- ...(node.context !== undefined ? { context: node.context } : {}),
22
+ ...(node.for !== undefined ? { for: node.for } : {}),
23
23
  body: section ?? node.body,
24
24
  ...(section === null
25
25
  ? {
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/review/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAWrB,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,OAAqB;IAErB,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI;QAC1B,GAAG,CAAC,OAAO,KAAK,IAAI;YAClB,CAAC,CAAC;gBACE,OAAO,EAAE,YAAY,GAAG,CAAC,OAAO,wBAAwB,GAAG,CAAC,MAAM,8BAA8B;aACjG;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/review/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAWrB,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,OAAqB;IAErB,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI;QAC1B,GAAG,CAAC,OAAO,KAAK,IAAI;YAClB,CAAC,CAAC;gBACE,OAAO,EAAE,YAAY,GAAG,CAAC,OAAO,wBAAwB,GAAG,CAAC,MAAM,8BAA8B;aACjG;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
@@ -6,7 +6,7 @@ export type { BaselineProse };
6
6
  export interface PacketMaterialNode {
7
7
  id: string;
8
8
  kind?: string;
9
- context?: string;
9
+ for?: string;
10
10
  prose: string;
11
11
  materials: GhostMaterial[];
12
12
  matchedMaterials: string[];
@@ -29,6 +29,7 @@ export interface ReviewPacket {
29
29
  checks: PacketCheck[];
30
30
  gaps: CoverageGap[];
31
31
  diff: string;
32
+ untrusted: true;
32
33
  }
33
34
  export interface BuildReviewPacketOptions {
34
35
  /** Absolute path of the ghost package directory (default: cwd/.ghost). */
@@ -1 +1 @@
1
- {"version":3,"file":"review-packet.d.ts","sourceRoot":"","sources":["../../src/review/review-packet.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,YAAY,CAAC,CAyCvB;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoF/D"}
1
+ {"version":3,"file":"review-packet.d.ts","sourceRoot":"","sources":["../../src/review/review-packet.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAOzE,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,YAAY,CAAC,CA0CvB;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4F/D"}