@arbidocs/blocks 0.5.22 → 0.5.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/{WorkspaceTableView-6JVHGDUB.cjs → WorkspaceTableView-GIDGNGBW.cjs} +6 -6
  2. package/dist/{WorkspaceTableView-6JVHGDUB.cjs.map → WorkspaceTableView-GIDGNGBW.cjs.map} +1 -1
  3. package/dist/{WorkspaceTableView-ECPHGWHF.js → WorkspaceTableView-S2PTTVHL.js} +4 -4
  4. package/dist/{WorkspaceTableView-ECPHGWHF.js.map → WorkspaceTableView-S2PTTVHL.js.map} +1 -1
  5. package/dist/auth/index.cjs +47 -47
  6. package/dist/auth/index.js +2 -2
  7. package/dist/{chunk-7DDMF3DZ.cjs → chunk-53T2FY4Z.cjs} +5 -31
  8. package/dist/chunk-53T2FY4Z.cjs.map +1 -0
  9. package/dist/chunk-5ZBXFHZW.js +434 -0
  10. package/dist/chunk-5ZBXFHZW.js.map +1 -0
  11. package/dist/{chunk-K237IYOD.cjs → chunk-BYJUI4AT.cjs} +54 -2
  12. package/dist/chunk-BYJUI4AT.cjs.map +1 -0
  13. package/dist/{chunk-O4EQYPLO.cjs → chunk-C2SZQKX2.cjs} +169 -27
  14. package/dist/chunk-C2SZQKX2.cjs.map +1 -0
  15. package/dist/{chunk-MSPNYW6Z.cjs → chunk-DTLVC6MN.cjs} +2 -53
  16. package/dist/chunk-DTLVC6MN.cjs.map +1 -0
  17. package/dist/{chunk-RVKVGS72.js → chunk-FDUQQNDT.js} +2 -2
  18. package/dist/{chunk-RVKVGS72.js.map → chunk-FDUQQNDT.js.map} +1 -1
  19. package/dist/{chunk-TTJGCJWX.cjs → chunk-H3XAHVDT.cjs} +42 -2
  20. package/dist/chunk-H3XAHVDT.cjs.map +1 -0
  21. package/dist/{chunk-XL55UDLO.js → chunk-IJJKUTKM.js} +5 -30
  22. package/dist/chunk-IJJKUTKM.js.map +1 -0
  23. package/dist/{chunk-ZX663X3X.cjs → chunk-KNRAKOCO.cjs} +6 -428
  24. package/dist/chunk-KNRAKOCO.cjs.map +1 -0
  25. package/dist/chunk-KUQOHPKP.cjs +443 -0
  26. package/dist/chunk-KUQOHPKP.cjs.map +1 -0
  27. package/dist/{chunk-F2BYURQZ.cjs → chunk-LYF47OXX.cjs} +5 -5
  28. package/dist/{chunk-F2BYURQZ.cjs.map → chunk-LYF47OXX.cjs.map} +1 -1
  29. package/dist/{chunk-PZRTRYPD.js → chunk-MKTEVOC3.js} +44 -5
  30. package/dist/chunk-MKTEVOC3.js.map +1 -0
  31. package/dist/{chunk-6XW3CMU4.js → chunk-N3KNAQ55.js} +144 -4
  32. package/dist/chunk-N3KNAQ55.js.map +1 -0
  33. package/dist/{chunk-KL6XOSEN.js → chunk-PLAGIVFF.js} +4 -52
  34. package/dist/chunk-PLAGIVFF.js.map +1 -0
  35. package/dist/{chunk-FZVAJFRH.cjs → chunk-RHKFCSFC.cjs} +2 -2
  36. package/dist/{chunk-FZVAJFRH.cjs.map → chunk-RHKFCSFC.cjs.map} +1 -1
  37. package/dist/{chunk-NVRJ6WTR.js → chunk-RTAYJUQM.js} +3 -3
  38. package/dist/{chunk-NVRJ6WTR.js.map → chunk-RTAYJUQM.js.map} +1 -1
  39. package/dist/{chunk-IXBJEQH5.js → chunk-VN4FSGBR.js} +53 -4
  40. package/dist/chunk-VN4FSGBR.js.map +1 -0
  41. package/dist/{chunk-SLRVI2YU.js → chunk-X6U6L6BG.js} +29 -4
  42. package/dist/chunk-X6U6L6BG.js.map +1 -0
  43. package/dist/{chunk-SQ5F5BFW.cjs → chunk-XDU3HHUU.cjs} +32 -6
  44. package/dist/chunk-XDU3HHUU.cjs.map +1 -0
  45. package/dist/{chunk-SKVVOEMX.js → chunk-XXUPUXBF.js} +8 -423
  46. package/dist/chunk-XXUPUXBF.js.map +1 -0
  47. package/dist/connect/index.cjs +1203 -624
  48. package/dist/connect/index.cjs.map +1 -1
  49. package/dist/connect/index.js +770 -197
  50. package/dist/connect/index.js.map +1 -1
  51. package/dist/connection/auth/CompactLogin.d.ts +26 -0
  52. package/dist/connection/auth/ConnectedLoginPage.d.ts +9 -1
  53. package/dist/connection/auth/index.d.ts +3 -1
  54. package/dist/connection/auth/sso-popup.d.ts +13 -0
  55. package/dist/connection/auth/sso-sign-in.d.ts +38 -0
  56. package/dist/connection/auth/support.d.ts +17 -0
  57. package/dist/connection/auth/useLoginActions.d.ts +9 -2
  58. package/dist/connection/billing/ConnectedQuotaDialog.d.ts +5 -13
  59. package/dist/connection/billing/index.d.ts +1 -1
  60. package/dist/connection/connectors/ConnectedSharePointAdminConsentPage.d.ts +26 -0
  61. package/dist/connection/connectors/index.d.ts +1 -0
  62. package/dist/connection/projects/ConnectedProjectsPanel.d.ts +9 -1
  63. package/dist/connection/projects/ProjectsListPage.d.ts +40 -0
  64. package/dist/connection/projects/index.d.ts +1 -0
  65. package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +2 -1
  66. package/dist/connection/settings-page/ConnectedBoxPortalSection.d.ts +6 -0
  67. package/dist/connection/settings-page/appearanceSection.d.ts +30 -0
  68. package/dist/connection/settings-page/index.d.ts +1 -0
  69. package/dist/index.cjs +209 -237
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.js +11 -50
  73. package/dist/index.js.map +1 -1
  74. package/dist/settings/AppearanceSettings.d.ts +1 -2
  75. package/dist/settings/index.cjs +153 -153
  76. package/dist/settings/index.d.ts +2 -1
  77. package/dist/settings/index.js +1 -1
  78. package/dist/site/index.cjs +82 -74
  79. package/dist/site/index.d.ts +2 -0
  80. package/dist/site/index.js +3 -3
  81. package/dist/studio/index.cjs +73 -73
  82. package/dist/studio/index.js +5 -5
  83. package/dist/theme/appearance.d.ts +47 -0
  84. package/dist/theme/fromCss.d.ts +33 -0
  85. package/node_modules/@arbidocs/coedit/package.json +1 -1
  86. package/package.json +5 -5
  87. package/dist/chunk-6XW3CMU4.js.map +0 -1
  88. package/dist/chunk-7DDMF3DZ.cjs.map +0 -1
  89. package/dist/chunk-AMTWY22T.js +0 -11
  90. package/dist/chunk-AMTWY22T.js.map +0 -1
  91. package/dist/chunk-IXBJEQH5.js.map +0 -1
  92. package/dist/chunk-K237IYOD.cjs.map +0 -1
  93. package/dist/chunk-KL6XOSEN.js.map +0 -1
  94. package/dist/chunk-MSPNYW6Z.cjs.map +0 -1
  95. package/dist/chunk-O4EQYPLO.cjs.map +0 -1
  96. package/dist/chunk-PZRTRYPD.js.map +0 -1
  97. package/dist/chunk-SKVVOEMX.js.map +0 -1
  98. package/dist/chunk-SLRVI2YU.js.map +0 -1
  99. package/dist/chunk-SQ5F5BFW.cjs.map +0 -1
  100. package/dist/chunk-TTJGCJWX.cjs.map +0 -1
  101. package/dist/chunk-XL55UDLO.js.map +0 -1
  102. package/dist/chunk-ZU2B2RZK.cjs +0 -13
  103. package/dist/chunk-ZU2B2RZK.cjs.map +0 -1
  104. package/dist/chunk-ZX663X3X.cjs.map +0 -1
@@ -937,6 +937,55 @@ function withTrailingFragment(next, trailingFragment) {
937
937
  return `${next}${trailingFragment}`;
938
938
  }
939
939
 
