@crewlethq/tokens 0.2.0 → 0.3.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.
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  :root {
6
+ --blur-xs: 3px; /** The softening behind a modal veil. Half the frosted step: the veil is already carrying most of the work, and a heavier blur there smears the page into a texture rather than leaving it legible as context. */
6
7
  --blur-sm: 6px; /** Subtle frosted glass. */
7
8
  --blur-md: 10px;
8
9
  --blur-lg: 16px; /** Standard frosted-panel effect for dropdowns and top bars. */
@@ -10,21 +11,24 @@
10
11
  --blur-2xl: 24px; /** Aggressive backdrop blur for emphasis. */
11
12
  --breakpoint-sm: 480px; /** Small phones. */
12
13
  --breakpoint-md: 768px; /** Tablets. The primary layout switch between stacked and multi-column. */
14
+ --breakpoint-shell: 900px; /** Where the application shell stops being a rail beside a pane: a 280px rail plus a 620px minimum content column. A media query cannot read a custom property, so a stylesheet that switches here spells the number, and @crewlethq/tokens/css/breakpoint is the generated partial that says what the number is. */
13
15
  --breakpoint-lg: 1024px; /** Small laptops. */
14
16
  --breakpoint-xl: 1200px; /** Standard desktop. */
15
17
  --breakpoint-2xl: 1600px; /** Large desktop, such as wide marketing hero containers. */
16
- --color-brand-primary: #5469d4; /** Primary brand color and the fill of primary actions. The focus and glow shadows are tinted with it; the theme overrides repaint it per palette. */
18
+ --color-brand-primary: #5469d4; /** Primary brand color and the fill of primary actions. The themes repaint it monochrome: black on light, white on dark. */
17
19
  --color-brand-primary-hover: #4759c2;
18
20
  --color-brand-primary-active: #3b4caa;
19
- --color-brand-accent: #5469d4; /** Interactive accent for selected, active and focus states (a checked checkbox, an active chip, a selected card). The same in both theme palettes. */
20
- --color-brand-accent-hover: #6478e0;
21
- --color-brand-accent-active: #4a5cc2;
21
+ --color-brand-accent: #5469d4; /** The one colour that means HERE: the active nav indicator, the focus ring, the selected row, the filter that is on. A fill and a mark, never text. The same in every palette. */
22
+ --color-brand-accent-hover: #4a5cc2; /** White clears 5.83:1 on it. The value it replaced, #6478e0, measured 3.96:1 and put the label of a hovered primary button under the text floor. */
23
+ --color-brand-accent-active: #3e50b8; /** White clears 6.90:1 on it. */
24
+ --color-brand-accent-ink: #8b9ff5; /** The accent as TEXT. The fill step is never text and this step is never a background; the split is what the palette suite measures. Light repaints it to a dark indigo. */
22
25
  --color-brand-accent-rgb: 84, 105, 212; /** The accent as an r, g, b triple for translucent tints: rgba(var(--color-brand-accent-rgb), 0.12). Rebind it together with the accent. */
23
- --color-brand-accent-soft: rgba(84, 105, 212, 0.10); /** Translucent accent fill behind an active or selected control. */
26
+ --color-brand-accent-soft: rgba(84, 105, 212, 0.18); /** Translucent accent fill behind an active or selected row. The alpha is per theme: a selected row has to separate from its ground by at least as much as a plain hover overlay does, and one alpha for both themes cannot. */
24
27
  --color-brand-accent-soft-strong: rgba(84, 105, 212, 0.32); /** Translucent accent border paired with the soft fill. */
25
28
  --color-brand-accent-deep: #5c24ff; /** Deep purple. Distinct from primary; used as a gradient stop and rarely on its own. */
26
29
  --color-brand-highlight: #ff3bff; /** Hot pink highlight. The first stop of the brand gradient; use sparingly on its own. */
27
30
  --color-brand-slate: #3c4052; /** Muted blue-grey for low-emphasis informational fills (toast progress drains, hover halos, info notification tints). */
31
+ --color-brand-mark: #7c56ff; /** The logo's own colour, and the default of the brand figure. It belongs to the mark rather than to the interface, so it is the same in every palette and is never spent on a control. */
28
32
  --color-brand-gradient: linear-gradient(90deg, #ff3bff 0%, #ecbfbf 38%, #5c24ff 76%, #d94fd5 100%); /** Brand gradient. The one 4-stop definition every gradient surface uses, so marketing and product surfaces match. */
29
33
  --color-surface-background: #000000;
30
34
  --color-surface-subtle: rgba(255, 255, 255, 0.05);
@@ -33,22 +37,103 @@
33
37
  --color-surface-topbar: #15171c;
34
38
  --color-surface-topbar-lift: #1c1e24;
35
39
  --color-surface-topbar-active: #22252b;
36
- --color-surface-inverse: #ffffff;
40
+ --color-surface-hover: rgba(255, 255, 255, 0.05); /** The overlay a hovered row carries. A row shows this OR the selected tint, never both: they are the same property on the same element, so the tinted row keeps its tint and the palette suite measures no hover-over-selected composite. */
41
+ --color-surface-pressed: rgba(255, 255, 255, 0.08);
42
+ --color-surface-inset: rgba(255, 255, 255, 0.05); /** A well: a code block, an empty state, a panel sunk into its card. */
43
+ --color-surface-glass: rgba(28, 30, 36, 0.90); /** Frosted chrome, paired with --blur-sm. Glass carries chrome; anything carrying words sits on an opaque surface. The alpha is 0.90 because that is what keeps the tertiary text step over 4.5:1 with the brand-primary fill behind it, which is the worst backdrop a panned canvas can put there. */
44
+ --color-surface-scrim: rgba(0, 0, 0, 0.6); /** A ground that DARKENS what is behind it: a media viewer, an upload target, the rail's own overlay on a phone. It is not what a dialog sits on; see veil. */
45
+ --color-surface-veil: rgba(0, 0, 0, 0.72); /** The ground a dialog, a sheet and the command palette sit on. It is THE ROOT'S OWN background at 0.72, which is this root's black here and a theme's own ground there, so the page is faded to context rather than darkened out of the way: an operator keeps their place while a surface is open. Held to the ground it belongs to, and not to one theme's value: a veil that is a different colour from the page it covers is a wash over the page rather than the page seen through less of itself. The alpha is what holds the page's own primary text inside a band, below the 3:1 mark floor so nothing behind competes with the surface and above 1.5:1 so the page is still there. The palette suite measures both ends. */
46
+ --color-surface-inverse: #ffffff; /** The ground that inverts the palette, carrying --color-text-inverse. */
37
47
  --color-text-primary: #fafafa; /** Slightly off-white to reduce eye strain on dark surfaces. */
38
48
  --color-text-secondary: #c9ced8;
39
- --color-text-tertiary: #8c99ad;
40
- --color-text-muted: rgba(255, 255, 255, 0.3);
41
- --color-text-on-brand: #ffffff;
49
+ --color-text-tertiary: #95a2b6; /** A fact, so it clears 4.5:1 on every surface it can land on, including a pressed row inside the top bar's active step. #8c99ad measured 4.17:1 there. */
50
+ --color-text-muted: #686b70; /** DECORATION ONLY: a hairline glyph, a disabled affordance, a border. Measured BETWEEN 2.8:1 and 4.5:1 on the panel, because a step that crept up to the fact floor would invite itself into a table cell, which is the whole reason it has a separate name. */
51
+ --color-text-on-brand: #ffffff; /** The label on a brand-primary fill. */
52
+ --color-text-on-accent: #ffffff; /** The label on an accent fill, and on the danger fill. Separate from onBrand because the themes repaint the brand fill monochrome and leave the accent where it is. */
42
53
  --color-text-inverse: #09090b;
43
54
  --color-border-default: rgba(255, 255, 255, 0.08);
44
55
  --color-border-hover: rgba(255, 255, 255, 0.15);
45
- --color-border-strong: #3f4145;
46
- --color-border-strong-hover: #4a4d52; /** Solid dark-mode hover border. Use when hover should be a solid color instead of a translucent overlay. */
47
- --color-feedback-success: #46a758; /** Running and healthy status green for status dots, badges and success icons. Softer than Tailwind green-500 so it does not glare on dark surfaces. */
48
- --color-feedback-warning: #f59e0b;
49
- --color-feedback-danger: #ef4444; /** Semantic error red for destructive actions and failure states. */
50
- --color-feedback-danger-hover: #dc2626;
51
- --color-feedback-info: #3b82f6;
56
+ --color-border-strong: #4a4d52; /** The heavier resting border, at the plain border's hover weight. It used to hold the same value as --color-border-default in both palettes, so the pair was a copy of the plain pair rather than a third step. */
57
+ --color-border-strong-hover: #5a5e65; /** One step past strong, so the strong pair is a real pair. */
58
+ --color-border-control: #7f848e; /** The boundary of an input, a checkbox or a switch. It clears 3:1 on every surface a control can sit on, the overlay composites included: a checkbox inside a hovered row in a dialog body is the case the opaque surfaces alone do not catch. */
59
+ --color-focus: #8b9ff5; /** The focus indicator, drawn as an OUTLINE at 2px and offset 2px. Forced-colors mode drops every box-shadow and keeps outlines, so a ring drawn as a shadow alone disappears for exactly the readers who need one. */
60
+ --color-feedback-success: #14b8a6; /** A good terminal state. The four status meanings never move. */
61
+ --color-feedback-success-ink: #5eead4;
62
+ --color-feedback-warning: #f59e0b; /** A person is needed. */
63
+ --color-feedback-warning-ink: #fde68a;
64
+ --color-feedback-danger: #dc2626; /** Failure, and the fill of a destructive action. */
65
+ --color-feedback-danger-hover: #b91c1c;
66
+ --color-feedback-danger-ink: #fca5a5;
67
+ --color-feedback-info: #38bdf8; /** Neutral information. */
68
+ --color-feedback-info-ink: #7dd3fc;
69
+ --color-feedback-success-soft: rgba(20, 184, 166, 0.12);
70
+ --color-feedback-success-line: rgba(20, 184, 166, 0.3);
71
+ --color-feedback-warning-soft: rgba(245, 158, 11, 0.12);
72
+ --color-feedback-warning-line: rgba(245, 158, 11, 0.3);
73
+ --color-feedback-danger-soft: rgba(220, 38, 38, 0.12);
74
+ --color-feedback-danger-line: rgba(220, 38, 38, 0.3);
75
+ --color-feedback-info-soft: rgba(56, 189, 248, 0.12);
76
+ --color-feedback-info-line: rgba(56, 189, 248, 0.3);
77
+ --color-phase-onboarding: #f77ae9; /** The agent phases: onboarding, execute, review. Three, and the only categorical identity outside a chart. Every pair stays dE 10 apart under normal, protan and deutan vision, and clears the status family and the accent under all three. */
78
+ --color-phase-onboarding-ink: #ff82f1;
79
+ --color-phase-execute: #ac6bff;
80
+ --color-phase-execute-ink: #d697ff;
81
+ --color-phase-review: #00a24f;
82
+ --color-phase-review-ink: #46c872;
83
+ --color-phase-onboarding-soft: rgba(247, 122, 233, 0.12);
84
+ --color-phase-execute-soft: rgba(172, 107, 255, 0.12);
85
+ --color-phase-review-soft: rgba(0, 162, 79, 0.12);
86
+ --color-data-1: #a5b4fc; /** Five chart series in a fixed order, plus a neutral residual, and legal ONLY inside a chart that carries a legend. Adjacent pairs are what a legend reader distinguishes, so that is what is measured, under all three visions. Series 1 is deliberately NOT the accent: a series painted in the selection colour claims to be the selection. */
87
+ --color-data-2: #facc15;
88
+ --color-data-3: #38bdf8;
89
+ --color-data-4: #86efac;
90
+ --color-data-5: #ec4899;
91
+ --color-data-other: #71717a; /** The residual bucket. Exempt from the separation rules on purpose: a residual that competed with a real series would be claiming to be one. */
92
+ --color-avatar-tint-0: #2563eb; /** The ten seeded avatar grounds, chosen by a stable hash when a consumer passes a colour seed. Each clears 4.5:1 under white initials; five of them were darkened along OKLab lightness to get there, keeping their hue and chroma. */
93
+ --color-avatar-tint-1: #7c3aed;
94
+ --color-avatar-tint-2: #c026d3;
95
+ --color-avatar-tint-3: #db2777;
96
+ --color-avatar-tint-4: #dc2626;
97
+ --color-avatar-tint-5: #d54400;
98
+ --color-avatar-tint-6: #a76900;
99
+ --color-avatar-tint-7: #008931;
100
+ --color-avatar-tint-8: #00857a;
101
+ --color-avatar-tint-9: #007cbe;
102
+ --color-node-purple: #8e6ed4; /** Six hues a node of a chart is tinted with, chosen per entity and NOT a series: two nodes sharing one is no statement, so nothing here is measured for separability and no legend is owed. Each hue derives a fill, a border and a halo at fixed alphas, and carries an ink step for the name drawn on that fill, because the tinted card is the only ground that name is read on. The dark values are the muted set the console chart was drawn with, tuned to sit beside the accent rather than beside neon; light repaints every one, since a tint tuned for black is a wash on white. */
103
+ --color-node-purple-ink: #cabae0; /** The name drawn on the purple fill. It clears 7:1 there, as every ink step here does. */
104
+ --color-node-cyan: #5ca8be;
105
+ --color-node-cyan-ink: #b3d7e0;
106
+ --color-node-green: #62a578;
107
+ --color-node-green-ink: #b8d8c0;
108
+ --color-node-amber: #c89866;
109
+ --color-node-amber-ink: #e0c89e;
110
+ --color-node-rose: #c8757f;
111
+ --color-node-rose-ink: #e0bfc4;
112
+ --color-node-blue: #5b7fc7;
113
+ --color-node-blue-ink: #b9c5e0;
114
+ --color-node-purple-fill: rgba(142, 110, 212, 0.12);
115
+ --color-node-purple-line: rgba(142, 110, 212, 0.38);
116
+ --color-node-purple-halo: rgba(142, 110, 212, 0.16);
117
+ --color-node-cyan-fill: rgba(92, 168, 190, 0.12);
118
+ --color-node-cyan-line: rgba(92, 168, 190, 0.38);
119
+ --color-node-cyan-halo: rgba(92, 168, 190, 0.16);
120
+ --color-node-green-fill: rgba(98, 165, 120, 0.12);
121
+ --color-node-green-line: rgba(98, 165, 120, 0.38);
122
+ --color-node-green-halo: rgba(98, 165, 120, 0.16);
123
+ --color-node-amber-fill: rgba(200, 152, 102, 0.12);
124
+ --color-node-amber-line: rgba(200, 152, 102, 0.38);
125
+ --color-node-amber-halo: rgba(200, 152, 102, 0.16);
126
+ --color-node-rose-fill: rgba(200, 117, 127, 0.12);
127
+ --color-node-rose-line: rgba(200, 117, 127, 0.38);
128
+ --color-node-rose-halo: rgba(200, 117, 127, 0.16);
129
+ --color-node-blue-fill: rgba(91, 127, 199, 0.12);
130
+ --color-node-blue-line: rgba(91, 127, 199, 0.38);
131
+ --color-node-blue-halo: rgba(91, 127, 199, 0.16);
132
+ --color-scrollbar: rgba(255, 255, 255, 0.16); /** Scrollbars belong to the palette. A bright system gutter down the side of a dark page is the most visible way an application admits it is a web page. */
133
+ --color-scrollbar-hover: rgba(255, 255, 255, 0.26);
134
+ --density-compact: 0.82; /** The three steps --density takes, set on the root by @crewlethq/tokens/css/density. Every spacing and size token is emitted as calc(Npx * var(--density, 1)), so a density is a real change to every surface rather than to three font sizes, and every value is unchanged at 1. */
135
+ --density-normal: 1;
136
+ --density-comfortable: 1.14;
52
137
  --motion-duration-instant: 75ms; /** Tooltip flash, dropdown indicator nudge. */
53
138
  --motion-duration-fast: 120ms; /** Menu hover and active state changes. */
54
139
  --motion-duration-base: 150ms; /** Default UI transition. */
@@ -57,6 +142,7 @@
57
142
  --motion-easing-default: ease;
58
143
  --motion-easing-out: ease-out;
59
144
  --motion-easing-in-out: ease-in-out;
145
+ --motion-easing-emphasized: cubic-bezier(0.16, 1, 0.3, 1); /** A strong decelerate for a surface that ENTERS: a dialog, a sheet, a popover. It is a new role beside easing.out rather than a replacement for it. That token carries the CSS ease-out keyword, cubic-bezier(0, 0, 0.58, 1), a much gentler curve, and folding one onto the other would change the motion of every entering surface with no stated reason. */
60
146
  --motion-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /** Slight overshoot for emphasized entries. */
61
147
  --radius-none: 0px;
62
148
  --radius-xs: 4px;
@@ -72,34 +158,54 @@
72
158
  --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.25);
73
159
  --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.3);
