@nebutra/tokens 0.1.3 → 3.0.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 (41) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/brands/README.md +66 -0
  3. package/brands/cosmos/DESIGN.md +356 -0
  4. package/brands/cosmos/brand.json +209 -0
  5. package/brands/cosmos/refero-tokens.json +312 -0
  6. package/brands/gsap/brand.json +1 -27
  7. package/brands/linear/DESIGN.md +478 -0
  8. package/brands/linear/brand.json +2 -19
  9. package/brands/notion/brand.json +2 -28
  10. package/brands/raycast/brand.json +2 -17
  11. package/brands/stripe/brand.json +1 -16
  12. package/brands/vanta/brand.json +1 -38
  13. package/brands/vercel/brand.json +1 -18
  14. package/dist/brand-package/index.d.ts +13 -7
  15. package/dist/brand-package/index.js +2290 -34
  16. package/dist/brand-package/index.js.map +1 -1
  17. package/dist/brand-package/use-brand.d.ts +1 -1
  18. package/dist/brand-package/use-brand.js +957 -5
  19. package/dist/brand-package/use-brand.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +2417 -22
  22. package/dist/index.js.map +1 -1
  23. package/dist/{use-brand-C8d4DPqE.d.ts → use-brand-ClmvK_lC.d.ts} +19 -3
  24. package/dist/values.d.ts +1192 -0
  25. package/dist/values.js +518 -0
  26. package/dist/values.js.map +1 -0
  27. package/package.json +16 -4
  28. package/recipe.css +36 -2
  29. package/skins/cosmos.css +239 -0
  30. package/skins/gsap.css +32 -20
  31. package/skins/linear.css +54 -17
  32. package/skins/notion.css +36 -25
  33. package/skins/raycast.css +37 -19
  34. package/skins/stripe.css +34 -15
  35. package/skins/vanta.css +34 -30
  36. package/skins/vercel.css +55 -19
  37. package/styles.css +492 -149
  38. package/dist/chunk-ALJTP5HL.js +0 -881
  39. package/dist/chunk-ALJTP5HL.js.map +0 -1
  40. package/dist/chunk-RGUJQOLH.js +0 -1582
  41. package/dist/chunk-RGUJQOLH.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @nebutra/tokens
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies []:
8
+ - @nebutra/design-tokens@3.0.0
9
+ - @nebutra/fonts@3.0.0
10
+
11
+ ## 2.0.0
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies []:
16
+ - @nebutra/design-tokens@2.0.0
17
+ - @nebutra/fonts@2.0.0
18
+
3
19
  ## 0.1.2
4
20
 
5
21
  ### Patch Changes