940
+ // src/connection/auth/fragment-credentials.ts
941
+ var KEYS = ["email", "password", "next"];
942
+ function safeNext(next) {
943
+ if (!next || !next.startsWith("/") || next.startsWith("//") || next.startsWith("/\\")) return null;
944
+ return next;
945
+ }
946
+ function parseFragmentCredentials(hash) {
947
+ const { params, trailingFragment } = splitAuthHash(hash);
948
+ const email = params.get("email")?.trim();
949
+ const password = params.get("password");
950
+ if (!email || !password) return null;
951
+ const next = safeNext(params.get("next"));
952
+ return { email, password, next: next && withTrailingFragment(next, trailingFragment) };
953
+ }
954
+ function consumeFragmentCredentials() {
955
+ if (typeof window === "undefined") return null;
956
+ const { hash, pathname, search } = window.location;
957
+ const { params, trailingFragment } = splitAuthHash(hash);
958
+ if (!KEYS.some((k) => k !== "next" && params.has(k))) return null;
959
+ const credentials = parseFragmentCredentials(hash);
960
+ for (const k of KEYS) params.delete(k);
961
+ const rest = params.toString();
962
+ const kept = rest ? `#${rest}${trailingFragment}` : trailingFragment;
963
+ window.history.replaceState(window.history.state, "", `${pathname}${search}${kept}`);
964
+ return credentials;
965
+ }
966
+ var taken = null;
967
+ function take() {
968
+ const fresh = consumeFragmentCredentials();
969
+ if (fresh) taken = fresh;
970
+ return taken;
971
+ }
972
+ function useFragmentCredentials({
973
+ enabled = false,
974
+ onCredentials
975
+ }) {
976
+ const [credentials] = react.useState(() => enabled ? take() : null);
977
+ const handedOver = react.useRef(false);
978
+ const callback = react.useRef(onCredentials);
979
+ callback.current = onCredentials;
980
+ react.useEffect(() => {
981
+ if (!credentials || handedOver.current) return;
982
+ handedOver.current = true;
983
+ taken = null;
984
+ callback.current(credentials);
985
+ }, [credentials]);
986
+ return credentials && { email: credentials.email, next: credentials.next };
987
+ }
988
+
940
989
  exports.AccountRecoveryDialog = AccountRecoveryDialog;
941
990
  exports.AuthAlert = AuthAlert;
942
991
  exports.AuthConsent = AuthConsent;
@@ -962,10 +1011,13 @@ exports.DEFAULT_RECOVERY_KEY_DIALOG_LABELS = DEFAULT_RECOVERY_KEY_DIALOG_LABELS;
962
1011
  exports.DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS = DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS;
963
1012
  exports.RecoveryKeyDialog = RecoveryKeyDialog;
964
1013
  exports.RevealablePasswordInput = RevealablePasswordInput;
1014
+ exports.consumeFragmentCredentials = consumeFragmentCredentials;
965
1015
  exports.createPasswordRules = createPasswordRules;
966
1016
  exports.parseAuthError = parseAuthError;
1017
+ exports.parseFragmentCredentials = parseFragmentCredentials;
967
1018
  exports.promptSaveCredential = promptSaveCredential;
968
1019
  exports.splitAuthHash = splitAuthHash;
1020
+ exports.useFragmentCredentials = useFragmentCredentials;
969
1021
  exports.withTrailingFragment = withTrailingFragment;