74
160
  --shadow-xl: 0 12px 32px rgba(0, 0, 0, 0.4);
161
+ --shadow-sheet: -8px 0 32px rgba(0, 0, 0, 0.4); /** The separation under a side sheet, cast along the INLINE axis rather than downward. A sheet runs the full height of the window, so a shadow with a vertical offset drops both of its casts off the screen and leaves the one edge the sheet actually has lit by a blur tail; this one is thrown into the page the sheet covers. Not a step on the elevation ramp: it is the only shadow here whose offset is horizontal, and a surface that wants the ramp wants shadow.xl. */
75
162
  --shadow-2xl: 0 16px 64px rgba(0, 0, 0, 0.6);
76
163
  --shadow-card: 0 8px 24px rgba(0, 0, 0, 0.1); /** Standard card depth on dark surfaces. */
77
164
  --shadow-rim-lit: 0 4px 24px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.04); /** Card with a subtle inset rim light, for cards that need to lift off an already elevated surface. */
78
- --shadow-focus: 0 0 0 3px rgba(84, 105, 212, 0.35); /** Focus ring tinted with the canonical brand color. */
165
+ --shadow-hairline: inset 0 1px 0 rgba(255, 255, 255, 0.04); /** The top-edge rim light on its own, for a panel that is lifted by light rather than by a shadow. It is none in the light theme. */
166
+ --shadow-focus: 0 0 0 2px var(--color-surface-background), 0 0 0 4px var(--color-focus); /** For a component that wants a shadow as well as its focus outline. It never REPLACES the outline: forced-colors mode drops every box-shadow and keeps outlines, so a ring drawn as a shadow alone leaves the readers who most need an indicator with none. The value it replaces, a 3px rgba(84, 105, 212, 0.35) glow, measured between 1.41:1 and 1.61:1. */
167
+ --shadow-selection: inset 0 0 0 2px var(--color-brand-accent); /** The ring around a selected card or canvas node. Inset, so it is not clipped by a scroller. */
79
168
  --shadow-glow: 0 4px 24px rgba(84, 105, 212, 0.3);
