@orange-halo/tokens 2.0.0 → 2.1.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.
@@ -4,7 +4,11 @@
4
4
 
5
5
  [data-theme='dark'] {
6
6
  --oh-color-surface-overlay: rgba(15, 12, 10, 0.7);
7
+ --oh-color-surface-sheen: rgba(255, 255, 255, 0.5);
8
+ --oh-color-surface-backdrop: rgba(61, 50, 41, 0.6);
7
9
  --oh-color-border-brand: rgba(232, 168, 56, 0.3);
10
+ --oh-color-border-brand-hover: rgba(197, 67, 0, 0.35); /** Same as light for now: the dark theme hasn't been designed */
11
+ --oh-color-border-divider: rgba(226, 213, 200, 0.6);
8
12
  --oh-elevation-soft: 0 2px 8px rgba(0, 0, 0, 0.25);
9
13
  --oh-elevation-medium: 0 4px 16px rgba(0, 0, 0, 0.3);
10
14
  --oh-elevation-strong: 0 8px 24px rgba(0, 0, 0, 0.4);
@@ -39,6 +43,9 @@
39
43
  --oh-color-surface-disabled: var(--oh-color-warm-mocha);
40
44
  --oh-color-surface-hover: var(--oh-color-warm-hickory);
41
45
  --oh-color-surface-active-pressed: var(--oh-color-warm-mocha);
46
+ --oh-color-surface-featured-start: var(--oh-color-warm-dawn); /** Same as light for now: the dark theme hasn't been designed */
47
+ --oh-color-surface-featured-mid: var(--oh-color-warm-shell);
48
+ --oh-color-surface-featured-end: var(--oh-color-warm-biscuit);
42
49
  --oh-color-border-default: var(--oh-color-warm-taupe);
43
50
  --oh-color-border-subtle: var(--oh-color-warm-driftwood); /** Decorative dividers only — below 3:1 */
44
51
  --oh-color-border-emphasis: var(--oh-color-warm-stone);
@@ -63,5 +70,9 @@
63
70
  --oh-shadow-secondary: var(--oh-color-warm-espresso);
64
71
  --oh-shadow-accent: var(--oh-color-blue-800);
65
72
  --oh-shadow-error: var(--oh-color-red-900);
73
+ --oh-shadow-neutral: var(--oh-shadow-chunky-driftwood); /** As in light, which is what dark showed before these were tokens. Faint on cocoa: review with the dark design */
74
+ --oh-shadow-neutral-hover: var(--oh-shadow-chunky-driftwood-hover); /** As in light; review with the dark design */
75
+ --oh-shadow-overlay: var(--oh-shadow-chunky-driftwood-deep); /** As in light; review with the dark design */
76
+ --oh-shadow-field: var(--oh-shadow-chunky-walnut); /** As in light; review with the dark design */
66
77
  --oh-focus-ring-color: var(--oh-color-honey-400); /** Opaque, as in light */
67
78
  }
@@ -149,7 +149,12 @@
149
149
  "overlay": "#0f0c0ab3",
150
150
  "disabled": "#352e28",
151
151
  "hover": "#4a3f33",
152
- "activePressed": "#352e28"
152
+ "activePressed": "#352e28",
153
+ "featuredStart": "#fffbf5",
154
+ "featuredMid": "#fdf6ee",
155
+ "featuredEnd": "#f8efe4",
156
+ "sheen": "#ffffff80",
157
+ "backdrop": "#3d322999"
153
158
  },
154
159
  "border": {
155
160
  "$description": "Border colors — visible and intentional",
@@ -159,7 +164,9 @@
159
164
  "strong": "#a09080",
160
165
  "hover": "#c9c1b4",
161
166
  "disabled": "#4a3f33",
162
- "brand": "#e8a8384d"
167
+ "brand": "#e8a8384d",
168
+ "brandHover": "#c5430059",
169
+ "divider": "#e2d5c899"
163
170
  },
164
171
  "text": {
165
172
  "$description": "Text colors — calm and readable, not stark",
@@ -224,42 +231,6 @@
224
231
  "widest": "0.05em"
225
232
  }
226
233
  },
