@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.
Files changed (157) hide show
  1. package/README.md +47 -33
  2. package/dist/commands/checks-command.d.ts.map +1 -1
  3. package/dist/commands/checks-command.js +8 -1
  4. package/dist/commands/checks-command.js.map +1 -1
  5. package/dist/commands/fingerprint-commands.d.ts.map +1 -1
  6. package/dist/commands/fingerprint-commands.js +1 -6
  7. package/dist/commands/fingerprint-commands.js.map +1 -1
  8. package/dist/commands/gather-command.d.ts.map +1 -1
  9. package/dist/commands/gather-command.js +26 -30
  10. package/dist/commands/gather-command.js.map +1 -1
  11. package/dist/commands/init-command.d.ts.map +1 -1
  12. package/dist/commands/init-command.js +23 -13
  13. package/dist/commands/init-command.js.map +1 -1
  14. package/dist/commands/pull-command.d.ts.map +1 -1
  15. package/dist/commands/pull-command.js +12 -19
  16. package/dist/commands/pull-command.js.map +1 -1
  17. package/dist/commands/pulse-command.js +1 -10
  18. package/dist/commands/pulse-command.js.map +1 -1
  19. package/dist/commands/review-command.d.ts.map +1 -1
  20. package/dist/commands/review-command.js +1 -0
  21. package/dist/commands/review-command.js.map +1 -1
  22. package/dist/ghost-core/catalog/assemble.d.ts +0 -4
  23. package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
  24. package/dist/ghost-core/catalog/assemble.js +0 -10
  25. package/dist/ghost-core/catalog/assemble.js.map +1 -1
  26. package/dist/ghost-core/catalog/index.d.ts +1 -1
  27. package/dist/ghost-core/catalog/index.d.ts.map +1 -1
  28. package/dist/ghost-core/catalog/index.js +1 -1
  29. package/dist/ghost-core/catalog/index.js.map +1 -1
  30. package/dist/ghost-core/catalog/menu.d.ts +1 -11
  31. package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
  32. package/dist/ghost-core/catalog/menu.js +1 -6
  33. package/dist/ghost-core/catalog/menu.js.map +1 -1
  34. package/dist/ghost-core/catalog/types.d.ts +0 -6
  35. package/dist/ghost-core/catalog/types.d.ts.map +1 -1
  36. package/dist/ghost-core/glossary.d.ts +0 -13
  37. package/dist/ghost-core/glossary.d.ts.map +1 -1
  38. package/dist/ghost-core/glossary.js +0 -7
  39. package/dist/ghost-core/glossary.js.map +1 -1
  40. package/dist/ghost-core/index.d.ts +2 -2
  41. package/dist/ghost-core/index.d.ts.map +1 -1
  42. package/dist/ghost-core/index.js +1 -1
  43. package/dist/ghost-core/index.js.map +1 -1
  44. package/dist/ghost-core/package-manifest.d.ts +7 -0
  45. package/dist/ghost-core/package-manifest.d.ts.map +1 -1
  46. package/dist/ghost-core/package-manifest.js +10 -0
  47. package/dist/ghost-core/package-manifest.js.map +1 -1
  48. package/dist/init-payloads/median/cliche.median.md +86 -0
  49. package/dist/init-payloads/median/median-tells.md +117 -0
  50. package/dist/init-payloads/skeleton/brand.md +22 -0
  51. package/dist/init-payloads/skeleton/context.conversation.md +24 -0
  52. package/dist/init-payloads/skeleton/foundation.color.md +39 -0
  53. package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
  54. package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
  55. package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
  56. package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
  57. package/dist/init-payloads/skeleton/foundation.type.md +44 -0
  58. package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
  59. package/dist/init-payloads/skeleton/glossary.md +39 -0
  60. package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
  61. package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
  62. package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
  63. package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
  64. package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
  65. package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
  66. package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
  67. package/dist/init-payloads/vessel-light/checks/values.md +51 -0
  68. package/dist/init-payloads/vessel-light/glossary.md +44 -0
  69. package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
  70. package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
  71. package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
  72. package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
  73. package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
  74. package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
  75. package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
  76. package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
  77. package/dist/init-payloads/vessel-light/index.md +33 -0
  78. package/dist/init-payloads/vessel-light/manifest.yml +3 -0
  79. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
  80. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
  81. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
  82. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
  83. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
  84. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
  85. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
  86. package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
  87. package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
  88. package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
  89. package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
  90. package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
  91. package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
  92. package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
  93. package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
  94. package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
  95. package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
  96. package/dist/init-payloads/vessel-light/register.email.md +43 -0
  97. package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
  98. package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
  99. package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
  100. package/dist/init-payloads/vessel-light/signature.type.md +37 -0
  101. package/dist/observability-events.d.ts +0 -3
  102. package/dist/observability-events.d.ts.map +1 -1
  103. package/dist/observability-events.js.map +1 -1
  104. package/dist/review/resolve.d.ts +3 -4
  105. package/dist/review/resolve.d.ts.map +1 -1
  106. package/dist/review/resolve.js +12 -9
  107. package/dist/review/resolve.js.map +1 -1
  108. package/dist/review/review-packet.d.ts +2 -1
  109. package/dist/review/review-packet.d.ts.map +1 -1
  110. package/dist/review/review-packet.js +9 -20
  111. package/dist/review/review-packet.js.map +1 -1
  112. package/dist/scan/check-files.d.ts.map +1 -1
  113. package/dist/scan/check-files.js +0 -15
  114. package/dist/scan/check-files.js.map +1 -1
  115. package/dist/scan/check-scaffold.d.ts +1 -0
  116. package/dist/scan/check-scaffold.d.ts.map +1 -1
  117. package/dist/scan/check-scaffold.js +17 -1
  118. package/dist/scan/check-scaffold.js.map +1 -1
  119. package/dist/scan/fingerprint-package-lint.d.ts +8 -0
  120. package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
  121. package/dist/scan/fingerprint-package-lint.js +284 -0
  122. package/dist/scan/fingerprint-package-lint.js.map +1 -0
  123. package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
  124. package/dist/scan/fingerprint-package-loader.js +2 -29
  125. package/dist/scan/fingerprint-package-loader.js.map +1 -1
  126. package/dist/scan/fingerprint-package.d.ts +16 -8
  127. package/dist/scan/fingerprint-package.d.ts.map +1 -1
  128. package/dist/scan/fingerprint-package.js +41 -241
  129. package/dist/scan/fingerprint-package.js.map +1 -1
  130. package/dist/scan/node-files.d.ts.map +1 -1
  131. package/dist/scan/node-files.js +1 -3
  132. package/dist/scan/node-files.js.map +1 -1
  133. package/dist/scan/packed-payloads.d.ts +4 -0
  134. package/dist/scan/packed-payloads.d.ts.map +1 -0
  135. package/dist/scan/packed-payloads.js +55 -0
  136. package/dist/scan/packed-payloads.js.map +1 -0
  137. package/dist/scan/templates.d.ts +20 -2
  138. package/dist/scan/templates.d.ts.map +1 -1
  139. package/dist/scan/templates.js +106 -26
  140. package/dist/scan/templates.js.map +1 -1
  141. package/dist/skill-bundle/SKILL.md +16 -13
  142. package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
  143. package/dist/skill-bundle/references/authoring-scenarios.md +42 -5
  144. package/dist/skill-bundle/references/blocks.md +1 -1
  145. package/dist/skill-bundle/references/brief.md +5 -6
  146. package/dist/skill-bundle/references/capture.md +52 -41
  147. package/dist/skill-bundle/references/concrete-tiers.md +95 -0
  148. package/dist/skill-bundle/references/recall.md +6 -12
  149. package/dist/skill-bundle/references/schema.md +15 -24
  150. package/dist/skill-bundle/references/self-check.md +2 -2
  151. package/dist/skill-bundle/references/steering-audit.md +7 -10
  152. package/package.json +2 -2
  153. package/dist/scan/steering-template.d.ts +0 -8
  154. package/dist/scan/steering-template.d.ts.map +0 -1
  155. package/dist/scan/steering-template.js +0 -266
  156. package/dist/scan/steering-template.js.map +0 -1
  157. package/dist/skill-bundle/references/wild.md +0 -30
