@datatechsolutions/ui 3.6.1 → 3.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/astrlabe/graph-node.js +8 -5
  2. package/dist/astrlabe/graph-node.mjs +4 -1
  3. package/dist/astrlabe/index.js +115 -114
  4. package/dist/astrlabe/index.mjs +7 -6
  5. package/dist/astrlabe/workflow-canvas.js +7 -6
  6. package/dist/astrlabe/workflow-canvas.mjs +6 -5
  7. package/dist/{chunk-3Z66NXEB.mjs → chunk-2OPBUVTQ.mjs} +3 -3
  8. package/dist/{chunk-3Z66NXEB.mjs.map → chunk-2OPBUVTQ.mjs.map} +1 -1
  9. package/dist/{chunk-4JDJRGAB.mjs → chunk-34XRH2FX.mjs} +5 -4
  10. package/dist/chunk-34XRH2FX.mjs.map +1 -0
  11. package/dist/{chunk-KEWRLEYV.js → chunk-3JZGRXSG.js} +4 -4
  12. package/dist/{chunk-KEWRLEYV.js.map → chunk-3JZGRXSG.js.map} +1 -1
  13. package/dist/{chunk-JQYDJ75Q.mjs → chunk-3VYD7QL2.mjs} +3 -3
  14. package/dist/{chunk-JQYDJ75Q.mjs.map → chunk-3VYD7QL2.mjs.map} +1 -1
  15. package/dist/{chunk-MRRFDIUQ.mjs → chunk-4JRMXHPU.mjs} +5 -4
  16. package/dist/chunk-4JRMXHPU.mjs.map +1 -0
  17. package/dist/{chunk-4OFG6POC.mjs → chunk-5LCWQKGQ.mjs} +207 -1128
  18. package/dist/chunk-5LCWQKGQ.mjs.map +1 -0
  19. package/dist/{chunk-W5YCZOXO.js → chunk-7YK4WXHO.js} +79 -78
  20. package/dist/chunk-7YK4WXHO.js.map +1 -0
  21. package/dist/{chunk-YOJIPZ72.js → chunk-BBLBSDPN.js} +9 -9
  22. package/dist/{chunk-YOJIPZ72.js.map → chunk-BBLBSDPN.js.map} +1 -1
  23. package/dist/chunk-BHOT22QL.js +998 -0
  24. package/dist/chunk-BHOT22QL.js.map +1 -0
  25. package/dist/{chunk-MQNXKBFP.mjs → chunk-C4AJWDFB.mjs} +7 -6
  26. package/dist/chunk-C4AJWDFB.mjs.map +1 -0
  27. package/dist/{chunk-UOABOFKO.mjs → chunk-CBFK4W4C.mjs} +3 -3
  28. package/dist/{chunk-UOABOFKO.mjs.map → chunk-CBFK4W4C.mjs.map} +1 -1
  29. package/dist/{chunk-P5F257N3.js → chunk-CVZXZK2X.js} +35 -34
  30. package/dist/chunk-CVZXZK2X.js.map +1 -0
  31. package/dist/{chunk-IHHGT3LP.mjs → chunk-CYAAL3BY.mjs} +6 -5
  32. package/dist/chunk-CYAAL3BY.mjs.map +1 -0
  33. package/dist/{chunk-LVK7VXW7.js → chunk-DMPBNWJB.js} +37 -36
  34. package/dist/chunk-DMPBNWJB.js.map +1 -0
  35. package/dist/{chunk-ESLKQJQS.mjs → chunk-DXLATMGD.mjs} +6 -5
  36. package/dist/chunk-DXLATMGD.mjs.map +1 -0
  37. package/dist/{chunk-P4YYEM4B.js → chunk-EZQ2D47U.js} +7 -10
  38. package/dist/chunk-EZQ2D47U.js.map +1 -0
  39. package/dist/{chunk-6ZMTJSQF.js → chunk-FUHNEP3Y.js} +164 -163
  40. package/dist/chunk-FUHNEP3Y.js.map +1 -0
  41. package/dist/{chunk-YTE6WCBX.js → chunk-JHN2OUWG.js} +64 -63
  42. package/dist/chunk-JHN2OUWG.js.map +1 -0
  43. package/dist/{chunk-AMYQSPQC.js → chunk-JLECJI7S.js} +18 -17
  44. package/dist/chunk-JLECJI7S.js.map +1 -0
  45. package/dist/{chunk-DRORQGN2.js → chunk-KMNWPC64.js} +40 -39
  46. package/dist/chunk-KMNWPC64.js.map +1 -0
  47. package/dist/{chunk-VUAGVZJM.mjs → chunk-NJ6HH4QP.mjs} +6 -5
  48. package/dist/chunk-NJ6HH4QP.mjs.map +1 -0
  49. package/dist/{chunk-OZNTQROP.mjs → chunk-PLTLRL2V.mjs} +7 -10
  50. package/dist/chunk-PLTLRL2V.mjs.map +1 -0
  51. package/dist/{chunk-5ZAZ2C7A.mjs → chunk-PMMP76MV.mjs} +7 -6
  52. package/dist/chunk-PMMP76MV.mjs.map +1 -0
  53. package/dist/{chunk-NJZIE4EH.js → chunk-QF6WL7XU.js} +6 -5
  54. package/dist/chunk-QF6WL7XU.js.map +1 -0
  55. package/dist/{chunk-QRNFTG6A.js → chunk-QGLGQXJE.js} +4 -4
  56. package/dist/{chunk-QRNFTG6A.js.map → chunk-QGLGQXJE.js.map} +1 -1
  57. package/dist/{chunk-GCYYGSHU.js → chunk-R4EKPXX3.js} +564 -1525
  58. package/dist/chunk-R4EKPXX3.js.map +1 -0
  59. package/dist/{chunk-SQZGQOKU.js → chunk-RWYG7QHP.js} +119 -132
  60. package/dist/chunk-RWYG7QHP.js.map +1 -0
  61. package/dist/{chunk-WBEZATIB.js → chunk-RZ3NDH5S.js} +13 -13
  62. package/dist/{chunk-WBEZATIB.js.map → chunk-RZ3NDH5S.js.map} +1 -1
  63. package/dist/{chunk-HGWVJ3VB.mjs → chunk-SJVKID3E.mjs} +4 -3
  64. package/dist/chunk-SJVKID3E.mjs.map +1 -0
  65. package/dist/{chunk-7LILNZMR.mjs → chunk-TJEZL72T.mjs} +4 -3
  66. package/dist/chunk-TJEZL72T.mjs.map +1 -0
  67. package/dist/{chunk-MUOTTGCX.js → chunk-UDYEUTJC.js} +31 -30
  68. package/dist/chunk-UDYEUTJC.js.map +1 -0
  69. package/dist/{chunk-UGJZ3M4Q.js → chunk-VDLMWOQM.js} +55 -54
  70. package/dist/chunk-VDLMWOQM.js.map +1 -0
  71. package/dist/{chunk-KDFBN2L2.mjs → chunk-VZIUQE7B.mjs} +24 -37
  72. package/dist/chunk-VZIUQE7B.mjs.map +1 -0
  73. package/dist/chunk-WR55H7DH.mjs +934 -0
  74. package/dist/chunk-WR55H7DH.mjs.map +1 -0
  75. package/dist/{chunk-ZYVDDSAC.mjs → chunk-YRXDETBK.mjs} +6 -6
  76. package/dist/{chunk-ZYVDDSAC.mjs.map → chunk-YRXDETBK.mjs.map} +1 -1
  77. package/dist/{chunk-VDLAZR7S.mjs → chunk-ZYRL3WER.mjs} +5 -4
  78. package/dist/chunk-ZYRL3WER.mjs.map +1 -0
  79. package/dist/index.js +826 -825
  80. package/dist/index.mjs +4 -3
  81. package/dist/platform/admin/index.js +13 -12
  82. package/dist/platform/admin/index.mjs +7 -6
  83. package/dist/platform/agents-workspace.js +10 -9
  84. package/dist/platform/agents-workspace.mjs +9 -8
  85. package/dist/platform/app-shell.js +6 -5
  86. package/dist/platform/app-shell.mjs +5 -4
  87. package/dist/platform/auth/index.js +30 -29
  88. package/dist/platform/auth/index.mjs +7 -6
  89. package/dist/platform/billing/index.js +6 -5
  90. package/dist/platform/billing/index.mjs +5 -4
  91. package/dist/platform/impersonation/index.js +6 -5
  92. package/dist/platform/impersonation/index.mjs +5 -4
  93. package/dist/platform/index.js +87 -93
  94. package/dist/platform/index.js.map +1 -1
  95. package/dist/platform/index.mjs +23 -29
  96. package/dist/platform/index.mjs.map +1 -1
  97. package/dist/platform/pages/index.js +210 -209
  98. package/dist/platform/pages/index.js.map +1 -1
  99. package/dist/platform/pages/index.mjs +11 -10
  100. package/dist/platform/pages/index.mjs.map +1 -1
  101. package/dist/platform/settings/index.js +10 -9
  102. package/dist/platform/settings/index.mjs +9 -8
  103. package/dist/platform/workflow-canvas-shell.js +8 -7
  104. package/dist/platform/workflow-canvas-shell.mjs +7 -6
  105. package/package.json +1 -1
  106. package/dist/chunk-4JDJRGAB.mjs.map +0 -1
  107. package/dist/chunk-4OFG6POC.mjs.map +0 -1
  108. package/dist/chunk-5ZAZ2C7A.mjs.map +0 -1
  109. package/dist/chunk-6ZMTJSQF.js.map +0 -1
  110. package/dist/chunk-7LILNZMR.mjs.map +0 -1
  111. package/dist/chunk-AMYQSPQC.js.map +0 -1
  112. package/dist/chunk-DRORQGN2.js.map +0 -1
  113. package/dist/chunk-ESLKQJQS.mjs.map +0 -1
  114. package/dist/chunk-GCYYGSHU.js.map +0 -1
  115. package/dist/chunk-HGWVJ3VB.mjs.map +0 -1
  116. package/dist/chunk-IHHGT3LP.mjs.map +0 -1
  117. package/dist/chunk-KDFBN2L2.mjs.map +0 -1
  118. package/dist/chunk-LVK7VXW7.js.map +0 -1
  119. package/dist/chunk-MQNXKBFP.mjs.map +0 -1
  120. package/dist/chunk-MRRFDIUQ.mjs.map +0 -1
  121. package/dist/chunk-MUOTTGCX.js.map +0 -1
  122. package/dist/chunk-NJZIE4EH.js.map +0 -1
  123. package/dist/chunk-OZNTQROP.mjs.map +0 -1
  124. package/dist/chunk-P4YYEM4B.js.map +0 -1
  125. package/dist/chunk-P5F257N3.js.map +0 -1
  126. package/dist/chunk-SQZGQOKU.js.map +0 -1
  127. package/dist/chunk-UGJZ3M4Q.js.map +0 -1
  128. package/dist/chunk-VDLAZR7S.mjs.map +0 -1
  129. package/dist/chunk-VUAGVZJM.mjs.map +0 -1
  130. package/dist/chunk-W5YCZOXO.js.map +0 -1
  131. package/dist/chunk-YTE6WCBX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/auth/mfa-setup.tsx","../src/platform/auth/mfa-manage.tsx","../src/platform/auth/user-profile.tsx"],"names":["useTranslations","useAuth","useState","useCallback","triggerHaptic","jsxs","StepFormPage","jsx","ShieldCheckIcon","OptionGrid","Spinner","Fragment","OtpInput","BackupCodeGrid","FormCheckbox","useFormatter","SectionCard","StatusBadge","EmptyState","ShieldExclamationIcon","ListCard","ListCardItem","Button","PlusIcon","ArrowPathIcon","Sheet","PasswordInput","useLocale","useRef","sharedI18n","UserIcon","BaseForm","Avatar","InlineSpinner","CameraIcon","Input","GlobeAltIcon","CheckCircleIcon","PasswordStrengthMeter","useEffect","ComputerDesktopIcon","Badge","LinkIcon","SegmentedControl"],"mappings":"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","file":"chunk-JHN2OUWG.js","sourcesContent":["import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n StepFormPage,\n OptionGrid,\n FormCheckbox,\n Spinner,\n triggerHaptic,\n type FormStep,\n} from '@ui/index'\nimport { OtpInput, BackupCodeGrid } from './components'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\nimport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaSetup({\n onSuccess,\n onCancel,\n enforcement = 'optional',\n onGenerateSecret,\n onVerifySetup,\n}: MfaSetupProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const setupSteps: FormStep[] = [\n {\n id: 'method',\n title: t('mfa.setup.stepMethodTitle'),\n description: t('mfa.setup.stepMethodDescription'),\n },\n {\n id: 'scan',\n title: t('mfa.setup.stepScanTitle'),\n description: t('mfa.setup.stepScanDescription'),\n },\n {\n id: 'verify',\n title: t('mfa.setup.stepVerifyTitle'),\n description: t('mfa.setup.stepVerifyDescription'),\n },\n {\n id: 'backup',\n title: t('mfa.setup.stepBackupTitle'),\n description: t('mfa.setup.stepBackupDescription'),\n },\n ]\n\n const [currentStep, setCurrentStep] = useState(0)\n const [selectedMethod, setSelectedMethod] = useState('totp')\n const [qrCodeUri, setQrCodeUri] = useState('')\n const [secret, setSecret] = useState('')\n const [verifyCode, setVerifyCode] = useState('')\n const [verifyError, setVerifyError] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [savedBackupCodes, setSavedBackupCodes] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleStepChange = useCallback(\n async (step: number) => {\n // Moving from method -> scan: generate secret\n if (step === 1 && currentStep === 0) {\n setIsLoading(true)\n try {\n if (onGenerateSecret) {\n const result = await onGenerateSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCodeUri)\n } else {\n const result = await client.generateMfaSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCode)\n setBackupCodes(result.backupCodes)\n }\n } catch {\n // Stay on current step if generation fails\n return\n } finally {\n setIsLoading(false)\n }\n }\n triggerHaptic('light')\n setCurrentStep(step)\n },\n [currentStep, onGenerateSecret, client],\n )\n\n const handleMethodSelect = useCallback((method: string) => {\n triggerHaptic('light')\n setSelectedMethod(method)\n }, [])\n\n const handleVerifyComplete = useCallback(\n async (code: string) => {\n setVerifyError(null)\n setIsLoading(true)\n\n try {\n if (onVerifySetup) {\n const result = await onVerifySetup(code)\n if (result.success) {\n triggerHaptic('success')\n if (result.backupCodes?.length) {\n setBackupCodes(result.backupCodes)\n }\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n } else {\n const result = await client.verifyMfaSetup(code)\n if (result.success) {\n triggerHaptic('success')\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorVerificationFailed'))\n } finally {\n setIsLoading(false)\n }\n },\n [onVerifySetup, client, t],\n )\n\n const handleSubmit = useCallback(() => {\n triggerHaptic('success')\n onSuccess?.()\n }, [onSuccess])\n\n const handleCancel = useCallback(() => {\n triggerHaptic('light')\n onCancel?.()\n }, [onCancel])\n\n const canAdvance = (() => {\n switch (currentStep) {\n case 0: return !!selectedMethod\n case 1: return !!qrCodeUri\n case 2: return false // Advance via OTP complete callback\n case 3: return savedBackupCodes\n default: return false\n }\n })()\n\n return (\n <StepFormPage\n title={t('mfa.setup.title')}\n subtitle={\n enforcement === 'required'\n ? t('mfa.setup.subtitleRequired')\n : t('mfa.setup.subtitleOptional')\n }\n label={t('mfa.setup.label')}\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n gradient=\"from-emerald-500 via-teal-500 to-cyan-500\"\n steps={setupSteps}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n isSubmitting={isLoading}\n submitLabel={t('mfa.setup.submitLabel')}\n canAdvance={canAdvance}\n >\n {/* Step 0: Choose method */}\n {currentStep === 0 && (\n <OptionGrid\n icon={<ShieldCheckIcon className=\"h-4 w-4\" />}\n title={t('mfa.setup.methodGridTitle')}\n options={[\n {\n code: 'totp',\n flag: '\\u{1F4F1}',\n label: t('mfa.setup.methodAuthenticatorApp'),\n },\n ]}\n selected={selectedMethod}\n onSelect={handleMethodSelect}\n columns={2}\n />\n )}\n\n {/* Step 1: Scan QR code */}\n {currentStep === 1 && (\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : (\n <>\n {qrCodeUri && (\n <div className=\"flex justify-center\">\n <div className=\"rounded-xl bg-white p-4\">\n <img\n src={qrCodeUri}\n alt={t('mfa.setup.qrCodeAlt')}\n className=\"h-48 w-48\"\n />\n </div>\n </div>\n )}\n\n {secret && (\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {t('mfa.setup.manualSecretLabel')}\n </p>\n <code className=\"font-mono text-sm font-medium text-gray-900 dark:text-white tracking-widest\">\n {secret}\n </code>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Step 2: Verify code */}\n {currentStep === 2 && (\n <div className=\"space-y-4\">\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerifyComplete}\n error={verifyError ?? undefined}\n disabled={isLoading}\n autoFocus\n />\n {isLoading && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Save backup codes */}\n {currentStep === 3 && (\n <div className=\"space-y-4\">\n <BackupCodeGrid\n codes={backupCodes}\n revealed\n />\n <FormCheckbox\n label={t('mfa.setup.backupCodesSavedConfirm')}\n checked={savedBackupCodes}\n onChange={setSavedBackupCodes}\n />\n </div>\n )}\n </StepFormPage>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport { toBusinessDate } from '@datatechsolutions/shared-domain'\nimport {\n SectionCard,\n ListCard,\n ListCardItem,\n StatusBadge,\n EmptyState,\n Button,\n PasswordInput,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport { BackupCodeGrid } from './components'\nimport {\n ShieldCheckIcon,\n PlusIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { ShieldExclamationIcon } from '@heroicons/react/20/solid'\nimport { useAuth } from '../../_auth'\n\nexport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\nimport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaManage({\n mfaEnabled,\n enrolledMethods = [],\n onEnroll,\n onDisable,\n onRegenerateBackupCodes,\n}: MfaManageProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [isBackupSheetOpen, setIsBackupSheetOpen] = useState(false)\n const [newBackupCodes, setNewBackupCodes] = useState<string[]>([])\n const [isRegenerating, setIsRegenerating] = useState(false)\n const [isConfirmDisableOpen, setIsConfirmDisableOpen] = useState(false)\n const [disablePassword, setDisablePassword] = useState('')\n const [disableError, setDisableError] = useState<string | null>(null)\n const [isDisabling, setIsDisabling] = useState(false)\n\n const handleOpenBackupSheet = useCallback(async () => {\n triggerHaptic('medium')\n setIsRegenerating(true)\n try {\n const codes = onRegenerateBackupCodes\n ? await onRegenerateBackupCodes()\n : await client.regenerateBackupCodes()\n setNewBackupCodes(codes)\n setIsBackupSheetOpen(true)\n } catch {\n // Fail silently — caller is responsible for error surfacing\n } finally {\n setIsRegenerating(false)\n }\n }, [onRegenerateBackupCodes, client])\n\n const handleCloseBackupSheet = useCallback(() => {\n triggerHaptic('light')\n setIsBackupSheetOpen(false)\n setNewBackupCodes([])\n }, [])\n\n const handleRequestDisable = useCallback(() => {\n triggerHaptic('warning')\n setDisablePassword('')\n setDisableError(null)\n setIsConfirmDisableOpen(true)\n }, [])\n\n const handleConfirmDisable = useCallback(async () => {\n if (!disablePassword.trim()) {\n setDisableError(t('mfa.manage.disablePasswordRequired'))\n triggerHaptic('error')\n return\n }\n\n setDisableError(null)\n setIsDisabling(true)\n triggerHaptic('medium')\n\n try {\n if (onDisable) {\n onDisable()\n } else {\n const result = await client.disableMfa(disablePassword)\n if (!result.success) {\n setDisableError(result.error ?? t('mfa.manage.disableError'))\n triggerHaptic('error')\n return\n }\n }\n setIsConfirmDisableOpen(false)\n triggerHaptic('success')\n } catch {\n setDisableError(t('mfa.manage.disableError'))\n triggerHaptic('error')\n } finally {\n setIsDisabling(false)\n }\n }, [disablePassword, onDisable, client, t])\n\n const handleCancelDisable = useCallback(() => {\n triggerHaptic('light')\n setIsConfirmDisableOpen(false)\n setDisablePassword('')\n setDisableError(null)\n }, [])\n\n const handleEnroll = useCallback(() => {\n triggerHaptic('light')\n onEnroll?.()\n }, [onEnroll])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <ShieldCheckIcon className=\"h-5 w-5 text-white\" />,\n title: t('mfa.manage.title'),\n subtitle: t('mfa.manage.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: mfaEnabled ? (\n <StatusBadge status=\"active\" label={t('mfa.manage.statusEnabled')} size=\"sm\" />\n ) : (\n <StatusBadge status=\"inactive\" label={t('mfa.manage.statusDisabled')} size=\"sm\" />\n ),\n }}\n padded={false}\n >\n {!mfaEnabled ? (\n /* MFA not enabled — show empty state with enable CTA */\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('mfa.manage.emptyStateMessage')}\n description={t('mfa.manage.emptyStateDescription')}\n icon={ShieldExclamationIcon}\n action={{\n label: t('mfa.manage.enableButton'),\n onClick: handleEnroll,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n /* MFA enabled — show enrolled methods list + action buttons */\n <div className=\"space-y-4 p-4 sm:p-6\">\n {enrolledMethods.length > 0 && (\n <ListCard>\n {enrolledMethods.map((method, index) => (\n <ListCardItem\n key={`${method.type}-${index}`}\n leading={\n <div className=\"h-9 w-9 rounded-xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center shadow-sm\">\n <ShieldCheckIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <StatusBadge status=\"active\" label={t('mfa.manage.methodStatusActive')} size=\"sm\" />\n }\n >\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {method.label}\n </p>\n {method.createdAt && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {t('mfa.manage.methodEnrolledAt', {\n date: format.dateTime(new Date(method.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }),\n })}\n </p>\n )}\n </ListCardItem>\n ))}\n </ListCard>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:gap-3\">\n {onEnroll && (\n <Button\n color=\"ios-glass-blue\"\n onClick={handleEnroll}\n className=\"flex-1\"\n >\n <PlusIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.addMethodButton')}\n </Button>\n )}\n\n <Button\n outline\n onClick={handleOpenBackupSheet}\n loading={isRegenerating}\n disabled={isRegenerating}\n className=\"flex-1\"\n >\n <ArrowPathIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.regenerateBackupCodesButton')}\n </Button>\n\n <Button\n color=\"ios-glass-red\"\n onClick={handleRequestDisable}\n className=\"flex-1\"\n >\n {t('mfa.manage.disableMfaButton')}\n </Button>\n </div>\n </div>\n )}\n </SectionCard>\n\n {/* Backup codes sheet */}\n <Sheet\n open={isBackupSheetOpen}\n onClose={handleCloseBackupSheet}\n title={t('mfa.manage.backupCodesSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.backupCodesSheetDescription')}\n </p>\n <BackupCodeGrid\n codes={newBackupCodes}\n revealed\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleCloseBackupSheet}\n >\n {t('mfa.manage.backupCodesDoneButton')}\n </Button>\n </div>\n </Sheet>\n\n {/* Disable MFA — requires password confirmation */}\n <Sheet\n open={isConfirmDisableOpen}\n onClose={handleCancelDisable}\n title={t('mfa.manage.confirmDisableTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-ios-red shadow-sm\">\n <ShieldExclamationIcon className=\"h-5 w-5 text-white\" />\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.confirmDisableDescription')}\n </p>\n </div>\n\n <PasswordInput\n label={t('mfa.manage.disablePasswordLabel')}\n value={disablePassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisablePassword(event.target.value)}\n placeholder={t('mfa.manage.disablePasswordPlaceholder')}\n disabled={isDisabling}\n autoFocus\n autoComplete=\"current-password\"\n />\n\n {disableError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{disableError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCancelDisable}\n disabled={isDisabling}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableCancelLabel')}\n </Button>\n <Button\n color=\"ios-glass-red\"\n onClick={handleConfirmDisable}\n loading={isDisabling}\n disabled={isDisabling || !disablePassword.trim()}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableConfirmLabel')}\n </Button>\n </div>\n </div>\n </Sheet>\n </>\n )\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslations, useFormatter, useLocale } from '@ui/lib/i18n-context'\nimport {\n SegmentedControl,\n SectionCard,\n BaseForm,\n Input,\n PasswordInput,\n Button,\n ListCard,\n ListCardItem,\n Avatar,\n Badge,\n InlineSpinner,\n triggerHaptic,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport {\n UserIcon,\n ComputerDesktopIcon,\n LinkIcon,\n CheckCircleIcon,\n GlobeAltIcon,\n CameraIcon,\n} from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\nimport { MfaManage } from './mfa-manage'\nimport { MfaSetup } from './mfa-setup'\nimport * as sharedI18n from '@datatechsolutions/shared-domain/i18n'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/i18n'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type { ProfileTab, UserProfileProps } from '@datatechsolutions/shared-domain'\nimport type {\n UserSession,\n LinkedAccount,\n ProfileTab,\n ProfileTabContentProps,\n UserProfileProps,\n} from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: ProfileTab[] = ['profile', 'security', 'sessions', 'linked-accounts']\n\nexport function ProfileTabContent({ onProfileUpdate }: ProfileTabContentProps) {\n const t = useTranslations('windsock')\n const currentLocale = useLocale() as LocaleCode\n const { user, client } = useAuth()\n\n const [name, setName] = useState(user?.name ?? '')\n const [avatarPreview, setAvatarPreview] = useState<string | null>(user?.image ?? null)\n const [isUploadingAvatar, setIsUploadingAvatar] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [selectedLocale, setSelectedLocale] = useState<LocaleCode>(currentLocale)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [saveSuccess, setSaveSuccess] = useState(false)\n\n const handleAvatarChange = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n if (!file) return\n\n // Validate client-side\n if (!['image/jpeg', 'image/png', 'image/webp'].includes(file.type)) {\n setSaveError(t('userProfile.profile.avatarInvalidType'))\n return\n }\n if (file.size > 5 * 1024 * 1024) {\n setSaveError(t('userProfile.profile.avatarTooLarge'))\n return\n }\n\n // Show preview immediately\n const previewUrl = URL.createObjectURL(file)\n setAvatarPreview(previewUrl)\n setSaveError(null)\n setIsUploadingAvatar(true)\n triggerHaptic('light')\n\n try {\n // Upload to S3 via presigned URL\n const uploadResult = await client.uploadFile(file, 'avatars')\n if (!uploadResult.success || !uploadResult.key) {\n throw new Error(uploadResult.error ?? 'Upload failed')\n }\n\n // Save the S3 key to user profile\n const updateResult = await client.updateProfile({ image: uploadResult.key })\n if (!updateResult.success) {\n throw new Error(updateResult.error ?? 'Profile update failed')\n }\n\n triggerHaptic('success')\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Upload failed')\n setAvatarPreview(user?.image ?? null)\n triggerHaptic('error')\n } finally {\n setIsUploadingAvatar(false)\n // Reset file input so same file can be re-selected\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n }, [client, user, t])\n\n const handleSave = useCallback(async () => {\n setSaveError(null)\n setSaveSuccess(false)\n setIsSaving(true)\n triggerHaptic('light')\n try {\n if (onProfileUpdate) {\n await onProfileUpdate({ name, email: user?.email ?? '', locale: selectedLocale })\n } else {\n const result = await client.updateProfile({ name, locale: selectedLocale })\n if (!result.success) {\n throw new Error(result.error)\n }\n }\n setSaveSuccess(true)\n triggerHaptic('success')\n // Persist locale to cookie and reload if changed\n if (selectedLocale !== currentLocale) {\n sharedI18n.setLocaleCookie(selectedLocale)\n window.location.reload()\n }\n } catch {\n setSaveError(t('userProfile.profile.saveError'))\n triggerHaptic('error')\n } finally {\n setIsSaving(false)\n }\n }, [name, selectedLocale, currentLocale, user, onProfileUpdate, client, t])\n\n return (\n <div className=\"space-y-6\">\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.title'),\n subtitle: t('userProfile.profile.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n >\n <BaseForm onSubmit={handleSave} submitLabel={t('userProfile.profile.saveButton')} showFooter={false}>\n {/* Avatar Upload */}\n <div className=\"flex flex-col items-center gap-3 pb-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploadingAvatar}\n className=\"group relative\"\n >\n <Avatar\n src={avatarPreview ?? undefined}\n initials={user?.name?.slice(0, 2).toUpperCase() ?? user?.email?.slice(0, 2).toUpperCase()}\n alt={user?.name ?? 'Profile'}\n className=\"h-20 w-20 text-2xl\"\n />\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/0 transition group-hover:bg-black/40\">\n {isUploadingAvatar ? (\n <InlineSpinner />\n ) : (\n <CameraIcon className=\"h-6 w-6 text-white opacity-0 transition group-hover:opacity-100\" />\n )}\n </div>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/jpeg,image/png,image/webp\"\n onChange={handleAvatarChange}\n className=\"hidden\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.profile.avatarHint')}\n </p>\n </div>\n\n <Input\n label={t('userProfile.profile.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n disabled={isSaving}\n autoComplete=\"name\"\n />\n <Input\n label={t('userProfile.profile.emailLabel')}\n type=\"email\"\n value={user?.email ?? ''}\n readOnly\n disabled\n autoComplete=\"email\"\n />\n\n {saveError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{saveError}</p>\n )}\n\n {saveSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.profile.saveSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n\n <SectionCard\n header={{\n icon: <GlobeAltIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.languageTitle'),\n subtitle: t('userProfile.profile.languageSubtitle'),\n gradient: 'from-lime-400 via-emerald-500 to-green-600',\n }}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {sharedI18n.SUPPORTED_LOCALES.map((code) => {\n const meta = sharedI18n.LANGUAGE_META[code]\n const checked = selectedLocale === code\n return (\n <button\n key={code}\n type=\"button\"\n onClick={() => {\n setSelectedLocale(code)\n triggerHaptic('light')\n }}\n className={`group relative flex flex-col items-center justify-center rounded-xl border px-2 py-2.5 backdrop-blur-xl shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_22px_-16px_rgba(15,23,42,0.45)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.18),0_10px_22px_-16px_rgba(0,0,0,0.75)] transition ${\n checked\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)]'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 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:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n <span className=\"text-lg leading-5\">{meta.flag}</span>\n <span className={`mt-1.5 text-xs font-semibold ${\n checked ? 'text-slate-900 dark:text-indigo-100' : 'text-slate-700 dark:text-slate-100'\n }`}>\n {meta.nativeName}\n </span>\n {checked && (\n <CheckCircleIcon className=\"absolute right-1 top-1 h-3.5 w-3.5 text-indigo-600 dark:text-indigo-300\" />\n )}\n </button>\n )\n })}\n </div>\n {selectedLocale !== currentLocale && (\n <div className=\"mt-4\">\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n onClick={handleSave}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </div>\n )}\n </SectionCard>\n </div>\n )\n}\n\n// ── Security Tab ─────────────────────────────────────────────────────────────\n\nexport function SecurityTabContent() {\n const t = useTranslations('windsock')\n const { client, user, refresh } = useAuth()\n\n const [showMfaSetup, setShowMfaSetup] = useState(false)\n const [currentPassword, setCurrentPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [passwordError, setPasswordError] = useState<string | null>(null)\n const [passwordSuccess, setPasswordSuccess] = useState(false)\n const [isSavingPassword, setIsSavingPassword] = useState(false)\n\n const handleMfaSetupSuccess = useCallback(() => {\n setShowMfaSetup(false)\n // Refresh user state so mfaEnabled reflects the new status\n refresh()\n }, [refresh])\n\n const handleChangePassword = useCallback(async () => {\n setPasswordError(null)\n setPasswordSuccess(false)\n\n if (!currentPassword) {\n setPasswordError(t('userProfile.security.errorCurrentRequired'))\n return\n }\n if (!newPassword) {\n setPasswordError(t('userProfile.security.errorNewRequired'))\n return\n }\n if (newPassword !== confirmPassword) {\n setPasswordError(t('userProfile.security.errorPasswordMismatch'))\n return\n }\n\n setIsSavingPassword(true)\n triggerHaptic('light')\n\n try {\n const result = await client.changePassword(currentPassword, newPassword)\n if (!result.success) {\n setPasswordError(result.error ?? t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n return\n }\n setCurrentPassword('')\n setNewPassword('')\n setConfirmPassword('')\n setPasswordSuccess(true)\n triggerHaptic('success')\n } catch {\n setPasswordError(t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n } finally {\n setIsSavingPassword(false)\n }\n }, [currentPassword, newPassword, confirmPassword, client, t])\n\n return (\n <div className=\"space-y-6\">\n {showMfaSetup ? (\n <MfaSetup\n onSuccess={handleMfaSetupSuccess}\n onCancel={() => setShowMfaSetup(false)}\n />\n ) : (\n <MfaManage\n mfaEnabled={user?.mfaEnabled ?? false}\n enrolledMethods={user?.mfaEnabled ? [{ type: 'totp', label: t('userProfile.security.mfaTotpLabel') }] : []}\n onEnroll={() => setShowMfaSetup(true)}\n />\n )}\n\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.security.changePasswordTitle'),\n subtitle: t('userProfile.security.changePasswordSubtitle'),\n gradient: 'from-blue-500 via-sky-500 to-cyan-500',\n }}\n >\n <BaseForm onSubmit={handleChangePassword} submitLabel={t('userProfile.security.changePasswordButton')} showFooter={false}>\n <PasswordInput\n label={t('userProfile.security.currentPasswordLabel')}\n value={currentPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setCurrentPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"current-password\"\n />\n <PasswordInput\n label={t('userProfile.security.newPasswordLabel')}\n value={newPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n <PasswordStrengthMeter password={newPassword} />\n <PasswordInput\n label={t('userProfile.security.confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n\n {passwordError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{passwordError}</p>\n )}\n\n {passwordSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.security.changePasswordSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSavingPassword}\n disabled={isSavingPassword}\n >\n {t('userProfile.security.changePasswordButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n </div>\n )\n}\n\n// ── Sessions Tab ─────────────────────────────────────────────────────────────\n\nexport function SessionsTabContent() {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [sessions, setSessions] = useState<UserSession[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchSessions = async () => {\n setIsLoading(true)\n try {\n const rawSessions = await client.getSessions()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setSessions(rawSessions.map((session: any) => ({\n id: session.id,\n device: session.userAgent ?? 'Unknown',\n location: session.ipAddress ?? 'Unknown',\n lastActive: typeof session.createdAt === 'string' ? session.createdAt : (session.createdAt as Date).toISOString(),\n current: false,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchSessions()\n return () => { cancelled = true }\n }, [client])\n\n const handleRevoke = useCallback(async (sessionId: string) => {\n setRevokingId(sessionId)\n triggerHaptic('medium')\n try {\n await client.revokeSession(sessionId)\n setSessions((previous) => previous.filter((s) => s.id !== sessionId))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setRevokingId(null)\n }\n }, [client])\n\n return (\n <SectionCard\n header={{\n icon: <ComputerDesktopIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.sessions.title'),\n subtitle: t('userProfile.sessions.subtitle'),\n gradient: 'from-teal-500 via-cyan-500 to-sky-500',\n }}\n padded={false}\n >\n {isLoading ? (\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('userProfile.sessions.loading')}</span>\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.empty')}\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnDevice')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLocation')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLastActive')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnAction')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {sessions.map((session) => (\n <tr key={session.id}>\n <td className=\"px-4 py-3 text-slate-900 dark:text-white\">\n <div className=\"flex items-center gap-2\">\n {session.device}\n {session.current && (\n <Badge color=\"green\">{t('userProfile.sessions.currentBadge')}</Badge>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {session.location}\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {format.relativeTime(new Date(session.lastActive))}\n </td>\n <td className=\"px-4 py-3 text-right\">\n {!session.current && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRevoke(session.id)}\n loading={revokingId === session.id}\n disabled={revokingId !== null}\n >\n {t('userProfile.sessions.revokeButton')}\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n )\n}\n\n// ── Linked Accounts Tab ──────────────────────────────────────────────────────\n\nexport function LinkedAccountsTabContent() {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [accounts, setAccounts] = useState<LinkedAccount[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [actioningProvider, setActioningProvider] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchAccounts = async () => {\n setIsLoading(true)\n try {\n const rawAccounts = await client.getLinkedAccounts()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAccounts(rawAccounts.map((account: any) => ({\n provider: account.provider,\n providerUserId: account.providerAccountId,\n connected: true,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchAccounts()\n return () => { cancelled = true }\n }, [client])\n\n const handleDisconnect = useCallback(async (provider: string) => {\n setActioningProvider(provider)\n triggerHaptic('medium')\n try {\n await client.disconnectProvider(provider)\n setAccounts((previous) => previous.filter((a) => a.provider !== provider))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setActioningProvider(null)\n }\n }, [client])\n\n const providerInitials = (provider: string) =>\n provider.slice(0, 2).toUpperCase()\n\n return (\n <SectionCard\n header={{\n icon: <LinkIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.linkedAccounts.title'),\n subtitle: t('userProfile.linkedAccounts.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n }}\n padded={false}\n >\n {isLoading ? (\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('userProfile.linkedAccounts.loading')}</span>\n </div>\n ) : accounts.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.empty')}\n </p>\n ) : (\n <ListCard>\n {accounts.map((account) => (\n <ListCardItem\n key={account.provider}\n leading={\n <Avatar\n src={account.logoUrl}\n initials={providerInitials(account.provider)}\n alt={account.provider}\n />\n }\n trailing={\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDisconnect(account.provider)}\n loading={actioningProvider === account.provider}\n disabled={actioningProvider !== null}\n >\n {t('userProfile.linkedAccounts.disconnectButton')}\n </Button>\n }\n >\n <div>\n <p className=\"text-sm font-medium capitalize text-slate-900 dark:text-white\">\n {account.provider}\n </p>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.connectedLabel')}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </SectionCard>\n )\n}\n\n// ── UserProfile ──────────────────────────────────────────────────────────────\n\nexport function UserProfile({\n defaultTab = 'profile',\n tabs = ALL_TABS,\n onSignOut: _onSignOut,\n onProfileUpdate,\n}: UserProfileProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const [activeTab, setActiveTab] = useState<ProfileTab>(\n tabs.includes(defaultTab) ? defaultTab : (tabs[0] ?? 'profile'),\n )\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n const segments = tabs.map((tab) => ({\n value: tab,\n label: t(`userProfile.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {tabs.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as ProfileTab)}\n fullWidth\n />\n )}\n\n {activeTab === 'profile' && (\n <ProfileTabContent onProfileUpdate={onProfileUpdate} />\n )}\n\n {activeTab === 'security' && (\n <SecurityTabContent />\n )}\n\n {activeTab === 'sessions' && (\n <SessionsTabContent />\n )}\n\n {activeTab === 'linked-accounts' && (\n <LinkedAccountsTabContent />\n )}\n </div>\n )\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGCYYGSHU_js = require('./chunk-GCYYGSHU.js');
5
- var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
4
+ var chunkR4EKPXX3_js = require('./chunk-R4EKPXX3.js');
6
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
+ var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
7
+ var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
7
8
  var react = require('react');
8
9
  var jsxRuntime = require('react/jsx-runtime');
9
10
 
@@ -19,7 +20,7 @@ function BillingPanel({
19
20
  }) {
20
21
  const t = chunkYXN2K77G_js.useTranslations("windsock");
21
22
  const format = chunkYXN2K77G_js.useFormatter();
22
- const { client } = chunkGCYYGSHU_js.useAuth();
23
+ const { client } = chunkR4EKPXX3_js.useAuth();
23
24
  const [subscription, setSubscription] = react.useState(null);
24
25
  const [plans, setPlans] = react.useState([]);
25
26
  const [isLoading, setIsLoading] = react.useState(true);
@@ -103,7 +104,7 @@ function BillingPanel({
103
104
  }
104
105
  }, [client, load, t]);
105
106
  if (isLoading) {
106
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.InlineSpinner, {}) });
107
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.InlineSpinner, {}) });
107
108
  }
