@datatechsolutions/ui 3.6.1 → 3.6.2

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 (131) hide show
  1. package/dist/astrlabe/graph-node.js +8 -5
  2. package/dist/astrlabe/graph-node.mjs +4 -1
  3. package/dist/astrlabe/index.js +115 -114
  4. package/dist/astrlabe/index.mjs +7 -6
  5. package/dist/astrlabe/workflow-canvas.js +7 -6
  6. package/dist/astrlabe/workflow-canvas.mjs +6 -5
  7. package/dist/{chunk-3Z66NXEB.mjs → chunk-2OPBUVTQ.mjs} +3 -3
  8. package/dist/{chunk-3Z66NXEB.mjs.map → chunk-2OPBUVTQ.mjs.map} +1 -1
  9. package/dist/{chunk-4JDJRGAB.mjs → chunk-34XRH2FX.mjs} +5 -4
  10. package/dist/chunk-34XRH2FX.mjs.map +1 -0
  11. package/dist/{chunk-KEWRLEYV.js → chunk-3JZGRXSG.js} +4 -4
  12. package/dist/{chunk-KEWRLEYV.js.map → chunk-3JZGRXSG.js.map} +1 -1
  13. package/dist/{chunk-JQYDJ75Q.mjs → chunk-3VYD7QL2.mjs} +3 -3
  14. package/dist/{chunk-JQYDJ75Q.mjs.map → chunk-3VYD7QL2.mjs.map} +1 -1
  15. package/dist/{chunk-MRRFDIUQ.mjs → chunk-4JRMXHPU.mjs} +5 -4
  16. package/dist/chunk-4JRMXHPU.mjs.map +1 -0
  17. package/dist/{chunk-4OFG6POC.mjs → chunk-5LCWQKGQ.mjs} +207 -1128
  18. package/dist/chunk-5LCWQKGQ.mjs.map +1 -0
  19. package/dist/{chunk-W5YCZOXO.js → chunk-7YK4WXHO.js} +79 -78
  20. package/dist/chunk-7YK4WXHO.js.map +1 -0
  21. package/dist/{chunk-YOJIPZ72.js → chunk-BBLBSDPN.js} +9 -9
  22. package/dist/{chunk-YOJIPZ72.js.map → chunk-BBLBSDPN.js.map} +1 -1
  23. package/dist/chunk-BHOT22QL.js +998 -0
  24. package/dist/chunk-BHOT22QL.js.map +1 -0
  25. package/dist/{chunk-MQNXKBFP.mjs → chunk-C4AJWDFB.mjs} +7 -6
  26. package/dist/chunk-C4AJWDFB.mjs.map +1 -0
  27. package/dist/{chunk-UOABOFKO.mjs → chunk-CBFK4W4C.mjs} +3 -3
  28. package/dist/{chunk-UOABOFKO.mjs.map → chunk-CBFK4W4C.mjs.map} +1 -1
  29. package/dist/{chunk-P5F257N3.js → chunk-CVZXZK2X.js} +35 -34
  30. package/dist/chunk-CVZXZK2X.js.map +1 -0
  31. package/dist/{chunk-IHHGT3LP.mjs → chunk-CYAAL3BY.mjs} +6 -5
  32. package/dist/chunk-CYAAL3BY.mjs.map +1 -0
  33. package/dist/{chunk-LVK7VXW7.js → chunk-DMPBNWJB.js} +37 -36
  34. package/dist/chunk-DMPBNWJB.js.map +1 -0
  35. package/dist/{chunk-ESLKQJQS.mjs → chunk-DXLATMGD.mjs} +6 -5
  36. package/dist/chunk-DXLATMGD.mjs.map +1 -0
  37. package/dist/{chunk-P4YYEM4B.js → chunk-EZQ2D47U.js} +7 -10
  38. package/dist/chunk-EZQ2D47U.js.map +1 -0
  39. package/dist/{chunk-6ZMTJSQF.js → chunk-FUHNEP3Y.js} +164 -163
  40. package/dist/chunk-FUHNEP3Y.js.map +1 -0
  41. package/dist/{chunk-YTE6WCBX.js → chunk-JHN2OUWG.js} +64 -63
  42. package/dist/chunk-JHN2OUWG.js.map +1 -0
  43. package/dist/{chunk-AMYQSPQC.js → chunk-JLECJI7S.js} +18 -17
  44. package/dist/chunk-JLECJI7S.js.map +1 -0
  45. package/dist/{chunk-DRORQGN2.js → chunk-KMNWPC64.js} +40 -39
  46. package/dist/chunk-KMNWPC64.js.map +1 -0
  47. package/dist/{chunk-VUAGVZJM.mjs → chunk-NJ6HH4QP.mjs} +6 -5
  48. package/dist/chunk-NJ6HH4QP.mjs.map +1 -0
  49. package/dist/{chunk-OZNTQROP.mjs → chunk-PLTLRL2V.mjs} +7 -10
  50. package/dist/chunk-PLTLRL2V.mjs.map +1 -0
  51. package/dist/{chunk-5ZAZ2C7A.mjs → chunk-PMMP76MV.mjs} +7 -6
  52. package/dist/chunk-PMMP76MV.mjs.map +1 -0
  53. package/dist/{chunk-NJZIE4EH.js → chunk-QF6WL7XU.js} +6 -5
  54. package/dist/chunk-QF6WL7XU.js.map +1 -0
  55. package/dist/{chunk-QRNFTG6A.js → chunk-QGLGQXJE.js} +4 -4
  56. package/dist/{chunk-QRNFTG6A.js.map → chunk-QGLGQXJE.js.map} +1 -1
  57. package/dist/{chunk-GCYYGSHU.js → chunk-R4EKPXX3.js} +564 -1525
  58. package/dist/chunk-R4EKPXX3.js.map +1 -0
  59. package/dist/{chunk-SQZGQOKU.js → chunk-RWYG7QHP.js} +119 -132
  60. package/dist/chunk-RWYG7QHP.js.map +1 -0
  61. package/dist/{chunk-WBEZATIB.js → chunk-RZ3NDH5S.js} +13 -13
  62. package/dist/{chunk-WBEZATIB.js.map → chunk-RZ3NDH5S.js.map} +1 -1
  63. package/dist/{chunk-HGWVJ3VB.mjs → chunk-SJVKID3E.mjs} +4 -3
  64. package/dist/chunk-SJVKID3E.mjs.map +1 -0
  65. package/dist/{chunk-7LILNZMR.mjs → chunk-TJEZL72T.mjs} +4 -3
  66. package/dist/chunk-TJEZL72T.mjs.map +1 -0
  67. package/dist/{chunk-MUOTTGCX.js → chunk-UDYEUTJC.js} +31 -30
  68. package/dist/chunk-UDYEUTJC.js.map +1 -0
  69. package/dist/{chunk-UGJZ3M4Q.js → chunk-VDLMWOQM.js} +55 -54
  70. package/dist/chunk-VDLMWOQM.js.map +1 -0
  71. package/dist/{chunk-KDFBN2L2.mjs → chunk-VZIUQE7B.mjs} +24 -37
  72. package/dist/chunk-VZIUQE7B.mjs.map +1 -0
  73. package/dist/chunk-WR55H7DH.mjs +934 -0
  74. package/dist/chunk-WR55H7DH.mjs.map +1 -0
  75. package/dist/{chunk-ZYVDDSAC.mjs → chunk-YRXDETBK.mjs} +6 -6
  76. package/dist/{chunk-ZYVDDSAC.mjs.map → chunk-YRXDETBK.mjs.map} +1 -1
  77. package/dist/{chunk-VDLAZR7S.mjs → chunk-ZYRL3WER.mjs} +5 -4
  78. package/dist/chunk-ZYRL3WER.mjs.map +1 -0
  79. package/dist/index.js +826 -825
  80. package/dist/index.mjs +4 -3
  81. package/dist/platform/admin/index.js +13 -12
  82. package/dist/platform/admin/index.mjs +7 -6
  83. package/dist/platform/agents-workspace.js +10 -9
  84. package/dist/platform/agents-workspace.mjs +9 -8
  85. package/dist/platform/app-shell.js +6 -5
  86. package/dist/platform/app-shell.mjs +5 -4
  87. package/dist/platform/auth/index.js +30 -29
  88. package/dist/platform/auth/index.mjs +7 -6
  89. package/dist/platform/billing/index.js +6 -5
  90. package/dist/platform/billing/index.mjs +5 -4
  91. package/dist/platform/impersonation/index.js +6 -5
  92. package/dist/platform/impersonation/index.mjs +5 -4
  93. package/dist/platform/index.js +87 -93
  94. package/dist/platform/index.js.map +1 -1
  95. package/dist/platform/index.mjs +23 -29
  96. package/dist/platform/index.mjs.map +1 -1
  97. package/dist/platform/pages/index.js +210 -209
  98. package/dist/platform/pages/index.js.map +1 -1
  99. package/dist/platform/pages/index.mjs +11 -10
  100. package/dist/platform/pages/index.mjs.map +1 -1
  101. package/dist/platform/settings/index.js +10 -9
  102. package/dist/platform/settings/index.mjs +9 -8
  103. package/dist/platform/workflow-canvas-shell.js +8 -7
  104. package/dist/platform/workflow-canvas-shell.mjs +7 -6
  105. package/package.json +1 -1
  106. package/dist/chunk-4JDJRGAB.mjs.map +0 -1
  107. package/dist/chunk-4OFG6POC.mjs.map +0 -1
  108. package/dist/chunk-5ZAZ2C7A.mjs.map +0 -1
  109. package/dist/chunk-6ZMTJSQF.js.map +0 -1
  110. package/dist/chunk-7LILNZMR.mjs.map +0 -1
  111. package/dist/chunk-AMYQSPQC.js.map +0 -1
  112. package/dist/chunk-DRORQGN2.js.map +0 -1
  113. package/dist/chunk-ESLKQJQS.mjs.map +0 -1
  114. package/dist/chunk-GCYYGSHU.js.map +0 -1
  115. package/dist/chunk-HGWVJ3VB.mjs.map +0 -1
  116. package/dist/chunk-IHHGT3LP.mjs.map +0 -1
  117. package/dist/chunk-KDFBN2L2.mjs.map +0 -1
  118. package/dist/chunk-LVK7VXW7.js.map +0 -1
  119. package/dist/chunk-MQNXKBFP.mjs.map +0 -1
  120. package/dist/chunk-MRRFDIUQ.mjs.map +0 -1
  121. package/dist/chunk-MUOTTGCX.js.map +0 -1
  122. package/dist/chunk-NJZIE4EH.js.map +0 -1
  123. package/dist/chunk-OZNTQROP.mjs.map +0 -1
  124. package/dist/chunk-P4YYEM4B.js.map +0 -1
  125. package/dist/chunk-P5F257N3.js.map +0 -1
  126. package/dist/chunk-SQZGQOKU.js.map +0 -1
  127. package/dist/chunk-UGJZ3M4Q.js.map +0 -1
  128. package/dist/chunk-VDLAZR7S.mjs.map +0 -1
  129. package/dist/chunk-VUAGVZJM.mjs.map +0 -1
  130. package/dist/chunk-W5YCZOXO.js.map +0 -1
  131. package/dist/chunk-YTE6WCBX.js.map +0 -1