80
- --spacing-0: 0px;
81
- --spacing-1: 4px;
82
- --spacing-2: 8px;
83
- --spacing-3: 12px;
84
- --spacing-4: 16px;
85
- --spacing-5: 20px;
86
- --spacing-6: 24px;
87
- --spacing-7: 32px;
88
- --spacing-8: 40px;
89
- --spacing-9: 48px;
90
- --spacing-10: 64px;
91
- --spacing-11: 80px;
169
+ --size-control-sm: max(24px, calc(28px * var(--density, 1))); /** The height of a control. The small step carries a floor because 28 x 0.82 is 22.96px, and a target under 24px fails at compact density on a touch screen. Every step is emitted as calc(Npx * var(--density, 1)), so it is unchanged at density 1. */
170
+ --size-control-md: calc(32px * var(--density, 1));
171
+ --size-control-lg: calc(44px * var(--density, 1));
172
+ --size-row-sm: max(24px, calc(28px * var(--density, 1))); /** The height of a list row, so every list in a product lines up with every other. The small step floors at 24px as the control step does. */
173
+ --size-row-md: calc(36px * var(--density, 1));
174
+ --size-row-lg: calc(48px * var(--density, 1));
175
+ --size-nav-gutter: calc(8px * var(--density, 1)); /** The rail's geometry in TWO parts, because a row's EDGE and a row's TEXT want different insets. The gutter insets the rail, which is where a row's background begins; the row pad insets the content inside the row. Splitting it is what lets the rows widen without moving a glyph: shrink the gutter, grow the pad by the same step, and the line every mark, group label and item text starts on does not move. */
176
+ --size-nav-row-pad: calc(12px * var(--density, 1));
177
+ --size-shell-rail: 280px; /** The application rail, and the top bar over the pane beside it. */
178
+ --size-shell-topbar: 64px;
179
+ --size-target-min: 24px; /** The smallest a hit target may ever stand, and the same floor size.control.sm and size.row.sm carry. It is a token because a component that DERIVES a height from a control step (a chip in a well stands shorter than the control beside it) has to clamp the result itself: max(var(--size-target-min), calc(...)) holds at every density, where the step's own floor no longer can once it has been subtracted from. */
180
+ --size-measure: 68ch; /** Prose and forms get a measure. Tables and charts deliberately do not: they are the one content that genuinely wants the whole viewport. */
181
+ --size-measure-narrow: 48ch;
182
+ --size-content-max: 1600px;
183
+ --size-focus-ring-inset-offset: -2px; /** The outline offset for a focusable row INSIDE a clipping scroller: a tree row, a grid row, a card header. An outset ring there is clipped by the scroller on the first and last rows and painted over by the next row, so the indicator has to be drawn inside the row's own box. */
184
+ --spacing-0: 0px; /** A 4px base. Every step but this one is emitted as calc(Npx * var(--density, 1)), so a density setting reaches every gap and pad in a product and every value is unchanged at density 1. Zero is left alone: scaling it would spend a calc() on a number that cannot change. */
185
+ --spacing-1: calc(4px * var(--density, 1));
186
+ --spacing-2: calc(8px * var(--density, 1));
187
+ --spacing-3: calc(12px * var(--density, 1));
188
+ --spacing-4: calc(16px * var(--density, 1));
189
+ --spacing-5: calc(20px * var(--density, 1));
190
+ --spacing-6: calc(24px * var(--density, 1));
191
+ --spacing-7: calc(32px * var(--density, 1));
192
+ --spacing-8: calc(40px * var(--density, 1));
193
+ --spacing-9: calc(48px * var(--density, 1));
194
+ --spacing-10: calc(64px * var(--density, 1));
195
+ --spacing-11: calc(80px * var(--density, 1));
92
196
  --font-family-sans: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; /** Interface and body type. Inter is self-hosted by @crewlethq/tokens/css/fonts; the system stack covers the moment before it loads and any app that does not import that stylesheet. */
