@hirobius/design-system 0.8.1

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 (111) hide show
  1. package/LICENSE/main.tsx +21 -0
  2. package/README.md +124 -0
  3. package/dist/chunks/TokenDisplayContext-B3gxyQN7.js +95 -0
  4. package/dist/chunks/form-DnGRy27o.js +63 -0
  5. package/dist/cn.js +8 -0
  6. package/dist/contexts.js +133 -0
  7. package/dist/form.js +62 -0
  8. package/dist/hirobius-ui.js +5611 -0
  9. package/dist/manifest.js +28 -0
  10. package/dist/tokens.css +1 -0
  11. package/dist/tokens.js +693 -0
  12. package/dist/types/src/app/components/activity-feed.d.ts +43 -0
  13. package/dist/types/src/app/components/alert.d.ts +18 -0
  14. package/dist/types/src/app/components/asset-img.d.ts +54 -0
  15. package/dist/types/src/app/components/avatar.d.ts +23 -0
  16. package/dist/types/src/app/components/badge.d.ts +20 -0
  17. package/dist/types/src/app/components/breadcrumb.d.ts +26 -0
  18. package/dist/types/src/app/components/button.d.ts +37 -0
  19. package/dist/types/src/app/components/callout.d.ts +23 -0
  20. package/dist/types/src/app/components/card.d.ts +119 -0
  21. package/dist/types/src/app/components/checkbox.d.ts +20 -0
  22. package/dist/types/src/app/components/cinematic-link.d.ts +13 -0
  23. package/dist/types/src/app/components/code-block.d.ts +29 -0
  24. package/dist/types/src/app/components/combobox.d.ts +46 -0
  25. package/dist/types/src/app/components/component-instance-matrix.d.ts +21 -0
  26. package/dist/types/src/app/components/container.d.ts +31 -0
  27. package/dist/types/src/app/components/dialog.d.ts +73 -0
  28. package/dist/types/src/app/components/disclosure.d.ts +32 -0
  29. package/dist/types/src/app/components/divider.d.ts +21 -0
  30. package/dist/types/src/app/components/doc-link-card.d.ts +26 -0
  31. package/dist/types/src/app/components/empty-state.d.ts +24 -0
  32. package/dist/types/src/app/components/error-boundary.d.ts +25 -0
  33. package/dist/types/src/app/components/error-pattern.d.ts +9 -0
  34. package/dist/types/src/app/components/field.d.ts +25 -0
  35. package/dist/types/src/app/components/form.d.ts +106 -0
  36. package/dist/types/src/app/components/foundation-swatch.d.ts +39 -0
  37. package/dist/types/src/app/components/grid.d.ts +65 -0
  38. package/dist/types/src/app/components/heading-stack.d.ts +42 -0
  39. package/dist/types/src/app/components/history-card.d.ts +12 -0
  40. package/dist/types/src/app/components/icon-button.d.ts +23 -0
  41. package/dist/types/src/app/components/icon.d.ts +30 -0
  42. package/dist/types/src/app/components/info-page.d.ts +10 -0
  43. package/dist/types/src/app/components/inline-code.d.ts +12 -0
  44. package/dist/types/src/app/components/inline-link.d.ts +17 -0
  45. package/dist/types/src/app/components/input.d.ts +46 -0
  46. package/dist/types/src/app/components/lab/tokenUtils.d.ts +38 -0
  47. package/dist/types/src/app/components/menu.d.ts +56 -0
  48. package/dist/types/src/app/components/nav-group.d.ts +24 -0
  49. package/dist/types/src/app/components/nav-item.d.ts +21 -0
  50. package/dist/types/src/app/components/not-found-pattern.d.ts +1 -0
  51. package/dist/types/src/app/components/page.d.ts +43 -0
  52. package/dist/types/src/app/components/pagination.d.ts +24 -0
  53. package/dist/types/src/app/components/popover.d.ts +44 -0
  54. package/dist/types/src/app/components/progress.d.ts +25 -0
  55. package/dist/types/src/app/components/radio.d.ts +18 -0
  56. package/dist/types/src/app/components/segmented-control.d.ts +33 -0
  57. package/dist/types/src/app/components/skeleton.d.ts +25 -0
  58. package/dist/types/src/app/components/sketch.d.ts +13 -0
  59. package/dist/types/src/app/components/slider.d.ts +22 -0
  60. package/dist/types/src/app/components/spinner.d.ts +20 -0
  61. package/dist/types/src/app/components/stack.d.ts +39 -0
  62. package/dist/types/src/app/components/stat.d.ts +24 -0
  63. package/dist/types/src/app/components/status-list-item.d.ts +25 -0
  64. package/dist/types/src/app/components/status-tile.d.ts +22 -0
  65. package/dist/types/src/app/components/stepper-field.d.ts +13 -0
  66. package/dist/types/src/app/components/surface-padding.d.ts +18 -0
  67. package/dist/types/src/app/components/surface.d.ts +30 -0
  68. package/dist/types/src/app/components/table.d.ts +40 -0
  69. package/dist/types/src/app/components/tabs.d.ts +27 -0
  70. package/dist/types/src/app/components/tag.d.ts +32 -0
  71. package/dist/types/src/app/components/text-lockup.d.ts +38 -0
  72. package/dist/types/src/app/components/text.d.ts +26 -0
  73. package/dist/types/src/app/components/tile-grid.d.ts +17 -0
  74. package/dist/types/src/app/components/toast.d.ts +56 -0
  75. package/dist/types/src/app/components/toggle.d.ts +18 -0
  76. package/dist/types/src/app/components/token.d.ts +59 -0
  77. package/dist/types/src/app/components/tooltip.d.ts +33 -0
  78. package/dist/types/src/app/context/DemoStateContext.d.ts +21 -0
  79. package/dist/types/src/app/context/FontContext.d.ts +4 -0
  80. package/dist/types/src/app/context/LanguageContext.d.ts +23 -0
  81. package/dist/types/src/app/context/RouterContext.d.ts +61 -0
  82. package/dist/types/src/app/context/TenantContext.d.ts +29 -0
  83. package/dist/types/src/app/context/ThemeContext.d.ts +18 -0
  84. package/dist/types/src/app/context/TokenDisplayContext.d.ts +11 -0
  85. package/dist/types/src/app/context/index.d.ts +19 -0
  86. package/dist/types/src/app/data/manifest-types.d.ts +128 -0
  87. package/dist/types/src/app/design-system/generated-token-refs.d.ts +586 -0
  88. package/dist/types/src/app/design-system/generated-token-values.d.ts +223 -0
  89. package/dist/types/src/app/design-system/theme.d.ts +32 -0
  90. package/dist/types/src/app/design-system/tokens.d.ts +333 -0
  91. package/dist/types/src/app/hooks/useFocusVisible.d.ts +9 -0
  92. package/dist/types/src/app/hooks/useInteractionState.d.ts +27 -0
  93. package/dist/types/src/app/layouts/CaseStudyLayout.d.ts +21 -0
  94. package/dist/types/src/app/layouts/DocLayout.d.ts +16 -0
  95. package/dist/types/src/app/layouts/EmbeddedDocLayoutContext.d.ts +6 -0
  96. package/dist/types/src/app/lib/nav-active.d.ts +16 -0
  97. package/dist/types/src/app/lib/navLevels.d.ts +4 -0
  98. package/dist/types/src/app/pages/hds/HdsSystemDocLayout.d.ts +7 -0
  99. package/dist/types/src/form/hds-form.d.ts +61 -0
  100. package/dist/types/src/form/index.d.ts +30 -0
  101. package/dist/types/src/form/use-hds-form.d.ts +23 -0
  102. package/dist/types/src/index.d.ts +2276 -0
  103. package/dist/types/src/lib/deprecation.d.ts +4 -0
  104. package/dist/types/src/lib/manifest-entry.d.ts +3 -0
  105. package/dist/types/src/lib/utils.d.ts +3 -0
  106. package/dist/variables.css +461 -0
  107. package/hirobius.tokens.json +2220 -0
  108. package/package.json +366 -0
  109. package/protocol/envelope.mjs +201 -0
  110. package/protocol/figma-snapshot.schema.json +190 -0
  111. package/public/hds-manifest.json +11230 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Generated by scripts/build-tokens.mjs — do not edit manually.
