@hintoric/ui 0.8.0 → 0.9.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 (71) hide show
  1. package/README.md +12 -0
  2. package/dist/components/AccordionDetails/AccordionDetails.d.ts.map +1 -1
  3. package/dist/components/AccordionSummary/AccordionSummary.d.ts.map +1 -1
  4. package/dist/components/AccountMenu/AccountMenu.d.ts +20 -0
  5. package/dist/components/AccountMenu/AccountMenu.d.ts.map +1 -0
  6. package/dist/components/AccountMenu/index.d.ts +3 -0
  7. package/dist/components/AccountMenu/index.d.ts.map +1 -0
  8. package/dist/components/AccountMenu/types.d.ts +64 -0
  9. package/dist/components/AccountMenu/types.d.ts.map +1 -0
  10. package/dist/components/Button/ButtonBody.d.ts.map +1 -1
  11. package/dist/components/CircularProgress/CircularProgress.d.ts.map +1 -1
  12. package/dist/components/ColorSchemeMenuItems/ColorSchemeMenuItems.d.ts +1 -1
  13. package/dist/components/ColorSchemeMenuItems/ColorSchemeMenuItems.d.ts.map +1 -1
  14. package/dist/components/ColorSchemeMenuItems/types.d.ts +10 -0
  15. package/dist/components/ColorSchemeMenuItems/types.d.ts.map +1 -1
  16. package/dist/components/DataGrid/DataGridHeaderCell.d.ts.map +1 -1
  17. package/dist/components/DataGrid/dataGridVariants.d.ts +1 -1
  18. package/dist/components/DataGrid/dataGridVariants.d.ts.map +1 -1
  19. package/dist/components/Divider/Divider.d.ts.map +1 -1
  20. package/dist/components/Drawer/Drawer.d.ts.map +1 -1
  21. package/dist/components/LinearProgress/LinearProgress.d.ts.map +1 -1
  22. package/dist/components/LocaleSwitcher/LocaleSwitcher.d.ts.map +1 -1
  23. package/dist/components/MapImage/MapImageFrame.d.ts.map +1 -1
  24. package/dist/components/MenuItem/MenuItem.d.ts.map +1 -1
  25. package/dist/components/MenuItem/types.d.ts +8 -0
  26. package/dist/components/MenuItem/types.d.ts.map +1 -1
  27. package/dist/components/Modal/Modal.d.ts.map +1 -1
  28. package/dist/components/ModalDialog/ModalDialog.d.ts.map +1 -1
  29. package/dist/components/Radio/Radio.d.ts.map +1 -1
  30. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  31. package/dist/components/Switch/Switch.d.ts.map +1 -1
  32. package/dist/components/Tab/Tab.d.ts +1 -1
  33. package/dist/components/Tab/Tab.d.ts.map +1 -1
  34. package/dist/components/Tab/TabIndicatorContext.d.ts +21 -0
  35. package/dist/components/Tab/TabIndicatorContext.d.ts.map +1 -0
  36. package/dist/components/Tab/types.d.ts +8 -0
  37. package/dist/components/Tab/types.d.ts.map +1 -1
  38. package/dist/components/TabList/TabList.d.ts.map +1 -1
  39. package/dist/components/TabNav/TabNav.d.ts +23 -0
  40. package/dist/components/TabNav/TabNav.d.ts.map +1 -0
  41. package/dist/components/TabNav/TabNavContext.d.ts +11 -0
  42. package/dist/components/TabNav/TabNavContext.d.ts.map +1 -0
  43. package/dist/components/TabNav/index.d.ts +3 -0
  44. package/dist/components/TabNav/index.d.ts.map +1 -0
  45. package/dist/components/TabNav/types.d.ts +17 -0
  46. package/dist/components/TabNav/types.d.ts.map +1 -0
  47. package/dist/components/TabPanel/TabPanel.d.ts.map +1 -1
  48. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  49. package/dist/index.d.ts +6 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +5904 -5492
  52. package/dist/index.js.map +1 -1
  53. package/dist/internal/localeFlag.d.ts +7 -0
  54. package/dist/internal/localeFlag.d.ts.map +1 -0
  55. package/dist/internal/svg-icons/ArrowBackIcon.d.ts +3 -0
  56. package/dist/internal/svg-icons/ArrowBackIcon.d.ts.map +1 -0
  57. package/dist/internal/svg-icons/ChevronRightIcon.d.ts +3 -0
  58. package/dist/internal/svg-icons/ChevronRightIcon.d.ts.map +1 -0
  59. package/dist/internal/svg-icons/LogoutIcon.d.ts +3 -0
  60. package/dist/internal/svg-icons/LogoutIcon.d.ts.map +1 -0
  61. package/dist/internal/svg-icons/MenuIcon.d.ts +3 -0
  62. package/dist/internal/svg-icons/MenuIcon.d.ts.map +1 -0
  63. package/dist/internal/svg-icons/TranslateIcon.d.ts +3 -0
  64. package/dist/internal/svg-icons/TranslateIcon.d.ts.map +1 -0
  65. package/dist/style.css +1 -1
  66. package/dist/tailwind.css +463 -0
  67. package/dist/theme/ReducedMotionProvider.d.ts +9 -0
  68. package/dist/theme/ReducedMotionProvider.d.ts.map +1 -0
  69. package/dist/utils/usePrefersReducedMotion.d.ts +1 -1
  70. package/dist/utils/usePrefersReducedMotion.d.ts.map +1 -1
  71. package/package.json +11 -2