227
- "spacing": {
228
- "0": "0",
229
- "1": "0.25rem",
230
- "2": "0.5rem",
231
- "3": "0.75rem",
232
- "4": "1rem",
233
- "5": "1.25rem",
234
- "6": "1.5rem",
235
- "7": "1.75rem",
236
- "8": "2rem",
237
- "10": "2.5rem",
238
- "12": "3rem",
239
- "16": "4rem",
240
- "20": "5rem",
241
- "$description": "Generous spacing — breathing room, not dense",
242
- "px": "1px",
243
- "0-5": "0.125rem",
244
- "1-5": "0.375rem",
245
- "2-5": "0.625rem",
246
- "3-5": "0.875rem",
247
- "layout": {
248
- "$description": "Generous layout spacing",
249
- "page": "1.5rem",
250
- "section": "3rem",
251
- "stack": "1.25rem",
252
- "inline": "1rem"
253
- },
254
- "component": {
255
- "$description": "Component-level spacing",
256
- "xs": "0.375rem",
257
- "sm": "0.625rem",
258
- "md": "0.875rem",
259
- "lg": "1.25rem",
260
- "xl": "1.75rem"
261
- }
262
- },
263
234
  "radius": {
264
235
  "$description": "Friendly and soft — not sharp, not overly pill-shaped",
265
236
  "none": "0",
@@ -283,12 +254,31 @@
283
254
  "primary": "#e8c4a0",
284
255
  "secondary": "#d4c4b0",
285
256
  "accent": "#a0b4c8",
286
- "error": "#b545404d"
257
+ "error": "#b545404d",
258
+ "driftwood": "#6b5d4d26",
259
+ "driftwoodHover": "#6b5d4d33",
260
+ "driftwoodDeep": "#6b5d4d40",
261
+ "walnut": "#3d322926"
262
+ },
263
+ "layered": {
264
+ "$description": "Layered surface shadows: soft drop shadows with a top highlight, so cards feel like physical objects",
265
+ "flat": "0 1px 2px rgba(61, 50, 41, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.6)",
266
+ "raised": "0 2px 6px rgba(61, 50, 41, 0.08), 0 6px 16px rgba(61, 50, 41, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.8)",
267
+ "lifted": "0 4px 12px rgba(61, 50, 41, 0.1), 0 12px 28px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9)",
268
+ "pressed": "0 1px 3px rgba(61, 50, 41, 0.1), 0 3px 8px rgba(61, 50, 41, 0.06), inset 0 1px 2px rgba(61, 50, 41, 0.04)",
269
+ "focused": "0 2px 6px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)",
270
+ "sunlit": "0 2px 8px rgba(139, 69, 19, 0.08), 0 8px 24px rgba(139, 69, 19, 0.06), 0 0 20px rgba(197, 67, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.9)",
271
+ "sunlitLifted": "0 4px 12px rgba(139, 69, 19, 0.12), 0 12px 32px rgba(139, 69, 19, 0.08), 0 0 28px rgba(197, 67, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 1)",
272
+ "sunlitFocused": "0 2px 8px rgba(139, 69, 19, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9)"
287
273
  },
288
274
  "primary": "#6b4815",
289
275
  "secondary": "#1f1a17",
290
276
  "accent": "#253850",
291
- "error": "#3d2a29"
277
+ "error": "#3d2a29",
278
+ "neutral": "#6b5d4d26",
279
+ "neutralHover": "#6b5d4d33",
280
+ "overlay": "#6b5d4d40",
281
+ "field": "#3d322926"
292
282
  },
293
283
  "gradient": {
294
284
  "$description": "Soft, nostalgic gradients — never high-contrast or flashy",
@@ -364,6 +354,42 @@
364
354
  "chunky": "2.5px"
365
355
  }
366
356
  },