@@ -0,0 +1,66 @@
1
+ # Brand Packages — the SSOT
2
+
3
+ One folder per design language. `brand.json` is the single source of truth; the
4
+ emitted skin (`../skins/<id>.css`), the catalog entry
5
+ (`@nebutra/theme` → `src/languages.json`) and the built-in package are all
6
+ generated from it.
7
+
8
+ ```
9
+ brands/<id>/
10
+ brand.json ← SSOT. Hand-edited, then regenerate.
11
+ DESIGN.md ← the human style reference brand.json was written from
12
+ refero-tokens.json ← the raw export, when one exists
13
+ ```
14
+
15
+ ## Commit the reference next to the JSON
16
+
17
+ **`DESIGN.md` is not optional.** A Brand Package is a pile of HSL triples; the
18
+ document is the only thing that says *why* a value is what it is, and the only
19
+ thing a reviewer can check the JSON against.
20
+
21
+ This is a rule because its absence already cost us a whole design system. Cosmos's
22
+ style reference never entered the repo — the app carried a **Linear** export in a
23
+ local `design/` folder instead. So `brands/cosmos/brand.json` was authored by
24
+ reading hex values off the running page, and it shipped with:
25
+
26
+ - `#f6f6f4` where the spec says `#f7f5f3`, `#111111` where it says `#0d0d0d`
27
+ - `#ecece8` as a third surface, in a system that defines exactly two
28
+ - Linear's acid-lime in `roles.brand`, which the system's own don't-list forbids
29
+ outright — *"Do not introduce accent colors into interface chrome."*
30
+
31
+ Every one of those read plausible. Nothing in CI could catch it, because nothing
32
+ in the repo said what the answer was supposed to be. See
33
+ `cosmos/brand.json` → `extensions.notes` for the full account.
34
+
35
+ ## Rules
36
+
37
+ 1. **The reference lives here, not in the app.** An app never keeps its own copy
38
+ of a design system's tokens or DESIGN.md. It consumes the emitted skin via
39
+ `html[data-brand="<id>"]` and `@nebutra/tokens/skins/<id>.css`.
40
+ 2. **Write `brand.json` from the document, never from a running page.** A round
41
+ or familiar hex (`#111111`, `#f6f6f4`) where a deliberate one belongs is the
42
+ tell that someone eyeballed it.
43
+ 3. **A font stack must name a family in `FONT_REGISTRY`** (`@nebutra/fonts`).
44
+ `emit-skins` refuses to write a skin whose type would silently fall back to
45
+ the system font — next/font registers each face under a hashed family name
46
+ reachable only through its CSS variable, so a bare `"Fraunces"` renders
47
+ nothing. Register the face first.
48
+ 4. **When the original face is not licensed, record the substitute as a
49
+ decision**, in `extensions.notes`, so the next reader does not treat it as
50
+ debt to repay.
51
+
52
+ ## Regenerate after any edit
53
+
54
+ ```bash
55
+ pnpm --filter @nebutra/theme build:codegen
56
+ # sync-languages → emit-skins → sync-skins → tsup
57
+ ```
58
+
59
+ A correctly scoped edit changes exactly one skin. If `../skins/` comes back with
60
+ several files touched, something leaked between languages.
61
+
62
+ ## Adding a brand from a Refero export
63
+
64
+ See [`../skins/README.md`](../skins/README.md) → *Compile from Refero export*.
65
+ Land the export's `DESIGN.md` (and `tokens.json`, as `refero-tokens.json`) in the
66
+ same commit as the generated `brand.json`.
@@ -0,0 +1,356 @@
1
+ # Cosmos — Style Reference
2
+ > Linen gallery wall with floating polaroids
3
+
4
+ **Theme:** light
5
+
6
+ Cosmos is a gallery-wrapped canvas for visual discovery: a warm cream background (#f7f5f3) that reads like unprimed linen, black ink typography, and a strict monochrome UI where color only intrudes through user-curated imagery. The product believes in restraint — the chrome is invisible so the images can shout. Type is a single custom serif-influenced face (cosmosOracle) pulled tight with negative tracking, using weight 350 for hero copy to create editorial softness rather than marketing aggression. Surfaces are flat with a single signature radius (16px) repeated across cards, inputs, and video containers. The hero scatters image tiles in a free-form collage that frames centered copy, and the rest of the page settles into a three-column grid of image-led feature cards. There are no gradients, no shadows beyond what the collage cards cast naturally, and no chromatic accents in the interface itself.
7
+
8
+ ## Tokens — Colors
9
+
10
+ | Name | Value | Token | Role |
11
+ |------|-------|-------|------|
12
+ | Linen Canvas | `#f7f5f3` | `--color-linen-canvas` | Page background — warm off-white, never pure #ffffff at the root, gives the interface a paper-like, gallery-wall base |
13
+ | Ink Black | `#0d0d0d` | `--color-ink-black` | Dark supporting neutral for text, icons, and strong contrast. Do not promote it to the primary CTA color; Borders, dividers, outlined button strokes — used at low opacity to create subtle structural lines, always Ink Black rather than a separate gray |
14
+ | Paper White | `#ffffff` | `--color-paper-white` | Light supporting surface for subtle backgrounds and section separation. Do not promote it to the primary CTA color |
15
+ | Stone | `#6e6a69` | `--color-stone` | Body text, secondary icons, inactive UI — warm mid-gray for body copy and supporting metadata |
16
+ | Pebble | `#9a9796` | `--color-pebble` | Muted helper text, disabled states, tertiary icon strokes — lightest readable gray in the neutral ramp |
17
+
18
+ ## Tokens — Typography
19
+
20
+ ### cosmosOracle — Single custom face used for everything. Weight 350 is the signature — hero and display copy use this whisper-weight instead of the conventional 700, creating editorial calm. Weight 400 for body, weight 500 reserved for buttons and labels. Negative tracking scales with size: tightest (-0.05em) on the 74px display, opening to normal at 14px. The low line-heights on large sizes (0.80–1.10) hug the baseline tightly so headlines read as deliberate blocks, not airy paragraphs. · `--font-cosmosoracle`
21
+ - **Substitute:** GT Super, Fraunces, or any high-contrast didone-influenced serif with optical sizing; fall back to 'Georgia' if no serif is available
22
+ - **Weights:** 350, 400, 500
23
+ - **Sizes:** 14, 15, 16, 18, 24, 26, 33, 38, 58, 66, 74
24
+ - **Line height:** 0.80, 1.00, 1.06, 1.08, 1.10, 1.20, 1.25, 1.29, 1.50
25
+ - **Letter spacing:** -0.0500em at 74/66/58px, -0.0400em at 38/33px, -0.0200em at 24/26px, -0.0110em at 18/16px, 0 at 14/15px
26
+ - **OpenType features:** `Opt for old-style figures and discretionary ligatures if cosmosOracle exposes them; the typeface behaves like a didone-meets-grotesque hybrid`
27
+ - **Role:** Single custom face used for everything. Weight 350 is the signature — hero and display copy use this whisper-weight instead of the conventional 700, creating editorial calm. Weight 400 for body, weight 500 reserved for buttons and labels. Negative tracking scales with size: tightest (-0.05em) on the 74px display, opening to normal at 14px. The low line-heights on large sizes (0.80–1.10) hug the baseline tightly so headlines read as deliberate blocks, not airy paragraphs.
28
+
29
+ ### Type Scale
30
+
31
+ | Role | Size | Line Height | Letter Spacing | Token |
32
+ |------|------|-------------|----------------|-------|
33
+ | caption | 14px | 1.5 | — | `--text-caption` |
34
+ | body | 16px | 1.5 | -0.18px | `--text-body` |
35
+ | subheading | 18px | 1.29 | -0.2px | `--text-subheading` |
36
+ | heading-sm | 24px | 1.2 | -0.48px | `--text-heading-sm` |
37
+ | heading | 33px | 1.1 | -1.32px | `--text-heading` |
38
+ | heading-lg | 38px | 1.08 | -1.52px | `--text-heading-lg` |
39
+ | display | 58px | 1.06 | -2.32px | `--text-display` |
40
+ | display-xl | 74px | 0.8 | -3.7px | `--text-display-xl` |
41
+
42
+ ## Tokens — Spacing & Shapes
43
+
44
+ **Base unit:** 4px
45
+
46
+ **Density:** comfortable
47
+
48
+ ### Spacing Scale
49
+
50
+ | Name | Value | Token |
51
+ |------|-------|-------|
52
+ | 4 | 4px | `--spacing-4` |
53
+ | 8 | 8px | `--spacing-8` |
54
+ | 16 | 16px | `--spacing-16` |
55
+ | 20 | 20px | `--spacing-20` |
56
+ | 24 | 24px | `--spacing-24` |
57
+ | 32 | 32px | `--spacing-32` |
58
+ | 40 | 40px | `--spacing-40` |
59
+ | 48 | 48px | `--spacing-48` |
60
+ | 72 | 72px | `--spacing-72` |
61
+ | 200 | 200px | `--spacing-200` |
62
+
63
+ ### Border Radius
64
+
65
+ | Element | Value |
66
+ |---------|-------|
67
+ | cards | 16px |
68
+ | inputs | 16px |
69
+ | buttons | 16px |
70
+ | imageTiles | 12px |
71
+ | videoContainer | 16px |
72
+
73
+ ### Layout
74
+
75
+ - **Page max-width:** 1280px
76
+ - **Section gap:** 80px
77
+ - **Card padding:** 16px
78
+ - **Element gap:** 24px
79
+
80
+ ## Components
81
+
82
+ ### Primary Filled Button
83
+ **Role:** Main conversion action (Sign up)
84
+
85
+ Ink Black (#0d0d0d) fill, Paper White (#ffffff) text, cosmosOracle weight 500, 16px font-size, 16px border-radius, 16px vertical / 24px horizontal padding. Tight, pill-like but squared at the radius. No shadow, no border.
86
+
87
+ ### Secondary Outlined Button
88
+ **Role:** Secondary action (Get the app, Login)
89
+
90
+ Paper White (#ffffff) fill, 1px Ink Black border at ~15% opacity, Ink Black text, 16px radius, 16px/24px padding. Identical sizing to the primary button so they pair as a two-button row.
91
+
92
+ ### Pill Navigation Bar
93
+ **Role:** Top-of-page floating navigation
94
+
95
+ A single horizontal pill containing the logo (8-dot cluster glyph), Explore / Careers links, centered search input, and Login / Sign up. Background is Paper White with subtle border, 9999px radius, hovers just below the top edge of the viewport with no shadow.
96
+
97
+ ### Search Input
98
+ **Role:** Global search inside the nav pill
99
+
100
+ Borderless text input with a leading magnifier icon, placeholder 'Search Cosmos...' in Stone (#6e6a69). Transparent fill so it sits flush inside the nav pill. 16px text, weight 400.
101
+
102
+ ### Floating Image Tile
103
+ **Role:** Scattered collage images in the hero
104
+
105
+ User-content image cropped to ~12px border-radius, floating at slight rotations or in a loose grid around the hero text. No caption, no border, no shadow — the image is the component. Sized 60–140px, positioned absolutely around the centered headline.
106
+
107
+ ### Feature Image Card
108
+ **Role:** Three-up feature row showing product capabilities
109
+
110
+ Large image-first card with a 16px radius. The image fills the card edge-to-edge; below it sits a cosmosOracle weight 400 label at 18px (e.g. 'By color'). No visible border, no shadow, no background color — the image defines the card. Three cards sit in a 3-column grid with 24px gap.
111
+
112
+ ### Video Container
113
+ **Role:** Full-bleed film/video embed
114
+
115
+ A 16px-radius container spanning the page max-width, holding a video poster with a 9-dot loading animation overlaid in white at center. Split text overlay: 'Watch' left-aligned and 'the film' right-aligned at 38px weight 350, with a play triangle between. Small caption 'featuring Odessa Azion' centered near the bottom.
116
+
117
+ ### AI Content Detection Overlay
118
+ **Role:** AI-generated image warning card
119
+
120
+ Paper White surface with 12px radius, ~280px wide, positioned top-right inside a feature card. Title 'AI content' in Ink Black 16px weight 500, body 'Content detected as likely generated by AI' in Stone 14px. Below: three text buttons — 'Show' (Ink Black, 16px radius, white fill), 'Blur' (neutral), 'Hide' (neutral).
121
+
122
+ ### Text Link with Play Icon
123
+ **Role:** Inline call-to-action link (Watch our new film)
124
+
125
+ Inline at 18px weight 400, Ink Black, preceded by a small triangle play icon. No underline by default; subtle color shift on hover. Used for tertiary navigation cues that should not compete with the button row.
126
+
127
+ ### Theme Toggle
128
+ **Role:** Light/dark mode switch in the nav
129
+
130
+ A small icon-only button (sun/moon glyph) at the right edge of the nav pill, before the Login/Sign up cluster. 32×32px hit area, no visible border, 9999px radius on hover background.
131
+
132
+ ### Eyebrow Label
133
+ **Role:** Small uppercase section pre-title
134
+
135
+ cosmosOracle weight 500, 15–16px, tracked at 0em, rendered as 'COSMOS' above the hero headline. Sets the editorial tone: small, all-caps, almost a stamp rather than a label.
136
+
137
+ ### Dot Cluster Logo
138
+ **Role:** Brand mark in nav and favicon
139
+
140
+ Eight small black dots arranged in a 3×3 grid with the center dot removed, reading as a tiny flower or asterisk. Always Ink Black on Linen Canvas, always at ~18px in the nav, larger at marketing contexts.
141
+
142
+ ## Do's and Don'ts
143
+
144
+ ### Do
145
+ - Use only Linen Canvas (#f7f7f5f3) as the root background — never pure white at the page level; white is reserved for cards and inputs.
146
+ - Apply 16px border-radius to every container, button, and input — this is the single signature radius of the system.
147
+ - Set hero and display copy at weight 350 with letter-spacing between -0.04em and -0.05em; do not bold headlines above 400.
148
+ - Pair every primary filled button with an outlined secondary at identical padding and radius so they read as a set.
149
+ - Let user imagery carry all chromatic content; the UI palette stays at black/white/cream/gray.
150
+ - Use 24px gaps between grid cards and 16px padding inside cards as the default content rhythm.
151
+ - Position the nav as a single floating pill with 9999px radius at the top of every page.
152
+
153
+ ### Don't
154
+ - Do not introduce accent colors (red, blue, green) into interface chrome — color belongs only in user content.
155
+ - Do not use weights above 500 in cosmosOracle; the face is not designed for bold display and will feel chunky.
156
+ - Do not apply shadows to cards or buttons; the system is deliberately flat and relies on radius and surface contrast.
157
+ - Do not set body text larger than 18px or below 14px; cosmosOracle was sized for a tight 14–18px body range.
158
+ - Do not mix border-radius values within a single page (avoid 8px or 24px radii) — 16px is the rule, 12px only for image tiles.
159
+ - Do not use pure #000000; always #0d0d0d so the black warms against the cream canvas.
160
+ - Do not place colored backgrounds behind text; all text sits on Linen Canvas, Paper White, or directly on imagery.
161
+
162
+ ## Surfaces
163
+
164
+ | Level | Name | Value | Purpose |
165
+ |-------|------|-------|---------|
166
+ | 0 | Linen Canvas | `#f7f5f3` | Root page background, the gallery wall |
167
+ | 1 | Paper White | `#ffffff` | Cards, inputs, outlined buttons — the only elevated surface in the system |
168
+
169
+ ## Elevation
170
+
171
+ Cosmos is intentionally flat: no drop shadows on cards, buttons, or the navigation pill. Elevation is communicated exclusively through surface color contrast — Linen Canvas (#f7f5f3) at the base, Paper White (#ffffff) for cards and inputs sitting on top. The only depth in the interface comes from the scattered hero image tiles, which read as physical polaroids on the canvas. Resist adding shadows; the flatness is the point.
172
+
173
+ ## Imagery
174
+
175
+ Imagery is the product, not decoration. The hero scatters small cropped image tiles (60–140px) at 12px radius around the centered text like polaroids pinned to a gallery wall. The three feature cards lead with edge-to-edge photography and collage — vivid red florals, warm beige bag silhouettes, and moody purple portraiture — each carrying the only chromatic color in the interface. The video container uses a cinematic still (green-tiled interior, soft focus) with a 9-dot loading animation overlaid in white. There are no illustrations, no abstract graphics, no 3D renders. Icons are minimal stroked linework in Ink Black, used sparingly (magnifier, play triangle, sun/moon, social glyphs). Photography style across the collage feels curated and editorial: high contrast, varied subjects, no unified color treatment — the variety is the point.
176
+
177
+ ## Layout
178
+
179
+ Page is centered with a ~1280px max-width content well, though the hero uses full-bleed positioning for the scattered image tiles. The hero is a centered text stack: eyebrow ('COSMOS') → 74px headline → two-button row, all vertically and horizontally centered while image tiles float around the periphery at varied rotations. Below the hero, the video container spans the full content width at 16px radius. The feature row is a strict 3-column grid with 24px gap, each cell leading with an image and trailing with a 18px label. Navigation is a single floating pill bar that hovers near the top of the viewport on every page, containing logo, two text links, centered search, theme toggle, and Login/Sign up — it never duplicates into a secondary bar. Vertical rhythm between sections is generous (80px+), giving each band room to breathe like separate gallery rooms.
180
+
181
+ ## Agent Prompt Guide
182
+
183
+ **Quick Color Reference**
184
+ - text: #0d0d0d (Ink Black)
185
+ - background: #f7f5f3 (Linen Canvas)
186
+ - surface/card: #ffffff (Paper White)
187
+ - muted text: #6e6a69 (Stone)
188
+ - border: #0d0d0d at 10–15% opacity
189
+ - primary action: no distinct CTA color
190
+
191
+ **3-5 Example Component Prompts**
192
+ 1. *Hero headline*: Center a 74px cosmosOracle weight 350 headline in #0d0d0d with letter-spacing -3.7px and line-height 0.80. Above it place a 15px weight 500 'COSMOS' eyebrow in Ink Black, tracked at 0. Below place a two-button row: a filled Ink Black button with white 16px text at weight 500, 16px radius, 16px/24px padding, beside a white outlined button with 1px Ink Black border at 12% opacity, identical radius and padding. All on a #f7f5f3 canvas.
193
+
194
+ 2. *Feature image card*: A 3-column grid card with 16px radius, edge-to-edge image filling the card (no padding around the image), and a 18px cosmosOracle weight 400 label in Ink Black below the image at 16px top spacing. No border, no shadow. Gap between cards: 24px.
195
+
196
+ 3. *Floating image tile (hero collage)*: A 100px square user-content image with 12px border-radius, positioned absolutely with a slight 2–4° rotation, no border, no shadow, sitting on the Linen Canvas around the hero text. No caption.
197
+
198
+ 4. *Video container*: A full-width (within 1280px max) 16:9 container with 16px radius, holding a photographic poster image. Overlay a 3×3 grid of 8 white dots (center removed) at 60% opacity in the center. Place 'Watch' left-aligned and 'the film' right-aligned at 38px weight 350 in white, with a small white play triangle between them. Small 14px caption 'featuring …' centered near the bottom in white at 70% opacity.
199
+
200
+ 5. *AI content overlay*: A 280px wide Paper White (#ffffff) card with 12px radius, positioned top-right of a feature image. Title 'AI content' in 16px weight 500 Ink Black, body text 'Content detected as likely generated by AI' in 14px Stone. Three text buttons below: 'Show' as a small filled Ink Black button (16px radius, white text, 8px/16px padding), 'Blur' and 'Hide' as neutral text buttons in Stone.
201
+
202
+ ## Typography Signature
203
+
204
+ The defining typographic choice is using a whisper-weight (350) serif at display sizes. Most modern product sites reach for 600–800 on hero copy; Cosmos goes the other way, letting the serif's high stroke contrast and tight tracking carry authority without volume. The negative letter-spacing scales aggressively with size (-0.05em at 74px, 0 at 14px), which is what makes the large headlines feel architectural rather than decorative. When recreating pages, never substitute a bold sans for the display — the soft serif is the entire brand voice.
205
+
206
+ ## Image-First Component Rule
207
+
208
+ Cosmos is a visual product, so the component system intentionally limits UI chrome and lets images do the work. The rule: if a component is not navigation, input, or a button, it is probably an image card with a small text label. Resist building dashboards, tables, or data-dense UI; this system is for galleries, feeds, and discovery surfaces where the image is the unit of value.
209
+
210
+ ## Similar Brands
211
+
212
+ - **Are.na** — Same warm cream canvas, monochrome UI that stays out of the way of user-curated imagery, and an editorial single-typeface approach to a visual bookmarking product
213
+ - **Pinterest** — Image-led grid systems and the philosophy that color belongs to user content, not the interface chrome
214
+ - **VSCO** — Gallery-wall aesthetic with floating image tiles, minimal text UI, and a single warm neutral background that frames rather than competes with photography
215
+ - **Cargo (cargo.site)** — Portfolio-first visual discovery tools that use restrained typography and generous whitespace to let creator imagery dominate
216
+
217
+ ## Quick Start
218
+
219
+ ### CSS Custom Properties
220
+
221
+ ```css
222
+ :root {
223
+ /* Colors */
224
+ --color-linen-canvas: #f7f5f3;
225
+ --color-ink-black: #0d0d0d;
226
+ --color-paper-white: #ffffff;
227
+ --color-stone: #6e6a69;
228
+ --color-pebble: #9a9796;
229
+
230
+ /* Typography — Font Families */
231
+ --font-cosmosoracle: 'cosmosOracle', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
232
+
233
+ /* Typography — Scale */
234
+ --text-caption: 14px;
235
+ --leading-caption: 1.5;
236
+ --text-body: 16px;
237
+ --leading-body: 1.5;
238
+ --tracking-body: -0.18px;
239
+ --text-subheading: 18px;
240
+ --leading-subheading: 1.29;
241
+ --tracking-subheading: -0.2px;
242
+ --text-heading-sm: 24px;
243
+ --leading-heading-sm: 1.2;
244
+ --tracking-heading-sm: -0.48px;
245
+ --text-heading: 33px;
246
+ --leading-heading: 1.1;
247
+ --tracking-heading: -1.32px;
248
+ --text-heading-lg: 38px;
249
+ --leading-heading-lg: 1.08;
250
+ --tracking-heading-lg: -1.52px;
251
+ --text-display: 58px;
252
+ --leading-display: 1.06;
253
+ --tracking-display: -2.32px;
254
+ --text-display-xl: 74px;
255
+ --leading-display-xl: 0.8;
256
+ --tracking-display-xl: -3.7px;
257
+
258
+ /* Typography — Weights */
259
+ --font-weight-w350: 350;
260
+ --font-weight-regular: 400;
261
+ --font-weight-medium: 500;
262
+
263
+ /* Spacing */
264
+ --spacing-unit: 4px;
265
+ --spacing-4: 4px;
266
+ --spacing-8: 8px;
267
+ --spacing-16: 16px;
268
+ --spacing-20: 20px;
269
+ --spacing-24: 24px;
270
+ --spacing-32: 32px;
271
+ --spacing-40: 40px;
272
+ --spacing-48: 48px;
273
+ --spacing-72: 72px;
274
+ --spacing-200: 200px;
275
+
276
+ /* Layout */
277
+ --page-max-width: 1280px;
278
+ --section-gap: 80px;
279
+ --card-padding: 16px;
280
+ --element-gap: 24px;
281
+
282
+ /* Border Radius */
283
+ --radius-xl: 12px;
284
+ --radius-2xl: 16px;
285
+ --radius-2xl-2: 19px;
286
+
287
+ /* Named Radii */
288
+ --radius-cards: 16px;
289
+ --radius-inputs: 16px;
290
+ --radius-buttons: 16px;
291
+ --radius-imagetiles: 12px;
292
+ --radius-videocontainer: 16px;
293
+
294
+ /* Surfaces */
295
+ --surface-linen-canvas: #f7f5f3;
296
+ --surface-paper-white: #ffffff;
297
+ }
298
+ ```
299
+
300
+ ### Tailwind v4
301
+
302
+ ```css
303
+ @theme {
304
+ /* Colors */
305
+ --color-linen-canvas: #f7f5f3;
306
+ --color-ink-black: #0d0d0d;
307
+ --color-paper-white: #ffffff;
308
+ --color-stone: #6e6a69;
309
+ --color-pebble: #9a9796;
310
+
311
+ /* Typography */
312
+ --font-cosmosoracle: 'cosmosOracle', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
313
+
314
+ /* Typography — Scale */
315
+ --text-caption: 14px;
316
+ --leading-caption: 1.5;
317
+ --text-body: 16px;
318
+ --leading-body: 1.5;
319
+ --tracking-body: -0.18px;
320
+ --text-subheading: 18px;
321
+ --leading-subheading: 1.29;
322
+ --tracking-subheading: -0.2px;
323
+ --text-heading-sm: 24px;
324
+ --leading-heading-sm: 1.2;
325
+ --tracking-heading-sm: -0.48px;
326
+ --text-heading: 33px;
327
+ --leading-heading: 1.1;
328
+ --tracking-heading: -1.32px;
329
+ --text-heading-lg: 38px;
330
+ --leading-heading-lg: 1.08;
331
+ --tracking-heading-lg: -1.52px;
332
+ --text-display: 58px;
333
+ --leading-display: 1.06;
334
+ --tracking-display: -2.32px;
335
+ --text-display-xl: 74px;
336
+ --leading-display-xl: 0.8;
337
+ --tracking-display-xl: -3.7px;
338
+
339
+ /* Spacing */
340
+ --spacing-4: 4px;
341
+ --spacing-8: 8px;
342
+ --spacing-16: 16px;
343
+ --spacing-20: 20px;
344
+ --spacing-24: 24px;
345
+ --spacing-32: 32px;
346
+ --spacing-40: 40px;
347
+ --spacing-48: 48px;
348
+ --spacing-72: 72px;
349
+ --spacing-200: 200px;
350
+
351
+ /* Border Radius */
352
+ --radius-xl: 12px;
353
+ --radius-2xl: 16px;
354
+ --radius-2xl-2: 19px;
355
+ }
356
+ ```
@@ -0,0 +1,209 @@
1
+ {
2
+ "id": "cosmos",
3
+ "name": "Cosmos",
4
+ "darkDefault": false,
5
+ "version": "2.0.0",
6
+ "roles": {
7
+ "canvas": "30 20% 96%",
8
+ "canvasForeground": "0 0% 5%",
9
+ "surface": "0 0% 100%",
10
+ "surfaceForeground": "0 0% 5%",
11
+ "action": "0 0% 5%",
12
+ "actionForeground": "30 20% 96%",
13
+ "brand": "0 0% 5%",
14
+ "brandForeground": "30 20% 96%",
15
+ "quiet": "0 0% 100%",
16
+ "quietForeground": "0 0% 5%",
17
+ "muted": "30 20% 96%",
18
+ "mutedForeground": "12 2% 42%",
19
+ "border": "30 5% 85%",
20
+ "ring": "0 0% 5%",
21
+ "destructive": "4 76% 40%",
22
+ "destructiveForeground": "0 0% 100%",
23
+ "success": "134 62% 40%",
24
+ "successForeground": "0 0% 100%",
25
+ "info": "12 2% 42%",
26
+ "infoForeground": "0 0% 100%"
27
+ },
28
+ "semantic": {
29
+ "background": "30 20% 96%",
30
+ "foreground": "0 0% 5%",
31
+ "card": "0 0% 100%",
32
+ "cardForeground": "0 0% 5%",
33
+ "popover": "0 0% 100%",
34
+ "popoverForeground": "0 0% 5%",
35
+ "primary": "0 0% 5%",
36
+ "primaryForeground": "30 20% 96%",
37
+ "secondary": "0 0% 100%",
38
+ "secondaryForeground": "0 0% 5%",
39
+ "muted": "30 20% 96%",
40
+ "mutedForeground": "12 2% 42%",
41
+ "accent": "0 0% 100%",
42
+ "accentForeground": "0 0% 5%",
43
+ "destructive": "4 76% 40%",
44
+ "destructiveForeground": "0 0% 100%",
45
+ "border": "30 5% 85%",
46
+ "ring": "0 0% 5%",
47
+ "success": "134 62% 40%",
48
+ "successForeground": "0 0% 100%",
49
+ "info": "12 2% 42%",
50
+ "infoForeground": "0 0% 100%"
51
+ },
52
+ "modes": {
53
+ "light": {
54
+ "roles": {
55
+ "canvas": "30 20% 96%",
56
+ "canvasForeground": "0 0% 5%",
57
+ "surface": "0 0% 100%",
58
+ "surfaceForeground": "0 0% 5%",
59
+ "action": "0 0% 5%",
60
+ "actionForeground": "30 20% 96%",
61
+ "brand": "0 0% 5%",
62
+ "brandForeground": "30 20% 96%",
63
+ "quiet": "0 0% 100%",
64
+ "quietForeground": "0 0% 5%",
65
+ "muted": "30 20% 96%",
66
+ "mutedForeground": "12 2% 42%",
67
+ "border": "30 5% 85%",
68
+ "ring": "0 0% 5%",
69
+ "destructive": "4 76% 40%",
70
+ "destructiveForeground": "0 0% 100%",
71
+ "success": "134 62% 40%",
72
+ "successForeground": "0 0% 100%",
73
+ "info": "12 2% 42%",
74
+ "infoForeground": "0 0% 100%"
75
+ },
76
+ "semantic": {
77
+ "background": "30 20% 96%",
78
+ "foreground": "0 0% 5%",
79
+ "card": "0 0% 100%",
80
+ "cardForeground": "0 0% 5%",
81
+ "popover": "0 0% 100%",
82
+ "popoverForeground": "0 0% 5%",
83
+ "primary": "0 0% 5%",
84
+ "primaryForeground": "30 20% 96%",
85
+ "secondary": "0 0% 100%",
86
+ "secondaryForeground": "0 0% 5%",
87
+ "muted": "30 20% 96%",
88
+ "mutedForeground": "12 2% 42%",
89
+ "accent": "0 0% 100%",
90
+ "accentForeground": "0 0% 5%",
91
+ "destructive": "4 76% 40%",
92
+ "destructiveForeground": "0 0% 100%",
93
+ "border": "30 5% 85%",
94
+ "ring": "0 0% 5%",
95
+ "success": "134 62% 40%",
96
+ "successForeground": "0 0% 100%",
97
+ "info": "12 2% 42%",
98
+ "infoForeground": "0 0% 100%"
99
+ }
100
+ },
101
+ "dark": {
102
+ "roles": {
103
+ "canvas": "0 0% 5%",
104
+ "canvasForeground": "30 20% 96%",
105
+ "surface": "0 0% 11%",
106
+ "surfaceForeground": "30 20% 96%",
107
+ "action": "30 20% 96%",
108
+ "actionForeground": "0 0% 5%",
109
+ "brand": "30 20% 96%",
110
+ "brandForeground": "0 0% 5%",
111
+ "quiet": "0 0% 14%",
112
+ "quietForeground": "30 20% 96%",
113
+ "muted": "0 0% 11%",
114
+ "mutedForeground": "15 2% 60%",
115
+ "border": "0 1% 18%",
116
+ "ring": "30 20% 96%",
117
+ "destructive": "4 76% 40%",
118
+ "destructiveForeground": "0 0% 100%",
119
+ "success": "134 62% 40%",
120
+ "successForeground": "0 0% 100%",
121
+ "info": "12 2% 42%",
122
+ "infoForeground": "0 0% 100%"
123
+ },
124
+ "semantic": {
125
+ "background": "0 0% 5%",
126
+ "foreground": "30 20% 96%",
127
+ "card": "0 0% 11%",
128
+ "cardForeground": "30 20% 96%",
129
+ "popover": "0 0% 11%",
130
+ "popoverForeground": "30 20% 96%",
131
+ "primary": "30 20% 96%",
132
+ "primaryForeground": "0 0% 5%",
133
+ "secondary": "0 0% 14%",
134
+ "secondaryForeground": "30 20% 96%",
135
+ "muted": "0 0% 11%",
136
+ "mutedForeground": "15 2% 60%",
137
+ "accent": "0 0% 14%",
138
+ "accentForeground": "30 20% 96%",
139
+ "destructive": "4 76% 40%",
140
+ "destructiveForeground": "0 0% 100%",
141
+ "border": "0 1% 18%",
142
+ "ring": "30 20% 96%",
143
+ "success": "134 62% 40%",
144
+ "successForeground": "0 0% 100%",
145
+ "info": "12 2% 42%",
146
+ "infoForeground": "0 0% 100%"
147
+ }
148
+ }
149
+ },
150
+ "recipe": {
151
+ "buttonDefault": "solid",
152
+ "density": "comfortable",
153
+ "badgeDefault": "muted",
154
+ "radii": {
155
+ "button": "16px",
156
+ "card": "16px",
157
+ "badge": "16px",
158
+ "input": "16px",
159
+ "pill": "9999px"
160
+ },
161
+ "elevationTokens": {
162
+ "card": "0 0 #0000",
163
+ "control": "0 0 #0000",
164
+ "raised": "0 0 #0000"
165
+ }
166
+ },
167
+ "typography": {
168
+ "fontSans": "'Fraunces', 'GT Super', Georgia, ui-serif, serif",
169
+ "fontDisplay": "'Fraunces', 'GT Super', Georgia, ui-serif, serif",
170
+ "fontMono": "'JetBrains Mono', ui-monospace, monospace",
171
+ "headingWeight": 350
172
+ },
173
+ "motion": {
174
+ "easeOut": "cubic-bezier(0.16, 1, 0.3, 1)",
175
+ "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)",
176
+ "micro": 80,
177
+ "flow": 180,
178
+ "reveal": 180,
179
+ "cinematic": 320
180
+ },
181
+ "spacing": {
182
+ "xs": "0.5rem",
183
+ "sm": "1rem",
184
+ "md": "1.25rem",
185
+ "lg": "1.5rem",
186
+ "xl": "2rem",
187
+ "2xl": "3rem"
188
+ },
189
+ "extensions": {
190
+ "categories": {
191
+ "linen-canvas": "#f7f5f3",
192
+ "ink-black": "#0d0d0d",
193
+ "paper-white": "#ffffff",
194
+ "stone": "#6e6a69",
195
+ "pebble": "#9a9796"
196
+ },
197
+ "sourceUrl": "https://cosmos.so",
198
+ "notes": [
199
+ "Linen gallery wall (#f7f5f3) with floating polaroids. Chrome recedes so imagery carries every colour.",
200
+ "There is no CTA colour. action = brand = Ink Black; the filled button and the logo are the same ink.",
201
+ "Do not reintroduce an accent into chrome. v1.0.0 of this package carried Linear's acid-lime (64 89% 54%) as roles.brand — that was imported by mistake and directly contradicts the system's own don't-list.",
202
+ "Never pure #000: Ink Black is #0d0d0d so the black warms against the cream.",
203
+ "One radius: 16px on every container, button and input. 9999px only for the floating nav pill. 12px only for image tiles (app-local).",
204
+ "Elevation is none. No shadows on cards, buttons or nav — flatness is the point.",
205
+ "Type is a single face at whisper weight 350 for display, 400 body, 500 buttons/labels. Fraunces is the shipped face and a settled choice, not a placeholder: DESIGN.md names cosmosOracle as the original and this class of face as its substitute, the original is not licensed here, and swapping to it is not pending work. Do not 'fix' this by reaching for cosmosOracle.",
206
+ "destructive / success are state colours, not chrome — they are the only chroma the interface may show."
207
+ ]
208
+ }
209
+ }