@design-intelligence/ghost 0.0.0-next-20260715121453
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/LICENSE +201 -0
- package/README.md +89 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/checks-command.d.ts +9 -0
- package/dist/commands/checks-command.d.ts.map +1 -0
- package/dist/commands/checks-command.js +52 -0
- package/dist/commands/checks-command.js.map +1 -0
- package/dist/commands/command-discovery.d.ts +57 -0
- package/dist/commands/command-discovery.d.ts.map +1 -0
- package/dist/commands/command-discovery.js +220 -0
- package/dist/commands/command-discovery.js.map +1 -0
- package/dist/commands/errors.d.ts +7 -0
- package/dist/commands/errors.d.ts.map +1 -0
- package/dist/commands/errors.js +19 -0
- package/dist/commands/errors.js.map +1 -0
- package/dist/commands/export-command.d.ts +3 -0
- package/dist/commands/export-command.d.ts.map +1 -0
- package/dist/commands/export-command.js +157 -0
- package/dist/commands/export-command.js.map +1 -0
- package/dist/commands/fingerprint-commands.d.ts +10 -0
- package/dist/commands/fingerprint-commands.d.ts.map +1 -0
- package/dist/commands/fingerprint-commands.js +69 -0
- package/dist/commands/fingerprint-commands.js.map +1 -0
- package/dist/commands/gather-command.d.ts +3 -0
- package/dist/commands/gather-command.d.ts.map +1 -0
- package/dist/commands/gather-command.js +214 -0
- package/dist/commands/gather-command.js.map +1 -0
- package/dist/commands/init-command.d.ts +3 -0
- package/dist/commands/init-command.d.ts.map +1 -0
- package/dist/commands/init-command.js +89 -0
- package/dist/commands/init-command.js.map +1 -0
- package/dist/commands/manifest-command.d.ts +9 -0
- package/dist/commands/manifest-command.d.ts.map +1 -0
- package/dist/commands/manifest-command.js +33 -0
- package/dist/commands/manifest-command.js.map +1 -0
- package/dist/commands/pull-command.d.ts +3 -0
- package/dist/commands/pull-command.d.ts.map +1 -0
- package/dist/commands/pull-command.js +230 -0
- package/dist/commands/pull-command.js.map +1 -0
- package/dist/commands/pulse-command.d.ts +3 -0
- package/dist/commands/pulse-command.d.ts.map +1 -0
- package/dist/commands/pulse-command.js +248 -0
- package/dist/commands/pulse-command.js.map +1 -0
- package/dist/commands/review-command.d.ts +3 -0
- package/dist/commands/review-command.d.ts.map +1 -0
- package/dist/commands/review-command.js +78 -0
- package/dist/commands/review-command.js.map +1 -0
- package/dist/commands/skill-command.d.ts +3 -0
- package/dist/commands/skill-command.d.ts.map +1 -0
- package/dist/commands/skill-command.js +96 -0
- package/dist/commands/skill-command.js.map +1 -0
- package/dist/fingerprint.d.ts +5 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +3 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/ghost-core/catalog/assemble.d.ts +26 -0
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -0
- package/dist/ghost-core/catalog/assemble.js +29 -0
- package/dist/ghost-core/catalog/assemble.js.map +1 -0
- package/dist/ghost-core/catalog/closest.d.ts +16 -0
- package/dist/ghost-core/catalog/closest.d.ts.map +1 -0
- package/dist/ghost-core/catalog/closest.js +63 -0
- package/dist/ghost-core/catalog/closest.js.map +1 -0
- package/dist/ghost-core/catalog/index.d.ts +10 -0
- package/dist/ghost-core/catalog/index.d.ts.map +1 -0
- package/dist/ghost-core/catalog/index.js +9 -0
- package/dist/ghost-core/catalog/index.js.map +1 -0
- package/dist/ghost-core/catalog/menu.d.ts +28 -0
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -0
- package/dist/ghost-core/catalog/menu.js +23 -0
- package/dist/ghost-core/catalog/menu.js.map +1 -0
- package/dist/ghost-core/catalog/types.d.ts +33 -0
- package/dist/ghost-core/catalog/types.d.ts.map +1 -0
- package/dist/ghost-core/catalog/types.js +2 -0
- package/dist/ghost-core/catalog/types.js.map +1 -0
- package/dist/ghost-core/check/index.d.ts +12 -0
- package/dist/ghost-core/check/index.d.ts.map +1 -0
- package/dist/ghost-core/check/index.js +12 -0
- package/dist/ghost-core/check/index.js.map +1 -0
- package/dist/ghost-core/check/lint.d.ts +9 -0
- package/dist/ghost-core/check/lint.d.ts.map +1 -0
- package/dist/ghost-core/check/lint.js +119 -0
- package/dist/ghost-core/check/lint.js.map +1 -0
- package/dist/ghost-core/check/load.d.ts +7 -0
- package/dist/ghost-core/check/load.d.ts.map +1 -0
- package/dist/ghost-core/check/load.js +44 -0
- package/dist/ghost-core/check/load.js.map +1 -0
- package/dist/ghost-core/check/parse.d.ts +12 -0
- package/dist/ghost-core/check/parse.d.ts.map +1 -0
- package/dist/ghost-core/check/parse.js +13 -0
- package/dist/ghost-core/check/parse.js.map +1 -0
- package/dist/ghost-core/check/source-ref.d.ts +27 -0
- package/dist/ghost-core/check/source-ref.d.ts.map +1 -0
- package/dist/ghost-core/check/source-ref.js +58 -0
- package/dist/ghost-core/check/source-ref.js.map +1 -0
- package/dist/ghost-core/check/types.d.ts +48 -0
- package/dist/ghost-core/check/types.d.ts.map +1 -0
- package/dist/ghost-core/check/types.js +4 -0
- package/dist/ghost-core/check/types.js.map +1 -0
- package/dist/ghost-core/errors.d.ts +30 -0
- package/dist/ghost-core/errors.d.ts.map +1 -0
- package/dist/ghost-core/errors.js +33 -0
- package/dist/ghost-core/errors.js.map +1 -0
- package/dist/ghost-core/glob.d.ts +5 -0
- package/dist/ghost-core/glob.d.ts.map +1 -0
- package/dist/ghost-core/glob.js +68 -0
- package/dist/ghost-core/glob.js.map +1 -0
- package/dist/ghost-core/glossary.d.ts +25 -0
- package/dist/ghost-core/glossary.d.ts.map +1 -0
- package/dist/ghost-core/glossary.js +69 -0
- package/dist/ghost-core/glossary.js.map +1 -0
- package/dist/ghost-core/index.d.ts +13 -0
- package/dist/ghost-core/index.d.ts.map +1 -0
- package/dist/ghost-core/index.js +19 -0
- package/dist/ghost-core/index.js.map +1 -0
- package/dist/ghost-core/markdown.d.ts +15 -0
- package/dist/ghost-core/markdown.d.ts.map +1 -0
- package/dist/ghost-core/markdown.js +30 -0
- package/dist/ghost-core/markdown.js.map +1 -0
- package/dist/ghost-core/material-transport.d.ts +43 -0
- package/dist/ghost-core/material-transport.d.ts.map +1 -0
- package/dist/ghost-core/material-transport.js +231 -0
- package/dist/ghost-core/material-transport.js.map +1 -0
- package/dist/ghost-core/materials.d.ts +14 -0
- package/dist/ghost-core/materials.d.ts.map +1 -0
- package/dist/ghost-core/materials.js +52 -0
- package/dist/ghost-core/materials.js.map +1 -0
- package/dist/ghost-core/node/index.d.ts +11 -0
- package/dist/ghost-core/node/index.d.ts.map +1 -0
- package/dist/ghost-core/node/index.js +11 -0
- package/dist/ghost-core/node/index.js.map +1 -0
- package/dist/ghost-core/node/parse.d.ts +16 -0
- package/dist/ghost-core/node/parse.d.ts.map +1 -0
- package/dist/ghost-core/node/parse.js +55 -0
- package/dist/ghost-core/node/parse.js.map +1 -0
- package/dist/ghost-core/node/schema.d.ts +17 -0
- package/dist/ghost-core/node/schema.d.ts.map +1 -0
- package/dist/ghost-core/node/schema.js +49 -0
- package/dist/ghost-core/node/schema.js.map +1 -0
- package/dist/ghost-core/node/serialize.d.ts +12 -0
- package/dist/ghost-core/node/serialize.d.ts.map +1 -0
- package/dist/ghost-core/node/serialize.js +39 -0
- package/dist/ghost-core/node/serialize.js.map +1 -0
- package/dist/ghost-core/node/steering.d.ts +19 -0
- package/dist/ghost-core/node/steering.d.ts.map +1 -0
- package/dist/ghost-core/node/steering.js +68 -0
- package/dist/ghost-core/node/steering.js.map +1 -0
- package/dist/ghost-core/node/types.d.ts +43 -0
- package/dist/ghost-core/node/types.d.ts.map +1 -0
- package/dist/ghost-core/node/types.js +2 -0
- package/dist/ghost-core/node/types.js.map +1 -0
- package/dist/ghost-core/package-manifest.d.ts +19 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -0
- package/dist/ghost-core/package-manifest.js +24 -0
- package/dist/ghost-core/package-manifest.js.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts +28 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.js +51 -0
- package/dist/ghost-core/skill-bundle-loader.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/init-payloads/median/cliche.median.md +86 -0
- package/dist/init-payloads/median/median-tells.md +117 -0
- package/dist/init-payloads/skeleton/brand.md +23 -0
- package/dist/init-payloads/skeleton/context.conversation.md +24 -0
- package/dist/init-payloads/skeleton/foundation.color.md +39 -0
- package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
- package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
- package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
- package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
- package/dist/init-payloads/skeleton/foundation.type.md +44 -0
- package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
- package/dist/init-payloads/skeleton/glossary.md +39 -0
- package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
- package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
- package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
- package/dist/init-payloads/vessel-light/checks/values.md +51 -0
- package/dist/init-payloads/vessel-light/glossary.md +44 -0
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
- package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
- package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
- package/dist/init-payloads/vessel-light/index.md +33 -0
- package/dist/init-payloads/vessel-light/manifest.yml +3 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
- package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
- package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
- package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
- package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
- package/dist/init-payloads/vessel-light/register.email.md +43 -0
- package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
- package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
- package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
- package/dist/init-payloads/vessel-light/signature.type.md +37 -0
- package/dist/internal/fs.d.ts +4 -0
- package/dist/internal/fs.d.ts.map +1 -0
- package/dist/internal/fs.js +24 -0
- package/dist/internal/fs.js.map +1 -0
- package/dist/observability-events.d.ts +34 -0
- package/dist/observability-events.d.ts.map +1 -0
- package/dist/observability-events.js +68 -0
- package/dist/observability-events.js.map +1 -0
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +10 -0
- package/dist/package-version.js.map +1 -0
- package/dist/review/baseline.d.ts +11 -0
- package/dist/review/baseline.d.ts.map +1 -0
- package/dist/review/baseline.js +35 -0
- package/dist/review/baseline.js.map +1 -0
- package/dist/review/diff.d.ts +7 -0
- package/dist/review/diff.d.ts.map +1 -0
- package/dist/review/diff.js +41 -0
- package/dist/review/diff.js.map +1 -0
- package/dist/review/glob.d.ts +2 -0
- package/dist/review/glob.d.ts.map +1 -0
- package/dist/review/glob.js +2 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/probes.d.ts +13 -0
- package/dist/review/probes.d.ts.map +1 -0
- package/dist/review/probes.js +45 -0
- package/dist/review/probes.js.map +1 -0
- package/dist/review/resolve.d.ts +28 -0
- package/dist/review/resolve.d.ts.map +1 -0
- package/dist/review/resolve.js +90 -0
- package/dist/review/resolve.js.map +1 -0
- package/dist/review/review-packet.d.ts +41 -0
- package/dist/review/review-packet.d.ts.map +1 -0
- package/dist/review/review-packet.js +128 -0
- package/dist/review/review-packet.js.map +1 -0
- package/dist/scan/check-files.d.ts +23 -0
- package/dist/scan/check-files.d.ts.map +1 -0
- package/dist/scan/check-files.js +75 -0
- package/dist/scan/check-files.js.map +1 -0
- package/dist/scan/check-scaffold.d.ts +8 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -0
- package/dist/scan/check-scaffold.js +53 -0
- package/dist/scan/check-scaffold.js.map +1 -0
- package/dist/scan/constants.d.ts +21 -0
- package/dist/scan/constants.d.ts.map +1 -0
- package/dist/scan/constants.js +21 -0
- package/dist/scan/constants.js.map +1 -0
- package/dist/scan/file-kind.d.ts +12 -0
- package/dist/scan/file-kind.d.ts.map +1 -0
- package/dist/scan/file-kind.js +114 -0
- package/dist/scan/file-kind.js.map +1 -0
- package/dist/scan/fingerprint-package-lint.d.ts +8 -0
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-lint.js +284 -0
- package/dist/scan/fingerprint-package-lint.js.map +1 -0
- package/dist/scan/fingerprint-package-loader.d.ts +5 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-loader.js +78 -0
- package/dist/scan/fingerprint-package-loader.js.map +1 -0
- package/dist/scan/fingerprint-package.d.ts +66 -0
- package/dist/scan/fingerprint-package.d.ts.map +1 -0
- package/dist/scan/fingerprint-package.js +101 -0
- package/dist/scan/fingerprint-package.js.map +1 -0
- package/dist/scan/index.d.ts +3 -0
- package/dist/scan/index.d.ts.map +1 -0
- package/dist/scan/index.js +3 -0
- package/dist/scan/index.js.map +1 -0
- package/dist/scan/lint.d.ts +15 -0
- package/dist/scan/lint.d.ts.map +1 -0
- package/dist/scan/lint.js +2 -0
- package/dist/scan/lint.js.map +1 -0
- package/dist/scan/node-files.d.ts +25 -0
- package/dist/scan/node-files.d.ts.map +1 -0
- package/dist/scan/node-files.js +112 -0
- package/dist/scan/node-files.js.map +1 -0
- package/dist/scan/package-paths.d.ts +10 -0
- package/dist/scan/package-paths.d.ts.map +1 -0
- package/dist/scan/package-paths.js +49 -0
- package/dist/scan/package-paths.js.map +1 -0
- package/dist/scan/packed-payloads.d.ts +4 -0
- package/dist/scan/packed-payloads.d.ts.map +1 -0
- package/dist/scan/packed-payloads.js +55 -0
- package/dist/scan/packed-payloads.js.map +1 -0
- package/dist/scan/tarball.d.ts +23 -0
- package/dist/scan/tarball.d.ts.map +1 -0
- package/dist/scan/tarball.js +145 -0
- package/dist/scan/tarball.js.map +1 -0
- package/dist/scan/templates.d.ts +42 -0
- package/dist/scan/templates.d.ts.map +1 -0
- package/dist/scan/templates.js +375 -0
- package/dist/scan/templates.js.map +1 -0
- package/dist/skill-bundle/SKILL.md +146 -0
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +184 -0
- package/dist/skill-bundle/references/blocks.md +179 -0
- package/dist/skill-bundle/references/brief.md +50 -0
- package/dist/skill-bundle/references/capture.md +392 -0
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +36 -0
- package/dist/skill-bundle/references/schema.md +114 -0
- package/dist/skill-bundle/references/self-check.md +65 -0
- package/dist/skill-bundle/references/steering-audit.md +60 -0
- package/package.json +79 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Surface roles and the closed elevation set — gather for any card, popover, modal, dialog, scrim, or bordered container; flat is the default, borders are structural, exactly three elevation tiers."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/primitives.css
|
|
5
|
+
- materials/ref/composition.overlay.html
|
|
6
|
+
- "**/*.html"
|
|
7
|
+
- "**/*.css"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Surface is the only way an element gets a background, border, radius, or
|
|
11
|
+
shadow. If a container needs visual treatment, it first needs a surface role.
|
|
12
|
+
|
|
13
|
+
The vocabulary is closed: role, padding, radius, border, and elevation. These
|
|
14
|
+
axes create enough range for page flow, cards, popovers, muted blocks,
|
|
15
|
+
accents, and dark moments without inventing one-off boxes.
|
|
16
|
+
|
|
17
|
+
The default surface is flat: no border, no shadow. We do not outline
|
|
18
|
+
everything to prove layout exists.
|
|
19
|
+
|
|
20
|
+
The elevation tiers are exactly three: card, popover, modal. Elevation
|
|
21
|
+
implies hierarchy — a card sits in the document flow, a popover floats above
|
|
22
|
+
the flow, a modal interrupts the task. Pick the tier that matches the
|
|
23
|
+
interaction; never write a custom shadow because the composition feels flat,
|
|
24
|
+
and never pair a low tier with an interrupting role or give a routine card
|
|
25
|
+
modal gravity. Component shadows belong to the primitives that own them;
|
|
26
|
+
never borrow them for layout.
|
|
27
|
+
|
|
28
|
+
Borders are structural, especially for inputs and overlays. They are not
|
|
29
|
+
decorative frames around ordinary text — reject borders as decoration,
|
|
30
|
+
especially around assistant text, and use space, tone, and type hierarchy
|
|
31
|
+
instead.
|
|
32
|
+
|
|
33
|
+
The overlay reference shows the interrupting end of the system: background
|
|
34
|
+
scrim, modal radius, modal shadow, compact header, clear footer. Copy its
|
|
35
|
+
hierarchy when a user must stop and decide.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Always read first: Vessel's design language as a raw HTML/CSS steering packet for agents."
|
|
3
|
+
materials:
|
|
4
|
+
- materials/tokens.css
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
vessel-light is Vessel without the React package: the design language as a
|
|
8
|
+
steering packet for agents writing raw HTML and CSS.
|
|
9
|
+
|
|
10
|
+
The contract is narrow. Style only with the tokens. Compose only with the
|
|
11
|
+
closed sets the grammar enumerates. Imitate the refs when the task matches —
|
|
12
|
+
worked examples to copy from, not a framework to import.
|
|
13
|
+
|
|
14
|
+
Grammar and the median floor are safe verbatim, unchanged by any adaptation.
|
|
15
|
+
Signature nodes state Vessel's current answer and stand until you replace
|
|
16
|
+
them. Registers — editorial, email, and data-density — name the situations
|
|
17
|
+
where parts of the default contract invert; pull only the nodes whose
|
|
18
|
+
conditions match the task, because truths from the wrong register are
|
|
19
|
+
poison, not context.
|
|
20
|
+
|
|
21
|
+
Monochrome comes first. Status color is functional language — danger,
|
|
22
|
+
success, warning, information — never atmosphere. Atmosphere is catered: a
|
|
23
|
+
five-hue expression palette whose volume rises with the register, from
|
|
24
|
+
charts-only in product to two hues in editorial, and never on controls.
|
|
25
|
+
|
|
26
|
+
It protects the taste that disappears when an agent freehands: quiet
|
|
27
|
+
surfaces, deliberate spacing, one obvious action, restrained motion.
|
|
28
|
+
|
|
29
|
+
Name the reader's job before composing anything — the job picks the ref and
|
|
30
|
+
the register, never the topic. When a requested UI is not covered by a ref,
|
|
31
|
+
compose from the grammar; do not invent a new styling system. Before
|
|
32
|
+
anything ships, run the deletion pass: every element names what breaks if
|
|
33
|
+
it goes, and the view arrives settled.
|
|
@@ -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>
|