93
197
  --font-family-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace; /** Code, identifiers and tabular values. JetBrains Mono is self-hosted by @crewlethq/tokens/css/fonts. */
94
- --font-size-xs: 12px;
95
- --font-size-sm: 14px;
96
- --font-size-md: 16px;
97
- --font-size-lg: 18px;
98
- --font-size-xl: 20px;
99
- --font-size-2xl: 24px;
100
- --font-size-3xl: 32px;
101
- --font-size-4xl: 48px;
102
- --font-size-5xl: 64px;
198
+ --font-size-2xs: 0.6875rem; /** Micro labels and table column heads. */
199
+ --font-size-xs: 0.75rem; /** Dense secondary text and badges. */
200
+ --font-size-compact: 0.8125rem; /** Table cells and captions. It sits between xs and sm rather than extending the ramp at either end, so it is named for its job. */
201
+ --font-size-sm: 0.875rem; /** Body. */
202
+ --font-size-md: 1rem;
203
+ --font-size-lg: 1.125rem;
204
+ --font-size-xl: 1.25rem;
205
+ --font-size-2xl: 1.5rem;
206
+ --font-size-3xl: 2rem;
207
+ --font-size-4xl: 3rem;
208
+ --font-size-5xl: 4rem;
103
209
  --font-weight-regular: 400;