108
109
  const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null;
109
110
  const currentTier = subscription?.tier ?? currentPlan?.tier ?? null;
@@ -117,7 +118,7 @@ function BillingPanel({
117
118
  }
118
119
  ),
119
120
  /* @__PURE__ */ jsxRuntime.jsx(
120
- chunkGCYYGSHU_js.SectionCard,
121
+ chunkR4EKPXX3_js.SectionCard,
121
122
  {
122
123
  header: {
123
124
  title: t("billing.currentPlan.title"),
@@ -127,13 +128,13 @@ function BillingPanel({
127
128
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
128
129
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: currentPlan.name }),
129
130
  /* @__PURE__ */ jsxRuntime.jsx(
130
- chunkGCYYGSHU_js.StatusBadge,
131
+ chunkR4EKPXX3_js.StatusBadge,
131
132
  {
132
133
  status: subscription.status === "active" ? "success" : subscription.status === "past_due" ? "pending" : "error",
133
134
  label: t(`billing.status.${subscription.status}`)
134
135
  }
135
136
  ),
136
- subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.Badge, { color: "amber", children: t("billing.currentPlan.cancelAtPeriodEnd") })
137
+ subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: "amber", children: t("billing.currentPlan.cancelAtPeriodEnd") })
137
138
  ] }),
