@datatechsolutions/ui 3.13.1 → 3.15.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 (123) hide show
  1. package/dist/astrlabe/graph-node.js +6 -6
  2. package/dist/astrlabe/graph-node.mjs +2 -2
  3. package/dist/astrlabe/index.js +113 -113
  4. package/dist/astrlabe/index.mjs +5 -5
  5. package/dist/astrlabe/workflow-canvas.js +5 -5
  6. package/dist/astrlabe/workflow-canvas.mjs +4 -4
  7. package/dist/{chunk-Q7QPHZOV.js → chunk-2JPS5OND.js} +67 -67
  8. package/dist/{chunk-Q7QPHZOV.js.map → chunk-2JPS5OND.js.map} +1 -1
  9. package/dist/{chunk-RPNMDGRA.js → chunk-2QZFKQP6.js} +37 -40
  10. package/dist/chunk-2QZFKQP6.js.map +1 -0
  11. package/dist/{chunk-O4RZCDP2.mjs → chunk-2SBVFLPZ.mjs} +19 -2
  12. package/dist/chunk-2SBVFLPZ.mjs.map +1 -0
  13. package/dist/{chunk-4VEQJAXJ.mjs → chunk-3FOLXKVP.mjs} +5 -5
  14. package/dist/{chunk-4VEQJAXJ.mjs.map → chunk-3FOLXKVP.mjs.map} +1 -1
  15. package/dist/{chunk-PM7A5I3X.js → chunk-435TRHC2.js} +118 -118
  16. package/dist/{chunk-PM7A5I3X.js.map → chunk-435TRHC2.js.map} +1 -1
  17. package/dist/{chunk-M4KRQXOT.mjs → chunk-5QRU3KKV.mjs} +3 -3
  18. package/dist/{chunk-M4KRQXOT.mjs.map → chunk-5QRU3KKV.mjs.map} +1 -1
  19. package/dist/{chunk-DTFU3ZTD.js → chunk-6NBQTIXX.js} +9 -9
  20. package/dist/{chunk-DTFU3ZTD.js.map → chunk-6NBQTIXX.js.map} +1 -1
  21. package/dist/{chunk-CVEI4RQP.js → chunk-6NEESZVO.js} +4 -4
  22. package/dist/{chunk-CVEI4RQP.js.map → chunk-6NEESZVO.js.map} +1 -1
  23. package/dist/{chunk-CKY2QIRR.js → chunk-6UUFPSAR.js} +4 -4
  24. package/dist/{chunk-CKY2QIRR.js.map → chunk-6UUFPSAR.js.map} +1 -1
  25. package/dist/{chunk-DJHNSBIR.mjs → chunk-7LIJTAIF.mjs} +31 -31
  26. package/dist/{chunk-DJHNSBIR.mjs.map → chunk-7LIJTAIF.mjs.map} +1 -1
  27. package/dist/{chunk-4MNKVDTJ.mjs → chunk-A5M7SPPG.mjs} +4 -4
  28. package/dist/{chunk-4MNKVDTJ.mjs.map → chunk-A5M7SPPG.mjs.map} +1 -1
  29. package/dist/{chunk-FV42SSLP.js → chunk-A5OMGPMR.js} +4 -4
  30. package/dist/{chunk-FV42SSLP.js.map → chunk-A5OMGPMR.js.map} +1 -1
  31. package/dist/{chunk-VWZ53TE2.js → chunk-BN4BKFE2.js} +9 -9
  32. package/dist/{chunk-VWZ53TE2.js.map → chunk-BN4BKFE2.js.map} +1 -1
  33. package/dist/{chunk-4Z5NZINA.js → chunk-C4UYEHPY.js} +136 -136
  34. package/dist/chunk-C4UYEHPY.js.map +1 -0
  35. package/dist/{chunk-54T5F65C.js → chunk-CPTHSYM2.js} +17 -17
  36. package/dist/{chunk-54T5F65C.js.map → chunk-CPTHSYM2.js.map} +1 -1
  37. package/dist/{chunk-3VCSMSJB.mjs → chunk-EZVBRLQH.mjs} +9 -9
  38. package/dist/{chunk-3VCSMSJB.mjs.map → chunk-EZVBRLQH.mjs.map} +1 -1
  39. package/dist/{chunk-4QCO4CBC.mjs → chunk-F3PQ5EFQ.mjs} +4 -4
  40. package/dist/{chunk-4QCO4CBC.mjs.map → chunk-F3PQ5EFQ.mjs.map} +1 -1
  41. package/dist/{chunk-RUZPOHJW.js → chunk-GD3YV46U.js} +41 -41
  42. package/dist/{chunk-RUZPOHJW.js.map → chunk-GD3YV46U.js.map} +1 -1
  43. package/dist/{chunk-Y65X2NHF.mjs → chunk-I6ULYJR4.mjs} +3 -3
  44. package/dist/{chunk-Y65X2NHF.mjs.map → chunk-I6ULYJR4.mjs.map} +1 -1
  45. package/dist/{chunk-YHD6SJIN.mjs → chunk-JJUWZNJY.mjs} +4 -4
  46. package/dist/{chunk-YHD6SJIN.mjs.map → chunk-JJUWZNJY.mjs.map} +1 -1
  47. package/dist/{chunk-VPRAESA7.mjs → chunk-KDDXDQR2.mjs} +3 -3
  48. package/dist/{chunk-VPRAESA7.mjs.map → chunk-KDDXDQR2.mjs.map} +1 -1
  49. package/dist/{chunk-UPWJRCAD.js → chunk-KRS2CLPR.js} +223 -229
  50. package/dist/chunk-KRS2CLPR.js.map +1 -0
  51. package/dist/{chunk-RWZ2PLMQ.js → chunk-KZDABEML.js} +211 -154
  52. package/dist/chunk-KZDABEML.js.map +1 -0
  53. package/dist/{chunk-TRNDFSM6.mjs → chunk-MSXJFWKD.mjs} +28 -28
  54. package/dist/chunk-MSXJFWKD.mjs.map +1 -0
  55. package/dist/{chunk-EBARYRSA.js → chunk-MXQ2EYG2.js} +19 -2
  56. package/dist/chunk-MXQ2EYG2.js.map +1 -0
  57. package/dist/{chunk-RMPXGEFL.mjs → chunk-NNR44MM5.mjs} +7 -7
  58. package/dist/{chunk-RMPXGEFL.mjs.map → chunk-NNR44MM5.mjs.map} +1 -1
  59. package/dist/{chunk-AC54BNSK.js → chunk-NQCFGIWC.js} +13 -13
  60. package/dist/{chunk-AC54BNSK.js.map → chunk-NQCFGIWC.js.map} +1 -1
  61. package/dist/{chunk-7IAWXG43.js → chunk-OQM252SM.js} +33 -33
  62. package/dist/{chunk-7IAWXG43.js.map → chunk-OQM252SM.js.map} +1 -1
  63. package/dist/{chunk-VCL5LDS5.js → chunk-PADXORD2.js} +38 -38
  64. package/dist/{chunk-VCL5LDS5.js.map → chunk-PADXORD2.js.map} +1 -1
  65. package/dist/{chunk-SCGICCQM.mjs → chunk-PSS3E463.mjs} +7 -10
  66. package/dist/chunk-PSS3E463.mjs.map +1 -0
  67. package/dist/{chunk-QEACOJXX.mjs → chunk-QCGSE24W.mjs} +139 -83
  68. package/dist/chunk-QCGSE24W.mjs.map +1 -0
  69. package/dist/{chunk-ZPV7X4ZE.mjs → chunk-RH6Z425K.mjs} +6 -6
  70. package/dist/{chunk-ZPV7X4ZE.mjs.map → chunk-RH6Z425K.mjs.map} +1 -1
  71. package/dist/{chunk-RSCRIDMW.mjs → chunk-SMUBE3RO.mjs} +46 -52
  72. package/dist/chunk-SMUBE3RO.mjs.map +1 -0
  73. package/dist/{chunk-WX44DAQD.mjs → chunk-TQADF23S.mjs} +3 -3
  74. package/dist/{chunk-WX44DAQD.mjs.map → chunk-TQADF23S.mjs.map} +1 -1
  75. package/dist/{chunk-B3TA74C4.js → chunk-WG26KW6D.js} +57 -60
  76. package/dist/chunk-WG26KW6D.js.map +1 -0
  77. package/dist/{chunk-UUTTS3VV.mjs → chunk-WGS65S7S.mjs} +8 -11
  78. package/dist/chunk-WGS65S7S.mjs.map +1 -0
  79. package/dist/{chunk-ULSG4JLR.js → chunk-XJJZ6DHE.js} +6 -6
  80. package/dist/{chunk-ULSG4JLR.js.map → chunk-XJJZ6DHE.js.map} +1 -1
  81. package/dist/{chunk-XYMHIZ3K.mjs → chunk-ZBX7UCAP.mjs} +7 -7
  82. package/dist/{chunk-XYMHIZ3K.mjs.map → chunk-ZBX7UCAP.mjs.map} +1 -1
  83. package/dist/index.d.mts +77 -7
  84. package/dist/index.d.ts +77 -7
  85. package/dist/index.js +707 -703
  86. package/dist/index.mjs +2 -2
  87. package/dist/platform/admin/index.js +11 -11
  88. package/dist/platform/admin/index.mjs +5 -5
  89. package/dist/platform/agents-workspace.js +8 -8
  90. package/dist/platform/agents-workspace.mjs +7 -7
  91. package/dist/platform/app-shell.js +4 -4
  92. package/dist/platform/app-shell.mjs +3 -3
  93. package/dist/platform/auth/index.js +28 -28
  94. package/dist/platform/auth/index.mjs +5 -5
  95. package/dist/platform/billing/index.js +6 -6
  96. package/dist/platform/billing/index.mjs +4 -4
  97. package/dist/platform/impersonation/index.js +4 -4
  98. package/dist/platform/impersonation/index.mjs +3 -3
  99. package/dist/platform/index.js +93 -93
  100. package/dist/platform/index.mjs +21 -21
  101. package/dist/platform/pages/index.d.mts +103 -1
  102. package/dist/platform/pages/index.d.ts +103 -1
  103. package/dist/platform/pages/index.js +1756 -1429
  104. package/dist/platform/pages/index.js.map +1 -1
  105. package/dist/platform/pages/index.mjs +1458 -1137
  106. package/dist/platform/pages/index.mjs.map +1 -1
  107. package/dist/platform/settings/index.js +8 -8
  108. package/dist/platform/settings/index.mjs +7 -7
  109. package/dist/platform/workflow-canvas-shell.js +6 -6
  110. package/dist/platform/workflow-canvas-shell.mjs +5 -5
  111. package/package.json +1 -1
  112. package/dist/chunk-4Z5NZINA.js.map +0 -1
  113. package/dist/chunk-B3TA74C4.js.map +0 -1
  114. package/dist/chunk-EBARYRSA.js.map +0 -1
  115. package/dist/chunk-O4RZCDP2.mjs.map +0 -1
  116. package/dist/chunk-QEACOJXX.mjs.map +0 -1
  117. package/dist/chunk-RPNMDGRA.js.map +0 -1
  118. package/dist/chunk-RSCRIDMW.mjs.map +0 -1
  119. package/dist/chunk-RWZ2PLMQ.js.map +0 -1
  120. package/dist/chunk-SCGICCQM.mjs.map +0 -1
  121. package/dist/chunk-TRNDFSM6.mjs.map +0 -1
  122. package/dist/chunk-UPWJRCAD.js.map +0 -1
  123. package/dist/chunk-UUTTS3VV.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkRWZ2PLMQ_js = require('./chunk-RWZ2PLMQ.js');
