raft-ui 0.0.5 → 0.0.6

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 (110) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/button-CJqMhTPQ.mjs +621 -0
  3. package/dist/index-CpGciYPW.d.mts +267 -0
  4. package/dist/index.d.mts +11 -253
  5. package/dist/index.mjs +32 -587
  6. package/dist/wip.d.mts +133 -15
  7. package/dist/wip.mjs +289 -16
  8. package/package.json +5 -7
  9. package/src/components/alert-dialog/alert-dialog.tsx +215 -0
  10. package/src/components/alert-dialog/index.ts +30 -0
  11. package/src/components/avatar/avatar.tsx +3 -3
  12. package/src/components/avatar/index.ts +2 -2
  13. package/src/components/badge/badge.tsx +2 -2
  14. package/src/components/badge/index.ts +2 -2
  15. package/src/components/banner/banner.tsx +2 -2
  16. package/src/components/banner/index.ts +2 -2
  17. package/src/components/bottom-sheet/bottom-sheet.tsx +3 -3
  18. package/src/components/bottom-sheet/index.ts +2 -2
  19. package/src/components/button/button.tsx +7 -5
  20. package/src/components/button/index.ts +2 -2
  21. package/src/components/checkbox/checkbox-indicator.tsx +2 -2
  22. package/src/components/checkbox/checkbox.tsx +4 -4
  23. package/src/components/checkbox/index.ts +2 -2
  24. package/src/components/combobox/combobox.tsx +4 -4
  25. package/src/components/combobox/index.ts +1 -1
  26. package/src/components/context-menu/context-menu.tsx +4 -4
  27. package/src/components/context-menu/index.ts +2 -2
  28. package/src/components/conversation-preview-card/conversation-preview-card.tsx +2 -2
  29. package/src/components/conversation-preview-card/index.ts +2 -2
  30. package/src/components/description-list/description-list.tsx +2 -2
  31. package/src/components/description-list/index.ts +2 -2
  32. package/src/components/dialog/dialog.tsx +152 -0
  33. package/src/components/dialog/index.ts +26 -0
  34. package/src/components/dropdown-menu/dropdown-menu.tsx +5 -5
  35. package/src/components/dropdown-menu/index.ts +2 -2
  36. package/src/components/empty-state/empty-state.tsx +2 -2
  37. package/src/components/empty-state/index.ts +2 -2
  38. package/src/components/field/field.tsx +4 -4
  39. package/src/components/field/index.ts +2 -2
  40. package/src/components/inline-code/index.ts +2 -2
  41. package/src/components/inline-code/inline-code.tsx +2 -2
  42. package/src/components/input/index.ts +2 -2
  43. package/src/components/input/input.tsx +4 -4
  44. package/src/components/input-group/index.ts +2 -2
  45. package/src/components/input-group/input-group.tsx +5 -5
  46. package/src/components/kbd/index.ts +2 -2
  47. package/src/components/kbd/kbd.tsx +2 -2
  48. package/src/components/label/index.ts +2 -7
  49. package/src/components/label/label.tsx +2 -2
  50. package/src/components/lightbox/index.ts +2 -2
  51. package/src/components/lightbox/lightbox.tsx +3 -3
  52. package/src/components/list-item/index.ts +2 -2
  53. package/src/components/list-item/list-item.tsx +2 -2
  54. package/src/components/media-list-item/index.ts +2 -2
  55. package/src/components/media-list-item/media-list-item.tsx +4 -4
  56. package/src/components/notification-center/index.ts +2 -2
  57. package/src/components/notification-center/notification-center.tsx +5 -5
  58. package/src/components/panel-header/index.ts +2 -2
  59. package/src/components/panel-header/panel-header.tsx +2 -2
  60. package/src/components/popover/index.ts +2 -2
  61. package/src/components/popover/popover.tsx +3 -3
  62. package/src/components/preview-shell/index.ts +2 -2
  63. package/src/components/preview-shell/preview-shell.tsx +2 -2
  64. package/src/components/quoted-message-card/index.ts +2 -2
  65. package/src/components/quoted-message-card/quoted-message-card.tsx +3 -3
  66. package/src/components/radio-group/index.ts +2 -6
  67. package/src/components/radio-group/radio-group.tsx +4 -4
  68. package/src/components/section-header/index.ts +2 -2
  69. package/src/components/section-header/section-header.tsx +2 -2
  70. package/src/components/section-label/index.ts +2 -2
  71. package/src/components/section-label/section-label.tsx +2 -2
  72. package/src/components/segmented-control/index.ts +2 -2
  73. package/src/components/segmented-control/segmented-control.tsx +3 -3
  74. package/src/components/select/index.ts +2 -2
  75. package/src/components/select/select.tsx +4 -4
  76. package/src/components/separator/index.ts +2 -0
  77. package/src/components/separator/separator.tsx +40 -0
  78. package/src/components/spinner/index.ts +2 -2
  79. package/src/components/spinner/spinner.tsx +3 -3
  80. package/src/components/status/index.ts +2 -2
  81. package/src/components/status/status.tsx +2 -2
  82. package/src/components/tabs/index.ts +2 -2
  83. package/src/components/tabs/tabs.tsx +3 -3
  84. package/src/components/text/index.ts +2 -2
  85. package/src/components/text/text.tsx +1 -1
  86. package/src/components/textarea/index.ts +2 -2
  87. package/src/components/textarea/textarea.tsx +3 -3
  88. package/src/components/toggle-group/index.ts +2 -7
  89. package/src/components/toggle-group/toggle-group.tsx +3 -3
  90. package/src/components/tooltip/index.ts +2 -8
  91. package/src/components/tooltip/tooltip.tsx +3 -3
  92. package/src/index.ts +60 -57
  93. package/src/legacy/AvatarListRow.tsx +1 -1
  94. package/src/legacy/Checkbox.tsx +1 -1
  95. package/src/legacy/ConversationPreviewCard.tsx +1 -1
  96. package/src/legacy/DismissBackdrop.tsx +1 -1
  97. package/src/legacy/ExperimentalBadge.tsx +1 -1
  98. package/src/legacy/NotificationCenter.tsx +2 -2
  99. package/src/legacy/PanelHeader.tsx +1 -1
  100. package/src/legacy/QuotedMessageCard.tsx +1 -1
  101. package/src/legacy/SectionHeader.tsx +1 -1
  102. package/src/legacy/Spinner.tsx +1 -1
  103. package/src/legacy/SurfaceListItem.tsx +1 -1
  104. package/src/legacy/selection-popover.tsx +2 -2
  105. package/src/legacy/server-switcher-menu.tsx +2 -2
  106. package/src/lib/theme/theme-provider.tsx +1 -1
  107. package/src/lib/theme/use-theme.ts +1 -1
  108. package/src/wip.ts +82 -24
  109. package/dist/styled-props-B3SNekJg.d.mts +0 -16
  110. package/dist/use-theme-Y_h1DKll.mjs +0 -34
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ ## [0.0.6](https://github.com/botiverse/rui/compare/v0.0.5...v0.0.6) (2026-06-25)
2
+
3
+ ### Features
4
+
5
+ - **alert-dialog:** add destructive confirmation component ([f3507ae](https://github.com/botiverse/rui/commit/f3507ae0d462575ab67d4b814f7c9a3fb4f94547))
6
+ - **dialog:** add dialog component ([e789e11](https://github.com/botiverse/rui/commit/e789e11e11f909ce8195599baa93a75bee0e38be))
7
+ - **separator:** add separator component ([bd098c9](https://github.com/botiverse/rui/commit/bd098c90b352477ec6ac16f84f4ffe7633dba9ce))
8
+
9
+ ### Bug Fixes
10
+
11
+ - **ui:** route wip components through wip entry ([21defb5](https://github.com/botiverse/rui/commit/21defb51ca0595fdcd2269300bd046770a722396))
@@ -0,0 +1,621 @@
1
+ import { Button } from "@base-ui/react/button";
2
+ import { cn } from "cnfast";
3
+ import { tv } from "tailwind-variants/lite";
4
+ import { createContext, use } from "react";
5
+ import { mergeProps } from "@base-ui/react/merge-props";
6
+ import { useRender } from "@base-ui/react/use-render";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/lib/tv.ts
9
+ const tv$1 = ((options) => {
10
+ const recipe = tv(options);
11
+ const wrappedRecipe = ((props) => {
12
+ const result = recipe(props);
13
+ if (typeof result === "string") return cn(result);
14
+ return Object.fromEntries(Object.entries(result).map(([slotName, slot]) => [slotName, (slotProps) => cn(slot(slotProps))]));
15
+ });
16
+ return Object.assign(wrappedRecipe, recipe);
17
+ });
18
+ //#endregion
19
+ //#region src/lib/theme/theme-context.ts
20
+ const ThemeContext = createContext("brutal");
21
+ const ThemeStateContext = createContext({
22
+ theme: "brutal",
23
+ setTheme: () => void 0,
24
+ mode: "light",
25
+ resolvedMode: "light"
26
+ });
27
+ //#endregion
28
+ //#region src/lib/theme/use-theme.ts
29
+ /** Read the active style family for theme-aware component recipes. */
30
+ function useThemeFamily() {
31
+ return use(ThemeContext);
32
+ }
33
+ /** Read and update the application-level RUI theme selection. */
34
+ function useTheme() {
35
+ return use(ThemeStateContext);
36
+ }
37
+ //#endregion
38
+ //#region src/components/spinner/spinner.tsx
39
+ const SPINNER_STYLE = `
40
+ @keyframes raft-braille-spinner {
41
+ 0%,
42
+ 9.99% {
43
+ content: "⠋";
44
+ }
45
+ 10%,
46
+ 19.99% {
47
+ content: "⠙";
48
+ }
49
+ 20%,
50
+ 29.99% {
51
+ content: "⠹";
52
+ }
53
+ 30%,
54
+ 39.99% {
55
+ content: "⠸";
56
+ }
57
+ 40%,
58
+ 49.99% {
59
+ content: "⠼";
60
+ }
61
+ 50%,
62
+ 59.99% {
63
+ content: "⠴";
64
+ }
65
+ 60%,
66
+ 69.99% {
67
+ content: "⠦";
68
+ }
69
+ 70%,
70
+ 79.99% {
71
+ content: "⠧";
72
+ }
73
+ 80%,
74
+ 89.99% {
75
+ content: "⠇";
76
+ }
77
+ 90%,
78
+ 100% {
79
+ content: "⠏";
80
+ }
81
+ }
82
+
83
+ [data-slot="spinner"] [data-spinner-glyph]::before {
84
+ content: "⠋";
85
+ animation: raft-braille-spinner 800ms steps(1, end) infinite;
86
+ }
87
+
88
+ @media (prefers-reduced-motion: reduce) {
89
+ [data-slot="spinner"] [data-spinner-glyph]::before {
90
+ animation-duration: 1600ms;
91
+ }
92
+ }
93
+
94
+ @keyframes raft-elegant-spinner-spin {
95
+ to {
96
+ transform: rotate(360deg);
97
+ }
98
+ }
99
+
100
+ @keyframes raft-elegant-spinner-dash {
101
+ 0% {
102
+ stroke-dasharray: 1 150;
103
+ stroke-dashoffset: 0;
104
+ }
105
+ 50% {
106
+ stroke-dasharray: 90 150;
107
+ stroke-dashoffset: -35;
108
+ }
109
+ 100% {
110
+ stroke-dasharray: 90 150;
111
+ stroke-dashoffset: -124;
112
+ }
113
+ }
114
+
115
+ [data-slot="spinner"] [data-spinner-ring] {
116
+ animation: raft-elegant-spinner-spin 1600ms linear infinite;
117
+ transform-box: fill-box;
118
+ transform-origin: center;
119
+ will-change: transform;
120
+ }
121
+
122
+ [data-slot="spinner"] [data-spinner-arc] {
123
+ animation: raft-elegant-spinner-dash 1400ms cubic-bezier(0.42, 0, 0.58, 1) infinite;
124
+ stroke-dasharray: 1 150;
125
+ stroke-dashoffset: 0;
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ [data-slot="spinner"] [data-spinner-ring] {
130
+ animation-duration: 2400ms;
131
+ will-change: auto;
132
+ }
133
+
134
+ [data-slot="spinner"] [data-spinner-arc] {
135
+ animation: none;
136
+ stroke-dasharray: 72 150;
137
+ stroke-dashoffset: -30;
138
+ }
139
+ }
140
+ `;
141
+ const spinner = tv$1({
142
+ slots: {
143
+ root: ["relative inline-flex shrink-0 items-center justify-center", "leading-none text-current"],
144
+ glyph: "inline-block min-w-[1ch] font-mono tabular-nums",
145
+ ring: "block size-full shrink-0"
146
+ },
147
+ variants: {
148
+ theme: {
149
+ brutal: {},
150
+ elegant: {}
151
+ },
152
+ size: {
153
+ sm: {},
154
+ lg: {}
155
+ }
156
+ },
157
+ defaultVariants: { size: "sm" },
158
+ compoundVariants: [
159
+ {
160
+ theme: "brutal",
161
+ size: "sm",
162
+ class: { root: "h-4 text-base" }
163
+ },
164
+ {
165
+ theme: "brutal",
166
+ size: "lg",
167
+ class: { root: "h-6 text-xl" }
168
+ },
169
+ {
170
+ theme: "elegant",
171
+ size: "sm",
172
+ class: { root: "size-3.5" }
173
+ },
174
+ {
175
+ theme: "elegant",
176
+ size: "lg",
177
+ class: { root: "size-[18px]" }
178
+ }
179
+ ]
180
+ });
181
+ const spinnerStyle = /* @__PURE__ */ jsx("style", {
182
+ href: "raft-ui-spinner",
183
+ precedence: "default",
184
+ children: SPINNER_STYLE
185
+ });
186
+ function Spinner({ size = "sm", className, render, ...props }) {
187
+ const theme = useThemeFamily();
188
+ const { root, glyph, ring } = spinner({
189
+ theme,
190
+ size
191
+ });
192
+ const children = theme === "elegant" ? /* @__PURE__ */ jsxs(Fragment, { children: [spinnerStyle, /* @__PURE__ */ jsxs("svg", {
193
+ "data-spinner-ring": "",
194
+ "aria-hidden": "true",
195
+ className: ring(),
196
+ xmlns: "http://www.w3.org/2000/svg",
197
+ fill: "none",
198
+ viewBox: "0 0 24 24",
199
+ children: [/* @__PURE__ */ jsx("circle", {
200
+ className: "opacity-20",
201
+ cx: "12",
202
+ cy: "12",
203
+ r: "10",
204
+ stroke: "currentColor",
205
+ strokeWidth: "2.5"
206
+ }), /* @__PURE__ */ jsx("circle", {
207
+ "data-spinner-arc": "",
208
+ className: "opacity-80",
209
+ cx: "12",
210
+ cy: "12",
211
+ r: "10",
212
+ fill: "none",
213
+ pathLength: "150",
214
+ stroke: "currentColor",
215
+ strokeLinecap: "round",
216
+ strokeWidth: "2.5"
217
+ })]
218
+ })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [spinnerStyle, /* @__PURE__ */ jsx("span", {
219
+ "data-spinner-glyph": "",
220
+ "aria-hidden": "true",
221
+ className: glyph()
222
+ })] });
223
+ return useRender({
224
+ defaultTagName: "span",
225
+ render,
226
+ props: mergeProps({
227
+ role: "status",
228
+ "aria-label": "Loading",
229
+ className: root({ className }),
230
+ children
231
+ }, props),
232
+ state: {
233
+ slot: "spinner",
234
+ size
235
+ }
236
+ });
237
+ }
238
+ //#endregion
239
+ //#region src/components/button/button.tsx
240
+ const buttonVariants = tv$1({
241
+ slots: {
242
+ root: [
243
+ "relative inline-flex shrink-0 items-center justify-center",
244
+ "font-heading leading-none whitespace-nowrap select-none",
245
+ "border-line rounded-none",
246
+ "shadow-sm transition-all duration-100",
247
+ "outline outline-[1px] outline-offset-2 outline-transparent",
248
+ "data-[loading=true]:cursor-wait",
249
+ "disabled:pointer-events-none disabled:opacity-40 data-[loading=true]:opacity-100",
250
+ "disabled:transform-none",
251
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
252
+ ],
253
+ content: "relative z-10 inline-flex items-center justify-center gap-[inherit] data-[loading=true]:invisible",
254
+ loadingIndicator: "pointer-events-none absolute inset-0 z-10 flex items-center justify-center"
255
+ },
256
+ variants: {
257
+ theme: {
258
+ brutal: { root: ["border-2 font-bold focus-visible:outline-transparent"] },
259
+ elegant: { root: [
260
+ "overflow-clip border-0 font-sans font-medium antialiased",
261
+ "focus-visible:outline-[var(--button-focus-outline,transparent)]",
262
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.05),0_0_0_1px_var(--line-subtle)]",
263
+ "before:pointer-events-none before:absolute before:inset-0 before:z-0 before:rounded-[inherit]",
264
+ "active:not-aria-[haspopup]:scale-[0.985]"
265
+ ] }
266
+ },
267
+ variant: {
268
+ primary: { root: ["border-line-strong bg-primary-400 text-primary-950", "hover:bg-primary-500"] },
269
+ default: { root: ["border-line-strong bg-layer-panel text-foreground-strong", "hover:bg-layer-panel"] },
270
+ information: { root: ["border-line-strong bg-info-base text-foreground-inverse", "hover:bg-info-base"] },
271
+ muted: { root: ["border-line-strong bg-secondary-400 text-secondary-950", "hover:border-line-strong hover:bg-secondary-400"] },
272
+ accent: { root: ["border-line-strong bg-accent-400 text-accent-950", "hover:bg-accent-500"] },
273
+ warning: { root: ["border-line-strong bg-warning-base text-foreground-inverse", "hover:bg-warning-base"] },
274
+ outline: { root: [
275
+ "border-line-strong bg-transparent text-foreground-strong",
276
+ "hover:bg-layer-muted",
277
+ "shadow-none"
278
+ ] },
279
+ ghost: { root: ["border-transparent bg-transparent text-foreground shadow-none", "hover:border-line-strong hover:bg-layer-muted"] },
280
+ link: { root: ["border-transparent bg-transparent text-foreground-strong shadow-none underline-offset-4", "hover:underline"] },
281
+ "danger-secondary": { root: ["border-line-strong bg-danger-lighter text-danger-base", "hover:bg-danger-lighter"] },
282
+ danger: { root: ["border-line-strong bg-danger-base text-foreground-inverse", "hover:border-[oklch(0.595_0.241_26.758)] hover:bg-[oklch(0.595_0.241_26.758)]"] },
283
+ "danger-outline": { root: [
284
+ "border-line-strong bg-transparent text-danger-base",
285
+ "hover:bg-layer-muted",
286
+ "shadow-none"
287
+ ] }
288
+ },
289
+ size: {
290
+ xs: { root: [
291
+ "gap-1 px-2 py-[5px] text-[11px]",
292
+ "has-data-[icon=inline-start]:pl-1.5 has-data-[icon=inline-end]:pr-1.5",
293
+ "[&_svg:not([class*='size-'])]:size-3"
294
+ ] },
295
+ sm: { root: [
296
+ "gap-1.5 px-2.5 py-[6px] text-xs",
297
+ "has-data-[icon=inline-start]:pl-2 has-data-[icon=inline-end]:pr-2",
298
+ "[&_svg:not([class*='size-'])]:size-3.5"
299
+ ] },
300
+ md: { root: ["gap-2 px-3 py-2 text-sm", "has-data-[icon=inline-start]:pl-2.5 has-data-[icon=inline-end]:pr-2.5"] },
301
+ lg: { root: [
302
+ "gap-2 px-3.5 py-2.5 text-base",
303
+ "has-data-[icon=inline-start]:pl-3 has-data-[icon=inline-end]:pr-3",
304
+ "[&_svg:not([class*='size-'])]:size-4"
305
+ ] },
306
+ "icon-xs": { root: ["p-[5px] text-[11px]", "[&_svg:not([class*='size-'])]:size-3"] },
307
+ "icon-sm": { root: ["p-[6px] text-xs", "[&_svg:not([class*='size-'])]:size-3.5"] },
308
+ "icon-md": { root: ["p-2 text-sm", "[&_svg:not([class*='size-'])]:size-4"] },
309
+ "icon-lg": { root: ["p-3 text-sm", "[&_svg:not([class*='size-'])]:size-4"] }
310
+ }
311
+ },
312
+ defaultVariants: {
313
+ variant: "default",
314
+ size: "md"
315
+ },
316
+ compoundVariants: [
317
+ {
318
+ theme: "elegant",
319
+ size: ["xs", "icon-xs"],
320
+ class: { root: "rounded-sm" }
321
+ },
322
+ {
323
+ theme: "elegant",
324
+ size: ["sm", "icon-sm"],
325
+ class: { root: "rounded" }
326
+ },
327
+ {
328
+ theme: "elegant",
329
+ size: ["md", "icon-md"],
330
+ class: { root: "rounded-md" }
331
+ },
332
+ {
333
+ theme: "elegant",
334
+ size: ["lg", "icon-lg"],
335
+ class: { root: "rounded-md" }
336
+ },
337
+ {
338
+ theme: "brutal",
339
+ variant: "primary",
340
+ class: { root: "bg-brutal-yellow text-black hover:bg-brutal-yellow" }
341
+ },
342
+ {
343
+ theme: "brutal",
344
+ variant: "default",
345
+ class: { root: "bg-white text-black hover:bg-white" }
346
+ },
347
+ {
348
+ theme: "brutal",
349
+ variant: "outline",
350
+ class: { root: "bg-white text-black shadow-sm hover:bg-white" }
351
+ },
352
+ {
353
+ theme: "brutal",
354
+ variant: "information",
355
+ class: { root: "bg-brutal-cyan text-black hover:bg-brutal-cyan" }
356
+ },
357
+ {
358
+ theme: "brutal",
359
+ variant: "muted",
360
+ class: { root: "bg-brutal-stone text-black hover:bg-brutal-stone" }
361
+ },
362
+ {
363
+ theme: "brutal",
364
+ variant: "accent",
365
+ class: { root: "bg-brutal-pink text-black hover:bg-brutal-pink" }
366
+ },
367
+ {
368
+ theme: "brutal",
369
+ variant: "danger",
370
+ class: { root: "bg-brutal-red text-black hover:bg-brutal-red" }
371
+ },
372
+ {
373
+ theme: "brutal",
374
+ variant: "warning",
375
+ class: { root: "bg-[oklch(0.785_0.123_50.11)] text-black hover:bg-[oklch(0.785_0.123_50.11)]" }
376
+ },
377
+ {
378
+ theme: "brutal",
379
+ size: "xs",
380
+ class: { root: "h-6 px-2 py-0 text-[11px]" }
381
+ },
382
+ {
383
+ theme: "brutal",
384
+ size: "sm",
385
+ class: { root: "h-7 px-2.5 py-0 text-xs" }
386
+ },
387
+ {
388
+ theme: "brutal",
389
+ size: "md",
390
+ class: { root: "h-8 px-3 py-0 text-sm" }
391
+ },
392
+ {
393
+ theme: "brutal",
394
+ size: "lg",
395
+ class: { root: "h-10 px-4 py-0 text-sm" }
396
+ },
397
+ {
398
+ theme: "brutal",
399
+ size: "icon-xs",
400
+ class: { root: "size-6 p-0 text-[11px]" }
401
+ },
402
+ {
403
+ theme: "brutal",
404
+ size: "icon-sm",
405
+ class: { root: "size-7 p-0 text-xs" }
406
+ },
407
+ {
408
+ theme: "brutal",
409
+ size: "icon-md",
410
+ class: { root: "size-8 p-0 text-sm" }
411
+ },
412
+ {
413
+ theme: "brutal",
414
+ size: "icon-lg",
415
+ class: { root: "size-10 p-0 text-sm" }
416
+ },
417
+ {
418
+ theme: "elegant",
419
+ variant: "default",
420
+ class: { root: [
421
+ "bg-foreground-strong text-foreground-inverse",
422
+ "[--button-focus-outline:var(--foreground-strong)]",
423
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.12),0_0_0_1px_var(--foreground-strong)]",
424
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_8%)_0%,oklab(0%_0_0_/_0%)_100%)]",
425
+ "hover:bg-[oklch(0.31_0.006_285)]"
426
+ ] }
427
+ },
428
+ {
429
+ theme: "elegant",
430
+ variant: "primary",
431
+ class: { root: [
432
+ "bg-primary-400 text-primary-950",
433
+ "[--button-focus-outline:var(--primary-400)]",
434
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.15),0_0_0_1px_oklch(0.83_0.14_91.89_/_0.83)]",
435
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_11%)_0%,oklab(100%_0_0_/_0%)_0%,oklab(0%_0_0_/_0%)_100%)]",
436
+ "hover:bg-[oklch(0.86_0.15_91.89)]"
437
+ ] }
438
+ },
439
+ {
440
+ theme: "elegant",
441
+ variant: "outline",
442
+ class: { root: [
443
+ "bg-layer-panel text-foreground-strong",
444
+ "[--button-focus-outline:var(--layer-panel)]",
445
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.05),0_0_0_1px_var(--line-subtle)]",
446
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(0%_0_0_/_0%)_30%,oklab(0%_0_0_/_1%)_100%)]",
447
+ "hover:bg-layer-muted"
448
+ ] }
449
+ },
450
+ {
451
+ theme: "elegant",
452
+ variant: "ghost",
453
+ class: { root: [
454
+ "bg-transparent text-foreground-muted shadow-none",
455
+ "[--button-focus-outline:var(--line-muted)]",
456
+ "before:bg-transparent hover:bg-line-muted"
457
+ ] }
458
+ },
459
+ {
460
+ theme: "elegant",
461
+ variant: "danger-secondary",
462
+ class: { root: [
463
+ "bg-danger-lighter text-danger-base",
464
+ "[--button-focus-outline:var(--state-danger-lighter)]",
465
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.18),0_0_0_1px_var(--state-danger-light)]",
466
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_9%)_0%,oklab(0%_0_0_/_1%)_100%)]",
467
+ "hover:bg-danger-light"
468
+ ] }
469
+ },
470
+ {
471
+ theme: "elegant",
472
+ variant: "danger",
473
+ class: { root: [
474
+ "bg-danger-base text-foreground-inverse",
475
+ "[--button-focus-outline:var(--state-danger-base)]",
476
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.12),0_0_0_1px_var(--state-danger-base)]",
477
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_10%)_0%,oklab(0%_0_0_/_0%)_100%)]",
478
+ "hover:bg-[oklch(0.56_0.23_26.758)]"
479
+ ] }
480
+ },
481
+ {
482
+ theme: "brutal",
483
+ variant: "danger",
484
+ class: { root: [
485
+ "border-line-strong bg-brutal-red text-black",
486
+ "shadow-sm",
487
+ "hover:border-line-strong hover:bg-brutal-red",
488
+ "hover:-translate-y-px hover:shadow-md",
489
+ "active:not-aria-[haspopup]:translate-x-px active:not-aria-[haspopup]:translate-y-px",
490
+ "active:shadow-xs"
491
+ ] }
492
+ },
493
+ {
494
+ theme: "brutal",
495
+ variant: "danger-secondary",
496
+ class: { root: [
497
+ "border-line-strong bg-danger-lighter text-[color-mix(in_oklab,var(--state-danger-base)_72%,transparent)]",
498
+ "shadow-sm",
499
+ "hover:border-line-strong hover:bg-danger-lighter",
500
+ "hover:-translate-y-px hover:shadow-md",
501
+ "active:not-aria-[haspopup]:translate-x-px active:not-aria-[haspopup]:translate-y-px",
502
+ "active:shadow-xs"
503
+ ] }
504
+ },
505
+ {
506
+ theme: "elegant",
507
+ variant: "danger-outline",
508
+ class: { root: [
509
+ "bg-layer-panel text-danger-base",
510
+ "[--button-focus-outline:var(--layer-panel)]",
511
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.05),0_0_0_1px_var(--state-danger-light)]",
512
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(0%_0_0_/_0%)_30%,oklab(0%_0_0_/_1%)_100%)]",
513
+ "hover:bg-danger-lighter"
514
+ ] }
515
+ },
516
+ {
517
+ theme: "elegant",
518
+ variant: "accent",
519
+ class: { root: [
520
+ "bg-accent-400 text-white",
521
+ "[--button-focus-outline:var(--accent-400)]",
522
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.12),0_0_0_1px_var(--accent-400)]",
523
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_8%)_0%,oklab(0%_0_0_/_0%)_100%)]",
524
+ "hover:bg-[oklch(0.72_0.15_0.71)]"
525
+ ] }
526
+ },
527
+ {
528
+ theme: "elegant",
529
+ variant: "warning",
530
+ class: { root: [
531
+ "bg-warning-base text-foreground-inverse",
532
+ "[--button-focus-outline:var(--state-warning-base)]",
533
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.14),0_0_0_1px_var(--state-warning-base)]",
534
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_10%)_0%,oklab(0%_0_0_/_0%)_100%)]",
535
+ "hover:bg-[oklch(0.65_0.19_44.441)]"
536
+ ] }
537
+ },
538
+ {
539
+ theme: "elegant",
540
+ variant: "link",
541
+ class: { root: [
542
+ "bg-transparent text-foreground-muted shadow-none",
543
+ "[--button-focus-outline:transparent]",
544
+ "before:bg-transparent hover:bg-transparent hover:text-foreground-muted"
545
+ ] }
546
+ },
547
+ {
548
+ theme: "elegant",
549
+ variant: "information",
550
+ class: { root: [
551
+ "bg-info-base text-foreground-inverse",
552
+ "[--button-focus-outline:var(--state-info-base)]",
553
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.12),0_0_0_1px_var(--state-info-base)]",
554
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_8%)_0%,oklab(0%_0_0_/_0%)_100%)]",
555
+ "hover:bg-[oklch(0.74_0.13_219.2)]"
556
+ ] }
557
+ },
558
+ {
559
+ theme: "elegant",
560
+ variant: "muted",
561
+ class: { root: [
562
+ "bg-layer-muted text-foreground-placeholder",
563
+ "[--button-focus-outline:var(--layer-muted)]",
564
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.05),0_0_0_1px_var(--line-subtle)]",
565
+ "before:bg-[linear-gradient(in_oklab_180deg,oklab(100%_0_0_/_5%)_0%,oklab(0%_0_0_/_1%)_100%)]",
566
+ "hover:bg-line-subtle"
567
+ ] }
568
+ },
569
+ {
570
+ theme: "brutal",
571
+ variant: [
572
+ "primary",
573
+ "default",
574
+ "information",
575
+ "muted",
576
+ "accent",
577
+ "warning",
578
+ "outline"
579
+ ],
580
+ class: { root: [
581
+ "hover:-translate-y-px hover:shadow-md",
582
+ "active:not-aria-[haspopup]:translate-x-px active:not-aria-[haspopup]:translate-y-px",
583
+ "active:shadow-xs"
584
+ ] }
585
+ }
586
+ ]
587
+ });
588
+ function defaultNativeButton(render) {
589
+ if (!render || typeof render !== "object" || !("type" in render)) return;
590
+ const element = render;
591
+ if (typeof element.type === "string") return element.type === "button";
592
+ }
593
+ function Button$1({ variant, size, loading = false, loadingLabel = "Loading", disabled, className, children, render, nativeButton, ...props }) {
594
+ const { root, content, loadingIndicator } = buttonVariants({
595
+ theme: useThemeFamily(),
596
+ variant,
597
+ size
598
+ });
599
+ return /* @__PURE__ */ jsxs(Button, {
600
+ ...props,
601
+ render,
602
+ nativeButton: nativeButton ?? defaultNativeButton(render),
603
+ "data-slot": "button",
604
+ className: root({ className }),
605
+ "data-loading": loading ? "true" : void 0,
606
+ disabled: disabled || loading,
607
+ "aria-disabled": loading || void 0,
608
+ children: [loading ? /* @__PURE__ */ jsx("span", {
609
+ "data-slot": "button-loading-indicator",
610
+ className: loadingIndicator(),
611
+ children: /* @__PURE__ */ jsx(Spinner, { "aria-label": loadingLabel })
612
+ }) : null, /* @__PURE__ */ jsx("span", {
613
+ "data-slot": "button-content",
614
+ "data-loading": loading ? "true" : void 0,
615
+ className: content(),
616
+ children
617
+ })]
618
+ });
619
+ }
620
+ //#endregion
621
+ export { useThemeFamily as a, tv$1 as c, useTheme as i, buttonVariants as n, ThemeContext as o, Spinner as r, ThemeStateContext as s, Button$1 as t };