@@ -0,0 +1,463 @@
1
+ /*
2
+ * @hintoric/ui as Tailwind CSS v4 input. Use it instead of `@hintoric/ui/styles.css`
3
+ * when your app runs its own Tailwind:
4
+ *
5
+ * @import "tailwindcss";
6
+ * @import "@hintoric/ui/tailwind.css";
7
+ */
8
+ /*
9
+ * Everything the library's stylesheet needs on top of Tailwind itself, minus
10
+ * the content scan. Two entry points share it: `index.css` (our own build,
11
+ * which scans `src/`) and the published `dist/tailwind.css` (a consumer's
12
+ * Tailwind build, which scans `dist/index.js` instead — see
13
+ * scripts/tailwindEntry.ts). Keep anything path-relative out of this file:
14
+ * it is inlined into dist, where `src/` paths do not exist.
15
+ */
16
+ @theme {
17
+ /* raw palette stops (from Joy UI's colors.ts: blue/grey/yellow/red/green) */
18
+ --color-neutral-50: #FBFCFE;
19
+ --color-neutral-100: #F0F4F8;
20
+ --color-neutral-200: #DDE7EE;
21
+ --color-neutral-300: #CDD7E1;
22
+ --color-neutral-400: #9FA6AD;
23
+ --color-neutral-500: #636B74;
24
+ --color-neutral-600: #555E68;
25
+ --color-neutral-700: #32383E;
26
+ --color-neutral-800: #171A1C;
27
+ --color-neutral-900: #0B0D0E;
28
+ --color-primary-50: #EDF5FD;
29
+ --color-primary-100: #E3EFFB;
30
+ --color-primary-200: #C7DFF7;
31
+ --color-primary-300: #97C3F0;
32
+ --color-primary-400: #4393E4;
33
+ --color-primary-500: #0B6BCB;
34
+ --color-primary-600: #185EA5;
35
+ --color-primary-700: #12467B;
36
+ --color-primary-800: #0A2744;
37
+ --color-primary-900: #051423;
38
+ --color-warning-50: #FEFAF6;
39
+ --color-warning-100: #FDF0E1;
40
+ --color-warning-200: #FCE1C2;
41
+ --color-warning-300: #F3C896;
42
+ --color-warning-400: #EA9A3E;
43
+ --color-warning-500: #9A5B13;
44
+ --color-warning-600: #72430D;
45
+ --color-warning-700: #492B08;
46
+ --color-warning-800: #2E1B05;
47
+ --color-warning-900: #1D1002;
48
+ --color-danger-50: #FEF6F6;
49
+ --color-danger-100: #FCE4E4;
50
+ --color-danger-200: #F7C5C5;
51
+ --color-danger-300: #F09898;
52
+ --color-danger-400: #E47474;
53
+ --color-danger-500: #C41C1C;
54
+ --color-danger-600: #A51818;
55
+ --color-danger-700: #7D1212;
56
+ --color-danger-800: #430A0A;
57
+ --color-danger-900: #240505;
58
+ --color-success-50: #F6FEF6;
59
+ --color-success-100: #E3FBE3;
60
+ --color-success-200: #C7F7C7;
61
+ --color-success-300: #A1E8A1;
62
+ --color-success-400: #51BC51;
63
+ --color-success-500: #1F7A1F;
64
+ --color-success-600: #136C13;
65
+ --color-success-700: #0A470A;
66
+ --color-success-800: #042F04;
67
+ --color-success-900: #021D02;
68
+ --color-common-white: #FFFFFF;
69
+ --color-common-black: #000000;
70
+
71
+ /* per-variant semantic tokens (light mode default) */
72
+ --color-primary-plain-color: var(--color-primary-500);
73
+ --color-primary-plain-hover-bg: var(--color-primary-100);
74
+ --color-primary-plain-active-bg: var(--color-primary-200);
75
+ --color-primary-plain-disabled-color: var(--color-neutral-400);
76
+ --color-primary-outlined-color: var(--color-primary-500);
77
+ --color-primary-outlined-border: var(--color-primary-300);
78
+ --color-primary-outlined-hover-bg: var(--color-primary-100);
79
+ --color-primary-outlined-active-bg: var(--color-primary-200);
80
+ --color-primary-outlined-disabled-color: var(--color-neutral-400);
81
+ --color-primary-outlined-disabled-border: var(--color-neutral-200);
82
+ --color-primary-soft-color: var(--color-primary-700);
83
+ --color-primary-soft-bg: var(--color-primary-100);
84
+ --color-primary-soft-hover-bg: var(--color-primary-200);
85
+ --color-primary-soft-active-color: var(--color-primary-800);
86
+ --color-primary-soft-active-bg: var(--color-primary-300);
87
+ --color-primary-soft-disabled-color: var(--color-neutral-400);
88
+ --color-primary-soft-disabled-bg: var(--color-neutral-50);
89
+ --color-primary-solid-color: var(--color-common-white);
90
+ --color-primary-solid-bg: var(--color-primary-500);
91
+ --color-primary-solid-hover-bg: var(--color-primary-600);
92
+ --color-primary-solid-active-bg: var(--color-primary-700);
93
+ --color-primary-solid-disabled-color: var(--color-neutral-400);
94
+ --color-primary-solid-disabled-bg: var(--color-neutral-100);
95
+ /* Joy UI overrides plainColor/outlinedColor to neutral-700 specifically for
96
+ the neutral color (light mode) — every other color keeps the generic
97
+ -500 from createLightModeVariantVariables. Confirmed against @mui/joy's
98
+ extendTheme.ts and caught by Button.visual.test.tsx. */
99
+ --color-neutral-plain-color: var(--color-neutral-700);
100
+ --color-neutral-plain-hover-bg: var(--color-neutral-100);
101
+ /* Joy's extendTheme.js gives only neutral a plainHoverColor (900 light, 300
102
+ dark); found 2026-10-02 by ToggleButtonGroup's hover test. */
103
+ --color-neutral-plain-hover-color: var(--color-neutral-900);
104
+ --color-neutral-plain-active-bg: var(--color-neutral-200);
105
+ --color-neutral-plain-disabled-color: var(--color-neutral-400);
106
+ --color-neutral-outlined-color: var(--color-neutral-700);
107
+ --color-neutral-outlined-border: var(--color-neutral-300);
108
+ --color-neutral-outlined-hover-bg: var(--color-neutral-100);
109
+ --color-neutral-outlined-active-bg: var(--color-neutral-200);
110
+ --color-neutral-outlined-disabled-color: var(--color-neutral-400);
111
+ --color-neutral-outlined-disabled-border: var(--color-neutral-200);
112
+ --color-neutral-soft-color: var(--color-neutral-700);
113
+ --color-neutral-soft-bg: var(--color-neutral-100);
114
+ --color-neutral-soft-hover-bg: var(--color-neutral-200);
115
+ --color-neutral-soft-active-color: var(--color-neutral-800);
116
+ --color-neutral-soft-active-bg: var(--color-neutral-300);
117
+ --color-neutral-soft-disabled-color: var(--color-neutral-400);
118
+ --color-neutral-soft-disabled-bg: var(--color-neutral-50);
119
+ --color-neutral-solid-color: var(--color-common-white);
120
+ --color-neutral-solid-bg: var(--color-neutral-500);
121
+ --color-neutral-solid-hover-bg: var(--color-neutral-600);
122
+ --color-neutral-solid-active-bg: var(--color-neutral-700);
123
+ --color-neutral-solid-disabled-color: var(--color-neutral-400);
124
+ --color-neutral-solid-disabled-bg: var(--color-neutral-100);
125
+ --color-danger-plain-color: var(--color-danger-500);
126
+ --color-danger-plain-hover-bg: var(--color-danger-100);
127
+ --color-danger-plain-active-bg: var(--color-danger-200);
128
+ --color-danger-plain-disabled-color: var(--color-neutral-400);
129
+ --color-danger-outlined-color: var(--color-danger-500);
130
+ --color-danger-outlined-border: var(--color-danger-300);
131
+ --color-danger-outlined-hover-bg: var(--color-danger-100);
132
+ --color-danger-outlined-active-bg: var(--color-danger-200);
133
+ --color-danger-outlined-disabled-color: var(--color-neutral-400);
134
+ --color-danger-outlined-disabled-border: var(--color-neutral-200);
135
+ --color-danger-soft-color: var(--color-danger-700);
136
+ --color-danger-soft-bg: var(--color-danger-100);
137
+ --color-danger-soft-hover-bg: var(--color-danger-200);
138
+ --color-danger-soft-active-color: var(--color-danger-800);
139
+ --color-danger-soft-active-bg: var(--color-danger-300);
140
+ --color-danger-soft-disabled-color: var(--color-neutral-400);
141
+ --color-danger-soft-disabled-bg: var(--color-neutral-50);
142
+ --color-danger-solid-color: var(--color-common-white);
143
+ --color-danger-solid-bg: var(--color-danger-500);
144
+ --color-danger-solid-hover-bg: var(--color-danger-600);
145
+ --color-danger-solid-active-bg: var(--color-danger-700);
146
+ --color-danger-solid-disabled-color: var(--color-neutral-400);
147
+ --color-danger-solid-disabled-bg: var(--color-neutral-100);
148
+ --color-success-plain-color: var(--color-success-500);
149
+ --color-success-plain-hover-bg: var(--color-success-100);
150
+ --color-success-plain-active-bg: var(--color-success-200);
151
+ --color-success-plain-disabled-color: var(--color-neutral-400);
152
+ --color-success-outlined-color: var(--color-success-500);
153
+ --color-success-outlined-border: var(--color-success-300);
154
+ --color-success-outlined-hover-bg: var(--color-success-100);
155
+ --color-success-outlined-active-bg: var(--color-success-200);
156
+ --color-success-outlined-disabled-color: var(--color-neutral-400);
157
+ --color-success-outlined-disabled-border: var(--color-neutral-200);
158
+ --color-success-soft-color: var(--color-success-700);
159
+ --color-success-soft-bg: var(--color-success-100);
160
+ --color-success-soft-hover-bg: var(--color-success-200);
161
+ --color-success-soft-active-color: var(--color-success-800);
162
+ --color-success-soft-active-bg: var(--color-success-300);
163
+ --color-success-soft-disabled-color: var(--color-neutral-400);
164
+ --color-success-soft-disabled-bg: var(--color-neutral-50);
165
+ --color-success-solid-color: var(--color-common-white);
166
+ --color-success-solid-bg: var(--color-success-500);
167
+ --color-success-solid-hover-bg: var(--color-success-600);
168
+ --color-success-solid-active-bg: var(--color-success-700);
169
+ --color-success-solid-disabled-color: var(--color-neutral-400);
170
+ --color-success-solid-disabled-bg: var(--color-neutral-100);
171
+ --color-warning-plain-color: var(--color-warning-500);
172
+ --color-warning-plain-hover-bg: var(--color-warning-100);
173
+ --color-warning-plain-active-bg: var(--color-warning-200);
174
+ --color-warning-plain-disabled-color: var(--color-neutral-400);
175
+ --color-warning-outlined-color: var(--color-warning-500);
176
+ --color-warning-outlined-border: var(--color-warning-300);
177
+ --color-warning-outlined-hover-bg: var(--color-warning-100);
178
+ --color-warning-outlined-active-bg: var(--color-warning-200);
179
+ --color-warning-outlined-disabled-color: var(--color-neutral-400);
180
+ --color-warning-outlined-disabled-border: var(--color-neutral-200);
181
+ --color-warning-soft-color: var(--color-warning-700);
182
+ --color-warning-soft-bg: var(--color-warning-100);
183
+ --color-warning-soft-hover-bg: var(--color-warning-200);
184
+ --color-warning-soft-active-color: var(--color-warning-800);
185
+ --color-warning-soft-active-bg: var(--color-warning-300);
186
+ --color-warning-soft-disabled-color: var(--color-neutral-400);
187
+ --color-warning-soft-disabled-bg: var(--color-neutral-50);
188
+ --color-warning-solid-color: var(--color-common-white);
189
+ --color-warning-solid-bg: var(--color-warning-500);
190
+ --color-warning-solid-hover-bg: var(--color-warning-600);
191
+ --color-warning-solid-active-bg: var(--color-warning-700);
192
+ --color-warning-solid-disabled-color: var(--color-neutral-400);
193
+ --color-warning-solid-disabled-bg: var(--color-neutral-100);
194
+
195
+ /* text + surface tokens (light mode default) */
196
+ --color-ink-primary: var(--color-neutral-800);
197
+ --color-ink-secondary: var(--color-neutral-700);
198
+ --color-ink-tertiary: var(--color-neutral-600);
199
+ --color-ink-icon: var(--color-neutral-500);
200
+ --color-canvas: var(--color-common-white);
201
+ --color-surface: var(--color-neutral-50);
202
+ --color-surface-popup: var(--color-common-white);
203
+ --color-surface-1: var(--color-neutral-100);
204
+ --color-surface-2: var(--color-neutral-200);
205
+ --color-surface-3: var(--color-neutral-300);
206
+ --color-divider: rgba(99, 107, 116, 0.2);
207
+
208
+ /* Joy's `mainChannel` — the palette step a component reaches for when it
209
+ wants "the" colour rather than a variant slot. Joy remaps it per scheme
210
+ in extendTheme.js:393-403:
211
+
212
+ const channelMapping = { main: '500', light: '200', dark: '700' };
213
+ if (supportedColorScheme === 'dark') { channelMapping.main = 400; }
214
+
215
+ so it is step 500 in light and step 400 in dark. Added 2026-09-07: this
216
+ project had no `main` token at all, so components reaching for it
217
+ hardcoded `-500` and never changed in dark mode. That is what made
218
+ `Link` (which Joy's Link.js:120 resolves from `palette[color]
219
+ .mainChannel`, not from `plainColor`) and `Divider` render their light
220
+ colour on a dark page. */
221
+ --color-primary-main: var(--color-primary-500);
222
+ --color-neutral-main: var(--color-neutral-500);
223
+ --color-danger-main: var(--color-danger-500);
224
+ --color-success-main: var(--color-success-500);
225
+ --color-warning-main: var(--color-warning-500);
226
+
227
+ --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
228
+
229
+ /* radius scale (Joy UI defaultTheme.radius) */
230
+ --radius-xs: 2px;
231
+ --radius-sm: 6px;
232
+ --radius-md: 8px;
233
+ --radius-lg: 12px;
234
+ --radius-xl: 16px;
235
+
236
+ /* shadow.xs/md/lg (Joy UI defaultTheme.shadow, light mode: shadowChannel
237
+ '21 21 21' / shadowOpacity 0.08). Joy's real formula prefixes every
238
+ shadow level with a `shadowRing` layer (`0 0 #000`) — a zero-blur,
239
+ zero-spread shadow that renders as nothing visible, so it's dropped
240
+ here rather than carried as a dead layer. Confirmed against
241
+ @mui/joy's extendTheme.js source. */
242
+ --shadow-xs: 0px 1px 2px 0px rgba(21, 21, 21, 0.08);
243
+ --shadow-md: 0px 2px 8px -2px rgba(21, 21, 21, 0.08), 0px 6px 12px -2px rgba(21, 21, 21, 0.08);
244
+ --shadow-lg: 0px 2px 8px -2px rgba(21, 21, 21, 0.08), 0px 12px 16px -4px rgba(21, 21, 21, 0.08);
245
+
246
+ /* AnimatedMapImage's entrance: the whole frame irises open from center
247
+ (map-reveal) while a pin drops onto the coordinate and an ink ring
248
+ ripples out from under it. Not color-scheme dependent, so registered
249
+ once here rather than duplicated in the dark-mode block below. */
250
+ --animate-map-reveal: hintoric-map-reveal 700ms cubic-bezier(0.16, 1, 0.3, 1) both;
251
+ --animate-pin-drop: hintoric-pin-drop 550ms 400ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
252
+ --animate-ink-ripple: hintoric-ink-ripple 900ms 400ms ease-out both;
253
+ }
254
+
255
+ [data-color-scheme="dark"] {
256
+ --color-primary-plain-color: var(--color-primary-300);
257
+ --color-primary-plain-hover-bg: var(--color-primary-800);
258
+ --color-primary-plain-active-bg: var(--color-primary-700);
259
+ --color-primary-plain-disabled-color: var(--color-neutral-500);
260
+ --color-primary-outlined-color: var(--color-primary-200);
261
+ --color-primary-outlined-border: var(--color-primary-700);
262
+ --color-primary-outlined-hover-bg: var(--color-primary-800);
263
+ --color-primary-outlined-active-bg: var(--color-primary-700);
264
+ --color-primary-outlined-disabled-color: var(--color-neutral-500);
265
+ --color-primary-outlined-disabled-border: var(--color-neutral-800);
266
+ --color-primary-soft-color: var(--color-primary-200);
267
+ --color-primary-soft-bg: var(--color-primary-800);
268
+ --color-primary-soft-hover-bg: var(--color-primary-700);
269
+ --color-primary-soft-active-color: var(--color-primary-100);
270
+ --color-primary-soft-active-bg: var(--color-primary-600);
271
+ --color-primary-soft-disabled-color: var(--color-neutral-500);
272
+ --color-primary-soft-disabled-bg: var(--color-neutral-800);
273
+ --color-primary-solid-color: var(--color-common-white);
274
+ --color-primary-solid-bg: var(--color-primary-500);
275
+ --color-primary-solid-hover-bg: var(--color-primary-600);
276
+ --color-primary-solid-active-bg: var(--color-primary-700);
277
+ --color-primary-solid-disabled-color: var(--color-neutral-500);
278
+ --color-primary-solid-disabled-bg: var(--color-neutral-800);
279
+ --color-neutral-plain-color: var(--color-neutral-300);
280
+ --color-neutral-plain-hover-bg: var(--color-neutral-800);
281
+ --color-neutral-plain-hover-color: var(--color-neutral-300);
282
+ --color-neutral-plain-active-bg: var(--color-neutral-700);
283
+ --color-neutral-plain-disabled-color: var(--color-neutral-500);
284
+ --color-neutral-outlined-color: var(--color-neutral-200);
285
+ --color-neutral-outlined-border: var(--color-neutral-700);
286
+ --color-neutral-outlined-hover-bg: var(--color-neutral-800);
287
+ --color-neutral-outlined-active-bg: var(--color-neutral-700);
288
+ --color-neutral-outlined-disabled-color: var(--color-neutral-500);
289
+ --color-neutral-outlined-disabled-border: var(--color-neutral-800);
290
+ --color-neutral-soft-color: var(--color-neutral-200);
291
+ --color-neutral-soft-bg: var(--color-neutral-800);
292
+ --color-neutral-soft-hover-bg: var(--color-neutral-700);
293
+ --color-neutral-soft-active-color: var(--color-neutral-100);
294
+ --color-neutral-soft-active-bg: var(--color-neutral-600);
295
+ --color-neutral-soft-disabled-color: var(--color-neutral-500);
296
+ --color-neutral-soft-disabled-bg: var(--color-neutral-800);
297
+ --color-neutral-solid-color: var(--color-common-white);
298
+ --color-neutral-solid-bg: var(--color-neutral-500);
299
+ --color-neutral-solid-hover-bg: var(--color-neutral-600);
300
+ --color-neutral-solid-active-bg: var(--color-neutral-700);
301
+ --color-neutral-solid-disabled-color: var(--color-neutral-500);
302
+ --color-neutral-solid-disabled-bg: var(--color-neutral-800);
303
+ --color-danger-plain-color: var(--color-danger-300);
304
+ --color-danger-plain-hover-bg: var(--color-danger-800);
305
+ --color-danger-plain-active-bg: var(--color-danger-700);
306
+ --color-danger-plain-disabled-color: var(--color-neutral-500);
307
+ --color-danger-outlined-color: var(--color-danger-200);
308
+ --color-danger-outlined-border: var(--color-danger-700);
309
+ --color-danger-outlined-hover-bg: var(--color-danger-800);
310
+ --color-danger-outlined-active-bg: var(--color-danger-700);
311
+ --color-danger-outlined-disabled-color: var(--color-neutral-500);
312
+ --color-danger-outlined-disabled-border: var(--color-neutral-800);
313
+ --color-danger-soft-color: var(--color-danger-200);
314
+ --color-danger-soft-bg: var(--color-danger-800);
315
+ --color-danger-soft-hover-bg: var(--color-danger-700);
316
+ --color-danger-soft-active-color: var(--color-danger-100);
317
+ --color-danger-soft-active-bg: var(--color-danger-600);
318
+ --color-danger-soft-disabled-color: var(--color-neutral-500);
319
+ --color-danger-soft-disabled-bg: var(--color-neutral-800);
320
+ --color-danger-solid-color: var(--color-common-white);
321
+ --color-danger-solid-bg: var(--color-danger-500);
322
+ --color-danger-solid-hover-bg: var(--color-danger-600);
323
+ --color-danger-solid-active-bg: var(--color-danger-700);
324
+ --color-danger-solid-disabled-color: var(--color-neutral-500);
325
+ --color-danger-solid-disabled-bg: var(--color-neutral-800);
326
+ --color-success-plain-color: var(--color-success-300);
327
+ --color-success-plain-hover-bg: var(--color-success-800);
328
+ --color-success-plain-active-bg: var(--color-success-700);
329
+ --color-success-plain-disabled-color: var(--color-neutral-500);
330
+ --color-success-outlined-color: var(--color-success-200);
331
+ --color-success-outlined-border: var(--color-success-700);
332
+ --color-success-outlined-hover-bg: var(--color-success-800);
333
+ --color-success-outlined-active-bg: var(--color-success-700);
334
+ --color-success-outlined-disabled-color: var(--color-neutral-500);
335
+ --color-success-outlined-disabled-border: var(--color-neutral-800);
336
+ --color-success-soft-color: var(--color-success-200);
337
+ --color-success-soft-bg: var(--color-success-800);
338
+ --color-success-soft-hover-bg: var(--color-success-700);
339
+ --color-success-soft-active-color: var(--color-success-100);
340
+ --color-success-soft-active-bg: var(--color-success-600);
341
+ --color-success-soft-disabled-color: var(--color-neutral-500);
342
+ --color-success-soft-disabled-bg: var(--color-neutral-800);
343
+ --color-success-solid-color: var(--color-common-white);
344
+ --color-success-solid-bg: var(--color-success-500);
345
+ --color-success-solid-hover-bg: var(--color-success-600);
346
+ --color-success-solid-active-bg: var(--color-success-700);
347
+ --color-success-solid-disabled-color: var(--color-neutral-500);
348
+ --color-success-solid-disabled-bg: var(--color-neutral-800);
349
+ --color-warning-plain-color: var(--color-warning-300);
350
+ --color-warning-plain-hover-bg: var(--color-warning-800);
351
+ --color-warning-plain-active-bg: var(--color-warning-700);
352
+ --color-warning-plain-disabled-color: var(--color-neutral-500);
353
+ --color-warning-outlined-color: var(--color-warning-200);
354
+ --color-warning-outlined-border: var(--color-warning-700);
355
+ --color-warning-outlined-hover-bg: var(--color-warning-800);
356
+ --color-warning-outlined-active-bg: var(--color-warning-700);
357
+ --color-warning-outlined-disabled-color: var(--color-neutral-500);
358
+ --color-warning-outlined-disabled-border: var(--color-neutral-800);
359
+ --color-warning-soft-color: var(--color-warning-200);
360
+ --color-warning-soft-bg: var(--color-warning-800);
361
+ --color-warning-soft-hover-bg: var(--color-warning-700);
362
+ --color-warning-soft-active-color: var(--color-warning-100);
363
+ --color-warning-soft-active-bg: var(--color-warning-600);
364
+ --color-warning-soft-disabled-color: var(--color-neutral-500);
365
+ --color-warning-soft-disabled-bg: var(--color-neutral-800);
366
+ --color-warning-solid-color: var(--color-common-white);
367
+ --color-warning-solid-bg: var(--color-warning-500);
368
+ --color-warning-solid-hover-bg: var(--color-warning-600);
369
+ --color-warning-solid-active-bg: var(--color-warning-700);
370
+ --color-warning-solid-disabled-color: var(--color-neutral-500);
371
+ --color-warning-solid-disabled-bg: var(--color-neutral-800);
372
+
373
+ --color-ink-primary: var(--color-neutral-100);
374
+ --color-ink-secondary: var(--color-neutral-300);
375
+ --color-ink-tertiary: var(--color-neutral-400);
376
+ --color-ink-icon: var(--color-neutral-400);
377
+ --color-canvas: var(--color-common-black);
378
+ --color-surface: var(--color-neutral-900);
379
+ --color-surface-popup: var(--color-common-black);
380
+ --color-surface-1: var(--color-neutral-800);
381
+ --color-surface-2: var(--color-neutral-700);
382
+ --color-surface-3: var(--color-neutral-600);
383
+ /* neutral-400's channel, not neutral-500's: Joy's divider resolves from
384
+ `neutral.mainChannel`, which is step 400 in dark (see the note on
385
+ --color-*-main above). The 0.16 opacity here was already correct — only
386
+ the channel had been carried over from light, so the divider stayed too
387
+ dark against a dark surface. Measured against real @mui/joy: it renders
388
+ rgba(159, 166, 173, 0.16). */
389
+ --color-divider: rgba(159, 166, 173, 0.16);
390
+
391
+ --color-primary-main: var(--color-primary-400);
392
+ --color-neutral-main: var(--color-neutral-400);
393
+ --color-danger-main: var(--color-danger-400);
394
+ --color-success-main: var(--color-success-400);
395
+ --color-warning-main: var(--color-warning-400);
396
+
397
+ /* shadow.xs/md/lg (Joy UI defaultTheme.shadow, dark mode: shadowChannel
398
+ '0 0 0' / shadowOpacity 0.6). See the light-mode block's comment for
399
+ why the `shadowRing` layer is dropped. */
400
+ --shadow-xs: 0px 1px 2px 0px rgba(0, 0, 0, 0.6);
401
+ --shadow-md: 0px 2px 8px -2px rgba(0, 0, 0, 0.6), 0px 6px 12px -2px rgba(0, 0, 0, 0.6);
402
+ --shadow-lg: 0px 2px 8px -2px rgba(0, 0, 0, 0.6), 0px 12px 16px -4px rgba(0, 0, 0, 0.6);
403
+ }
404
+
405
+ /* AnimatedMapImage entrance keyframes — see the --animate-* registrations
406
+ above. 150% on the circle radius comfortably reaches every corner for any
407
+ realistic width/height combination (circle()'s percentage basis is the
408
+ box's corner distance, so 100% alone can undershoot on wide/tall boxes). */
409
+ @keyframes hintoric-map-reveal {
410
+ from {
411
+ clip-path: circle(0% at 50% 50%);
412
+ }
413
+ to {
414
+ clip-path: circle(150% at 50% 50%);
415
+ }
416
+ }
417
+
418
+ @keyframes hintoric-pin-drop {
419
+ 0% {
420
+ transform: translateY(-14px) scale(0.4);
421
+ opacity: 0;
422
+ }
423
+ 60% {
424
+ transform: translateY(2px) scale(1.15);
425
+ opacity: 1;
426
+ }
427
+ 100% {
428
+ transform: translateY(0) scale(1);
429
+ opacity: 1;
430
+ }
431
+ }
432
+
433
+ @keyframes hintoric-ink-ripple {
434
+ 0% {
435
+ transform: scale(0.3);
436
+ opacity: 0.5;
437
+ }
438
+ 100% {
439
+ transform: scale(2.4);
440
+ opacity: 0;
441
+ }
442
+ }
443
+
444
+ /*
445
+ * Tailwind's stock `dark:` keys off `prefers-color-scheme`, which contradicts
446
+ * ColorSchemeProvider the moment a user overrides their OS setting. Point it
447
+ * at the same attribute our tokens use. Our own components never write `dark:`
448
+ * (they read tokens instead) — this exists entirely for consumers' markup.
449
+ */
450
+ @custom-variant dark (&:where([data-color-scheme="dark"], [data-color-scheme="dark"] *));
451
+
452
+ /*
453
+ * `canvas`/`surface*`/`ink-*`/`divider` are public, page-layout tokens meant
454
+ * for consumers to use directly in their own markup (e.g. `bg-canvas` on a
455
+ * page root) — not just internally by Phase 1 components. No component's own
456
+ * source literally contains most of these class names, so Tailwind's content
457
+ * scan never finds them and never generates their CSS. Force-generate them
458
+ * explicitly.
459
+ */
460
+ @source inline("{bg,text,border}-{canvas,surface,surface-1,surface-2,surface-3,surface-popup}");
461
+ @source inline("{bg,border}-divider");
462
+
463
+ @source "./index.js";
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ export interface ReducedMotionProviderProps {
3
+ children: React.ReactNode;
4
+ /** The app-owned reduced-motion preference. */
5
+ reducedMotion: boolean;
6
+ }
7
+ export declare function ReducedMotionProvider({ children, reducedMotion }: ReducedMotionProviderProps): React.JSX.Element;
8
+ export declare function useReducedMotion(): boolean;
9
+ //# sourceMappingURL=ReducedMotionProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReducedMotionProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ReducedMotionProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+CAA+C;IAC/C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,0BAA0B,qBAI5F;AAkBD,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C"}
@@ -1,3 +1,3 @@
1
- /** Same useSyncExternalStore approach as ColorSchemeProvider's system-scheme detection. */
1
+ /** Package-internal compatibility name. Prefer useReducedMotion for public reads. */
2
2
  export declare function usePrefersReducedMotion(): boolean;