@@ -0,0 +1,934 @@
1
+ "use client";
2
+ import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
3
+ import { useLink } from './chunk-QWG2FMUN.mjs';
4
+ import * as Headless from '@headlessui/react';
5
+ import { Button as Button$1 } from '@headlessui/react';
6
+ import clsx from 'clsx';
7
+ import { forwardRef } from 'react';
8
+ import { AnimatePresence, motion } from 'framer-motion';
9
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
+ import { XMarkIcon } from '@heroicons/react/20/solid';
11
+
12
+ // src/lib/motion-tokens.ts
13
+ var duration = {
14
+ /** 90ms — micro feedback: toggle thumb, hover tint, focus ring */
15
+ xs: 90,
16
+ /** 150ms — button press, popover open, chip toggle */
17
+ sm: 150,
18
+ /** 240ms — card hover, drawer slide, tab switch */
19
+ md: 240,
20
+ /** 360ms — page transitions, modal enter/exit */
21
+ lg: 360
22
+ };
23
+ var durationSeconds = {
24
+ xs: duration.xs / 1e3,
25
+ sm: duration.sm / 1e3,
26
+ md: duration.md / 1e3,
27
+ lg: duration.lg / 1e3
28
+ };
29
+ var ease = {
30
+ /** Default product curve — symmetric, balanced */
31
+ standard: [0.4, 0, 0.2, 1],
32
+ /** Entering elements — slow start, fast finish */
33
+ emphasized: [0.2, 0, 0, 1],
34
+ /** Arrivals — fast in, slow settle */
35
+ decelerate: [0, 0, 0.2, 1],
36
+ /** Departures — fast out, sharp end */
37
+ accelerate: [0.4, 0, 1, 1],
38
+ /** iOS HIG-canonical curve — slightly slower decay than `standard` */
39
+ ios: [0.25, 0.46, 0.45, 0.94]
40
+ };
41
+ var easeCss = {
42
+ standard: `cubic-bezier(${ease.standard.join(", ")})`,
43
+ emphasized: `cubic-bezier(${ease.emphasized.join(", ")})`,
44
+ decelerate: `cubic-bezier(${ease.decelerate.join(", ")})`,
45
+ accelerate: `cubic-bezier(${ease.accelerate.join(", ")})`,
46
+ ios: `cubic-bezier(${ease.ios.join(", ")})`
47
+ };
48
+ var spring = {
49
+ /** Snap — fast, no overshoot. Buttons, micro-interactions. */
50
+ snap: { type: "spring", stiffness: 500, damping: 38 },
51
+ /** Smooth — balanced, no overshoot. Default for cards/transitions. */
52
+ smooth: { type: "spring", stiffness: 300, damping: 30 },
53
+ /** Bounce — playful overshoot. Icons, success confirmations. */
54
+ bounce: { type: "spring", stiffness: 400, damping: 22 },
55
+ /** Gentle — soft and slow. Modals, large surface entry. */
56
+ gentle: { type: "spring", stiffness: 200, damping: 22 },
57
+ /** Sheet — iOS sheet presentation (with mass). Drawers. */
58
+ sheet: { type: "spring", stiffness: 350, damping: 30, mass: 0.8 }
59
+ };
60
+ var motionTokens = {
61
+ duration,
62
+ durationSeconds,
63
+ ease,
64
+ easeCss,
65
+ spring
66
+ };
67
+
68
+ // src/lib/animations.ts
69
+ function prefersReducedMotion() {
70
+ if (typeof window === "undefined") return false;
71
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
72
+ }
73
+ function getTransition(transition) {
74
+ if (prefersReducedMotion()) {
75
+ return { duration: 0 };
76
+ }
77
+ return transition;
78
+ }
79
+ function getVariants(variants) {
80
+ if (prefersReducedMotion()) {
81
+ const reducedVariants = {};
82
+ for (const key in variants) {
83
+ reducedVariants[key] = {
84
+ ...variants[key],
85
+ transition: { duration: 0 }
86
+ };
87
+ }
88
+ return reducedVariants;
89
+ }
90
+ return variants;
91
+ }
92
+ var springPresets = {
93
+ default: spring.smooth,
94
+ bouncy: spring.bounce,
95
+ stiff: spring.snap,
96
+ gentle: spring.gentle,
97
+ sheet: spring.sheet,
98
+ /** Quick spring - very fast, good for micro-interactions */
99
+ quick: { type: "spring", stiffness: 600, damping: 40 }
100
+ };
101
+ var springPresetsReduced = {
102
+ default: prefersReducedMotion() ? { duration: 0 } : springPresets.default,
103
+ bouncy: prefersReducedMotion() ? { duration: 0 } : springPresets.bouncy,
104
+ stiff: prefersReducedMotion() ? { duration: 0 } : springPresets.stiff,
105
+ gentle: prefersReducedMotion() ? { duration: 0 } : springPresets.gentle,
106
+ sheet: prefersReducedMotion() ? { duration: 0 } : springPresets.sheet,
107
+ quick: prefersReducedMotion() ? { duration: 0 } : springPresets.quick
108
+ };
109
+ var buttonPress = {
110
+ idle: { scale: 1 },
111
+ pressed: { scale: 0.97 },
112
+ hover: { scale: 1.02 }
113
+ };
114
+ var buttonTap = {
115
+ scale: 0.97,
116
+ transition: springPresets.stiff
117
+ };
118
+ var buttonPressReduced = {
119
+ idle: { opacity: 1 },
120
+ pressed: { opacity: 0.7 },
121
+ hover: { opacity: 0.9 }
122
+ };
123
+ var cardHover = {
124
+ idle: {
125
+ y: 0,
126
+ boxShadow: "0 4px 6px -1px rgb(0 0 0 / 0.1)"
127
+ },
128
+ hover: {
129
+ y: -4,
130
+ boxShadow: "0 20px 25px -5px rgb(0 0 0 / 0.1)"
131
+ }
132
+ };
133
+ var cardPress = {
134
+ idle: { scale: 1 },
135
+ pressed: { scale: 0.98 }
136
+ };
137
+ var cardHoverReduced = {
138
+ idle: { opacity: 1 },
139
+ hover: { opacity: 0.95 }
140
+ };
141
+ var slideUp = {
142
+ hidden: { y: "100%", opacity: 0 },
143
+ visible: { y: 0, opacity: 1 },
144
+ exit: { y: "100%", opacity: 0 }
145
+ };
146
+ var slideRight = {
147
+ hidden: { x: "100%", opacity: 0 },
148
+ visible: { x: 0, opacity: 1 },
149
+ exit: { x: "100%", opacity: 0 }
150
+ };
151
+ var slideDown = {
152
+ hidden: { y: "-100%", opacity: 0 },
153
+ visible: { y: 0, opacity: 1 },
154
+ exit: { y: "-100%", opacity: 0 }
155
+ };
156
+ var fadeScale = {
157
+ hidden: { opacity: 0, scale: 0.95 },
158
+ visible: { opacity: 1, scale: 1 },
159
+ exit: { opacity: 0, scale: 0.95 }
160
+ };
161
+ var fadeOnly = {
162
+ hidden: { opacity: 0 },
163
+ visible: { opacity: 1 },
164
+ exit: { opacity: 0 }
165
+ };
166
+ var notificationBanner = {
167
+ hidden: { y: -100, opacity: 0, scale: 0.9 },
168
+ visible: {
169
+ y: 0,
170
+ opacity: 1,
171
+ scale: 1,
172
+ transition: springPresets.bouncy
173
+ },
174
+ exit: {
175
+ y: -100,
176
+ opacity: 0,
177
+ scale: 0.9,
178
+ transition: { duration: 0.2 }
179
+ }
180
+ };
181
+ var notificationBannerReduced = {
182
+ hidden: { opacity: 0 },
183
+ visible: { opacity: 1, transition: { duration: 0.15 } },
184
+ exit: { opacity: 0, transition: { duration: 0.1 } }
185
+ };
186
+ var listItem = {
187
+ hidden: { opacity: 0, x: -20 },
188
+ visible: (i) => ({
189
+ opacity: 1,
190
+ x: 0,
191
+ transition: {
192
+ delay: i * 0.05,
193
+ ...springPresets.default
194
+ }
195
+ })
196
+ };
197
+ var staggerContainer = {
198
+ hidden: { opacity: 0 },
199
+ visible: {
200
+ opacity: 1,
201
+ transition: {
202
+ staggerChildren: 0.05
203
+ }
204
+ }
205
+ };
206
+ var listItemReduced = {
207
+ hidden: { opacity: 0 },
208
+ visible: { opacity: 1, transition: { duration: 0.15 } }
209
+ };
210
+ var swipeActionThreshold = 80;
211
+ var swipeConstraints = {
212
+ left: -120,
213
+ right: 0
214
+ };
215
+ var pageControlDot = {
216
+ inactive: { width: 8, backgroundColor: "rgb(156 163 175)" },
217
+ active: { width: 24, backgroundColor: "rgb(59 130 246)" }
218
+ };
219
+ var iosColors = {
220
+ // Primary colors
221
+ blue: "#007AFF",
222
+ green: "#34C759",
223
+ red: "#FF3B30",
224
+ orange: "#FF9500",
225
+ yellow: "#FFCC00",
226
+ purple: "#AF52DE",
227
+ pink: "#FF2D55",
228
+ teal: "#5AC8FA",
229
+ indigo: "#5856D6",
230
+ mint: "#00C7BE",
231
+ cyan: "#32ADE6",
232
+ brown: "#A2845E",
233
+ // Grays
234
+ gray: "#8E8E93",
235
+ gray2: "#AEAEB2",
236
+ gray3: "#C7C7CC",
237
+ gray4: "#D1D1D6",
238
+ gray5: "#E5E5EA",
239
+ gray6: "#F2F2F7",
240
+ // Dark mode variants
241
+ dark: {
242
+ blue: "#0A84FF",
243
+ green: "#30D158",
244
+ red: "#FF453A",
245
+ orange: "#FF9F0A",
246
+ yellow: "#FFD60A",
247
+ purple: "#BF5AF2",
248
+ pink: "#FF375F",
249
+ teal: "#64D2FF",
250
+ indigo: "#5E5CE6",
251
+ mint: "#66D4CF",
252
+ cyan: "#5AC8FA",
253
+ brown: "#AC8E68"
254
+ }
255
+ };
256
+ var durations = {
257
+ instant: 0,
258
+ fast: duration.sm / 1e3,
259
+ normal: duration.md / 1e3,
260
+ slow: duration.lg / 1e3,
261
+ verySlow: 0.5
262
+ };
263
+ var durationsReduced = {
264
+ instant: 0,
265
+ fast: prefersReducedMotion() ? 0 : 0.15,
266
+ normal: prefersReducedMotion() ? 0 : 0.25,
267
+ slow: prefersReducedMotion() ? 0 : 0.35,
268
+ verySlow: prefersReducedMotion() ? 0 : 0.5
269
+ };
270
+ var easings = {
271
+ default: [0.25, 0.1, 0.25, 1],
272
+ out: ease.decelerate,
273
+ in: ease.accelerate,
274
+ inOut: ease.standard,
275
+ ios: ease.ios
276
+ };
277
+ function createMotionProps(animatedProps, reducedProps = {}) {
278
+ if (prefersReducedMotion()) {
279
+ return { ...animatedProps, ...reducedProps, transition: { duration: 0 } };
280
+ }
281
+ return animatedProps;
282
+ }
283
+ var Link = forwardRef(function Link2(props, ref) {
284
+ const RouterLink = useLink();
285
+ return /* @__PURE__ */ jsx(Headless.DataInteractive, { children: /* @__PURE__ */ jsx(RouterLink, { ...props, ref }) });
286
+ });
287
+
288
+ // src/components/button-styles.ts
289
+ var iosColors2 = {
290
+ // Glassy iOS blue — neutral glass at rest, fills blue on hover
291
+ "ios-glass-blue": [
292
+ "liquid-button-primary text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]",
293
+ "dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]",
294
+ "[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70"
295
+ ],
296
+ // Glassy iOS red — neutral glass at rest, fills red on hover
297
+ "ios-glass-red": [
298
+ "liquid-button liquid-button-red text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]",
299
+ "dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]",
300
+ "[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70"
301
+ ],
302
+ // Glassy iOS green — neutral glass at rest, fills green on hover
303
+ "ios-glass-green": [
304
+ "liquid-button liquid-button-green text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]",
305
+ "dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]",
306
+ "[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70"
307
+ ],
308
+ // Primary iOS blue
309
+ "ios-blue": [
310
+ "text-white [--btn-bg:#007AFF] [--btn-border:#0066DD] [--btn-hover-overlay:var(--color-white)]/10",
311
+ "dark:[--btn-bg:#0A84FF] dark:[--btn-border:#007AFF]",
312
+ "[--btn-icon:var(--color-white)]/80"
313
+ ],
314
+ // Destructive iOS red
315
+ "ios-red": [
316
+ "text-white [--btn-bg:#FF3B30] [--btn-border:#E6352B] [--btn-hover-overlay:var(--color-white)]/10",
317
+ "dark:[--btn-bg:#FF453A] dark:[--btn-border:#FF3B30]",
318
+ "[--btn-icon:var(--color-white)]/80"
319
+ ],
320
+ // iOS green (success/confirm)
321
+ "ios-green": [
322
+ "text-white [--btn-bg:#34C759] [--btn-border:#2DB350] [--btn-hover-overlay:var(--color-white)]/10",
323
+ "dark:[--btn-bg:#30D158] dark:[--btn-border:#34C759]",
324
+ "[--btn-icon:var(--color-white)]/80"
325
+ ],
326
+ // iOS orange (warning)
327
+ "ios-orange": [
328
+ "text-white [--btn-bg:#FF9500] [--btn-border:#E68600] [--btn-hover-overlay:var(--color-white)]/10",
329
+ "dark:[--btn-bg:#FF9F0A] dark:[--btn-border:#FF9500]",
330
+ "[--btn-icon:var(--color-white)]/80"
331
+ ],
332
+ // iOS purple
333
+ "ios-purple": [
334
+ "text-white [--btn-bg:#AF52DE] [--btn-border:#9B48C7] [--btn-hover-overlay:var(--color-white)]/10",
335
+ "dark:[--btn-bg:#BF5AF2] dark:[--btn-border:#AF52DE]",
336
+ "[--btn-icon:var(--color-white)]/80"
337
+ ],
338
+ // iOS teal
339
+ "ios-teal": [
340
+ "text-white [--btn-bg:#5AC8FA] [--btn-border:#4AB8E8] [--btn-hover-overlay:var(--color-white)]/10",
341
+ "dark:[--btn-bg:#64D2FF] dark:[--btn-border:#5AC8FA]",
342
+ "[--btn-icon:var(--color-white)]/80"
343
+ ]
344
+ };
345
+ var sizeStyles = {
346
+ xs: "px-2 py-1 text-xs rounded-md",
347
+ sm: "px-3 py-1.5 text-sm rounded-lg",
348
+ md: "",
349
+ // Default size from base styles
350
+ lg: "px-5 py-3 text-base rounded-xl",
351
+ xl: "px-6 py-4 text-lg rounded-xl"
352
+ };
353
+ var pillStyles = "rounded-full";
354
+ var styles = {
355
+ base: [
356
+ // Base
357
+ "relative isolate inline-flex items-center justify-center gap-x-2 rounded-lg border text-base/6 font-semibold",
358
+ // Sizing
359
+ "px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)] sm:text-sm/6",
360
+ // Focus
361
+ "focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500",
362
+ // Disabled
363
+ "data-disabled:opacity-50",
364
+ // Icon
365
+ "*:data-[slot=icon]:-mx-0.5 *:data-[slot=icon]:my-0.5 *:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:self-center *:data-[slot=icon]:text-(--btn-icon) sm:*:data-[slot=icon]:my-1 sm:*:data-[slot=icon]:size-4 forced-colors:[--btn-icon:ButtonText] forced-colors:data-hover:[--btn-icon:ButtonText]"
366
+ ],
367
+ solid: [
368
+ // Optical border, implemented as the button background to avoid corner artifacts
369
+ "border-transparent bg-(--btn-border)",
370
+ // Dark mode: border is rendered on `after` so background is set to button background
371
+ "dark:bg-(--btn-bg)",
372
+ // Button background, implemented as foreground layer to stack on top of pseudo-border layer
373
+ "before:absolute before:inset-0 before:-z-10 before:rounded-[calc(var(--radius-lg)-1px)] before:bg-(--btn-bg)",
374
+ // Drop shadow, applied to the inset `before` layer so it blends with the border
375
+ "before:shadow-xs",
376
+ // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo
377
+ "dark:before:hidden",
378
+ // Dark mode: Subtle white outline is applied using a border
379
+ "dark:border-white/5",
380
+ // Shim/overlay, inset to match button foreground and used for hover state + highlight shadow
381
+ "after:absolute after:inset-0 after:-z-10 after:rounded-[calc(var(--radius-lg)-1px)]",
382
+ // Inner highlight shadow
383
+ "after:shadow-[inset_0_1px_--theme(--color-white/15%)]",
384
+ // White overlay on hover
385
+ "data-active:after:bg-(--btn-hover-overlay) data-hover:after:bg-(--btn-hover-overlay)",
386
+ // Dark mode: `after` layer expands to cover entire button
387
+ "dark:after:-inset-px dark:after:rounded-lg",
388
+ // Disabled
389
+ "data-disabled:before:shadow-none data-disabled:after:shadow-none"
390
+ ],
391
+ outline: [
392
+ // Liquid glass secondary button
393
+ "liquid-button text-slate-900 !border-white/55",
394
+ // Dark mode
395
+ "dark:text-white dark:!border-white/18",
396
+ // Icon
397
+ "[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]"
398
+ ],
399
+ plain: [
400
+ // Base
401
+ "border-transparent text-zinc-950 data-active:bg-zinc-950/5 data-hover:bg-zinc-950/5",
402
+ // Dark mode
403
+ "dark:text-white dark:data-active:bg-white/10 dark:data-hover:bg-white/10",
404
+ // Icon
405
+ "[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]"
406
+ ],
407
+ gradient: [
408
+ // Same crystal-illuminated mechanic as ios-glass-blue/red/green:
409
+ // neutral glass at rest, fills with translucent indigo→purple
410
+ // gradient on hover. The actual rest/hover styling — including
411
+ // the text-color flip from slate-900 → white — lives in the
412
+ // `.liquid-button-gradient` CSS class in liquid-glass.css so the
413
+ // whole transition is keyed off `:hover` (works without JS).
414
+ "liquid-button-gradient border-transparent",
415
+ // Disabled
416
+ "data-disabled:opacity-50 data-disabled:saturate-50",
417
+ // Icon tint flips with text via inherit (currentColor)
418
+ "[--btn-icon:currentColor]"
419
+ ],
420
+ colors: {
421
+ "dark/zinc": [
422
+ "text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10",
423
+ "dark:text-white dark:[--btn-bg:var(--color-zinc-600)] dark:[--btn-hover-overlay:var(--color-white)]/5",
424
+ "[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]"
425
+ ],
426
+ light: [
427
+ "text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15",
428
+ "dark:text-white dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]",
429
+ "[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]"
430
+ ],
431
+ "dark/white": [
432
+ "text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10",
433
+ "dark:text-zinc-950 dark:[--btn-bg:white] dark:[--btn-hover-overlay:var(--color-zinc-950)]/5",
434
+ "[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]"
435
+ ],
436
+ dark: [
437
+ "text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10",
438
+ "dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]",
439
+ "[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]"
440
+ ],
441
+ white: [
442
+ "text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15",
443
+ "dark:[--btn-hover-overlay:var(--color-zinc-950)]/5",
444
+ "[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-500)] data-hover:[--btn-icon:var(--color-zinc-500)]"
445
+ ],
446
+ zinc: [
447
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-zinc-600)] [--btn-border:var(--color-zinc-700)]/90",
448
+ "dark:[--btn-hover-overlay:var(--color-white)]/5",
449
+ "[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]"
450
+ ],
451
+ indigo: [
452
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-indigo-500)] [--btn-border:var(--color-indigo-600)]/90",
453
+ "[--btn-icon:var(--color-indigo-300)] data-active:[--btn-icon:var(--color-indigo-200)] data-hover:[--btn-icon:var(--color-indigo-200)]"
454
+ ],
455
+ cyan: [
456
+ "text-cyan-950 [--btn-bg:var(--color-cyan-300)] [--btn-border:var(--color-cyan-400)]/80 [--btn-hover-overlay:var(--color-white)]/25",
457
+ "[--btn-icon:var(--color-cyan-500)]"
458
+ ],
459
+ red: [
460
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-red-600)] [--btn-border:var(--color-red-700)]/90",
461
+ "[--btn-icon:var(--color-red-300)] data-active:[--btn-icon:var(--color-red-200)] data-hover:[--btn-icon:var(--color-red-200)]"
462
+ ],
463
+ orange: [
464
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-orange-500)] [--btn-border:var(--color-orange-600)]/90",
465
+ "[--btn-icon:var(--color-orange-300)] data-active:[--btn-icon:var(--color-orange-200)] data-hover:[--btn-icon:var(--color-orange-200)]"
466
+ ],
467
+ amber: [
468
+ "text-amber-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-amber-400)] [--btn-border:var(--color-amber-500)]/80",
469
+ "[--btn-icon:var(--color-amber-600)]"
470
+ ],
471
+ yellow: [
472
+ "text-yellow-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-yellow-300)] [--btn-border:var(--color-yellow-400)]/80",
473
+ "[--btn-icon:var(--color-yellow-600)] data-active:[--btn-icon:var(--color-yellow-700)] data-hover:[--btn-icon:var(--color-yellow-700)]"
474
+ ],
475
+ lime: [
476
+ "text-lime-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-lime-300)] [--btn-border:var(--color-lime-400)]/80",
477
+ "[--btn-icon:var(--color-lime-600)] data-active:[--btn-icon:var(--color-lime-700)] data-hover:[--btn-icon:var(--color-lime-700)]"
478
+ ],
479
+ green: [
480
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-green-600)] [--btn-border:var(--color-green-700)]/90",
481
+ "[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80"
482
+ ],
483
+ emerald: [
484
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-emerald-600)] [--btn-border:var(--color-emerald-700)]/90",
485
+ "[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80"
486
+ ],
487
+ teal: [
488
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-teal-600)] [--btn-border:var(--color-teal-700)]/90",
489
+ "[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80"
490
+ ],
491
+ sky: [
492
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-sky-500)] [--btn-border:var(--color-sky-600)]/80",
493
+ "[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80"
494
+ ],
495
+ blue: [
496
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-blue-600)] [--btn-border:var(--color-blue-700)]/90",
497
+ "[--btn-icon:var(--color-blue-400)] data-active:[--btn-icon:var(--color-blue-300)] data-hover:[--btn-icon:var(--color-blue-300)]"
498
+ ],
499
+ violet: [
500
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-violet-500)] [--btn-border:var(--color-violet-600)]/90",
501
+ "[--btn-icon:var(--color-violet-300)] data-active:[--btn-icon:var(--color-violet-200)] data-hover:[--btn-icon:var(--color-violet-200)]"
502
+ ],
503
+ purple: [
504
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-purple-500)] [--btn-border:var(--color-purple-600)]/90",
505
+ "[--btn-icon:var(--color-purple-300)] data-active:[--btn-icon:var(--color-purple-200)] data-hover:[--btn-icon:var(--color-purple-200)]"
506
+ ],
507
+ fuchsia: [
508
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-fuchsia-500)] [--btn-border:var(--color-fuchsia-600)]/90",
509
+ "[--btn-icon:var(--color-fuchsia-300)] data-active:[--btn-icon:var(--color-fuchsia-200)] data-hover:[--btn-icon:var(--color-fuchsia-200)]"
510
+ ],
511
+ pink: [
512
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-pink-500)] [--btn-border:var(--color-pink-600)]/90",
513
+ "[--btn-icon:var(--color-pink-300)] data-active:[--btn-icon:var(--color-pink-200)] data-hover:[--btn-icon:var(--color-pink-200)]"
514
+ ],
515
+ rose: [
516
+ "text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-rose-500)] [--btn-border:var(--color-rose-600)]/90",
517
+ "[--btn-icon:var(--color-rose-300)] data-active:[--btn-icon:var(--color-rose-200)] data-hover:[--btn-icon:var(--color-rose-200)]"
518
+ ]
519
+ }
520
+ };
521
+ var fabSizes = {
522
+ sm: "h-12 w-12",
523
+ md: "h-14 w-14",
524
+ lg: "h-16 w-16"
525
+ };
526
+ var fabIconSizes = {
527
+ sm: "h-5 w-5",
528
+ md: "h-6 w-6",
529
+ lg: "h-7 w-7"
530
+ };
531
+ var fabPositions = {
532
+ "bottom-right": "fixed bottom-6 right-6",
533
+ "bottom-left": "fixed bottom-6 left-6",
534
+ "bottom-center": "fixed bottom-6 left-1/2 -translate-x-1/2"
535
+ };
536
+ var fabColors = {
537
+ "ios-blue": "text-white bg-[#007AFF]/85 dark:bg-[#0A84FF]/80 backdrop-blur-xl border border-white/30 dark:border-white/15 shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(0,122,255,0.5)] hover:bg-[#007AFF] dark:hover:bg-[#0A84FF] hover:shadow-[inset_0_1px_2px_rgba(255,255,255,0.55),0_16px_40px_-8px_rgba(0,122,255,0.65),0_0_24px_-4px_rgba(0,122,255,0.4)]",
538
+ "ios-green": "text-white bg-[#34C759]/85 dark:bg-[#30D158]/80 backdrop-blur-xl border border-white/30 dark:border-white/15 shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(52,199,89,0.5)] hover:bg-[#34C759] dark:hover:bg-[#30D158] hover:shadow-[inset_0_1px_2px_rgba(255,255,255,0.55),0_16px_40px_-8px_rgba(52,199,89,0.65),0_0_24px_-4px_rgba(52,199,89,0.4)]",
539
+ "ios-red": "text-white bg-[#FF3B30]/85 dark:bg-[#FF453A]/80 backdrop-blur-xl border border-white/30 dark:border-white/15 shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(255,59,48,0.5)] hover:bg-[#FF3B30] dark:hover:bg-[#FF453A] hover:shadow-[inset_0_1px_2px_rgba(255,255,255,0.55),0_16px_40px_-8px_rgba(255,59,48,0.65),0_0_24px_-4px_rgba(255,59,48,0.4)]",
540
+ "ios-purple": "text-white bg-[#AF52DE]/85 dark:bg-[#BF5AF2]/80 backdrop-blur-xl border border-white/30 dark:border-white/15 shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(175,82,222,0.5)] hover:bg-[#AF52DE] dark:hover:bg-[#BF5AF2] hover:shadow-[inset_0_1px_2px_rgba(255,255,255,0.55),0_16px_40px_-8px_rgba(175,82,222,0.65),0_0_24px_-4px_rgba(175,82,222,0.4)]",
541
+ "ios-orange": "text-white bg-[#FF9500]/85 dark:bg-[#FF9F0A]/80 backdrop-blur-xl border border-white/30 dark:border-white/15 shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(255,149,0,0.5)] hover:bg-[#FF9500] dark:hover:bg-[#FF9F0A] hover:shadow-[inset_0_1px_2px_rgba(255,255,255,0.55),0_16px_40px_-8px_rgba(255,149,0,0.65),0_0_24px_-4px_rgba(255,149,0,0.4)]"
542
+ };
543
+ var iconButtonSizes = {
544
+ sm: "h-8 w-8",
545
+ md: "h-10 w-10",
546
+ lg: "h-12 w-12"
547
+ };
548
+ var iconSizes = {
549
+ sm: "h-4 w-4",
550
+ md: "h-5 w-5",
551
+ lg: "h-6 w-6"
552
+ };
553
+ var Button = forwardRef(function Button2({
554
+ color,
555
+ outline,
556
+ plain,
557
+ gradient,
558
+ className,
559
+ children,
560
+ pill,
561
+ size = "md",
562
+ loading,
563
+ loadingText,
564
+ fullWidth,
565
+ destructive,
566
+ disabled,
567
+ ...props
568
+ }, ref) {
569
+ const finalColor = destructive ? "ios-red" : color;
570
+ const isIosColor = finalColor && finalColor in iosColors2;
571
+ const colorStyles = isIosColor ? iosColors2[finalColor] : styles.colors[finalColor] ?? styles.colors["dark/zinc"];
572
+ let classes = clsx(
573
+ className,
574
+ styles.base,
575
+ gradient ? styles.gradient : outline ? styles.outline : plain ? styles.plain : clsx(styles.solid, colorStyles),
576
+ pill && pillStyles,
577
+ size !== "md" && sizeStyles[size],
578
+ fullWidth && "w-full",
579
+ loading && "pointer-events-none"
580
+ );
581
+ const handleTapStart = () => {
582
+ if (!loading && !disabled) {
583
+ triggerHaptic(destructive ? "medium" : "light");
584
+ }
585
+ };
586
+ const isDisabled = disabled || loading;
587
+ const buttonContent = /* @__PURE__ */ jsxs(Fragment, { children: [
588
+ /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: loading && /* @__PURE__ */ jsx(
589
+ motion.span,
590
+ {
591
+ initial: { opacity: 0, width: 0 },
592
+ animate: { opacity: 1, width: "auto" },
593
+ exit: { opacity: 0, width: 0 },
594
+ transition: getTransition(springPresets.stiff),
595
+ className: "inline-flex items-center",
596
+ children: /* @__PURE__ */ jsx(LoadingSpinner, { className: "mr-2" })
597
+ }
598
+ ) }),
599
+ /* @__PURE__ */ jsx("span", { className: clsx("inline-flex items-center gap-x-2", loading && "opacity-70"), children: loading && loadingText ? loadingText : children })
600
+ ] });
601
+ const linkProps = props;
602
+ const buttonProps = props;
603
+ const isLink = typeof props.href === "string";
604
+ return isLink ? /* @__PURE__ */ jsx(
605
+ motion.div,
606
+ {
607
+ whileTap: !isDisabled ? { scale: 0.97 } : void 0,
608
+ transition: getTransition(springPresets.stiff),
609
+ onTapStart: handleTapStart,
610
+ className: clsx("inline-flex", fullWidth && "w-full"),
611
+ children: /* @__PURE__ */ jsx(
612
+ Link,
613
+ {
614
+ ...linkProps,
615
+ className: classes,
616
+ ref,
617
+ children: /* @__PURE__ */ jsx(TouchTarget, { children: buttonContent })
618
+ }
619
+ )
620
+ }
621
+ ) : /* @__PURE__ */ jsx(
622
+ motion.div,
623
+ {
624
+ whileTap: !isDisabled ? { scale: 0.97 } : void 0,
625
+ transition: getTransition(springPresets.stiff),
626
+ onTapStart: handleTapStart,
627
+ className: clsx("inline-flex", fullWidth && "w-full"),
628
+ children: /* @__PURE__ */ jsx(
629
+ Button$1,
630
+ {
631
+ ...buttonProps,
632
+ disabled: isDisabled,
633
+ className: clsx(classes, "cursor-default"),
634
+ ref,
635
+ children: /* @__PURE__ */ jsx(TouchTarget, { children: buttonContent })
636
+ }
637
+ )
638
+ }
639
+ );
640
+ });
641
+ function TouchTarget({ children }) {
642
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
643
+ /* @__PURE__ */ jsx(
644
+ "span",
645
+ {
646
+ className: "absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden",
647
+ "aria-hidden": "true"
648
+ }
649
+ ),
650
+ children
651
+ ] });
652
+ }
653
+ function LoadingSpinner({ className }) {
654
+ return /* @__PURE__ */ jsxs(
655
+ "svg",
656
+ {
657
+ className: clsx("h-4 w-4 animate-spin motion-reduce:animate-none", className),
658
+ xmlns: "http://www.w3.org/2000/svg",
659
+ fill: "none",
660
+ viewBox: "0 0 24 24",
661
+ children: [
662
+ /* @__PURE__ */ jsx(
663
+ "circle",
664
+ {
665
+ className: "opacity-25",
666
+ cx: "12",
667
+ cy: "12",
668
+ r: "10",
669
+ stroke: "currentColor",
670
+ strokeWidth: "4"
671
+ }
672
+ ),
673
+ /* @__PURE__ */ jsx(
674
+ "path",
675
+ {
676
+ className: "opacity-75",
677
+ fill: "currentColor",
678
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
679
+ }
680
+ )
681
+ ]
682
+ }
683
+ );
684
+ }
685
+ function FloatingActionButton({
686
+ icon,
687
+ label,
688
+ color = "ios-blue",
689
+ size = "md",
690
+ position = "bottom-right",
691
+ onClick,
692
+ loading,
693
+ className,
694
+ extended
695
+ }) {
696
+ const handleClick = () => {
697
+ if (!loading) {
698
+ triggerHaptic("medium");
699
+ onClick?.();
700
+ }
701
+ };
702
+ return /* @__PURE__ */ jsxs(
703
+ motion.button,
704
+ {
705
+ onClick: handleClick,
706
+ disabled: loading,
707
+ initial: { scale: 0, opacity: 0 },
708
+ animate: { scale: 1, opacity: 1 },
709
+ exit: { scale: 0, opacity: 0 },
710
+ whileHover: { scale: 1.05 },
711
+ whileTap: { scale: 0.95 },
712
+ transition: getTransition(springPresets.bouncy),
713
+ className: clsx(
714
+ fabPositions[position],
715
+ extended ? "px-5 h-14 rounded-full" : clsx(fabSizes[size], "rounded-full"),
716
+ fabColors[color],
717
+ "flex items-center justify-center gap-2",
718
+ "shadow-lg hover:shadow-xl",
719
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-indigo-500/70",
720
+ "z-50",
721
+ loading && "opacity-70 cursor-not-allowed",
722
+ className
723
+ ),
724
+ "aria-label": label,
725
+ children: [
726
+ loading ? /* @__PURE__ */ jsx(LoadingSpinner, { className: fabIconSizes[size] }) : /* @__PURE__ */ jsx("span", { className: fabIconSizes[size], children: icon }),
727
+ extended && label && /* @__PURE__ */ jsx("span", { className: "font-semibold text-base", children: label })
728
+ ]
729
+ }
730
+ );
731
+ }
732
+ function IconButton({
733
+ icon,
734
+ label,
735
+ color = "ios-blue",
736
+ size = "md",
737
+ variant = "ghost",
738
+ onClick,
739
+ disabled,
740
+ loading,
741
+ className,
742
+ destructive
743
+ }) {
744
+ const finalColor = destructive ? "ios-red" : color;
745
+ const isIosColor = finalColor in iosColors2;
746
+ const handleClick = () => {
747
+ if (!disabled && !loading) {
748
+ triggerHaptic(destructive ? "medium" : "light");
749
+ onClick?.();
750
+ }
751
+ };
752
+ const variantStyles = {
753
+ solid: clsx(
754
+ "text-white",
755
+ isIosColor && finalColor === "ios-blue" && "bg-[#007AFF] dark:bg-[#0A84FF]",
756
+ isIosColor && finalColor === "ios-red" && "bg-[#FF3B30] dark:bg-[#FF453A]",
757
+ isIosColor && finalColor === "ios-green" && "bg-[#34C759] dark:bg-[#30D158]",
758
+ isIosColor && finalColor === "ios-orange" && "bg-[#FF9500] dark:bg-[#FF9F0A]",
759
+ isIosColor && finalColor === "ios-purple" && "bg-[#AF52DE] dark:bg-[#BF5AF2]"
760
+ ),
761
+ ghost: clsx(
762
+ "bg-transparent hover:bg-white/40 dark:hover:bg-white/[0.08]",
763
+ isIosColor && finalColor === "ios-blue" && "text-[#007AFF] dark:text-[#0A84FF]",
764
+ isIosColor && finalColor === "ios-red" && "text-[#FF3B30] dark:text-[#FF453A]",
765
+ isIosColor && finalColor === "ios-green" && "text-[#34C759] dark:text-[#30D158]",
766
+ isIosColor && finalColor === "ios-orange" && "text-[#FF9500] dark:text-[#FF9F0A]",
767
+ isIosColor && finalColor === "ios-purple" && "text-[#AF52DE] dark:text-[#BF5AF2]",
768
+ !isIosColor && "text-slate-700 dark:text-slate-300"
769
+ ),
770
+ outline: clsx(
771
+ "bg-transparent border",
772
+ isIosColor && finalColor === "ios-blue" && "border-[#007AFF] text-[#007AFF] dark:border-[#0A84FF] dark:text-[#0A84FF]",
773
+ isIosColor && finalColor === "ios-red" && "border-[#FF3B30] text-[#FF3B30] dark:border-[#FF453A] dark:text-[#FF453A]",
774
+ isIosColor && finalColor === "ios-green" && "border-[#34C759] text-[#34C759] dark:border-[#30D158] dark:text-[#30D158]",
775
+ isIosColor && finalColor === "ios-orange" && "border-[#FF9500] text-[#FF9500] dark:border-[#FF9F0A] dark:text-[#FF9F0A]",
776
+ isIosColor && finalColor === "ios-purple" && "border-[#AF52DE] text-[#AF52DE] dark:border-[#BF5AF2] dark:text-[#BF5AF2]"
777
+ )
778
+ };
779
+ return /* @__PURE__ */ jsx(
780
+ motion.button,
781
+ {
782
+ onClick: handleClick,
783
+ disabled: disabled || loading,
784
+ whileTap: { scale: 0.9 },
785
+ transition: getTransition(springPresets.stiff),
786
+ className: clsx(
787
+ iconButtonSizes[size],
788
+ "rounded-full flex items-center justify-center",
789
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-indigo-500/70",
790
+ "transition-colors",
791
+ variantStyles[variant],
792
+ (disabled || loading) && "opacity-50 cursor-not-allowed",
793
+ className
794
+ ),
795
+ "aria-label": label,
796
+ children: loading ? /* @__PURE__ */ jsx(LoadingSpinner, { className: iconSizes[size] }) : /* @__PURE__ */ jsx("span", { className: iconSizes[size], children: icon })
797
+ }
798
+ );
799
+ }
800
+ var colors = {
801
+ red: "bg-red-500/15 text-red-700 group-data-hover:bg-red-500/25 dark:bg-red-500/10 dark:text-red-300 dark:group-data-hover:bg-red-500/20",
802
+ orange: "bg-orange-500/15 text-orange-700 group-data-hover:bg-orange-500/25 dark:bg-orange-500/10 dark:text-orange-300 dark:group-data-hover:bg-orange-500/20",
803
+ amber: "bg-amber-400/20 text-amber-800 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-300 dark:group-data-hover:bg-amber-400/15",
804
+ yellow: "bg-yellow-400/20 text-yellow-800 group-data-hover:bg-yellow-400/30 dark:bg-yellow-400/10 dark:text-yellow-200 dark:group-data-hover:bg-yellow-400/15",
805
+ lime: "bg-lime-400/20 text-lime-800 group-data-hover:bg-lime-400/30 dark:bg-lime-400/10 dark:text-lime-200 dark:group-data-hover:bg-lime-400/15",
806
+ green: "bg-green-500/15 text-green-700 group-data-hover:bg-green-500/25 dark:bg-green-500/10 dark:text-green-300 dark:group-data-hover:bg-green-500/20",
807
+ emerald: "bg-emerald-500/15 text-emerald-700 group-data-hover:bg-emerald-500/25 dark:bg-emerald-500/10 dark:text-emerald-300 dark:group-data-hover:bg-emerald-500/20",
808
+ teal: "bg-teal-500/15 text-teal-700 group-data-hover:bg-teal-500/25 dark:bg-teal-500/10 dark:text-teal-300 dark:group-data-hover:bg-teal-500/20",
809
+ cyan: "bg-cyan-400/20 text-cyan-800 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-200 dark:group-data-hover:bg-cyan-400/15",
810
+ sky: "bg-sky-500/15 text-sky-700 group-data-hover:bg-sky-500/25 dark:bg-sky-500/10 dark:text-sky-300 dark:group-data-hover:bg-sky-500/20",
811
+ blue: "bg-blue-500/15 text-blue-700 group-data-hover:bg-blue-500/25 dark:text-blue-300 dark:group-data-hover:bg-blue-500/25",
812
+ indigo: "bg-indigo-500/15 text-indigo-700 group-data-hover:bg-indigo-500/25 dark:text-indigo-300 dark:group-data-hover:bg-indigo-500/20",
813
+ violet: "bg-violet-500/15 text-violet-700 group-data-hover:bg-violet-500/25 dark:text-violet-300 dark:group-data-hover:bg-violet-500/20",
814
+ purple: "bg-purple-500/15 text-purple-700 group-data-hover:bg-purple-500/25 dark:text-purple-300 dark:group-data-hover:bg-purple-500/20",
815
+ fuchsia: "bg-fuchsia-400/20 text-fuchsia-700 group-data-hover:bg-fuchsia-400/30 dark:bg-fuchsia-400/10 dark:text-fuchsia-300 dark:group-data-hover:bg-fuchsia-400/20",
816
+ pink: "bg-pink-400/20 text-pink-700 group-data-hover:bg-pink-400/30 dark:bg-pink-400/10 dark:text-pink-300 dark:group-data-hover:bg-pink-400/20",
817
+ rose: "bg-rose-400/20 text-rose-700 group-data-hover:bg-rose-400/30 dark:bg-rose-400/10 dark:text-rose-300 dark:group-data-hover:bg-rose-400/20",
818
+ zinc: "bg-slate-500/15 text-slate-700 group-data-hover:bg-slate-500/25 dark:bg-white/5 dark:text-slate-200 dark:group-data-hover:bg-white/10"
819
+ };
820
+ var sizes = {
821
+ xs: { container: "px-2 py-0.5 text-[11px] gap-1", icon: "h-3 w-3", remove: "h-3 w-3 -mr-0.5" },
822
+ sm: { container: "px-2.5 py-0.5 text-xs gap-1.5", icon: "h-3.5 w-3.5", remove: "h-3.5 w-3.5 -mr-1" },
823
+ md: { container: "px-3 py-1 text-sm gap-1.5", icon: "h-4 w-4", remove: "h-4 w-4 -mr-1" },
824
+ lg: { container: "px-3.5 py-1.5 text-sm gap-2", icon: "h-4 w-4", remove: "h-4 w-4 -mr-1" }
825
+ };
826
+ var CRYSTAL_STYLE = {
827
+ backdropFilter: "blur(12px) saturate(1.5)",
828
+ WebkitBackdropFilter: "blur(12px) saturate(1.5)",
829
+ boxShadow: "inset 0 1px 1.5px rgba(255,255,255,0.45), 0 1px 3px -1px rgba(15,23,42,0.12)"
830
+ };
831
+ function Badge({
832
+ color = "zinc",
833
+ size = "sm",
834
+ icon,
835
+ removable = false,
836
+ onRemove,
837
+ removeLabel = "Remove",
838
+ onClick,
839
+ live = false,
840
+ className,
841
+ children,
842
+ ...props
843
+ }) {
844
+ const sz = sizes[size];
845
+ const base = clsx(
846
+ "inline-flex items-center rounded-full border font-semibold forced-colors:outline",
847
+ "border-current/20",
848
+ // hair-line border in the badge's own hue
849
+ sz.container,
850
+ colors[color],
851
+ className
852
+ );
853
+ const liveProps = live ? { role: "status", "aria-live": "polite" } : {};
854
+ if (onClick) {
855
+ return /* @__PURE__ */ jsxs(
856
+ "button",
857
+ {
858
+ type: "button",
859
+ "data-testid": "badge",
860
+ onClick,
861
+ style: CRYSTAL_STYLE,
862
+ ...liveProps,
863
+ className: clsx(
864
+ base,
865
+ "cursor-pointer transition-colors",
866
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1"
867
+ ),
868
+ children: [
869
+ icon && /* @__PURE__ */ jsx("span", { className: clsx("shrink-0", sz.icon), "aria-hidden": true, children: icon }),
870
+ children
871
+ ]
872
+ }
873
+ );
874
+ }
875
+ if (removable) {
876
+ return /* @__PURE__ */ jsxs(
877
+ "span",
878
+ {
879
+ "data-testid": "badge",
880
+ ...props,
881
+ ...liveProps,
882
+ style: CRYSTAL_STYLE,
883
+ className: clsx(base, "pr-1"),
884
+ children: [
885
+ icon && /* @__PURE__ */ jsx("span", { className: clsx("shrink-0", sz.icon), "aria-hidden": true, children: icon }),
886
+ children,
887
+ /* @__PURE__ */ jsx(
888
+ "button",
889
+ {
890
+ type: "button",
891
+ "aria-label": removeLabel,
892
+ onClick: (event) => {
893
+ event.stopPropagation();
894
+ onRemove?.();
895
+ },
896
+ className: clsx(
897
+ "ml-0.5 inline-flex shrink-0 cursor-pointer items-center justify-center rounded-full",
898
+ "opacity-70 hover:opacity-100 transition-opacity",
899
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70"
900
+ ),
901
+ children: /* @__PURE__ */ jsx(XMarkIcon, { className: sz.remove })
902
+ }
903
+ )
904
+ ]
905
+ }
906
+ );
907
+ }
908
+ return /* @__PURE__ */ jsxs("span", { "data-testid": "badge", ...props, ...liveProps, style: CRYSTAL_STYLE, className: base, children: [
909
+ icon && /* @__PURE__ */ jsx("span", { className: clsx("shrink-0", sz.icon), "aria-hidden": true, children: icon }),
910
+ children
911
+ ] });
912
+ }
913
+ forwardRef(function BadgeButton2({
914
+ color = "zinc",
915
+ size = "sm",
916
+ icon,
917
+ className,
918
+ children,
919
+ ...props
920
+ }, ref) {
921
+ let classes = clsx(
922
+ className,
923
+ "group relative inline-flex rounded-full",
924
+ "focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-indigo-500/70"
925
+ );
926
+ if (typeof props.href === "string") {
927
+ return /* @__PURE__ */ jsx(Link, { ...props, className: classes, ref, children: /* @__PURE__ */ jsx(TouchTarget, { children: /* @__PURE__ */ jsx(Badge, { color, size, icon, children }) }) });
928
+ }
929
+ return /* @__PURE__ */ jsx(Headless.Button, { ...props, className: classes, ref, children: /* @__PURE__ */ jsx(TouchTarget, { children: /* @__PURE__ */ jsx(Badge, { color, size, icon, children }) }) });
930
+ });
931
+
932
+ export { Badge, Button, FloatingActionButton, IconButton, Link, TouchTarget, buttonPress, buttonPressReduced, buttonTap, cardHover, cardHoverReduced, cardPress, createMotionProps, duration, durationSeconds, durations, durationsReduced, ease, easeCss, easings, fadeOnly, fadeScale, getTransition, getVariants, iosColors, listItem, listItemReduced, motionTokens, notificationBanner, notificationBannerReduced, pageControlDot, prefersReducedMotion, slideDown, slideRight, slideUp, spring, springPresets, springPresetsReduced, staggerContainer, swipeActionThreshold, swipeConstraints };
933
+ //# sourceMappingURL=chunk-WR55H7DH.mjs.map
934
+ //# sourceMappingURL=chunk-WR55H7DH.mjs.map