970
- //# sourceMappingURL=chunk-K237IYOD.cjs.map
971
- //# sourceMappingURL=chunk-K237IYOD.cjs.map
1022
+ //# sourceMappingURL=chunk-BYJUI4AT.cjs.map
1023
+ //# sourceMappingURL=chunk-BYJUI4AT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/AuthLayout.tsx","../src/auth/AuthForm.tsx","../src/auth/AuthFooter.tsx","../src/auth/auth-error.ts","../src/auth/password-rules.ts","../src/auth/credential-storage.ts","../src/auth/RecoveryDialogs.tsx","../src/connection/auth/auth-hash.ts","../src/connection/auth/fragment-credentials.ts"],"names":["jsxs","cn","jsx","Fragment","ArrowRight","createContext","useId","useMemo","useContext","Input","useState","testIdOr","EyeOff","Eye","AlertCircle","Button","Loader2","TabsPrimitive","WifiOff","Checkbox","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","useRef","Key","Shield","Upload","DialogFooter","useEffect"],"mappings":"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","file":"chunk-BYJUI4AT.cjs","sourcesContent":["import type { LucideIcon } from 'lucide-react'\nimport { ArrowRight } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface AuthLayoutProps {\n /** The form column content. */\n children: ReactNode\n /** Sits above the form: the Login / Register tabs, or an offline badge. */\n headerRight?: ReactNode\n /** Hero panel: the right half on desktop, hidden on mobile. Omit for a single centred column. */\n aside?: ReactNode\n /** Brand mark shown top-left of the form column (logo + name). */\n brand?: ReactNode\n /** Pinned bottom-right over the hero on desktop (e.g. a deployment indicator). */\n corner?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * Full-bleed split: a calm form column on the left, the hero (`aside`) on the right. On mobile the\n * hero is hidden and the form fills the screen. With no `aside` it is a single centred column.\n */\nexport function AuthLayout({\n children,\n headerRight,\n aside,\n brand,\n corner,\n className,\n testId = 'auth-layout',\n}: AuthLayoutProps) {\n return (\n <div\n data-slot=\"auth-layout\"\n className={cn(\n 'min-h-screen bg-background text-foreground',\n // The hero needs height: a phone held sideways (under 32rem tall) gets the form alone.\n aside && 'md:grid [@media(min-height:32rem)]:md:grid-cols-2',\n className\n )}\n data-testid={testId}\n >\n {corner}\n <section className=\"flex min-h-screen flex-col px-4 py-5 sm:px-8 md:px-12 md:py-6\">\n {brand && (\n <div className=\"flex items-center gap-3 font-semibold text-foreground\">{brand}</div>\n )}\n {/* Top-aligned at a fixed offset (not vertically centred) so switching tabs never moves the tabs. */}\n <div className=\"mx-auto mt-10 flex w-full max-w-sm flex-col gap-5 py-8 md:mt-[14vh]\">\n {headerRight && <div className=\"flex items-center\">{headerRight}</div>}\n {children}\n </div>\n </section>\n {/* Exactly one screen tall and pinned, so the hero is centred in the window rather than in\n the row: a form that overflows the screen (Login, with its SSO buttons, on a laptop)\n would otherwise stretch the row and move the hero text when switching tabs. */}\n {aside && (\n <div className=\"hidden [@media(min-height:32rem)]:md:sticky [@media(min-height:32rem)]:md:top-0 [@media(min-height:32rem)]:md:flex [@media(min-height:32rem)]:md:h-screen\">\n {aside}\n </div>\n )}\n </div>\n )\n}\n\nexport interface AuthHeroPillar {\n icon: LucideIcon\n title: string\n body: string\n}\n\nexport interface AuthHeroProps {\n /** First line of the headline. */\n headline?: ReactNode\n /** Second headline line, set in italic accent. */\n emphasis?: string\n lead?: ReactNode\n pillars?: AuthHeroPillar[]\n link?: { href: string; label: string }\n /** Cover image behind the content (any CSS `url(...)` source). A tint keeps text legible. */\n backgroundImage?: string\n /** Extra content under the pillars (a quote, a logo row, a screenshot). */\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The value-proposition panel for {@link AuthLayout}'s `aside`: headline, lead, pillars, link. */\nexport function AuthHero({\n headline,\n emphasis,\n lead,\n pillars = [],\n link,\n backgroundImage,\n children,\n className,\n testId = 'product-pillars',\n}: AuthHeroProps) {\n return (\n <div\n data-slot=\"auth-hero\"\n className={cn(\n 'relative flex w-full flex-col justify-center gap-6 overflow-hidden bg-hero px-12 py-16 text-white',\n className\n )}\n data-testid={testId}\n >\n {backgroundImage && (\n <>\n <div\n aria-hidden=\"true\"\n data-slot=\"auth-hero-image\"\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${backgroundImage})` }}\n />\n <div aria-hidden=\"true\" className=\"absolute inset-0 bg-hero/70\" />\n </>\n )}\n {headline && (\n <h2 className=\"relative max-w-[18ch] text-3xl font-semibold leading-tight text-white\">\n {headline}\n {emphasis && (\n <>\n <br />\n <span className=\"italic text-theme-cyan-bright\">{emphasis}</span>\n </>\n )}\n </h2>\n )}\n {lead && <p className=\"relative max-w-[44ch] text-base text-white/70\">{lead}</p>}\n\n <ul className=\"relative flex max-w-[46ch] flex-col gap-5\">\n {pillars.map(({ icon: Icon, title, body }) => (\n <li key={title} className=\"flex gap-3\">\n <Icon className=\"mt-0.5 h-5 w-5 shrink-0 text-theme-cyan-bright\" aria-hidden=\"true\" />\n <div>\n <h3 className=\"text-base font-semibold leading-snug text-white\">{title}</h3>\n <p className=\"text-sm leading-relaxed text-white/70\">{body}</p>\n </div>\n </li>\n ))}\n </ul>\n\n {children && <div className=\"relative\">{children}</div>}\n\n {link && (\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"relative inline-flex items-center gap-1 text-sm font-medium text-theme-cyan-bright transition-colors hover:text-white\"\n >\n {link.label}\n <ArrowRight className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n )\n}\n","import { AlertCircle, Eye, EyeOff, Loader2, WifiOff } from 'lucide-react'\nimport {\n createContext,\n useContext,\n useId,\n useMemo,\n useState,\n type ComponentProps,\n type ReactNode,\n} from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { Button, cn, Input } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Title + one-line description above an auth form. */\nexport function AuthHeading({ title, description }: { title: ReactNode; description?: ReactNode }) {\n return (\n <div data-slot=\"auth-heading\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-foreground\">{title}</h1>\n {description && <p className=\"mt-2 text-sm text-muted-foreground\">{description}</p>}\n </div>\n )\n}\n\n/** A text-style action under or beside a field (\"Forgot your password?\", \"Clear form\"). */\nexport function AuthLink({ className, type = 'button', ...props }: ComponentProps<'button'>) {\n return (\n <button\n type={type}\n data-slot=\"auth-link\"\n className={cn(\n 'text-sm text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n className\n )}\n {...props}\n />\n )\n}\n\ninterface AuthFieldContextValue {\n id: string\n errorId?: string\n}\n\n/** What an `AuthField` hands to the control inside: its id and the id of its error message. */\nconst AuthFieldContext = createContext<AuthFieldContextValue | null>(null)\n\n/** Merge space-separated id lists for `aria-describedby`. */\nfunction joinIds(...ids: Array<string | undefined>): string | undefined {\n const joined = ids.filter(Boolean).join(' ')\n return joined || undefined\n}\n\nexport interface AuthFieldProps {\n /** Id of the control inside, for the label. Omit it to use a generated (`useId`) id that the\n * `AuthInput` / `RevealablePasswordInput` inside picks up automatically. */\n htmlFor?: string\n /** Field-level error: shown under the control, linked with `aria-describedby`, and marks the\n * control `aria-invalid`. */\n error?: ReactNode\n errorTestId?: string\n label: ReactNode\n required?: boolean\n /** Right-aligned action in the label row (e.g. \"Clear form\"). */\n labelAction?: ReactNode\n /** Overlaid at the right edge of the control (e.g. a \"Verified\" badge). */\n trailing?: ReactNode\n className?: string\n children: ReactNode\n}\n\n/** Label (with required marker) above a control. */\nexport function AuthField({\n htmlFor,\n error,\n errorTestId,\n label,\n required,\n labelAction,\n trailing,\n className,\n children,\n}: AuthFieldProps) {\n const generatedId = useId()\n const id = htmlFor ?? generatedId\n const errorId = error ? `${id}-error` : undefined\n const context = useMemo(() => ({ id, errorId }), [id, errorId])\n return (\n <AuthFieldContext.Provider value={context}>\n <div data-slot=\"auth-field\" className={className}>\n <div className=\"mb-1 flex items-center justify-between\">\n <label htmlFor={id} className=\"block text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-red-text\">*</span>}\n </label>\n {labelAction}\n </div>\n {trailing ? (\n <div className=\"relative\">\n {children}\n {trailing}\n </div>\n ) : (\n children\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"mt-1 text-sm text-red-text\"\n data-testid={errorTestId}\n >\n {error}\n </p>\n )}\n </div>\n </AuthFieldContext.Provider>\n )\n}\n\n/** Input styled for auth forms (faint placeholder). */\nexport function AuthInput({\n className,\n id,\n 'aria-describedby': describedBy,\n 'aria-invalid': invalid,\n ...props\n}: ComponentProps<typeof Input>) {\n const field = useContext(AuthFieldContext)\n return (\n <Input\n id={id ?? field?.id}\n aria-describedby={joinIds(describedBy, field?.errorId)}\n aria-invalid={invalid ?? (field?.errorId ? true : undefined)}\n className={cn('placeholder:text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n/** Every fixed string of the revealable password input. */\nexport interface RevealablePasswordInputLabels {\n hidePassword: string\n showPassword: string\n}\n\nexport const DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS: RevealablePasswordInputLabels = {\n hidePassword: 'Hide password',\n showPassword: 'Show password',\n}\n\n/** Every fixed string of the offline badge. */\nexport interface AuthOfflineBadgeLabels {\n offline: string\n}\n\nexport const DEFAULT_AUTH_OFFLINE_BADGE_LABELS: AuthOfflineBadgeLabels = {\n offline: 'Offline',\n}\n\nexport interface RevealablePasswordInputProps extends Omit<ComponentProps<typeof Input>, 'type'> {\n /** Controlled reveal state. Omit it and the input manages its own (see `defaultRevealed`). */\n isRevealed?: boolean\n /** Initial state when uncontrolled. */\n defaultRevealed?: boolean\n /** Called on every toggle press, controlled or not. */\n onToggleReveal?: () => void\n labels?: Partial<RevealablePasswordInputLabels>\n /** Show/hide button id (default `toggle-password-visibility`); `data-testid` goes to the input. */\n toggleTestId?: string\n}\n\n/** Password input with a show/hide button inside the field. */\nexport function RevealablePasswordInput({\n isRevealed: controlledRevealed,\n defaultRevealed = false,\n onToggleReveal,\n className,\n labels,\n toggleTestId,\n ...props\n}: RevealablePasswordInputProps) {\n const [innerRevealed, setInnerRevealed] = useState(defaultRevealed)\n const isControlled = controlledRevealed !== undefined\n const isRevealed = isControlled ? controlledRevealed : innerRevealed\n const l = useMemo(() => ({ ...DEFAULT_REVEALABLE_PASSWORD_INPUT_LABELS, ...labels }), [labels])\n return (\n <div className=\"relative\">\n <AuthInput\n type={isRevealed ? 'text' : 'password'}\n className={cn('pr-10', className)}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (!isControlled) setInnerRevealed((prev) => !prev)\n onToggleReveal?.()\n }}\n aria-label={isRevealed ? l.hidePassword : l.showPassword}\n aria-pressed={isRevealed}\n className=\"absolute inset-y-0 right-0 flex w-10 items-center justify-center rounded-r-md text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:w-11\"\n data-testid={testIdOr(toggleTestId, { testId: 'toggle-password-visibility' })}\n >\n {isRevealed ? (\n <EyeOff className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Eye className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n )\n}\n\n/** Small pill on a locked field, e.g. \"Verified\". */\nexport function AuthFieldBadge({\n icon,\n children,\n testId,\n}: {\n icon?: ReactNode\n children: ReactNode\n testId?: string\n}) {\n return (\n <span\n className=\"pointer-events-none absolute inset-y-0 right-3 flex items-center gap-1 text-xs font-medium text-green-text\"\n data-testid={testId}\n >\n {icon}\n {children}\n </span>\n )\n}\n\n/** Centred muted sentence under a step's primary action. */\nexport function AuthNote({ className, ...props }: ComponentProps<'p'>) {\n return <p className={cn('text-center text-sm text-muted-foreground', className)} {...props} />\n}\n\n/** Error / status message box for a form. */\nexport function AuthAlert({\n children,\n withIcon = false,\n testId,\n id,\n}: {\n children: ReactNode\n withIcon?: boolean\n testId?: string\n /** Lets a field point at this message with `aria-describedby`. */\n id?: string\n}) {\n return (\n <div\n id={id}\n role=\"alert\"\n data-testid={testId}\n className=\"flex gap-2 rounded-md bg-red-bg p-3 text-sm text-red-text\"\n >\n {withIcon && <AlertCircle className=\"h-5 w-5 flex-shrink-0\" aria-hidden=\"true\" />}\n <div>{children}</div>\n </div>\n )\n}\n\nexport interface AuthSubmitButtonProps extends ComponentProps<typeof Button> {\n /** Shows a spinner and sets `aria-busy`. */\n isBusy?: boolean\n /** Shorthand for `data-testid`. */\n testId?: string\n}\n\n/** Full-width primary submit with a spinner while busy. */\nexport function AuthSubmitButton({\n isBusy,\n testId,\n children,\n className,\n ...props\n}: AuthSubmitButtonProps) {\n return (\n <Button\n type=\"submit\"\n className={cn('w-full', className)}\n aria-busy={isBusy || undefined}\n data-testid={testId}\n {...props}\n >\n {isBusy && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {children}\n </Button>\n )\n}\n\n/** \"or continue with\" separator between the form and the SSO button. */\nexport function AuthDivider({ label, testId }: { label: string; testId?: string }) {\n return (\n <div\n data-slot=\"auth-divider\"\n data-testid={testIdOr(testId, { testId: 'login-divider' })}\n className=\"relative\"\n >\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-border\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-background px-2 text-muted-foreground\">{label}</span>\n </div>\n </div>\n )\n}\n\nexport interface AuthTabOption<T extends string> {\n value: T\n label: string\n testId?: string\n}\n\n/**\n * Underline tab pair (Login / Register) above the form. Radix Tabs: one tab stop, arrow keys,\n * Home and End move between tabs and select them (the form below swaps with the selection).\n */\nexport function AuthTabs<T extends string>({\n value,\n onChange,\n tabs,\n ariaLabel,\n}: {\n value: T\n onChange: (value: T) => void\n tabs: AuthTabOption<T>[]\n ariaLabel: string\n}) {\n return (\n <TabsPrimitive.Root value={value} onValueChange={(next) => onChange(next as T)}>\n <TabsPrimitive.List aria-label={ariaLabel} className=\"inline-flex items-center gap-6\">\n {tabs.map((tab) => (\n <TabsPrimitive.Trigger\n key={tab.value}\n value={tab.value}\n data-testid={tab.testId}\n className={cn(\n '-mb-px border-b-2 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-w-11 pointer-coarse:py-3',\n tab.value === value\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n {tab.label}\n </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n {/* The form the tabs switch lives outside this component; these empty, hidden panels only\n give each tab's `aria-controls` a valid target. */}\n {tabs.map((tab) => (\n <TabsPrimitive.Content\n key={tab.value}\n value={tab.value}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"hidden\"\n />\n ))}\n </TabsPrimitive.Root>\n )\n}\n\n/** Pill shown instead of the tabs when the device is offline. */\nexport function AuthOfflineBadge({\n label,\n title,\n testId,\n labels,\n}: {\n label?: string\n title?: string\n testId?: string\n labels?: Partial<AuthOfflineBadgeLabels>\n}) {\n const text = label ?? labels?.offline ?? DEFAULT_AUTH_OFFLINE_BADGE_LABELS.offline\n return (\n <span\n data-testid={testIdOr(testId, { testId: 'login-offline-indicator' })}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-yellow-bg px-2.5 py-1.5 text-sm font-medium text-yellow-text\"\n title={title}\n >\n <WifiOff className=\"h-4 w-4 shrink-0\" />\n {text}\n </span>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { MoreVertical } from 'lucide-react'\nimport {\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface AuthLegalLink {\n href: string\n label: string\n}\n\nexport interface AuthConsentProps {\n termsAccepted: boolean\n onTermsAcceptedChange: (accepted: boolean) => void\n /** Whether to download a recovery key on signup (opt-out; unchecking shows the warning). */\n saveRecoveryKey: boolean\n onSaveRecoveryKeyChange: (save: boolean) => void\n termsLink: AuthLegalLink\n privacyLink: AuthLegalLink\n /** Shown (role=\"alert\") only when the recovery-key box is unchecked. */\n noRecoveryKeyWarning: string\n labels?: Partial<AuthConsentLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<\n Record<'termsCheckbox' | 'recoveryKeyCheckbox' | 'noRecoveryKeyWarning', string>\n >\n}\n\n/** Every fixed string of the sign-up consent block. */\nexport interface AuthConsentLabels {\n /** Text before the terms link. */\n acknowledge: string\n /** Text between the terms and privacy links. */\n and: string\n downloadRecoveryKey: string\n}\n\nexport const DEFAULT_AUTH_CONSENT_LABELS: AuthConsentLabels = {\n acknowledge: 'I acknowledge the',\n and: 'and',\n downloadRecoveryKey: 'Download my recovery key',\n}\n\n/** Every fixed string of the sign-in footer. */\nexport interface AuthFooterLinksLabels {\n installOptions: string\n install: string\n}\n\nexport const DEFAULT_AUTH_FOOTER_LINKS_LABELS: AuthFooterLinksLabels = {\n installOptions: 'Install options',\n install: 'Install',\n}\n\nconst LEGAL_LINK_CLASS = 'underline transition-colors hover:text-primary'\n\n/** Sign-up consent: required terms checkbox and the opt-out \"download recovery key\" checkbox. */\nexport function AuthConsent({\n termsAccepted,\n onTermsAcceptedChange,\n saveRecoveryKey,\n onSaveRecoveryKeyChange,\n termsLink,\n privacyLink,\n noRecoveryKeyWarning,\n labels,\n testIds,\n}: AuthConsentProps) {\n const l = useMemo(() => ({ ...DEFAULT_AUTH_CONSENT_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"auth-consent\" className=\"space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Checkbox\n id=\"accept-terms\"\n checked={termsAccepted}\n onCheckedChange={(checked) => onTermsAcceptedChange(checked === true)}\n data-testid={testIdOr(testIds?.termsCheckbox, { testId: 'accept-terms-checkbox' })}\n />\n <label\n htmlFor=\"accept-terms\"\n className=\"cursor-pointer text-sm leading-relaxed text-muted-foreground\"\n >\n {l.acknowledge}{' '}\n <a\n href={termsLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={LEGAL_LINK_CLASS}\n >\n {termsLink.label}\n </a>{' '}\n {l.and}{' '}\n <a\n href={privacyLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={LEGAL_LINK_CLASS}\n >\n {privacyLink.label}\n </a>\n </label>\n </div>\n <div className=\"flex items-start gap-2\">\n <Checkbox\n id=\"save-recovery-key\"\n checked={saveRecoveryKey}\n onCheckedChange={(checked) => onSaveRecoveryKeyChange(checked === true)}\n data-testid={testIdOr(testIds?.recoveryKeyCheckbox, {\n testId: 'save-recovery-key-checkbox',\n })}\n />\n <label\n htmlFor=\"save-recovery-key\"\n className=\"cursor-pointer text-sm leading-relaxed text-muted-foreground\"\n >\n {l.downloadRecoveryKey}\n </label>\n </div>\n {/* Only shown on opt-out: the default path stays free of warnings. */}\n {!saveRecoveryKey && (\n <p\n className=\"text-sm text-red-text\"\n role=\"alert\"\n data-testid={testIdOr(testIds?.noRecoveryKeyWarning, {\n testId: 'no-recovery-key-warning',\n })}\n >\n {noRecoveryKeyWarning}\n </p>\n )}\n </div>\n )\n}\n\nexport interface AuthInstallOption {\n id: string\n label: ReactNode\n icon?: ReactNode\n onSelect: () => void\n disabled?: boolean\n testId?: string\n}\n\nexport interface AuthFooterLinksProps {\n privacyLink: AuthLegalLink\n /** Entries of the \"Install\" kebab menu. Omit/empty to hide the menu. */\n installOptions?: AuthInstallOption[]\n /** Dialog or other overlay owned by the host, rendered inside the footer. */\n children?: ReactNode\n labels?: Partial<AuthFooterLinksLabels>\n /** Install menu trigger id (default `install-options-trigger`). */\n installTriggerTestId?: string\n}\n\n/** Sign-in footer: privacy link on the left, an \"Install\" kebab menu on the right. */\nexport function AuthFooterLinks({\n privacyLink,\n installOptions = [],\n children,\n labels,\n installTriggerTestId,\n}: AuthFooterLinksProps) {\n const l = useMemo(() => ({ ...DEFAULT_AUTH_FOOTER_LINKS_LABELS, ...labels }), [labels])\n return (\n <div\n data-slot=\"auth-footer-links\"\n className=\"flex items-center justify-between pt-2 text-sm text-muted-foreground\"\n >\n <a\n href={privacyLink.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center transition-colors hover:text-primary pointer-coarse:min-h-11\"\n >\n {privacyLink.label}\n </a>\n\n {installOptions.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex items-center gap-1 rounded-md px-1.5 py-1 transition-colors hover:text-primary focus:outline-none focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:min-h-11\"\n aria-label={l.installOptions}\n data-testid={testIdOr(installTriggerTestId, { testId: 'install-options-trigger' })}\n >\n {l.install}\n <MoreVertical size={14} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {installOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n onClick={option.onSelect}\n disabled={option.disabled}\n className=\"gap-2\"\n data-testid={option.testId}\n >\n {option.icon}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {children}\n </div>\n )\n}\n","/**\n * Auth Error Parsing Utility\n *\n * Parses API error responses into user-friendly messages.\n * Handles FastAPI/Pydantic error formats (detail field) and standard Error objects.\n */\n\nexport interface ParseAuthErrorOptions {\n /** Default message if error cannot be parsed */\n defaultMessage?: string\n /** Check for 429 rate limit errors */\n checkRateLimit?: boolean\n /** Map specific error messages to custom messages */\n messageMap?: Record<string, string>\n}\n\n/**\n * Parse an API error into a user-friendly message\n */\nexport function parseAuthError(error: unknown, options: ParseAuthErrorOptions = {}): string {\n const {\n defaultMessage = 'Unable to communicate with the server',\n checkRateLimit = false,\n messageMap = {},\n } = options\n\n if (!error) return defaultMessage\n\n // An Error carrying the server's answer (`detail`, `status`: what the SDK's auth calls throw) is\n // read like the answer itself.\n if (error instanceof Error && !('detail' in error) && !('status' in error)) {\n return isNetworkError(error.message)\n ? defaultMessage\n : applyMessageMap(error.message, messageMap)\n }\n\n if (typeof error !== 'object') return defaultMessage\n\n const errorObj = error as {\n detail?: string | Array<{ msg: string }>\n message?: string\n status?: number\n }\n // The server's answer wins over a wrapping message (\"Login failed: …\").\n const message = errorObj.detail === undefined ? errorObj.message : undefined\n\n // Check for rate limiting (429)\n if (checkRateLimit) {\n if (\n errorObj.status === 429 ||\n errorObj.message?.includes('429') ||\n (typeof errorObj.detail === 'string' && errorObj.detail.includes('429'))\n ) {\n return 'Error: duplicate request'\n }\n }\n\n // Handle detail field (FastAPI/Pydantic style)\n if (errorObj.detail) {\n if (Array.isArray(errorObj.detail)) {\n return errorObj.detail[0]?.msg || 'Validation error occurred'\n }\n if (typeof errorObj.detail === 'string') {\n return applyMessageMap(errorObj.detail, messageMap)\n }\n }\n\n // Handle message field\n if (message) {\n return isNetworkError(message) ? defaultMessage : applyMessageMap(message, messageMap)\n }\n\n return defaultMessage\n}\n\nfunction isNetworkError(message: string): boolean {\n const lower = message.toLowerCase()\n return lower.includes('fetch') || lower.includes('network')\n}\n\nfunction applyMessageMap(message: string, messageMap: Record<string, string>): string {\n return messageMap[message] ?? message\n}\n","/**\n * Password rules: the requirements a new password must meet (registration, a new SSO account's\n * master password, a password change), as one value a site configures once (`createPasswordRules`)\n * and every form reads: the one-line hint of `PasswordStrengthInput`, the submit gate, the error.\n */\n\nexport interface PasswordRequirements {\n minLength: boolean\n hasUpperOrSpecial: boolean\n hasNumber: boolean\n}\n\nexport interface PasswordRules {\n minLength: number\n /** Which requirements the password meets. */\n check(password: string): PasswordRequirements\n /** The first unmet requirement as a short hint, or `null` when the password is acceptable. */\n unmet(password: string): string | null\n isValid(password: string): boolean\n /** The first unmet requirement as a sentence (an error to show), or `null`. */\n error(password: string): string | null\n}\n\n/** The rules with a minimum length (default 8): one uppercase or special character, one number. */\nexport function createPasswordRules(minLength = 8): PasswordRules {\n const check = (password: string): PasswordRequirements => ({\n minLength: password.length >= minLength,\n hasUpperOrSpecial: /[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password),\n hasNumber: /[0-9]/.test(password),\n })\n return {\n minLength,\n check,\n unmet(password) {\n const met = check(password)\n if (!met.minLength) return `Minimum ${minLength} characters`\n if (!met.hasUpperOrSpecial) return 'At least one uppercase letter or special character'\n if (!met.hasNumber) return 'At least one number'\n return null\n },\n isValid(password) {\n const met = check(password)\n return met.minLength && met.hasUpperOrSpecial && met.hasNumber\n },\n error(password) {\n const met = check(password)\n if (!met.minLength) return `Password must be at least ${minLength} characters long.`\n if (!met.hasUpperOrSpecial) {\n return 'Password must contain at least one uppercase letter or special character.'\n }\n if (!met.hasNumber) return 'Password must contain at least one number.'\n return null\n },\n }\n}\n\n/** The default rules (8 characters). */\nexport const DEFAULT_PASSWORD_RULES = createPasswordRules()\n","/**\n * Credential Storage Utilities\n *\n * Uses the Credential Management API to prompt browsers to save passwords.\n * This helps users store passwords in their browser's built-in password manager.\n */\n\n/**\n * Prompt the browser to save credentials to its password manager.\n *\n * This uses the Credential Management API which is supported by:\n * - Chrome/Edge (full support, syncs to Google/Microsoft account)\n * - Firefox (limited support)\n * - Safari (uses Keychain instead)\n *\n * @param email - User's email address\n * @param password - User's password\n * @returns true if credential was stored, false otherwise\n */\nexport async function promptSaveCredential(email: string, password: string): Promise<boolean> {\n // Check if Credential Management API is supported\n if (!('credentials' in navigator) || !('PasswordCredential' in window)) {\n console.info('[CREDENTIAL] Credential Management API not supported')\n return false\n }\n\n try {\n // Create a PasswordCredential object\n const credential = new (\n window as unknown as {\n PasswordCredential: new (data: {\n id: string\n password: string\n name?: string\n }) => Credential\n }\n ).PasswordCredential({\n id: email,\n password: password,\n name: 'ARBI Account',\n })\n\n // Prompt the browser to store the credential\n await navigator.credentials.store(credential)\n console.info('[CREDENTIAL] Credential stored successfully')\n return true\n } catch (error) {\n // User may have declined or browser doesn't support\n console.info('[CREDENTIAL] Failed to store credential:', error)\n return false\n }\n}\n","import {\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type FormEvent,\n type ReactNode,\n useId,\n} from 'react'\nimport { AlertCircle, Key, Loader2, Shield, Upload } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nfunction ErrorBox({ message, id }: { message: string; id?: string }) {\n return (\n <div id={id} role=\"alert\" className=\"rounded-md bg-red-bg p-3\">\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" aria-hidden=\"true\" />\n <p className=\"text-sm text-red-text\">{message}</p>\n </div>\n </div>\n )\n}\n\n/** Every fixed string of the recovery-key dialog. `title` / description props win. */\nexport interface RecoveryKeyDialogLabels {\n title: string\n verifiedDescription: string\n unverifiedDescription: string\n done: string\n currentPassword: string\n passwordPlaceholder: string\n cancel: string\n verifying: string\n verify: string\n}\n\nexport const DEFAULT_RECOVERY_KEY_DIALOG_LABELS: RecoveryKeyDialogLabels = {\n title: 'Save your recovery key',\n verifiedDescription:\n \"If you forget your password, this is the only way to get back into your account. Save it to your password manager so it's there when you need it.\",\n unverifiedDescription: 'Confirm your password to continue.',\n done: 'Done',\n currentPassword: 'Current Password',\n passwordPlaceholder: 'Enter your password',\n cancel: 'Cancel',\n verifying: 'Verifying...',\n verify: 'Verify',\n}\n\n/** Every fixed string of the account-recovery dialog. */\nexport interface AccountRecoveryDialogLabels {\n title: string\n description: string\n emailAddress: string\n emailPlaceholder: string\n keyLoadedFromLink: string\n ssoProtectedKeyNotice: string\n recoveryKey: string\n ssoProtectedKey: string\n dropKeyHere: string\n uploadKeyPrompt: string\n ssoSignInNotice: string\n ssoSignIn: string\n afterRecoveryNotice: string\n cancel: string\n recovering: string\n recoverAccount: string\n}\n\nexport const DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS: AccountRecoveryDialogLabels = {\n title: 'Recover Your Account',\n description: 'Upload your recovery key to regain access to your account',\n emailAddress: 'Email Address',\n emailPlaceholder: 'Enter your email',\n keyLoadedFromLink: 'Recovery key loaded from link',\n ssoProtectedKeyNotice: 'SSO-protected key — you must be signed into the matching SSO account.',\n recoveryKey: 'Recovery Key',\n ssoProtectedKey: 'SSO Protected Key',\n dropKeyHere: 'Drop your recovery key here',\n uploadKeyPrompt: 'Click or drag to upload your recovery key (.key file)',\n ssoSignInNotice:\n 'This account signs in with single sign-on. Sign in with your identity provider to continue — you won\\u2019t need your forgotten master password for that step.',\n ssoSignIn: 'Sign in with Auth0 to continue',\n afterRecoveryNotice:\n 'After successful recovery, you will be prompted to set a new password to secure your account.',\n cancel: 'Cancel',\n recovering: 'Recovering...',\n recoverAccount: 'Recover Account',\n}\n\nexport interface RecoveryKeyDialogProps {\n labels?: Partial<RecoveryKeyDialogLabels>\n open: boolean\n onClose: () => void\n /** Content shown once the password is verified (the key download). `null` while verifying. */\n verified: ReactNode | null\n password: string\n onPasswordChange: (password: string) => void\n onVerify: () => void\n isVerifying: boolean\n error: string | null\n title?: string\n verifiedDescription?: string\n unverifiedDescription?: string\n /** Dialog test id (default `download-recovery-key-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'passwordInput', string>>\n}\n\n/**\n * \"Save your recovery key\": confirm the account password first, then reveal the key download\n * (`verified`) with a Done button.\n */\nexport function RecoveryKeyDialog({\n open,\n onClose,\n verified,\n password,\n onPasswordChange,\n onVerify,\n isVerifying,\n error,\n title,\n verifiedDescription,\n unverifiedDescription,\n labels,\n testId,\n testIds,\n}: RecoveryKeyDialogProps) {\n const verifyPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_RECOVERY_KEY_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onVerify()\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'download-recovery-key-dialog' })}\n >\n <DialogHeader>\n <DialogTitle className=\"font-heading\">{title ?? l.title}</DialogTitle>\n <DialogDescription>\n {verified\n ? (verifiedDescription ?? l.verifiedDescription)\n : (unverifiedDescription ?? l.unverifiedDescription)}\n </DialogDescription>\n </DialogHeader>\n\n {verified ? (\n <div className=\"space-y-4\">\n {verified}\n <div className=\"flex justify-end\">\n <Button onClick={onClose}>{l.done}</Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor={verifyPasswordId} className=\"text-sm font-medium\">\n {l.currentPassword}\n </label>\n <Input\n id={verifyPasswordId}\n type=\"password\"\n value={password}\n onChange={(e) => onPasswordChange(e.target.value)}\n placeholder={l.passwordPlaceholder}\n disabled={isVerifying}\n autoComplete=\"current-password\"\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? `${verifyPasswordId}-error` : undefined}\n data-testid={testIdOr(testIds?.passwordInput, { testId: 'verify-password-input' })}\n />\n </div>\n\n {error && <ErrorBox message={error} id={`${verifyPasswordId}-error`} />}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={isVerifying}>\n {l.cancel}\n </Button>\n <Button type=\"submit\" disabled={isVerifying || !password}>\n {isVerifying ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.verifying}\n </>\n ) : (\n l.verify\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface AccountRecoveryDialogProps {\n labels?: Partial<AccountRecoveryDialogLabels>\n open: boolean\n onClose: () => void\n email: string\n onEmailChange: (email: string) => void\n /** The key arrived in the page URL (the /recover link): show a \"loaded\" notice, no file picker. */\n isKeyFromLink: boolean\n /** Name of the chosen key file, once one is loaded. */\n keyFileName: string | null\n /** The loaded key is wrapped with the user's SSO identity. */\n isKeyEncrypted: boolean\n /** A file was picked or dropped. */\n onKeyFile: (file: File) => void\n error: string | null\n /** SSO sign-in is the next required step (SSO-wrapped key or SSO-linked account). */\n needsSsoSignIn: boolean\n onSsoSignIn: () => void\n isProcessing: boolean\n /** Enables the submit button (email and key present). */\n canSubmit: boolean\n onSubmit: () => void\n /** Dialog test id (default `forgot-password-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<\n Record<'emailInput' | 'keyDropzone' | 'keyInput' | 'ssoSignIn' | 'cancel' | 'submit', string>\n >\n}\n\n/**\n * Account recovery: email + recovery key (file or link) -> sign in with the key. When the account\n * is SSO-linked, the SSO prompt replaces the submit button.\n */\nexport function AccountRecoveryDialog({\n open,\n onClose,\n email,\n onEmailChange,\n isKeyFromLink,\n keyFileName,\n isKeyEncrypted,\n onKeyFile,\n error,\n needsSsoSignIn,\n onSsoSignIn,\n isProcessing,\n canSubmit,\n onSubmit,\n labels,\n testId,\n testIds,\n}: AccountRecoveryDialogProps) {\n const recoveryEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_ACCOUNT_RECOVERY_DIALOG_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [isDragActive, setIsDragActive] = useState(false)\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(true)\n }\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n }\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file) onKeyFile(file)\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'forgot-password-modal' })}\n >\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-primary\" />\n {l.title}\n </DialogTitle>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor={recoveryEmailId} className=\"text-sm font-medium\">\n {l.emailAddress}\n </label>\n <Input\n id={recoveryEmailId}\n type=\"email\"\n value={email}\n onChange={(e) => onEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.emailInput, { testId: 'recovery-email-input' })}\n />\n </div>\n\n {isKeyFromLink ? (\n <div className=\"rounded-md bg-green-bg p-3\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-green-text\" />\n <span className=\"font-medium text-green-text\">{l.keyLoadedFromLink}</span>\n </div>\n {isKeyEncrypted && (\n <p className=\"mt-1 inline-flex items-center gap-1 text-sm text-primary\">\n <Shield className=\"h-3 w-3\" />\n {l.ssoProtectedKeyNotice}\n </p>\n )}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{l.recoveryKey}</label>\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'cursor-pointer rounded-lg p-4 text-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragActive ? 'bg-accent' : 'bg-muted hover:bg-muted/70'\n )}\n onClick={() => fileInputRef.current?.click()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n fileInputRef.current?.click()\n }\n }}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n data-testid={testIdOr(testIds?.keyDropzone, { testId: 'recovery-key-dropzone' })}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".key\"\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) onKeyFile(file)\n }}\n className=\"hidden\"\n data-testid={testIdOr(testIds?.keyInput, { testId: 'recovery-key-input' })}\n />\n {keyFileName ? (\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex items-center justify-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-green-text\" />\n <span className=\"font-medium text-green-text\">{keyFileName}</span>\n </div>\n {isKeyEncrypted && (\n <span className=\"inline-flex items-center gap-1 text-sm text-primary\">\n <Shield className=\"h-3 w-3\" />\n {l.ssoProtectedKey}\n </span>\n )}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Upload className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {isDragActive ? l.dropKeyHere : l.uploadKeyPrompt}\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {error && <ErrorBox message={error} />}\n\n {needsSsoSignIn ? (\n <div className=\"space-y-2 rounded-lg bg-muted p-3\">\n <div className=\"flex gap-2\">\n <Shield className=\"h-5 w-5 flex-shrink-0 text-primary\" />\n <p className=\"text-sm\">{l.ssoSignInNotice}</p>\n </div>\n <Button\n onClick={onSsoSignIn}\n className=\"w-full\"\n data-testid={testIdOr(testIds?.ssoSignIn, { testId: 'recovery-sso-signin-button' })}\n >\n {l.ssoSignIn}\n </Button>\n </div>\n ) : (\n <div className=\"rounded-md bg-muted p-3\">\n <p className=\"text-sm text-muted-foreground\">{l.afterRecoveryNotice}</p>\n </div>\n )}\n </div>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, { testId: 'forgot-password-cancel' })}\n >\n {l.cancel}\n </Button>\n {/* Hidden when SSO sign-in is the next step, to avoid two competing options. */}\n {!needsSsoSignIn && (\n <Button\n onClick={onSubmit}\n disabled={isProcessing || !canSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'forgot-password-submit' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.recovering}\n </>\n ) : (\n l.recoverAccount\n )}\n </Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/** The auth pages' URL fragment: `#verify=…&code=…&next=…`, and a fragment carried after it. */\n\n/**\n * Split an auth page's hash (`#verify=…&code=…&next=…`) from a second fragment appended after it.\n * A call invitation's registration link ends with the call key fragment (`…#k=…&v=…`) — a URL has\n * one fragment, so it arrives inside ours, after a second `#`.\n */\nexport function splitAuthHash(hash: string): {\n params: URLSearchParams\n /** `#k=…&v=…` (with its `#`), or '' when there is none. */\n trailingFragment: string\n} {\n const raw = hash.replace(/^#/, '')\n const cut = raw.indexOf('#')\n return {\n params: new URLSearchParams(cut >= 0 ? raw.slice(0, cut) : raw),\n trailingFragment: cut >= 0 ? raw.slice(cut) : '',\n }\n}\n\n/** `next` with the trailing fragment appended, unless `next` already carries a fragment. */\nexport function withTrailingFragment(next: string, trailingFragment: string): string {\n if (!trailingFragment || trailingFragment === '#' || next.includes('#')) return next\n return `${next}${trailingFragment}`\n}\n","/**\n * Sign-in from the URL fragment, for mock and demo deployments only:\n *\n * <login page>#email=<urlencoded>&password=<urlencoded>[&next=/path]\n *\n * OFF by default: nothing is read unless the page opts in (`enabled`). A password in a link is\n * visible to whoever holds the link, so a real deployment never turns this on. When on, the\n * fragment is read once and scrubbed from the address bar (`history.replaceState`) before the\n * first render commits, so it does not linger in history or get copied along with the URL. The\n * fragment never reaches the server; the credentials are never logged nor stored.\n *\n * Values are form-urlencoded (`URLSearchParams`): encode a `+` in a password as `%2B`. Other\n * auth-page parameters (`#verify=…`) and a trailing fragment after a second `#` (a call key) are\n * left in place.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { splitAuthHash, withTrailingFragment } from './auth-hash'\n\nexport interface FragmentCredentials {\n email: string\n password: string\n /** Where to go once signed in: a same-origin path, or `null`. */\n next: string | null\n}\n\nconst KEYS = ['email', 'password', 'next'] as const\n\n/** A same-origin absolute path (`/app/…`), never a scheme or a protocol-relative URL. */\nfunction safeNext(next: string | null): string | null {\n if (!next || !next.startsWith('/') || next.startsWith('//') || next.startsWith('/\\\\')) return null\n return next\n}\n\n/** The credentials in an auth page's hash, or `null` without both an email and a password. */\nexport function parseFragmentCredentials(hash: string): FragmentCredentials | null {\n const { params, trailingFragment } = splitAuthHash(hash)\n const email = params.get('email')?.trim()\n const password = params.get('password')\n if (!email || !password) return null\n const next = safeNext(params.get('next'))\n return { email, password, next: next && withTrailingFragment(next, trailingFragment) }\n}\n\n/**\n * Read the credentials from the current URL's fragment and scrub them (with `next`) from the\n * address bar, keeping any other fragment parameters. `null` when there are none; a fragment with\n * only one of email/password is scrubbed all the same.\n */\nexport function consumeFragmentCredentials(): FragmentCredentials | null {\n if (typeof window === 'undefined') return null\n const { hash, pathname, search } = window.location\n const { params, trailingFragment } = splitAuthHash(hash)\n if (!KEYS.some((k) => k !== 'next' && params.has(k))) return null\n const credentials = parseFragmentCredentials(hash)\n for (const k of KEYS) params.delete(k)\n const rest = params.toString()\n const kept = rest ? `#${rest}${trailingFragment}` : trailingFragment\n window.history.replaceState(window.history.state, '', `${pathname}${search}${kept}`)\n return credentials\n}\n\n// Read once per page load and held only until the sign-in is handed over (a strict-mode double\n// render reads the already-scrubbed URL, so it takes these instead).\nlet taken: FragmentCredentials | null = null\n\nfunction take(): FragmentCredentials | null {\n const fresh = consumeFragmentCredentials()\n if (fresh) taken = fresh\n return taken\n}\n\nexport interface UseFragmentCredentialsOptions {\n /** Opt in. Off by default: only a mock/demo deployment turns this on. */\n enabled?: boolean\n /** Sign in with them (the same path as the form). Called once. */\n onCredentials: (credentials: FragmentCredentials) => void\n}\n\n/**\n * Opt-in sign-in from `#email=…&password=…[&next=…]` (see the top of this file). Returns the\n * email and `next` from the link (to prefill the form should the sign-in fail), or `null`.\n */\nexport function useFragmentCredentials({\n enabled = false,\n onCredentials,\n}: UseFragmentCredentialsOptions): Omit<FragmentCredentials, 'password'> | null {\n // Read (and scrub) during the first render, before any effect or await.\n const [credentials] = useState(() => (enabled ? take() : null))\n const handedOver = useRef(false)\n const callback = useRef(onCredentials)\n callback.current = onCredentials\n\n useEffect(() => {\n if (!credentials || handedOver.current) return\n handedOver.current = true\n taken = null\n callback.current(credentials)\n }, [credentials])\n\n return credentials && { email: credentials.email, next: credentials.next }\n}\n"]}
@@ -1,12 +1,152 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZX663X3X_cjs = require('./chunk-ZX663X3X.cjs');
4
+ var chunkKNRAKOCO_cjs = require('./chunk-KNRAKOCO.cjs');
5
+ var chunkKUQOHPKP_cjs = require('./chunk-KUQOHPKP.cjs');
6
+ var chunkNWNVWO6L_cjs = require('./chunk-NWNVWO6L.cjs');
7
+ var zustand = require('zustand');
8
+ var middleware = require('zustand/middleware');
5
9
  var jsxRuntime = require('react/jsx-runtime');