138
139
  /* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "grid grid-cols-1 gap-3 text-sm sm:grid-cols-2", children: [
139
140
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -153,7 +154,7 @@ function BillingPanel({
153
154
  ] }),
154
155
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2 pt-2", children: [
155
156
  /* @__PURE__ */ jsxRuntime.jsx(
156
- chunkGCYYGSHU_js.Button,
157
+ chunkBHOT22QL_js.Button,
157
158
  {
158
159
  size: "sm",
159
160
  color: "ios-glass-blue",
@@ -164,7 +165,7 @@ function BillingPanel({
164
165
  }
165
166
  ),
166
167
  subscription.status === "active" && !subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(
167
- chunkGCYYGSHU_js.Button,
168
+ chunkBHOT22QL_js.Button,
168
169
  {
169
170
  size: "sm",
170
171
  color: "ios-glass-red",
@@ -179,21 +180,21 @@ function BillingPanel({
179
180
  }
180
181
  ),
181
182
  /* @__PURE__ */ jsxRuntime.jsx(
182
- chunkGCYYGSHU_js.SectionCard,
183
+ chunkR4EKPXX3_js.SectionCard,
183
184
  {
184
185
  header: {
185
186
  title: t("billing.plans.title"),
186
187
  subtitle: t("billing.plans.description")
187
188
  },
188
- children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.ListCard, { children: plans.map((plan) => {
189
+ children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.ListCard, { children: plans.map((plan) => {
189
190
  const isCurrent = currentPlan?.id === plan.id;
190
191
  const isDowngrade = currentTier != null && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0);
191
192
  return /* @__PURE__ */ jsxRuntime.jsx(
192
- chunkGCYYGSHU_js.ListCardItem,
193
+ chunkR4EKPXX3_js.ListCardItem,
193
194
  {
194
195
  leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase", children: plan.tier.charAt(0) }) }),
195
- trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.Badge, { color: "green", children: t("billing.plans.currentBadge") }) : isDowngrade ? /* @__PURE__ */ jsxRuntime.jsx(
196
- chunkGCYYGSHU_js.Button,
196
+ trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: "green", children: t("billing.plans.currentBadge") }) : isDowngrade ? /* @__PURE__ */ jsxRuntime.jsx(
197
+ chunkBHOT22QL_js.Button,
197
198
  {
198
199
  size: "sm",
199
200
  plain: true,
@@ -203,7 +204,7 @@ function BillingPanel({
203
204
  children: t("billing.plans.downgradeAction")
204
205
  }
205
206
  ) : /* @__PURE__ */ jsxRuntime.jsx(
206
- chunkGCYYGSHU_js.Button,
207
+ chunkBHOT22QL_js.Button,
207
208
  {
208
209
  size: "sm",
209
210
  color: "ios-glass-blue",
@@ -236,5 +237,5 @@ function BillingPanel({
236
237
  }
237
238
 
238
239
  exports.BillingPanel = BillingPanel;
239
- //# sourceMappingURL=chunk-AMYQSPQC.js.map
240
- //# sourceMappingURL=chunk-AMYQSPQC.js.map
240
+ //# sourceMappingURL=chunk-JLECJI7S.js.map
241
+ //# sourceMappingURL=chunk-JLECJI7S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/billing/billing-panel.tsx"],"names":["useTranslations","useFormatter","useAuth","useState","useCallback","useEffect","triggerHaptic","jsx","InlineSpinner","jsxs","SectionCard","StatusBadge","Badge","Button","ListCard","ListCardItem"],"mappings":"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","file":"chunk-JLECJI7S.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — BillingPanel\n// Shows the current organization subscription plus the plan catalogue, with\n// actions for opening the Stripe portal, starting checkout, or cancelling.\n// Backed by `AuthClient.getSubscription / getPlans / createPortalSession /\n// createCheckoutSession / cancelSubscription`.\n// =============================================================================\n\nimport { useEffect, useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Badge,\n StatusBadge,\n InlineSpinner,\n ListCard,\n ListCardItem,\n triggerHaptic,\n} from '@ui/index'\nimport type {\n SubscriptionDetails,\n PlanDefinition,\n SubscriptionTier,\n} from '@datatechsolutions/shared-domain'\nimport { useAuth } from '../../_auth'\n\nexport interface BillingPanelProps {\n /**\n * Which billing interval to prefer when starting checkout. Defaults to\n * `'monthly'`. Surface a toggle in the host app if both matter.\n */\n defaultBillingInterval?: 'monthly' | 'yearly'\n /**\n * Called after the portal/checkout URL is resolved. Defaults to\n * `window.location.assign(url)`. Override to open in a new tab, use a\n * router, etc.\n */\n onRedirect?: (url: string) => void\n}\n\nconst TIER_ORDER: Record<SubscriptionTier, number> = {\n free_trial: 0,\n starter: 1,\n professional: 2,\n enterprise: 3,\n}\n\nexport function BillingPanel({\n defaultBillingInterval = 'monthly',\n onRedirect,\n}: BillingPanelProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [subscription, setSubscription] = useState<SubscriptionDetails | null>(null)\n const [plans, setPlans] = useState<PlanDefinition[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [busyAction, setBusyAction] = useState<string | null>(null)\n\n const redirect = useCallback((url: string) => {\n if (onRedirect) {\n onRedirect(url)\n } else if (typeof window !== 'undefined') {\n window.location.assign(url)\n }\n }, [onRedirect])\n\n const load = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const [sub, availablePlans] = await Promise.all([\n client.getSubscription(),\n client.getPlans(),\n ])\n setSubscription(sub)\n setPlans(\n [...availablePlans]\n .filter((plan: { active: boolean }) => plan.active)\n .sort(\n (a: { tier: SubscriptionTier }, b: { tier: SubscriptionTier }) =>\n (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0),\n ),\n )\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError))\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const handleOpenPortal = useCallback(async () => {\n setBusyAction('portal')\n triggerHaptic('light')\n try {\n const { url } = await client.createPortalSession()\n redirect(url)\n } catch (portalError) {\n setError(portalError instanceof Error ? portalError.message : String(portalError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, redirect])\n\n const handleStartCheckout = useCallback(async (planCode: string) => {\n setBusyAction(`checkout:${planCode}`)\n triggerHaptic('light')\n try {\n const { url } = await client.createCheckoutSession(planCode, defaultBillingInterval)\n redirect(url)\n } catch (checkoutError) {\n setError(checkoutError instanceof Error ? checkoutError.message : String(checkoutError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, defaultBillingInterval, redirect])\n\n const handleCancel = useCallback(async () => {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm(t('billing.cancelConfirm'))\n if (!confirmed) return\n }\n setBusyAction('cancel')\n triggerHaptic('warning')\n try {\n const result = await client.cancelSubscription()\n if (!result.success) {\n throw new Error(result.error ?? 'Subscription cancellation failed')\n }\n triggerHaptic('success')\n await load()\n } catch (cancelError) {\n setError(cancelError instanceof Error ? cancelError.message : String(cancelError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, load, t])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null\n const currentTier = subscription?.tier ?? currentPlan?.tier ?? null\n\n return (\n <div className=\"space-y-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {error}\n </div>\n )}\n\n <SectionCard\n header={{\n title: t('billing.currentPlan.title'),\n subtitle: t('billing.currentPlan.description'),\n }}\n >\n {subscription && currentPlan ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {currentPlan.name}\n </span>\n <StatusBadge\n status={\n subscription.status === 'active' ? 'success'\n : subscription.status === 'past_due' ? 'pending'\n : 'error'\n }\n label={t(`billing.status.${subscription.status}`)}\n />\n {subscription.cancelAtPeriodEnd && (\n <Badge color=\"amber\">{t('billing.currentPlan.cancelAtPeriodEnd')}</Badge>\n )}\n </div>\n\n <dl className=\"grid grid-cols-1 gap-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.price')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.number(currentPlan.price, { style: 'currency', currency: currentPlan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${currentPlan.interval}`)}\n </dd>\n </div>\n {subscription.currentPeriodEnd && (\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.renewsOn')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.dateTime(new Date(subscription.currentPeriodEnd), { dateStyle: 'medium' })}\n </dd>\n </div>\n )}\n </dl>\n\n <div className=\"flex flex-wrap gap-2 pt-2\">\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={handleOpenPortal}\n loading={busyAction === 'portal'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.manageInPortal')}\n </Button>\n {subscription.status === 'active' && !subscription.cancelAtPeriodEnd && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleCancel}\n loading={busyAction === 'cancel'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.cancel')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.noSubscription')}\n </p>\n )}\n </SectionCard>\n\n <SectionCard\n header={{\n title: t('billing.plans.title'),\n subtitle: t('billing.plans.description'),\n }}\n >\n {plans.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.plans.empty')}\n </p>\n ) : (\n <ListCard>\n {plans.map((plan) => {\n const isCurrent = currentPlan?.id === plan.id\n const isDowngrade = currentTier != null\n && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0)\n return (\n <ListCardItem\n key={plan.id}\n leading={\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300\">\n <span className=\"text-sm font-bold uppercase\">{plan.tier.charAt(0)}</span>\n </div>\n }\n trailing={\n isCurrent ? (\n <Badge color=\"green\">{t('billing.plans.currentBadge')}</Badge>\n ) : (\n isDowngrade ? (\n <Button\n size=\"sm\"\n plain\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.downgradeAction')}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.selectAction')}\n </Button>\n )\n )\n }\n >\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {plan.name}\n </p>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {format.number(plan.price, { style: 'currency', currency: plan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${plan.interval}`)}\n </span>\n </div>\n {plan.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {plan.description}\n </p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )}\n </SectionCard>\n </div>\n )\n}\n"]}
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkLVK7VXW7_js = require('./chunk-LVK7VXW7.js');
5
- var chunk6ZMTJSQF_js = require('./chunk-6ZMTJSQF.js');
4
+ var chunkDMPBNWJB_js = require('./chunk-DMPBNWJB.js');
5
+ var chunkFUHNEP3Y_js = require('./chunk-FUHNEP3Y.js');
6
6
  var chunkDJDZIRM6_js = require('./chunk-DJDZIRM6.js');
7
- var chunkSQZGQOKU_js = require('./chunk-SQZGQOKU.js');
8
- var chunkGCYYGSHU_js = require('./chunk-GCYYGSHU.js');
7
+ var chunkRWYG7QHP_js = require('./chunk-RWYG7QHP.js');
8
+ var chunkR4EKPXX3_js = require('./chunk-R4EKPXX3.js');
9
9
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
10
10
  var chunkSY4MUT5V_js = require('./chunk-SY4MUT5V.js');
11
+ var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
11
12
  var react = require('react');
12
13
  var reactRouter = require('react-router');
13
14
  var outline = require('@heroicons/react/24/outline');
@@ -180,9 +181,9 @@ function applyWorkflowExecutionEventToStore(actions, event) {
180
181
  }
181
182
  }
182
183
  function useWorkflowRunPresentation(events, status) {
183
- const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
184
- const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
185
- const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
184
+ const clearNodeResults = chunkRWYG7QHP_js.useWorkflowStore((state) => state.clearNodeResults);
185
+ const setIsRunning = chunkRWYG7QHP_js.useWorkflowStore((state) => state.setIsRunning);
186
+ const setNodeResult = chunkRWYG7QHP_js.useWorkflowStore((state) => state.setNodeResult);
186
187
  react.useEffect(() => {
187
188
  if (status === "idle") {
188
189
  resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
@@ -205,9 +206,9 @@ function useWorkflowExecution(workflowId) {
205
206
  const [activeRunId, setActiveRunId] = react.useState(null);
206
207
  const [isLaunching, setIsLaunching] = react.useState(false);
207
208
  const stream = useRunEvents(workflowId || null, activeRunId);
208
- const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
209
- const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
210
- const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
209
+ const clearNodeResults = chunkRWYG7QHP_js.useWorkflowStore((state) => state.clearNodeResults);
210
+ const setIsRunning = chunkRWYG7QHP_js.useWorkflowStore((state) => state.setIsRunning);
211
+ const setNodeResult = chunkRWYG7QHP_js.useWorkflowStore((state) => state.setNodeResult);
211
212
  useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : "idle");
212
213
  react.useEffect(() => {
213
214
  if (stream.status === "completed" || stream.status === "failed" || stream.status === "error") {
@@ -332,7 +333,7 @@ function AgentsWorkspace({ workflowId, messages }) {
332
333
  const tWorkflow = chunkYXN2K77G_js.useTranslations("agents.workflow");
333
334
  const tCommon = chunkYXN2K77G_js.useTranslations("common");
334
335
  const datasourceLabels = useDatasourceLabels();
335
- const { error: notifyError, success: notifySuccess } = chunkGCYYGSHU_js.useNotifications();
336
+ const { error: notifyError, success: notifySuccess } = chunkR4EKPXX3_js.useNotifications();
336
337
  const showSuccess = react.useCallback((title, message) => {
337
338
  notifySuccess(title, message);
338
339
  }, [notifySuccess]);
@@ -356,20 +357,20 @@ function AgentsWorkspace({ workflowId, messages }) {
356
357
  const [datasources, setDatasources] = react.useState([]);
357
358
  const [modelConnections, setModelConnections] = react.useState([]);
358
359
  const [showDatasourceModal, setShowDatasourceModal] = react.useState(false);
359
- const openPipelineSettingsModal = chunkSQZGQOKU_js.useModalStore((s) => s.openPipelineSettingsModal);
360
+ const openPipelineSettingsModal = chunkRWYG7QHP_js.useModalStore((s) => s.openPipelineSettingsModal);
360
361
  const [showRunInputDialog, setShowRunInputDialog] = react.useState(false);
361
362
  const [showPreviewPanel, setShowPreviewPanel] = react.useState(false);
362
363
  const [isCreatingAgent, setIsCreatingAgent] = react.useState(false);
363
- const openSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.openModal);
364
- const closeSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.closeModal);
364
+ const openSubworkflowModal = chunkFUHNEP3Y_js.useSubworkflowStore((s) => s.openModal);
365
+ const closeSubworkflowModal = chunkFUHNEP3Y_js.useSubworkflowStore((s) => s.closeModal);
365
366
  const [deleteTarget, setDeleteTarget] = react.useState(null);
366
367
  const [saveStatus, setSaveStatus] = react.useState("idle");
367
368
  const latestGraphRef = react.useRef(null);
368
369
  const saveTimerRef = react.useRef(null);
369
370
  const skipInitialAutoSaveRef = react.useRef(true);
370
- const showRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.showRunPanel);
371
- const toggleRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.toggleRunPanel);
372
- const workflowNodes = chunkSQZGQOKU_js.useWorkflowStore((state) => state.nodes);
371
+ const showRunPanel = chunkRWYG7QHP_js.useWorkflowStore((state) => state.showRunPanel);
372
+ const toggleRunPanel = chunkRWYG7QHP_js.useWorkflowStore((state) => state.toggleRunPanel);
373
+ const workflowNodes = chunkRWYG7QHP_js.useWorkflowStore((state) => state.nodes);
373
374
  const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId);
374
375
  const loadWorkspaceData = react.useCallback(async () => {
375
376
  setIsLoading(true);
@@ -652,7 +653,7 @@ function AgentsWorkspace({ workflowId, messages }) {
652
653
  }
653
654
  if (!workflow) {
654
655
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-[calc(100vh-120px)] items-center justify-center", children: loadError ? /* @__PURE__ */ jsxRuntime.jsx(
655
- chunkGCYYGSHU_js.PageErrorState,
656
+ chunkR4EKPXX3_js.PageErrorState,
656
657
  {
657
658
  statusCode: 500,
658
659
  title: tCommon("serverError"),
@@ -663,7 +664,7 @@ function AgentsWorkspace({ workflowId, messages }) {
663
664
  retryLabel: tCommon("retry")
664
665
  }
665
666
  ) : /* @__PURE__ */ jsxRuntime.jsx(
666
- chunkGCYYGSHU_js.PageEmptyState,
667
+ chunkR4EKPXX3_js.PageEmptyState,
667
668
  {
668
669
  title: tWorkflow("emptyTitle"),
669
670
  message: tWorkflow("emptyDescription"),
@@ -671,7 +672,7 @@ function AgentsWorkspace({ workflowId, messages }) {
671
672
  }
672
673
  ) });
673
674
  }
674
- return /* @__PURE__ */ jsxRuntime.jsx(chunkSQZGQOKU_js.WorkflowBuilderProvider, { publishableKey: getPublishableKey(), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[calc(100vh-120px)] flex-col", "data-testid": "agents-workspace", children: [
675
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkRWYG7QHP_js.WorkflowBuilderProvider, { publishableKey: getPublishableKey(), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[calc(100vh-120px)] flex-col", "data-testid": "agents-workspace", children: [
675
676
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "liquid-surface flex h-full flex-col overflow-hidden rounded-2xl", children: [
676
677
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 items-center justify-between px-5 py-3", children: [
677
678
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
@@ -693,13 +694,13 @@ function AgentsWorkspace({ workflowId, messages }) {
693
694
  children: workflow.name || tWorkflow("title")
694
695
  }
695
696
  ),
696
- /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.CopyableId, { id: workflowId, className: "text-[10px]" }),
697
+ /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.CopyableId, { id: workflowId, className: "text-[10px]" }),
697
698
  workflow.isDraft ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-amber-100 px-2.5 py-0.5 text-[10px] font-semibold text-amber-800 dark:bg-amber-900/30 dark:text-amber-300", children: tWorkflow("draftBadge") }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-green-100 px-2.5 py-0.5 text-[10px] font-semibold text-green-800 dark:bg-green-900/30 dark:text-green-300", children: tWorkflow("published") }),
698
- /* @__PURE__ */ jsxRuntime.jsx(chunk6ZMTJSQF_js.SaveStatusBadge, { status: saveStatus })
699
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFUHNEP3Y_js.SaveStatusBadge, { status: saveStatus })
699
700
  ] }),
700
701
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
701
702
  /* @__PURE__ */ jsxRuntime.jsx(
702
- chunkGCYYGSHU_js.Button,
703
+ chunkBHOT22QL_js.Button,
703
704
  {
704
705
  size: "xs",
705
706
  plain: true,
@@ -708,11 +709,11 @@ function AgentsWorkspace({ workflowId, messages }) {
708
709
  children: /* @__PURE__ */ jsxRuntime.jsx(outline.ChartBarIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" })
709
710
  }
710
711
  ),
711
- isRunning ? /* @__PURE__ */ jsxRuntime.jsxs(chunkGCYYGSHU_js.Button, { size: "xs", outline: true, onClick: stopWorkflowRun, children: [
712
+ isRunning ? /* @__PURE__ */ jsxRuntime.jsxs(chunkBHOT22QL_js.Button, { size: "xs", outline: true, onClick: stopWorkflowRun, children: [
712
713
  /* @__PURE__ */ jsxRuntime.jsx(outline.StopIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
713
714
  tWorkflow("runPanel.stop")
714
715
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(
715
- chunkGCYYGSHU_js.Button,
716
+ chunkBHOT22QL_js.Button,
716
717
  {
717
718
  size: "xs",
718
719
  outline: true,
@@ -725,7 +726,7 @@ function AgentsWorkspace({ workflowId, messages }) {
725
726
  ]
726
727
  }
727
728
  ),
728
- /* @__PURE__ */ jsxRuntime.jsxs(chunkGCYYGSHU_js.Button, { gradient: true, size: "xs", onClick: () => {
729
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkBHOT22QL_js.Button, { gradient: true, size: "xs", onClick: () => {
729
730
  void handlePublish();
730
731
  }, disabled: isPublishing, children: [
731
732
  /* @__PURE__ */ jsxRuntime.jsx(outline.DocumentCheckIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
@@ -735,7 +736,7 @@ function AgentsWorkspace({ workflowId, messages }) {
735
736
  ] }),
736
737
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
737
738
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(
738
- chunk6ZMTJSQF_js.WorkflowListBar,
739
+ chunkFUHNEP3Y_js.WorkflowListBar,
739
740
  {
740
741
  workflows,
741
742
  activeWorkflowId: workflowId,
@@ -751,7 +752,7 @@ function AgentsWorkspace({ workflowId, messages }) {
751
752
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
752
753
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [
753
754
  /* @__PURE__ */ jsxRuntime.jsx(
754
- chunk6ZMTJSQF_js.NodePalette,
755
+ chunkFUHNEP3Y_js.NodePalette,
755
756
  {
756
757
  agents,
757
758
  tools,
@@ -773,7 +774,7 @@ function AgentsWorkspace({ workflowId, messages }) {
773
774
  }
774
775
  ),
775
776
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
776
- chunk6ZMTJSQF_js.AutoSaveWorkspace,
777
+ chunkFUHNEP3Y_js.AutoSaveWorkspace,
777
778
  {
778
779
  workflowId,
779
780
  className: "h-full w-full",
@@ -801,7 +802,7 @@ function AgentsWorkspace({ workflowId, messages }) {
801
802
  latestGraphRef.current = graph;
802
803
  },
803
804
  renderAgentModal: (props) => /* @__PURE__ */ jsxRuntime.jsx(
804
- chunk6ZMTJSQF_js.AgentModal,
805
+ chunkFUHNEP3Y_js.AgentModal,
805
806
  {
806
807
  ...props,
807
808
  onSaved: () => {
@@ -842,7 +843,7 @@ function AgentsWorkspace({ workflowId, messages }) {
842
843
  ] })
843
844
  ] }),
844
845
  /* @__PURE__ */ jsxRuntime.jsx(
845
- chunk6ZMTJSQF_js.PipelineSettingsModal,
846
+ chunkFUHNEP3Y_js.PipelineSettingsModal,
846
847
  {
847
848
  onSave: async (changes) => {
848
849
  const metadata = {
@@ -859,7 +860,7 @@ function AgentsWorkspace({ workflowId, messages }) {
859
860
  }
860
861
  ),
861
862
  /* @__PURE__ */ jsxRuntime.jsx(
862
- chunk6ZMTJSQF_js.SubworkflowModal,
863
+ chunkFUHNEP3Y_js.SubworkflowModal,
863
864
  {
864
865
  onMaximize: (subworkflowId) => {
865
866
  closeSubworkflowModal();
@@ -883,7 +884,7 @@ function AgentsWorkspace({ workflowId, messages }) {
883
884
  }
884
885
  ),
885
886
  /* @__PURE__ */ jsxRuntime.jsx(
886
- chunk6ZMTJSQF_js.RunPanel,
887
+ chunkFUHNEP3Y_js.RunPanel,
887
888
  {
888
889
  open: showRunPanel,
889
890
  onClose: toggleRunPanel,
@@ -892,7 +893,7 @@ function AgentsWorkspace({ workflowId, messages }) {
892
893
  }
893
894
  ),
894
895
  /* @__PURE__ */ jsxRuntime.jsx(
895
- chunk6ZMTJSQF_js.RunInputDialog,
896
+ chunkFUHNEP3Y_js.RunInputDialog,
896
897
  {
897
898
  open: showRunInputDialog,
898
899
  onClose: () => setShowRunInputDialog(false),
@@ -905,7 +906,7 @@ function AgentsWorkspace({ workflowId, messages }) {
905
906
  }
906
907
  ),
907
908
  /* @__PURE__ */ jsxRuntime.jsx(
908
- chunk6ZMTJSQF_js.PreviewPanel,
909
+ chunkFUHNEP3Y_js.PreviewPanel,
909
910
  {
910
911
  open: showPreviewPanel,
911
912
  onClose: () => setShowPreviewPanel(false),
@@ -914,7 +915,7 @@ function AgentsWorkspace({ workflowId, messages }) {
914
915
  }
915
916
  ),
916
917
  /* @__PURE__ */ jsxRuntime.jsx(
917
- chunkLVK7VXW7_js.DatasourceFormModal,
918
+ chunkDMPBNWJB_js.DatasourceFormModal,
918
919
  {
919
920
  open: showDatasourceModal,
920
921
  onClose: () => setShowDatasourceModal(false),
@@ -925,7 +926,7 @@ function AgentsWorkspace({ workflowId, messages }) {
925
926
  }
926
927
  ),
927
928
  /* @__PURE__ */ jsxRuntime.jsx(
928
- chunkGCYYGSHU_js.DynamicIslandConfirm,
929
+ chunkR4EKPXX3_js.DynamicIslandConfirm,
929
930
  {
930
931
  open: deleteTarget !== null,
931
932
  onClose: () => setDeleteTarget(null),
@@ -944,5 +945,5 @@ exports.resetWorkflowRunPresentation = resetWorkflowRunPresentation;
944
945
  exports.useRunEvents = useRunEvents;
945
946
  exports.useWorkflowExecution = useWorkflowExecution;
946
947
  exports.useWorkflowRunPresentation = useWorkflowRunPresentation;
947
- //# sourceMappingURL=chunk-DRORQGN2.js.map
948
- //# sourceMappingURL=chunk-DRORQGN2.js.map
948
+ //# sourceMappingURL=chunk-KMNWPC64.js.map
949
+ //# sourceMappingURL=chunk-KMNWPC64.js.map