357
+ "spacing": {
358
+ "0": "0",
359
+ "1": "0.25rem",
360
+ "2": "0.5rem",
361
+ "3": "0.75rem",
362
+ "4": "1rem",
363
+ "5": "1.25rem",
364
+ "6": "1.5rem",
365
+ "7": "1.75rem",
366
+ "8": "2rem",
367
+ "10": "2.5rem",
368
+ "12": "3rem",
369
+ "16": "4rem",
370
+ "20": "5rem",
371
+ "$description": "Generous spacing — breathing room, not dense",
372
+ "px": "1px",
373
+ "0-5": "0.125rem",
374
+ "1-5": "0.375rem",
375
+ "2-5": "0.625rem",
376
+ "3-5": "0.875rem",
377
+ "layout": {
378
+ "$description": "Generous layout spacing",
379
+ "page": "1.5rem",
380
+ "section": "3rem",
381
+ "stack": "1.25rem",
382
+ "inline": "1rem"
383
+ },
384
+ "component": {
385
+ "$description": "Component-level spacing",
386
+ "xs": "0.375rem",
387
+ "sm": "0.625rem",
388
+ "md": "0.875rem",
389
+ "lg": "1.25rem",
390
+ "xl": "1.75rem"
391
+ }
392
+ },
367
393
  "size": {
368
394
  "$description": "Fixed layout sizes: content widths and viewport breakpoints",
369
395
  "container": {
@@ -531,7 +557,47 @@
531
557
  "medium": "0 4px 16px rgba(0, 0, 0, 0.3)",
532
558
  "strong": "0 8px 24px rgba(0, 0, 0, 0.4)",
533
559
  "glow": "0 0 0 3px rgba(197, 67, 0, 0.2), 0 0 12px rgba(197, 67, 0, 0.1)",
534
- "inset": "inset 0 1px 3px rgba(0, 0, 0, 0.3)"
560
+ "inset": "inset 0 1px 3px rgba(0, 0, 0, 0.3)",
561
+ "surface": {
562
+ "$description": "Card surfaces, by state. Featured is the sunlit card",
563
+ "flat": "0 1px 2px rgba(61, 50, 41, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.6)",
564
+ "raised": "0 2px 6px rgba(61, 50, 41, 0.08), 0 6px 16px rgba(61, 50, 41, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.8)",
565
+ "lifted": "0 4px 12px rgba(61, 50, 41, 0.1), 0 12px 28px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9)",
566
+ "pressed": "0 1px 3px rgba(61, 50, 41, 0.1), 0 3px 8px rgba(61, 50, 41, 0.06), inset 0 1px 2px rgba(61, 50, 41, 0.04)",
567
+ "focused": "0 2px 6px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)",
568
+ "featured": "0 2px 8px rgba(139, 69, 19, 0.08), 0 8px 24px rgba(139, 69, 19, 0.06), 0 0 20px rgba(197, 67, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.9)",
569
+ "featuredLifted": "0 4px 12px rgba(139, 69, 19, 0.12), 0 12px 32px rgba(139, 69, 19, 0.08), 0 0 28px rgba(197, 67, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 1)",
570
+ "featuredFocused": "0 2px 8px rgba(139, 69, 19, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9)"
571
+ },
572
+ "offset": {
573
+ "$description": "How far solid offset shadows sit from the element, from pressed (xs) to dialogs (2xl). The colour comes from shadow.*. A flat brand sets every step to 0",
574
+ "xs": "1px",
575
+ "sm": "2px",
576
+ "md": "3px",
577
+ "lg": "4px",
578
+ "xl": "5px",
579
+ "2xl": "6px"
580
+ }
581
+ },
582
+ "lift": {
583
+ "$description": "How far elements move on hover (negative: up and left, towards the viewer) and when pressed (positive: into the page). A still brand sets every step to 0",
584
+ "hoverSm": "-1px",
585
+ "hoverMd": "-2px",
586
+ "pressSm": "1px",
587
+ "pressMd": "2px"
588
+ },
589
+ "stroke": {
590
+ "$description": "Border widths by role",
591
+ "control": "2.5px",
592
+ "surface": "1px",
593
+ "divider": "1px"
594
+ },
595
+ "decoration": {
596
+ "$description": "Link underlines. Orange Halo's are dashed: a dash, then a gap, repeating every period. A solid underline sets dash and period to the same value",
597
+ "underlineThickness": "2px",
598
+ "underlineFocusThickness": "3px",
599
+ "underlineDash": "4px",
600
+ "underlinePeriod": "8px"
535
601
  },
536
602
  "focus": {
537
603
  "$description": "Warm, friendly focus ring",
@@ -716,6 +782,9 @@
716
782
  },
717
783
  "progress": {
718
784
  "$description": "Progress — chunky pill track",
785
+ "track": {
786
+ "insetShadow": "#0000000f"
787
+ },
719
788
  "inverse": {
720
789
  "$description": "On brand/accent backgrounds (e.g. journey hero). Fill is cream so it reads at 3.7:1 against the track.",
721
790
  "trackBackground": "#ffffff26",
@@ -778,6 +847,7 @@
778
847
  },
779
848
  "closeButton": {
780
849
  "$description": "Icon-only close buttons in alerts and modals",
781
- "backgroundHover": "#00000014"
850
+ "backgroundHover": "#00000014",
851
+ "shadowHover": "#00000026"
782
852
  }
783
853
  }
package/dist/tokens.css CHANGED
@@ -89,7 +89,11 @@
89
89
  --oh-color-surface-overlay: rgba(61, 50, 41, 0.4); /** Modal backdrop — warm */
90
90
  --oh-color-surface-hover: #fff4e6; /** Warm hover tint */
91
91
  --oh-color-surface-active-pressed: #f0ebe3; /** Active/pressed surface */
92
+ --oh-color-surface-sheen: rgba(255, 255, 255, 0.5); /** Light glaze at the top of card headers, fading to transparent */
93
+ --oh-color-surface-backdrop: rgba(61, 50, 41, 0.6); /** Modal backdrop — darker than surface.overlay so the dialog stands out */
92
94
  --oh-color-border-brand: rgba(197, 67, 0, 0.25); /** Brand-tinted border */
95
+ --oh-color-border-brand-hover: rgba(197, 67, 0, 0.35); /** Brand-tinted border on hover. Decorative container edge — not a focus or control border */
96
+ --oh-color-border-divider: rgba(226, 213, 200, 0.6); /** Decorative divider inside a container, such as a card's header and footer */
93
97
  --oh-font-family-sans: 'Bricolage Grotesque', 'General Sans', -apple-system, BlinkMacSystemFont, sans-serif;
94
98
  --oh-font-family-display: 'Bricolage Grotesque', 'General Sans', sans-serif;
95
99
  --oh-font-family-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
@@ -118,24 +122,6 @@
118
122
  --oh-font-letter-spacing-wide: 0.01em;
119
123
  --oh-font-letter-spacing-wider: 0.02em;
120
124
  --oh-font-letter-spacing-widest: 0.05em; /** Uppercase labels: hero eyebrows, footer headings */
121
- --oh-spacing-0: 0;
122
- --oh-spacing-1: 0.25rem; /** 4px */
123
- --oh-spacing-2: 0.5rem; /** 8px */
124
- --oh-spacing-3: 0.75rem; /** 12px */
125
- --oh-spacing-4: 1rem; /** 16px */
126
- --oh-spacing-5: 1.25rem; /** 20px */
127
- --oh-spacing-6: 1.5rem; /** 24px */
128
- --oh-spacing-7: 1.75rem; /** 28px */
129
- --oh-spacing-8: 2rem; /** 32px */
130
- --oh-spacing-10: 2.5rem; /** 40px */
131
- --oh-spacing-12: 3rem; /** 48px */
132
- --oh-spacing-16: 4rem; /** 64px */
133
- --oh-spacing-20: 5rem; /** 80px */
134
- --oh-spacing-px: 1px;
135
- --oh-spacing-0-5: 0.125rem; /** 2px */
136
- --oh-spacing-1-5: 0.375rem; /** 6px */
137
- --oh-spacing-2-5: 0.625rem; /** 10px */
138
- --oh-spacing-3-5: 0.875rem; /** 14px */
139
125
  --oh-radius-none: 0;
140
126
  --oh-radius-xs: 4px; /** Small details, chips */
141
127
  --oh-radius-sm: 6px; /** Buttons, inputs */
@@ -153,6 +139,18 @@
153
139
  --oh-shadow-chunky-secondary: #d4c4b0; /** Neutral tan for secondary/form elements */
154
140
  --oh-shadow-chunky-accent: #a0b4c8; /** Blue offset shadow for accent buttons — decorative */
155
141
  --oh-shadow-chunky-error: rgba(181, 69, 64, 0.3); /** Error state shadow */
142
+ --oh-shadow-chunky-driftwood: rgba(107, 93, 77, 0.15); /** Translucent driftwood, for offset shadows on cream */
143
+ --oh-shadow-chunky-driftwood-hover: rgba(107, 93, 77, 0.2); /** A step darker, for the lifted state */
144
+ --oh-shadow-chunky-driftwood-deep: rgba(107, 93, 77, 0.25); /** For dialogs, which sit above everything */
145
+ --oh-shadow-chunky-walnut: rgba(61, 50, 41, 0.15); /** Translucent walnut, for the inset shadow inside fields */
146
+ --oh-shadow-layered-flat: 0 1px 2px rgba(61, 50, 41, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.6);
147
+ --oh-shadow-layered-raised: 0 2px 6px rgba(61, 50, 41, 0.08), 0 6px 16px rgba(61, 50, 41, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.8);
148
+ --oh-shadow-layered-lifted: 0 4px 12px rgba(61, 50, 41, 0.1), 0 12px 28px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9);
149
+ --oh-shadow-layered-pressed: 0 1px 3px rgba(61, 50, 41, 0.1), 0 3px 8px rgba(61, 50, 41, 0.06), inset 0 1px 2px rgba(61, 50, 41, 0.04);
150
+ --oh-shadow-layered-focused: 0 2px 6px rgba(61, 50, 41, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8); /** Sits under the focus glow */
151
+ --oh-shadow-layered-sunlit: 0 2px 8px rgba(139, 69, 19, 0.08), 0 8px 24px rgba(139, 69, 19, 0.06), 0 0 20px rgba(197, 67, 0, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.9);
152
+ --oh-shadow-layered-sunlit-lifted: 0 4px 12px rgba(139, 69, 19, 0.12), 0 12px 32px rgba(139, 69, 19, 0.08), 0 0 28px rgba(197, 67, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 1);
153
+ --oh-shadow-layered-sunlit-focused: 0 2px 8px rgba(139, 69, 19, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.9); /** Sits under the focus glow */
156
154
  --oh-gradient-warm: linear-gradient(135deg, #C54300 0%, #FF9800 100%); /** Brand emphasis */
157
155
  --oh-gradient-nostalgic: linear-gradient(180deg, #F5F0E8 0%, #EDE8DF 100%); /** Subtle retro depth */
158
156
  --oh-motion-duration-quick: 100ms; /** Micro-interactions (color shifts) */
@@ -168,6 +166,24 @@
168
166
  --oh-border-width-1: 1px;
169
167
  --oh-border-width-2: 2px;
170
168
  --oh-border-width-chunky: 2.5px; /** Signature chunky frame for controls and feedback */
169
+ --oh-spacing-0: 0;
170
+ --oh-spacing-1: 0.25rem; /** 4px */
171
+ --oh-spacing-2: 0.5rem; /** 8px */
172
+ --oh-spacing-3: 0.75rem; /** 12px */
173
+ --oh-spacing-4: 1rem; /** 16px */
174
+ --oh-spacing-5: 1.25rem; /** 20px */
175
+ --oh-spacing-6: 1.5rem; /** 24px */
176
+ --oh-spacing-7: 1.75rem; /** 28px */
177
+ --oh-spacing-8: 2rem; /** 32px */
178
+ --oh-spacing-10: 2.5rem; /** 40px */
179
+ --oh-spacing-12: 3rem; /** 48px */
180
+ --oh-spacing-16: 4rem; /** 64px */
181
+ --oh-spacing-20: 5rem; /** 80px */
182
+ --oh-spacing-px: 1px;
183
+ --oh-spacing-0-5: 0.125rem; /** 2px */
184
+ --oh-spacing-1-5: 0.375rem; /** 6px */
185
+ --oh-spacing-2-5: 0.625rem; /** 10px */
186
+ --oh-spacing-3-5: 0.875rem; /** 14px */
171
187
  --oh-size-container-sm: 640px;
172
188
  --oh-size-container-md: 768px;
173
189
  --oh-size-container-lg: 1024px;
@@ -184,26 +200,36 @@
184
200
  --oh-z-index-modal: 1200;
185
201
  --oh-z-index-popover: 1300;
186
202
  --oh-z-index-tooltip: 1400;
203
+ --oh-elevation-offset-xs: 1px;
204
+ --oh-elevation-offset-sm: 2px;
205
+ --oh-elevation-offset-md: 3px;
206
+ --oh-elevation-offset-lg: 4px;
207
+ --oh-elevation-offset-xl: 5px;
208
+ --oh-elevation-offset-2xl: 6px;
209
+ --oh-lift-hover-sm: -1px;
210
+ --oh-lift-hover-md: -2px;
211
+ --oh-lift-press-sm: 1px;
212
+ --oh-lift-press-md: 2px;
213
+ --oh-decoration-underline-thickness: 2px;
214
+ --oh-decoration-underline-focus-thickness: 3px; /** The solid underline that shows keyboard focus on inline links */
215
+ --oh-decoration-underline-dash: 4px;
216
+ --oh-decoration-underline-period: 8px;
187
217
  --oh-focus-ring-width: 3px;
188
218
  --oh-focus-ring-offset: 2px;
189
219
  --oh-focus-glow-color: rgba(197, 67, 0, 0.15); /** Decorative glow only — never the sole focus indicator */
190
- --oh-button-base-border-width: 2.5px;
191
220
  --oh-button-size-sm-min-height: 40px;
192
221
  --oh-button-size-md-min-height: 48px;
193
222
  --oh-button-size-lg-min-height: 56px;
194
- --oh-input-base-border-width: 2.5px;
195
223
  --oh-input-size-md-min-height: 48px;
196
- --oh-card-sunlit-border-color-hover: rgba(197, 67, 0, 0.35); /** Decorative container edge — not a focus or control border */
197
- --oh-card-section-divider-color: rgba(226, 213, 200, 0.6); /** Decorative divider */
198
- --oh-card-section-header-gradient-start: rgba(255, 255, 255, 0.5);
199
224
  --oh-card-section-header-gradient-end: rgba(255, 255, 255, 0);
225
+ --oh-progress-track-inset-shadow: rgba(0, 0, 0, 0.06); /** Neutral, so it works on every track colour */
200
226
  --oh-progress-inverse-track-background: rgba(255, 255, 255, 0.15);
201
227
  --oh-progress-inverse-track-border: rgba(255, 255, 255, 0.3);
202
228
  --oh-link-text-decoration: underline;
203
229
  --oh-link-text-decoration-hover: none;
204
230
  --oh-link-inverse-focus-background: rgba(0, 0, 0, 0.1); /** Focus tint — paired with the underline, which is the indicator */
205
- --oh-modal-overlay: rgba(61, 50, 41, 0.6); /** Backdrop — darker than color.surface.overlay so the dialog stands out */
206
231
  --oh-close-button-background-hover: rgba(0, 0, 0, 0.08); /** Neutral tint that works on every alert variant */
232
+ --oh-close-button-shadow-hover: rgba(0, 0, 0, 0.15); /** Offset shadow colour on hover and press. Neutral, like the background, so it works on every alert variant */
207
233
  --oh-color-brand-primary: var(--oh-color-orange-900); /** Primary brand action — WCAG AA */
208
234
  --oh-color-brand-primary-hover: var(--oh-color-orange-950); /** Hover state */
209
235
  --oh-color-brand-primary-active: var(--oh-color-orange-950); /** Active/pressed state */
@@ -231,6 +257,9 @@
231
257
  --oh-color-surface-inset: var(--oh-color-warm-parchment); /** Inputs, wells — pressed in */
232
258
  --oh-color-surface-highlight: var(--oh-color-white); /** Brightest surface — focused inputs, top of raised gradients */
233
259
  --oh-color-surface-disabled: var(--oh-color-warm-sand); /** Quiet disabled */
260
+ --oh-color-surface-featured-start: var(--oh-color-warm-dawn); /** Featured (sunlit) card gradient: top */
261
+ --oh-color-surface-featured-mid: var(--oh-color-warm-shell); /** Featured (sunlit) card gradient: 30% */
262
+ --oh-color-surface-featured-end: var(--oh-color-warm-biscuit); /** Featured (sunlit) card gradient: bottom */
234
263
  --oh-color-border-default: var(--oh-color-warm-sand); /** Standard border */
235
264
  --oh-color-border-subtle: var(--oh-color-warm-parchment); /** Subtle dividers */
236
265
  --oh-color-border-emphasis: var(--oh-color-warm-driftwood); /** Strong border for form elements */
@@ -251,19 +280,14 @@
251
280
  --oh-color-text-on-error: var(--oh-color-white); /** Text on filled color.feedback.error */
252
281
  --oh-color-text-on-warning: var(--oh-color-white); /** Text on filled color.feedback.warning */
253
282
  --oh-color-text-on-info: var(--oh-color-white); /** Text on filled color.feedback.info */
254
- --oh-spacing-layout-page: var(--oh-spacing-6);
255
- --oh-spacing-layout-section: var(--oh-spacing-12);
256
- --oh-spacing-layout-stack: var(--oh-spacing-5);
257
- --oh-spacing-layout-inline: var(--oh-spacing-4);
258
- --oh-spacing-component-xs: var(--oh-spacing-1-5);
259
- --oh-spacing-component-sm: var(--oh-spacing-2-5);
260
- --oh-spacing-component-md: var(--oh-spacing-3-5);
261
- --oh-spacing-component-lg: var(--oh-spacing-5);
262
- --oh-spacing-component-xl: var(--oh-spacing-7);
263
283
  --oh-shadow-primary: var(--oh-shadow-chunky-primary); /** Primary buttons */
264
284
  --oh-shadow-secondary: var(--oh-shadow-chunky-secondary); /** Secondary/form elements */
265
285
  --oh-shadow-accent: var(--oh-shadow-chunky-accent); /** Accent buttons */
266
286
  --oh-shadow-error: var(--oh-shadow-chunky-error); /** Error state */
287
+ --oh-shadow-neutral: var(--oh-shadow-chunky-driftwood); /** Containers and the skip link */
288
+ --oh-shadow-neutral-hover: var(--oh-shadow-chunky-driftwood-hover); /** Lifted containers */
289
+ --oh-shadow-overlay: var(--oh-shadow-chunky-driftwood-deep); /** Dialogs */
290
+ --oh-shadow-field: var(--oh-shadow-chunky-walnut); /** The inset shadow inside text fields */
267
291
  --oh-gradient-sunlit: linear-gradient(180deg, var(--oh-color-warm-dawn) 0%, var(--oh-color-warm-shell) 30%, var(--oh-color-warm-biscuit) 100%); /** Gentle warmth for surfaces — same stops as the sunlit card */
268
292
  --oh-motion-quick: var(--oh-motion-duration-quick);
269
293
  --oh-motion-snappy: var(--oh-motion-duration-snappy);
@@ -273,6 +297,15 @@
273
297
  --oh-motion-ease-gentle: var(--oh-motion-easing-gentle);
274
298
  --oh-motion-ease-out: var(--oh-motion-easing-out);
275
299
  --oh-motion-ease-playful: var(--oh-motion-easing-playful);
300
+ --oh-spacing-layout-page: var(--oh-spacing-6);
301
+ --oh-spacing-layout-section: var(--oh-spacing-12);
302
+ --oh-spacing-layout-stack: var(--oh-spacing-5);
303
+ --oh-spacing-layout-inline: var(--oh-spacing-4);
304
+ --oh-spacing-component-xs: var(--oh-spacing-1-5);
305
+ --oh-spacing-component-sm: var(--oh-spacing-2-5);
306
+ --oh-spacing-component-md: var(--oh-spacing-3-5);
307
+ --oh-spacing-component-lg: var(--oh-spacing-5);
308
+ --oh-spacing-component-xl: var(--oh-spacing-7);
276
309
  --oh-typography-heading-font-family: var(--oh-font-family-display);
277
310
  --oh-typography-heading-h1-font-size: var(--oh-font-size-4xl);
278
311
  --oh-typography-heading-h1-font-weight: var(--oh-font-weight-bold);
@@ -353,6 +386,17 @@
353
386
  --oh-elevation-strong: var(--oh-shadow-strong); /** Modals, dialogs */
354
387
  --oh-elevation-glow: var(--oh-shadow-glow); /** Focus ring */
355
388
  --oh-elevation-inset: var(--oh-shadow-inset); /** Inputs, wells */
389
+ --oh-elevation-surface-flat: var(--oh-shadow-layered-flat);
390
+ --oh-elevation-surface-raised: var(--oh-shadow-layered-raised);
391
+ --oh-elevation-surface-lifted: var(--oh-shadow-layered-lifted); /** Hovered */
392
+ --oh-elevation-surface-pressed: var(--oh-shadow-layered-pressed);
393
+ --oh-elevation-surface-focused: var(--oh-shadow-layered-focused); /** Sits under the focus glow */
394
+ --oh-elevation-surface-featured: var(--oh-shadow-layered-sunlit);
395
+ --oh-elevation-surface-featured-lifted: var(--oh-shadow-layered-sunlit-lifted);
396
+ --oh-elevation-surface-featured-focused: var(--oh-shadow-layered-sunlit-focused);
397
+ --oh-stroke-control: var(--oh-border-width-chunky); /** Controls and framed containers: buttons, fields, checkboxes, alerts, dialogs */
398
+ --oh-stroke-surface: var(--oh-border-width-1); /** Card edges */
399
+ --oh-stroke-divider: var(--oh-border-width-1); /** Lines between sections */
356
400
  --oh-focus-ring-color: var(--oh-color-orange-900); /** The focus colour: outlines, focused control borders. Must stay opaque (4.7:1 on cream, WCAG 1.4.11) */
357
401
  --oh-button-size-sm-padding-x: var(--oh-spacing-4);
358
402
  --oh-button-size-sm-padding-y: var(--oh-spacing-2);
@@ -368,19 +412,20 @@
368
412
  --oh-button-focus-glow-color: var(--oh-focus-glow-color);
369
413
  --oh-input-size-md-padding-x: var(--oh-spacing-4);
370
414
  --oh-input-size-md-padding-y: var(--oh-spacing-3);
371
- --oh-card-base-border-width: var(--oh-border-width-1);
372
415
  --oh-card-base-padding: var(--oh-spacing-5);
373
416
  --oh-card-interactive-border-color-hover: var(--oh-color-border-brand);
374
- --oh-card-sunlit-gradient-start: var(--oh-color-warm-dawn);
375
- --oh-card-sunlit-gradient-mid: var(--oh-color-warm-shell);
376
- --oh-card-sunlit-gradient-end: var(--oh-color-warm-biscuit);
377
417
  --oh-card-sunlit-border-color: var(--oh-color-border-brand);
418
+ --oh-card-sunlit-border-color-hover: var(--oh-color-border-brand-hover);
419
+ --oh-card-section-divider-color: var(--oh-color-border-divider);
420
+ --oh-card-section-header-gradient-start: var(--oh-color-surface-sheen);
378
421
  --oh-badge-base-padding-x: var(--oh-spacing-2-5);
379
422
  --oh-badge-base-padding-y: var(--oh-spacing-1);
423
+ --oh-modal-overlay: var(--oh-color-surface-backdrop);
380
424
  --oh-button-base-font-family: var(--oh-typography-control-font-family);
381
425
  --oh-button-base-font-weight: var(--oh-typography-control-font-weight);
382
426
  --oh-button-base-letter-spacing: var(--oh-typography-control-letter-spacing);
383
427
  --oh-button-base-border-radius: var(--oh-shape-control);
428
+ --oh-button-base-border-width: var(--oh-stroke-control);
384
429
  --oh-button-base-transition-duration: var(--oh-motion-snappy);
385
430
  --oh-button-base-transition-easing: var(--oh-motion-ease-playful);
386
431
  --oh-button-size-sm-font-size: var(--oh-typography-control-font-size-sm);
@@ -407,6 +452,7 @@
407
452
  --oh-input-base-font-size: var(--oh-typography-control-font-size-md);
408
453
  --oh-input-base-line-height: var(--oh-typography-body-base-line-height);
409
454
  --oh-input-base-border-radius: var(--oh-shape-control);
455
+ --oh-input-base-border-width: var(--oh-stroke-control);
410
456
  --oh-input-base-transition-duration: var(--oh-motion-snappy);
411
457
  --oh-input-base-transition-easing: var(--oh-motion-ease-gentle);
412
458
  --oh-input-state-default-background: var(--oh-color-surface-base);
@@ -423,6 +469,7 @@
423
469
  --oh-input-state-error-shadow-color: var(--oh-shadow-error);
424
470
  --oh-card-base-background: var(--oh-color-surface-raised);
425
471
  --oh-card-base-border-radius: var(--oh-shape-large);
472
+ --oh-card-base-border-width: var(--oh-stroke-surface);
426
473
  --oh-card-base-border-color: var(--oh-color-border-default);
427
474
  --oh-card-base-shadow: var(--oh-elevation-soft);
428
475
  --oh-card-interactive-transition-duration: var(--oh-motion-gentle);
@@ -436,7 +483,10 @@
436
483
  --oh-card-flat-gradient-start: var(--oh-color-surface-base);
437
484
  --oh-card-flat-gradient-end: var(--oh-color-surface-raised);
438
485
  --oh-card-flat-border-color: var(--oh-color-border-default);
439
- --oh-card-sunlit-background: var(--oh-gradient-sunlit);
486
+ --oh-card-sunlit-background: linear-gradient(180deg, var(--oh-color-surface-featured-start) 0%, var(--oh-color-surface-featured-mid) 30%, var(--oh-color-surface-featured-end) 100%);
487
+ --oh-card-sunlit-gradient-start: var(--oh-color-surface-featured-start);
488
+ --oh-card-sunlit-gradient-mid: var(--oh-color-surface-featured-mid);
489
+ --oh-card-sunlit-gradient-end: var(--oh-color-surface-featured-end);
440
490
  --oh-card-sunlit-shadow: var(--oh-elevation-medium);
441
491
  --oh-progress-inverse-fill: var(--oh-color-text-inverse);
442
492
  --oh-badge-base-font-family: var(--oh-typography-label-font-family);