6
10
  var react = require('react');
7
11
  var ui = require('@arbidocs/react/ui');
8
12
  var lucideReact = require('lucide-react');
9
13
 
14
+ var TEXT_SIZE_SCALE = {
15
+ default: "100%",
16
+ large: "112.5%",
17
+ larger: "125%"
18
+ };
19
+ function applyColorScheme(scheme) {
20
+ if (typeof document === "undefined") return;
21
+ document.documentElement.classList.toggle("dark", scheme === "dark");
22
+ }
23
+ function applyTextSize(size) {
24
+ if (typeof document === "undefined") return;
25
+ const scale = TEXT_SIZE_SCALE[size] ?? TEXT_SIZE_SCALE.default;
26
+ document.documentElement.style.fontSize = scale === "100%" ? "" : scale;
27
+ }
28
+ function createAppearanceStore({
29
+ storageKey,
30
+ defaults: given,
31
+ pairingIds
32
+ }) {
33
+ const defaults = { colorScheme: "light", textSize: "default", ...given };
34
+ if (!chunkNWNVWO6L_cjs.getFontPairing(defaults.pairingId)) {
35
+ throw new Error(`createAppearanceStore: no font pairing "${defaults.pairingId}"`);
36
+ }
37
+ const resolvePairing = (pairingId) => chunkNWNVWO6L_cjs.getFontPairing(pairingId) ?? chunkNWNVWO6L_cjs.getFontPairing(defaults.pairingId);
38
+ const applyAll = ({ pairingId, colorScheme, textSize }) => {
39
+ if (typeof document === "undefined") return;
40
+ chunkKUQOHPKP_cjs.applyFontVars(resolvePairing(pairingId));
41
+ applyColorScheme(colorScheme);
42
+ applyTextSize(textSize);
43
+ };
44
+ const useStore = zustand.create()(
45
+ middleware.persist(
46
+ (set) => ({
47
+ ...defaults,
48
+ setPairing: (pairingId) => {
49
+ const pairing = chunkNWNVWO6L_cjs.getFontPairing(pairingId);
50
+ if (!pairing) return;
51
+ chunkKUQOHPKP_cjs.applyFontVars(pairing);
52
+ set({ pairingId });
53
+ },
54
+ setColorScheme: (colorScheme) => {
55
+ applyColorScheme(colorScheme);
56
+ set({ colorScheme });
57
+ },
58
+ setTextSize: (textSize) => {
59
+ if (!(textSize in TEXT_SIZE_SCALE)) return;
60
+ applyTextSize(textSize);
61
+ set({ textSize });
62
+ },
63
+ reset: () => {
64
+ applyAll(defaults);
65
+ set({ ...defaults });
66
+ }
67
+ }),
68
+ {
69
+ name: storageKey,
70
+ // Paint the persisted choice as soon as the store rehydrates, so a reader never sees a
71
+ // frame of the default appearance before theirs lands.
72
+ onRehydrateStorage: () => (state) => {
73
+ if (state) applyAll(state);
74
+ }
75
+ }
76
+ )
77
+ );
78
+ return {
79
+ useStore,
80
+ defaults,
81
+ pairingIds,
82
+ resolvePairing,
83
+ applyStored: () => applyAll(useStore.getState())
84
+ };
85
+ }
86
+
87
+ // src/theme/fromCss.ts
88
+ function cssBlocks(css) {
89
+ const text = css.replace(/\/\*[\s\S]*?\*\//g, "");
90
+ const blocks = [];
91
+ const open = [];
92
+ let buffer = "";
93
+ const declare = () => {
94
+ const match = /^\s*(--[\w-]+)\s*:\s*([\s\S]*?)\s*$/.exec(buffer);
95
+ const block = open[open.length - 1];
96
+ if (match && block) block.vars[match[1]] = match[2];
97
+ buffer = "";
98
+ };
99
+ for (const ch of text) {
100
+ if (ch === "{") {
101
+ const block = { prelude: buffer.trim(), vars: {} };
102
+ open.push(block);
103
+ blocks.push(block);
104
+ buffer = "";
105
+ } else if (ch === "}") {
106
+ declare();
107
+ open.pop();
108
+ } else if (ch === ";") {
109
+ declare();
110
+ } else {
111
+ buffer += ch;
112
+ }
113
+ }
114
+ return blocks;
115
+ }
116
+ var selects = (prelude, selector) => prelude.split(",").some((part) => part.trim() === selector);
117
+ function varsOf(blocks, match) {
118
+ return Object.assign({}, ...blocks.filter((b) => match(b.prelude)).map((b) => b.vars));
119
+ }
120
+ function remOf(value) {
121
+ const match = /^(-?\d*\.?\d+)(rem|px)$/.exec(value.trim());
122
+ if (!match) throw new Error(`themeFromCss: --radius "${value}" is not in rem or px`);
123
+ return match[2] === "px" ? Number(match[1]) / 16 : Number(match[1]);
124
+ }
125
+ function themeFromCss(css, { tokens, mode = "flat", fonts, radius }) {
126
+ const blocks = cssBlocks(typeof css === "string" ? css : css.join("\n"));
127
+ const flat = mode === "flat";
128
+ const light = varsOf(blocks, (p) => flat ? /^@theme\b/.test(p) : selects(p, ":root"));
129
+ const dark = flat ? void 0 : varsOf(blocks, (p) => selects(p, ".dark"));
130
+ const prefix = flat ? "--color-" : "--";
131
+ const read = (vars, name, where) => {
132
+ const value = vars[name];
133
+ if (value === void 0) throw new Error(`themeFromCss: ${where} declares no ${name}`);
134
+ return value;
135
+ };
136
+ const lightWhere = flat ? "@theme" : ":root";
137
+ const colorsOf = (vars, where) => Object.fromEntries(tokens.map(({ key }) => [key, read(vars, prefix + key, where)]));
138
+ return {
139
+ theme: {
140
+ colors: colorsOf(light, lightWhere),
141
+ fonts: fonts ?? {
142
+ display: read(light, "--font-display", lightWhere),
143
+ sans: read(light, "--font-sans", lightWhere)
144
+ },
145
+ radius: radius ?? remOf(read(light, "--radius", lightWhere))
146
+ },
147
+ ...dark && { darkColors: colorsOf(dark, ".dark") }
148
+ };
149
+ }
10
150
  function CollectionDetail({
11
151
  items,
12
152
  slug,
@@ -172,7 +312,7 @@ function Chart({
172
312
  );
173
313
  }
174
314
  function Eyebrow({ children, index, rule = false, tone, className, testId }) {
175
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
315
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
176
316
  return /* @__PURE__ */ jsxRuntime.jsxs(
177
317
  "p",
178
318
  {
@@ -185,7 +325,7 @@ function Eyebrow({ children, index, rule = false, tone, className, testId }) {
185
325
  "data-testid": testId,
186
326
  children: [
187
327
  rule && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "h-px w-8 shrink-0 bg-primary" }),
188
- index !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("tabular-nums", t.accent), children: chunkZX663X3X_cjs.formatIndex(index) }),
328
+ index !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("tabular-nums", t.accent), children: chunkKNRAKOCO_cjs.formatIndex(index) }),
189
329
  /* @__PURE__ */ jsxRuntime.jsx("span", { children })
190
330
  ]
191
331
  }