104
210
  --font-weight-medium: 500;
105
211
  --font-weight-semibold: 600;
@@ -109,13 +215,21 @@
109
215
  --font-line-height-snug: 1.4;
110
216
  --font-line-height-normal: 1.5;
111
217
  --font-line-height-relaxed: 1.7;
218
+ --font-letter-spacing-tight: -0.02em; /** Display sizes tighten, body sits at zero, micro labels open up. Declared once, so a heading and a caption cannot drift into six tracking values across six selectors. */
219
+ --font-letter-spacing-snug: -0.005em;
220
+ --font-letter-spacing-normal: 0;
221
+ --font-letter-spacing-wide: 0.04em;
222
+ --font-letter-spacing-wider: 0.14em; /** The uppercase micro-label register. */
112
223
  --z-index-base: 0;
113
224
  --z-index-raised: 1; /** Lifts an element above its siblings inside its own stacking context, such as a control layered over a card. */
114
225
  --z-index-sticky: 10; /** Sticky headers and pinned columns within the page flow. */
115
226
  --z-index-dropdown: 100; /** In-flow menus that stay inside their container rather than portaling to the body. */
116
227
  --z-index-overlay: 200; /** In-page overlays such as drawers and scrims that cover page chrome but not dialogs. */
228
+ --z-index-layer-base: 9000; /** The bottom of the layer stack's own band. A portaled surface takes this plus its DEPTH in the live stack, clamped at layerMax, rather than a number from a counter that only grows: modal, popover and toast leave two free steps between them, so a counter would put the second dialog of a session at the popover level and the third at the toast level. */
229
+ --z-index-layer-max: 9899; /** The top of the layer band, and the clamp. It stays below modal so a toast always paints above the topmost surface: a toast reports what a write inside a dialog did. */
117
230
  --z-index-modal: 9999; /** Dialog backdrop and frame. High enough to clear any page chrome an application stacks with its own numbers. */