3
+ * Source: hirobius.tokens.json (W3C DTCG 2025.10)
4
+ * Regenerate: node scripts/build-tokens.mjs
5
+ *
6
+ * Raw primitive values as typed constants.
7
+ * Import in doc pages instead of hardcoding hex strings, font names, or OKLCH values.
8
+ *
9
+ * Usage:
10
+ * import { tokenValues } from './generated-token-values';
11
+ * tokenValues.primitive.color.blue['500'] // '#1e2fff'
12
+ * tokenValues.primitive.typography.family.primary[0] // 'Clash Grotesk'
13
+ * tokenValues.primitive.color.blue['500'] // 'oklch(0.49 0.2903 266.54)'
14
+ */
15
+ export declare const tokenValues: {
16
+ readonly primitive: {
17
+ readonly color: {
18
+ readonly neutral: {
19
+ readonly "50": "#fafafa";
20
+ readonly "100": "#f5f5f5";
21
+ readonly "200": "#e5e5e5";
22
+ readonly "300": "#d4d4d4";
23
+ readonly "400": "#a3a3a3";
24
+ readonly "500": "#737373";
25
+ readonly "600": "#525252";
26
+ readonly "700": "#404040";
27
+ readonly "800": "#262626";
28
+ readonly "850": "#1a1a1a";
29
+ readonly "900": "#111111";
30
+ readonly "950": "#0a0a0a";
31
+ readonly white: "#ffffff";
32
+ readonly black: "#000000";
33
+ };
34
+ readonly blue: {
35
+ readonly "50": "oklch(0.96 0.03 266.54)";
36
+ readonly "100": "oklch(0.92 0.04 266.54)";
37
+ readonly "200": "oklch(0.88 0.07 266.54)";
38
+ readonly "300": "oklch(0.70 0.2903 266.54)";
39
+ readonly "400": "oklch(0.65 0.2903 266.54)";
40
+ readonly "450": "oklch(0.56 0.29 266.60)";
41
+ readonly "500": "#1E2EFD";
42
+ readonly "600": "oklch(0.45 0.2903 266.54)";
43
+ readonly "700": "oklch(0.44 0.2903 266.54)";
44
+ readonly "800": "oklch(0.30 0.07 266.54)";
45
+ readonly "900": "oklch(0.22 0.05 266.54)";
46
+ };
47
+ readonly red: {
48
+ readonly "50": "#fef2f2";
49
+ readonly "400": "#f87171";
50
+ readonly "700": "#b91c1c";
51
+ readonly "950": "#450a0a";
52
+ };
53
+ readonly green: {
54
+ readonly "50": "#ecfdf5";
55
+ readonly "400": "#34d399";
56
+ readonly "700": "#047857";
57
+ readonly "950": "#022c22";
58
+ };
59
+ readonly amber: {
60
+ readonly "50": "#fffbeb";
61
+ readonly "400": "#fbbf24";
62
+ readonly "800": "#92400e";
63
+ readonly "950": "#451a03";
64
+ };
65
+ readonly stone: {
66
+ readonly "100": "#F5EFE7";
67
+ readonly "400": "#D0B492";
68
+ readonly "450": "#BC9D7E";
69
+ readonly "500": "#A8896A";
70
+ readonly "600": "#8B6F47";
71
+ readonly "700": "#75593A";
72
+ readonly "800": "#5C432A";
73
+ readonly "950": "#3A2E1F";
74
+ };
75
+ readonly projectBrand: {
76
+ readonly microsoftGameDev: {
77
+ readonly "100": "#E5E5FC";
78
+ readonly "500": "#6d31fb";
79
+ readonly "900": "oklch(0.22 0.16 304)";
80
+ };
81
+ };
82
+ };
83
+ readonly space: {
84
+ readonly "0": "0px";
85
+ readonly "1": "4px";
86
+ readonly "2": "8px";
87
+ readonly "3": "12px";
88
+ readonly "4": "16px";
89
+ readonly "5": "20px";
90
+ readonly "6": "24px";
91
+ readonly "7": "28px";
92
+ readonly "8": "32px";
93
+ readonly "10": "40px";
94
+ readonly "12": "48px";
95
+ readonly "16": "64px";
96
+ readonly "20": "80px";
97
+ readonly "24": "96px";
98
+ readonly "32": "128px";
99
+ readonly px1: "1px";
100
+ readonly px2: "2px";
101
+ readonly px6: "6px";
102
+ readonly px10: "10px";
103
+ };
104
+ readonly blur: {
105
+ readonly "8": "8px";
106
+ readonly "16": "16px";
107
+ };
108
+ readonly radius: {
109
+ readonly "0": "0px";
110
+ readonly "2": "2px";
111
+ readonly "4": "4px";
112
+ readonly "8": "8px";
113
+ readonly "12": "12px";
114
+ readonly full: "9999px";
115
+ };
116
+ readonly typography: {
117
+ readonly family: {
118
+ readonly primary: readonly ["Satoshi", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"];
119
+ readonly display: readonly ["Clash Display", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"];
120
+ readonly mono: readonly ["Geist Mono", "Courier New", "monospace"];
121
+ };
122
+ readonly size: {
123
+ readonly "2xs": "10px";
124
+ readonly xs: "13px";
125
+ readonly sm: "15px";
126
+ readonly base: "17px";
127
+ readonly lg: "20px";
128
+ readonly xl: "24px";
129
+ readonly "2xl": "30px";
130
+ readonly "3xl": "36px";
131
+ readonly "4xl": "48px";
132
+ readonly "5xl": "80px";
133
+ readonly "7xl": "72px";
134
+ };
135
+ readonly weight: {
136
+ readonly light: "300";
137
+ readonly regular: "400";
138
+ readonly medium: "500";
139
+ readonly semibold: "600";
140
+ readonly bold: "700";
141
+ };
142
+ readonly lineHeight: {
143
+ readonly compact: "0.95";
144
+ readonly none: "1";
145
+ readonly tight: "1.25";
146
+ readonly snug: "1.375";
147
+ readonly normal: "1.5";
148
+ readonly relaxed: "1.625";
149
+ };
150
+ readonly letterSpacing: {
151
+ readonly tighter: "-0.02em";
152
+ readonly tight: "-0.01em";
153
+ readonly normal: "0em";
154
+ readonly wide: "0.01em";
155
+ readonly wider: "0.02em";
156
+ readonly caps: "0.06em";
157
+ };
158
+ };
159
+ readonly duration: {
160
+ readonly instant: "100ms";
161
+ readonly short: "150ms";
162
+ readonly medium: "250ms";
163
+ readonly long: "400ms";
164
+ };
165
+ readonly easing: {
166
+ readonly emphasized: "cubic-bezier(0.4, 0, 0.2, 1)";
167
+ readonly decelerate: "cubic-bezier(0, 0, 0.2, 1)";
168
+ readonly accelerate: "cubic-bezier(0.4, 0, 1, 1)";
169
+ readonly elastic: "spring(300, 20, 1)";
170
+ };
171
+ readonly shadow: {
172
+ readonly color: "220 13% 18%";
173
+ };
174
+ readonly breakpoint: {
175
+ readonly xs: "375px";
176
+ readonly sm: "640px";
177
+ readonly md: "768px";
178
+ readonly lg: "1024px";
179
+ readonly xl: "1280px";
180
+ };
181
+ readonly size: {
182
+ readonly "8": "8px";
183
+ readonly "10": "10px";
184
+ readonly "12": "12px";
185
+ readonly "16": "16px";
186
+ readonly "20": "20px";
187
+ readonly "24": "24px";
188
+ readonly "32": "32px";
189
+ readonly "40": "40px";
190
+ readonly "48": "48px";
191
+ readonly "64": "64px";
192
+ readonly "80": "80px";
193
+ readonly "96": "96px";
194
+ readonly interactive: {
195
+ readonly min: "44px";
196
+ };
197
+ readonly width: {
198
+ readonly "96": "96px";
199
+ readonly "760": "760px";
200
+ readonly "1200": "1200px";
201
+ readonly "50ch": "50ch";
202
+ };
203
+ };
204
+ readonly grid: {
205
+ readonly columns: {
206
+ readonly "1": "1";
207
+ readonly "2": "2";
208
+ readonly "3": "3";
209
+ };
210
+ };
211
+ readonly zIndex: {
212
+ readonly "0": "0";
213
+ readonly "10": "10";
214
+ readonly "100": "100";
215
+ readonly "1000": "1000";
216
+ };
217
+ readonly borderWidth: {
218
+ readonly xs: "1px";
219
+ readonly sm: "2px";
220
+ readonly md: "4px";
221
+ };
222
+ };
223
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Hirobius Design System - runtime theme resolver.
3
+ *
4
+ * ct(isDark) returns a computed colour object built entirely from hds tokens.
5
+ * Import this wherever you need resolved colours for a given dark/light mode.
6
+ *
7
+ * Usage:
8
+ * import { ct } from '../design-system/theme';
9
+ * const t = ct(isDark);
10
+ * // t.bg, t.content, t.accent, etc.
11
+ */
12
+ export declare function ct(isDark: boolean): {
13
+ bg: string;
14
+ panelBg: string;
15
+ fill: string;
16
+ hover: string;
17
+ brandTint: string;
18
+ content: {
19
+ primary: string;
20
+ secondary: string;
21
+ subtle: string;
22
+ faint: string;
23
+ };
24
+ border: string;
25
+ rule: string;
26
+ accent: string;
27
+ blueBar: string;
28
+ success: "#34d399" | "#047857";
29
+ danger: "#f87171" | "#b91c1c";
30
+ warning: "#fbbf24" | "#92400e";
31
+ info: "oklch(0.70 0.2903 266.54)" | "#1E2EFD";
32
+ };
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Hirobius Design System — token bridge.
3
+ *
4
+ * All values here reference W3C CSS custom properties from tokens.css.
5
+ * Source of truth: hirobius.tokens.json → node scripts/build-tokens.mjs
6
+ *
7
+ * For colours that require runtime theme-mode computation see theme.ts / ct(isDark).
8
+ * Once full semantic colour tokens are added those too will become static CSS var references.
9
+ */
10
+ import React from 'react';
11
+ declare const hds: {
12
+ color: {
13
+ brand: string;
14
+ content: {
15
+ primary: string;
16
+ secondary: string;
17
+ disabled: string;
18
+ inverse: string;
19
+ accent: string;
20
+ onAccent: string;
21
+ };
22
+ brandPressed: string;
23
+ brandRGB: string;
24
+ white: string;
25
+ surface: {
26
+ page: {
27
+ dark: string;
28
+ light: string;
29
+ };
30
+ raised: {
31
+ dark: string;
32
+ light: string;
33
+ };
34
+ };
35
+ blue: {
36
+ '50': string;
37
+ '100': string;
38
+ '200': string;
39
+ '300': string;
40
+ '400': string;
41
+ '450': string;
42
+ '500': string;
43
+ '600': string;
44
+ '700': string;
45
+ '800': string;
46
+ '900': string;
47
+ };
48
+ feedback: {
49
+ success: {
50
+ dark: "#34d399";
51
+ light: "#047857";
52
+ };
53
+ warning: {
54
+ dark: "#fbbf24";
55
+ light: "#92400e";
56
+ };
57
+ error: {
58
+ dark: "#f87171";
59
+ light: "#b91c1c";
60
+ };
61
+ info: {
62
+ dark: "oklch(0.70 0.2903 266.54)";
63
+ light: "#1E2EFD";
64
+ };
65
+ };
66
+ };
67
+ fontFamily: string;
68
+ monoFamily: string;
69
+ fontSize: {
70
+ '2xs': string;
71
+ xs: string;
72
+ sm: string;
73
+ base: string;
74
+ lg: string;
75
+ xl: string;
76
+ '2xl': string;
77
+ '3xl': string;
78
+ '4xl': string;
79
+ '5xl': string;
80
+ };
81
+ fontWeight: {
82
+ regular: string;
83
+ medium: string;
84
+ semibold: string;
85
+ bold: string;
86
+ };
87
+ lineHeight: {
88
+ compact: string;
89
+ none: string;
90
+ tight: string;
91
+ snug: string;
92
+ normal: string;
93
+ relaxed: string;
94
+ };
95
+ letterSpacing: {
96
+ tighter: string;
97
+ tight: string;
98
+ normal: string;
99
+ wide: string;
100
+ wider: string;
101
+ };
102
+ semantic: {
103
+ color: {
104
+ accent: {
105
+ rest: "var(--semantic-accent-rest)";
106
+ hover: "var(--semantic-accent-hover)";
107
+ pressed: "var(--semantic-accent-pressed)";
108
+ subtle: "var(--semantic-accent-subtle)";
109
+ disabled: "var(--semantic-accent-disabled)";
110
+ };
111
+ };
112
+ space: {
113
+ subgrid: {
114
+ gap: string;
115
+ hairline: string;
116
+ xs: string;
117
+ };
118
+ component: {
119
+ padding: string;
120
+ gap: string;
121
+ };
122
+ stack: {
123
+ gap: string;
124
+ };
125
+ layout: {
126
+ gutter: string;
127
+ gap: string;
128
+ section: string;
129
+ };
130
+ section: {
131
+ stack: string;
132
+ inset: string;
133
+ };
134
+ sidebar: {
135
+ indent: string;
136
+ gap: string;
137
+ sectionGap: string;
138
+ railPadding: string;
139
+ };
140
+ };
141
+ typography: {
142
+ label: React.CSSProperties;
143
+ labelDescriptive: React.CSSProperties;
144
+ labelTechnical: React.CSSProperties;
145
+ };
146
+ };
147
+ typeStyles: {
148
+ display: React.CSSProperties;
149
+ h1: React.CSSProperties;
150
+ h2: React.CSSProperties;
151
+ h3: React.CSSProperties;
152
+ body: React.CSSProperties;
153
+ ui: React.CSSProperties;
154
+ eyebrow: React.CSSProperties;
155
+ mono: React.CSSProperties;
156
+ small: React.CSSProperties;
157
+ caption: React.CSSProperties;
158
+ heading1: React.CSSProperties;
159
+ heading2: React.CSSProperties;
160
+ heading3: React.CSSProperties;
161
+ technical: React.CSSProperties;
162
+ badge: React.CSSProperties;
163
+ micro: React.CSSProperties;
164
+ displayXl: React.CSSProperties;
165
+ display1: React.CSSProperties;
166
+ display2: React.CSSProperties;
167
+ headingHero: React.CSSProperties;
168
+ headingSection: React.CSSProperties;
169
+ title: React.CSSProperties;
170
+ body2: React.CSSProperties;
171
+ bodyLarge: React.CSSProperties;
172
+ bodySmall: React.CSSProperties;
173
+ monoXs: React.CSSProperties;
174
+ monoSm: React.CSSProperties;
175
+ label: React.CSSProperties;
176
+ labelDescriptive: React.CSSProperties;
177
+ labelTechnical: React.CSSProperties;
178
+ };
179
+ iconSize: {
180
+ small: string;
181
+ medium: string;
182
+ large: string;
183
+ };
184
+ density: {
185
+ xs: string;
186
+ sm: string;
187
+ md: string;
188
+ lg: string;
189
+ xl: string;
190
+ xl2: string;
191
+ xl3: string;
192
+ xl4: string;
193
+ };
194
+ space: {
195
+ px1: string;
196
+ px2: string;
197
+ px4: string;
198
+ px6: string;
199
+ px8: string;
200
+ px10: string;
201
+ px12: string;
202
+ px16: string;
203
+ px20: string;
204
+ px24: string;
205
+ px28: string;
206
+ px32: string;
207
+ px40: string;
208
+ px48: string;
209
+ px64: string;
210
+ px80: string;
211
+ px96: string;
212
+ px128: string;
213
+ };
214
+ borderWidth: {
215
+ xs: string;
216
+ sm: string;
217
+ md: string;
218
+ default: string;
219
+ emphasis: string;
220
+ };
221
+ borderRadius: {
222
+ 0: string;
223
+ 2: string;
224
+ 4: string;
225
+ 8: string;
226
+ full: string;
227
+ circle: string;
228
+ /** Named aliases for common radii — prefer these over numeric keys in new code. */
229
+ sm: string;
230
+ md: string;
231
+ /** Global action radius — toggle one token to round all buttons, inputs, selects. */
232
+ action: string;
233
+ };
234
+ duration: {
235
+ /** 100ms — binary toggles, instant dismissals */
236
+ instant: string;
237
+ /** 150ms — micro-interactions, hover/focus/press (productive default) */
238
+ fast: string;
239
+ /** 250ms — entrances, teaching moments (expressive) */
240
+ normal: string;
241
+ /** 400ms — spatial movement, page travel (slow / spatial) */
242
+ slow: string;
243
+ };
244
+ effect: {
245
+ blur: {
246
+ subtle: string;
247
+ lightboxBackdrop: string;
248
+ };
249
+ };
250
+ zIndex: {
251
+ base: string;
252
+ focus: string;
253
+ overlay: string;
254
+ modal: string;
255
+ };
256
+ breakpoints: {
257
+ readonly xs: 375;
258
+ readonly sm: 640;
259
+ readonly md: 768;
260
+ readonly lg: 1024;
261
+ readonly xl: 1280;
262
+ readonly css: {
263
+ readonly xs: "var(--primitive-breakpoint-xs)";
264
+ readonly sm: "var(--primitive-breakpoint-sm)";
265
+ readonly md: "var(--primitive-breakpoint-md)";
266
+ readonly lg: "var(--primitive-breakpoint-lg)";
267
+ readonly xl: "var(--primitive-breakpoint-xl)";
268
+ };
269
+ };
270
+ layout: {
271
+ pageGutterH: string;
272
+ mobileGutterH: string;
273
+ sectionPad: string;
274
+ sectionPadSm: string;
275
+ panelGap: string;
276
+ panelGapMob: string;
277
+ containerMaxWidth: "var(--semantic-layout-container-maxWidth)";
278
+ contentMaxWidth: "var(--semantic-layout-content-maxWidth)";
279
+ proseMaxWidth: "var(--semantic-layout-prose-maxWidth)";
280
+ sectionPaddingY: "var(--semantic-layout-section-paddingY)";
281
+ gridColumnGap: "var(--semantic-layout-grid-gap)";
282
+ };
283
+ size: {
284
+ 8: string;
285
+ 10: string;
286
+ 12: string;
287
+ 16: string;
288
+ 20: string;
289
+ 24: string;
290
+ 32: string;
291
+ 40: string;
292
+ 48: string;
293
+ 64: string;
294
+ 80: string;
295
+ 96: string;
296
+ interactive: {
297
+ min: string;
298
+ };
299
+ width: {
300
+ '96': string;
301
+ '760': string;
302
+ '1200': string;
303
+ '50ch': string;
304
+ };
305
+ };
306
+ motion: {
307
+ readonly productive: {
308
+ readonly duration: number;
309
+ readonly easing: [number, number, number, number];
310
+ };
311
+ readonly expressive: {
312
+ readonly duration: number;
313
+ readonly easing: {
314
+ readonly type: "spring";
315
+ readonly stiffness: 300;
316
+ readonly damping: 20;
317
+ readonly mass: 1;
318
+ };
319
+ };
320
+ readonly spatial: {
321
+ readonly duration: number;
322
+ readonly easing: [number, number, number, number];
323
+ };
324
+ readonly exit: {
325
+ readonly duration: number;
326
+ readonly easing: [number, number, number, number];
327
+ };
328
+ };
329
+ };
330
+ /** @public */
331
+ export default hds;
332
+ export { ct } from './theme';
333
+ export { tokenValues } from './generated-token-values';
@@ -0,0 +1,9 @@
1
+ export interface FocusVisibleState {
2
+ /** True when the current focus should render a visible focus ring. */
3
+ isFocusVisible: boolean;
4
+ /** Call from `onFocus`, passing the focused element. */
5
+ onFocus: (target: Element) => void;
6
+ /** Call from `onBlur` / `onPointerDown` to drop the focus ring. */
7
+ clearFocusVisible: () => void;
8
+ }
9
+ export declare function useFocusVisible(): FocusVisibleState;
@@ -0,0 +1,27 @@
1
+ export type InteractionVisualState = 'rest' | 'hover' | 'focused' | 'pressed' | 'disabled';
2
+ /** Event-less setters; consumers compose their own forwarded handlers around these. */
3
+ export interface InteractionHandlers {
4
+ onMouseEnter: () => void;
5
+ onMouseLeave: () => void;
6
+ onPointerDown: () => void;
7
+ onPointerUp: () => void;
8
+ onPointerCancel: () => void;
9
+ onFocus: () => void;
10
+ onBlur: () => void;
11
+ }
12
+ export interface InteractionState {
13
+ /** Resolved visual state — the frozen demo state wins when present. */
14
+ visualState: InteractionVisualState;
15
+ isHover: boolean;
16
+ isFocused: boolean;
17
+ isPressed: boolean;
18
+ isDisabled: boolean;
19
+ handlers: InteractionHandlers;
20
+ }
21
+ export interface UseInteractionStateOptions {
22
+ /** The genuine `disabled` prop — forces `disabled` regardless of pointer/focus. */
23
+ disabled?: boolean;
24
+ /** Frozen demo state from `useFrozenState()`; when set it overrides live state. */
25
+ frozenState?: InteractionVisualState | null;
26
+ }
27
+ export declare function useInteractionState({ disabled, frozenState, }: UseInteractionStateOptions): InteractionState;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CaseStudyLayout — macro-layout skeleton for portfolio case study pages.
3
+ * @category Layout
4
+ *
5
+ * Invisible structure only. No Surface, no decorative chrome.
6
+ * Slot anatomy:
7
+ * heroSlot → full-width (maxWidth="max") — hero image + headline
8
+ * introSlot → prose-width (maxWidth="content") — narrative, Brief/Problem/Solution
9
+ * metricsSlot → full-width (maxWidth="max") — KPI or summary cards (optional)
10
+ * contentSlot → full-width (maxWidth="max") — chapters, galleries, learnings
11
+ */
12
+ import type { ReactNode } from 'react';
13
+ interface CaseStudyLayoutProps {
14
+ heroSlot: ReactNode;
15
+ introSlot: ReactNode;
16
+ metricsSlot?: ReactNode;
17
+ contentSlot: ReactNode;
18
+ }
19
+ /** @public */
20
+ export declare function CaseStudyLayout({ heroSlot, introSlot, metricsSlot, contentSlot }: CaseStudyLayoutProps): import("react/jsx-runtime").JSX.Element;
21
+ export {};
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare const DOC_LAYOUT_STICKY_OFFSET: string;
3
+ export declare const DOC_LAYOUT_STICKY_VIEWPORT_HEIGHT: string;
4
+ declare const DOC_LAYOUT_CONTENT_WIDTHS: {
5
+ readonly content: "var(--semantic-layout-width-content)";
6
+ readonly max: "var(--semantic-layout-width-max)";
7
+ };
8
+ type DocLayoutMaxWidth = keyof typeof DOC_LAYOUT_CONTENT_WIDTHS;
9
+ export type DocLayoutContentMaxWidth = DocLayoutMaxWidth;
10
+ interface DocLayoutProps {
11
+ contentSlot: ReactNode;
12
+ bottomSlot?: ReactNode;
13
+ contentMaxWidth?: DocLayoutContentMaxWidth;
14
+ }
15
+ export declare function DocLayout({ contentSlot, bottomSlot, contentMaxWidth, }: DocLayoutProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function EmbeddedDocLayoutProvider({ bottomSlot, children, }: {
3
+ bottomSlot: ReactNode | null;
4
+ children: ReactNode;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export declare function useEmbeddedDocLayoutBottomSlot(): ReactNode;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * nav-active — the single active-state rule for navigation items.
3
+ *
4
+ * Previously this 3-line predicate was copy-pasted in three places (NavGroup,
5
+ * and HDSLayout's NestedNavGroup + SideNavItem). Centralized here so "is this
6
+ * nav item active?" has exactly one definition (ADR-017, Phase 4).
7
+ */
8
+ /**
9
+ * Whether a nav item is active for the current path.
10
+ *
11
+ * - `exact`: the route must match precisely (e.g. `/` or a landing page that
12
+ * shares a prefix with its children).
13
+ * - otherwise: active when the current path equals the item path OR is a
14
+ * descendant route (`/components` is active on `/components/actions`).
15
+ */
16
+ export declare function isNavItemActive(currentPath: string, itemPath: string, exact?: boolean): boolean;