@@ -0,0 +1,351 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ background: var(--background);
9
+ color: var(--foreground);
10
+ font-family: var(--font-sans);
11
+ }
12
+
13
+ /* surface — defaults: background/foreground, radius-md, no padding, no border, no elevation. */
14
+ .surface {
15
+ background: var(--background);
16
+ color: var(--foreground);
17
+ border: 0;
18
+ border-radius: var(--radius-md);
19
+ box-shadow: none;
20
+ }
21
+ .surface--card {
22
+ background: var(--card);
23
+ color: var(--card-foreground);
24
+ }
25
+ .surface--popover {
26
+ background: var(--popover);
27
+ color: var(--popover-foreground);
28
+ }
29
+ .surface--muted {
30
+ background: var(--muted);
31
+ color: var(--foreground);
32
+ }
33
+ .surface--pad-xs {
34
+ padding: var(--gap-sm);
35
+ }
36
+ .surface--pad-sm {
37
+ padding: 12px; /* off-scale surface geometry: between --gap-sm and --gap-md */
38
+ }
39
+ .surface--pad-md {
40
+ padding: var(--gap-md);
41
+ }
42
+ .surface--pad-lg {
43
+ padding: var(--gap-lg);
44
+ }
45
+ .surface--radius-sm {
46
+ border-radius: var(--radius-sm);
47
+ }
48
+ .surface--radius-surface {
49
+ border-radius: var(--radius-surface);
50
+ }
51
+ .surface--border {
52
+ border: 1px solid var(--border);
53
+ }
54
+ .surface--border-input {
55
+ border: 1px solid var(--input);
56
+ }
57
+ .surface--elevation-card {
58
+ box-shadow: var(--shadow-card);
59
+ }
60
+ .surface--elevation-popover {
61
+ box-shadow: var(--shadow-popover);
62
+ }
63
+ .surface--elevation-modal {
64
+ box-shadow: var(--shadow-modal);
65
+ }
66
+
67
+ /* stack — defaults: column, gap-md(16px), stretch. Write class="stack" and you get vessel rhythm. */
68
+ .stack {
69
+ display: flex;
70
+ flex-direction: column;
71
+ gap: var(--gap-md);
72
+ align-items: stretch;
73
+ justify-content: flex-start;
74
+ flex-wrap: nowrap;
75
+ }
76
+ .stack--row {
77
+ flex-direction: row;
78
+ }
79
+ .stack--gap-none {
80
+ gap: 0;
81
+ }
82
+ .stack--gap-xs {
83
+ gap: var(--gap-xs);
84
+ }
85
+ .stack--gap-sm {
86
+ gap: var(--gap-sm);
87
+ }
88
+ .stack--gap-md {
89
+ gap: var(--gap-md);
90
+ }
91
+ .stack--gap-lg {
92
+ gap: var(--gap-lg);
93
+ }
94
+ .stack--gap-xl {
95
+ gap: var(--gap-xl);
96
+ }
97
+ .stack--align-start {
98
+ align-items: flex-start;
99
+ }
100
+ .stack--align-center {
101
+ align-items: center;
102
+ }
103
+ .stack--align-end {
104
+ align-items: flex-end;
105
+ }
106
+ .stack--justify-center {
107
+ justify-content: center;
108
+ }
109
+ .stack--justify-end {
110
+ justify-content: flex-end;
111
+ }
112
+ .stack--justify-between {
113
+ justify-content: space-between;
114
+ }
115
+ .stack--wrap {
116
+ flex-wrap: wrap;
117
+ }
118
+
119
+ /* text — defaults: body, 14px, relaxed, foreground. */
120
+ .text {
121
+ margin: 0;
122
+ color: var(--foreground);
123
+ font-family: var(--font-sans);
124
+ font-size: var(--text-body-size);
125
+ line-height: var(--text-body-line-height);
126
+ }
127
+ .text--display {
128
+ font-size: var(--heading-display-font-size);
129
+ font-weight: var(--heading-display-font-weight);
130
+ line-height: var(--heading-display-line-height);
131
+ letter-spacing: var(--heading-display-letter-spacing);
132
+ }
133
+ .text--headline {
134
+ font-size: var(--text-headline-size);
135
+ font-weight: 400;
136
+ line-height: 1.25;
137
+ letter-spacing: var(--text-heading-letter-spacing);
138
+ }
139
+ .text--title {
140
+ font-size: var(--text-title-size);
141
+ font-weight: 600;
142
+ line-height: 1;
143
+ letter-spacing: var(--text-heading-letter-spacing);
144
+ }
145
+ .text--label {
146
+ font-size: var(--label-font-size);
147
+ font-weight: var(--label-font-weight);
148
+ line-height: var(--label-line-height);
149
+ letter-spacing: var(--label-letter-spacing);
150
+ }
151
+ .text--mono {
152
+ font-family: var(--font-mono);
153
+ font-size: var(--text-body-size);
154
+ line-height: 1.5;
155
+ }
156
+ .text--muted {
157
+ color: var(--muted-foreground);
158
+ }
159
+ .text--inverse {
160
+ color: var(--primary-foreground);
161
+ }
162
+ .text--success {
163
+ color: var(--success);
164
+ }
165
+ .text--warning {
166
+ color: var(--warning);
167
+ }
168
+ .text--info {
169
+ color: var(--info);
170
+ }
171
+ .text--destructive {
172
+ color: var(--destructive);
173
+ }
174
+
175
+ /* button — defaults: primary pill, 36px high, centered, fast focusable action. */
176
+ .button {
177
+ display: inline-flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ gap: var(--gap-sm);
181
+ min-width: 0;
182
+ height: var(--control-height);
183
+ padding: var(--gap-sm) var(--gap-lg);
184
+ border: 1px solid transparent;
185
+ border-radius: var(--radius-control);
186
+ background: var(--primary);
187
+ color: var(--primary-foreground);
188
+ box-shadow: none;
189
+ font: inherit;
190
+ font-size: var(--text-body-size);
191
+ line-height: 1;
192
+ text-decoration: none;
193
+ white-space: nowrap;
194
+ cursor: pointer;
195
+ transition:
196
+ background var(--duration-fast) var(--ease-spring),
197
+ border-color var(--duration-fast) var(--ease-spring),
198
+ box-shadow var(--duration-fast) var(--ease-spring),
199
+ opacity var(--duration-fast) var(--ease-spring);
200
+ }
201
+ .button:hover {
202
+ box-shadow: var(--shadow-btn);
203
+ }
204
+ .button:focus-visible {
205
+ outline: none;
206
+ border-color: var(--ring);
207
+ box-shadow: 0 0 0 1px var(--ring);
208
+ }
209
+ .button:disabled,
210
+ .button[aria-disabled="true"] {
211
+ pointer-events: none;
212
+ opacity: 0.5;
213
+ }
214
+ .button--primary {
215
+ background: var(--primary);
216
+ color: var(--primary-foreground);
217
+ }
218
+ .button--secondary {
219
+ background: var(--secondary);
220
+ color: var(--secondary-foreground);
221
+ }
222
+ .button--ghost {
223
+ background: transparent;
224
+ color: var(--foreground);
225
+ }
226
+ .button--ghost:hover,
227
+ .button--secondary:hover,
228
+ .button--outline:hover {
229
+ background: var(--muted);
230
+ }
231
+ .button--destructive {
232
+ background: var(--destructive);
233
+ color: var(--destructive-foreground);
234
+ }
235
+ .button--outline {
236
+ background: var(--background);
237
+ color: var(--foreground);
238
+ border-color: var(--input);
239
+ }
240
+ .button--link {
241
+ padding-inline: 4px;
242
+ background: transparent;
243
+ color: var(--foreground);
244
+ text-decoration: underline;
245
+ text-underline-offset: 3px;
246
+ transition: color var(--duration-fast) var(--ease-spring);
247
+ }
248
+ .button--link:hover {
249
+ background: transparent;
250
+ color: var(--muted-foreground);
251
+ box-shadow: none;
252
+ }
253
+ .button--size-sm {
254
+ height: 32px;
255
+ padding: 6px var(--gap-md);
256
+ gap: 6px;
257
+ }
258
+ .button--size-lg {
259
+ height: 40px;
260
+ padding: var(--gap-sm) var(--gap-xl);
261
+ }
262
+ .button--icon,
263
+ .button--icon-sm {
264
+ padding: 0;
265
+ }
266
+ .button--icon {
267
+ width: var(--control-height);
268
+ height: var(--control-height);
269
+ }
270
+ .button--icon-sm {
271
+ width: 32px;
272
+ height: 32px;
273
+ }
274
+
275
+ /* field — defaults: label plus pill input with input border, muted placeholder, ring focus, compact error. */
276
+ .field {
277
+ display: flex;
278
+ flex-direction: column;
279
+ gap: var(--gap-sm);
280
+ }
281
+ .label {
282
+ display: flex;
283
+ gap: var(--gap-sm);
284
+ color: var(--foreground);
285
+ font-size: var(--text-body-size);
286
+ line-height: 1;
287
+ user-select: none;
288
+ }
289
+ .input {
290
+ display: flex;
291
+ width: 100%;
292
+ min-width: 0;
293
+ height: var(--control-height);
294
+ padding: 4px 12px;
295
+ border: 1px solid var(--input);
296
+ border-radius: var(--radius-input);
297
+ background: transparent;
298
+ color: var(--foreground);
299
+ font: inherit;
300
+ font-size: 16px;
301
+ outline: none;
302
+ transition:
303
+ border-color var(--duration-fast) var(--ease-spring),
304
+ box-shadow var(--duration-fast) var(--ease-spring);
305
+ }
306
+ .input::placeholder {
307
+ color: var(--muted-foreground);
308
+ }
309
+ .input:hover {
310
+ border-color: var(--border);
311
+ }
312
+ .input:focus,
313
+ .input:focus-visible {
314
+ border-color: var(--ring);
315
+ box-shadow: 0 0 0 1px var(--ring);
316
+ }
317
+ .input[aria-invalid="true"] {
318
+ border-color: var(--destructive);
319
+ box-shadow: 0 0 0 1px var(--destructive);
320
+ }
321
+ .input--textarea {
322
+ min-height: 64px;
323
+ height: auto;
324
+ padding: 12px;
325
+ resize: vertical;
326
+ border-radius: var(--radius-md);
327
+ line-height: 1.5;
328
+ }
329
+ .input--select {
330
+ align-items: center;
331
+ justify-content: space-between;
332
+ cursor: default;
333
+ }
334
+ .input--checkbox {
335
+ width: 16px;
336
+ height: 16px;
337
+ padding: 0;
338
+ flex: 0 0 16px;
339
+ border-radius: var(--radius-sm);
340
+ accent-color: var(--primary);
341
+ }
342
+ .field-error {
343
+ color: var(--destructive);
344
+ font-size: 12px;
345
+ line-height: 1.4;
346
+ }
347
+
348
+ /* scrim — default overlay wash uses the tokenized alpha surface. */
349
+ .scrim {
350
+ background: var(--dark-40);
351
+ }
@@ -0,0 +1,63 @@
1
+ <!-- ghost ref annotations
2
+ normative-for: grammar.conversation — the whole grammar: assistant turns as plain text on the page surface (no bubble, border, or fill), user turns as compact muted surfaces aligned right, tool calls collapsed to a one-line labeled summary with status (mono detail only after expansion), one bordered prompt surface with an empty writing region and a single control row below, exactly one primary send. grammar.surfaces — no borders as decoration around assistant text. signature.shape — surface radius on the prompt surface and user turns.
3
+ incidental: all copy; the 720px thread width and turn max-widths; the specific attach/mention controls; the billing subject matter.
4
+ -->
5
+ <!doctype html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="utf-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <title>Vessel Light — Conversation</title>
11
+ <link rel="stylesheet" href="../tokens.css" />
12
+ <link rel="stylesheet" href="../primitives.css" />
13
+ <style>
14
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; padding: 24px; }
15
+ main { width: min(100%, 720px); height: min(760px, calc(100vh - 48px)); }
16
+ section[aria-label="Conversation thread"] { overflow: auto; flex: 1; }
17
+ article[data-turn="user"] { max-width: 80%; margin-left: auto; }
18
+ article[data-turn="assistant"] { max-width: 92%; }
19
+ textarea[aria-label="Prompt"] { min-height: 96px; }
20
+ </style>
21
+ </head>
22
+ <body>
23
+ <main class="stack stack--gap-md">
24
+ <section class="stack stack--gap-lg" aria-label="Conversation thread">
25
+ <article class="surface surface--muted surface--pad-md surface--radius-surface" data-turn="user">
26
+ <p class="text">Can you make the billing page feel calmer without losing the upgrade prompt?</p>
27
+ </article>
28
+
29
+ <article class="stack stack--gap-sm" data-turn="assistant">
30
+ <p class="text">Yes. I would reduce the number of competing panels, keep the plan state explicit, and move the upgrade prompt into a single bordered decision area.</p>
31
+ <p class="text">The page should feel like account infrastructure first, promotion second.</p>
32
+ </article>
33
+
34
+ <details class="surface surface--muted surface--pad-sm surface--radius-surface surface--border stack stack--gap-sm" aria-label="Collapsed tool call">
35
+ <summary class="stack stack--row stack--justify-between stack--align-center stack--gap-sm">
36
+ <span class="text text--label">Inspecting tokens</span>
37
+ <span class="text text--label text--success">Completed</span>
38
+ </summary>
39
+ <pre class="text text--mono text--muted">read packages/vessel/src/components/billing-card.tsx</pre>
40
+ </details>
41
+
42
+ <article class="stack stack--gap-sm" data-turn="assistant">
43
+ <p class="text">Use one card surface for the current plan, muted rows for secondary facts, and a primary action only where the user can commit. Keep helper copy short and concrete.</p>
44
+ </article>
45
+
46
+ <article class="surface surface--muted surface--pad-md surface--radius-surface" data-turn="user">
47
+ <p class="text">Show me the smallest set of changes.</p>
48
+ </article>
49
+ </section>
50
+
51
+ <form class="surface surface--border-input surface--pad-sm surface--radius-surface stack stack--gap-sm" aria-label="Prompt input">
52
+ <textarea class="input input--textarea" aria-label="Prompt" placeholder="Ask Vessel to revise the interface"></textarea>
53
+ <div class="stack stack--row stack--justify-between stack--align-center stack--gap-sm">
54
+ <div class="stack stack--row stack--gap-xs stack--align-center">
55
+ <button class="button button--ghost button--icon-sm" type="button" aria-label="Attach">+</button>
56
+ <button class="button button--ghost button--icon-sm" type="button" aria-label="Mention">@</button>
57
+ </div>
58
+ <button class="button button--primary button--icon-sm" type="submit" aria-label="Send">↵</button>
59
+ </div>
60
+ </form>
61
+ </main>
62
+ </body>
63
+ </html>
@@ -0,0 +1,74 @@
1
+ <!-- ghost ref annotations
2
+ normative-for: register.editorial — display-scale hero with the single sanctioned kicker (one per page — repeating it on every section is the median tell), --section-padding-vertical rhythm, the sanctioned full-bleed dark band via --surface-dark-*, the pull quote as visual punctuation, one primary action per page at button--size-lg. signature.type — the editorial heading scale (text--display for the hero, --heading-section-* and --heading-sub-* composed locally) used where the words are the composition, product text variants (title, label, body) inside the features. grammar.rhythm — the hero takes the largest gap step (stack--gap-xl) because display scale earns it. grammar.motion — the sanctioned editorial entrance: one staged reveal at --duration-slow with the one ease, opacity and small transform only. grammar.hierarchy — the inverse tone on the dark surface. signature.palette — the editorial volume: exactly two expression hues per page (periwinkle tinting the dark band, amber accenting the pull quote), controls monochrome.
3
+ incidental: all copy; the specific hue assignments (any two of the five expression hues satisfy the budget); the three-feature grid count; content max-widths.
4
+ -->
5
+ <!doctype html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="utf-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <title>Vessel Light — Editorial Landing</title>
11
+ <link rel="stylesheet" href="../tokens.css" />
12
+ <link rel="stylesheet" href="../primitives.css" />
13
+ <style>
14
+ body { margin: 0; }
15
+ .page { width: min(calc(100% - (var(--page-container-side-gutter) * 2)), var(--page-container-max-width)); margin-inline: auto; }
16
+ .section { padding-block: var(--section-padding-vertical); }
17
+ .hero { min-height: calc(var(--section-padding-vertical) * 5); }
18
+ /* editorial entrance: one staged reveal, opacity + small transform, --duration-slow with the one ease */
19
+ .hero > * { animation: hero-enter var(--duration-slow) var(--ease-spring) both; }
20
+ @keyframes hero-enter { from { opacity: 0; transform: translateY(8px); } }
21
+ .label-kicker { text-transform: uppercase; }
22
+ .display-heading { max-width: calc(var(--page-container-side-gutter) * 48); }
23
+ .reading-line { max-width: calc(var(--page-container-side-gutter) * 32); font-size: var(--body-reading-size); line-height: var(--body-reading-line-height); letter-spacing: var(--body-reading-letter-spacing); }
24
+ .section-heading { max-width: calc(var(--page-container-side-gutter) * 36); margin-bottom: var(--section-heading-margin-bottom); font-size: var(--heading-section-font-size); font-weight: var(--heading-section-font-weight); line-height: var(--heading-section-line-height); letter-spacing: var(--heading-section-letter-spacing); }
25
+ .note-heading { max-width: calc(var(--page-container-side-gutter) * 36); margin-bottom: var(--page-container-side-gutter); font-size: var(--heading-sub-font-size); font-weight: var(--heading-sub-font-weight); line-height: var(--heading-sub-line-height); letter-spacing: var(--heading-sub-letter-spacing); }
26
+ /* expression budget: two hues per page — periwinkle tints the dark band, amber accents the pull quote */
27
+ .dark-band { width: 100vw; margin-left: calc(50% - 50vw); background: color-mix(in srgb, var(--expression-2) 12%, var(--surface-dark)); color: var(--surface-dark-text); }
28
+ .dark-inner { width: min(calc(100% - (var(--page-container-side-gutter) * 2)), var(--page-container-max-width)); margin-inline: auto; padding-block: var(--section-padding-vertical); }
29
+ .dark-muted { color: var(--surface-dark-muted); }
30
+ .feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(calc(var(--page-container-side-gutter) * 12), 1fr)); gap: var(--section-heading-margin-bottom); }
31
+ .feature { border-top: 1px solid var(--surface-dark-border); padding-top: var(--page-container-side-gutter); }
32
+ .pullquote { max-width: calc(var(--page-container-side-gutter) * 48); margin: 0; font-size: var(--pullquote-size); font-weight: var(--pullquote-weight); line-height: var(--pullquote-line-height); letter-spacing: var(--pullquote-letter-spacing); padding-left: var(--page-container-side-gutter); position: relative; }
33
+ .pullquote::before { content: "\201C"; position: absolute; left: 0; top: 0; color: var(--expression-1); font-size: var(--pullquote-size); line-height: 1; }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <main>
38
+ <section class="page section hero stack stack--gap-xl stack--align-start stack--justify-center" aria-labelledby="hero-title">
39
+ <p class="text text--label text--muted label-kicker">Independent review layer</p>
40
+ <h1 class="text text--display display-heading" id="hero-title">Make every generated screen answer to the same brand memory.</h1>
41
+ <p class="text reading-line text--muted">Vessel keeps interface materials plain, inspectable, and close to the repo so agents can preserve the feel behind the product, not just the surface.</p>
42
+ <a class="button button--primary button--size-lg" href="#material-system">Review materials</a>
43
+ </section>
44
+
45
+ <section class="dark-band" id="material-system" aria-labelledby="system-title">
46
+ <div class="dark-inner">
47
+ <h2 class="text text--inverse section-heading" id="system-title">A small set of primitives carries the whole system.</h2>
48
+ <div class="feature-grid">
49
+ <article class="feature stack stack--gap-sm">
50
+ <p class="text text--label dark-muted">Density</p>
51
+ <h3 class="text text--title">Compact by default</h3>
52
+ <p class="text dark-muted">Controls stay close to their labels. Surfaces reserve padding for decisions, not decoration.</p>
53
+ </article>
54
+ <article class="feature stack stack--gap-sm">
55
+ <p class="text text--label dark-muted">Restraint</p>
56
+ <h3 class="text text--title">Monochrome first</h3>
57
+ <p class="text dark-muted">Contrast, rhythm, and type scale do the work before color is asked to explain status.</p>
58
+ </article>
59
+ <article class="feature stack stack--gap-sm">
60
+ <p class="text text--label dark-muted">Trust</p>
61
+ <h3 class="text text--title">Every action is explicit</h3>
62
+ <p class="text dark-muted">Buttons name the commitment. Secondary copy clarifies consequence without trying to persuade.</p>
63
+ </article>
64
+ </div>
65
+ </div>
66
+ </section>
67
+
68
+ <section class="page section" aria-labelledby="note-title">
69
+ <h2 class="text note-heading" id="note-title">Why authorship survives generation</h2>
70
+ <blockquote class="pullquote">The interface should feel authored even when an agent produced the first pass.</blockquote>
71
+ </section>
72
+ </main>
73
+ </body>
74
+ </html>
@@ -0,0 +1,89 @@
1
+ <!-- ghost ref annotations
2
+ normative-for: grammar.hierarchy — the complete control emphasis ladder (primary, secondary, outline, ghost, link) working one coherent view with one primary; destructive as a meaning, not a rung; field/label/error anatomy; the product text variants headline, title, body, label, mono; the warning and destructive tones. grammar.rhythm — column stacks with named gap steps, rows only for controls and paired label/value moments. grammar.surfaces — card tier with structural border. signature.shape — --radius-control on every control, --radius-surface on the card.
3
+ incidental: all copy, field values, and key strings; the 560px column width; which specific action occupies each ladder rung; the settings domain itself.
4
+ -->
5
+ <!doctype html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="utf-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <title>Vessel Light — Settings Form</title>
11
+ <link rel="stylesheet" href="../tokens.css" />
12
+ <link rel="stylesheet" href="../primitives.css" />
13
+ <style>
14
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; padding: 24px; }
15
+ main { width: min(100%, 560px); }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <main class="stack stack--gap-lg">
20
+ <header class="stack stack--row stack--justify-between stack--align-end stack--gap-md stack--wrap">
21
+ <div class="stack stack--gap-xs">
22
+ <h1 class="text text--headline">Workspace settings</h1>
23
+ <p class="text text--muted">Tune the defaults your team sees when Vessel drafts interface work.</p>
24
+ </div>
25
+ <button class="button button--secondary button--size-sm" type="button">Invite member</button>
26
+ </header>
27
+
28
+ <section class="surface surface--card surface--pad-lg surface--radius-surface surface--border surface--elevation-card">
29
+ <form class="stack stack--gap-lg">
30
+ <header class="stack stack--gap-sm">
31
+ <h2 class="text text--title">Profile</h2>
32
+ <p class="text text--muted">These values appear on receipts, invites, and review packets.</p>
33
+ </header>
34
+
35
+ <section class="stack stack--gap-md">
36
+ <div class="field">
37
+ <label class="label" for="workspace-name">Workspace name</label>
38
+ <input class="input" id="workspace-name" value="Ghost Studio" />
39
+ </div>
40
+
41
+ <div class="field">
42
+ <label class="label" for="reply-email">Reply email</label>
43
+ <input class="input" id="reply-email" value="design@ghost.example" aria-invalid="true" />
44
+ <p class="field-error">Use a verified sender before inviting collaborators.</p>
45
+ </div>
46
+
47
+ <div class="field">
48
+ <span class="label">Default density</span>
49
+ <div class="input input--select" role="button" tabindex="0" aria-label="Default density">
50
+ <span>Comfortable</span>
51
+ <span aria-hidden="true">⌄</span>
52
+ </div>
53
+ </div>
54
+
55
+ <label class="stack stack--row stack--gap-sm stack--align-center">
56
+ <input class="input input--checkbox" type="checkbox" checked />
57
+ <span class="text">Send weekly review summaries</span>
58
+ </label>
59
+ </section>
60
+
61
+ <section class="stack stack--gap-sm">
62
+ <span class="text text--label text--muted">API access</span>
63
+ <div class="surface surface--muted surface--pad-sm surface--radius-surface stack stack--row stack--justify-between stack--align-center stack--gap-sm stack--wrap">
64
+ <code class="text text--mono text--muted">vsl_live_4f8a…03c2</code>
65
+ <button class="button button--outline button--size-sm" type="button">Regenerate key</button>
66
+ </div>
67
+ <p class="text text--warning">Regenerating invalidates the key currently in use by integrations.</p>
68
+ </section>
69
+
70
+ <section class="stack stack--row stack--justify-between stack--align-center stack--gap-md stack--wrap">
71
+ <div class="stack stack--gap-none">
72
+ <span class="text">Delete this workspace</span>
73
+ <span class="text text--destructive">Removes every fingerprint and review record immediately.</span>
74
+ </div>
75
+ <button class="button button--destructive button--size-sm" type="button">Delete workspace</button>
76
+ </section>
77
+
78
+ <footer class="stack stack--row stack--justify-between stack--align-center stack--gap-sm stack--wrap">
79
+ <a class="button button--link button--size-sm" href="#audit-log">View audit log</a>
80
+ <div class="stack stack--row stack--justify-end stack--gap-sm">
81
+ <button class="button button--ghost" type="button">Cancel</button>
82
+ <button class="button button--primary" type="submit">Save settings</button>
83
+ </div>
84
+ </footer>
85
+ </form>
86
+ </section>
87
+ </main>
88
+ </body>
89
+ </html>
@@ -0,0 +1,66 @@
1
+ <!-- ghost ref annotations
2
+ normative-for: grammar.surfaces — the interrupting end of the elevation set: the modal tier (scrim, --shadow-modal, --radius-surface, compact header, clear footer) and the popover tier (an anchored menu floating above the flow with --shadow-popover). The card tier's home is composition.form.html and composition.table.html; together the three refs cover the closed elevation set. grammar.motion — the dialog reveal at --duration-normal with the one ease, opacity and small transform only. grammar.hierarchy — one primary confirm, ghost escape as button--icon close plus a cancel, menu items as ghost-weight actions; the info tone carrying a state-meaning note. signature.shape — surface radius on both overlay surfaces, the pill (--radius-control) on the icon close.
3
+ incidental: showing the popover and the modal in the same frame (a demonstration convenience — in a live UI the menu closes when the dialog interrupts); all copy and counts; the 512px dialog width; the specific menu items.
4
+ -->
5
+ <!doctype html>
6
+ <html lang="en">
7
+ <head>
8
+ <meta charset="utf-8" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <title>Vessel Light — Overlay</title>
11
+ <link rel="stylesheet" href="../tokens.css" />
12
+ <link rel="stylesheet" href="../primitives.css" />
13
+ <style>
14
+ body { margin: 0; min-height: 100vh; padding: 24px; }
15
+ .page { width: min(100%, 720px); margin-inline: auto; position: relative; }
16
+ .menu { position: absolute; top: 48px; right: 0; width: 220px; }
17
+ .menu-item { justify-content: flex-start; width: 100%; height: 32px; padding: 6px 12px; }
18
+ .scrim { position: fixed; inset: 0; display: grid; place-items: center; padding: 16px; }
19
+ section[role="dialog"] { width: min(100%, 512px); }
20
+ /* dialog reveal: --duration-normal with the one ease, opacity + small transform */
21
+ section[role="dialog"] { animation: dialog-reveal var(--duration-normal) var(--ease-spring) both; }
22
+ @keyframes dialog-reveal { from { opacity: 0; transform: translateY(4px) scale(0.98); } }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <main class="page stack stack--gap-lg">
27
+ <header class="stack stack--row stack--justify-between stack--align-center stack--gap-md">
28
+ <h1 class="text text--headline">Fingerprint</h1>
29
+ <button class="button button--outline button--size-sm" type="button" aria-haspopup="menu" aria-expanded="true">Actions</button>
30
+ </header>
31
+ <p class="text text--muted">Three nodes changed since the last publish. Review the diff, then publish from the actions menu.</p>
32
+
33
+ <!-- popover tier: anchored menu, floats above the flow -->
34
+ <nav class="menu surface surface--popover surface--pad-xs surface--radius-surface surface--border surface--elevation-popover stack stack--gap-none" role="menu" aria-label="Fingerprint actions">
35
+ <button class="button button--ghost menu-item" type="button" role="menuitem">Review diff</button>
36
+ <button class="button button--ghost menu-item" type="button" role="menuitem">Publish changes…</button>
37
+ <button class="button button--ghost menu-item" type="button" role="menuitem">Export package</button>
38
+ </nav>
39
+ </main>
40
+
41
+ <!-- modal tier: scrim, interrupting dialog -->
42
+ <div class="scrim" role="presentation">
43
+ <section class="surface surface--popover surface--pad-lg surface--radius-surface surface--border surface--elevation-modal stack stack--gap-lg" role="dialog" aria-modal="true" aria-labelledby="dialog-title" aria-describedby="dialog-description">
44
+ <header class="stack stack--gap-sm">
45
+ <div class="stack stack--row stack--justify-between stack--align-center stack--gap-md">
46
+ <h2 class="text text--title" id="dialog-title">Publish fingerprint changes?</h2>
47
+ <button class="button button--ghost button--icon" type="button" aria-label="Close">&#215;</button>
48
+ </div>
49
+ <p class="text text--muted" id="dialog-description">This will make the selected brand truths available to agents working in this repo. Review the diff before confirming.</p>
50
+ </header>
51
+
52
+ <div class="surface surface--muted surface--pad-md surface--radius-surface stack stack--gap-xs">
53
+ <p class="text text--label">Included</p>
54
+ <p class="text">3 nodes, 2 material references, 1 review assertion</p>
55
+ </div>
56
+
57
+ <p class="text text--info">Publishing replaces the previous packet for every agent in this repo.</p>
58
+
59
+ <footer class="stack stack--row stack--justify-end stack--gap-sm stack--wrap">
60
+ <button class="button button--ghost" type="button">Cancel</button>
61
+ <button class="button button--primary" type="button">Confirm publish</button>
62
+ </footer>
63
+ </section>
64
+ </div>
65
+ </body>
66
+ </html>