3
3
  //# sourceMappingURL=usePrefersReducedMotion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePrefersReducedMotion.d.ts","sourceRoot":"","sources":["../../src/utils/usePrefersReducedMotion.ts"],"names":[],"mappings":"AAkBA,2FAA2F;AAC3F,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
1
+ {"version":3,"file":"usePrefersReducedMotion.d.ts","sourceRoot":"","sources":["../../src/utils/usePrefersReducedMotion.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hintoric/ui",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Joy UI's look and API, built on Base UI and Tailwind CSS.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -25,7 +25,8 @@
25
25
  "types": "./dist/index.d.ts",
26
26
  "import": "./dist/index.js"
27
27
  },
28
- "./styles.css": "./dist/style.css"
28
+ "./styles.css": "./dist/style.css",
29
+ "./tailwind.css": "./dist/tailwind.css"
29
30
  },
30
31
  "publishConfig": {
31
32
  "access": "public"
@@ -34,8 +35,14 @@
34
35
  "react": "^18.3.0 || ^19.0.0",
35
36
  "react-dom": "^18.3.0 || ^19.0.0",
36
37
  "react-hook-form": "^7.54.0",
38
+ "tailwindcss": "^4.1.0",
37
39
  "zod": "^4.0.0"
38
40
  },
41
+ "peerDependenciesMeta": {
42
+ "tailwindcss": {
43
+ "optional": true
44
+ }
45
+ },
39
46
  "dependencies": {
40
47
  "@base-ui/react": "^1.7.0",
41
48
  "@hookform/resolvers": "^5.9.1",
@@ -50,6 +57,8 @@
50
57
  "@emotion/react": "^11.14.0",
51
58
  "@emotion/styled": "^11.14.1",
52
59
  "@mui/joy": "5.0.0-beta.52",
60
+ "@tailwindcss/node": "^4.3.3",
61
+ "@tailwindcss/oxide": "^4.3.3",
53
62
  "@tailwindcss/vite": "^4.3.3",
54
63
  "@testing-library/jest-dom": "^7.0.1",
55
64
  "@testing-library/react": "^16.3.3",