118
231
  --z-index-popover: 10000; /** Floating panels portaled to the body (Select menus, Popover, date pickers). Above modal because they are routinely opened from inside a dialog, and a panel under the backdrop is hidden and swallows clicks. */
119
232
  --z-index-toast: 10001; /** Top of the stack. A toast reports the outcome of what somebody just did, often in a dialog or from a menu opened inside one, so it sits above both. */
233
+ --radius-chip: calc(var(--radius-md) - 1px); /** The corner of a chip lifted INSIDE a well at --radius-md: one hairline tighter than the well around it, which is what reads as sitting in it. It sits between sm and md and is derived rather than written as 7px, so it follows --radius-md if that step ever moves. */
120
234
  --font-family-display: var(--font-family-sans); /** Headings and other display type. An alias of the sans family, so a heading costs no extra download. Components keep reading this role token so a dedicated display face would land in one place. */
121
235
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export declare const blur: {
2
+ readonly xs: "3px";
2
3
  readonly sm: "6px";
3
4
  readonly md: "10px";
4
5
  readonly lg: "16px";
@@ -8,6 +9,7 @@ export declare const blur: {
8
9
  export declare const breakpoint: {
9
10
  readonly sm: "480px";
10
11
  readonly md: "768px";
12
+ readonly shell: "900px";
11
13
  readonly lg: "1024px";
12
14
  readonly xl: "1200px";
13
15
  readonly "2xl": "1600px";
@@ -18,14 +20,16 @@ export declare const color: {
18
20
  readonly primaryHover: "#4759c2";
19
21
  readonly primaryActive: "#3b4caa";
20
22
  readonly accent: "#5469d4";
21
- readonly accentHover: "#6478e0";
22
- readonly accentActive: "#4a5cc2";
23
+ readonly accentHover: "#4a5cc2";
24
+ readonly accentActive: "#3e50b8";
25
+ readonly accentInk: "#8b9ff5";
23
26
  readonly accentRgb: "84, 105, 212";
24
- readonly accentSoft: "rgba(84, 105, 212, 0.10)";
27
+ readonly accentSoft: "rgba(84, 105, 212, 0.18)";
25
28
  readonly accentSoftStrong: "rgba(84, 105, 212, 0.32)";
26
29
  readonly accentDeep: "#5c24ff";
27
30
  readonly highlight: "#ff3bff";
28
31
  readonly slate: "#3c4052";
32
+ readonly mark: "#7c56ff";
29
33
  readonly gradient: "linear-gradient(90deg, #ff3bff 0%, #ecbfbf 38%, #5c24ff 76%, #d94fd5 100%)";
30
34
  };
31
35
  readonly surface: {
@@ -36,29 +40,122 @@ export declare const color: {
36
40
  readonly topbar: "#15171c";
37
41
  readonly topbarLift: "#1c1e24";
38
42
  readonly topbarActive: "#22252b";
43
+ readonly hover: "rgba(255, 255, 255, 0.05)";
44
+ readonly pressed: "rgba(255, 255, 255, 0.08)";
45
+ readonly inset: "rgba(255, 255, 255, 0.05)";
46
+ readonly glass: "rgba(28, 30, 36, 0.90)";
47
+ readonly scrim: "rgba(0, 0, 0, 0.6)";
48
+ readonly veil: "rgba(0, 0, 0, 0.72)";
39
49
  readonly inverse: "#ffffff";
40
50
  };
41
51
  readonly text: {
42
52
  readonly primary: "#fafafa";
43
53
  readonly secondary: "#c9ced8";
44
- readonly tertiary: "#8c99ad";
45
- readonly muted: "rgba(255, 255, 255, 0.3)";
54
+ readonly tertiary: "#95a2b6";
55
+ readonly muted: "#686b70";
46
56
  readonly onBrand: "#ffffff";
57
+ readonly onAccent: "#ffffff";
47
58
  readonly inverse: "#09090b";
48
59
  };
49
60
  readonly border: {
50
61
  readonly default: "rgba(255, 255, 255, 0.08)";
51
62
  readonly hover: "rgba(255, 255, 255, 0.15)";
52
- readonly strong: "#3f4145";
53
- readonly strongHover: "#4a4d52";
63
+ readonly strong: "#4a4d52";
64
+ readonly strongHover: "#5a5e65";
65
+ readonly control: "#7f848e";
54
66
  };
67
+ readonly focus: "#8b9ff5";
55
68
  readonly feedback: {
56
- readonly success: "#46a758";
69
+ readonly success: "#14b8a6";
70
+ readonly successInk: "#5eead4";
57
71
  readonly warning: "#f59e0b";
58
- readonly danger: "#ef4444";
59
- readonly dangerHover: "#dc2626";
60
- readonly info: "#3b82f6";
72
+ readonly warningInk: "#fde68a";
73
+ readonly danger: "#dc2626";
74
+ readonly dangerHover: "#b91c1c";
75
+ readonly dangerInk: "#fca5a5";
76
+ readonly info: "#38bdf8";
77
+ readonly infoInk: "#7dd3fc";
78
+ readonly successSoft: "rgba(20, 184, 166, 0.12)";
79
+ readonly successLine: "rgba(20, 184, 166, 0.3)";
80
+ readonly warningSoft: "rgba(245, 158, 11, 0.12)";
81
+ readonly warningLine: "rgba(245, 158, 11, 0.3)";
82
+ readonly dangerSoft: "rgba(220, 38, 38, 0.12)";
83
+ readonly dangerLine: "rgba(220, 38, 38, 0.3)";
84
+ readonly infoSoft: "rgba(56, 189, 248, 0.12)";
85
+ readonly infoLine: "rgba(56, 189, 248, 0.3)";
61
86
  };
87
+ readonly phase: {
88
+ readonly onboarding: "#f77ae9";
89
+ readonly onboardingInk: "#ff82f1";
90
+ readonly execute: "#ac6bff";
91
+ readonly executeInk: "#d697ff";
92
+ readonly review: "#00a24f";
93
+ readonly reviewInk: "#46c872";
94
+ readonly onboardingSoft: "rgba(247, 122, 233, 0.12)";
95
+ readonly executeSoft: "rgba(172, 107, 255, 0.12)";
96
+ readonly reviewSoft: "rgba(0, 162, 79, 0.12)";
97
+ };
98
+ readonly data: {
99
+ readonly "1": "#a5b4fc";
100
+ readonly "2": "#facc15";
101
+ readonly "3": "#38bdf8";
102
+ readonly "4": "#86efac";
103
+ readonly "5": "#ec4899";
104
+ readonly other: "#71717a";
105
+ };
106
+ readonly avatar: {
107
+ readonly tint: {
108
+ readonly "0": "#2563eb";
109
+ readonly "1": "#7c3aed";
110
+ readonly "2": "#c026d3";
111
+ readonly "3": "#db2777";
112
+ readonly "4": "#dc2626";
113
+ readonly "5": "#d54400";
114
+ readonly "6": "#a76900";
115
+ readonly "7": "#008931";
116
+ readonly "8": "#00857a";
117
+ readonly "9": "#007cbe";
118
+ };
119
+ };
120
+ readonly node: {
121
+ readonly purple: "#8e6ed4";
122
+ readonly purpleInk: "#cabae0";
123
+ readonly cyan: "#5ca8be";
124
+ readonly cyanInk: "#b3d7e0";
125
+ readonly green: "#62a578";
126
+ readonly greenInk: "#b8d8c0";
127
+ readonly amber: "#c89866";
128
+ readonly amberInk: "#e0c89e";
129
+ readonly rose: "#c8757f";
130
+ readonly roseInk: "#e0bfc4";
131
+ readonly blue: "#5b7fc7";
132
+ readonly blueInk: "#b9c5e0";
133
+ readonly purpleFill: "rgba(142, 110, 212, 0.12)";
134
+ readonly purpleLine: "rgba(142, 110, 212, 0.38)";
135
+ readonly purpleHalo: "rgba(142, 110, 212, 0.16)";
136
+ readonly cyanFill: "rgba(92, 168, 190, 0.12)";
137
+ readonly cyanLine: "rgba(92, 168, 190, 0.38)";
138
+ readonly cyanHalo: "rgba(92, 168, 190, 0.16)";
139
+ readonly greenFill: "rgba(98, 165, 120, 0.12)";
140
+ readonly greenLine: "rgba(98, 165, 120, 0.38)";
141
+ readonly greenHalo: "rgba(98, 165, 120, 0.16)";
142
+ readonly amberFill: "rgba(200, 152, 102, 0.12)";
143
+ readonly amberLine: "rgba(200, 152, 102, 0.38)";
144
+ readonly amberHalo: "rgba(200, 152, 102, 0.16)";
145
+ readonly roseFill: "rgba(200, 117, 127, 0.12)";
146
+ readonly roseLine: "rgba(200, 117, 127, 0.38)";
147
+ readonly roseHalo: "rgba(200, 117, 127, 0.16)";
148
+ readonly blueFill: "rgba(91, 127, 199, 0.12)";
149
+ readonly blueLine: "rgba(91, 127, 199, 0.38)";
150
+ readonly blueHalo: "rgba(91, 127, 199, 0.16)";
151
+ };
152
+ readonly scrollbar: "rgba(255, 255, 255, 0.16)";
153
+ readonly scrollbarHover: "rgba(255, 255, 255, 0.26)";
154
+ };
155
+ export declare const density: {
156
+ readonly compact: "0.82";
157
+ readonly normal: "1";
158
+ readonly comfortable: "1.14";
62
159
  };
63
160
  export declare const motion: {
64
161
  readonly duration: {
@@ -72,6 +169,7 @@ export declare const motion: {
72
169
  readonly default: "ease";
73
170
  readonly out: "ease-out";
74
171
  readonly inOut: "ease-in-out";
172
+ readonly emphasized: "cubic-bezier(0.16, 1, 0.3, 1)";
75
173
  readonly spring: "cubic-bezier(0.34, 1.56, 0.64, 1)";
76
174
  };
77
175
  };
@@ -83,6 +181,7 @@ export declare const radius: {
83
181
  readonly lg: "12px";
84
182
  readonly xl: "16px";
85
183
  readonly "2xl": "24px";
184
+ readonly chip: "calc(8px - 1px)";
86
185
  readonly pill: "999px";
87
186
  readonly circle: "50%";
88
187
  };
@@ -92,12 +191,40 @@ export declare const shadow: {
92
191
  readonly md: "0 4px 12px rgba(0, 0, 0, 0.25)";
93
192
  readonly lg: "0 8px 24px rgba(0, 0, 0, 0.3)";
94
193
  readonly xl: "0 12px 32px rgba(0, 0, 0, 0.4)";
194
+ readonly sheet: "-8px 0 32px rgba(0, 0, 0, 0.4)";
95
195
  readonly "2xl": "0 16px 64px rgba(0, 0, 0, 0.6)";
96
196
  readonly card: "0 8px 24px rgba(0, 0, 0, 0.1)";
97
197
  readonly rimLit: "0 4px 24px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.04)";
98
- readonly focus: "0 0 0 3px rgba(84, 105, 212, 0.35)";
198
+ readonly hairline: "inset 0 1px 0 rgba(255, 255, 255, 0.04)";
199
+ readonly focus: "0 0 0 2px var(--color-surface-background), 0 0 0 4px var(--color-focus)";
200
+ readonly selection: "inset 0 0 0 2px var(--color-brand-accent)";
99
201
  readonly glow: "0 4px 24px rgba(84, 105, 212, 0.3)";
100
202
  };
203
+ export declare const size: {
204
+ readonly control: {
205
+ readonly sm: "28px";
206
+ readonly md: "32px";
207
+ readonly lg: "44px";
208
+ };
209
+ readonly row: {
210
+ readonly sm: "28px";
211
+ readonly md: "36px";
212
+ readonly lg: "48px";
213
+ };
214
+ readonly nav: {
215
+ readonly gutter: "8px";
216
+ readonly rowPad: "12px";
217
+ };
218
+ readonly shell: {
219
+ readonly rail: "280px";
220
+ readonly topbar: "64px";
221
+ };
222
+ readonly targetMin: "24px";
223
+ readonly measure: "68ch";
224
+ readonly measureNarrow: "48ch";
225
+ readonly contentMax: "1600px";
226
+ readonly focusRingInsetOffset: "-2px";
227
+ };
101
228
  export declare const spacing: {
102
229
  readonly "0": "0px";
103
230
  readonly "1": "4px";
@@ -119,7 +246,9 @@ export declare const font: {
119
246
  readonly mono: "'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace";
120
247
  };
121
248
  readonly size: {
249
+ readonly "2xs": "11px";
122
250
  readonly xs: "12px";
251
+ readonly compact: "13px";
123
252
  readonly sm: "14px";
124
253
  readonly md: "16px";
125
254
  readonly lg: "18px";
@@ -142,6 +271,13 @@ export declare const font: {
142
271
  readonly normal: "1.5";
143
272
  readonly relaxed: "1.7";
144
273
  };
274
+ readonly letterSpacing: {
275
+ readonly tight: "-0.02em";
276
+ readonly snug: "-0.005em";
277
+ readonly normal: "0";
278
+ readonly wide: "0.04em";
279
+ readonly wider: "0.14em";
280
+ };
145
281
  };
146
282
  export declare const zIndex: {
147
283
  readonly base: "0";
@@ -149,7 +285,11 @@ export declare const zIndex: {
149
285
  readonly sticky: "10";
150
286
  readonly dropdown: "100";
151
287
  readonly overlay: "200";
288
+ readonly layerBase: "9000";
289
+ readonly layerMax: "9899";
152
290
  readonly modal: "9999";
153
291
  readonly popover: "10000";
154
292
  readonly toast: "10001";
155
293
  };
294
+ export { themes } from './themes.js';
295
+ export type { ThemeName } from './themes.js';