@datatechsolutions/ui 3.3.0 → 3.4.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.
- package/dist/astrlabe/index.d.mts +22 -30
- package/dist/astrlabe/index.d.ts +22 -30
- package/dist/astrlabe/index.js +112 -112
- package/dist/astrlabe/index.mjs +5 -5
- package/dist/astrlabe/workflow-canvas.d.mts +6 -69
- package/dist/astrlabe/workflow-canvas.d.ts +6 -69
- package/dist/astrlabe/workflow-canvas.js +5 -5
- package/dist/astrlabe/workflow-canvas.mjs +4 -4
- package/dist/brand/index.d.mts +1 -15
- package/dist/brand/index.d.ts +1 -15
- package/dist/brand/index.js +0 -14
- package/dist/brand/index.js.map +1 -1
- package/dist/brand/index.mjs +0 -14
- package/dist/brand/index.mjs.map +1 -1
- package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
- package/dist/chunk-2OZZH2IO.js.map +1 -0
- package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
- package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
- package/dist/{chunk-JSNRCYSO.js → chunk-45QAUEYT.js} +4 -4
- package/dist/{chunk-JSNRCYSO.js.map → chunk-45QAUEYT.js.map} +1 -1
- package/dist/{chunk-B67DP7MI.mjs → chunk-4GDWGWHY.mjs} +4 -4
- package/dist/{chunk-B67DP7MI.mjs.map → chunk-4GDWGWHY.mjs.map} +1 -1
- package/dist/{chunk-KR2X2WHJ.js → chunk-4ICEQJH4.js} +53 -53
- package/dist/{chunk-KR2X2WHJ.js.map → chunk-4ICEQJH4.js.map} +1 -1
- package/dist/{chunk-RXZNACMI.js → chunk-6MBWKOPF.js} +33 -33
- package/dist/{chunk-RXZNACMI.js.map → chunk-6MBWKOPF.js.map} +1 -1
- package/dist/{chunk-JN6IL6OH.mjs → chunk-AGGOHPMZ.mjs} +1054 -5229
- package/dist/chunk-AGGOHPMZ.mjs.map +1 -0
- package/dist/{chunk-5GDKCFM5.mjs → chunk-AL73YAV4.mjs} +3 -3
- package/dist/{chunk-5GDKCFM5.mjs.map → chunk-AL73YAV4.mjs.map} +1 -1
- package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
- package/dist/chunk-BUDZNAKL.mjs.map +1 -0
- package/dist/{chunk-OL73LBX5.mjs → chunk-BW67WFHT.mjs} +3 -4
- package/dist/chunk-BW67WFHT.mjs.map +1 -0
- package/dist/{chunk-W5OEBO6E.js → chunk-CF7GOUBQ.js} +13 -14
- package/dist/chunk-CF7GOUBQ.js.map +1 -0
- package/dist/{chunk-IRPS5UCS.mjs → chunk-CUWPLPVY.mjs} +3 -3
- package/dist/{chunk-IRPS5UCS.mjs.map → chunk-CUWPLPVY.mjs.map} +1 -1
- package/dist/{chunk-IJAKZHXX.js → chunk-ERCDMBRT.js} +683 -645
- package/dist/chunk-ERCDMBRT.js.map +1 -0
- package/dist/{chunk-I2NZGVBG.js → chunk-FSBR4RCK.js} +1101 -5313
- package/dist/chunk-FSBR4RCK.js.map +1 -0
- package/dist/{chunk-5RM6NGZ6.mjs → chunk-IDEM3DYF.mjs} +3 -3
- package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-IDEM3DYF.mjs.map} +1 -1
- package/dist/{chunk-NJFRJ6YD.js → chunk-M7KSEUZR.js} +225 -384
- package/dist/chunk-M7KSEUZR.js.map +1 -0
- package/dist/{chunk-AOUUZ52N.js → chunk-MO5FBVV3.js} +85 -86
- package/dist/chunk-MO5FBVV3.js.map +1 -0
- package/dist/{chunk-BR2GAZKG.mjs → chunk-NAFWHJCM.mjs} +7 -7
- package/dist/{chunk-BR2GAZKG.mjs.map → chunk-NAFWHJCM.mjs.map} +1 -1
- package/dist/{chunk-3JJWPOK6.js → chunk-NCLZKVJK.js} +9 -10
- package/dist/chunk-NCLZKVJK.js.map +1 -0
- package/dist/{chunk-R4TQWXNG.mjs → chunk-NVQWHJQH.mjs} +6 -5
- package/dist/chunk-NVQWHJQH.mjs.map +1 -0
- package/dist/{chunk-ZL6C2ZAF.js → chunk-PGVZKMOA.js} +67 -67
- package/dist/{chunk-ZL6C2ZAF.js.map → chunk-PGVZKMOA.js.map} +1 -1
- package/dist/{chunk-UDDZTTLO.mjs → chunk-QBFE7ABE.mjs} +6 -7
- package/dist/chunk-QBFE7ABE.mjs.map +1 -0
- package/dist/{chunk-3ZUMJTDT.mjs → chunk-RFRXS4PC.mjs} +3 -4
- package/dist/{chunk-3JJWPOK6.js.map → chunk-RFRXS4PC.mjs.map} +1 -1
- package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
- package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
- package/dist/{chunk-MWPTSBAI.js → chunk-RLLP7VQJ.js} +26 -26
- package/dist/{chunk-MWPTSBAI.js.map → chunk-RLLP7VQJ.js.map} +1 -1
- package/dist/{chunk-GIQXB3BG.mjs → chunk-RLVOG5OQ.mjs} +3 -3
- package/dist/{chunk-GIQXB3BG.mjs.map → chunk-RLVOG5OQ.mjs.map} +1 -1
- package/dist/{chunk-2WXRRQM3.mjs → chunk-SEYUYGER.mjs} +553 -516
- package/dist/chunk-SEYUYGER.mjs.map +1 -0
- package/dist/{chunk-O6M3KDGT.mjs → chunk-SQ4KGLBZ.mjs} +4 -4
- package/dist/{chunk-O6M3KDGT.mjs.map → chunk-SQ4KGLBZ.mjs.map} +1 -1
- package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
- package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
- package/dist/{chunk-ZM5MVWIT.js → chunk-TUQLZ4QD.js} +5 -6
- package/dist/chunk-TUQLZ4QD.js.map +1 -0
- package/dist/{chunk-TVMLV675.js → chunk-UE2RDQIK.js} +98 -95
- package/dist/chunk-UE2RDQIK.js.map +1 -0
- package/dist/{chunk-HDCUWUNH.js → chunk-UJVDI66K.js} +28 -27
- package/dist/chunk-UJVDI66K.js.map +1 -0
- package/dist/{chunk-PCYL4MII.mjs → chunk-VV6SYMPM.mjs} +156 -314
- package/dist/chunk-VV6SYMPM.mjs.map +1 -0
- package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
- package/dist/chunk-VY52Y5GC.js.map +1 -0
- package/dist/{chunk-LEKZUS6N.mjs → chunk-X3GW7UPN.mjs} +4 -5
- package/dist/chunk-X3GW7UPN.mjs.map +1 -0
- package/dist/{chunk-OCELRSLO.js → chunk-Y2AYFG4E.js} +4 -4
- package/dist/{chunk-OCELRSLO.js.map → chunk-Y2AYFG4E.js.map} +1 -1
- package/dist/{chunk-TIJJHW2Z.js → chunk-YV7F7IXG.js} +36 -36
- package/dist/{chunk-TIJJHW2Z.js.map → chunk-YV7F7IXG.js.map} +1 -1
- package/dist/{chunk-MVBIAXVN.mjs → chunk-ZKSDDFHG.mjs} +14 -11
- package/dist/chunk-ZKSDDFHG.mjs.map +1 -0
- package/dist/{index-VI9gyJXl.d.mts → index-BNRGVAS5.d.mts} +9 -2
- package/dist/index-BoebbJ44.d.mts +49 -0
- package/dist/index-BoebbJ44.d.ts +49 -0
- package/dist/{index-CoB18TbG.d.ts → index-CnCY-b5V.d.ts} +9 -2
- package/dist/index.d.mts +399 -548
- package/dist/index.d.ts +399 -548
- package/dist/index.js +727 -887
- package/dist/index.mjs +3 -3
- package/dist/platform/admin/index.js +12 -12
- package/dist/platform/admin/index.mjs +6 -6
- package/dist/platform/agents-workspace.js +8 -8
- package/dist/platform/agents-workspace.mjs +7 -7
- package/dist/platform/app-shell.js +5 -5
- package/dist/platform/app-shell.mjs +4 -4
- package/dist/platform/auth/index.js +29 -29
- package/dist/platform/auth/index.mjs +6 -6
- package/dist/platform/billing/index.js +5 -5
- package/dist/platform/billing/index.mjs +4 -4
- package/dist/platform/impersonation/index.js +5 -5
- package/dist/platform/impersonation/index.mjs +4 -4
- package/dist/platform/index.d.mts +3 -39
- package/dist/platform/index.d.ts +3 -39
- package/dist/platform/index.js +95 -4805
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +23 -4728
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +4 -4
- package/dist/platform/pages/index.d.ts +4 -4
- package/dist/platform/pages/index.js +197 -197
- package/dist/platform/pages/index.mjs +9 -9
- package/dist/platform/rbac.d.mts +2 -1
- package/dist/platform/rbac.d.ts +2 -1
- package/dist/platform/rbac.js +2 -2
- package/dist/platform/rbac.mjs +1 -1
- package/dist/platform/settings/index.js +9 -9
- package/dist/platform/settings/index.mjs +8 -8
- package/dist/platform/utils/index.js +3 -3
- package/dist/platform/utils/index.js.map +1 -1
- package/dist/platform/utils/index.mjs +1 -1
- package/dist/platform/utils/index.mjs.map +1 -1
- package/dist/platform/workflow-api-client.d.mts +2 -2
- package/dist/platform/workflow-api-client.d.ts +2 -2
- package/dist/platform/workflow-api-client.js +62 -62
- package/dist/platform/workflow-api-client.mjs +2 -2
- package/dist/platform/workflow-canvas-shell.js +6 -6
- package/dist/platform/workflow-canvas-shell.mjs +5 -5
- package/dist/{workflow-api-client-DoYj7nHz.d.mts → workflow-api-client-CpFl3WcG.d.mts} +1 -1
- package/dist/{workflow-api-client-BKD8OfP_.d.ts → workflow-api-client-uLICOanv.d.ts} +1 -1
- package/dist/workflow-canvas--qaYKuMm.d.ts +113 -0
- package/dist/workflow-canvas-B80fmD_n.d.mts +113 -0
- package/package.json +15 -5
- package/src/styles/liquid-glass.css +283 -2
- package/dist/chunk-2WXRRQM3.mjs.map +0 -1
- package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
- package/dist/chunk-AOUUZ52N.js.map +0 -1
- package/dist/chunk-FAGDZEKM.js.map +0 -1
- package/dist/chunk-HDCUWUNH.js.map +0 -1
- package/dist/chunk-HZ4LOVHM.js.map +0 -1
- package/dist/chunk-I2NZGVBG.js.map +0 -1
- package/dist/chunk-IJAKZHXX.js.map +0 -1
- package/dist/chunk-JN6IL6OH.mjs.map +0 -1
- package/dist/chunk-LEKZUS6N.mjs.map +0 -1
- package/dist/chunk-MVBIAXVN.mjs.map +0 -1
- package/dist/chunk-NJFRJ6YD.js.map +0 -1
- package/dist/chunk-OL73LBX5.mjs.map +0 -1
- package/dist/chunk-PCYL4MII.mjs.map +0 -1
- package/dist/chunk-R4TQWXNG.mjs.map +0 -1
- package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
- package/dist/chunk-TVMLV675.js.map +0 -1
- package/dist/chunk-UDDZTTLO.mjs.map +0 -1
- package/dist/chunk-W5OEBO6E.js.map +0 -1
- package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
- package/dist/chunk-ZM5MVWIT.js.map +0 -1
- package/src/brand/logos/kori-icon.svg +0 -45
- package/src/brand/logos/kori-logo-dark.svg +0 -40
- package/src/brand/logos/kori-logo.svg +0 -43
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/billing/billing-panel.tsx"],"names":[],"mappings":"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","file":"chunk-R4TQWXNG.mjs","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 '@datatechsolutions/windsock/client'\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) => plan.active)\n .sort((a, b) => (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0)),\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/utils/lambda-endpoint.ts"],"names":[],"mappings":";AAEA,IAAM,oBAAoB,CAAC,KAAA,KAA0B,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AAErE,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,UAAA,GAAa,YAAY,GAAA,CAAI,uBAAA;AACnC,EAAA,IAAI,UAAA,IAAc,WAAW,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG,OAAO,kBAAkB,UAAU,CAAA;AAEnF,EAAA,MAAM,WAAA,GAAc,YAAY,GAAA,CAAI,oBAAA;AACpC,EAAA,IAAI,WAAA,IAAe,YAAY,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG,OAAO,kBAAkB,WAAW,CAAA;AAEtF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,MAAM,iBAAiB,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC7D,EAAA,OAAO,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAG,cAAc,CAAA,CAAA;AAC/C","file":"chunk-SYNVNTLJ.mjs","sourcesContent":["/// <reference types=\"vite/client\" />\n\nconst trimTrailingSlash = (value: string): string => value.replace(/\\/$/, '')\n\nexport function getLambdaApiBase(): string {\n const directBase = import.meta.env.VITE_LAMBDA_CLIENT_BASE\n if (directBase && directBase.trim().length > 0) return trimTrailingSlash(directBase)\n\n const gatewayBase = import.meta.env.VITE_API_GATEWAY_URL\n if (gatewayBase && gatewayBase.trim().length > 0) return trimTrailingSlash(gatewayBase)\n\n throw new Error(\n 'Missing workflow API base URL. Set VITE_LAMBDA_CLIENT_BASE or VITE_API_GATEWAY_URL.'\n )\n}\n\nexport function buildLambdaApiUrl(path: string): string {\n const normalizedPath = path.startsWith('/') ? path : `/${path}`\n return `${getLambdaApiBase()}${normalizedPath}`\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/auth/mfa-challenge.tsx","../src/platform/auth/sign-in.tsx","../src/platform/auth/verify-email.tsx","../src/platform/auth/sign-up.tsx","../src/platform/auth/forgot-password.tsx","../src/platform/auth/reset-password.tsx","../src/platform/auth/passwordless-sign-in.tsx","../src/platform/auth/consent-screen.tsx","../src/platform/auth/sso-connector-list.tsx","../src/platform/auth/sso-email-form.tsx","../src/platform/auth/user-button.tsx"],"names":["useTranslations","useAuth","useState","useCallback","triggerHaptic","jsxs","jsx","SegmentedControl","OtpInput","Spinner","Input","Button","Card","useSocialProviders","PasswordInput","Fragment","SocialLoginButtons","EnvelopeIcon","AuthLayout","client","useEffect","UserIcon","LockClosedIcon","PasswordStrengthMeter","FormCheckbox","EmptyState","CheckCircleIcon","BaseForm","DevicePhoneMobileIcon","PaperAirplaneIcon","CardContent","Avatar","Badge","ShieldExclamationIcon","ListCard","ListCardItem","InlineSpinner","ChevronRightIcon","BuildingOffice2Icon","Menu","ChevronUpDownIcon","Transition","ArrowRightStartOnRectangleIcon","DynamicIslandConfirm"],"mappings":";;;;;;;;;;;;;AAgBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA,GAAmB,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACpC,QAAA,GAAW;AACb,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAIA,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,EAAE,SAAA,EAAU,GAAIC,cAAA,EAAQ;AAE9B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAoB,MAAM,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,CAAC,CAAA;AAElD,EAAA,MAAM,YAAA,GAAeC,iBAAA;AAAA,IACnB,OAAO,IAAA,KAAiB;AACtB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAAC,8BAAA,CAAc,OAAO,CAAA;AAErB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAC7C,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAAA,8BAAA,CAAc,SAAS,CAAA;AACvB,UAAA,SAAA,IAAY;AAAA,QACd,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,UAAAA,8BAAA,CAAc,OAAO,CAAA;AACrB,UAAA,MAAM,QAAQ,YAAA,GAAe,CAAA;AAC7B,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,CAAA,EAAG;AACd,YAAA,QAAA,CAAS,CAAA,CAAE,4BAA4B,CAAC,CAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,CAAA,CAAE,gCAAgC,CAAC,CAAA;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAAA,8BAAA,CAAc,OAAO,CAAA;AACrB,QAAA,QAAA,CAAS,CAAA,CAAE,uCAAuC,CAAC,CAAA;AAAA,MACrD,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,cAAc,CAAC;AAAA,GAClD;AAEA,EAAA,MAAM,kBAAA,GAAqBD,iBAAA;AAAA,IACzB,CAAC,IAAA,KAAiB;AAChB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,kBAAA,GAAqBA,kBAAY,MAAM;AAC3C,IAAA,IAAI,UAAA,CAAW,MAAK,EAAG;AACrB,MAAA,YAAA,CAAa,UAAA,CAAW,MAAM,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAE7B,EAAA,MAAM,kBAAA,GAAqBA,iBAAA,CAAY,CAAC,KAAA,KAAkB;AACxD,IAAAC,8BAAA,CAAc,OAAO,CAAA;AACrB,IAAA,SAAA,CAAU,KAAkB,CAAA;AAC5B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,aAAA,CAAc,EAAE,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5C,KAAA,EAAO,CAAA;AAAA,IACP,OAAO,CAAA,KAAM,MAAA,GAAS,EAAE,0BAA0B,CAAA,GAAI,EAAE,4BAA4B;AAAA,GACtF,CAAE,CAAA;AAEF,EAAA,MAAM,OAAA,mBACJC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,QAAA,EAAA,MAAA,KAAW,MAAA,GACR,CAAA,CAAE,+BAA+B,CAAA,GACjC,CAAA,CAAE,iCAAiC,CAAA,EACzC;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,iBAAiB,MAAA,GAAS,CAAA,oBACzBA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,MAACC,iCAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,kBAAA;AAAA,QACV,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAID,YAAA,IAAgB,qBACfD,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gHAAA,EACZ,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EACnC,CAAA;AAAA,IAID,MAAA,KAAW,MAAA,oBACVD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAACE,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV,UAAA,EAAY,kBAAA;AAAA,UACZ,OAAO,KAAA,IAAS,MAAA;AAAA,UAChB,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAS;AAAA;AAAA,OACX;AAAA,MACC,gCACCF,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,cAAA,CAACG,4BAAQ,CAAA,EACX;AAAA,KAAA,EAEJ,CAAA;AAAA,IAID,MAAA,KAAW,QAAA,oBACVJ,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAACI,sBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,UAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC1F,WAAA,EAAa,EAAE,qCAAqC,CAAA;AAAA,UACpD,OAAO,KAAA,IAAS,MAAA;AAAA,UAChB,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAJ,cAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,kBAAA;AAAA,UACT,QAAA,EAAU,CAAC,UAAA,CAAW,IAAA,EAAK,IAAK,YAAA;AAAA,UAChC,OAAA,EAAS,YAAA;AAAA,UAER,YAAE,gCAAgC;AAAA;AAAA;AACrC,KAAA,EACF,CAAA;AAAA,IAID,QAAA,oBACCL,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM;AACb,UAAAF,8BAAA,CAAc,OAAO,CAAA;AACrB,UAAA,QAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,SAAA,EAAU,yGAAA;AAAA,QAET,YAAE,mCAAmC;AAAA;AAAA,KACxC,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,UAAU,OAAO,OAAA;AAErB,EAAA,sCACGQ,qBAAA,EAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,+BAC7B,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;AC5KO,SAAS,MAAA,CAAO;AAAA,EACrB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,CAAA,GAAIZ,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,EAAE,oBAAA,EAAsB,iBAAA,EAAkB,GAAIC,cAAAA,EAAQ;AAM5D,EAAA,MAAM,aAAaY,yBAAA,EAAmB;AACtC,EAAA,MAAM,wBAAA,GAAsD,mBAAmB,UAAA,CAAW,SAAA;AAE1F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIX,eAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAkC,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAeC,iBAAAA;AAAA,IACnB,OAAO,KAAA,KAAqB;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,KAAA,EAAO,QAAQ,CAAA;AAEzD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,SAAA,IAAY;AAAA,QACd,CAAA,MAAA,IAAW,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,QAAA,EAAU;AAChD,UAAA,cAAA,CAAe,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,UAAA,QAAA,CAAS,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,QAC3B;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,MAC3B,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,QAAA,EAAU,oBAAA,EAAsB,WAAW,CAAC;AAAA,GACtD;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,QAAA,KAA6B;AAClE,IAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,IAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEG,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,SAAA;AAAA,QACA,QAAA,EAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,QACnC;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,mBACJD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAClB,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,IAAA,EAAK,SAC1F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAIFD,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,WAAA,EACtC,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAACI,sBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,UACrB,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACrF,WAAA,EAAa,EAAE,kBAAkB,CAAA;AAAA,UACjC,YAAA,EAAa,OAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEAJ,cAAAA;AAAA,QAACQ,8BAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,UACxB,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACxF,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,UACpC,YAAA,EAAa,kBAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,MAGC,oCACCR,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,SAAA,EAAU,kGAAA;AAAA,UAET,YAAE,gBAAgB;AAAA;AAAA,OACrB,EACF,CAAA;AAAA,sBAGFA,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAM,iBAAA;AAAA,UACN,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,YAAA,IAAgB,CAAC,KAAA,IAAS,CAAC,QAAA;AAAA,UACrC,OAAA,EAAS,YAAA;AAAA,UAER,YAAE,cAAc;AAAA;AAAA;AACnB,KAAA,EACF,CAAA;AAAA,IAKC,wBAAA,CAAyB,MAAA,GAAS,CAAA,oBACjCN,gBAAAU,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAV,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EAA0D,CAAA,EAC3E,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA,CAAA,CAAE,gBAAgB,GACrB,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,cAAAA;AAAA,QAACU,mCAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAC,GAAG,wBAAwB,CAAA;AAAA,UACvC,eAAA,EAAiB,iBAAA;AAAA,UACjB,OAAA,EAAS,aAAA;AAAA,UACT,QAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,IAID,qCACCX,eAAAA;AAAA,MAACM,uBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAM,gBAAA;AAAA,QACN,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,cAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAL,cAAAA,CAACW,oBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UACjC,EAAE,oBAAoB;AAAA;AAAA;AAAA,KACzB;AAAA,IAID,QAAA,oBACCZ,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sDAAA,EACV,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,WAAW,CAAA;AAAA,MAAG,GAAA;AAAA,sBACjBC,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,0FAAA;AAAA,UAET,YAAE,YAAY;AAAA;AAAA;AACjB,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,UAAU,OAAO,OAAA;AAErB,EAAA,uBACEA,cAAAA,CAACY,2BAAA,EAAA,EAAW,SAAA,EACT,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;AC3MA,IAAM,uBAAA,GAA0B,EAAA;AAEzB,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAA,GAAIlB,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,UAAEmB,QAAA,EAAO,GAAIlB,cAAAA,EAAQ;AAE3B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,uBAAuB,CAAA;AAGhE,EAAAkB,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAY,CAAA,EAAG;AAEnB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,WAAA,CAAY,CAAC,QAAA,KAAa;AACxB,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,aAAA,CAAc,KAAK,CAAA;AACnB,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,GAAW,CAAA;AAAA,MACpB,CAAC,CAAA;AAAA,IACH,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,cAAA,GAAiBjB,iBAAAA;AAAA,IACrB,OAAO,aAAA,KAA0B;AAC/B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAMgB,QAAA,CAAO,WAAA,CAAY,KAAA,EAAO,aAAa,CAAA;AAC7C,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAC9B,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,MACZ,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,QAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAC;AAAA,GAC9B;AAEA,EAAA,MAAM,YAAA,GAAehB,kBAAY,YAAY;AAC3C,IAAA,IAAI,QAAA,GAAW,KAAK,WAAA,EAAa;AAEjC,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,QAAA,IAAW;AACX,MAAA,WAAA,CAAY,uBAAuB,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,CAAC,CAAC,CAAA;AAEvC,EAAA,MAAM,OAAA,mBACJE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,kBAAAA,eAACW,oBAAAA,EAAA,EAAa,SAAA,EAAU,uBAAA,EAAwB,CAAA,EAClD,CAAA;AAAA,sBACAZ,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EACX,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,YAAE,qBAAA,EAAuB,EAAE,KAAA,EAAO,CAAA,EACrC;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oFAAA,EAAqF,IAAA,EAAK,SACtG,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAIFA,cAAAA;AAAA,MAACE,yBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,cAAA;AAAA,QACZ,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAS;AAAA;AAAA,KACX;AAAA,IAGC,YAAA,oBACCF,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,cAAAA,CAACG,wBAAA,EAAA,EAAQ,CAAA,EACX,CAAA;AAAA,oBAIFJ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS,YAAA;AAAA,UACT,QAAA,EAAU,QAAA,GAAW,CAAA,IAAK,WAAA,IAAe,YAAA;AAAA,UACzC,OAAA,EAAS,WAAA;AAAA,UAER,QAAA,EAAA,QAAA,GAAW,CAAA,GACR,CAAA,CAAE,qBAAA,EAAuB,EAAE,SAAS,QAAA,EAAU,CAAA,GAC9C,CAAA,CAAE,mBAAmB;AAAA;AAAA;AAC3B,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,UAAU,OAAO,OAAA;AAErB,EAAA,uBACEL,cAAAA,CAACM,qBAAA,EAAA,EAAK,SAAQ,OAAA,EAAQ,SAAA,EAAU,+BAC7B,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;ACjIO,SAAS,MAAA,CAAO;AAAA,EACrB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,CAAA,GAAIZ,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,UAAEmB,QAAA,EAAQ,iBAAA,EAAkB,GAAIlB,cAAAA,EAAQ;AAK9C,EAAA,MAAM,aAAaY,yBAAAA,EAAmB;AACtC,EAAA,MAAM,wBAAA,GAAsD,mBAAmB,UAAA,CAAW,SAAA;AAE1F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIX,eAAsB,MAAM,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,EAAE,CAAA;AAEzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAeC,iBAAAA;AAAA,IACnB,OAAO,KAAA,KAAqB;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAMgB,SAAO,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,CAAA;AAC/C,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,MACnB,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,MAC3B,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,QAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,UAAU,CAAC;AAAA,GACnC;AAEA,EAAA,MAAM,iBAAA,GAAoBhB,iBAAAA,CAAY,CAAC,QAAA,KAA6B;AAClE,IAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,IAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,uBACEG,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,eAAA;AAAA,QACP,SAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,IAAM,MAAM,IAAA,EAAK,KAAM,EAAA,IAAM,QAAA,KAAa,EAAA,IAAM,aAAA;AAEpF,EAAA,MAAM,OAAA,mBACJD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAClB,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,IAAA,EAAK,SAC1F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAIFD,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,WAAA,EACtC,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAACI,sBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,WAAW,CAAA;AAAA,UACpB,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,OAAA,CAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACpF,WAAA,EAAa,EAAE,iBAAiB,CAAA;AAAA,UAChC,IAAA,kBAAMJ,cAAAA,CAACe,gBAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,UACpC,YAAA,EAAa,MAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEAf,cAAAA;AAAA,QAACI,sBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,UACrB,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACrF,WAAA,EAAa,EAAE,kBAAkB,CAAA;AAAA,UACjC,sBAAMJ,cAAAA,CAACW,oBAAAA,EAAA,EAAa,WAAU,SAAA,EAAU,CAAA;AAAA,UACxC,YAAA,EAAa,OAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEAZ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAACQ,8BAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,YACxB,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAA+C,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACxF,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,IAAA,kBAAMR,cAAAA,CAACgB,sBAAA,EAAA,EAAe,WAAU,SAAA,EAAU,CAAA;AAAA,YAC1C,YAAA,EAAa,cAAA;AAAA,YACb,QAAA,EAAU,YAAA;AAAA,YACV,QAAA,EAAQ;AAAA;AAAA,SACV;AAAA,wBACAhB,cAAAA;AAAA,UAACiB,sCAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,gBAAA,EAAgB;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBAEAjB,cAAAA;AAAA,QAACkB,6BAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,aAAA;AAAA,UACT,QAAA,EAAU,gBAAA;AAAA,UACV,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,UACrB,WAAA,EAAa,EAAE,kBAAkB,CAAA;AAAA,UACjC,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBAEAlB,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,gBAAgB,CAAC,WAAA;AAAA,UAC3B,OAAA,EAAS,YAAA;AAAA,UAER,YAAE,cAAc;AAAA;AAAA;AACnB,KAAA,EACF,CAAA;AAAA,IAKC,yBAAyB,MAAA,GAAS,CAAA,oBACjCN,eAAAA,CAAAU,qBAAA,EACE,QAAA,EAAA;AAAA,sBAAAV,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAAuD,CAAA,EACxE,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA,CAAA,CAAE,gBAAgB,GACrB,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,cAAAA;AAAA,QAACU,mCAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAC,GAAG,wBAAwB,CAAA;AAAA,UACvC,eAAA,EAAiB,iBAAA;AAAA,UACjB,OAAA,EAAS,aAAA;AAAA,UACT,QAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,IAID,QAAA,oBACCX,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sDAAA,EACV,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,oBAAoB,CAAA;AAAA,MAAG,GAAA;AAAA,sBAC1BC,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,0FAAA;AAAA,UAET,YAAE,YAAY;AAAA;AAAA;AACjB,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,UAAU,OAAO,OAAA;AAErB,EAAA,uBACEA,cAAAA,CAACY,2BAAA,EAAA,EAAW,SAAA,EACT,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;ACzMO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EACf,QAAA,GAAW;AACb,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAA,GAAIlB,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,UAAEmB,QAAA,EAAO,GAAIlB,cAAAA,EAAQ;AAE3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAA8B,MAAM,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAeC,iBAAAA;AAAA,IACnB,OAAO,KAAA,KAAqB;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAMgB,QAAA,CAAO,qBAAqB,KAAK,CAAA;AACvC,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,qBAAqB,CAAC,CAAA;AAAA,MACnC,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,QAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAC;AAAA,GAC9B;AAEA,EAAA,MAAM,WAAA,mBACJd,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAACmB,2BAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAMC,uBAAA;AAAA,QACN,OAAA,EAAS,EAAE,4BAA4B,CAAA;AAAA,QACvC,WAAA,EAAa,CAAA,CAAE,kCAAA,EAAoC,EAAE,OAAO;AAAA;AAAA,KAC9D;AAAA,IAEC,0BACCpB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAU,kGAAA;AAAA,QAET,YAAE,cAAc;AAAA;AAAA,KACnB,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,MAAM,WAAA,mBACJD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,IAAA,EAAK,SAC1F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAGFA,cAAAA;AAAA,MAACqB,yBAAA;AAAA,MAAA;AAAA,QACC,sBAAMrB,cAAAA,CAACW,oBAAAA,EAAA,EAAa,WAAU,SAAA,EAAU,CAAA;AAAA,QACxC,SAAA,EAAU,MAAA;AAAA,QACV,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,QAClC,QAAA,EAAU,EAAE,4BAA4B,CAAA;AAAA,QACxC,QAAA,EAAU,YAAA;AAAA,QACV,WAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,QACrC,SAAA,EAAW,YAAA;AAAA,QACX,cAAA,EAAgB,CAAC,KAAA,CAAM,IAAA,EAAK;AAAA,QAC5B,UAAA,EAAY,KAAA;AAAA,QAEZ,QAAA,kBAAAX,cAAAA;AAAA,UAACI,sBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,YACrB,IAAA,EAAK,OAAA;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAA+C,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACrF,WAAA,EAAa,EAAE,kBAAkB,CAAA;AAAA,YACjC,sBAAMJ,cAAAA,CAACW,oBAAAA,EAAA,EAAa,WAAU,SAAA,EAAU,CAAA;AAAA,YACxC,YAAA,EAAa,OAAA;AAAA,YACb,QAAA,EAAU,YAAA;AAAA,YACV,QAAA,EAAQ,IAAA;AAAA,YACR,SAAA,EAAS;AAAA;AAAA;AACX;AAAA,KACF;AAAA,IAGC,0BACCX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAU,yGAAA;AAAA,QAET,YAAE,cAAc;AAAA;AAAA,KACnB,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,MAAM,aAAA,GAAgB,KAAA,KAAU,MAAA,GAAS,WAAA,GAAc,WAAA;AAEvD,EAAA,IAAI,UAAU,OAAO,aAAA;AAErB,EAAA,uBACEA,cAAAA,CAACM,qBAAA,EAAA,EAAK,SAAQ,OAAA,EAAQ,SAAA,EAAU,+BAC7B,QAAA,EAAA,aAAA,EACH,CAAA;AAEJ;AC3HO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAIZ,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,UAAEmB,QAAA,EAAO,GAAIlB,cAAAA,EAAQ;AAE3B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAA6B,MAAM,CAAA;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,cAAA,GAAiB,QAAA,KAAa,EAAA,IAAM,eAAA,KAAoB,MAAM,QAAA,KAAa,eAAA;AACjF,EAAA,MAAM,mBAAA,GAAsB,eAAA,KAAoB,EAAA,IAAM,QAAA,KAAa,eAAA;AAEnE,EAAA,MAAM,YAAA,GAAeC,iBAAAA;AAAA,IACnB,OAAO,KAAA,KAAqB;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,QAAA,CAAS,CAAA,CAAE,uBAAuB,CAAC,CAAA;AACnC,QAAA;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAMgB,QAAA,CAAO,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAC1C,QAAA,QAAA,CAAS,SAAS,CAAA;AAClB,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,MAClC,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,QAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,cAAA,EAAgB,WAAW,CAAC;AAAA,GACxD;AAEA,EAAA,MAAM,iCACJb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,cAAAA;AAAA,IAACmB,2BAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAMC,uBAAAA;AAAA,MACN,OAAA,EAAS,EAAE,2BAA2B,CAAA;AAAA,MACtC,WAAA,EAAa,EAAE,iCAAiC;AAAA;AAAA,GAClD,EACF,CAAA;AAGF,EAAA,MAAM,WAAA,mBACJrB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,IAAA,EAAK,SAC1F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAGFD,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,WAAA,EACtC,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA;AAAA,UAACQ,8BAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,kBAAkB,CAAA;AAAA,YAC3B,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAA+C,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACxF,WAAA,EAAa,EAAE,wBAAwB,CAAA;AAAA,YACvC,sBAAMR,cAAAA,CAACgB,sBAAAA,EAAA,EAAe,WAAU,SAAA,EAAU,CAAA;AAAA,YAC1C,YAAA,EAAa,cAAA;AAAA,YACb,QAAA,EAAU,YAAA;AAAA,YACV,QAAA,EAAQ,IAAA;AAAA,YACR,SAAA,EAAS;AAAA;AAAA,SACX;AAAA,wBACAhB,cAAAA;AAAA,UAACiB,sCAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,gBAAA,EAAgB;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBAEAjB,cAAAA;AAAA,QAACQ,8BAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,UAC/B,KAAA,EAAO,eAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAA+C,kBAAA,CAAmB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC/F,WAAA,EAAa,EAAE,4BAA4B,CAAA;AAAA,UAC3C,sBAAMR,cAAAA,CAACgB,sBAAAA,EAAA,EAAe,WAAU,SAAA,EAAU,CAAA;AAAA,UAC1C,YAAA,EAAa,cAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,KAAA,EAAO,mBAAA,GAAsB,CAAA,CAAE,uBAAuB,CAAA,GAAI,MAAA;AAAA,UAC1D,OAAA,EAAS,cAAA;AAAA,UACT,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,sBAEAhB,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,gBAAgB,CAAC,cAAA;AAAA,UAC3B,OAAA,EAAS,YAAA;AAAA,UAER,YAAE,qBAAqB;AAAA;AAAA;AAC1B,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,aAAA,GAAgB,KAAA,KAAU,SAAA,GAAY,cAAA,GAAiB,WAAA;AAE7D,EAAA,IAAI,UAAU,OAAO,aAAA;AAErB,EAAA,uBACEL,cAAAA,CAACM,qBAAA,EAAA,EAAK,SAAQ,OAAA,EAAQ,SAAA,EAAU,+BAC7B,QAAA,EAAA,aAAA,EACH,CAAA;AAEJ;AC9HO,SAAS,kBAAA,CAAmB;AAAA,EACjC,aAAA,GAAgB,OAAA;AAAA,EAChB,eAAA,GAAkB,CAAC,OAAA,EAAS,KAAK,CAAA;AAAA,EACjC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EACf,QAAA,GAAW;AACb,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAA,GAAIZ,iCAAgB,UAAU,CAAA;AACpC,EAAA,MAAM,UAAEmB,QAAA,EAAO,GAAIlB,cAAAA,EAAQ;AAE3B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAA2B,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA;AAAA,IAC5B,gBAAgB,QAAA,CAAS,aAAa,IAAI,aAAA,GAAiB,eAAA,CAAgB,CAAC,CAAA,IAAK;AAAA,GACnF;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,YAAY,CAAA;AACzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IACnD,KAAA,EAAO,EAAA;AAAA,IACP,OAAO,EAAA,KAAO,OAAA,GAAU,EAAE,cAAc,CAAA,GAAI,EAAE,YAAY;AAAA,GAC5D,CAAE,CAAA;AAEF,EAAA,MAAM,cAAA,GAAiBC,kBAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AAExB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAMgB,QAAA,CAAO,oBAAA,CAAqB,OAAA,EAAS,UAAA,CAAW,MAAM,CAAA;AAC5D,MAAA,OAAA,CAAQ,MAAM,CAAA;AAGd,MAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAI,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,IACrC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAACA,QAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,CAAC,CAAC,CAAA;AAEnC,EAAA,MAAM,gBAAA,GAAmBhB,iBAAAA;AAAA,IACvB,OAAO,aAAA,KAA0B;AAC/B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,MAAA,IAAI;AACF,QAAA,MAAMgB,SAAO,sBAAA,CAAuB,OAAA,EAAS,UAAA,CAAW,IAAA,IAAQ,aAAa,CAAA;AAC7E,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,CAAA,CAAE,yBAAyB,CAAC,CAAA;AACrC,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,MACZ,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAACA,QAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,WAAW,CAAC;AAAA,GAC5C;AAGA,EAAA,MAAM,YAAA,mBACJd,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,eAAA,CAAgB,SAAS,CAAA,oBACxBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,cAAAA;AAAA,MAACC,iCAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,UAAA,UAAA,CAAW,KAA4B,CAAA;AACvC,UAAA,aAAA,CAAc,KAAA,KAAU,OAAA,GAAU,YAAA,GAAe,EAAE,CAAA;AACnD,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACf,CAAA;AAAA,QACA,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAID,KAAA,oBACCD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,IAAA,EAAK,SAC1F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAIFA,cAAAA;AAAA,MAACI,sBAAA;AAAA,MAAA;AAAA,QACC,OAAO,OAAA,KAAY,OAAA,GAAU,EAAE,YAAY,CAAA,GAAI,EAAE,YAAY,CAAA;AAAA,QAC7D,IAAA,EAAM,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,KAAA;AAAA,QACtC,KAAA,EAAO,UAAA;AAAA,QACP,UAAU,CAAC,KAAA,KAA+C,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAC1F,aAAa,OAAA,KAAY,OAAA,GAAU,EAAE,kBAAkB,CAAA,GAAI,EAAE,kBAAkB,CAAA;AAAA,QAC/E,IAAA,EACE,OAAA,KAAY,OAAA,mBACRJ,eAACW,oBAAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA,mBAClCX,cAAAA,CAACsB,6BAAA,EAAA,EAAsB,WAAU,SAAA,EAAU,CAAA;AAAA,QAEjD,YAAA,EAAc,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,KAAA;AAAA,QAC9C,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBAEAtB,cAAAA;AAAA,MAACK,uBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAM,gBAAA;AAAA,QACN,SAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,cAAA;AAAA,QACT,QAAA,EAAU,SAAA,IAAa,CAAC,UAAA,CAAW,IAAA,EAAK;AAAA,QACxC,OAAA,EAAS,SAAA;AAAA,QAER,YAAE,wBAAwB;AAAA;AAAA,KAC7B;AAAA,IAGC,0BACCL,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAU,yGAAA;AAAA,QAET,YAAE,cAAc;AAAA;AAAA,KACnB,EACF;AAAA,GAAA,EAEJ,CAAA;AAIF,EAAA,MAAM,WAAA,mBACJD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAACmB,2BAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAMI,yBAAA;AAAA,QACN,OAAA,EAAS,EAAE,2BAA2B,CAAA;AAAA,QACtC,WAAA,EACE,OAAA,KAAY,OAAA,GACR,CAAA,CAAE,wCAAwC,EAAE,KAAA,EAAO,UAAA,EAAY,IAC/D,CAAA,CAAE,oCAAA,EAAsC,EAAE,KAAA,EAAO,YAAY;AAAA;AAAA,KAErE;AAAA,oBACAvB,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,cAAAA,CAACG,4BAAQ,CAAA,EACX;AAAA,GAAA,EACF,CAAA;AAIF,EAAA,MAAM,aAAA,mBACJJ,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EACX,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EACjC,CAAA;AAAA,sBACAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDACV,QAAA,EAAA,OAAA,KAAY,OAAA,GACT,EAAE,oCAAA,EAAsC,EAAE,OAAO,UAAA,EAAY,IAC7D,CAAA,CAAE,kCAAA,EAAoC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,EACjE;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oFAAA,EAAqF,IAAA,EAAK,SACtG,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAIFA,cAAAA;AAAA,MAACE,yBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,gBAAA;AAAA,QACZ,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,QAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAS;AAAA;AAAA,KACX;AAAA,IAGC,WAAA,oBACCF,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,kBAAAA,cAAAA,CAACG,wBAAA,EAAA,EAAQ,CAAA,EACX,CAAA;AAAA,oBAIFJ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,OAAO,CAAA;AACf,YAAA,OAAA,CAAQ,EAAE,CAAA;AACV,YAAA,QAAA,CAAS,IAAI,CAAA;AAAA,UACf,CAAA;AAAA,UACA,SAAA,EAAU,iGAAA;AAAA,UAET,YAAE,8BAA8B;AAAA;AAAA,OACnC;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,EAAE,CAAA;AACV,YAAA,QAAA,CAAS,IAAI,CAAA;AACb,YAAA,cAAA,EAAe;AAAA,UACjB,CAAA;AAAA,UACA,QAAA,EAAU,SAAA;AAAA,UACV,SAAA,EAAU,8GAAA;AAAA,UAET,YAAE,mBAAmB;AAAA;AAAA;AACxB,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,gBAAgB,IAAA,KAAS,OAAA,GAC3B,YAAA,GACA,IAAA,KAAS,SACP,WAAA,GACA,aAAA;AAEN,EAAA,IAAI,UAAU,OAAO,aAAA;AAErB,EAAA,uBACEA,cAAAA,CAACM,qBAAA,EAAA,EAAK,SAAQ,OAAA,EAAQ,SAAA,EAAU,+BAC7B,QAAA,EAAA,aAAA,EACH,CAAA;AAEJ;AChPO,SAAS,aAAA,CAAc;AAAA,EAC5B,WAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAIZ,iCAAgB,UAAU,CAAA;AAEpC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIE,cAAAA;AAAA,IACxC,MAAM,IAAI,GAAA,CAAI,aAAA,IAAiB,cAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC;AAAA,GACnG;AAEA,EAAA,MAAM,iBAAA,GAAoBC,iBAAAA,CAAY,CAAC,OAAA,EAAiB,OAAA,KAAqB;AAC3E,IAAA,gBAAA,CAAiB,CAAC,QAAA,KAAa;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MACrB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAAC,8BAAA,CAAc,OAAO,CAAA;AACrB,IAAA,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,aAAA,EAAe,SAAS,CAAC,CAAA;AAE7B,EAAA,MAAM,UAAA,GAAaD,kBAAY,MAAM;AACnC,IAAAC,8BAAA,CAAc,OAAO,CAAA;AACrB,IAAA,MAAA,EAAO;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,WAAA,GAAc,YAAY,IAAA,CAC7B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,CAAC,CAAC,CAAA,CACrB,KAAK,EAAE,CAAA,CACP,MAAM,CAAA,EAAG,CAAC,EACV,WAAA,EAAY;AAEf,EAAA,uBACEE,cAAAA,CAACY,2BAAA,EAAA,EACC,QAAA,kBAAAZ,eAACM,qBAAA,EAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,yBAAA,EAC9B,QAAA,kBAAAP,eAAAA,CAACyB,4BAAA,EAAA,EAAY,WAAU,sBAAA,EAErB,QAAA,EAAA;AAAA,oBAAAzB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAACyB,uBAAA;AAAA,QAAA;AAAA,UACC,KAAK,WAAA,CAAY,OAAA;AAAA,UACjB,QAAA,EAAU,WAAA;AAAA,UACV,KAAK,WAAA,CAAY;AAAA;AAAA,OACnB;AAAA,sBAEA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EACb,sBAAY,IAAA,EACf,CAAA;AAAA,UACC,YAAY,QAAA,mBACXA,eAAC0B,sBAAA,EAAA,EAAM,KAAA,EAAM,SACV,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA,mBAEA1B,cAAAA,CAAC0B,sBAAA,EAAA,EAAM,OAAM,OAAA,EACV,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB;AAAA,SAAA,EAEJ,CAAA;AAAA,QAEC,WAAA,CAAY,uBACX1B,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EAA4C,sBAAY,GAAA,EAAI,CAAA;AAAA,wBAG3EA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0CAAA,EACV,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,CAAC,WAAA,CAAY,QAAA,oBACZD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kFAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC2B,6BAAA,EAAA,EAAsB,SAAA,EAAU,4DAAA,EAA6D,CAAA;AAAA,sBAC9F3B,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EACV,QAAA,EAAA,CAAA,CAAE,2BAAA,EAA6B,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,CAAA,EAC5D;AAAA,KAAA,EACF,CAAA;AAAA,oBAIFD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8EAAA,EACV,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAC/B,CAAA;AAAA,sBACAA,cAAAA,CAAC4B,yBAAA,EAAA,EACE,iBAAO,GAAA,CAAI,CAAC,0BACX5B,cAAAA;AAAA,QAAC6B,6BAAA;AAAA,QAAA;AAAA,UAEC,yBACE7B,cAAAA;AAAA,YAACkB,6BAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,cACnC,UAAU,CAAC,OAAA,KAAqB,iBAAA,CAAkB,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,cACnE,KAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEF,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAA,CAAM,EAAA,EAAI,CAAC,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,UAEvE,QAAA,kBAAAnB,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACV,gBAAM,IAAA,EACT,CAAA;AAAA,4BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EAA4C,gBAAM,WAAA,EAAY;AAAA,WAAA,EAC7E;AAAA,SAAA;AAAA,QAfK,KAAA,CAAM;AAAA,OAiBd,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,aAAA;AAAA,UACT,OAAA,EAAS,YAAA;AAAA,UACT,QAAA,EAAU,YAAA,IAAgB,aAAA,CAAc,IAAA,KAAS,CAAA;AAAA,UAEhD,YAAE,uBAAuB;AAAA;AAAA,OAC5B;AAAA,sBACAL,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UAET,YAAE,oBAAoB;AAAA;AAAA;AACzB,KAAA,EACF,CAAA;AAAA,oBAEAL,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AChKO,SAAS,iBAAiB,EAAE,UAAA,EAAY,QAAA,EAAU,OAAA,GAAU,OAAM,EAA0B;AACjG,EAAA,MAAM,CAAA,GAAIN,iCAAgB,UAAU,CAAA;AAEpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sFAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC8B,8BAAA,EAAA,EAAc,CAAA;AAAA,sBACf9B,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE;AAAA,KAAA,EACxC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,uBACEA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2DAAA,EACV,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA,CAAC4B,yBAAA,EAAA,EACE,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc;AAC7B,IAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CACxB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,CAAC,CAAC,CAAA,CACrB,KAAK,EAAE,CAAA,CACP,MAAM,CAAA,EAAG,CAAC,EACV,WAAA,EAAY;AAEf,IAAA,uBACE5B,cAAAA;AAAA,MAAC6B,6BAAA;AAAA,MAAA;AAAA,QAEC,yBACE7B,cAAAA;AAAA,UAACyB,uBAAA;AAAA,UAAA;AAAA,YACC,KAAK,SAAA,CAAU,OAAA;AAAA,YACf,QAAA;AAAA,YACA,KAAK,SAAA,CAAU;AAAA;AAAA,SACjB;AAAA,QAEF,QAAA,kBACE1B,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC0B,sBAAA,EAAA,EAAM,KAAA,EAAM,MAAA,EACV,QAAA,EAAA,SAAA,CAAU,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,4BAA4B,CAAA,GAAI,CAAA,CAAE,4BAA4B,CAAA,EAC/F,CAAA;AAAA,0BACA1B,cAAAA,CAAC+B,sBAAA,EAAA,EAAiB,SAAA,EAAU,uBAAA,EAAwB;AAAA,SAAA,EACtD,CAAA;AAAA,QAEF,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,QAEjC,QAAA,kBAAAhC,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACV,oBAAU,IAAA,EACb,CAAA;AAAA,UACC,SAAA,CAAU,0BACTA,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EAA4C,oBAAU,MAAA,EAAO;AAAA,SAAA,EAE9E;AAAA,OAAA;AAAA,MAzBK,SAAA,CAAU;AAAA,KA0BjB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AC7DO,SAAS,YAAA,CAAa;AAAA,EAC3B,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EACf,QAAA,GAAW;AACb,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAA,GAAIN,iCAAgB,UAAU,CAAA;AAEpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,eAAgB,OAAO,CAAA;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAyB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhE,EAAA,MAAM,aAAA,GAAgBC,iBAAAA;AAAA,IACpB,CAAC,KAAA,KAA2B;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACjB,QAAA,aAAA,CAAc,CAAA,CAAE,kCAAkC,CAAC,CAAA;AACnD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,CAAC,4BAAA,CAA6B,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7C,QAAA,aAAA,CAAc,CAAA,CAAE,iCAAiC,CAAC,CAAA;AAClD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,CAAC;AAAA,GACJ;AAEA,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAAY;AAChD,IAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AAE3B,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,KAAK,CAAA;AAC5C,MAAA,aAAA,CAAc,UAAU,CAAA;AACxB,MAAA,QAAA,CAAS,YAAY,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,CAAc,CAAA,CAAE,oCAAoC,CAAC,CAAA;AAAA,IACvD,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,aAAA,EAAe,aAAA,EAAe,CAAC,CAAC,CAAA;AAE3C,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,IAAA,MAAM,iBAAA,mBACJE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACV,QAAA,EAAA,CAAA,CAAE,+BAA+B,CAAA,EACpC,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,YAAE,kCAAA,EAAoC,EAAE,KAAA,EAAO,CAAA,EAClD;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,QAAA,EAAU,iBAAA;AAAA,UACV,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,sBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,iBAAA;AAAA,UACT,SAAA,EAAU,yGAAA;AAAA,UAET,YAAE,0BAA0B;AAAA;AAAA,OAC/B,EACF;AAAA,KAAA,EACF,CAAA;AAGF,IAAA,IAAI,UAAU,OAAO,iBAAA;AAErB,IAAA,uBACEA,cAAAA,CAACM,qBAAA,EAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,yBAAA,EAC9B,QAAA,kBAAAN,cAAAA,CAACwB,4BAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EACpB,6BACH,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAA,mBACJzB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACV,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0CAAA,EACV,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAD,eAAAA,CAACsB,yBAAA,EAAA,EAAS,QAAA,EAAU,iBAAA,EAAmB,aAAa,CAAA,CAAE,8BAA8B,CAAA,EAAG,UAAA,EAAY,KAAA,EACjG,QAAA,EAAA;AAAA,sBAAArB,cAAAA;AAAA,QAACI,sBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,UACnC,WAAA,EAAa,EAAE,gCAAgC,CAAA;AAAA,UAC/C,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,CAAC,KAAA,KAA+C;AACxD,YAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B,YAAA,IAAI,UAAA,gBAA0B,IAAI,CAAA;AAAA,UACpC,CAAA;AAAA,UACA,OAAO,UAAA,IAAc,MAAA;AAAA,UACrB,IAAA,kBAAMJ,cAAAA,CAACgC,2BAAA,EAAA,EAAoB,WAAU,SAAA,EAAU,CAAA;AAAA,UAC/C,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAa;AAAA;AAAA,OACf;AAAA,sBAEAhC,cAAAA;AAAA,QAACK,uBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,YAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UAET,YAAE,8BAA8B;AAAA;AAAA;AACnC,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,UAAU,OAAO,YAAA;AAErB,EAAA,uBACEL,cAAAA,CAACM,qBAAA,EAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,yBAAA,EAC9B,QAAA,kBAAAN,cAAAA,CAACwB,4BAAA,EAAA,EAAY,SAAA,EAAU,YAAA,EACpB,wBACH,CAAA,EACF,CAAA;AAEJ;AClJA,IAAM,cAAA,GAAiB;AAAA,EACrB,SAAA,EAAW,WAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,mBAAA,EAAqB,WAAA;AAAA,EACrB,oBAAA,EAAsB,UAAA;AAAA,EACtB,mBAAA,EAAqB;AACvB,CAAA;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,GAAY,IAAI,SAAA,EAAW,SAAA,EAAW,QAAO,EAAoB;AAC5F,EAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AACtD,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,KAAW7B,cAAAA,EAAQ;AAEzC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE1D,EAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,EAAM,IAAA,GACvB,IAAA,CAAK,IAAA,CACF,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,CAAC,CAAC,CAAA,CACrB,IAAA,CAAK,EAAE,CAAA,CACP,KAAA,CAAM,CAAA,EAAG,CAAC,EACV,WAAA,EAAY,GACf,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,aAAY,IAAK,IAAA;AAE9C,EAAA,MAAM,iBAAA,GAAoB,aAAa,IAAA,EAAM,KAAA;AAE7C,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAAE,8BAAA,CAAc,OAAO,CAAA;AACrB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,uBAAuB,YAAY;AACvC,IAAAA,8BAAA,CAAc,SAAS,CAAA;AACvB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAI;AAIF,MAAA,SAAA,IAAY;AACZ,MAAA,MAAM,OAAO,GAAG,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAAA,8BAAA,CAAc,OAAO,CAAA;AACrB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,uBACEC,eAAAA,CAAAU,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,eAAAA,CAACkC,YAAA,EAAA,EAAK,EAAA,EAAG,KAAA,EAAM,WAAU,iCAAA,EACvB,QAAA,EAAA;AAAA,sBAAAlC,eAAAA;AAAA,QAACkC,YAAA,CAAK,MAAA;AAAA,QAAL;AAAA,UACC,SAAA,EAAU,kJAAA;AAAA,UACV,cAAY,cAAA,CAAe,SAAA;AAAA,UAE3B,QAAA,EAAA;AAAA,4BAAAjC,cAAAA;AAAA,cAACyB,uBAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,iBAAA;AAAA,gBACL,QAAA,EAAU,YAAA;AAAA,gBACV,GAAA,EAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,SAAS,cAAA,CAAe;AAAA;AAAA,aACnD;AAAA,4BACAzB,cAAAA,CAACkC,uBAAA,EAAA,EAAkB,SAAA,EAAU,0CAAA,EAA2C;AAAA;AAAA;AAAA,OAC1E;AAAA,sBAEAlC,cAAAA;AAAA,QAACmC,kBAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI1B,cAAAA;AAAA,UACJ,KAAA,EAAM,kCAAA;AAAA,UACN,SAAA,EAAU,8BAAA;AAAA,UACV,OAAA,EAAQ,iCAAA;AAAA,UACR,KAAA,EAAM,gCAAA;AAAA,UACN,SAAA,EAAU,iCAAA;AAAA,UACV,OAAA,EAAQ,8BAAA;AAAA,UAER,0BAAAV,eAAAA,CAACkC,YAAA,CAAK,KAAA,EAAL,EAAW,WAAU,iJAAA,EAEpB,QAAA,EAAA;AAAA,4BAAAlC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAACyB,uBAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,iBAAA;AAAA,kBACL,QAAA,EAAU,YAAA;AAAA,kBACV,GAAA,EAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,SAAS,cAAA,CAAe;AAAA;AAAA,eACnD;AAAA,8BACA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,IAAA,EAAM,wBACLC,cAAAA,CAAC,OAAE,SAAA,EAAU,4DAAA,EACV,eAAK,IAAA,EACR,CAAA;AAAA,gBAED,IAAA,EAAM,yBACLA,cAAAA,CAAC,OAAE,SAAA,EAAU,mDAAA,EAAqD,eAAK,KAAA,EAAM;AAAA,eAAA,EAEjF;AAAA,aAAA,EACF,CAAA;AAAA,YAGC,UAAU,MAAA,GAAS,CAAA,oBAClBD,eAAAA,CAAAU,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAT,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACpBA,cAAAA,CAACiC,aAAK,IAAA,EAAL,EACE,WAAC,EAAE,MAAA,uBACFlC,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAS,MAAM;AACb,oBAAAD,8BAAA,CAAc,OAAO,CAAA;AACrB,oBAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,kBACf,CAAA;AAAA,kBACA,SAAA,EAAW,CAAA,8EAAA,EACT,MAAA,GACI,4DAAA,GACA,kCACN,CAAA,CAAA;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,IAAA,mBACJE,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EAAkC,QAAA,EAAA,IAAA,CAAK,MAAkB,CAAA,GACvE,IAAA;AAAA,oBACH,IAAA,CAAK;AAAA;AAAA;AAAA,eACR,EAAA,EAlBY,KAoBhB,CACD,CAAA,EACH,CAAA;AAAA,8BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAmD;AAAA,aAAA,EACpE,CAAA;AAAA,4BAIFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DACb,QAAA,kBAAAA,cAAAA,CAACiC,YAAA,CAAK,IAAA,EAAL,EACE,QAAA,EAAA,CAAC,EAAE,MAAA,uBACFlC,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,oBAAA;AAAA,gBACT,SAAA,EAAW,CAAA,8EAAA,EACT,MAAA,GACI,6DAAA,GACA,gCACN,CAAA,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAC,cAAAA,CAACoC,oCAAA,EAAA,EAA+B,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,kBAC5D,cAAA,CAAe;AAAA;AAAA;AAAA,eAGtB,CAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAGApC,cAAAA;AAAA,MAACqC,qCAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,SAAA,EAAW,oBAAA;AAAA,QACX,OAAO,cAAA,CAAe,mBAAA;AAAA,QACtB,cAAc,cAAA,CAAe,oBAAA;AAAA,QAC7B,aAAa,cAAA,CAAe;AAAA;AAAA;AAC9B,GAAA,EACF,CAAA;AAEJ","file":"chunk-TVMLV675.js","sourcesContent":["import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Input,\n SegmentedControl,\n Button,\n Spinner,\n triggerHaptic,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { useAuth } from '@datatechsolutions/windsock/client'\n\nexport type { MfaMethod, MfaChallengeProps } from '@datatechsolutions/shared-domain'\nimport type { MfaMethod, MfaChallengeProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaChallenge({\n mfaToken,\n onSuccess,\n onCancel,\n availableMethods = ['totp', 'backup'],\n embedded = false,\n}: MfaChallengeProps) {\n const t = useTranslations('windsock')\n const { verifyMFA } = useAuth()\n\n const [method, setMethod] = useState<MfaMethod>('totp')\n const [totpCode, setTotpCode] = useState('')\n const [backupCode, setBackupCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [failureCount, setFailureCount] = useState(0)\n\n const handleVerify = useCallback(\n async (code: string) => {\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n const result = await verifyMFA(mfaToken, code)\n if (result.success) {\n triggerHaptic('success')\n onSuccess?.()\n } else if (result.error) {\n triggerHaptic('error')\n const count = failureCount + 1\n setFailureCount(count)\n if (count >= 3) {\n setError(t('mfa.challenge.errorLockout'))\n } else {\n setError(t('mfa.challenge.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setError(t('mfa.challenge.errorVerificationFailed'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [verifyMFA, mfaToken, onSuccess, failureCount, t],\n )\n\n const handleTotpComplete = useCallback(\n (code: string) => {\n handleVerify(code)\n },\n [handleVerify],\n )\n\n const handleBackupSubmit = useCallback(() => {\n if (backupCode.trim()) {\n handleVerify(backupCode.trim())\n }\n }, [backupCode, handleVerify])\n\n const handleMethodChange = useCallback((value: string) => {\n triggerHaptic('light')\n setMethod(value as MfaMethod)\n setError(null)\n setTotpCode('')\n setBackupCode('')\n }, [])\n\n const segments = availableMethods.map((m) => ({\n value: m,\n label: m === 'totp' ? t('mfa.challenge.methodTotp') : t('mfa.challenge.methodBackup'),\n }))\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\n {t('mfa.challenge.title')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {method === 'totp'\n ? t('mfa.challenge.descriptionTotp')\n : t('mfa.challenge.descriptionBackup')}\n </p>\n </div>\n\n {/* Method toggle */}\n {availableMethods.length > 1 && (\n <div className=\"flex justify-center\">\n <SegmentedControl\n segments={segments}\n value={method}\n onChange={handleMethodChange}\n size=\"sm\"\n />\n </div>\n )}\n\n {/* Lockout warning banner */}\n {failureCount >= 3 && (\n <div className=\"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-400 text-center\">\n {t('mfa.challenge.lockoutWarning')}\n </div>\n )}\n\n {/* TOTP input */}\n {method === 'totp' && (\n <div className=\"space-y-4\">\n <OtpInput\n value={totpCode}\n onChange={setTotpCode}\n onComplete={handleTotpComplete}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n />\n {isSubmitting && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Backup code input */}\n {method === 'backup' && (\n <div className=\"space-y-4\">\n <Input\n value={backupCode}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setBackupCode(event.target.value)}\n placeholder={t('mfa.challenge.backupCodePlaceholder')}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n className=\"font-mono text-center tracking-widest\"\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleBackupSubmit}\n disabled={!backupCode.trim() || isSubmitting}\n loading={isSubmitting}\n >\n {t('mfa.challenge.verifyBackupCode')}\n </Button>\n </div>\n )}\n\n {/* Cancel link */}\n {onCancel && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={() => {\n triggerHaptic('light')\n onCancel()\n }}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('mfa.challenge.useDifferentAccount')}\n </button>\n </div>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {content}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Input,\n PasswordInput,\n Button,\n} from '@ui/index'\nimport {\n AuthLayout,\n SocialLoginButtons,\n type SocialProvider,\n} from './components'\nimport { EnvelopeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, useSocialProviders } from '@datatechsolutions/windsock/client'\nimport { MfaChallenge } from './mfa-challenge'\n\nexport type { SignInProps } from '@datatechsolutions/shared-domain'\nimport type { SignInProps, MfaRequiredState } from '@datatechsolutions/shared-domain'\n\nexport function SignIn({\n onSuccess,\n onSignUp,\n onForgotPassword,\n onPasswordless,\n socialProviders,\n allowPasswordless,\n defaultEmail = '',\n embedded = false,\n heroPanel,\n}: SignInProps) {\n const t = useTranslations('windsock')\n const { loginWithCredentials, loginWithProvider } = useAuth()\n\n // Caller may pass an explicit `socialProviders` prop to pin the\n // button list (useful in tests / storybook); otherwise we fetch\n // the enabled set from the backend so we never advertise a button\n // whose callback will fail.\n const discovered = useSocialProviders()\n const effectiveSocialProviders: readonly SocialProvider[] = socialProviders ?? discovered.providers\n\n const [email, setEmail] = useState(defaultEmail)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [mfaRequired, setMfaRequired] = useState<MfaRequiredState | null>(null)\n const [socialLoading, setSocialLoading] = useState<SocialProvider | null>(null)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n const result = await loginWithCredentials(email, password)\n\n if (result.success) {\n onSuccess?.()\n } else if (result.mfaRequired && result.mfaToken) {\n setMfaRequired({ mfaToken: result.mfaToken })\n } else if (result.error) {\n setError(t('signInError'))\n }\n } catch {\n setError(t('signInError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [email, password, loginWithCredentials, onSuccess, t],\n )\n\n const handleSocialLogin = useCallback((provider: SocialProvider) => {\n setSocialLoading(provider)\n loginWithProvider(provider)\n }, [loginWithProvider])\n\n if (mfaRequired) {\n return (\n <MfaChallenge\n mfaToken={mfaRequired.mfaToken}\n onSuccess={onSuccess}\n onCancel={() => setMfaRequired(null)}\n embedded={embedded}\n />\n )\n }\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('signInTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('signInSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Credentials form */}\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n />\n\n <PasswordInput\n label={t('passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('passwordPlaceholder')}\n autoComplete=\"current-password\"\n disabled={isSubmitting}\n required\n />\n\n {/* Forgot password link */}\n {onForgotPassword && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-sm font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('forgotPassword')}\n </button>\n </div>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-green\"\n size=\"lg\"\n fullWidth\n disabled={isSubmitting || !email || !password}\n loading={isSubmitting}\n >\n {t('signInButton')}\n </Button>\n </form>\n\n {/* Social login divider — only renders when the backend\n reports at least one enabled provider (or the caller passed\n an explicit list). We never show a divider for zero buttons. */}\n {effectiveSocialProviders.length > 0 && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200/60 dark:border-white/10\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-white/80 px-3 text-gray-400 dark:bg-gray-900/80 dark:text-gray-500\">\n {t('orContinueWith')}\n </span>\n </div>\n </div>\n\n <SocialLoginButtons\n providers={[...effectiveSocialProviders]}\n onProviderClick={handleSocialLogin}\n loading={socialLoading}\n disabled={isSubmitting}\n />\n </>\n )}\n\n {/* Passwordless sign-in button */}\n {allowPasswordless && (\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n size=\"lg\"\n fullWidth\n onClick={onPasswordless}\n >\n <EnvelopeIcon className=\"h-5 w-5\" />\n {t('signInPasswordless')}\n </Button>\n )}\n\n {/* Sign up link */}\n {onSignUp && (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('noAccount')}{' '}\n <button\n type=\"button\"\n onClick={onSignUp}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('signUpLink')}\n </button>\n </p>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <AuthLayout heroPanel={heroPanel}>\n {content}\n </AuthLayout>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Button,\n Spinner,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { EnvelopeIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '@datatechsolutions/windsock/client'\n\nexport type { VerifyEmailProps } from '@datatechsolutions/shared-domain'\nimport type { VerifyEmailProps } from '@datatechsolutions/shared-domain'\n\nconst RESEND_COOLDOWN_SECONDS = 60\n\nexport function VerifyEmail({\n email,\n onSuccess,\n onResend,\n embedded = false,\n}: VerifyEmailProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [code, setCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isResending, setIsResending] = useState(false)\n const [cooldown, setCooldown] = useState(RESEND_COOLDOWN_SECONDS)\n\n // Countdown timer for resend cooldown\n useEffect(() => {\n if (cooldown <= 0) return\n\n const timer = setInterval(() => {\n setCooldown((previous) => {\n if (previous <= 1) {\n clearInterval(timer)\n return 0\n }\n return previous - 1\n })\n }, 1000)\n\n return () => clearInterval(timer)\n }, [cooldown])\n\n const handleComplete = useCallback(\n async (completedCode: string) => {\n setError(null)\n setIsSubmitting(true)\n\n try {\n await client.verifyEmail(email, completedCode)\n onSuccess?.()\n } catch {\n setError(t('verifyEmailError'))\n setCode('')\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, email, onSuccess, t],\n )\n\n const handleResend = useCallback(async () => {\n if (cooldown > 0 || isResending) return\n\n setIsResending(true)\n setError(null)\n\n try {\n onResend?.()\n setCooldown(RESEND_COOLDOWN_SECONDS)\n } catch {\n setError(t('resendEmailError'))\n } finally {\n setIsResending(false)\n }\n }, [cooldown, isResending, onResend, t])\n\n const content = (\n <div className=\"space-y-6\">\n {/* Mail icon header */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-blue-50 dark:bg-blue-500/10\">\n <EnvelopeIcon className=\"h-8 w-8 text-ios-blue\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">\n {t('verifyEmailTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('verifyEmailSubtitle', { email })}\n </p>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red text-center\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* OTP input */}\n <OtpInput\n value={code}\n onChange={setCode}\n onComplete={handleComplete}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n />\n\n {/* Spinner while verifying */}\n {isSubmitting && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n\n {/* Resend section */}\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('verifyEmailNoCode')}\n </p>\n <Button\n type=\"button\"\n outline\n onClick={handleResend}\n disabled={cooldown > 0 || isResending || isSubmitting}\n loading={isResending}\n >\n {cooldown > 0\n ? t('resendEmailCooldown', { seconds: cooldown })\n : t('resendEmailButton')}\n </Button>\n </div>\n </div>\n )\n\n if (embedded) return content\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {content}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Input,\n PasswordInput,\n Button,\n FormCheckbox,\n} from '@ui/index'\nimport {\n AuthLayout,\n PasswordStrengthMeter,\n SocialLoginButtons,\n type SocialProvider,\n} from './components'\nimport { EnvelopeIcon, LockClosedIcon, UserIcon } from '@heroicons/react/24/outline'\nimport { useAuth, useSocialProviders } from '@datatechsolutions/windsock/client'\nimport { VerifyEmail } from './verify-email'\n\nexport type { SignUpProps, SignUpPhase } from '@datatechsolutions/shared-domain'\nimport type { SignUpProps, SignUpPhase } from '@datatechsolutions/shared-domain'\n\nexport function SignUp({\n onSuccess,\n onSignIn,\n socialProviders,\n passwordPolicy,\n embedded = false,\n heroPanel,\n}: SignUpProps) {\n const t = useTranslations('windsock')\n const { client, loginWithProvider } = useAuth()\n\n // Same source-of-truth story as SignIn — prop override wins when\n // present, otherwise fetch the enabled list so the register page\n // never advertises a provider that can't complete the callback.\n const discovered = useSocialProviders()\n const effectiveSocialProviders: readonly SocialProvider[] = socialProviders ?? discovered.providers\n\n const [phase, setPhase] = useState<SignUpPhase>('form')\n const [registeredEmail, setRegisteredEmail] = useState('')\n\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [termsAccepted, setTermsAccepted] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [socialLoading, setSocialLoading] = useState<SocialProvider | null>(null)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n await client.register({ name, email, password })\n setRegisteredEmail(email)\n setPhase('verify')\n } catch {\n setError(t('signUpError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, name, email, password, t],\n )\n\n const handleSocialLogin = useCallback((provider: SocialProvider) => {\n setSocialLoading(provider)\n loginWithProvider(provider)\n }, [loginWithProvider])\n\n if (phase === 'verify') {\n return (\n <VerifyEmail\n email={registeredEmail}\n onSuccess={onSuccess}\n embedded={embedded}\n />\n )\n }\n\n const isFormValid = name.trim() !== '' && email.trim() !== '' && password !== '' && termsAccepted\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('signUpTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('signUpSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Registration form */}\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <Input\n label={t('nameLabel')}\n type=\"text\"\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('namePlaceholder')}\n icon={<UserIcon className=\"h-5 w-5\" />}\n autoComplete=\"name\"\n disabled={isSubmitting}\n required\n />\n\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n />\n\n <div className=\"space-y-2\">\n <PasswordInput\n label={t('passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('passwordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n required\n />\n <PasswordStrengthMeter\n password={password}\n policy={passwordPolicy}\n showRequirements\n />\n </div>\n\n <FormCheckbox\n checked={termsAccepted}\n onChange={setTermsAccepted}\n label={t('termsLabel')}\n description={t('termsDescription')}\n disabled={isSubmitting}\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n disabled={isSubmitting || !isFormValid}\n loading={isSubmitting}\n >\n {t('signUpButton')}\n </Button>\n </form>\n\n {/* Social login divider — only rendered when at least one\n provider is enabled. Source: caller's prop override if set,\n otherwise backend /oauth/providers. */}\n {effectiveSocialProviders.length > 0 && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200 dark:border-white/10\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-white dark:bg-gray-900 px-3 text-gray-400 dark:text-gray-500\">\n {t('orContinueWith')}\n </span>\n </div>\n </div>\n\n <SocialLoginButtons\n providers={[...effectiveSocialProviders]}\n onProviderClick={handleSocialLogin}\n loading={socialLoading}\n disabled={isSubmitting}\n />\n </>\n )}\n\n {/* Sign in link */}\n {onSignIn && (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('alreadyHaveAccount')}{' '}\n <button\n type=\"button\"\n onClick={onSignIn}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('signInLink')}\n </button>\n </p>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <AuthLayout heroPanel={heroPanel}>\n {content}\n </AuthLayout>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n BaseForm,\n Input,\n EmptyState,\n} from '@ui/index'\nimport { EnvelopeIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '@datatechsolutions/windsock/client'\n\nexport type { ForgotPasswordProps, ForgotPasswordPhase } from '@datatechsolutions/shared-domain'\nimport type { ForgotPasswordProps, ForgotPasswordPhase } from '@datatechsolutions/shared-domain'\n\nexport function ForgotPassword({\n onSuccess,\n onBack,\n defaultEmail = '',\n embedded = false,\n}: ForgotPasswordProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [phase, setPhase] = useState<ForgotPasswordPhase>('form')\n const [email, setEmail] = useState(defaultEmail)\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n await client.requestPasswordReset(email)\n setPhase('sent')\n onSuccess?.()\n } catch {\n setError(t('forgotPasswordError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, email, onSuccess, t],\n )\n\n const sentContent = (\n <div className=\"space-y-5\">\n <EmptyState\n variant=\"minimal\"\n icon={CheckCircleIcon}\n message={t('forgotPasswordSuccessTitle')}\n description={t('forgotPasswordSuccessDescription', { email })}\n />\n\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n const formContent = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('forgotPasswordTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('forgotPasswordSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n <BaseForm\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n iconColor=\"blue\"\n title={t('forgotPasswordFormTitle')}\n subtitle={t('forgotPasswordFormSubtitle')}\n onSubmit={handleSubmit}\n submitLabel={t('forgotPasswordSubmit')}\n isLoading={isSubmitting}\n submitDisabled={!email.trim()}\n showHeader={false}\n >\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n autoFocus\n />\n </BaseForm>\n\n {/* Back link */}\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n const activeContent = phase === 'sent' ? sentContent : formContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n PasswordInput,\n Button,\n EmptyState,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport { LockClosedIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '@datatechsolutions/windsock/client'\n\nexport type { ResetPasswordProps, ResetPasswordPhase } from '@datatechsolutions/shared-domain'\nimport type { ResetPasswordProps, ResetPasswordPhase } from '@datatechsolutions/shared-domain'\n\nexport function ResetPassword({\n token,\n onSuccess,\n passwordPolicy,\n embedded = false,\n}: ResetPasswordProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [phase, setPhase] = useState<ResetPasswordPhase>('form')\n const [password, setPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const passwordsMatch = password !== '' && confirmPassword !== '' && password === confirmPassword\n const hasPasswordMismatch = confirmPassword !== '' && password !== confirmPassword\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!passwordsMatch) {\n setError(t('passwordMismatchError'))\n return\n }\n\n setIsSubmitting(true)\n\n try {\n await client.resetPassword(token, password)\n setPhase('success')\n onSuccess?.()\n } catch {\n setError(t('resetPasswordError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, token, password, passwordsMatch, onSuccess, t],\n )\n\n const successContent = (\n <div className=\"space-y-5\">\n <EmptyState\n variant=\"minimal\"\n icon={CheckCircleIcon}\n message={t('resetPasswordSuccessTitle')}\n description={t('resetPasswordSuccessDescription')}\n />\n </div>\n )\n\n const formContent = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('resetPasswordTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('resetPasswordSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <PasswordInput\n label={t('newPasswordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('newPasswordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n required\n autoFocus\n />\n <PasswordStrengthMeter\n password={password}\n policy={passwordPolicy}\n showRequirements\n />\n </div>\n\n <PasswordInput\n label={t('confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n placeholder={t('confirmPasswordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n error={hasPasswordMismatch ? t('passwordMismatchError') : undefined}\n success={passwordsMatch}\n required\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n disabled={isSubmitting || !passwordsMatch}\n loading={isSubmitting}\n >\n {t('resetPasswordButton')}\n </Button>\n </form>\n </div>\n )\n\n const activeContent = phase === 'success' ? successContent : formContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Input,\n Button,\n EmptyState,\n SegmentedControl,\n Spinner,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { EnvelopeIcon, DevicePhoneMobileIcon, PaperAirplaneIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '@datatechsolutions/windsock/client'\n\nexport type { PasswordlessChannel, PasswordlessSignInProps, PasswordlessStep } from '@datatechsolutions/shared-domain'\nimport type { PasswordlessChannel, PasswordlessSignInProps, PasswordlessStep } from '@datatechsolutions/shared-domain'\n\nexport function PasswordlessSignIn({\n defaultMethod = 'email',\n allowedChannels = ['email', 'sms'],\n onSuccess,\n onBack,\n defaultEmail = '',\n embedded = false,\n}: PasswordlessSignInProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [step, setStep] = useState<PasswordlessStep>('input')\n const [channel, setChannel] = useState<PasswordlessChannel>(\n allowedChannels.includes(defaultMethod) ? defaultMethod : (allowedChannels[0] ?? 'email'),\n )\n const [identifier, setIdentifier] = useState(defaultEmail)\n const [code, setCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSending, setIsSending] = useState(false)\n const [isVerifying, setIsVerifying] = useState(false)\n\n const channelSegments = allowedChannels.map((ch) => ({\n value: ch,\n label: ch === 'email' ? t('channelEmail') : t('channelSms'),\n }))\n\n const handleSendCode = useCallback(async () => {\n if (!identifier.trim()) return\n\n setError(null)\n setIsSending(true)\n\n try {\n await client.sendPasswordlessCode(channel, identifier.trim())\n setStep('sent')\n\n // Auto-advance to OTP entry after a brief confirmation display\n setTimeout(() => setStep('verify'), 1500)\n } catch {\n setError(t('passwordlessSendError'))\n } finally {\n setIsSending(false)\n }\n }, [client, channel, identifier, t])\n\n const handleVerifyCode = useCallback(\n async (completedCode: string) => {\n setError(null)\n setIsVerifying(true)\n\n try {\n await client.verifyPasswordlessCode(channel, identifier.trim(), completedCode)\n onSuccess?.()\n } catch {\n setError(t('passwordlessVerifyError'))\n setCode('')\n } finally {\n setIsVerifying(false)\n }\n },\n [client, channel, identifier, onSuccess, t],\n )\n\n // Step 1: Channel + identifier input\n const inputContent = (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('passwordlessTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('passwordlessSubtitle')}\n </p>\n </div>\n\n {/* Channel selector */}\n {allowedChannels.length > 1 && (\n <div className=\"flex justify-center\">\n <SegmentedControl\n segments={channelSegments}\n value={channel}\n onChange={(value: string) => {\n setChannel(value as PasswordlessChannel)\n setIdentifier(value === 'email' ? defaultEmail : '')\n setError(null)\n }}\n size=\"sm\"\n />\n </div>\n )}\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Identifier input */}\n <Input\n label={channel === 'email' ? t('emailLabel') : t('phoneLabel')}\n type={channel === 'email' ? 'email' : 'tel'}\n value={identifier}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setIdentifier(event.target.value)}\n placeholder={channel === 'email' ? t('emailPlaceholder') : t('phonePlaceholder')}\n icon={\n channel === 'email'\n ? <EnvelopeIcon className=\"h-5 w-5\" />\n : <DevicePhoneMobileIcon className=\"h-5 w-5\" />\n }\n autoComplete={channel === 'email' ? 'email' : 'tel'}\n disabled={isSending}\n autoFocus\n />\n\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendCode}\n disabled={isSending || !identifier.trim()}\n loading={isSending}\n >\n {t('passwordlessSendButton')}\n </Button>\n\n {/* Back link */}\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n // Step 2: Sent confirmation (brief auto-advancing state)\n const sentContent = (\n <div className=\"space-y-6\">\n <EmptyState\n variant=\"minimal\"\n icon={PaperAirplaneIcon}\n message={t('passwordlessCodeSentTitle')}\n description={\n channel === 'email'\n ? t('passwordlessCodeSentEmailDescription', { email: identifier })\n : t('passwordlessCodeSentSmsDescription', { phone: identifier })\n }\n />\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n </div>\n )\n\n // Step 3: OTP entry\n const verifyContent = (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">\n {t('passwordlessEnterCodeTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {channel === 'email'\n ? t('passwordlessEnterCodeEmailSubtitle', { email: identifier })\n : t('passwordlessEnterCodeSmsSubtitle', { phone: identifier })}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red text-center\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* OTP input */}\n <OtpInput\n value={code}\n onChange={setCode}\n onComplete={handleVerifyCode}\n error={error ?? undefined}\n disabled={isVerifying}\n autoFocus\n />\n\n {/* Verifying spinner */}\n {isVerifying && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n\n {/* Resend / back */}\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => {\n setStep('input')\n setCode('')\n setError(null)\n }}\n className=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('passwordlessChangeIdentifier')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setCode('')\n setError(null)\n handleSendCode()\n }}\n disabled={isSending}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors disabled:opacity-50\"\n >\n {t('resendEmailButton')}\n </button>\n </div>\n </div>\n )\n\n const activeContent = step === 'input'\n ? inputContent\n : step === 'sent'\n ? sentContent\n : verifyContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n CardContent,\n Avatar,\n Badge,\n ListCard,\n ListCardItem,\n FormCheckbox,\n Button,\n triggerHaptic,\n} from '@ui/index'\nimport { AuthLayout } from './components'\nimport { ShieldExclamationIcon } from '@heroicons/react/24/outline'\n\nexport type { ConsentScreenProps } from '@datatechsolutions/shared-domain'\nimport type { ConsentScreenProps } from '@datatechsolutions/shared-domain'\n\nexport function ConsentScreen({\n application,\n scopes,\n grantedScopes,\n onApprove,\n onDeny,\n isSubmitting = false,\n}: ConsentScreenProps) {\n const t = useTranslations('windsock')\n\n const [checkedScopes, setCheckedScopes] = useState<Set<string>>(\n () => new Set(grantedScopes && grantedScopes.length > 0 ? grantedScopes : scopes.map((s) => s.id)),\n )\n\n const handleScopeToggle = useCallback((scopeId: string, checked: boolean) => {\n setCheckedScopes((previous) => {\n const next = new Set(previous)\n if (checked) {\n next.add(scopeId)\n } else {\n next.delete(scopeId)\n }\n return next\n })\n }, [])\n\n const handleApprove = useCallback(() => {\n triggerHaptic('light')\n onApprove(Array.from(checkedScopes))\n }, [checkedScopes, onApprove])\n\n const handleDeny = useCallback(() => {\n triggerHaptic('light')\n onDeny()\n }, [onDeny])\n\n const appInitials = application.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <AuthLayout>\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"space-y-6 p-6 sm:p-8\">\n {/* App identity */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Avatar\n src={application.logoUrl}\n initials={appInitials}\n alt={application.name}\n />\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {application.name}\n </span>\n {application.verified ? (\n <Badge color=\"green\">\n {t('consent.verified')}\n </Badge>\n ) : (\n <Badge color=\"amber\">\n {t('consent.unverified')}\n </Badge>\n )}\n </div>\n\n {application.url && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{application.url}</p>\n )}\n\n <p className=\"text-sm text-gray-600 dark:text-gray-300\">\n {t('consent.wantsAccess')}\n </p>\n </div>\n </div>\n\n {/* Unverified warning */}\n {!application.verified && (\n <div className=\"flex items-start gap-3 rounded-xl border border-amber-500/30 bg-amber-500/10 p-3\">\n <ShieldExclamationIcon className=\"mt-0.5 h-5 w-5 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-sm text-amber-700 dark:text-amber-300\">\n {t('consent.unverifiedWarning', { name: application.name })}\n </p>\n </div>\n )}\n\n {/* Scopes */}\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('consent.permissionsLabel')}\n </p>\n <ListCard>\n {scopes.map((scope) => (\n <ListCardItem\n key={scope.id}\n leading={\n <FormCheckbox\n checked={checkedScopes.has(scope.id)}\n onChange={(checked: boolean) => handleScopeToggle(scope.id, checked)}\n label=\"\"\n />\n }\n onClick={() => handleScopeToggle(scope.id, !checkedScopes.has(scope.id))}\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {scope.name}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{scope.description}</p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-2 sm:flex-row-reverse\">\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleApprove}\n loading={isSubmitting}\n disabled={isSubmitting || checkedScopes.size === 0}\n >\n {t('consent.approveButton')}\n </Button>\n <Button\n outline\n fullWidth\n onClick={handleDeny}\n disabled={isSubmitting}\n >\n {t('consent.denyButton')}\n </Button>\n </div>\n\n <p className=\"text-center text-xs text-gray-400 dark:text-gray-500\">\n {t('consent.footerNote')}\n </p>\n </CardContent>\n </Card>\n </AuthLayout>\n )\n}\n","import { useTranslations } from '@ui/lib/i18n-context'\nimport { Avatar, Badge, ListCard, ListCardItem, InlineSpinner } from '@ui/index'\nimport { ChevronRightIcon } from '@heroicons/react/20/solid'\n\nexport type { SsoConnector, SsoConnectorListProps } from '@datatechsolutions/shared-domain'\nimport type { SsoConnector, SsoConnectorListProps } from '@datatechsolutions/shared-domain'\n\nexport function SsoConnectorList({ connectors, onSelect, loading = false }: SsoConnectorListProps) {\n const t = useTranslations('windsock')\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('sso.connectorList.loading')}</span>\n </div>\n )\n }\n\n if (connectors.length === 0) {\n return (\n <p className=\"py-6 text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('sso.connectorList.empty')}\n </p>\n )\n }\n\n return (\n <ListCard>\n {connectors.map((connector) => {\n const initials = connector.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <ListCardItem\n key={connector.id}\n leading={\n <Avatar\n src={connector.logoUrl}\n initials={initials}\n alt={connector.name}\n />\n }\n trailing={\n <div className=\"flex items-center gap-2\">\n <Badge color=\"zinc\">\n {connector.type === 'saml' ? t('sso.connectorList.typeSaml') : t('sso.connectorList.typeOidc')}\n </Badge>\n <ChevronRightIcon className=\"h-4 w-4 text-gray-400\" />\n </div>\n }\n onClick={() => onSelect(connector)}\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {connector.name}\n </p>\n {connector.domain && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{connector.domain}</p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { BaseForm, Input, Button, Card, CardContent } from '@ui/index'\nimport { BuildingOffice2Icon } from '@heroicons/react/24/outline'\nimport { SsoConnectorList } from './sso-connector-list'\n\nexport type { SsoConnector, SsoEmailFormProps, SsoEmailFormPhase } from '@datatechsolutions/shared-domain'\nimport type { SsoConnector, SsoEmailFormProps, SsoEmailFormPhase as Phase } from '@datatechsolutions/shared-domain'\n\nexport function SsoEmailForm({\n onEmailSubmit,\n onConnectorSelect,\n defaultEmail = '',\n embedded = false,\n}: SsoEmailFormProps) {\n const t = useTranslations('windsock')\n\n const [phase, setPhase] = useState<Phase>('email')\n const [email, setEmail] = useState(defaultEmail)\n const [emailError, setEmailError] = useState<string | null>(null)\n const [connectors, setConnectors] = useState<SsoConnector[]>([])\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [loadingConnectors, setLoadingConnectors] = useState(false)\n\n const validateEmail = useCallback(\n (value: string): boolean => {\n if (!value.trim()) {\n setEmailError(t('sso.emailForm.errorEmailRequired'))\n return false\n }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n setEmailError(t('sso.emailForm.errorEmailInvalid'))\n return false\n }\n setEmailError(null)\n return true\n },\n [t],\n )\n\n const handleEmailSubmit = useCallback(async () => {\n if (!validateEmail(email)) return\n\n setIsSubmitting(true)\n setLoadingConnectors(true)\n\n try {\n const discovered = await onEmailSubmit(email)\n setConnectors(discovered)\n setPhase('connectors')\n } catch {\n setEmailError(t('sso.emailForm.errorDiscoveryFailed'))\n } finally {\n setIsSubmitting(false)\n setLoadingConnectors(false)\n }\n }, [email, onEmailSubmit, validateEmail, t])\n\n const handleBackToEmail = useCallback(() => {\n setPhase('email')\n setConnectors([])\n setEmailError(null)\n }, [])\n\n if (phase === 'connectors') {\n const connectorsContent = (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {t('sso.emailForm.connectorsTitle')}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('sso.emailForm.connectorsSubtitle', { email })}\n </p>\n </div>\n\n <SsoConnectorList\n connectors={connectors}\n onSelect={onConnectorSelect}\n loading={loadingConnectors}\n />\n\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={handleBackToEmail}\n className=\"text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n {t('sso.emailForm.backButton')}\n </button>\n </div>\n </div>\n )\n\n if (embedded) return connectorsContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"p-6 sm:p-8\">\n {connectorsContent}\n </CardContent>\n </Card>\n )\n }\n\n const emailContent = (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {t('sso.emailForm.title')}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('sso.emailForm.subtitle')}\n </p>\n </div>\n\n <BaseForm onSubmit={handleEmailSubmit} submitLabel={t('sso.emailForm.continueButton')} showFooter={false}>\n <Input\n type=\"email\"\n label={t('sso.emailForm.emailLabel')}\n placeholder={t('sso.emailForm.emailPlaceholder')}\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(event.target.value)\n if (emailError) setEmailError(null)\n }}\n error={emailError ?? undefined}\n icon={<BuildingOffice2Icon className=\"h-5 w-5\" />}\n disabled={isSubmitting}\n autoFocus\n autoComplete=\"email\"\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSubmitting}\n disabled={isSubmitting}\n >\n {t('sso.emailForm.continueButton')}\n </Button>\n </BaseForm>\n </div>\n )\n\n if (embedded) return emailContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"p-6 sm:p-8\">\n {emailContent}\n </CardContent>\n </Card>\n )\n}\n","import { useState, useCallback, Fragment, type ReactNode } from 'react'\nimport { Menu, Transition } from '@headlessui/react'\nimport { Avatar, DynamicIslandConfirm, triggerHaptic } from '@ui/index'\nimport { useAuth } from '@datatechsolutions/windsock/client'\nimport { ChevronUpDownIcon, ArrowRightStartOnRectangleIcon } from '@heroicons/react/20/solid'\n\nexport type { UserButtonProps } from '@datatechsolutions/shared-domain'\nimport type { UserButtonProps } from '@datatechsolutions/shared-domain'\n\nconst DEFAULT_LABELS = {\n menuLabel: 'User menu',\n userAlt: 'User',\n signOut: 'Sign out',\n signOutConfirmTitle: 'Sign out?',\n signOutConfirmButton: 'Sign out',\n signOutCancelButton: 'Cancel',\n} as const\n\nexport function UserButton({ menuItems = [], onSignOut, avatarUrl, labels }: UserButtonProps) {\n const resolvedLabels = { ...DEFAULT_LABELS, ...labels }\n const { user, logout, status } = useAuth()\n\n const [confirmSignOut, setConfirmSignOut] = useState(false)\n\n if (status !== 'authenticated') {\n return null\n }\n\n const userInitials = user?.name\n ? user.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n : user?.email?.slice(0, 2).toUpperCase() ?? '??'\n\n const resolvedAvatarUrl = avatarUrl ?? user?.image\n\n const handleSignOutRequest = () => {\n triggerHaptic('light')\n setConfirmSignOut(true)\n }\n\n const handleSignOutConfirm = async () => {\n triggerHaptic('success')\n setConfirmSignOut(false)\n try {\n // Pass '/' as redirect — logout() handles the full end-session flow\n // including server-side session termination and redirect.\n // onSignOut is called before the redirect for any cleanup the consumer needs.\n onSignOut?.()\n await logout('/')\n } catch {\n // logout errors are non-critical; session will expire naturally\n }\n }\n\n const handleSignOutCancel = () => {\n triggerHaptic('light')\n setConfirmSignOut(false)\n }\n\n return (\n <>\n <Menu as=\"div\" className=\"relative inline-block text-left\">\n <Menu.Button\n className=\"flex items-center gap-2 rounded-full p-1 transition-opacity hover:opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\"\n aria-label={resolvedLabels.menuLabel}\n >\n <Avatar\n src={resolvedAvatarUrl}\n initials={userInitials}\n alt={user?.name ?? user?.email ?? resolvedLabels.userAlt}\n />\n <ChevronUpDownIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n </Menu.Button>\n\n <Transition\n as={Fragment}\n enter=\"transition ease-out duration-100\"\n enterFrom=\"transform opacity-0 scale-95\"\n enterTo=\"transform opacity-100 scale-100\"\n leave=\"transition ease-in duration-75\"\n leaveFrom=\"transform opacity-100 scale-100\"\n leaveTo=\"transform opacity-0 scale-95\"\n >\n <Menu.Items className=\"liquid-surface absolute right-0 z-50 mt-2 w-60 origin-top-right rounded-2xl shadow-lg ring-1 ring-black/5 focus:outline-none dark:ring-white/10\">\n {/* User identity header */}\n <div className=\"flex items-center gap-3 border-b border-gray-200/60 px-4 py-3 dark:border-white/10\">\n <Avatar\n src={resolvedAvatarUrl}\n initials={userInitials}\n alt={user?.name ?? user?.email ?? resolvedLabels.userAlt}\n />\n <div className=\"min-w-0 flex-1\">\n {user?.name && (\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {user.name}\n </p>\n )}\n {user?.email && (\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">{user.email}</p>\n )}\n </div>\n </div>\n\n {/* Custom menu items */}\n {menuItems.length > 0 && (\n <>\n <div className=\"px-1 py-1\">\n {menuItems.map((item, index) => (\n <Menu.Item key={index}>\n {({ active }) => (\n <button\n type=\"button\"\n onClick={() => {\n triggerHaptic('light')\n item.onClick()\n }}\n className={`flex w-full items-center gap-2 rounded-xl px-3 py-2 text-sm transition-colors ${\n active\n ? 'bg-gray-100 text-gray-900 dark:bg-white/10 dark:text-white'\n : 'text-gray-700 dark:text-gray-300'\n }`}\n >\n {item.icon ? (\n <span className=\"h-4 w-4 shrink-0 text-gray-400\">{item.icon as ReactNode}</span>\n ) : null}\n {item.label}\n </button>\n )}\n </Menu.Item>\n ))}\n </div>\n <div className=\"border-t border-gray-200/60 dark:border-white/10\" />\n </>\n )}\n\n {/* Sign out */}\n <div className=\"border-t border-gray-200/60 px-1 py-1 dark:border-white/10\">\n <Menu.Item>\n {({ active }) => (\n <button\n type=\"button\"\n onClick={handleSignOutRequest}\n className={`flex w-full items-center gap-2 rounded-xl px-3 py-2 text-sm transition-colors ${\n active\n ? 'bg-red-50 text-red-700 dark:bg-red-500/10 dark:text-red-400'\n : 'text-red-600 dark:text-red-400'\n }`}\n >\n <ArrowRightStartOnRectangleIcon className=\"h-4 w-4 shrink-0\" />\n {resolvedLabels.signOut}\n </button>\n )}\n </Menu.Item>\n </div>\n </Menu.Items>\n </Transition>\n </Menu>\n\n {/* Sign-out confirmation */}\n <DynamicIslandConfirm\n open={confirmSignOut}\n onClose={handleSignOutCancel}\n onConfirm={handleSignOutConfirm}\n title={resolvedLabels.signOutConfirmTitle}\n confirmLabel={resolvedLabels.signOutConfirmButton}\n cancelLabel={resolvedLabels.signOutCancelButton}\n />\n </>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/settings/platform-settings.tsx"],"names":[],"mappings":"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","file":"chunk-UDDZTTLO.mjs","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — PlatformSettings\n// Unified settings shell consumed by every product (astrlabe, kori).\n// Composes existing building blocks:\n// - `<UserProfile>` — Profile / Security / Sessions / Linked accounts\n// - `<AdminOrganizationDetail>` — Members / Invitations / Domains\n// - `<BillingPanel>` — Current subscription + plan catalogue\n// Apps mount this at their `/settings` route; feature toggles hide sections\n// that a given user's role cannot access.\n// =============================================================================\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { SegmentedControl, InlineSpinner } from '@ui/index'\nimport type { AdminClient, AuthOrganization } from '@datatechsolutions/shared-domain'\n\nimport { useAuth } from '@datatechsolutions/windsock/client'\nimport { UserProfile } from '../auth/user-profile'\nimport { AdminOrganizationDetail } from '../admin/admin-organization-detail'\nimport { BillingPanel, type BillingPanelProps } from '../billing/billing-panel'\n\nexport type PlatformSettingsSection = 'account' | 'organization' | 'billing'\n\nexport interface PlatformSettingsProps {\n /**\n * Sections to surface to the current user. The host app is responsible for\n * picking the right set based on RBAC — e.g. hide `organization` for users\n * without `org:manage` and hide `billing` for users without `billing:read`.\n * Defaults to all three.\n */\n sections?: PlatformSettingsSection[]\n /** Starting section. Defaults to the first item in `sections`. */\n defaultSection?: PlatformSettingsSection\n /**\n * Windsock admin API client. Required when `organization` is in `sections`.\n * Create it once with `createAdminClient({ issuer, authClient })` and reuse.\n */\n adminClient?: AdminClient\n /**\n * Current organization id (usually `ctx.organizationId` from the JWT).\n * Required when `organization` is in `sections`.\n */\n organizationId?: string\n /** Forwarded to `<BillingPanel>` — e.g. redirect handler, billing interval. */\n billing?: BillingPanelProps\n}\n\nconst DEFAULT_SECTIONS: PlatformSettingsSection[] = ['account', 'organization', 'billing']\n\nexport function PlatformSettings({\n sections = DEFAULT_SECTIONS,\n defaultSection,\n adminClient,\n organizationId,\n billing,\n}: PlatformSettingsProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const visibleSections = useMemo(() => {\n // Drop `organization` if the caller didn't pass an admin client + org id.\n return sections.filter((section) => {\n if (section === 'organization') {\n return Boolean(adminClient && organizationId)\n }\n return true\n })\n }, [sections, adminClient, organizationId])\n\n const initialSection: PlatformSettingsSection = (\n defaultSection && visibleSections.includes(defaultSection)\n ? defaultSection\n : visibleSections[0] ?? 'account'\n )\n\n const [activeSection, setActiveSection] = useState<PlatformSettingsSection>(initialSection)\n const [organization, setOrganization] = useState<AuthOrganization | null>(null)\n const [orgLoadError, setOrgLoadError] = useState<string | null>(null)\n\n // Resolve the org detail record (AdminOrganizationDetail needs the full\n // AuthOrganization, not just the id). Fires once the organization tab is\n // first selected so the listOrganizations round-trip is lazy.\n useEffect(() => {\n if (activeSection !== 'organization') return\n if (!adminClient || !organizationId) return\n if (organization?.id === organizationId) return\n\n let cancelled = false\n setOrgLoadError(null)\n void adminClient.listOrganizations()\n .then((orgs) => {\n if (cancelled) return\n const match = orgs.find((org) => org.id === organizationId)\n if (match) {\n setOrganization(match)\n } else {\n setOrgLoadError('Organization not found')\n }\n })\n .catch((loadError: unknown) => {\n if (cancelled) return\n setOrgLoadError(loadError instanceof Error ? loadError.message : String(loadError))\n })\n return () => {\n cancelled = true\n }\n }, [activeSection, adminClient, organizationId, organization?.id])\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 if (visibleSections.length === 0) {\n return null\n }\n\n const segments = visibleSections.map((section) => ({\n value: section,\n label: t(`platformSettings.sections.${section}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {visibleSections.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeSection}\n onChange={(value: string) => setActiveSection(value as PlatformSettingsSection)}\n fullWidth\n />\n )}\n\n {activeSection === 'account' && <UserProfile />}\n\n {activeSection === 'organization' && adminClient && organizationId && (\n organization ? (\n <AdminOrganizationDetail\n client={adminClient}\n organization={organization}\n />\n ) : orgLoadError ? (\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 {orgLoadError}\n </div>\n ) : (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n )}\n\n {activeSection === 'billing' && <BillingPanel {...billing} />}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/settings/platform-settings.tsx"],"names":["useTranslations","useAuth","useMemo","useState","useEffect","jsx","InlineSpinner","jsxs","SegmentedControl","UserProfile","AdminOrganizationDetail","BillingPanel"],"mappings":"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","file":"chunk-W5OEBO6E.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — PlatformSettings\n// Unified settings shell consumed by every product (astrlabe, kori).\n// Composes existing building blocks:\n// - `<UserProfile>` — Profile / Security / Sessions / Linked accounts\n// - `<AdminOrganizationDetail>` — Members / Invitations / Domains\n// - `<BillingPanel>` — Current subscription + plan catalogue\n// Apps mount this at their `/settings` route; feature toggles hide sections\n// that a given user's role cannot access.\n// =============================================================================\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { SegmentedControl, InlineSpinner } from '@ui/index'\nimport type { AdminClient, AuthOrganization } from '@datatechsolutions/shared-domain'\n\nimport { useAuth } from '@datatechsolutions/windsock/client'\nimport { UserProfile } from '../auth/user-profile'\nimport { AdminOrganizationDetail } from '../admin/admin-organization-detail'\nimport { BillingPanel, type BillingPanelProps } from '../billing/billing-panel'\n\nexport type PlatformSettingsSection = 'account' | 'organization' | 'billing'\n\nexport interface PlatformSettingsProps {\n /**\n * Sections to surface to the current user. The host app is responsible for\n * picking the right set based on RBAC — e.g. hide `organization` for users\n * without `org:manage` and hide `billing` for users without `billing:read`.\n * Defaults to all three.\n */\n sections?: PlatformSettingsSection[]\n /** Starting section. Defaults to the first item in `sections`. */\n defaultSection?: PlatformSettingsSection\n /**\n * Windsock admin API client. Required when `organization` is in `sections`.\n * Create it once with `createAdminClient({ issuer, authClient })` and reuse.\n */\n adminClient?: AdminClient\n /**\n * Current organization id (usually `ctx.organizationId` from the JWT).\n * Required when `organization` is in `sections`.\n */\n organizationId?: string\n /** Forwarded to `<BillingPanel>` — e.g. redirect handler, billing interval. */\n billing?: BillingPanelProps\n}\n\nconst DEFAULT_SECTIONS: PlatformSettingsSection[] = ['account', 'organization', 'billing']\n\nexport function PlatformSettings({\n sections = DEFAULT_SECTIONS,\n defaultSection,\n adminClient,\n organizationId,\n billing,\n}: PlatformSettingsProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const visibleSections = useMemo(() => {\n // Drop `organization` if the caller didn't pass an admin client + org id.\n return sections.filter((section) => {\n if (section === 'organization') {\n return Boolean(adminClient && organizationId)\n }\n return true\n })\n }, [sections, adminClient, organizationId])\n\n const initialSection: PlatformSettingsSection = (\n defaultSection && visibleSections.includes(defaultSection)\n ? defaultSection\n : visibleSections[0] ?? 'account'\n )\n\n const [activeSection, setActiveSection] = useState<PlatformSettingsSection>(initialSection)\n const [organization, setOrganization] = useState<AuthOrganization | null>(null)\n const [orgLoadError, setOrgLoadError] = useState<string | null>(null)\n\n // Resolve the org detail record (AdminOrganizationDetail needs the full\n // AuthOrganization, not just the id). Fires once the organization tab is\n // first selected so the listOrganizations round-trip is lazy.\n useEffect(() => {\n if (activeSection !== 'organization') return\n if (!adminClient || !organizationId) return\n if (organization?.id === organizationId) return\n\n let cancelled = false\n setOrgLoadError(null)\n void adminClient.listOrganizations()\n .then((orgs) => {\n if (cancelled) return\n const match = orgs.find((org) => org.id === organizationId)\n if (match) {\n setOrganization(match)\n } else {\n setOrgLoadError('Organization not found')\n }\n })\n .catch((loadError: unknown) => {\n if (cancelled) return\n setOrgLoadError(loadError instanceof Error ? loadError.message : String(loadError))\n })\n return () => {\n cancelled = true\n }\n }, [activeSection, adminClient, organizationId, organization?.id])\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 if (visibleSections.length === 0) {\n return null\n }\n\n const segments = visibleSections.map((section) => ({\n value: section,\n label: t(`platformSettings.sections.${section}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {visibleSections.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeSection}\n onChange={(value: string) => setActiveSection(value as PlatformSettingsSection)}\n fullWidth\n />\n )}\n\n {activeSection === 'account' && <UserProfile />}\n\n {activeSection === 'organization' && adminClient && organizationId && (\n organization ? (\n <AdminOrganizationDetail\n client={adminClient}\n organization={organization}\n />\n ) : orgLoadError ? (\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 {orgLoadError}\n </div>\n ) : (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n )}\n\n {activeSection === 'billing' && <BillingPanel {...billing} />}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/rbac.ts"],"names":[],"mappings":";AAiDA,SAAS,eAAA,CAAgB,SAAiB,MAAA,EAAyB;AACjE,EAAA,IAAI,OAAA,KAAY,KAAK,OAAO,IAAA;AAC5B,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,IAAI,YAAA,CAAa,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACpC,IAAA,IAAI,aAAa,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,GAAG,OAAO,KAAA;AAAA,EACjD;AACA,EAAA,OAAO,YAAA,CAAa,WAAW,WAAA,CAAY,MAAA;AAC7C;AAEO,SAAS,mBAGd,IAAA,EAAuF;AACvF,EAAA,MAAM,mBAAmB,IAAA,CAAK,KAAA;AAC9B,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,iBAAA,IAAsB,EAAC;AACvD,EAAA,MAAM,wBAAwB,IAAA,CAAK,mBAAA;AAInC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAsB,IAAA,CAAK,WAAA,IAAgB,UAAA,CAAW,CAAC,CAAA;AAE7D,EAAA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAa,KAAA,IAAmB,gBAAA,EAAkB;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,SAAS,GAAA,CAAI,MAAuB,UAAA,EAAkC;AACpE,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,MAAM,UAAA,GAAc,IAAA,CAAK,WAAA,IAAe,EAAC;AAEzC,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,UAAU,CAAA,IAAK,EAAC;AAC7D,IAAA,OAAO,cAAA,CAAe,IAAA;AAAA,MAAK,CAAC,UAC1B,UAAA,CAAW,IAAA,CAAK,CAAC,SAAA,KAAc,eAAA,CAAgB,SAAA,EAAW,KAAK,CAAC;AAAA,KAClE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-ZJPNP2YW.mjs","sourcesContent":["import type { AuthUser } from '@datatechsolutions/windsock/client'\n\n/**\n * Generic role-based access factory shared across platform apps (astrlabe,\n * kori-erp, etc). Each app instantiates this with its own role + permission\n * unions and seed-claim mapping. The factory closes over the config and\n * exports `ROLE_DEFINITIONS`, `MODULE_PERMISSIONS`, `normalizePlatformRole`,\n * and `can()` — the same surface the per-app file used to expose.\n *\n * The factory deliberately does not hardcode any specific role enum here —\n * astrlabe, kori-erp, and future apps each pick their own union (admin,\n * manager, analyst, viewer, …) and pass the role definitions in.\n */\n\nexport type PlatformRoleDefinition<TRole extends string> = {\n id: TRole\n label: string\n description: string\n}\n\nexport type CreatePlatformRbacOptions<\n TRole extends string,\n TPermission extends string,\n> = {\n /** Definitions for every role the app supports (id/label/description). */\n roles: Record<TRole, PlatformRoleDefinition<TRole>>\n /**\n * Maps each app-level permission to one or more JWT permission claim\n * strings. `can()` returns true when ANY of the listed claims (using\n * wildcard matching) is present in the user's JWT permissions.\n */\n permissionClaimsMap: Record<TPermission, readonly string[]>\n /** Optional map from navigation/module IDs to required permissions. */\n modulePermissions?: Record<string, TPermission>\n /** Role to fall back to when an unknown role string comes in. */\n defaultRole?: TRole\n}\n\nexport type PlatformRbac<TRole extends string, TPermission extends string> = {\n ROLE_DEFINITIONS: Record<TRole, PlatformRoleDefinition<TRole>>\n MODULE_PERMISSIONS: Record<string, TPermission>\n normalizePlatformRole: (input: unknown) => TRole\n can: (user: AuthUser | null, permission: TPermission) => boolean\n}\n\n/**\n * Match a permission string against a pattern (supports wildcards).\n * Same logic as windsock's usePermissionChecker.\n */\nfunction matchPermission(pattern: string, target: string): boolean {\n if (pattern === '*') return true\n if (pattern === target) return true\n const patternParts = pattern.split(':')\n const targetParts = target.split(':')\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] === '*') return true\n if (patternParts[i] !== targetParts[i]) return false\n }\n return patternParts.length === targetParts.length\n}\n\nexport function createPlatformRbac<\n TRole extends string,\n TPermission extends string,\n>(opts: CreatePlatformRbacOptions<TRole, TPermission>): PlatformRbac<TRole, TPermission> {\n const ROLE_DEFINITIONS = opts.roles\n const MODULE_PERMISSIONS = opts.modulePermissions ?? ({} as Record<string, TPermission>)\n const PERMISSION_CLAIMS_MAP = opts.permissionClaimsMap\n\n // Pick the fallback role: explicit `defaultRole` first, then the first\n // entry in the roles map. We assume there's at least one role.\n const knownRoles = Object.keys(ROLE_DEFINITIONS) as TRole[]\n const fallbackRole: TRole = opts.defaultRole ?? (knownRoles[0] as TRole)\n\n function normalizePlatformRole(input: unknown): TRole {\n if (typeof input === 'string' && (input as TRole) in ROLE_DEFINITIONS) {\n return input as TRole\n }\n return fallbackRole\n }\n\n function can(user: AuthUser | null, permission: TPermission): boolean {\n if (!user) return false\n const userClaims = (user.permissions ?? []) as string[]\n\n const requiredClaims = PERMISSION_CLAIMS_MAP[permission] ?? []\n return requiredClaims.some((claim) =>\n userClaims.some((userClaim) => matchPermission(userClaim, claim))\n )\n }\n\n return {\n ROLE_DEFINITIONS,\n MODULE_PERMISSIONS,\n normalizePlatformRole,\n can,\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/impersonation/impersonation-banner.tsx"],"names":["useImpersonation","useState","jsxs","jsx","EyeIcon","Fragment","Button","XMarkIcon"],"mappings":";;;;;;;;AAoBO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAA6B;AACnF,EAAA,MAAM,EAAE,eAAA,EAAiB,KAAA,EAAO,IAAA,KAASA,uBAAA,EAAiB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,KAAA,EAAO,OAAO,IAAA;AAEvC,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,EAAK;AACX,MAAA,MAAA,IAAS;AAAA,IACX,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EACE,kJAEC,SAAA,IAAa,EAAA,CAAA;AAAA,MAGhB,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,eAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,0CACxD,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,8DAAA;AAAA,YACoD,GAAA;AAAA,4BACxDD,cAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAI,CAAA;AAAA,YACjC,KAAA,CAAM,yBACLD,eAAA,CAAAG,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BACDF,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,gBAAM,MAAA,EAAO;AAAA,aAAA,EACzC,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,eAAA;AAAA,UAACI,uBAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAH,cAAA,CAACI,iBAAA,EAAA,EAAU,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACjD,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AAC5B;AAAA;AAAA,GACF;AAEJ","file":"chunk-ZM5MVWIT.js","sourcesContent":["import { useState } from 'react'\nimport { useImpersonation } from '@datatechsolutions/windsock/client'\nimport { Button } from '@ui/index'\nimport { EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\n\nexport interface ImpersonationBannerProps {\n /**\n * Callback fired after the impersonation session ends (after the admin\n * token is restored). Useful for refreshing the UI or navigating home.\n */\n onExit?: () => void\n /** Optional extra classes on the outer bar. */\n className?: string\n}\n\n/**\n * Persistent banner shown while the current session is an impersonation\n * session. Shows the admin's identity + target, and an Exit button that\n * terminates the session. Invisible when not impersonating.\n */\nexport function ImpersonationBanner({ onExit, className }: ImpersonationBannerProps) {\n const { isImpersonating, claim, exit } = useImpersonation()\n const [isExiting, setIsExiting] = useState(false)\n\n if (!isImpersonating || !claim) return null\n\n const handleExit = async () => {\n setIsExiting(true)\n try {\n await exit()\n onExit?.()\n } finally {\n setIsExiting(false)\n }\n }\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={\n 'sticky top-0 z-50 flex items-center justify-between gap-3 border-b border-amber-300 ' +\n 'bg-amber-100 px-4 py-2 text-sm text-amber-900 shadow-sm ' +\n (className ?? '')\n }\n >\n <div className=\"flex items-center gap-2\">\n <EyeIcon aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" />\n <span>\n Impersonating session — signed in as the target user by{' '}\n <strong>{claim.email ?? claim.sub}</strong>\n {claim.reason ? (\n <>\n {' · '}\n <span className=\"italic\">{claim.reason}</span>\n </>\n ) : null}\n </span>\n </div>\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleExit}\n disabled={isExiting}\n aria-label=\"Exit impersonation\"\n >\n <XMarkIcon aria-hidden=\"true\" className=\"h-4 w-4\" />\n {isExiting ? 'Exiting…' : 'Exit impersonation'}\n </Button>\n </div>\n )\n}\n"]}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#F0A860"/>
|
|
5
|
-
<stop offset="30%" stop-color="#E08C40"/>
|
|
6
|
-
<stop offset="60%" stop-color="#D07830"/>
|
|
7
|
-
<stop offset="100%" stop-color="#B86520"/>
|
|
8
|
-
</linearGradient>
|
|
9
|
-
<linearGradient id="glow" x1="0" y1="0" x2="0" y2="1">
|
|
10
|
-
<stop offset="0%" stop-color="white" stop-opacity="0.18"/>
|
|
11
|
-
<stop offset="100%" stop-color="white" stop-opacity="0"/>
|
|
12
|
-
</linearGradient>
|
|
13
|
-
<clipPath id="badge"><rect width="512" height="512" rx="128"/></clipPath>
|
|
14
|
-
</defs>
|
|
15
|
-
<rect width="512" height="512" rx="128" fill="url(#bg)"/>
|
|
16
|
-
<rect width="512" height="260" rx="128" fill="url(#glow)"/>
|
|
17
|
-
|
|
18
|
-
<g clip-path="url(#badge)">
|
|
19
|
-
<!-- Globe (enterprise) -->
|
|
20
|
-
<g transform="translate(47, 81) scale(19.8)">
|
|
21
|
-
<circle cx="9" cy="9" r="7.5" stroke="white" stroke-width="1.2" stroke-opacity="0.7" fill="none"/>
|
|
22
|
-
<ellipse cx="9" cy="9" rx="3.5" ry="7.5" stroke="white" stroke-width="0.8" stroke-opacity="0.4" fill="none"/>
|
|
23
|
-
<line x1="1.5" y1="9" x2="16.5" y2="9" stroke="white" stroke-width="0.8" stroke-opacity="0.4"/>
|
|
24
|
-
<line x1="3" y1="5" x2="15" y2="5" stroke="white" stroke-width="0.6" stroke-opacity="0.3"/>
|
|
25
|
-
<line x1="3" y1="13" x2="15" y2="13" stroke="white" stroke-width="0.6" stroke-opacity="0.3"/>
|
|
26
|
-
</g>
|
|
27
|
-
<!-- Building overlaid -->
|
|
28
|
-
<g transform="translate(256, 116) scale(11.6)">
|
|
29
|
-
<rect x="0" y="2" width="15" height="22" rx="1.5" fill="white" fill-opacity="0.92"/>
|
|
30
|
-
<rect x="3" y="0" width="9" height="4" rx="1" fill="white" fill-opacity="0.78"/>
|
|
31
|
-
<rect x="2.5" y="6.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.5"/>
|
|
32
|
-
<rect x="6.5" y="6.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.5"/>
|
|
33
|
-
<rect x="10.5" y="6.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.4"/>
|
|
34
|
-
<rect x="2.5" y="10.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.4"/>
|
|
35
|
-
<rect x="6.5" y="10.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.5"/>
|
|
36
|
-
<rect x="10.5" y="10.5" width="2.8" height="2.2" rx="0.4" fill="#D07830" fill-opacity="0.4"/>
|
|
37
|
-
<rect x="5" y="16" width="5" height="8" rx="0.8" fill="#D07830" fill-opacity="0.55"/>
|
|
38
|
-
<circle cx="9" cy="20" r="0.5" fill="white" fill-opacity="0.8"/>
|
|
39
|
-
</g>
|
|
40
|
-
<!-- Power sparkle -->
|
|
41
|
-
<g transform="translate(35, 35) scale(11.6)">
|
|
42
|
-
<path d="M3.5 0L4.2 2.6L7 3.5L4.2 4.4L3.5 7L2.8 4.4L0 3.5L2.8 2.6Z" fill="white" fill-opacity="0.55"/>
|
|
43
|
-
</g>
|
|
44
|
-
</g>
|
|
45
|
-
</svg>
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 150 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="koriBadge" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#F5C08A"/>
|
|
5
|
-
<stop offset="30%" stop-color="#F0A860"/>
|
|
6
|
-
<stop offset="60%" stop-color="#E08C40"/>
|
|
7
|
-
<stop offset="100%" stop-color="#D07830"/>
|
|
8
|
-
</linearGradient>
|
|
9
|
-
<linearGradient id="koriGlow" x1="0" y1="0" x2="0" y2="1">
|
|
10
|
-
<stop offset="0%" stop-color="white" stop-opacity="0.2"/>
|
|
11
|
-
<stop offset="100%" stop-color="white" stop-opacity="0"/>
|
|
12
|
-
</linearGradient>
|
|
13
|
-
<filter id="koriShadow" x="-20%" y="-20%" width="160%" height="160%">
|
|
14
|
-
<feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#E08C40" flood-opacity="0.4"/>
|
|
15
|
-
</filter>
|
|
16
|
-
</defs>
|
|
17
|
-
<g transform="translate(2, 3)" filter="url(#koriShadow)">
|
|
18
|
-
<rect x="0" y="0" width="38" height="38" rx="11" fill="url(#koriBadge)"/>
|
|
19
|
-
<rect x="0" y="0" width="38" height="20" rx="11" fill="url(#koriGlow)"/>
|
|
20
|
-
<circle cx="14" cy="19" r="10" stroke="white" stroke-width="1" stroke-opacity="0.6" fill="none"/>
|
|
21
|
-
<ellipse cx="14" cy="19" rx="4.5" ry="10" stroke="white" stroke-width="0.7" stroke-opacity="0.35" fill="none"/>
|
|
22
|
-
<line x1="4" y1="19" x2="24" y2="19" stroke="white" stroke-width="0.7" stroke-opacity="0.35"/>
|
|
23
|
-
<line x1="6" y1="14" x2="22" y2="14" stroke="white" stroke-width="0.5" stroke-opacity="0.25"/>
|
|
24
|
-
<line x1="6" y1="24" x2="22" y2="24" stroke="white" stroke-width="0.5" stroke-opacity="0.25"/>
|
|
25
|
-
<rect x="20" y="11" width="13" height="19" rx="1.2" fill="white" fill-opacity="0.9"/>
|
|
26
|
-
<rect x="22" y="9" width="8" height="3.5" rx="0.8" fill="white" fill-opacity="0.75"/>
|
|
27
|
-
<rect x="22" y="14" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.45"/>
|
|
28
|
-
<rect x="25.5" y="14" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.45"/>
|
|
29
|
-
<rect x="29" y="14" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.4"/>
|
|
30
|
-
<rect x="22" y="18" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.4"/>
|
|
31
|
-
<rect x="25.5" y="18" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.45"/>
|
|
32
|
-
<rect x="29" y="18" width="2.5" height="2" rx="0.3" fill="#E08C40" fill-opacity="0.4"/>
|
|
33
|
-
<rect x="24.5" y="23" width="4" height="7" rx="0.6" fill="#E08C40" fill-opacity="0.5"/>
|
|
34
|
-
<path d="M5 5L5.5 7L7.5 7.5L5.5 8L5 10L4.5 8L2.5 7.5L4.5 7Z" fill="white" fill-opacity="0.5"/>
|
|
35
|
-
</g>
|
|
36
|
-
<text x="52" y="29" font-family="system-ui, -apple-system, sans-serif" font-weight="700" letter-spacing="-0.5">
|
|
37
|
-
<tspan font-size="20" fill="#F0A860">Kori</tspan>
|
|
38
|
-
<tspan dx="3" font-size="20" fill="#CBD5E1" font-weight="600">ERP</tspan>
|
|
39
|
-
</text>
|
|
40
|
-
</svg>
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 150 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="koriBadge" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#F0A860"/>
|
|
5
|
-
<stop offset="30%" stop-color="#E08C40"/>
|
|
6
|
-
<stop offset="60%" stop-color="#D07830"/>
|
|
7
|
-
<stop offset="100%" stop-color="#B86520"/>
|
|
8
|
-
</linearGradient>
|
|
9
|
-
<linearGradient id="koriGlow" x1="0" y1="0" x2="0" y2="1">
|
|
10
|
-
<stop offset="0%" stop-color="white" stop-opacity="0.2"/>
|
|
11
|
-
<stop offset="100%" stop-color="white" stop-opacity="0"/>
|
|
12
|
-
</linearGradient>
|
|
13
|
-
<filter id="koriShadow" x="-20%" y="-20%" width="160%" height="160%">
|
|
14
|
-
<feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#D07830" flood-opacity="0.3"/>
|
|
15
|
-
</filter>
|
|
16
|
-
</defs>
|
|
17
|
-
<g transform="translate(2, 3)" filter="url(#koriShadow)">
|
|
18
|
-
<rect x="0" y="0" width="38" height="38" rx="11" fill="url(#koriBadge)"/>
|
|
19
|
-
<rect x="0" y="0" width="38" height="20" rx="11" fill="url(#koriGlow)"/>
|
|
20
|
-
<!-- Globe -->
|
|
21
|
-
<circle cx="14" cy="19" r="10" stroke="white" stroke-width="1" stroke-opacity="0.6" fill="none"/>
|
|
22
|
-
<ellipse cx="14" cy="19" rx="4.5" ry="10" stroke="white" stroke-width="0.7" stroke-opacity="0.35" fill="none"/>
|
|
23
|
-
<line x1="4" y1="19" x2="24" y2="19" stroke="white" stroke-width="0.7" stroke-opacity="0.35"/>
|
|
24
|
-
<line x1="6" y1="14" x2="22" y2="14" stroke="white" stroke-width="0.5" stroke-opacity="0.25"/>
|
|
25
|
-
<line x1="6" y1="24" x2="22" y2="24" stroke="white" stroke-width="0.5" stroke-opacity="0.25"/>
|
|
26
|
-
<!-- Building -->
|
|
27
|
-
<rect x="20" y="11" width="13" height="19" rx="1.2" fill="white" fill-opacity="0.9"/>
|
|
28
|
-
<rect x="22" y="9" width="8" height="3.5" rx="0.8" fill="white" fill-opacity="0.75"/>
|
|
29
|
-
<rect x="22" y="14" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.45"/>
|
|
30
|
-
<rect x="25.5" y="14" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.45"/>
|
|
31
|
-
<rect x="29" y="14" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.4"/>
|
|
32
|
-
<rect x="22" y="18" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.4"/>
|
|
33
|
-
<rect x="25.5" y="18" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.45"/>
|
|
34
|
-
<rect x="29" y="18" width="2.5" height="2" rx="0.3" fill="#D07830" fill-opacity="0.4"/>
|
|
35
|
-
<rect x="24.5" y="23" width="4" height="7" rx="0.6" fill="#D07830" fill-opacity="0.5"/>
|
|
36
|
-
<!-- Sparkle -->
|
|
37
|
-
<path d="M5 5L5.5 7L7.5 7.5L5.5 8L5 10L4.5 8L2.5 7.5L4.5 7Z" fill="white" fill-opacity="0.5"/>
|
|
38
|
-
</g>
|
|
39
|
-
<text x="52" y="29" font-family="system-ui, -apple-system, sans-serif" font-weight="700" letter-spacing="-0.5">
|
|
40
|
-
<tspan font-size="20" fill="#D07830">Kori</tspan>
|
|
41
|
-
<tspan dx="3" font-size="20" fill="#475569" font-weight="600">ERP</tspan>
|
|
42
|
-
</text>
|
|
43
|
-
</svg>
|