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