4
+ var chunkKZDABEML_js = require('./chunk-KZDABEML.js');
5
5
  var chunkY5VN4SPH_js = require('./chunk-Y5VN4SPH.js');
6
- var chunkEBARYRSA_js = require('./chunk-EBARYRSA.js');
6
+ var chunkMXQ2EYG2_js = require('./chunk-MXQ2EYG2.js');
7
7
  var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
8
8
  var react = require('react');
9
9
  var outline = require('@heroicons/react/24/outline');
@@ -62,13 +62,13 @@ function MembersTabContent({
62
62
  };
63
63
  if (isLoading) {
64
64
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400", children: [
65
- /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.InlineSpinner, {}),
65
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.InlineSpinner, {}),
66
66
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.members.loading") })
67
67
  ] });
68
68
  }
69
69
  if (members.length === 0) {
70
70
  return /* @__PURE__ */ jsxRuntime.jsx(
71
- chunkRWZ2PLMQ_js.EmptyState,
71
+ chunkKZDABEML_js.EmptyState,
72
72
  {
73
73
  message: t("admin.organizationDetail.members.emptyMessage"),
74
74
  description: t("admin.organizationDetail.members.emptyDescription"),
@@ -78,11 +78,11 @@ function MembersTabContent({
78
78
  );
79
79
  }
80
80
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
81
- /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.ListCard, { children: members.map((member) => /* @__PURE__ */ jsxRuntime.jsx(
82
- chunkRWZ2PLMQ_js.ListCardItem,
81
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.ListCard, { children: members.map((member) => /* @__PURE__ */ jsxRuntime.jsx(
82
+ chunkKZDABEML_js.ListCardItem,
83
83
  {
84
84
  leading: /* @__PURE__ */ jsxRuntime.jsx(
85
- chunkRWZ2PLMQ_js.Avatar,
85
+ chunkKZDABEML_js.Avatar,
86
86
  {
87
87
  src: member.image,
88
88
  initials: (member.name ?? member.email).slice(0, 2).toUpperCase(),
@@ -90,7 +90,7 @@ function MembersTabContent({
90
90
  }
91
91
  ),
92
92
  trailing: member.role !== "owner" ? /* @__PURE__ */ jsxRuntime.jsx(
93
- chunkEBARYRSA_js.Button,
93
+ chunkMXQ2EYG2_js.Button,
94
94
  {
95
95
  size: "sm",
96
96
  color: "ios-glass-red",
@@ -105,13 +105,13 @@ function MembersTabContent({
105
105
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-sm font-medium text-slate-900 dark:text-white", children: member.name ?? member.email }),
106
106
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-xs text-slate-500 dark:text-slate-400", children: member.email })
107
107
  ] }),
108
- /* @__PURE__ */ jsxRuntime.jsx(chunkEBARYRSA_js.Badge, { color: roleBadgeColor(member.role), children: member.role })
108
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMXQ2EYG2_js.Badge, { color: roleBadgeColor(member.role), children: member.role })
109
109
  ] })
110
110
  },
111
111
  member.id
112
112
  )) }),
113
113
  /* @__PURE__ */ jsxRuntime.jsx(
114
- chunkRWZ2PLMQ_js.DynamicIslandConfirm,
114
+ chunkKZDABEML_js.DynamicIslandConfirm,
115
115
  {
116
116
  open: removeTarget !== null,
117
117
  onClose: handleRemoveCancel,
@@ -196,14 +196,14 @@ function InvitationsTabContent({
196
196
  const roleOptions = ["viewer", "member", "admin", "owner"];
197
197
  if (isLoading) {
198
198
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400", children: [
199
- /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.InlineSpinner, {}),
199
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.InlineSpinner, {}),
200
200
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.invitations.loading") })
201
201
  ] });
202
202
  }
203
203
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
204
204
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
205
205
  /* @__PURE__ */ jsxRuntime.jsxs(
206
- chunkEBARYRSA_js.Button,
206
+ chunkMXQ2EYG2_js.Button,
207
207
  {
208
208
  color: "ios-glass-blue",
209
209
  onClick: handleOpenInviteSheet,
@@ -215,18 +215,18 @@ function InvitationsTabContent({
215
215
  }
216
216
  ),
217
217
  invitations.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
218
- chunkRWZ2PLMQ_js.EmptyState,
218
+ chunkKZDABEML_js.EmptyState,
219
219
  {
220
220
  message: t("admin.organizationDetail.invitations.emptyMessage"),
221
221
  description: t("admin.organizationDetail.invitations.emptyDescription"),
222
222
  icon: outline.EnvelopeIcon,
223
223
  variant: "card"
224
224
  }
225
- ) : /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.ListCard, { children: invitations.map((invitation) => /* @__PURE__ */ jsxRuntime.jsx(
226
- chunkRWZ2PLMQ_js.ListCardItem,
225
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.ListCard, { children: invitations.map((invitation) => /* @__PURE__ */ jsxRuntime.jsx(
226
+ chunkKZDABEML_js.ListCardItem,
227
227
  {
228
228
  leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(outline.EnvelopeIcon, { className: "h-5 w-5 text-white" }) }),
229
- trailing: /* @__PURE__ */ jsxRuntime.jsx(chunkEBARYRSA_js.Badge, { color: statusBadgeColor(invitation.status), children: invitation.status }),
229
+ trailing: /* @__PURE__ */ jsxRuntime.jsx(chunkMXQ2EYG2_js.Badge, { color: statusBadgeColor(invitation.status), children: invitation.status }),
230
230
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
231
231
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-slate-900 dark:text-white", children: invitation.email }),
232
232
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-0.5 text-xs text-slate-500 dark:text-slate-400", children: [
@@ -243,7 +243,7 @@ function InvitationsTabContent({
243
243
  )) })
244
244
  ] }),
245
245
  /* @__PURE__ */ jsxRuntime.jsx(
246
- chunkRWZ2PLMQ_js.Sheet,
246
+ chunkKZDABEML_js.Sheet,
247
247
  {
248
248
  open: isInviteSheetOpen,
249
249
  onClose: handleCloseInviteSheet,
@@ -252,7 +252,7 @@ function InvitationsTabContent({
252
252
  size: "md",
253
253
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
254
254
  /* @__PURE__ */ jsxRuntime.jsx(
255
- chunkRWZ2PLMQ_js.Input,
255
+ chunkKZDABEML_js.Input,
256
256
  {
257
257
  label: t("admin.organizationDetail.invitations.emailLabel"),
258
258
  type: "email",
@@ -266,13 +266,10 @@ function InvitationsTabContent({
266
266
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
267
267
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1.5 block text-sm font-medium text-slate-900 dark:text-white", children: t("admin.organizationDetail.invitations.roleSelectLabel") }),
268
268
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-2", children: roleOptions.map((role) => /* @__PURE__ */ jsxRuntime.jsx(
269
- "button",
269
+ chunkKZDABEML_js.PickerTile,
270
270
  {
271
- type: "button",
272
- onClick: () => {
273
- setInviteRole(role);
274
- chunkUZ3CMNUJ_js.triggerHaptic("light");
275
- },
271
+ selected: inviteRole === role,
272
+ onClick: () => setInviteRole(role),
276
273
  className: `rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${inviteRole === role ? "border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100" : "border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]"}`,
277
274
  children: role
278
275
  },
@@ -281,7 +278,7 @@ function InvitationsTabContent({
281
278
  ] }),
282
279
  inviteError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: inviteError }),
283
280
  /* @__PURE__ */ jsxRuntime.jsx(
284
- chunkEBARYRSA_js.Button,
281
+ chunkMXQ2EYG2_js.Button,
285
282
  {
286
283
  color: "ios-glass-blue",
287
284
  fullWidth: true,
@@ -367,14 +364,14 @@ function DomainsTabContent({
367
364
  }, [client, organizationId, fetchDomains]);
368
365
  if (isLoading) {
369
366
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400", children: [
370
- /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.InlineSpinner, {}),
367
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.InlineSpinner, {}),
371
368
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.domains.loading") })
372
369
  ] });
373
370
  }
374
371
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
375
372
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
376
373
  /* @__PURE__ */ jsxRuntime.jsxs(
377
- chunkEBARYRSA_js.Button,
374
+ chunkMXQ2EYG2_js.Button,
378
375
  {
379
376
  color: "ios-glass-blue",
380
377
  onClick: handleOpenAddSheet,
@@ -386,19 +383,19 @@ function DomainsTabContent({
386
383
  }
387
384
  ),
388
385
  domains.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
389
- chunkRWZ2PLMQ_js.EmptyState,
386
+ chunkKZDABEML_js.EmptyState,
390
387
  {
391
388
  message: t("admin.organizationDetail.domains.emptyMessage"),
392
389
  description: t("admin.organizationDetail.domains.emptyDescription"),
393
390
  icon: outline.GlobeAltIcon,
394
391
  variant: "card"
395
392
  }
396
- ) : /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.ListCard, { children: domains.map((domain) => /* @__PURE__ */ jsxRuntime.jsx(
397
- chunkRWZ2PLMQ_js.ListCardItem,
393
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.ListCard, { children: domains.map((domain) => /* @__PURE__ */ jsxRuntime.jsx(
394
+ chunkKZDABEML_js.ListCardItem,
398
395
  {
399
396
  leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${domain.verified ? "bg-gradient-to-br from-emerald-500 to-green-600" : "bg-gradient-to-br from-amber-500 to-orange-600"}`, children: domain.verified ? /* @__PURE__ */ jsxRuntime.jsx(outline.CheckCircleIcon, { className: "h-5 w-5 text-white" }) : /* @__PURE__ */ jsxRuntime.jsx(outline.GlobeAltIcon, { className: "h-5 w-5 text-white" }) }),
400
397
  trailing: !domain.verified ? /* @__PURE__ */ jsxRuntime.jsxs(
401
- chunkEBARYRSA_js.Button,
398
+ chunkMXQ2EYG2_js.Button,
402
399
  {
403
400
  size: "sm",
404
401
  color: "ios-glass-blue",
@@ -410,7 +407,7 @@ function DomainsTabContent({
410
407
  t("admin.organizationDetail.domains.verifyButton")
411
408
  ]
412
409
  }
413
- ) : /* @__PURE__ */ jsxRuntime.jsx(chunkRWZ2PLMQ_js.StatusBadge, { status: "active", label: t("admin.organizationDetail.domains.verifiedLabel"), size: "sm" }),
410
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKZDABEML_js.StatusBadge, { status: "active", label: t("admin.organizationDetail.domains.verifiedLabel"), size: "sm" }),
414
411
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
415
412
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-slate-900 dark:text-white", children: domain.domain }),
416
413
  domain.autoJoinEnabled && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-xs text-slate-500 dark:text-slate-400", children: t("admin.organizationDetail.domains.autoJoinEnabled") })
@@ -420,7 +417,7 @@ function DomainsTabContent({
420
417
  )) })
421
418
  ] }),
422
419
  /* @__PURE__ */ jsxRuntime.jsx(
423
- chunkRWZ2PLMQ_js.Sheet,
420
+ chunkKZDABEML_js.Sheet,
424
421
  {
425
422
  open: isAddSheetOpen,
426
423
  onClose: handleCloseAddSheet,
@@ -429,7 +426,7 @@ function DomainsTabContent({
429
426
  size: "md",
430
427
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
431
428
  /* @__PURE__ */ jsxRuntime.jsx(
432
- chunkRWZ2PLMQ_js.Input,
429
+ chunkKZDABEML_js.Input,
433
430
  {
434
431
  label: t("admin.organizationDetail.domains.domainLabel"),
435
432
  value: newDomain,
@@ -441,7 +438,7 @@ function DomainsTabContent({
441
438
  ),
442
439
  addError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: addError }),
443
440
  /* @__PURE__ */ jsxRuntime.jsx(
444
- chunkEBARYRSA_js.Button,
441
+ chunkMXQ2EYG2_js.Button,
445
442
  {
446
443
  color: "ios-glass-blue",
447
444
  fullWidth: true,
@@ -467,7 +464,7 @@ function AdminOrganizationDetail({
467
464
  label: t(`admin.organizationDetail.tabs.${tab}`)
468
465
  }));
469
466
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: /* @__PURE__ */ jsxRuntime.jsx(
470
- chunkRWZ2PLMQ_js.SectionCard,
467
+ chunkKZDABEML_js.SectionCard,
471
468
  {
472
469
  header: {
473
470
  icon: /* @__PURE__ */ jsxRuntime.jsx(outline.UsersIcon, { className: "h-5 w-5 text-white" }),
@@ -475,7 +472,7 @@ function AdminOrganizationDetail({
475
472
  subtitle: organization.description ?? t("admin.organizationDetail.defaultSubtitle"),
476
473
  gradient: "from-emerald-500 via-teal-500 to-cyan-500",
477
474
  rightContent: /* @__PURE__ */ jsxRuntime.jsx(
478
- chunkRWZ2PLMQ_js.StatusBadge,
475
+ chunkKZDABEML_js.StatusBadge,
479
476
  {
480
477
  status: organization.enabled ? "active" : "inactive",
481
478
  label: organization.enabled ? t("admin.organizationDetail.statusEnabled") : t("admin.organizationDetail.statusDisabled"),
@@ -485,7 +482,7 @@ function AdminOrganizationDetail({
485
482
  },
486
483
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
487
484
  /* @__PURE__ */ jsxRuntime.jsx(
488
- chunkRWZ2PLMQ_js.SegmentedControl,
485
+ chunkKZDABEML_js.SegmentedControl,
489
486
  {
490
487
  segments,
491
488
  value: activeTab,
@@ -502,5 +499,5 @@ function AdminOrganizationDetail({
502
499
  }
503
500
 
504
501
  exports.AdminOrganizationDetail = AdminOrganizationDetail;
505
- //# sourceMappingURL=chunk-RPNMDGRA.js.map
506
- //# sourceMappingURL=chunk-RPNMDGRA.js.map
502
+ //# sourceMappingURL=chunk-2QZFKQP6.js.map
503
+ //# sourceMappingURL=chunk-2QZFKQP6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/admin/admin-organization-detail.tsx"],"names":["useTranslations","useState","useCallback","useEffect","triggerHaptic","jsxs","jsx","InlineSpinner","EmptyState","UsersIcon","Fragment","ListCard","ListCardItem","Avatar","Button","TrashIcon","Badge","DynamicIslandConfirm","useFormatter","PlusIcon","EnvelopeIcon","Sheet","Input","PickerTile","GlobeAltIcon","CheckCircleIcon","ArrowPathIcon","StatusBadge","SectionCard","SegmentedControl"],"mappings":"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","file":"chunk-2QZFKQP6.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n SegmentedControl,\n ListCard,\n ListCardItem,\n Button,\n Input,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n Avatar,\n PickerTile,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n EnvelopeIcon,\n GlobeAltIcon,\n PlusIcon,\n TrashIcon,\n CheckCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport type {\n AuthOrganizationDomain,\n AuthOrganizationInvitation,\n} from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationDetailProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationDetailProps,\n AdminOrganizationDetailTab,\n AdminOrganizationMember,\n AdminCreateInvitationInput,\n} from '@datatechsolutions/shared-domain'\nimport type { AuthOrganizationRole } from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: AdminOrganizationDetailTab[] = ['members', 'invitations', 'domains']\n\n// ── Members Tab ─────────────────────────────────────────────────────────────\n\nfunction MembersTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [members, setMembers] = useState<AdminOrganizationMember[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [removeTarget, setRemoveTarget] = useState<AdminOrganizationMember | null>(null)\n\n const fetchMembers = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationMembers(organizationId)\n setMembers(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchMembers()\n }, [fetchMembers])\n\n const handleRemoveRequest = useCallback((member: AdminOrganizationMember) => {\n triggerHaptic('warning')\n setRemoveTarget(member)\n }, [])\n\n const handleRemoveConfirm = useCallback(async () => {\n if (!removeTarget) return\n setRemovingId(removeTarget.id)\n triggerHaptic('medium')\n try {\n await client.removeOrganizationMember(organizationId, removeTarget.id)\n setRemoveTarget(null)\n triggerHaptic('success')\n fetchMembers()\n } catch {\n triggerHaptic('error')\n } finally {\n setRemovingId(null)\n }\n }, [removeTarget, client, organizationId, fetchMembers])\n\n const handleRemoveCancel = useCallback(() => {\n triggerHaptic('light')\n setRemoveTarget(null)\n }, [])\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n return 'zinc' as const\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.members.loading')}</span>\n </div>\n )\n }\n\n if (members.length === 0) {\n return (\n <EmptyState\n message={t('admin.organizationDetail.members.emptyMessage')}\n description={t('admin.organizationDetail.members.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n )\n }\n\n return (\n <>\n <ListCard>\n {members.map((member) => (\n <ListCardItem\n key={member.id}\n leading={\n <Avatar\n src={(member as unknown as { image?: string }).image}\n initials={(member.name ?? member.email).slice(0, 2).toUpperCase()}\n alt={member.name ?? member.email}\n />\n }\n trailing={\n member.role !== 'owner' ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRemoveRequest(member)}\n loading={removingId === member.id}\n disabled={removingId !== null}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n ) : undefined\n }\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-slate-900 dark:text-white\">\n {member.name ?? member.email}\n </p>\n <p className=\"truncate text-xs text-slate-500 dark:text-slate-400\">\n {member.email}\n </p>\n </div>\n <Badge color={roleBadgeColor(member.role)}>{member.role}</Badge>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n\n <DynamicIslandConfirm\n open={removeTarget !== null}\n onClose={handleRemoveCancel}\n onConfirm={handleRemoveConfirm}\n title={t('admin.organizationDetail.members.removeConfirmTitle', { name: removeTarget?.name ?? removeTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizationDetail.members.removeConfirmButton')}\n cancelLabel={t('admin.organizationDetail.members.removeCancelButton')}\n />\n </>\n )\n}\n\n// ── Invitations Tab ─────────────────────────────────────────────────────────\n\nfunction InvitationsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [invitations, setInvitations] = useState<AuthOrganizationInvitation[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isInviteSheetOpen, setIsInviteSheetOpen] = useState(false)\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<AuthOrganizationRole>('member')\n const [isInviting, setIsInviting] = useState(false)\n const [inviteError, setInviteError] = useState<string | null>(null)\n\n const fetchInvitations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationInvitations(organizationId)\n setInvitations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchInvitations()\n }, [fetchInvitations])\n\n const handleOpenInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setInviteEmail('')\n setInviteRole('member')\n setInviteError(null)\n setIsInviteSheetOpen(true)\n }, [])\n\n const handleCloseInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setIsInviteSheetOpen(false)\n }, [])\n\n const handleSendInvitation = useCallback(async () => {\n if (!inviteEmail.trim()) {\n setInviteError(t('admin.organizationDetail.invitations.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setInviteError(null)\n setIsInviting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateInvitationInput = {\n email: inviteEmail.trim().toLowerCase(),\n role: inviteRole,\n }\n await client.createOrganizationInvitation(organizationId, data)\n triggerHaptic('success')\n setIsInviteSheetOpen(false)\n fetchInvitations()\n } catch {\n setInviteError(t('admin.organizationDetail.invitations.errorSendFailed'))\n triggerHaptic('error')\n } finally {\n setIsInviting(false)\n }\n }, [inviteEmail, inviteRole, client, organizationId, fetchInvitations, t])\n\n const statusBadgeColor = (status: string) => {\n if (status === 'accepted') return 'green' as const\n if (status === 'pending') return 'amber' as const\n if (status === 'revoked' || status === 'expired') return 'red' as const\n return 'zinc' as const\n }\n\n const roleOptions: AuthOrganizationRole[] = ['viewer', 'member', 'admin', 'owner']\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.invitations.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenInviteSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.invitations.inviteButton')}\n </Button>\n\n {invitations.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.invitations.emptyMessage')}\n description={t('admin.organizationDetail.invitations.emptyDescription')}\n icon={EnvelopeIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {invitations.map((invitation) => (\n <ListCardItem\n key={invitation.id}\n leading={\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm\">\n <EnvelopeIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <Badge color={statusBadgeColor(invitation.status)}>{invitation.status}</Badge>\n }\n >\n <div>\n <p className=\"text-sm font-medium text-slate-900 dark:text-white\">\n {invitation.email}\n </p>\n <p className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n {t('admin.organizationDetail.invitations.roleLabel', { role: invitation.role })}\n {' · '}\n {format.dateTime(new Date(invitation.createdAt), {\n month: 'short',\n day: 'numeric',\n })}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Invite sheet */}\n <Sheet\n open={isInviteSheetOpen}\n onClose={handleCloseInviteSheet}\n title={t('admin.organizationDetail.invitations.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.invitations.emailLabel')}\n type=\"email\"\n value={inviteEmail}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setInviteEmail(event.target.value)}\n placeholder={t('admin.organizationDetail.invitations.emailPlaceholder')}\n disabled={isInviting}\n autoFocus\n />\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-slate-900 dark:text-white\">\n {t('admin.organizationDetail.invitations.roleSelectLabel')}\n </label>\n <div className=\"grid grid-cols-4 gap-2\">\n {roleOptions.map((role) => (\n <PickerTile\n key={role}\n selected={inviteRole === role}\n onClick={() => setInviteRole(role)}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n inviteRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </PickerTile>\n ))}\n </div>\n </div>\n\n {inviteError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{inviteError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendInvitation}\n loading={isInviting}\n disabled={isInviting || !inviteEmail.trim()}\n >\n {t('admin.organizationDetail.invitations.sendButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── Domains Tab ─────────────────────────────────────────────────────────────\n\nfunction DomainsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [domains, setDomains] = useState<AuthOrganizationDomain[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isAddSheetOpen, setIsAddSheetOpen] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [isAdding, setIsAdding] = useState(false)\n const [addError, setAddError] = useState<string | null>(null)\n const [verifyingDomain, setVerifyingDomain] = useState<string | null>(null)\n\n const fetchDomains = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationDomains(organizationId)\n setDomains(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchDomains()\n }, [fetchDomains])\n\n const handleOpenAddSheet = useCallback(() => {\n triggerHaptic('light')\n setNewDomain('')\n setAddError(null)\n setIsAddSheetOpen(true)\n }, [])\n\n const handleCloseAddSheet = useCallback(() => {\n triggerHaptic('light')\n setIsAddSheetOpen(false)\n }, [])\n\n const handleAddDomain = useCallback(async () => {\n if (!newDomain.trim()) {\n setAddError(t('admin.organizationDetail.domains.errorDomainRequired'))\n triggerHaptic('error')\n return\n }\n\n setAddError(null)\n setIsAdding(true)\n triggerHaptic('light')\n\n try {\n await client.addOrganizationDomain(organizationId, newDomain.trim().toLowerCase())\n triggerHaptic('success')\n setIsAddSheetOpen(false)\n fetchDomains()\n } catch {\n setAddError(t('admin.organizationDetail.domains.errorAddFailed'))\n triggerHaptic('error')\n } finally {\n setIsAdding(false)\n }\n }, [newDomain, client, organizationId, fetchDomains, t])\n\n const handleVerifyDomain = useCallback(async (domain: string) => {\n setVerifyingDomain(domain)\n triggerHaptic('light')\n try {\n await client.verifyOrganizationDomain(organizationId, domain)\n triggerHaptic('success')\n fetchDomains()\n } catch {\n triggerHaptic('error')\n } finally {\n setVerifyingDomain(null)\n }\n }, [client, organizationId, fetchDomains])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.domains.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenAddSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.domains.addButton')}\n </Button>\n\n {domains.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.domains.emptyMessage')}\n description={t('admin.organizationDetail.domains.emptyDescription')}\n icon={GlobeAltIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {domains.map((domain) => (\n <ListCardItem\n key={domain.id}\n leading={\n <div className={`flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${\n domain.verified\n ? 'bg-gradient-to-br from-emerald-500 to-green-600'\n : 'bg-gradient-to-br from-amber-500 to-orange-600'\n }`}>\n {domain.verified\n ? <CheckCircleIcon className=\"h-5 w-5 text-white\" />\n : <GlobeAltIcon className=\"h-5 w-5 text-white\" />\n }\n </div>\n }\n trailing={\n !domain.verified ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleVerifyDomain(domain.domain)}\n loading={verifyingDomain === domain.domain}\n disabled={verifyingDomain !== null}\n >\n <ArrowPathIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.organizationDetail.domains.verifyButton')}\n </Button>\n ) : (\n <StatusBadge status=\"active\" label={t('admin.organizationDetail.domains.verifiedLabel')} size=\"sm\" />\n )\n }\n >\n <div>\n <p className=\"text-sm font-medium text-slate-900 dark:text-white\">\n {domain.domain}\n </p>\n {domain.autoJoinEnabled && (\n <p className=\"mt-0.5 text-xs text-slate-500 dark:text-slate-400\">\n {t('admin.organizationDetail.domains.autoJoinEnabled')}\n </p>\n )}\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Add domain sheet */}\n <Sheet\n open={isAddSheetOpen}\n onClose={handleCloseAddSheet}\n title={t('admin.organizationDetail.domains.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.domains.domainLabel')}\n value={newDomain}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewDomain(event.target.value)}\n placeholder={t('admin.organizationDetail.domains.domainPlaceholder')}\n disabled={isAdding}\n autoFocus\n />\n\n {addError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{addError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleAddDomain}\n loading={isAdding}\n disabled={isAdding || !newDomain.trim()}\n >\n {t('admin.organizationDetail.domains.addDomainButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── AdminOrganizationDetail ─────────────────────────────────────────────────\n\nexport function AdminOrganizationDetail({\n organization,\n client,\n}: AdminOrganizationDetailProps) {\n const t = useTranslations('windsock')\n\n const [activeTab, setActiveTab] = useState<AdminOrganizationDetailTab>('members')\n\n const segments = ALL_TABS.map((tab) => ({\n value: tab,\n label: t(`admin.organizationDetail.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {/* Organization header */}\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: organization.displayName ?? organization.name,\n subtitle: organization.description ?? t('admin.organizationDetail.defaultSubtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: (\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled\n ? t('admin.organizationDetail.statusEnabled')\n : t('admin.organizationDetail.statusDisabled')}\n size=\"sm\"\n />\n ),\n }}\n >\n <div className=\"space-y-4\">\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as AdminOrganizationDetailTab)}\n fullWidth\n />\n\n {activeTab === 'members' && (\n <MembersTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'invitations' && (\n <InvitationsTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'domains' && (\n <DomainsTabContent organizationId={organization.id} client={client} />\n )}\n </div>\n </SectionCard>\n </div>\n )\n}\n"]}
@@ -340,6 +340,20 @@ var iosColors2 = {
340
340
  "text-white [--btn-bg:#5AC8FA] [--btn-border:#4AB8E8] [--btn-hover-overlay:var(--color-white)]/10",
341
341
  "dark:[--btn-bg:#64D2FF] dark:[--btn-border:#5AC8FA]",
342
342
  "[--btn-icon:var(--color-white)]/80"
343
+ ],
344
+ // iOS fuchsia (used by IconButton ghost for accent affordances —
345
+ // see DraggableCommandBar, WorkflowListBar convert-to-subworkflow).
346
+ "ios-fuchsia": [
347
+ "text-white [--btn-bg:#FF2D55] [--btn-border:#E62950] [--btn-hover-overlay:var(--color-white)]/10",
348
+ "dark:[--btn-bg:#FF375F] dark:[--btn-border:#FF2D55]",
349
+ "[--btn-icon:var(--color-white)]/80"
350
+ ],
351
+ // iOS amber (rare ghost-only accent for warnings / "experimental"
352
+ // affordances in canvas chrome).
353
+ "ios-amber": [
354
+ "text-white [--btn-bg:#FFCC00] [--btn-border:#E6B800] [--btn-hover-overlay:var(--color-white)]/10",
355
+ "dark:[--btn-bg:#FFD60A] dark:[--btn-border:#FFCC00]",
356
+ "[--btn-icon:var(--color-white)]/80"
343
357
  ]
344
358
  };
345
359
  var sizeStyles = {
@@ -765,6 +779,9 @@ function IconButton({
765
779
  isIosColor && finalColor === "ios-green" && "text-[#34C759] dark:text-[#30D158]",
766
780
  isIosColor && finalColor === "ios-orange" && "text-[#FF9500] dark:text-[#FF9F0A]",
767
781
  isIosColor && finalColor === "ios-purple" && "text-[#AF52DE] dark:text-[#BF5AF2]",
782
+ isIosColor && finalColor === "ios-teal" && "text-teal-600 dark:text-teal-400 hover:text-teal-700 dark:hover:text-teal-300",
783
+ isIosColor && finalColor === "ios-fuchsia" && "text-fuchsia-600 dark:text-fuchsia-400 hover:text-fuchsia-700 dark:hover:text-fuchsia-300",
784
+ isIosColor && finalColor === "ios-amber" && "text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-300",
768
785
  !isIosColor && "text-slate-700 dark:text-slate-300"
769
786
  ),
770
787
  outline: clsx(
@@ -930,5 +947,5 @@ forwardRef(function BadgeButton2({
930
947
  });
931
948
 
932
949
  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-O4RZCDP2.mjs.map
934
- //# sourceMappingURL=chunk-O4RZCDP2.mjs.map
950
+ //# sourceMappingURL=chunk-2SBVFLPZ.mjs.map
951
+ //# sourceMappingURL=chunk-2SBVFLPZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/motion-tokens.ts","../src/lib/animations.ts","../src/components/link.tsx","../src/components/button-styles.ts","../src/components/button.tsx","../src/components/badge.tsx"],"names":["Link","iosColors","forwardRef","Button","jsx","HeadlessButton","clsx","jsxs","BadgeButton","Headless2"],"mappings":"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","file":"chunk-2SBVFLPZ.mjs","sourcesContent":["/**\n * Motion tokens — the canonical source for animation timing in the\n * design system. Every component that animates anything reads from\n * here: there are no hard-coded durations or spring stiffness/damping\n * pairs anywhere else in the package.\n *\n * The tokens come in three layers:\n * 1. `duration` (ms) — for CSS transitions + framer-motion `duration`\n * 2. `ease` (cubic-bezier arrays) — for keyframe easing\n * 3. `spring` (typed framer-motion Transition objects) — for spring physics\n *\n * Naming is intent-based, not numeric:\n * - duration: xs / sm / md / lg (micro-feedback → page enter)\n * - ease: standard / emphasized / decelerate / accelerate / ios\n * - spring: snap / smooth / bounce / gentle / sheet\n *\n * These mirror the CSS custom properties in `liquid-glass.css`\n * (`--duration-*`, `--ease-*`), so CSS consumers and JS consumers\n * stay in lockstep. The CSS layer also responds to\n * `prefers-reduced-motion`, collapsing durations to 0ms; the JS\n * helpers in `animations.ts` do the equivalent for spring tokens.\n *\n * If a component needs a duration the scale doesn't have, add a new\n * token here first — don't inline.\n */\n\nimport type { Transition } from 'framer-motion'\n\n// ════════════════════════════════════════════════════════════════════\n// Duration scale (milliseconds)\n// ════════════════════════════════════════════════════════════════════\n\nexport const duration = {\n /** 90ms — micro feedback: toggle thumb, hover tint, focus ring */\n xs: 90,\n /** 150ms — button press, popover open, chip toggle */\n sm: 150,\n /** 240ms — card hover, drawer slide, tab switch */\n md: 240,\n /** 360ms — page transitions, modal enter/exit */\n lg: 360,\n} as const\n\nexport type DurationToken = keyof typeof duration\n\n/** Same scale, expressed in seconds — for framer-motion's `duration` prop. */\nexport const durationSeconds = {\n xs: duration.xs / 1000,\n sm: duration.sm / 1000,\n md: duration.md / 1000,\n lg: duration.lg / 1000,\n} as const\n\n// ════════════════════════════════════════════════════════════════════\n// Easing curves (cubic-bezier arrays for framer-motion / CSS strings)\n// ════════════════════════════════════════════════════════════════════\n\nexport const ease = {\n /** Default product curve — symmetric, balanced */\n standard: [0.4, 0, 0.2, 1] as const,\n /** Entering elements — slow start, fast finish */\n emphasized: [0.2, 0, 0, 1] as const,\n /** Arrivals — fast in, slow settle */\n decelerate: [0, 0, 0.2, 1] as const,\n /** Departures — fast out, sharp end */\n accelerate: [0.4, 0, 1, 1] as const,\n /** iOS HIG-canonical curve — slightly slower decay than `standard` */\n ios: [0.25, 0.46, 0.45, 0.94] as const,\n} as const\n\nexport type EaseToken = keyof typeof ease\n\n/** CSS string form (`cubic-bezier(...)`). */\nexport const easeCss: Record<EaseToken, string> = {\n standard: `cubic-bezier(${ease.standard.join(', ')})`,\n emphasized: `cubic-bezier(${ease.emphasized.join(', ')})`,\n decelerate: `cubic-bezier(${ease.decelerate.join(', ')})`,\n accelerate: `cubic-bezier(${ease.accelerate.join(', ')})`,\n ios: `cubic-bezier(${ease.ios.join(', ')})`,\n}\n\n// ════════════════════════════════════════════════════════════════════\n// Spring presets (framer-motion Transition objects)\n// ════════════════════════════════════════════════════════════════════\n\nexport const spring = {\n /** Snap — fast, no overshoot. Buttons, micro-interactions. */\n snap: { type: 'spring', stiffness: 500, damping: 38 } as Transition,\n /** Smooth — balanced, no overshoot. Default for cards/transitions. */\n smooth: { type: 'spring', stiffness: 300, damping: 30 } as Transition,\n /** Bounce — playful overshoot. Icons, success confirmations. */\n bounce: { type: 'spring', stiffness: 400, damping: 22 } as Transition,\n /** Gentle — soft and slow. Modals, large surface entry. */\n gentle: { type: 'spring', stiffness: 200, damping: 22 } as Transition,\n /** Sheet — iOS sheet presentation (with mass). Drawers. */\n sheet: { type: 'spring', stiffness: 350, damping: 30, mass: 0.8 } as Transition,\n} as const\n\nexport type SpringToken = keyof typeof spring\n\n// ════════════════════════════════════════════════════════════════════\n// JSON-shape export\n// ════════════════════════════════════════════════════════════════════\n\n/** Full token tree as a single JSON-shape object — for design tool\n * syncs, doc tables, and Tailwind plugin consumption. */\nexport const motionTokens = {\n duration,\n durationSeconds,\n ease,\n easeCss,\n spring,\n} as const\n\nexport type MotionTokens = typeof motionTokens\n","/**\n * iOS-style animation presets for Framer Motion\n * Based on Apple Human Interface Guidelines\n * Includes reduced motion support for accessibility\n *\n * NOTE: New code should consume tokens from `./motion-tokens` directly\n * (`spring.snap`, `duration.md`, `ease.standard`). The exports in this\n * file are kept for back-compatibility — they re-export and adapt the\n * canonical token shape so existing call sites don't break.\n */\n\nimport type { Transition, Variants } from 'framer-motion'\nimport { spring as springTokens, duration as durationTokens, ease as easeTokens } from './motion-tokens'\n\n// Re-export canonical tokens so callers can do\n// `import { spring, duration } from '@datatechsolutions/ui'` directly.\nexport { duration, durationSeconds, ease, easeCss, spring, motionTokens } from './motion-tokens'\nexport type { DurationToken, EaseToken, SpringToken, MotionTokens } from './motion-tokens'\n\n// ============================================================================\n// Reduced Motion Detection\n// ============================================================================\n\n/**\n * Check if user prefers reduced motion\n * Use this to conditionally disable animations\n */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * Get a transition that respects reduced motion preference\n */\nexport function getTransition(transition: Transition): Transition {\n if (prefersReducedMotion()) {\n return { duration: 0 }\n }\n return transition\n}\n\n/**\n * Get variants that respect reduced motion preference\n */\nexport function getVariants(variants: Variants): Variants {\n if (prefersReducedMotion()) {\n // Return variants with instant transitions\n const reducedVariants: Variants = {}\n for (const key in variants) {\n reducedVariants[key] = {\n ...variants[key],\n transition: { duration: 0 },\n }\n }\n return reducedVariants\n }\n return variants\n}\n\n// ============================================================================\n// Spring Presets\n// ============================================================================\n\n/**\n * Legacy spring presets — kept for back-compat with existing call sites.\n * Maps onto the canonical `spring.*` tokens from motion-tokens.ts.\n * New code should import from `motion-tokens` directly.\n */\nexport const springPresets = {\n default: springTokens.smooth,\n bouncy: springTokens.bounce,\n stiff: springTokens.snap,\n gentle: springTokens.gentle,\n sheet: springTokens.sheet,\n /** Quick spring - very fast, good for micro-interactions */\n quick: { type: 'spring', stiffness: 600, damping: 40 } as Transition,\n}\n\n/** Spring presets with reduced motion fallback (instant) */\nexport const springPresetsReduced = {\n default: prefersReducedMotion() ? { duration: 0 } : springPresets.default,\n bouncy: prefersReducedMotion() ? { duration: 0 } : springPresets.bouncy,\n stiff: prefersReducedMotion() ? { duration: 0 } : springPresets.stiff,\n gentle: prefersReducedMotion() ? { duration: 0 } : springPresets.gentle,\n sheet: prefersReducedMotion() ? { duration: 0 } : springPresets.sheet,\n quick: prefersReducedMotion() ? { duration: 0 } : springPresets.quick,\n}\n\n// ============================================================================\n// Button Animations\n// ============================================================================\n\nexport const buttonPress: Variants = {\n idle: { scale: 1 },\n pressed: { scale: 0.97 },\n hover: { scale: 1.02 },\n}\n\nexport const buttonTap = {\n scale: 0.97,\n transition: springPresets.stiff,\n}\n\n/** Reduced motion version - no scale animation */\nexport const buttonPressReduced: Variants = {\n idle: { opacity: 1 },\n pressed: { opacity: 0.7 },\n hover: { opacity: 0.9 },\n}\n\n// ============================================================================\n// Card Animations\n// ============================================================================\n\nexport const cardHover: Variants = {\n idle: {\n y: 0,\n boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)'\n },\n hover: {\n y: -4,\n boxShadow: '0 20px 25px -5px rgb(0 0 0 / 0.1)'\n },\n}\n\nexport const cardPress: Variants = {\n idle: { scale: 1 },\n pressed: { scale: 0.98 },\n}\n\n/** Reduced motion version - opacity only */\nexport const cardHoverReduced: Variants = {\n idle: { opacity: 1 },\n hover: { opacity: 0.95 },\n}\n\n// ============================================================================\n// Modal/Sheet Animations\n// ============================================================================\n\nexport const slideUp: Variants = {\n hidden: { y: '100%', opacity: 0 },\n visible: { y: 0, opacity: 1 },\n exit: { y: '100%', opacity: 0 },\n}\n\nexport const slideRight: Variants = {\n hidden: { x: '100%', opacity: 0 },\n visible: { x: 0, opacity: 1 },\n exit: { x: '100%', opacity: 0 },\n}\n\nexport const slideDown: Variants = {\n hidden: { y: '-100%', opacity: 0 },\n visible: { y: 0, opacity: 1 },\n exit: { y: '-100%', opacity: 0 },\n}\n\nexport const fadeScale: Variants = {\n hidden: { opacity: 0, scale: 0.95 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n}\n\n/** Reduced motion - fade only, no movement */\nexport const fadeOnly: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n exit: { opacity: 0 },\n}\n\n// ============================================================================\n// Notification Animations\n// ============================================================================\n\nexport const notificationBanner: Variants = {\n hidden: { y: -100, opacity: 0, scale: 0.9 },\n visible: {\n y: 0,\n opacity: 1,\n scale: 1,\n transition: springPresets.bouncy,\n },\n exit: {\n y: -100,\n opacity: 0,\n scale: 0.9,\n transition: { duration: 0.2 },\n },\n}\n\n/** Reduced motion version */\nexport const notificationBannerReduced: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: 0.15 } },\n exit: { opacity: 0, transition: { duration: 0.1 } },\n}\n\n// ============================================================================\n// List Item Animations\n// ============================================================================\n\nexport const listItem: Variants = {\n hidden: { opacity: 0, x: -20 },\n visible: (i: number) => ({\n opacity: 1,\n x: 0,\n transition: {\n delay: i * 0.05,\n ...springPresets.default,\n },\n }),\n}\n\nexport const staggerContainer: Variants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n },\n },\n}\n\n/** Reduced motion - no stagger, just fade */\nexport const listItemReduced: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: 0.15 } },\n}\n\n// ============================================================================\n// Swipe Actions\n// ============================================================================\n\nexport const swipeActionThreshold = 80 // pixels\n\nexport const swipeConstraints = {\n left: -120,\n right: 0,\n}\n\n// ============================================================================\n// Page Control (Pagination Dots)\n// ============================================================================\n\nexport const pageControlDot: Variants = {\n inactive: { width: 8, backgroundColor: 'rgb(156 163 175)' },\n active: { width: 24, backgroundColor: 'rgb(59 130 246)' },\n}\n\n// ============================================================================\n// iOS System Colors\n// ============================================================================\n\nexport const iosColors = {\n // Primary colors\n blue: '#007AFF',\n green: '#34C759',\n red: '#FF3B30',\n orange: '#FF9500',\n yellow: '#FFCC00',\n purple: '#AF52DE',\n pink: '#FF2D55',\n teal: '#5AC8FA',\n indigo: '#5856D6',\n mint: '#00C7BE',\n cyan: '#32ADE6',\n brown: '#A2845E',\n\n // Grays\n gray: '#8E8E93',\n gray2: '#AEAEB2',\n gray3: '#C7C7CC',\n gray4: '#D1D1D6',\n gray5: '#E5E5EA',\n gray6: '#F2F2F7',\n\n // Dark mode variants\n dark: {\n blue: '#0A84FF',\n green: '#30D158',\n red: '#FF453A',\n orange: '#FF9F0A',\n yellow: '#FFD60A',\n purple: '#BF5AF2',\n pink: '#FF375F',\n teal: '#64D2FF',\n indigo: '#5E5CE6',\n mint: '#66D4CF',\n cyan: '#5AC8FA',\n brown: '#AC8E68',\n },\n}\n\n// ============================================================================\n// Duration Presets\n// ============================================================================\n\n/**\n * Legacy duration presets (seconds — for framer-motion). Mapped onto\n * the canonical `duration.*` tokens (ms) divided by 1000.\n */\nexport const durations = {\n instant: 0,\n fast: durationTokens.sm / 1000,\n normal: durationTokens.md / 1000,\n slow: durationTokens.lg / 1000,\n verySlow: 0.5,\n}\n\n/** Duration presets with reduced motion fallback */\nexport const durationsReduced = {\n instant: 0,\n fast: prefersReducedMotion() ? 0 : 0.15,\n normal: prefersReducedMotion() ? 0 : 0.25,\n slow: prefersReducedMotion() ? 0 : 0.35,\n verySlow: prefersReducedMotion() ? 0 : 0.5,\n}\n\n// ============================================================================\n// Easing Presets\n// ============================================================================\n\n/**\n * Legacy easing presets — kept for back-compat. New code uses `ease.*`\n * from motion-tokens. `default` here is preserved as a historical curve;\n * the canonical equivalent is `ease.standard`.\n */\nexport const easings = {\n default: [0.25, 0.1, 0.25, 1],\n out: easeTokens.decelerate,\n in: easeTokens.accelerate,\n inOut: easeTokens.standard,\n ios: easeTokens.ios,\n}\n\n// ============================================================================\n// Utility: Create motion-safe animation props\n// ============================================================================\n\n/**\n * Creates animation props that respect reduced motion preference\n */\nexport function createMotionProps<T extends object>(\n animatedProps: T,\n reducedProps: Partial<T> = {}\n): T {\n if (prefersReducedMotion()) {\n return { ...animatedProps, ...reducedProps, transition: { duration: 0 } }\n }\n return animatedProps\n}\n","import * as Headless from '@headlessui/react'\nimport React, { forwardRef } from 'react'\nimport { useLink } from '@ui/lib/router-context'\n\nexport type LinkProps = {\n href: string\n children?: React.ReactNode\n} & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>\n\nexport const Link = forwardRef(function Link(\n props: LinkProps,\n ref: React.ForwardedRef<HTMLAnchorElement>\n) {\n const RouterLink = useLink()\n return (\n <Headless.DataInteractive>\n <RouterLink {...props} ref={ref as React.Ref<HTMLAnchorElement>} />\n </Headless.DataInteractive>\n )\n})\n","/**\n * Button Styles Module\n * ====================\n *\n * Centralized style definitions for all button variants.\n * Extracted from button.tsx for better maintainability.\n */\n\n// iOS System Colors for buttons\nexport const iosColors = {\n // Glassy iOS blue — neutral glass at rest, fills blue on hover\n 'ios-glass-blue': [\n 'liquid-button-primary text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Glassy iOS red — neutral glass at rest, fills red on hover\n 'ios-glass-red': [\n 'liquid-button liquid-button-red text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Glassy iOS green — neutral glass at rest, fills green on hover\n 'ios-glass-green': [\n 'liquid-button liquid-button-green text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Primary iOS blue\n 'ios-blue': [\n 'text-white [--btn-bg:#007AFF] [--btn-border:#0066DD] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#0A84FF] dark:[--btn-border:#007AFF]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // Destructive iOS red\n 'ios-red': [\n 'text-white [--btn-bg:#FF3B30] [--btn-border:#E6352B] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FF453A] dark:[--btn-border:#FF3B30]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS green (success/confirm)\n 'ios-green': [\n 'text-white [--btn-bg:#34C759] [--btn-border:#2DB350] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#30D158] dark:[--btn-border:#34C759]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS orange (warning)\n 'ios-orange': [\n 'text-white [--btn-bg:#FF9500] [--btn-border:#E68600] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FF9F0A] dark:[--btn-border:#FF9500]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS purple\n 'ios-purple': [\n 'text-white [--btn-bg:#AF52DE] [--btn-border:#9B48C7] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#BF5AF2] dark:[--btn-border:#AF52DE]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS teal\n 'ios-teal': [\n 'text-white [--btn-bg:#5AC8FA] [--btn-border:#4AB8E8] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#64D2FF] dark:[--btn-border:#5AC8FA]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS fuchsia (used by IconButton ghost for accent affordances —\n // see DraggableCommandBar, WorkflowListBar convert-to-subworkflow).\n 'ios-fuchsia': [\n 'text-white [--btn-bg:#FF2D55] [--btn-border:#E62950] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FF375F] dark:[--btn-border:#FF2D55]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS amber (rare ghost-only accent for warnings / \"experimental\"\n // affordances in canvas chrome).\n 'ios-amber': [\n 'text-white [--btn-bg:#FFCC00] [--btn-border:#E6B800] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FFD60A] dark:[--btn-border:#FFCC00]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n}\n\n// Size presets\nexport const sizeStyles = {\n xs: 'px-2 py-1 text-xs rounded-md',\n sm: 'px-3 py-1.5 text-sm rounded-lg',\n md: '', // Default size from base styles\n lg: 'px-5 py-3 text-base rounded-xl',\n xl: 'px-6 py-4 text-lg rounded-xl',\n}\n\n// Pill shape modifier\nexport const pillStyles = 'rounded-full'\n\nexport const styles = {\n base: [\n // Base\n 'relative isolate inline-flex items-center justify-center gap-x-2 rounded-lg border text-base/6 font-semibold',\n // Sizing\n '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',\n // Focus\n 'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n // Disabled\n 'data-disabled:opacity-50',\n // Icon\n '*: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]',\n ],\n solid: [\n // Optical border, implemented as the button background to avoid corner artifacts\n 'border-transparent bg-(--btn-border)',\n // Dark mode: border is rendered on `after` so background is set to button background\n 'dark:bg-(--btn-bg)',\n // Button background, implemented as foreground layer to stack on top of pseudo-border layer\n 'before:absolute before:inset-0 before:-z-10 before:rounded-[calc(var(--radius-lg)-1px)] before:bg-(--btn-bg)',\n // Drop shadow, applied to the inset `before` layer so it blends with the border\n 'before:shadow-xs',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Dark mode: Subtle white outline is applied using a border\n 'dark:border-white/5',\n // Shim/overlay, inset to match button foreground and used for hover state + highlight shadow\n 'after:absolute after:inset-0 after:-z-10 after:rounded-[calc(var(--radius-lg)-1px)]',\n // Inner highlight shadow\n 'after:shadow-[inset_0_1px_--theme(--color-white/15%)]',\n // White overlay on hover\n 'data-active:after:bg-(--btn-hover-overlay) data-hover:after:bg-(--btn-hover-overlay)',\n // Dark mode: `after` layer expands to cover entire button\n 'dark:after:-inset-px dark:after:rounded-lg',\n // Disabled\n 'data-disabled:before:shadow-none data-disabled:after:shadow-none',\n ],\n outline: [\n // Liquid glass secondary button\n 'liquid-button text-slate-900 !border-white/55',\n // Dark mode\n 'dark:text-white dark:!border-white/18',\n // Icon\n '[--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)]',\n ],\n plain: [\n // Base\n 'border-transparent text-zinc-950 data-active:bg-zinc-950/5 data-hover:bg-zinc-950/5',\n // Dark mode\n 'dark:text-white dark:data-active:bg-white/10 dark:data-hover:bg-white/10',\n // Icon\n '[--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)]',\n ],\n gradient: [\n // Same crystal-illuminated mechanic as ios-glass-blue/red/green:\n // neutral glass at rest, fills with translucent indigo→purple\n // gradient on hover. The actual rest/hover styling — including\n // the text-color flip from slate-900 → white — lives in the\n // `.liquid-button-gradient` CSS class in liquid-glass.css so the\n // whole transition is keyed off `:hover` (works without JS).\n 'liquid-button-gradient border-transparent',\n // Disabled\n 'data-disabled:opacity-50 data-disabled:saturate-50',\n // Icon tint flips with text via inherit (currentColor)\n '[--btn-icon:currentColor]',\n ],\n colors: {\n 'dark/zinc': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-white dark:[--btn-bg:var(--color-zinc-600)] dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n light: [\n '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',\n 'dark:text-white dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--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)]',\n ],\n 'dark/white': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-zinc-950 dark:[--btn-bg:white] dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--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)]',\n ],\n dark: [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n white: [\n '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',\n 'dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-500)] data-hover:[--btn-icon:var(--color-zinc-500)]',\n ],\n zinc: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-zinc-600)] [--btn-border:var(--color-zinc-700)]/90',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n indigo: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-indigo-500)] [--btn-border:var(--color-indigo-600)]/90',\n '[--btn-icon:var(--color-indigo-300)] data-active:[--btn-icon:var(--color-indigo-200)] data-hover:[--btn-icon:var(--color-indigo-200)]',\n ],\n cyan: [\n 'text-cyan-950 [--btn-bg:var(--color-cyan-300)] [--btn-border:var(--color-cyan-400)]/80 [--btn-hover-overlay:var(--color-white)]/25',\n '[--btn-icon:var(--color-cyan-500)]',\n ],\n red: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-red-600)] [--btn-border:var(--color-red-700)]/90',\n '[--btn-icon:var(--color-red-300)] data-active:[--btn-icon:var(--color-red-200)] data-hover:[--btn-icon:var(--color-red-200)]',\n ],\n orange: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-orange-500)] [--btn-border:var(--color-orange-600)]/90',\n '[--btn-icon:var(--color-orange-300)] data-active:[--btn-icon:var(--color-orange-200)] data-hover:[--btn-icon:var(--color-orange-200)]',\n ],\n amber: [\n 'text-amber-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-amber-400)] [--btn-border:var(--color-amber-500)]/80',\n '[--btn-icon:var(--color-amber-600)]',\n ],\n yellow: [\n 'text-yellow-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-yellow-300)] [--btn-border:var(--color-yellow-400)]/80',\n '[--btn-icon:var(--color-yellow-600)] data-active:[--btn-icon:var(--color-yellow-700)] data-hover:[--btn-icon:var(--color-yellow-700)]',\n ],\n lime: [\n 'text-lime-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-lime-300)] [--btn-border:var(--color-lime-400)]/80',\n '[--btn-icon:var(--color-lime-600)] data-active:[--btn-icon:var(--color-lime-700)] data-hover:[--btn-icon:var(--color-lime-700)]',\n ],\n green: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-green-600)] [--btn-border:var(--color-green-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n emerald: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-emerald-600)] [--btn-border:var(--color-emerald-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n teal: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-teal-600)] [--btn-border:var(--color-teal-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n sky: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-sky-500)] [--btn-border:var(--color-sky-600)]/80',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n blue: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-blue-600)] [--btn-border:var(--color-blue-700)]/90',\n '[--btn-icon:var(--color-blue-400)] data-active:[--btn-icon:var(--color-blue-300)] data-hover:[--btn-icon:var(--color-blue-300)]',\n ],\n violet: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-violet-500)] [--btn-border:var(--color-violet-600)]/90',\n '[--btn-icon:var(--color-violet-300)] data-active:[--btn-icon:var(--color-violet-200)] data-hover:[--btn-icon:var(--color-violet-200)]',\n ],\n purple: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-purple-500)] [--btn-border:var(--color-purple-600)]/90',\n '[--btn-icon:var(--color-purple-300)] data-active:[--btn-icon:var(--color-purple-200)] data-hover:[--btn-icon:var(--color-purple-200)]',\n ],\n fuchsia: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-fuchsia-500)] [--btn-border:var(--color-fuchsia-600)]/90',\n '[--btn-icon:var(--color-fuchsia-300)] data-active:[--btn-icon:var(--color-fuchsia-200)] data-hover:[--btn-icon:var(--color-fuchsia-200)]',\n ],\n pink: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-pink-500)] [--btn-border:var(--color-pink-600)]/90',\n '[--btn-icon:var(--color-pink-300)] data-active:[--btn-icon:var(--color-pink-200)] data-hover:[--btn-icon:var(--color-pink-200)]',\n ],\n rose: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-rose-500)] [--btn-border:var(--color-rose-600)]/90',\n '[--btn-icon:var(--color-rose-300)] data-active:[--btn-icon:var(--color-rose-200)] data-hover:[--btn-icon:var(--color-rose-200)]',\n ],\n },\n}\n\n// FAB-specific styles\nexport const fabSizes = {\n sm: 'h-12 w-12',\n md: 'h-14 w-14',\n lg: 'h-16 w-16',\n}\n\nexport const fabIconSizes = {\n sm: 'h-5 w-5',\n md: 'h-6 w-6',\n lg: 'h-7 w-7',\n}\n\nexport const fabPositions = {\n 'bottom-right': 'fixed bottom-6 right-6',\n 'bottom-left': 'fixed bottom-6 left-6',\n 'bottom-center': 'fixed bottom-6 left-1/2 -translate-x-1/2',\n}\n\n// FAB colors as crystal-illuminated glass — translucent tint over the\n// surface, inner highlight on the top edge, tinted drop shadow.\n// Hover bumps opacity + glow. Matches the rest of the button family.\nexport const fabColors = {\n 'ios-blue':\n 'text-white bg-[#007AFF]/85 dark:bg-[#0A84FF]/80 backdrop-blur-xl ' +\n 'border border-white/30 dark:border-white/15 ' +\n 'shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(0,122,255,0.5)] ' +\n 'hover:bg-[#007AFF] dark:hover:bg-[#0A84FF] ' +\n '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)]',\n 'ios-green':\n 'text-white bg-[#34C759]/85 dark:bg-[#30D158]/80 backdrop-blur-xl ' +\n 'border border-white/30 dark:border-white/15 ' +\n 'shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(52,199,89,0.5)] ' +\n 'hover:bg-[#34C759] dark:hover:bg-[#30D158] ' +\n '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)]',\n 'ios-red':\n 'text-white bg-[#FF3B30]/85 dark:bg-[#FF453A]/80 backdrop-blur-xl ' +\n 'border border-white/30 dark:border-white/15 ' +\n 'shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(255,59,48,0.5)] ' +\n 'hover:bg-[#FF3B30] dark:hover:bg-[#FF453A] ' +\n '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)]',\n 'ios-purple':\n 'text-white bg-[#AF52DE]/85 dark:bg-[#BF5AF2]/80 backdrop-blur-xl ' +\n 'border border-white/30 dark:border-white/15 ' +\n 'shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(175,82,222,0.5)] ' +\n 'hover:bg-[#AF52DE] dark:hover:bg-[#BF5AF2] ' +\n '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)]',\n 'ios-orange':\n 'text-white bg-[#FF9500]/85 dark:bg-[#FF9F0A]/80 backdrop-blur-xl ' +\n 'border border-white/30 dark:border-white/15 ' +\n 'shadow-[inset_0_1px_2px_rgba(255,255,255,0.5),0_12px_32px_-8px_rgba(255,149,0,0.5)] ' +\n 'hover:bg-[#FF9500] dark:hover:bg-[#FF9F0A] ' +\n '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)]',\n}\n\n// IconButton-specific styles\nexport const iconButtonSizes = {\n sm: 'h-8 w-8',\n md: 'h-10 w-10',\n lg: 'h-12 w-12',\n}\n\nexport const iconSizes = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n// Type exports\nexport type ColorType = keyof typeof styles.colors | keyof typeof iosColors\nexport type SizeType = keyof typeof sizeStyles\nexport type FABColorType = keyof typeof fabColors\nexport type FABPositionType = keyof typeof fabPositions\nexport type FABSizeType = keyof typeof fabSizes\nexport type IconButtonSizeType = keyof typeof iconButtonSizes\n","import { Button as HeadlessButton, type ButtonProps as HeadlessButtonProps } from '@headlessui/react'\nimport clsx from 'clsx'\nimport React, { forwardRef } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Link } from '@ui/components/link'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { springPresets, getTransition } from '@ui/lib/animations'\nimport {\n iosColors,\n sizeStyles,\n pillStyles,\n styles,\n fabSizes,\n fabIconSizes,\n fabPositions,\n fabColors,\n iconButtonSizes,\n iconSizes,\n type ColorType,\n type SizeType,\n type FABColorType,\n type FABPositionType,\n type FABSizeType,\n type IconButtonSizeType,\n} from '@ui/components/button-styles'\n\ntype ButtonProps = (\n | { color?: ColorType; outline?: never; plain?: never; gradient?: never }\n | { color?: never; outline: true; plain?: never; gradient?: never }\n | { color?: never; outline?: never; plain: true; gradient?: never }\n | { color?: never; outline?: never; plain?: never; gradient: true }\n) & {\n className?: string\n children: React.ReactNode\n /** Make button pill-shaped (fully rounded) */\n pill?: boolean\n /** Button size */\n size?: SizeType\n /** Show loading spinner */\n loading?: boolean\n /** Loading text (optional) */\n loadingText?: string\n /** Full width button */\n fullWidth?: boolean\n /** Destructive action (uses iOS red) */\n destructive?: boolean\n} & (\n | ({ href?: never } & Omit<HeadlessButtonProps, 'as' | 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n )\n\nexport const Button = forwardRef(function Button(\n {\n color,\n outline,\n plain,\n gradient,\n className,\n children,\n pill,\n size = 'md',\n loading,\n loadingText,\n fullWidth,\n destructive,\n disabled,\n ...props\n }: ButtonProps & { disabled?: boolean },\n ref: React.ForwardedRef<HTMLElement>\n) {\n // Determine final color - destructive overrides color\n const finalColor = destructive ? 'ios-red' : color\n\n // Check if using iOS color\n const isIosColor = finalColor && finalColor in iosColors\n const colorStyles = isIosColor\n ? iosColors[finalColor as keyof typeof iosColors]\n : styles.colors[finalColor as keyof typeof styles.colors] ?? styles.colors['dark/zinc']\n\n let classes = clsx(\n className,\n styles.base,\n gradient ? styles.gradient : outline ? styles.outline : plain ? styles.plain : clsx(styles.solid, colorStyles),\n pill && pillStyles,\n size !== 'md' && sizeStyles[size],\n fullWidth && 'w-full',\n loading && 'pointer-events-none'\n )\n\n const handleTapStart = () => {\n if (!loading && !disabled) {\n triggerHaptic(destructive ? 'medium' : 'light')\n }\n }\n\n const isDisabled = disabled || loading\n\n const buttonContent = (\n <>\n <AnimatePresence mode=\"wait\">\n {loading && (\n <motion.span\n initial={{ opacity: 0, width: 0 }}\n animate={{ opacity: 1, width: 'auto' }}\n exit={{ opacity: 0, width: 0 }}\n transition={getTransition(springPresets.stiff)}\n className=\"inline-flex items-center\"\n >\n <LoadingSpinner className=\"mr-2\" />\n </motion.span>\n )}\n </AnimatePresence>\n <span className={clsx('inline-flex items-center gap-x-2', loading && 'opacity-70')}>\n {loading && loadingText ? loadingText : children}\n </span>\n </>\n )\n\n const linkProps = props as Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>\n const buttonProps = props as Omit<HeadlessButtonProps, 'className'>\n\n const isLink = typeof props.href === 'string'\n\n return isLink ? (\n <motion.div\n whileTap={!isDisabled ? { scale: 0.97 } : undefined}\n transition={getTransition(springPresets.stiff)}\n onTapStart={handleTapStart}\n className={clsx('inline-flex', fullWidth && 'w-full')}\n >\n <Link\n {...linkProps}\n className={classes}\n ref={ref as React.ForwardedRef<HTMLAnchorElement>}\n >\n <TouchTarget>{buttonContent}</TouchTarget>\n </Link>\n </motion.div>\n ) : (\n <motion.div\n whileTap={!isDisabled ? { scale: 0.97 } : undefined}\n transition={getTransition(springPresets.stiff)}\n onTapStart={handleTapStart}\n className={clsx('inline-flex', fullWidth && 'w-full')}\n >\n <HeadlessButton\n {...buttonProps}\n disabled={isDisabled}\n className={clsx(classes, 'cursor-default')}\n ref={ref}\n >\n <TouchTarget>{buttonContent}</TouchTarget>\n </HeadlessButton>\n </motion.div>\n )\n})\n\n/**\n * Expand the hit area to at least 44×44px on touch devices\n */\nexport function TouchTarget({ children }: { children: React.ReactNode }) {\n return (\n <>\n <span\n className=\"absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden\"\n aria-hidden=\"true\"\n />\n {children}\n </>\n )\n}\n\n/**\n * Loading spinner for button loading state\n */\nfunction LoadingSpinner({ className }: { className?: string }) {\n return (\n <svg\n className={clsx('h-4 w-4 animate-spin motion-reduce:animate-none', className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n 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\"\n />\n </svg>\n )\n}\n\n/**\n * Floating Action Button (FAB) - iOS style\n * Fixed position button typically in bottom-right corner\n */\ntype FABProps = {\n /** Icon to display */\n icon: React.ReactNode\n /** Optional label (shows on hover/focus) */\n label?: string\n /** Button color */\n color?: FABColorType\n /** Size variant */\n size?: FABSizeType\n /** Position on screen */\n position?: FABPositionType\n /** Click handler */\n onClick?: () => void\n /** Show loading state */\n loading?: boolean\n /** Custom class */\n className?: string\n /** Extended FAB with label always visible */\n extended?: boolean\n}\n\nexport function FloatingActionButton({\n icon,\n label,\n color = 'ios-blue',\n size = 'md',\n position = 'bottom-right',\n onClick,\n loading,\n className,\n extended,\n}: FABProps) {\n const handleClick = () => {\n if (!loading) {\n triggerHaptic('medium')\n onClick?.()\n }\n }\n\n return (\n <motion.button\n onClick={handleClick}\n disabled={loading}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n transition={getTransition(springPresets.bouncy)}\n className={clsx(\n fabPositions[position],\n extended ? 'px-5 h-14 rounded-full' : clsx(fabSizes[size], 'rounded-full'),\n fabColors[color],\n 'flex items-center justify-center gap-2',\n 'shadow-lg hover:shadow-xl',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-indigo-500/70',\n 'z-50',\n loading && 'opacity-70 cursor-not-allowed',\n className\n )}\n aria-label={label}\n >\n {loading ? (\n <LoadingSpinner className={fabIconSizes[size]} />\n ) : (\n <span className={fabIconSizes[size]}>{icon}</span>\n )}\n {extended && label && (\n <span className=\"font-semibold text-base\">{label}</span>\n )}\n </motion.button>\n )\n}\n\n/**\n * Icon Button - Compact button with just an icon\n */\ntype IconButtonProps = {\n icon: React.ReactNode\n label: string // Required for accessibility\n color?: ColorType\n size?: IconButtonSizeType\n variant?: 'solid' | 'ghost' | 'outline'\n onClick?: () => void\n disabled?: boolean\n loading?: boolean\n className?: string\n destructive?: boolean\n}\n\nexport function IconButton({\n icon,\n label,\n color = 'ios-blue',\n size = 'md',\n variant = 'ghost',\n onClick,\n disabled,\n loading,\n className,\n destructive,\n}: IconButtonProps) {\n const finalColor = destructive ? 'ios-red' : color\n const isIosColor = finalColor in iosColors\n\n const handleClick = () => {\n if (!disabled && !loading) {\n triggerHaptic(destructive ? 'medium' : 'light')\n onClick?.()\n }\n }\n\n const variantStyles = {\n solid: clsx(\n 'text-white',\n isIosColor && finalColor === 'ios-blue' && 'bg-[#007AFF] dark:bg-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'bg-[#FF3B30] dark:bg-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'bg-[#34C759] dark:bg-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'bg-[#FF9500] dark:bg-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'bg-[#AF52DE] dark:bg-[#BF5AF2]',\n ),\n ghost: clsx(\n 'bg-transparent hover:bg-white/40 dark:hover:bg-white/[0.08]',\n isIosColor && finalColor === 'ios-blue' && 'text-[#007AFF] dark:text-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'text-[#FF3B30] dark:text-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'text-[#34C759] dark:text-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'text-[#FF9500] dark:text-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'text-[#AF52DE] dark:text-[#BF5AF2]',\n isIosColor && finalColor === 'ios-teal' && 'text-teal-600 dark:text-teal-400 hover:text-teal-700 dark:hover:text-teal-300',\n isIosColor && finalColor === 'ios-fuchsia' && 'text-fuchsia-600 dark:text-fuchsia-400 hover:text-fuchsia-700 dark:hover:text-fuchsia-300',\n isIosColor && finalColor === 'ios-amber' && 'text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-300',\n !isIosColor && 'text-slate-700 dark:text-slate-300',\n ),\n outline: clsx(\n 'bg-transparent border',\n isIosColor && finalColor === 'ios-blue' && 'border-[#007AFF] text-[#007AFF] dark:border-[#0A84FF] dark:text-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'border-[#FF3B30] text-[#FF3B30] dark:border-[#FF453A] dark:text-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'border-[#34C759] text-[#34C759] dark:border-[#30D158] dark:text-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'border-[#FF9500] text-[#FF9500] dark:border-[#FF9F0A] dark:text-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'border-[#AF52DE] text-[#AF52DE] dark:border-[#BF5AF2] dark:text-[#BF5AF2]',\n ),\n }\n\n return (\n <motion.button\n onClick={handleClick}\n disabled={disabled || loading}\n whileTap={{ scale: 0.9 }}\n transition={getTransition(springPresets.stiff)}\n className={clsx(\n iconButtonSizes[size],\n 'rounded-full flex items-center justify-center',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-indigo-500/70',\n 'transition-colors',\n variantStyles[variant],\n (disabled || loading) && 'opacity-50 cursor-not-allowed',\n className\n )}\n aria-label={label}\n >\n {loading ? (\n <LoadingSpinner className={iconSizes[size]} />\n ) : (\n <span className={iconSizes[size]}>{icon}</span>\n )}\n </motion.button>\n )\n}\n","import * as Headless from '@headlessui/react'\nimport clsx from 'clsx'\nimport React, { forwardRef, type ReactNode, type MouseEvent } from 'react'\nimport { XMarkIcon } from '@heroicons/react/20/solid'\nimport { TouchTarget } from '@ui/components/button'\nimport { Link } from '@ui/components/link'\n\n/**\n * Badge — the single primitive for \"small colored label / chip /\n * tag / removable pill\" across the entire design system. Subsumes\n * the legacy `Pill`, `TagBadge`, `RoleBadge`, `FilterBadge`, and\n * `FilterPill` primitives. Use:\n *\n * - `<Badge color=\"indigo\">Premium</Badge>` — neutral metadata tag\n * - `<Badge color=\"amber\" icon={<X />}>3 alertas</Badge>` — with icon\n * - `<Badge color=\"indigo\" removable onRemove={fn}>SP</Badge>` — chip\n * - `<Badge color=\"indigo\" onClick={fn}>3 filtros</Badge>` — clickable\n *\n * For status-message pills (active/pending/failed/etc.) use\n * `<StatusBadge>` — it ships `role=\"status\"` + `aria-live` semantics\n * that Badge intentionally doesn't.\n */\n\nconst colors = {\n 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',\n orange:\n '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',\n amber:\n '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',\n yellow:\n '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',\n 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',\n green:\n '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',\n emerald:\n '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',\n 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',\n 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',\n 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',\n 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',\n indigo:\n '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',\n violet:\n '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',\n purple:\n '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',\n fuchsia:\n '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',\n 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',\n 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',\n 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',\n}\n\nexport type BadgeColor = keyof typeof colors\nexport type BadgeSize = 'xs' | 'sm' | 'md' | 'lg'\n\n// Size scale. WCAG 1.4.4: `xs` stays at 11px (not 10) so badges\n// remain legible at zoom 200%.\nconst sizes: Record<BadgeSize, { container: string; icon: string; remove: string }> = {\n xs: { container: 'px-2 py-0.5 text-[11px] gap-1', icon: 'h-3 w-3', remove: 'h-3 w-3 -mr-0.5' },\n 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' },\n md: { container: 'px-3 py-1 text-sm gap-1.5', icon: 'h-4 w-4', remove: 'h-4 w-4 -mr-1' },\n lg: { container: 'px-3.5 py-1.5 text-sm gap-2', icon: 'h-4 w-4', remove: 'h-4 w-4 -mr-1' },\n}\n\ntype BaseBadgeProps = {\n color?: BadgeColor\n size?: BadgeSize\n /** Optional leading icon (rendered before the label). */\n icon?: ReactNode\n /** When true, a remove (×) button is rendered at the end and the\n * badge becomes a focusable button. */\n removable?: boolean\n /** Called when the remove (×) button is clicked. Required when\n * `removable` is true. */\n onRemove?: () => void\n /** Accessible label for the remove button (e.g. \"remove São Paulo\n * filter\"). Defaults to a generic \"Remove\". */\n removeLabel?: string\n /** When provided, the entire badge becomes clickable (button\n * semantics with the canonical focus ring). */\n onClick?: () => void\n /** When true, marks the badge as a live status message so screen\n * readers announce changes (`role=\"status\" aria-live=\"polite\"`).\n * Use for dynamic state (\"active\" → \"pending\"); leave off for\n * static metadata (tags, counts, roles). */\n live?: boolean\n}\n\n// Crystal chrome — same recipe as StatusBadge so both pills look\n// identical: backdrop-blur + saturate + inset white highlight at the\n// top edge + a subtle tinted drop shadow. Applied via inline style so\n// it survives any consumer-supplied className (would otherwise be\n// trumped by Tailwind cascade ordering issues).\nconst CRYSTAL_STYLE: React.CSSProperties = {\n backdropFilter: 'blur(12px) saturate(1.5)',\n WebkitBackdropFilter: 'blur(12px) saturate(1.5)',\n boxShadow:\n 'inset 0 1px 1.5px rgba(255,255,255,0.45), 0 1px 3px -1px rgba(15,23,42,0.12)',\n}\n\ntype SpanBadgeProps = BaseBadgeProps & Omit<React.ComponentPropsWithoutRef<'span'>, 'onClick'>\n\nexport function Badge({\n color = 'zinc',\n size = 'sm',\n icon,\n removable = false,\n onRemove,\n removeLabel = 'Remove',\n onClick,\n live = false,\n className,\n children,\n ...props\n}: SpanBadgeProps) {\n const sz = sizes[size]\n const base = clsx(\n 'inline-flex items-center rounded-full border font-semibold forced-colors:outline',\n 'border-current/20', // hair-line border in the badge's own hue\n sz.container,\n colors[color],\n className,\n )\n const liveProps = live ? ({ role: 'status', 'aria-live': 'polite' as const }) : {}\n\n // Clickable variant — becomes a real button with focus-visible ring.\n if (onClick) {\n return (\n <button /* no-raw-button-ok: Badge primitive — clickable / removable badge variant defines the chip control */\n type=\"button\"\n data-testid=\"badge\"\n onClick={onClick}\n style={CRYSTAL_STYLE}\n {...liveProps}\n className={clsx(\n base,\n 'cursor-pointer transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1',\n )}\n >\n {icon && <span className={clsx('shrink-0', sz.icon)} aria-hidden>{icon}</span>}\n {children}\n </button>\n )\n }\n\n // Removable variant — span wrapper + inner × button.\n if (removable) {\n return (\n <span\n data-testid=\"badge\"\n {...props}\n {...liveProps}\n style={CRYSTAL_STYLE}\n className={clsx(base, 'pr-1')}\n >\n {icon && <span className={clsx('shrink-0', sz.icon)} aria-hidden>{icon}</span>}\n {children}\n <button /* no-raw-button-ok: Badge primitive — clickable / removable badge variant defines the chip control */\n type=\"button\"\n aria-label={removeLabel}\n onClick={(event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation()\n onRemove?.()\n }}\n className={clsx(\n 'ml-0.5 inline-flex shrink-0 cursor-pointer items-center justify-center rounded-full',\n 'opacity-70 hover:opacity-100 transition-opacity',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70',\n )}\n >\n <XMarkIcon className={sz.remove} />\n </button>\n </span>\n )\n }\n\n // Plain decorative badge.\n return (\n <span data-testid=\"badge\" {...props} {...liveProps} style={CRYSTAL_STYLE} className={base}>\n {icon && <span className={clsx('shrink-0', sz.icon)} aria-hidden>{icon}</span>}\n {children}\n </span>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// BadgeButton — Link/Button-wrapping variant. Kept for callers that\n// need href-based badges (e.g. role pills that navigate to a settings\n// page). Internally uses <Badge> with the click handled by the wrapper.\n// ─────────────────────────────────────────────────────────────────────\n\nexport const BadgeButton = forwardRef(function BadgeButton(\n {\n color = 'zinc',\n size = 'sm',\n icon,\n className,\n children,\n ...props\n }: BaseBadgeProps & { className?: string; children: React.ReactNode } & (\n | ({ href?: never } & Omit<Headless.ButtonProps, 'as' | 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n ),\n ref: React.ForwardedRef<HTMLAnchorElement | HTMLButtonElement>\n) {\n let classes = clsx(\n className,\n 'group relative inline-flex rounded-full',\n 'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-indigo-500/70',\n )\n\n if (typeof props.href === 'string') {\n return (\n <Link {...(props as React.ComponentPropsWithoutRef<typeof Link>)} className={classes} ref={ref as React.ForwardedRef<HTMLAnchorElement>}>\n <TouchTarget>\n <Badge color={color} size={size} icon={icon}>{children}</Badge>\n </TouchTarget>\n </Link>\n )\n }\n\n return (\n <Headless.Button {...(props as Headless.ButtonProps)} className={classes} ref={ref as React.ForwardedRef<HTMLButtonElement>}>\n <TouchTarget>\n <Badge color={color} size={size} icon={icon}>{children}</Badge>\n </TouchTarget>\n </Headless.Button>\n )\n})\n"]}