@@ -202,7 +342,7 @@ function EditorialHeading({
202
342
  className,
203
343
  testId
204
344
  }) {
205
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
345
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
206
346
  const Heading = `h${level}`;
207
347
  return /* @__PURE__ */ jsxRuntime.jsxs(
208
348
  "div",
@@ -271,7 +411,7 @@ function EditorialHero({
271
411
  testIds
272
412
  }) {
273
413
  const tone = SURFACE_TONE[surface];
274
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
414
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
275
415
  const centered = align === "center" && !aside;
276
416
  const ids = {
277
417
  root: testIds?.root ?? testId,
@@ -281,7 +421,7 @@ function EditorialHero({
281
421
  actions: testIds?.actions ?? (testId ? `${testId}-actions` : void 0),
282
422
  aside: testIds?.aside ?? (testId ? `${testId}-aside` : void 0)
283
423
  };
284
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
424
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
285
425
  "section",
286
426
  {
287
427
  className: ui.cn("relative isolate overflow-hidden", SURFACE_CLASS[surface], className),
@@ -381,11 +521,11 @@ function EditorialSection({
381
521
  testId
382
522
  }) {
383
523
  const tone = SURFACE_TONE[surface];
384
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
524
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
385
525
  const hasHeading = Boolean(title || eyebrow || index !== void 0);
386
526
  const heading = hasHeading && title ? /* @__PURE__ */ jsxRuntime.jsx(EditorialHeading, { eyebrow, index, title, lead, tone }) : null;
387
527
  const split = layout !== "stacked";
388
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
528
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
389
529
  "section",
390
530
  {
391
531
  id,
@@ -434,7 +574,7 @@ function EditorialProse({
434
574
  className,
435
575
  testId
436
576
  }) {
437
- const t = chunkZX663X3X_cjs.useEditorialTone();
577
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
438
578
  return /* @__PURE__ */ jsxRuntime.jsx(
439
579
  "div",
440
580
  {
@@ -458,7 +598,7 @@ function DefinitionList({
458
598
  className,
459
599
  testId
460
600
  }) {
461
- const t = chunkZX663X3X_cjs.useEditorialTone();
601
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
462
602
  return /* @__PURE__ */ jsxRuntime.jsx(
463
603
  "dl",
464
604
  {
@@ -512,7 +652,7 @@ function DefinitionList({
512
652
  );
513
653
  }
514
654
  function CheckList({ items, columns = 1, icon, className, testId }) {
515
- const t = chunkZX663X3X_cjs.useEditorialTone();
655
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
516
656
  return /* @__PURE__ */ jsxRuntime.jsx(
517
657
  "ul",
518
658
  {
@@ -545,7 +685,7 @@ function CheckList({ items, columns = 1, icon, className, testId }) {
545
685
  );
546
686
  }
547
687
  function TagList({ items, label, className, testId }) {
548
- const t = chunkZX663X3X_cjs.useEditorialTone();
688
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
549
689
  if (items.length === 0) return null;
550
690
  return /* @__PURE__ */ jsxRuntime.jsx(
551
691
  "ul",
@@ -607,10 +747,10 @@ function PanelGrid({
607
747
  className,
608
748
  testId
609
749
  }) {
610
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
750
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
611
751
  const Heading = `h${headingLevel}`;
612
752
  const joined = variant === "joined";
613
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.EditorialToneContext.Provider, { value: t.tone, children: /* @__PURE__ */ jsxRuntime.jsx(
753
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.EditorialToneContext.Provider, { value: t.tone, children: /* @__PURE__ */ jsxRuntime.jsx(
614
754
  "ul",
615
755
  {
616
756
  className: ui.cn(
@@ -649,7 +789,7 @@ function PanelGrid({
649
789
  children: item.icon
650
790
  }
651
791
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
652
- number !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("font-display text-sm tabular-nums", t.subtle), children: chunkZX663X3X_cjs.formatIndex(number) }) : item.href && /* @__PURE__ */ jsxRuntime.jsx(
792
+ number !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("font-display text-sm tabular-nums", t.subtle), children: chunkKNRAKOCO_cjs.formatIndex(number) }) : item.href && /* @__PURE__ */ jsxRuntime.jsx(
653
793
  lucideReact.ArrowUpRight,
654
794
  {
655
795
  "aria-hidden": "true",
@@ -695,7 +835,7 @@ function PanelGrid({
695
835
  ]
696
836
  }
697
837
  );
698
- const cell = /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.BlockLink, { href: item.href, linkComponent, className: "block h-full", children: inner });
838
+ const cell = /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.BlockLink, { href: item.href, linkComponent, className: "block h-full", children: inner });
699
839
  return /* @__PURE__ */ jsxRuntime.jsx("li", { className: "min-w-0", children: reveal ? /* @__PURE__ */ jsxRuntime.jsx(Reveal, { delay: i * 90, className: "h-full", children: cell }) : cell }, i);
700
840
  })
701
841
  }
@@ -710,7 +850,7 @@ function PullQuote({
710
850
  className,
711
851
  testId
712
852
  }) {
713
- const t = chunkZX663X3X_cjs.useEditorialTone();
853
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
714
854
  const centered = align === "center";
715
855
  return /* @__PURE__ */ jsxRuntime.jsxs(
716
856
  "figure",
@@ -767,7 +907,7 @@ function ArticleList({
767
907
  className,
768
908
  testId
769
909
  }) {
770
- const t = chunkZX663X3X_cjs.useEditorialTone();
910
+ const t = chunkKNRAKOCO_cjs.useEditorialTone();
771
911
  if (items.length === 0) return empty ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: empty }) : null;
772
912
  const idOf = (item, i) => item.testId ?? (testId ? `${testId}-item-${i}` : void 0);
773
913
  if (layout === "rows") {
@@ -778,7 +918,7 @@ function ArticleList({
778
918
  "data-slot": "article-list",
779
919
  "data-layout": "rows",
780
920
  "data-testid": testId,
781
- children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.BlockLink, { href: item.href, linkComponent, className: "group block", children: /* @__PURE__ */ jsxRuntime.jsxs(
921
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.BlockLink, { href: item.href, linkComponent, className: "group block", children: /* @__PURE__ */ jsxRuntime.jsxs(
782
922
  "article",
783
923
  {
784
924
  className: "grid gap-2 py-6 transition-colors sm:grid-cols-[10rem_minmax(0,1fr)_auto] sm:gap-8",
@@ -817,7 +957,7 @@ function ArticleList({
817
957
  }
818
958
  );
819
959
  }
820
- const card = (item, i, lead) => /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.BlockLink, { href: item.href, linkComponent, className: "group block h-full", children: /* @__PURE__ */ jsxRuntime.jsxs(
960
+ const card = (item, i, lead) => /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.BlockLink, { href: item.href, linkComponent, className: "group block h-full", children: /* @__PURE__ */ jsxRuntime.jsxs(
821
961
  "article",
822
962
  {
823
963
  className: ui.cn(
@@ -829,7 +969,7 @@ function ArticleList({
829
969
  "data-testid": idOf(item, i),
830
970
  children: [
831
971
  item.imageUrl && /* @__PURE__ */ jsxRuntime.jsx(
832
- chunkZX663X3X_cjs.BlockImage,
972
+ chunkKNRAKOCO_cjs.BlockImage,
833
973
  {
834
974
  src: item.imageUrl,
835
975
  alt: item.imageAlt ?? "",
@@ -910,8 +1050,8 @@ function ProofStrip({
910
1050
  testId
911
1051
  }) {
912
1052
  const tone = SURFACE_TONE[surface];
913
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
914
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsx(
1053
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
1054
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsx(
915
1055
  "section",
916
1056
  {
917
1057
  "aria-label": label,
@@ -942,8 +1082,8 @@ function CtaBand({
942
1082
  testId
943
1083
  }) {
944
1084
  const tone = SURFACE_TONE[surface];
945
- const t = chunkZX663X3X_cjs.useEditorialTone(tone);
946
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZX663X3X_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
1085
+ const t = chunkKNRAKOCO_cjs.useEditorialTone(tone);
1086
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKNRAKOCO_cjs.EditorialToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
947
1087
  "section",
948
1088
  {
949
1089
  className: ui.cn("relative isolate overflow-hidden", SURFACE_CLASS[surface], className),
@@ -986,5 +1126,7 @@ exports.ProofStrip = ProofStrip;
986
1126
  exports.PullQuote = PullQuote;
987
1127
  exports.Reveal = Reveal;
988
1128
  exports.TagList = TagList;
989
- //# sourceMappingURL=chunk-O4EQYPLO.cjs.map
990
- //# sourceMappingURL=chunk-O4EQYPLO.cjs.map
1129
+ exports.createAppearanceStore = createAppearanceStore;
1130
+ exports.themeFromCss = themeFromCss;
1131
+ //# sourceMappingURL=chunk-C2SZQKX2.cjs.map
1132
+ //# sourceMappingURL=chunk-C2SZQKX2.cjs.map