@tidecloak/ui-framework 0.0.1

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 (48) hide show
  1. package/README.md +377 -0
  2. package/dist/index.d.mts +2739 -0
  3. package/dist/index.d.ts +2739 -0
  4. package/dist/index.js +12869 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +12703 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +54 -0
  9. package/src/components/common/ActionButton.tsx +234 -0
  10. package/src/components/common/EmptyState.tsx +140 -0
  11. package/src/components/common/LoadingSkeleton.tsx +121 -0
  12. package/src/components/common/RefreshButton.tsx +127 -0
  13. package/src/components/common/StatusBadge.tsx +177 -0
  14. package/src/components/common/index.ts +31 -0
  15. package/src/components/data-table/DataTable.tsx +201 -0
  16. package/src/components/data-table/PaginatedTable.tsx +247 -0
  17. package/src/components/data-table/index.ts +2 -0
  18. package/src/components/dialogs/CollapsibleSection.tsx +184 -0
  19. package/src/components/dialogs/ConfirmDialog.tsx +264 -0
  20. package/src/components/dialogs/DetailDialog.tsx +228 -0
  21. package/src/components/dialogs/index.ts +3 -0
  22. package/src/components/index.ts +5 -0
  23. package/src/components/pages/base/ApprovalsPageBase.tsx +680 -0
  24. package/src/components/pages/base/LogsPageBase.tsx +581 -0
  25. package/src/components/pages/base/RolesPageBase.tsx +1470 -0
  26. package/src/components/pages/base/TemplatesPageBase.tsx +761 -0
  27. package/src/components/pages/base/UsersPageBase.tsx +843 -0
  28. package/src/components/pages/base/index.ts +58 -0
  29. package/src/components/pages/connected/ApprovalsPage.tsx +797 -0
  30. package/src/components/pages/connected/LogsPage.tsx +267 -0
  31. package/src/components/pages/connected/RolesPage.tsx +525 -0
  32. package/src/components/pages/connected/TemplatesPage.tsx +181 -0
  33. package/src/components/pages/connected/UsersPage.tsx +237 -0
  34. package/src/components/pages/connected/index.ts +36 -0
  35. package/src/components/pages/index.ts +5 -0
  36. package/src/components/tabs/TabsView.tsx +300 -0
  37. package/src/components/tabs/index.ts +1 -0
  38. package/src/components/ui/index.tsx +1001 -0
  39. package/src/hooks/index.ts +3 -0
  40. package/src/hooks/useAutoRefresh.ts +119 -0
  41. package/src/hooks/usePagination.ts +152 -0
  42. package/src/hooks/useSelection.ts +81 -0
  43. package/src/index.ts +256 -0
  44. package/src/theme.ts +185 -0
  45. package/src/tide/index.ts +19 -0
  46. package/src/tide/tidePolicy.ts +270 -0
  47. package/src/types/index.ts +484 -0
  48. package/src/utils/index.ts +121 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/theme.ts","../node_modules/@tanstack/query-core/src/subscribable.ts","../node_modules/@tanstack/query-core/src/timeoutManager.ts","../node_modules/@tanstack/query-core/src/utils.ts","../node_modules/@tanstack/query-core/src/focusManager.ts","../node_modules/@tanstack/query-core/src/thenable.ts","../node_modules/@tanstack/query-core/src/notifyManager.ts","../node_modules/@tanstack/query-core/src/onlineManager.ts","../node_modules/@tanstack/query-core/src/retryer.ts","../node_modules/@tanstack/query-core/src/removable.ts","../node_modules/@tanstack/query-core/src/query.ts","../node_modules/@tanstack/query-core/src/queryObserver.ts","../node_modules/@tanstack/query-core/src/infiniteQueryBehavior.ts","../node_modules/@tanstack/query-core/src/mutation.ts","../node_modules/@tanstack/query-core/src/mutationCache.ts","../node_modules/@tanstack/query-core/src/mutationObserver.ts","../node_modules/@tanstack/query-core/src/queryCache.ts","../node_modules/@tanstack/query-core/src/queryClient.ts","../node_modules/@tanstack/react-query/src/QueryClientProvider.tsx","../node_modules/@tanstack/react-query/src/IsRestoringProvider.ts","../node_modules/@tanstack/react-query/src/QueryErrorResetBoundary.tsx","../node_modules/@tanstack/react-query/src/errorBoundaryUtils.ts","../node_modules/@tanstack/react-query/src/suspense.ts","../node_modules/@tanstack/react-query/src/useBaseQuery.ts","../node_modules/@tanstack/react-query/src/useQuery.ts","../node_modules/@tanstack/react-query/src/useMutation.ts","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../node_modules/tailwind-merge/src/lib/lru-cache.ts","../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../node_modules/tailwind-merge/src/lib/config-utils.ts","../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../node_modules/tailwind-merge/src/lib/tw-join.ts","../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/from-theme.ts","../node_modules/tailwind-merge/src/lib/validators.ts","../node_modules/tailwind-merge/src/lib/default-config.ts","../node_modules/tailwind-merge/src/lib/merge-configs.ts","../node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/utils/index.ts","../src/hooks/useAutoRefresh.ts","../src/hooks/useSelection.ts","../src/hooks/usePagination.ts","../node_modules/shared/src/utils.ts","../node_modules/lucide-react/src/defaultAttributes.ts","../node_modules/lucide-react/src/Icon.ts","../node_modules/lucide-react/src/createLucideIcon.ts","../node_modules/lucide-react/src/icons/activity.ts","../node_modules/lucide-react/src/icons/ban.ts","../node_modules/lucide-react/src/icons/check.ts","../node_modules/lucide-react/src/icons/chevron-down.ts","../node_modules/lucide-react/src/icons/chevron-right.ts","../node_modules/lucide-react/src/icons/circle-alert.ts","../node_modules/lucide-react/src/icons/circle-check.ts","../node_modules/lucide-react/src/icons/circle-x.ts","../node_modules/lucide-react/src/icons/clock.ts","../node_modules/lucide-react/src/icons/code.ts","../node_modules/lucide-react/src/icons/copy.ts","../node_modules/lucide-react/src/icons/download.ts","../node_modules/lucide-react/src/icons/ellipsis.ts","../node_modules/lucide-react/src/icons/eye.ts","../node_modules/lucide-react/src/icons/file-code.ts","../node_modules/lucide-react/src/icons/file-key.ts","../node_modules/lucide-react/src/icons/folder-open.ts","../node_modules/lucide-react/src/icons/inbox.ts","../node_modules/lucide-react/src/icons/info.ts","../node_modules/lucide-react/src/icons/key-round.ts","../node_modules/lucide-react/src/icons/link.ts","../node_modules/lucide-react/src/icons/pencil.ts","../node_modules/lucide-react/src/icons/plus.ts","../node_modules/lucide-react/src/icons/refresh-cw.ts","../node_modules/lucide-react/src/icons/scroll-text.ts","../node_modules/lucide-react/src/icons/search.ts","../node_modules/lucide-react/src/icons/settings.ts","../node_modules/lucide-react/src/icons/shield.ts","../node_modules/lucide-react/src/icons/square-check-big.ts","../node_modules/lucide-react/src/icons/trash-2.ts","../node_modules/lucide-react/src/icons/triangle-alert.ts","../node_modules/lucide-react/src/icons/undo-2.ts","../node_modules/lucide-react/src/icons/unlink.ts","../node_modules/lucide-react/src/icons/upload.ts","../node_modules/lucide-react/src/icons/user.ts","../node_modules/lucide-react/src/icons/users.ts","../node_modules/lucide-react/src/icons/variable.ts","../node_modules/lucide-react/src/icons/x.ts","../src/components/common/RefreshButton.tsx","../src/components/common/StatusBadge.tsx","../src/components/common/ActionButton.tsx","../src/components/common/EmptyState.tsx","../src/components/common/LoadingSkeleton.tsx","../src/components/data-table/DataTable.tsx","../src/components/data-table/PaginatedTable.tsx","../src/components/tabs/TabsView.tsx","../src/components/dialogs/DetailDialog.tsx","../src/components/dialogs/ConfirmDialog.tsx","../src/components/dialogs/CollapsibleSection.tsx","../src/components/pages/base/ApprovalsPageBase.tsx","../src/components/ui/index.tsx","../src/components/pages/base/LogsPageBase.tsx","../src/components/pages/base/TemplatesPageBase.tsx","../src/components/pages/base/UsersPageBase.tsx","../src/components/pages/base/RolesPageBase.tsx","../src/components/pages/connected/RolesPage.tsx","../src/tide/tidePolicy.ts","../src/components/pages/connected/UsersPage.tsx","../src/components/pages/connected/TemplatesPage.tsx","../src/components/pages/connected/LogsPage.tsx","../src/components/pages/connected/ApprovalsPage.tsx"],"sourcesContent":["// @tidecloak/ui-framework\n\n// Theme (colors, spacing, CSS variables)\nexport {\n colors,\n spacing,\n radius,\n fontSize,\n zIndex,\n duration,\n focusRing,\n shadow,\n themeCSS,\n injectThemeCSS,\n} from \"./theme\";\n\n// Re-export react-query so users don't need to install it separately\nexport {\n QueryClient,\n QueryClientProvider,\n useQuery,\n useMutation,\n useQueryClient,\n type QueryClientConfig,\n} from \"@tanstack/react-query\";\n\n// Types\nexport * from \"./types\";\n\n// Utils\nexport {\n cn,\n base64ToBytes,\n bytesToBase64,\n formatTimestamp,\n formatLogTimestamp,\n computeRowsForViewportHeight,\n delay,\n safeJsonParse,\n truncate,\n isDefined,\n generateId,\n} from \"./utils\";\n\n// Hooks\nexport {\n useAutoRefresh,\n useSelection,\n usePagination,\n type PageSizeMode,\n type UsePaginationOptions,\n} from \"./hooks\";\n\n// Common Components\nexport {\n RefreshButton,\n StatusBadge,\n STATUS_COLORS,\n STATUS_ICONS,\n getStatusConfig,\n ActionButton,\n ActionButtonGroup,\n ACTION_COLORS,\n ACTION_ICONS,\n EmptyState,\n EmptyStateNoData,\n EmptyStateNoResults,\n EmptyStateNoFiles,\n Skeleton,\n LoadingSkeleton,\n TableRowSkeleton,\n type RefreshButtonProps,\n type StatusBadgeProps,\n type ActionButtonProps,\n type ActionButtonGroupProps,\n type ActionType,\n type EmptyStateProps,\n type SkeletonProps,\n type LoadingSkeletonProps,\n} from \"./components/common\";\n\n// Data Table Components\nexport {\n DataTable,\n PaginatedTable,\n type DataTableProps,\n type PaginatedTableProps,\n} from \"./components/data-table\";\n\n// Tabs Components\nexport {\n TabsView,\n type TabsViewProps,\n} from \"./components/tabs\";\n\n// Dialog Components\nexport {\n DetailDialog,\n ConfirmDialog,\n CollapsibleSection,\n CodePreview,\n type DetailDialogProps,\n type ConfirmDialogProps,\n type CollapsibleSectionProps,\n} from \"./components/dialogs\";\n\n// Page Components - Base (headless)\nexport {\n // Approvals\n ApprovalsPageBase,\n type ApprovalsPageBaseProps,\n type ApprovalTabConfig,\n type BaseApprovalItem,\n type AccessApprovalItem,\n type RoleApprovalItem,\n type PolicyApprovalItem,\n type ApprovalDecision,\n createUserColumn,\n createRoleColumn,\n createTimestampColumn,\n createStatusColumn,\n createProgressColumn,\n // Logs\n LogsPageBase,\n type LogsPageBaseProps,\n type LogsTabConfig,\n type BaseLogItem,\n type AccessLogItem,\n type PolicyLogItem,\n createLogTimestampColumn,\n createActionColumn,\n createLogProgressColumn,\n // Templates\n TemplatesPageBase,\n type TemplatesPageBaseProps,\n type PolicyTemplateItem,\n type TemplateParameter,\n type TemplateFormData,\n // Users\n UsersPageBase,\n type UsersPageBaseProps,\n type UserItem,\n type UserRoleItem,\n type UserFormData,\n type CreateUserFormData,\n // Roles\n RolesPageBase,\n type RolesPageBaseProps,\n type RoleItem,\n type PolicyConfig,\n type RolePolicyTemplateItem,\n type RoleTemplateParameter,\n} from \"./components/pages\";\n\n// Page Components - Pre-made (uses @tidecloak/react)\nexport {\n RolesPage,\n UsersPage,\n TemplatesPage,\n LogsPage,\n ApprovalsPage,\n // Template API helpers\n createLocalStorageTemplateAPI,\n // Policy API helpers\n createLocalStoragePolicyAPI,\n // Policy Approvals API helpers\n createLocalStoragePolicyApprovalsAPI,\n // Access Metadata API helpers\n createLocalStorageAccessMetadataAPI,\n // Policy Logs API helpers\n createLocalStoragePolicyLogsAPI,\n type RolesPageProps,\n type UsersPageProps,\n type ChangeSetInfo,\n type TemplatesPageProps,\n type TemplateAPI,\n type PolicyAPI,\n type RolePolicy,\n type LogsPageProps,\n type PolicyLogsAPI,\n type PolicyLogData,\n type ApprovalsPageProps,\n type PolicyApprovalsAPI,\n type PolicyApprovalData,\n type AccessMetadataAPI,\n type AccessMetadataRecord,\n type TideApprovalContext,\n type TideApprovalResult,\n type EnclaveApprovalTabConfig,\n} from \"./components/pages/connected\";\n\n// Tide Policy Workflow Helpers\nexport {\n loadTideLibs,\n areTideLibsAvailable,\n computeContractId,\n createTidePolicyRequest,\n createTidePolicyHandler,\n rolePolicyToTideConfig,\n DEFAULT_MODEL_IDS,\n DEFAULT_ROLE_CONTRACT,\n type TidePolicyConfig,\n type TideContextMethods,\n} from \"./tide\";\n\n// Default UI Components (works out of the box with inline styles)\nexport {\n defaultComponents,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Input,\n Label,\n Textarea,\n Checkbox,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Skeleton as UIComponentSkeleton,\n Switch,\n ScrollArea,\n Alert,\n AlertDescription,\n CodeEditor,\n Table,\n TableHeader,\n TableBody,\n TableRow,\n TableHead,\n TableCell,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n AlertDialog,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogCancel,\n AlertDialogAction,\n Separator,\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"./components/ui\";\n","/**\n * Theme constants for consistent styling across components.\n * Use CSS variables for runtime theming, constants for TypeScript type safety.\n */\n\n// Color palette\nexport const colors = {\n // Backgrounds\n background: {\n primary: \"var(--tc-bg-primary, #ffffff)\",\n secondary: \"var(--tc-bg-secondary, #f9fafb)\",\n muted: \"var(--tc-bg-muted, #f3f4f6)\",\n overlay: \"var(--tc-bg-overlay, rgba(0, 0, 0, 0.5))\",\n },\n // Foregrounds (text)\n foreground: {\n primary: \"var(--tc-fg-primary, #111827)\",\n secondary: \"var(--tc-fg-secondary, #374151)\",\n muted: \"var(--tc-fg-muted, #6b7280)\",\n disabled: \"var(--tc-fg-disabled, #9ca3af)\",\n },\n // Borders\n border: {\n default: \"var(--tc-border, #e5e7eb)\",\n focus: \"var(--tc-border-focus, #3b82f6)\",\n error: \"var(--tc-border-error, #dc2626)\",\n },\n // Status colors\n status: {\n success: \"var(--tc-success, #16a34a)\",\n successBg: \"var(--tc-success-bg, #dcfce7)\",\n error: \"var(--tc-error, #dc2626)\",\n errorBg: \"var(--tc-error-bg, #fef2f2)\",\n warning: \"var(--tc-warning, #f59e0b)\",\n warningBg: \"var(--tc-warning-bg, #fef3c7)\",\n info: \"var(--tc-info, #3b82f6)\",\n infoBg: \"var(--tc-info-bg, #eff6ff)\",\n pending: \"var(--tc-pending, #6b7280)\",\n pendingBg: \"var(--tc-pending-bg, #f3f4f6)\",\n },\n // Action colors\n action: {\n primary: \"var(--tc-action-primary, #3b82f6)\",\n primaryHover: \"var(--tc-action-primary-hover, #2563eb)\",\n danger: \"var(--tc-action-danger, #dc2626)\",\n dangerHover: \"var(--tc-action-danger-hover, #b91c1c)\",\n },\n} as const;\n\n// Spacing scale\nexport const spacing = {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n} as const;\n\n// Border radius\nexport const radius = {\n sm: \"0.25rem\",\n md: \"0.375rem\",\n lg: \"0.5rem\",\n full: \"9999px\",\n} as const;\n\n// Font sizes\nexport const fontSize = {\n xs: \"0.75rem\",\n sm: \"0.875rem\",\n base: \"1rem\",\n lg: \"1.125rem\",\n xl: \"1.25rem\",\n \"2xl\": \"1.5rem\",\n} as const;\n\n// Z-index scale\nexport const zIndex = {\n dropdown: 50,\n sticky: 100,\n modal: 200,\n overlay: 300,\n toast: 400,\n} as const;\n\n// Animation durations\nexport const duration = {\n fast: \"150ms\",\n normal: \"200ms\",\n slow: \"300ms\",\n} as const;\n\n// Focus ring style (consistent across all interactive elements)\nexport const focusRing = {\n outline: `2px solid ${colors.border.focus}`,\n outlineOffset: \"2px\",\n} as const;\n\n// Shadow styles\nexport const shadow = {\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1)\",\n} as const;\n\n// CSS to inject for theming support\nexport const themeCSS = `\n :root {\n --tc-bg-primary: #ffffff;\n --tc-bg-secondary: #f9fafb;\n --tc-bg-muted: #f3f4f6;\n --tc-bg-overlay: rgba(0, 0, 0, 0.5);\n --tc-fg-primary: #111827;\n --tc-fg-secondary: #374151;\n --tc-fg-muted: #6b7280;\n --tc-fg-disabled: #9ca3af;\n --tc-border: #e5e7eb;\n --tc-border-focus: #3b82f6;\n --tc-border-error: #dc2626;\n --tc-success: #16a34a;\n --tc-success-bg: #dcfce7;\n --tc-error: #dc2626;\n --tc-error-bg: #fef2f2;\n --tc-warning: #f59e0b;\n --tc-warning-bg: #fef3c7;\n --tc-info: #3b82f6;\n --tc-info-bg: #eff6ff;\n --tc-pending: #6b7280;\n --tc-pending-bg: #f3f4f6;\n --tc-action-primary: #3b82f6;\n --tc-action-primary-hover: #2563eb;\n --tc-action-danger: #dc2626;\n --tc-action-danger-hover: #b91c1c;\n }\n\n @media (prefers-color-scheme: dark) {\n :root {\n --tc-bg-primary: #1f2937;\n --tc-bg-secondary: #111827;\n --tc-bg-muted: #374151;\n --tc-bg-overlay: rgba(0, 0, 0, 0.7);\n --tc-fg-primary: #f9fafb;\n --tc-fg-secondary: #e5e7eb;\n --tc-fg-muted: #9ca3af;\n --tc-fg-disabled: #6b7280;\n --tc-border: #374151;\n --tc-border-focus: #60a5fa;\n --tc-border-error: #f87171;\n --tc-success: #22c55e;\n --tc-success-bg: #14532d;\n --tc-error: #f87171;\n --tc-error-bg: #7f1d1d;\n --tc-warning: #fbbf24;\n --tc-warning-bg: #78350f;\n --tc-info: #60a5fa;\n --tc-info-bg: #1e3a8a;\n --tc-pending: #9ca3af;\n --tc-pending-bg: #374151;\n --tc-action-primary: #60a5fa;\n --tc-action-primary-hover: #3b82f6;\n --tc-action-danger: #f87171;\n --tc-action-danger-hover: #dc2626;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n }\n`;\n\n// Helper to inject theme CSS (call once at app init)\nexport function injectThemeCSS(): void {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"tidecloak-theme\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"tidecloak-theme\";\n style.textContent = themeCSS;\n document.head.appendChild(style);\n}\n","export class Subscribable<TListener extends Function> {\n protected listeners = new Set<TListener>()\n\n constructor() {\n this.subscribe = this.subscribe.bind(this)\n }\n\n subscribe(listener: TListener): () => void {\n this.listeners.add(listener)\n\n this.onSubscribe()\n\n return () => {\n this.listeners.delete(listener)\n this.onUnsubscribe()\n }\n }\n\n hasListeners(): boolean {\n return this.listeners.size > 0\n }\n\n protected onSubscribe(): void {\n // Do nothing\n }\n\n protected onUnsubscribe(): void {\n // Do nothing\n }\n}\n","/**\n * {@link TimeoutManager} does not support passing arguments to the callback.\n *\n * `(_: void)` is the argument type inferred by TypeScript's default typings for\n * `setTimeout(cb, number)`.\n * If we don't accept a single void argument, then\n * `new Promise(resolve => timeoutManager.setTimeout(resolve, N))` is a type error.\n */\nexport type TimeoutCallback = (_: void) => void\n\n/**\n * Wrapping `setTimeout` is awkward from a typing perspective because platform\n * typings may extend the return type of `setTimeout`. For example, NodeJS\n * typings add `NodeJS.Timeout`; but a non-default `timeoutManager` may not be\n * able to return such a type.\n */\nexport type ManagedTimerId = number | { [Symbol.toPrimitive]: () => number }\n\n/**\n * Backend for timer functions.\n */\nexport type TimeoutProvider<TTimerId extends ManagedTimerId = ManagedTimerId> =\n {\n readonly setTimeout: (callback: TimeoutCallback, delay: number) => TTimerId\n readonly clearTimeout: (timeoutId: TTimerId | undefined) => void\n\n readonly setInterval: (callback: TimeoutCallback, delay: number) => TTimerId\n readonly clearInterval: (intervalId: TTimerId | undefined) => void\n }\n\nexport const defaultTimeoutProvider: TimeoutProvider<\n ReturnType<typeof setTimeout>\n> = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId),\n}\n\n/**\n * Allows customization of how timeouts are created.\n *\n * @tanstack/query-core makes liberal use of timeouts to implement `staleTime`\n * and `gcTime`. The default TimeoutManager provider uses the platform's global\n * `setTimeout` implementation, which is known to have scalability issues with\n * thousands of timeouts on the event loop.\n *\n * If you hit this limitation, consider providing a custom TimeoutProvider that\n * coalesces timeouts.\n */\nexport class TimeoutManager implements Omit<TimeoutProvider, 'name'> {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider: TimeoutProvider<any> = defaultTimeoutProvider\n #providerCalled = false\n\n setTimeoutProvider<TTimerId extends ManagedTimerId>(\n provider: TimeoutProvider<TTimerId>,\n ): void {\n if (process.env.NODE_ENV !== 'production') {\n if (this.#providerCalled && provider !== this.#provider) {\n // After changing providers, `clearTimeout` will not work as expected for\n // timeouts from the previous provider.\n //\n // Since they may allocate the same timeout ID, clearTimeout may cancel an\n // arbitrary different timeout, or unexpected no-op.\n //\n // We could protect against this by mixing the timeout ID bits\n // deterministically with some per-provider bits.\n //\n // We could internally queue `setTimeout` calls to `TimeoutManager` until\n // some API call to set the initial provider.\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider },\n )\n }\n }\n\n this.#provider = provider\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = false\n }\n }\n\n setTimeout(callback: TimeoutCallback, delay: number): ManagedTimerId {\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = true\n }\n return this.#provider.setTimeout(callback, delay)\n }\n\n clearTimeout(timeoutId: ManagedTimerId | undefined): void {\n this.#provider.clearTimeout(timeoutId)\n }\n\n setInterval(callback: TimeoutCallback, delay: number): ManagedTimerId {\n if (process.env.NODE_ENV !== 'production') {\n this.#providerCalled = true\n }\n return this.#provider.setInterval(callback, delay)\n }\n\n clearInterval(intervalId: ManagedTimerId | undefined): void {\n this.#provider.clearInterval(intervalId)\n }\n}\n\nexport const timeoutManager = new TimeoutManager()\n\n/**\n * In many cases code wants to delay to the next event loop tick; this is not\n * mediated by {@link timeoutManager}.\n *\n * This function is provided to make auditing the `tanstack/query-core` for\n * incorrect use of system `setTimeout` easier.\n */\nexport function systemSetTimeoutZero(callback: TimeoutCallback): void {\n setTimeout(callback, 0)\n}\n","import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n Enabled,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryFunction,\n QueryKey,\n QueryOptions,\n StaleTime,\n StaleTimeFunction,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveStaleTime<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n staleTime:\n | undefined\n | StaleTimeFunction<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): StaleTime | undefined {\n return typeof staleTime === 'function' ? staleTime(query) : staleTime\n}\n\nexport function resolveEnabled<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n enabled: undefined | Enabled<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): boolean | undefined {\n return typeof enabled === 'function' ? enabled(query) : enabled\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]))\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T): T\nexport function replaceEqualDeep(a: any, b: any): any {\n if (a === b) {\n return a\n }\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n","import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype Listener = (focused: boolean) => void\n\ntype SetupFn = (\n setFocused: (focused?: boolean) => void,\n) => (() => void) | undefined\n\nexport class FocusManager extends Subscribable<Listener> {\n #focused?: boolean\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onFocus) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!isServer && window.addEventListener) {\n const listener = () => onFocus()\n // Listen to visibilitychange\n window.addEventListener('visibilitychange', listener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('visibilitychange', listener)\n }\n }\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup((focused) => {\n if (typeof focused === 'boolean') {\n this.setFocused(focused)\n } else {\n this.onFocus()\n }\n })\n }\n\n setFocused(focused?: boolean): void {\n const changed = this.#focused !== focused\n if (changed) {\n this.#focused = focused\n this.onFocus()\n }\n }\n\n onFocus(): void {\n const isFocused = this.isFocused()\n this.listeners.forEach((listener) => {\n listener(isFocused)\n })\n }\n\n isFocused(): boolean {\n if (typeof this.#focused === 'boolean') {\n return this.#focused\n }\n\n // document global can be unavailable in react native\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return globalThis.document?.visibilityState !== 'hidden'\n }\n}\n\nexport const focusManager = new FocusManager()\n","/**\n * Thenable types which matches React's types for promises\n *\n * React seemingly uses `.status`, `.value` and `.reason` properties on a promises to optimistically unwrap data from promises\n *\n * @see https://github.com/facebook/react/blob/main/packages/shared/ReactTypes.js#L112-L138\n * @see https://github.com/facebook/react/blob/4f604941569d2e8947ce1460a0b2997e835f37b9/packages/react-debug-tools/src/ReactDebugHooks.js#L224-L227\n */\n\nimport { noop } from './utils'\n\ninterface Fulfilled<T> {\n status: 'fulfilled'\n value: T\n}\ninterface Rejected {\n status: 'rejected'\n reason: unknown\n}\ninterface Pending<T> {\n status: 'pending'\n\n /**\n * Resolve the promise with a value.\n * Will remove the `resolve` and `reject` properties from the promise.\n */\n resolve: (value: T) => void\n /**\n * Reject the promise with a reason.\n * Will remove the `resolve` and `reject` properties from the promise.\n */\n reject: (reason: unknown) => void\n}\n\nexport type FulfilledThenable<T> = Promise<T> & Fulfilled<T>\nexport type RejectedThenable<T> = Promise<T> & Rejected\nexport type PendingThenable<T> = Promise<T> & Pending<T>\n\nexport type Thenable<T> =\n | FulfilledThenable<T>\n | RejectedThenable<T>\n | PendingThenable<T>\n\nexport function pendingThenable<T>(): PendingThenable<T> {\n let resolve: Pending<T>['resolve']\n let reject: Pending<T>['reject']\n // this could use `Promise.withResolvers()` in the future\n const thenable = new Promise((_resolve, _reject) => {\n resolve = _resolve\n reject = _reject\n }) as PendingThenable<T>\n\n thenable.status = 'pending'\n thenable.catch(() => {\n // prevent unhandled rejection errors\n })\n\n function finalize(data: Fulfilled<T> | Rejected) {\n Object.assign(thenable, data)\n\n // clear pending props props to avoid calling them twice\n delete (thenable as Partial<PendingThenable<T>>).resolve\n delete (thenable as Partial<PendingThenable<T>>).reject\n }\n\n thenable.resolve = (value) => {\n finalize({\n status: 'fulfilled',\n value,\n })\n\n resolve(value)\n }\n thenable.reject = (reason) => {\n finalize({\n status: 'rejected',\n reason,\n })\n\n reject(reason)\n }\n\n return thenable\n}\n\n/**\n * This function takes a Promise-like input and detects whether the data\n * is synchronously available or not.\n *\n * It does not inspect .status, .value or .reason properties of the promise,\n * as those are not always available, and the .status of React's promises\n * should not be considered part of the public API.\n */\nexport function tryResolveSync(promise: Promise<unknown> | Thenable<unknown>) {\n let data: unknown\n\n promise\n .then((result) => {\n data = result\n return result\n }, noop)\n // .catch can be unavailable on certain kinds of thenable's\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ?.catch(noop)\n\n if (data !== undefined) {\n return { data }\n }\n\n return undefined\n}\n","// TYPES\n\nimport { systemSetTimeoutZero } from './timeoutManager'\n\ntype NotifyCallback = () => void\n\ntype NotifyFunction = (callback: () => void) => void\n\ntype BatchNotifyFunction = (callback: () => void) => void\n\ntype BatchCallsCallback<T extends Array<unknown>> = (...args: T) => void\n\ntype ScheduleFunction = (callback: () => void) => void\n\nexport const defaultScheduler: ScheduleFunction = systemSetTimeoutZero\n\nexport function createNotifyManager() {\n let queue: Array<NotifyCallback> = []\n let transactions = 0\n let notifyFn: NotifyFunction = (callback) => {\n callback()\n }\n let batchNotifyFn: BatchNotifyFunction = (callback: () => void) => {\n callback()\n }\n let scheduleFn = defaultScheduler\n\n const schedule = (callback: NotifyCallback): void => {\n if (transactions) {\n queue.push(callback)\n } else {\n scheduleFn(() => {\n notifyFn(callback)\n })\n }\n }\n const flush = (): void => {\n const originalQueue = queue\n queue = []\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback)\n })\n })\n })\n }\n }\n\n return {\n batch: <T>(callback: () => T): T => {\n let result\n transactions++\n try {\n result = callback()\n } finally {\n transactions--\n if (!transactions) {\n flush()\n }\n }\n return result\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: <T extends Array<unknown>>(\n callback: BatchCallsCallback<T>,\n ): BatchCallsCallback<T> => {\n return (...args) => {\n schedule(() => {\n callback(...args)\n })\n }\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn: NotifyFunction) => {\n notifyFn = fn\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn: BatchNotifyFunction) => {\n batchNotifyFn = fn\n },\n setScheduler: (fn: ScheduleFunction) => {\n scheduleFn = fn\n },\n } as const\n}\n\n// SINGLETON\nexport const notifyManager = createNotifyManager()\n","import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!isServer && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n isOnline(): boolean {\n return this.#online\n }\n}\n\nexport const onlineManager = new OnlineManager()\n","import { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { pendingThenable } from './thenable'\nimport { isServer, sleep } from './utils'\nimport type { Thenable } from './thenable'\nimport type { CancelOptions, DefaultError, NetworkMode } from './types'\n\n// TYPES\n\ninterface RetryerConfig<TData = unknown, TError = DefaultError> {\n fn: () => TData | Promise<TData>\n initialPromise?: Promise<TData>\n onCancel?: (error: TError) => void\n onFail?: (failureCount: number, error: TError) => void\n onPause?: () => void\n onContinue?: () => void\n retry?: RetryValue<TError>\n retryDelay?: RetryDelayValue<TError>\n networkMode: NetworkMode | undefined\n canRun: () => boolean\n}\n\nexport interface Retryer<TData = unknown> {\n promise: Promise<TData>\n cancel: (cancelOptions?: CancelOptions) => void\n continue: () => Promise<unknown>\n cancelRetry: () => void\n continueRetry: () => void\n canStart: () => boolean\n start: () => Promise<TData>\n status: () => 'pending' | 'resolved' | 'rejected'\n}\n\nexport type RetryValue<TError> = boolean | number | ShouldRetryFunction<TError>\n\ntype ShouldRetryFunction<TError = DefaultError> = (\n failureCount: number,\n error: TError,\n) => boolean\n\nexport type RetryDelayValue<TError> = number | RetryDelayFunction<TError>\n\ntype RetryDelayFunction<TError = DefaultError> = (\n failureCount: number,\n error: TError,\n) => number\n\nfunction defaultRetryDelay(failureCount: number) {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\nexport function canFetch(networkMode: NetworkMode | undefined): boolean {\n return (networkMode ?? 'online') === 'online'\n ? onlineManager.isOnline()\n : true\n}\n\nexport class CancelledError extends Error {\n revert?: boolean\n silent?: boolean\n constructor(options?: CancelOptions) {\n super('CancelledError')\n this.revert = options?.revert\n this.silent = options?.silent\n }\n}\n\n/**\n * @deprecated Use instanceof `CancelledError` instead.\n */\nexport function isCancelledError(value: any): value is CancelledError {\n return value instanceof CancelledError\n}\n\nexport function createRetryer<TData = unknown, TError = DefaultError>(\n config: RetryerConfig<TData, TError>,\n): Retryer<TData> {\n let isRetryCancelled = false\n let failureCount = 0\n let continueFn: ((value?: unknown) => void) | undefined\n\n const thenable = pendingThenable<TData>()\n\n const isResolved = () =>\n (thenable.status as Thenable<TData>['status']) !== 'pending'\n\n const cancel = (cancelOptions?: CancelOptions): void => {\n if (!isResolved()) {\n const error = new CancelledError(cancelOptions) as TError\n reject(error)\n\n config.onCancel?.(error)\n }\n }\n const cancelRetry = () => {\n isRetryCancelled = true\n }\n\n const continueRetry = () => {\n isRetryCancelled = false\n }\n\n const canContinue = () =>\n focusManager.isFocused() &&\n (config.networkMode === 'always' || onlineManager.isOnline()) &&\n config.canRun()\n\n const canStart = () => canFetch(config.networkMode) && config.canRun()\n\n const resolve = (value: any) => {\n if (!isResolved()) {\n continueFn?.()\n thenable.resolve(value)\n }\n }\n\n const reject = (value: any) => {\n if (!isResolved()) {\n continueFn?.()\n thenable.reject(value)\n }\n }\n\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved() || canContinue()) {\n continueResolve(value)\n }\n }\n config.onPause?.()\n }).then(() => {\n continueFn = undefined\n if (!isResolved()) {\n config.onContinue?.()\n }\n })\n }\n\n // Create loop function\n const run = () => {\n // Do nothing if already resolved\n if (isResolved()) {\n return\n }\n\n let promiseOrValue: any\n\n // we can re-use config.initialPromise on the first call of run()\n const initialPromise =\n failureCount === 0 ? config.initialPromise : undefined\n\n // Execute query\n try {\n promiseOrValue = initialPromise ?? config.fn()\n } catch (error) {\n promiseOrValue = Promise.reject(error)\n }\n\n Promise.resolve(promiseOrValue)\n .then(resolve)\n .catch((error) => {\n // Stop if the fetch is already resolved\n if (isResolved()) {\n return\n }\n\n // Do we need to retry the request?\n const retry = config.retry ?? (isServer ? 0 : 3)\n const retryDelay = config.retryDelay ?? defaultRetryDelay\n const delay =\n typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n const shouldRetry =\n retry === true ||\n (typeof retry === 'number' && failureCount < retry) ||\n (typeof retry === 'function' && retry(failureCount, error))\n\n if (isRetryCancelled || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error)\n return\n }\n\n failureCount++\n\n // Notify on fail\n config.onFail?.(failureCount, error)\n\n // Delay\n sleep(delay)\n // Pause if the document is not visible or when the device is offline\n .then(() => {\n return canContinue() ? undefined : pause()\n })\n .then(() => {\n if (isRetryCancelled) {\n reject(error)\n } else {\n run()\n }\n })\n })\n }\n\n return {\n promise: thenable,\n status: () => thenable.status,\n cancel,\n continue: () => {\n continueFn?.()\n return thenable\n },\n cancelRetry,\n continueRetry,\n canStart,\n start: () => {\n // Start loop\n if (canStart()) {\n run()\n } else {\n pause().then(run)\n }\n return thenable\n },\n }\n}\n","import { timeoutManager } from './timeoutManager'\nimport { isServer, isValidTimeout } from './utils'\nimport type { ManagedTimerId } from './timeoutManager'\n\nexport abstract class Removable {\n gcTime!: number\n #gcTimeout?: ManagedTimerId\n\n destroy(): void {\n this.clearGcTimeout()\n }\n\n protected scheduleGc(): void {\n this.clearGcTimeout()\n\n if (isValidTimeout(this.gcTime)) {\n this.#gcTimeout = timeoutManager.setTimeout(() => {\n this.optionalRemove()\n }, this.gcTime)\n }\n }\n\n protected updateGcTime(newGcTime: number | undefined): void {\n // Default to 5 minutes (Infinity for server-side) if no gcTime is set\n this.gcTime = Math.max(\n this.gcTime || 0,\n newGcTime ?? (isServer ? Infinity : 5 * 60 * 1000),\n )\n }\n\n protected clearGcTimeout() {\n if (this.#gcTimeout) {\n timeoutManager.clearTimeout(this.#gcTimeout)\n this.#gcTimeout = undefined\n }\n }\n\n protected abstract optionalRemove(): void\n}\n","import {\n ensureQueryFn,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n skipToken,\n timeUntilStale,\n} from './utils'\nimport { notifyManager } from './notifyManager'\nimport { CancelledError, canFetch, createRetryer } from './retryer'\nimport { Removable } from './removable'\nimport type { QueryCache } from './queryCache'\nimport type { QueryClient } from './queryClient'\nimport type {\n CancelOptions,\n DefaultError,\n FetchStatus,\n InitialDataFunction,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n QueryMeta,\n QueryOptions,\n QueryStatus,\n SetDataOptions,\n StaleTime,\n} from './types'\nimport type { QueryObserver } from './queryObserver'\nimport type { Retryer } from './retryer'\n\n// TYPES\n\ninterface QueryConfig<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n client: QueryClient\n queryKey: TQueryKey\n queryHash: string\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state?: QueryState<TData, TError>\n}\n\nexport interface QueryState<TData = unknown, TError = DefaultError> {\n data: TData | undefined\n dataUpdateCount: number\n dataUpdatedAt: number\n error: TError | null\n errorUpdateCount: number\n errorUpdatedAt: number\n fetchFailureCount: number\n fetchFailureReason: TError | null\n fetchMeta: FetchMeta | null\n isInvalidated: boolean\n status: QueryStatus\n fetchStatus: FetchStatus\n}\n\nexport interface FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n fetchFn: () => unknown | Promise<unknown>\n fetchOptions?: FetchOptions\n signal: AbortSignal\n options: QueryOptions<TQueryFnData, TError, TData, any>\n client: QueryClient\n queryKey: TQueryKey\n state: QueryState<TData, TError>\n}\n\nexport interface QueryBehavior<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n onFetch: (\n context: FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n query: Query,\n ) => void\n}\n\nexport type FetchDirection = 'forward' | 'backward'\n\nexport interface FetchMeta {\n fetchMore?: { direction: FetchDirection }\n}\n\nexport interface FetchOptions<TData = unknown> {\n cancelRefetch?: boolean\n meta?: FetchMeta\n initialPromise?: Promise<TData>\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError\n}\n\ninterface FetchAction {\n type: 'fetch'\n meta?: FetchMeta\n}\n\ninterface SuccessAction<TData> {\n data: TData | undefined\n type: 'success'\n dataUpdatedAt?: number\n manual?: boolean\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface InvalidateAction {\n type: 'invalidate'\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\ninterface SetStateAction<TData, TError> {\n type: 'setState'\n state: Partial<QueryState<TData, TError>>\n setStateOptions?: SetStateOptions\n}\n\nexport type Action<TData, TError> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | FetchAction\n | InvalidateAction\n | PauseAction\n | SetStateAction<TData, TError>\n | SuccessAction<TData>\n\nexport interface SetStateOptions {\n meta?: any\n}\n\n// CLASS\n\nexport class Query<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Removable {\n queryKey: TQueryKey\n queryHash: string\n options!: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state: QueryState<TData, TError>\n\n #initialState: QueryState<TData, TError>\n #revertState?: QueryState<TData, TError>\n #cache: QueryCache\n #client: QueryClient\n #retryer?: Retryer<TData>\n observers: Array<QueryObserver<any, any, any, any, any>>\n #defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n #abortSignalConsumed: boolean\n\n constructor(config: QueryConfig<TQueryFnData, TError, TData, TQueryKey>) {\n super()\n\n this.#abortSignalConsumed = false\n this.#defaultOptions = config.defaultOptions\n this.setOptions(config.options)\n this.observers = []\n this.#client = config.client\n this.#cache = this.#client.getQueryCache()\n this.queryKey = config.queryKey\n this.queryHash = config.queryHash\n this.#initialState = getDefaultState(this.options)\n this.state = config.state ?? this.#initialState\n this.scheduleGc()\n }\n get meta(): QueryMeta | undefined {\n return this.options.meta\n }\n\n get promise(): Promise<TData> | undefined {\n return this.#retryer?.promise\n }\n\n setOptions(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): void {\n this.options = { ...this.#defaultOptions, ...options }\n\n this.updateGcTime(this.options.gcTime)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state && this.state.data === undefined) {\n const defaultState = getDefaultState(this.options)\n if (defaultState.data !== undefined) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt),\n )\n this.#initialState = defaultState\n }\n }\n }\n\n protected optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === 'idle') {\n this.#cache.remove(this)\n }\n }\n\n setData(\n newData: TData,\n options?: SetDataOptions & { manual: boolean },\n ): TData {\n const data = replaceData(this.state.data, newData, this.options)\n\n // Set data and mark it as cached\n this.#dispatch({\n data,\n type: 'success',\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual,\n })\n\n return data\n }\n\n setState(\n state: Partial<QueryState<TData, TError>>,\n setStateOptions?: SetStateOptions,\n ): void {\n this.#dispatch({ type: 'setState', state, setStateOptions })\n }\n\n cancel(options?: CancelOptions): Promise<void> {\n const promise = this.#retryer?.promise\n this.#retryer?.cancel(options)\n return promise ? promise.then(noop).catch(noop) : Promise.resolve()\n }\n\n destroy(): void {\n super.destroy()\n\n this.cancel({ silent: true })\n }\n\n reset(): void {\n this.destroy()\n this.setState(this.#initialState)\n }\n\n isActive(): boolean {\n return this.observers.some(\n (observer) => resolveEnabled(observer.options.enabled, this) !== false,\n )\n }\n\n isDisabled(): boolean {\n if (this.getObserversCount() > 0) {\n return !this.isActive()\n }\n // if a query has no observers, it should still be considered disabled if it never attempted a fetch\n return (\n this.options.queryFn === skipToken ||\n this.state.dataUpdateCount + this.state.errorUpdateCount === 0\n )\n }\n\n isStatic(): boolean {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) =>\n resolveStaleTime(observer.options.staleTime, this) === 'static',\n )\n }\n\n return false\n }\n\n isStale(): boolean {\n // check observers first, their `isStale` has the source of truth\n // calculated with `isStaleByTime` and it takes `enabled` into account\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale,\n )\n }\n\n return this.state.data === undefined || this.state.isInvalidated\n }\n\n isStaleByTime(staleTime: StaleTime = 0): boolean {\n // no data is always stale\n if (this.state.data === undefined) {\n return true\n }\n // static is never stale\n if (staleTime === 'static') {\n return false\n }\n // if the query is invalidated, it is stale\n if (this.state.isInvalidated) {\n return true\n }\n\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime)\n }\n\n onFocus(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n onOnline(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n addObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer)\n\n // Stop the query from being garbage collected\n this.clearGcTimeout()\n\n this.#cache.notify({ type: 'observerAdded', query: this, observer })\n }\n }\n\n removeObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (this.observers.includes(observer)) {\n this.observers = this.observers.filter((x) => x !== observer)\n\n if (!this.observers.length) {\n // If the transport layer does not support cancellation\n // we'll let the query continue so the result can be cached\n if (this.#retryer) {\n if (this.#abortSignalConsumed) {\n this.#retryer.cancel({ revert: true })\n } else {\n this.#retryer.cancelRetry()\n }\n }\n\n this.scheduleGc()\n }\n\n this.#cache.notify({ type: 'observerRemoved', query: this, observer })\n }\n }\n\n getObserversCount(): number {\n return this.observers.length\n }\n\n invalidate(): void {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: 'invalidate' })\n }\n }\n\n async fetch(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n fetchOptions?: FetchOptions<TQueryFnData>,\n ): Promise<TData> {\n if (\n this.state.fetchStatus !== 'idle' &&\n // If the promise in the retyer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== 'rejected'\n ) {\n if (this.state.data !== undefined && fetchOptions?.cancelRefetch) {\n // Silently cancel current fetch if the user wants to cancel refetch\n this.cancel({ silent: true })\n } else if (this.#retryer) {\n // make sure that retries that were potentially cancelled due to unmounts can continue\n this.#retryer.continueRetry()\n // Return current promise if we are already fetching\n return this.#retryer.promise\n }\n }\n\n // Update config if passed, otherwise the config from the last execution is used\n if (options) {\n this.setOptions(options)\n }\n\n // Use the options from the first observer with a query function if no function is found.\n // This can happen when the query is hydrated or created with setQueryData.\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn)\n if (observer) {\n this.setOptions(observer.options)\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`,\n )\n }\n }\n\n const abortController = new AbortController()\n\n // Adds an enumerable signal property to the object that\n // which sets abortSignalConsumed to true when the signal\n // is read.\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true\n return abortController.signal\n },\n })\n }\n\n // Create fetch function\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions)\n\n // Create query function context\n const createQueryFnContext = (): QueryFunctionContext<TQueryKey> => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<TQueryKey>,\n 'signal'\n > = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<TQueryKey>\n }\n\n const queryFnContext = createQueryFnContext()\n\n this.#abortSignalConsumed = false\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this as unknown as Query,\n )\n }\n\n return queryFn(queryFnContext)\n }\n\n // Trigger behavior hook\n const createFetchContext = (): FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n > => {\n const context: OmitKeyof<\n FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n 'signal'\n > = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn,\n }\n\n addSignalProperty(context)\n return context as FetchContext<TQueryFnData, TError, TData, TQueryKey>\n }\n\n const context = createFetchContext()\n\n this.options.behavior?.onFetch(context, this as unknown as Query)\n\n // Store state in case the current fetch needs to be reverted\n this.#revertState = this.state\n\n // Set to fetching state if not already in it\n if (\n this.state.fetchStatus === 'idle' ||\n this.state.fetchMeta !== context.fetchOptions?.meta\n ) {\n this.#dispatch({ type: 'fetch', meta: context.fetchOptions?.meta })\n }\n\n // Try to fetch the data\n this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise as\n | Promise<TData>\n | undefined,\n fn: context.fetchFn as () => Promise<TData>,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: 'idle' as const,\n })\n }\n abortController.abort()\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue: () => {\n this.#dispatch({ type: 'continue' })\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true,\n })\n\n try {\n const data = await this.#retryer.start()\n // this is more of a runtime guard\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data === undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`,\n )\n }\n throw new Error(`${this.queryHash} data is undefined`)\n }\n\n this.setData(data)\n\n // Notify cache callback\n this.#cache.config.onSuccess?.(data, this as Query<any, any, any, any>)\n this.#cache.config.onSettled?.(\n data,\n this.state.error as any,\n this as Query<any, any, any, any>,\n )\n return data\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n // silent cancellation implies a new fetch is going to be started,\n // so we piggyback onto that promise\n return this.#retryer.promise\n } else if (error.revert) {\n // transform error into reverted state data\n // if the initial fetch was cancelled, we have no data, so we have\n // to get reject with a CancelledError\n if (this.state.data === undefined) {\n throw error\n }\n return this.state.data\n }\n }\n this.#dispatch({\n type: 'error',\n error: error as TError,\n })\n\n // Notify cache callback\n this.#cache.config.onError?.(\n error as any,\n this as Query<any, any, any, any>,\n )\n this.#cache.config.onSettled?.(\n this.state.data,\n error as any,\n this as Query<any, any, any, any>,\n )\n\n throw error // rethrow the error for further handling\n } finally {\n // Schedule query gc after fetching\n this.scheduleGc()\n }\n }\n\n #dispatch(action: Action<TData, TError>): void {\n const reducer = (\n state: QueryState<TData, TError>,\n ): QueryState<TData, TError> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n fetchStatus: 'paused',\n }\n case 'continue':\n return {\n ...state,\n fetchStatus: 'fetching',\n }\n case 'fetch':\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null,\n }\n case 'success':\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...(!action.manual && {\n fetchStatus: 'idle' as const,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n }),\n }\n // If fetching ends successfully, we don't need revertState as a fallback anymore.\n // For manual updates, capture the state to revert to it in case of a cancellation.\n this.#revertState = action.manual ? newState : undefined\n\n return newState\n case 'error':\n const error = action.error\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: 'idle',\n status: 'error',\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true,\n }\n case 'invalidate':\n return {\n ...state,\n isInvalidated: true,\n }\n case 'setState':\n return {\n ...state,\n ...action.state,\n }\n }\n }\n\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n this.observers.forEach((observer) => {\n observer.onQueryUpdate()\n })\n\n this.#cache.notify({ query: this, type: 'updated', action })\n })\n }\n}\n\nexport function fetchState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n data: TData | undefined,\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? 'fetching' : 'paused',\n ...(data === undefined &&\n ({\n error: null,\n status: 'pending',\n } as const)),\n } as const\n}\n\nfunction successState<TData>(data: TData | undefined, dataUpdatedAt?: number) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: 'success' as const,\n }\n}\n\nfunction getDefaultState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryState<TData, TError> {\n const data =\n typeof options.initialData === 'function'\n ? (options.initialData as InitialDataFunction<TData>)()\n : options.initialData\n\n const hasData = data !== undefined\n\n const initialDataUpdatedAt = hasData\n ? typeof options.initialDataUpdatedAt === 'function'\n ? (options.initialDataUpdatedAt as () => number | undefined)()\n : options.initialDataUpdatedAt\n : 0\n\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? (initialDataUpdatedAt ?? Date.now()) : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? 'success' : 'pending',\n fetchStatus: 'idle',\n }\n}\n","import { focusManager } from './focusManager'\nimport { notifyManager } from './notifyManager'\nimport { fetchState } from './query'\nimport { Subscribable } from './subscribable'\nimport { pendingThenable } from './thenable'\nimport {\n isServer,\n isValidTimeout,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale,\n} from './utils'\nimport { timeoutManager } from './timeoutManager'\nimport type { ManagedTimerId } from './timeoutManager'\nimport type { FetchOptions, Query, QueryState } from './query'\nimport type { QueryClient } from './queryClient'\nimport type { PendingThenable, Thenable } from './thenable'\nimport type {\n DefaultError,\n DefaultedQueryObserverOptions,\n PlaceholderDataFunction,\n QueryKey,\n QueryObserverBaseResult,\n QueryObserverOptions,\n QueryObserverResult,\n QueryOptions,\n RefetchOptions,\n} from './types'\n\ntype QueryObserverListener<TData, TError> = (\n result: QueryObserverResult<TData, TError>,\n) => void\n\ninterface ObserverFetchOptions extends FetchOptions {\n throwOnError?: boolean\n}\n\nexport class QueryObserver<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Subscribable<QueryObserverListener<TData, TError>> {\n #client: QueryClient\n #currentQuery: Query<TQueryFnData, TError, TQueryData, TQueryKey> = undefined!\n #currentQueryInitialState: QueryState<TQueryData, TError> = undefined!\n #currentResult: QueryObserverResult<TData, TError> = undefined!\n #currentResultState?: QueryState<TQueryData, TError>\n #currentResultOptions?: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n #currentThenable: Thenable<TData>\n #selectError: TError | null\n #selectFn?: (data: TQueryData) => TData\n #selectResult?: TData\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData?: Query<TQueryFnData, TError, TQueryData, TQueryKey>\n #staleTimeoutId?: ManagedTimerId\n #refetchIntervalId?: ManagedTimerId\n #currentRefetchInterval?: number | false\n #trackedProps = new Set<keyof QueryObserverResult>()\n\n constructor(\n client: QueryClient,\n public options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ) {\n super()\n\n this.#client = client\n this.#selectError = null\n this.#currentThenable = pendingThenable()\n\n this.bindMethods()\n this.setOptions(options)\n }\n\n protected bindMethods(): void {\n this.refetch = this.refetch.bind(this)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this)\n\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch()\n } else {\n this.updateResult()\n }\n\n this.#updateTimers()\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.hasListeners()) {\n this.destroy()\n }\n }\n\n shouldFetchOnReconnect(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect,\n )\n }\n\n shouldFetchOnWindowFocus(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus,\n )\n }\n\n destroy(): void {\n this.listeners = new Set()\n this.#clearStaleTimeout()\n this.#clearRefetchInterval()\n this.#currentQuery.removeObserver(this)\n }\n\n setOptions(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): void {\n const prevOptions = this.options\n const prevQuery = this.#currentQuery\n\n this.options = this.#client.defaultQueryOptions(options)\n\n if (\n this.options.enabled !== undefined &&\n typeof this.options.enabled !== 'boolean' &&\n typeof this.options.enabled !== 'function' &&\n typeof resolveEnabled(this.options.enabled, this.#currentQuery) !==\n 'boolean'\n ) {\n throw new Error(\n 'Expected enabled to be a boolean or a callback that returns a boolean',\n )\n }\n\n this.#updateQuery()\n this.#currentQuery.setOptions(this.options)\n\n if (\n prevOptions._defaulted &&\n !shallowEqualObjects(this.options, prevOptions)\n ) {\n this.#client.getQueryCache().notify({\n type: 'observerOptionsUpdated',\n query: this.#currentQuery,\n observer: this,\n })\n }\n\n const mounted = this.hasListeners()\n\n // Fetch if there are subscribers\n if (\n mounted &&\n shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions,\n )\n ) {\n this.#executeFetch()\n }\n\n // Update result\n this.updateResult()\n\n // Update stale interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveEnabled(this.options.enabled, this.#currentQuery) !==\n resolveEnabled(prevOptions.enabled, this.#currentQuery) ||\n resolveStaleTime(this.options.staleTime, this.#currentQuery) !==\n resolveStaleTime(prevOptions.staleTime, this.#currentQuery))\n ) {\n this.#updateStaleTimeout()\n }\n\n const nextRefetchInterval = this.#computeRefetchInterval()\n\n // Update refetch interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveEnabled(this.options.enabled, this.#currentQuery) !==\n resolveEnabled(prevOptions.enabled, this.#currentQuery) ||\n nextRefetchInterval !== this.#currentRefetchInterval)\n ) {\n this.#updateRefetchInterval(nextRefetchInterval)\n }\n }\n\n getOptimisticResult(\n options: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const query = this.#client.getQueryCache().build(this.#client, options)\n\n const result = this.createResult(query, options)\n\n if (shouldAssignObserverCurrentProperties(this, result)) {\n // this assigns the optimistic result to the current Observer\n // because if the query function changes, useQuery will be performing\n // an effect where it would fetch again.\n // When the fetch finishes, we perform a deep data cloning in order\n // to reuse objects references. This deep data clone is performed against\n // the `observer.currentResult.data` property\n // When QueryKey changes, we refresh the query and get new `optimistic`\n // result, while we leave the `observer.currentResult`, so when new data\n // arrives, it finds the old `observer.currentResult` which is related\n // to the old QueryKey. Which means that currentResult and selectData are\n // out of sync already.\n // To solve this, we move the cursor of the currentResult every time\n // an observer reads an optimistic value.\n\n // When keeping the previous data, the result doesn't change until new\n // data arrives.\n this.#currentResult = result\n this.#currentResultOptions = this.options\n this.#currentResultState = this.#currentQuery.state\n }\n return result\n }\n\n getCurrentResult(): QueryObserverResult<TData, TError> {\n return this.#currentResult\n }\n\n trackResult(\n result: QueryObserverResult<TData, TError>,\n onPropTracked?: (key: keyof QueryObserverResult) => void,\n ): QueryObserverResult<TData, TError> {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key as keyof QueryObserverResult)\n onPropTracked?.(key as keyof QueryObserverResult)\n if (key === 'promise') {\n this.trackProp('data')\n if (\n !this.options.experimental_prefetchInRender &&\n this.#currentThenable.status === 'pending'\n ) {\n this.#currentThenable.reject(\n new Error(\n 'experimental_prefetchInRender feature flag is not enabled',\n ),\n )\n }\n }\n return Reflect.get(target, key)\n },\n })\n }\n\n trackProp(key: keyof QueryObserverResult) {\n this.#trackedProps.add(key)\n }\n\n getCurrentQuery(): Query<TQueryFnData, TError, TQueryData, TQueryKey> {\n return this.#currentQuery\n }\n\n refetch({ ...options }: RefetchOptions = {}): Promise<\n QueryObserverResult<TData, TError>\n > {\n return this.fetch({\n ...options,\n })\n }\n\n fetchOptimistic(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): Promise<QueryObserverResult<TData, TError>> {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n\n const query = this.#client\n .getQueryCache()\n .build(this.#client, defaultedOptions)\n\n return query.fetch().then(() => this.createResult(query, defaultedOptions))\n }\n\n protected fetch(\n fetchOptions: ObserverFetchOptions,\n ): Promise<QueryObserverResult<TData, TError>> {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true,\n }).then(() => {\n this.updateResult()\n return this.#currentResult\n })\n }\n\n #executeFetch(\n fetchOptions?: Omit<ObserverFetchOptions, 'initialPromise'>,\n ): Promise<TQueryData | undefined> {\n // Make sure we reference the latest query as the current one might have been removed\n this.#updateQuery()\n\n // Fetch\n let promise: Promise<TQueryData | undefined> = this.#currentQuery.fetch(\n this.options as QueryOptions<TQueryFnData, TError, TQueryData, TQueryKey>,\n fetchOptions,\n )\n\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop)\n }\n\n return promise\n }\n\n #updateStaleTimeout(): void {\n this.#clearStaleTimeout()\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery,\n )\n\n if (isServer || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n return\n }\n\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime)\n\n // The timeout is sometimes triggered 1 ms before the stale time expiration.\n // To mitigate this issue we always add 1 ms to the timeout.\n const timeout = time + 1\n\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult()\n }\n }, timeout)\n }\n\n #computeRefetchInterval() {\n return (\n (typeof this.options.refetchInterval === 'function'\n ? this.options.refetchInterval(this.#currentQuery)\n : this.options.refetchInterval) ?? false\n )\n }\n\n #updateRefetchInterval(nextInterval: number | false): void {\n this.#clearRefetchInterval()\n\n this.#currentRefetchInterval = nextInterval\n\n if (\n isServer ||\n resolveEnabled(this.options.enabled, this.#currentQuery) === false ||\n !isValidTimeout(this.#currentRefetchInterval) ||\n this.#currentRefetchInterval === 0\n ) {\n return\n }\n\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (\n this.options.refetchIntervalInBackground ||\n focusManager.isFocused()\n ) {\n this.#executeFetch()\n }\n }, this.#currentRefetchInterval)\n }\n\n #updateTimers(): void {\n this.#updateStaleTimeout()\n this.#updateRefetchInterval(this.#computeRefetchInterval())\n }\n\n #clearStaleTimeout(): void {\n if (this.#staleTimeoutId) {\n timeoutManager.clearTimeout(this.#staleTimeoutId)\n this.#staleTimeoutId = undefined\n }\n }\n\n #clearRefetchInterval(): void {\n if (this.#refetchIntervalId) {\n timeoutManager.clearInterval(this.#refetchIntervalId)\n this.#refetchIntervalId = undefined\n }\n }\n\n protected createResult(\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey>,\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const prevQuery = this.#currentQuery\n const prevOptions = this.options\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n const prevResultState = this.#currentResultState\n const prevResultOptions = this.#currentResultOptions\n const queryChange = query !== prevQuery\n const queryInitialState = queryChange\n ? query.state\n : this.#currentQueryInitialState\n\n const { state } = query\n let newState = { ...state }\n let isPlaceholderData = false\n let data: TData | undefined\n\n // Optimistically set result in fetching state if needed\n if (options._optimisticResults) {\n const mounted = this.hasListeners()\n\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options)\n\n const fetchOptionally =\n mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions)\n\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options),\n }\n }\n if (options._optimisticResults === 'isRestoring') {\n newState.fetchStatus = 'idle'\n }\n }\n\n let { error, errorUpdatedAt, status } = newState\n\n // Per default, use query data\n data = newState.data as unknown as TData\n let skipSelect = false\n\n // use placeholderData if needed\n if (\n options.placeholderData !== undefined &&\n data === undefined &&\n status === 'pending'\n ) {\n let placeholderData\n\n // Memoize placeholder data\n if (\n prevResult?.isPlaceholderData &&\n options.placeholderData === prevResultOptions?.placeholderData\n ) {\n placeholderData = prevResult.data\n // we have to skip select when reading this memoization\n // because prevResult.data is already \"selected\"\n skipSelect = true\n } else {\n // compute placeholderData\n placeholderData =\n typeof options.placeholderData === 'function'\n ? (\n options.placeholderData as unknown as PlaceholderDataFunction<TQueryData>\n )(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData as any,\n )\n : options.placeholderData\n }\n\n if (placeholderData !== undefined) {\n status = 'success'\n data = replaceData(\n prevResult?.data,\n placeholderData as unknown,\n options,\n ) as TData\n isPlaceholderData = true\n }\n }\n\n // Select data if needed\n // this also runs placeholderData through the select function\n if (options.select && data !== undefined && !skipSelect) {\n // Memoize select result\n if (\n prevResult &&\n data === prevResultState?.data &&\n options.select === this.#selectFn\n ) {\n data = this.#selectResult\n } else {\n try {\n this.#selectFn = options.select\n data = options.select(data as any)\n data = replaceData(prevResult?.data, data, options)\n this.#selectResult = data\n this.#selectError = null\n } catch (selectError) {\n this.#selectError = selectError as TError\n }\n }\n }\n\n if (this.#selectError) {\n error = this.#selectError as any\n data = this.#selectResult\n errorUpdatedAt = Date.now()\n status = 'error'\n }\n\n const isFetching = newState.fetchStatus === 'fetching'\n const isPending = status === 'pending'\n const isError = status === 'error'\n\n const isLoading = isPending && isFetching\n const hasData = data !== undefined\n\n const result: QueryObserverBaseResult<TData, TError> = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === 'success',\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: newState.dataUpdateCount > 0 || newState.errorUpdateCount > 0,\n isFetchedAfterMount:\n newState.dataUpdateCount > queryInitialState.dataUpdateCount ||\n newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === 'paused',\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveEnabled(options.enabled, query) !== false,\n }\n\n const nextResult = result as QueryObserverResult<TData, TError>\n\n if (this.options.experimental_prefetchInRender) {\n const finalizeThenableIfPossible = (thenable: PendingThenable<TData>) => {\n if (nextResult.status === 'error') {\n thenable.reject(nextResult.error)\n } else if (nextResult.data !== undefined) {\n thenable.resolve(nextResult.data)\n }\n }\n\n /**\n * Create a new thenable and result promise when the results have changed\n */\n const recreateThenable = () => {\n const pending =\n (this.#currentThenable =\n nextResult.promise =\n pendingThenable())\n\n finalizeThenableIfPossible(pending)\n }\n\n const prevThenable = this.#currentThenable\n switch (prevThenable.status) {\n case 'pending':\n // Finalize the previous thenable if it was pending\n // and we are still observing the same query\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable)\n }\n break\n case 'fulfilled':\n if (\n nextResult.status === 'error' ||\n nextResult.data !== prevThenable.value\n ) {\n recreateThenable()\n }\n break\n case 'rejected':\n if (\n nextResult.status !== 'error' ||\n nextResult.error !== prevThenable.reason\n ) {\n recreateThenable()\n }\n break\n }\n }\n\n return nextResult\n }\n\n updateResult(): void {\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n\n const nextResult = this.createResult(this.#currentQuery, this.options)\n\n this.#currentResultState = this.#currentQuery.state\n this.#currentResultOptions = this.options\n\n if (this.#currentResultState.data !== undefined) {\n this.#lastQueryWithDefinedData = this.#currentQuery\n }\n\n // Only notify and update result if something has changed\n if (shallowEqualObjects(nextResult, prevResult)) {\n return\n }\n\n this.#currentResult = nextResult\n\n const shouldNotifyListeners = (): boolean => {\n if (!prevResult) {\n return true\n }\n\n const { notifyOnChangeProps } = this.options\n const notifyOnChangePropsValue =\n typeof notifyOnChangeProps === 'function'\n ? notifyOnChangeProps()\n : notifyOnChangeProps\n\n if (\n notifyOnChangePropsValue === 'all' ||\n (!notifyOnChangePropsValue && !this.#trackedProps.size)\n ) {\n return true\n }\n\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps,\n )\n\n if (this.options.throwOnError) {\n includedProps.add('error')\n }\n\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key as keyof QueryObserverResult\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey]\n\n return changed && includedProps.has(typedKey)\n })\n }\n\n this.#notify({ listeners: shouldNotifyListeners() })\n }\n\n #updateQuery(): void {\n const query = this.#client.getQueryCache().build(this.#client, this.options)\n\n if (query === this.#currentQuery) {\n return\n }\n\n const prevQuery = this.#currentQuery as\n | Query<TQueryFnData, TError, TQueryData, TQueryKey>\n | undefined\n this.#currentQuery = query\n this.#currentQueryInitialState = query.state\n\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this)\n query.addObserver(this)\n }\n }\n\n onQueryUpdate(): void {\n this.updateResult()\n\n if (this.hasListeners()) {\n this.#updateTimers()\n }\n }\n\n #notify(notifyOptions: { listeners: boolean }): void {\n notifyManager.batch(() => {\n // First, trigger the listeners\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult)\n })\n }\n\n // Then the cache listeners\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: 'observerResultsUpdated',\n })\n })\n }\n}\n\nfunction shouldLoadOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any>,\n): boolean {\n return (\n resolveEnabled(options.enabled, query) !== false &&\n query.state.data === undefined &&\n !(query.state.status === 'error' && options.retryOnMount === false)\n )\n}\n\nfunction shouldFetchOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n shouldLoadOnMount(query, options) ||\n (query.state.data !== undefined &&\n shouldFetchOn(query, options, options.refetchOnMount))\n )\n}\n\nfunction shouldFetchOn(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n field: (typeof options)['refetchOnMount'] &\n (typeof options)['refetchOnWindowFocus'] &\n (typeof options)['refetchOnReconnect'],\n) {\n if (\n resolveEnabled(options.enabled, query) !== false &&\n resolveStaleTime(options.staleTime, query) !== 'static'\n ) {\n const value = typeof field === 'function' ? field(query) : field\n\n return value === 'always' || (value !== false && isStale(query, options))\n }\n return false\n}\n\nfunction shouldFetchOptionally(\n query: Query<any, any, any, any>,\n prevQuery: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n prevOptions: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n (query !== prevQuery ||\n resolveEnabled(prevOptions.enabled, query) === false) &&\n (!options.suspense || query.state.status !== 'error') &&\n isStale(query, options)\n )\n}\n\nfunction isStale(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n resolveEnabled(options.enabled, query) !== false &&\n query.isStaleByTime(resolveStaleTime(options.staleTime, query))\n )\n}\n\n// this function would decide if we will update the observer's 'current'\n// properties after an optimistic reading via getOptimisticResult\nfunction shouldAssignObserverCurrentProperties<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>,\n optimisticResult: QueryObserverResult<TData, TError>,\n) {\n // if the newly created result isn't what the observer is holding as current,\n // then we'll need to update the properties as well\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true\n }\n\n // basically, just keep previous properties if nothing changed\n return false\n}\n","import {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn,\n} from './utils'\nimport type { QueryBehavior } from './query'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<TQueryFnData, TError, TData, TPageParam>(\n pages?: number,\n): QueryBehavior<TQueryFnData, TError, InfiniteData<TData, TPageParam>> {\n return {\n onFetch: (context, query) => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n let result: InfiniteData<unknown> = { pages: [], pageParams: [] }\n let currentPage = 0\n\n const fetchFn = async () => {\n let cancelled = false\n const addSignalProperty = (object: unknown) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => (cancelled = true),\n )\n }\n\n const queryFn = ensureQueryFn(context.options, context.fetchOptions)\n\n // Create function to fetch a page\n const fetchPage = async (\n data: InfiniteData<unknown>,\n param: unknown,\n previous?: boolean,\n ): Promise<InfiniteData<unknown>> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (param == null && data.pages.length) {\n return Promise.resolve(data)\n }\n\n const createQueryFnContext = () => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? 'backward' : 'forward',\n meta: context.options.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<QueryKey, unknown>\n }\n\n const queryFnContext = createQueryFnContext()\n\n const page = await queryFn(queryFnContext)\n\n const { maxPages } = context.options\n const addTo = previous ? addToStart : addToEnd\n\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages),\n }\n }\n\n // fetch next / previous page?\n if (direction && oldPages.length) {\n const previous = direction === 'backward'\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams,\n }\n const param = pageParamFn(options, oldData)\n\n result = await fetchPage(oldData, param, previous)\n } else {\n const remainingPages = pages ?? oldPages.length\n\n // Fetch all pages\n do {\n const param =\n currentPage === 0\n ? (oldPageParams[0] ?? options.initialPageParam)\n : getNextPageParam(options, result)\n if (currentPage > 0 && param == null) {\n break\n }\n result = await fetchPage(result, param)\n currentPage++\n } while (currentPage < remainingPages)\n }\n\n return result\n }\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn as any,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal,\n },\n query,\n )\n }\n } else {\n context.fetchFn = fetchFn\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n const lastIndex = pages.length - 1\n return pages.length > 0\n ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams,\n )\n : undefined\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n return pages.length > 0\n ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams)\n : undefined\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data) return false\n return getNextPageParam(options, data) != null\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data || !options.getPreviousPageParam) return false\n return getPreviousPageParam(options, data) != null\n}\n","import { notifyManager } from './notifyManager'\nimport { Removable } from './removable'\nimport { createRetryer } from './retryer'\nimport type {\n DefaultError,\n MutationFunctionContext,\n MutationMeta,\n MutationOptions,\n MutationStatus,\n} from './types'\nimport type { MutationCache } from './mutationCache'\nimport type { MutationObserver } from './mutationObserver'\nimport type { Retryer } from './retryer'\nimport type { QueryClient } from './queryClient'\n\n// TYPES\n\ninterface MutationConfig<TData, TError, TVariables, TOnMutateResult> {\n client: QueryClient\n mutationId: number\n mutationCache: MutationCache\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>\n state?: MutationState<TData, TError, TVariables, TOnMutateResult>\n}\n\nexport interface MutationState<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n context: TOnMutateResult | undefined\n data: TData | undefined\n error: TError | null\n failureCount: number\n failureReason: TError | null\n isPaused: boolean\n status: MutationStatus\n variables: TVariables | undefined\n submittedAt: number\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError | null\n}\n\ninterface PendingAction<TVariables, TOnMutateResult> {\n type: 'pending'\n isPaused: boolean\n variables?: TVariables\n context?: TOnMutateResult\n}\n\ninterface SuccessAction<TData> {\n type: 'success'\n data: TData\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\nexport type Action<TData, TError, TVariables, TOnMutateResult> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | PendingAction<TVariables, TOnMutateResult>\n | PauseAction\n | SuccessAction<TData>\n\n// CLASS\n\nexport class Mutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> extends Removable {\n state: MutationState<TData, TError, TVariables, TOnMutateResult>\n options!: MutationOptions<TData, TError, TVariables, TOnMutateResult>\n readonly mutationId: number\n\n #client: QueryClient\n #observers: Array<\n MutationObserver<TData, TError, TVariables, TOnMutateResult>\n >\n #mutationCache: MutationCache\n #retryer?: Retryer<TData>\n\n constructor(\n config: MutationConfig<TData, TError, TVariables, TOnMutateResult>,\n ) {\n super()\n\n this.#client = config.client\n this.mutationId = config.mutationId\n this.#mutationCache = config.mutationCache\n this.#observers = []\n this.state = config.state || getDefaultState()\n\n this.setOptions(config.options)\n this.scheduleGc()\n }\n\n setOptions(\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,\n ): void {\n this.options = options\n\n this.updateGcTime(this.options.gcTime)\n }\n\n get meta(): MutationMeta | undefined {\n return this.options.meta\n }\n\n addObserver(observer: MutationObserver<any, any, any, any>): void {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer)\n\n // Stop the mutation from being garbage collected\n this.clearGcTimeout()\n\n this.#mutationCache.notify({\n type: 'observerAdded',\n mutation: this,\n observer,\n })\n }\n }\n\n removeObserver(observer: MutationObserver<any, any, any, any>): void {\n this.#observers = this.#observers.filter((x) => x !== observer)\n\n this.scheduleGc()\n\n this.#mutationCache.notify({\n type: 'observerRemoved',\n mutation: this,\n observer,\n })\n }\n\n protected optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === 'pending') {\n this.scheduleGc()\n } else {\n this.#mutationCache.remove(this)\n }\n }\n }\n\n continue(): Promise<unknown> {\n return (\n this.#retryer?.continue() ??\n // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables!)\n )\n }\n\n async execute(variables: TVariables): Promise<TData> {\n const onContinue = () => {\n this.#dispatch({ type: 'continue' })\n }\n\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey,\n } satisfies MutationFunctionContext\n\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error('No mutationFn found'))\n }\n\n return this.options.mutationFn(variables, mutationFnContext)\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this),\n })\n\n const restored = this.state.status === 'pending'\n const isPaused = !this.#retryer.canStart()\n\n try {\n if (restored) {\n // Dispatch continue action to unpause restored mutation\n onContinue()\n } else {\n this.#dispatch({ type: 'pending', variables, isPaused })\n // Notify cache callback\n await this.#mutationCache.config.onMutate?.(\n variables,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext,\n )\n if (context !== this.state.context) {\n this.#dispatch({\n type: 'pending',\n context,\n variables,\n isPaused,\n })\n }\n }\n const data = await this.#retryer.start()\n\n // Notify cache callback\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context!,\n mutationFnContext,\n )\n\n // Notify cache callback\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext,\n )\n\n this.#dispatch({ type: 'success', data })\n return data\n } catch (error) {\n try {\n // Notify cache callback\n await this.#mutationCache.config.onError?.(\n error as any,\n variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n await this.options.onError?.(\n error as TError,\n variables,\n this.state.context,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n // Notify cache callback\n await this.#mutationCache.config.onSettled?.(\n undefined,\n error as any,\n this.state.variables,\n this.state.context,\n this as Mutation<unknown, unknown, unknown, unknown>,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n try {\n await this.options.onSettled?.(\n undefined,\n error as TError,\n variables,\n this.state.context,\n mutationFnContext,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n\n this.#dispatch({ type: 'error', error: error as TError })\n throw error\n } finally {\n this.#mutationCache.runNext(this)\n }\n }\n\n #dispatch(action: Action<TData, TError, TVariables, TOnMutateResult>): void {\n const reducer = (\n state: MutationState<TData, TError, TVariables, TOnMutateResult>,\n ): MutationState<TData, TError, TVariables, TOnMutateResult> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n isPaused: true,\n }\n case 'continue':\n return {\n ...state,\n isPaused: false,\n }\n case 'pending':\n return {\n ...state,\n context: action.context,\n data: undefined,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: 'pending',\n variables: action.variables,\n submittedAt: Date.now(),\n }\n case 'success':\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: 'success',\n isPaused: false,\n }\n case 'error':\n return {\n ...state,\n data: undefined,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: 'error',\n }\n }\n }\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action)\n })\n this.#mutationCache.notify({\n mutation: this,\n type: 'updated',\n action,\n })\n })\n }\n}\n\nexport function getDefaultState<\n TData,\n TError,\n TVariables,\n TOnMutateResult,\n>(): MutationState<TData, TError, TVariables, TOnMutateResult> {\n return {\n context: undefined,\n data: undefined,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: 'idle',\n variables: undefined,\n submittedAt: 0,\n }\n}\n","import { notifyManager } from './notifyManager'\nimport { Mutation } from './mutation'\nimport { matchMutation, noop } from './utils'\nimport { Subscribable } from './subscribable'\nimport type { MutationObserver } from './mutationObserver'\nimport type {\n DefaultError,\n MutationFunctionContext,\n MutationOptions,\n NotifyEvent,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { Action, MutationState } from './mutation'\nimport type { MutationFilters } from './utils'\n\n// TYPES\n\ninterface MutationCacheConfig {\n onError?: (\n error: DefaultError,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onSuccess?: (\n data: unknown,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onMutate?: (\n variables: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n onSettled?: (\n data: unknown | undefined,\n error: DefaultError | null,\n variables: unknown,\n onMutateResult: unknown,\n mutation: Mutation<unknown, unknown, unknown>,\n context: MutationFunctionContext,\n ) => Promise<unknown> | unknown\n}\n\ninterface NotifyEventMutationAdded extends NotifyEvent {\n type: 'added'\n mutation: Mutation<any, any, any, any>\n}\ninterface NotifyEventMutationRemoved extends NotifyEvent {\n type: 'removed'\n mutation: Mutation<any, any, any, any>\n}\n\ninterface NotifyEventMutationObserverAdded extends NotifyEvent {\n type: 'observerAdded'\n mutation: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any>\n}\n\ninterface NotifyEventMutationObserverRemoved extends NotifyEvent {\n type: 'observerRemoved'\n mutation: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any>\n}\n\ninterface NotifyEventMutationObserverOptionsUpdated extends NotifyEvent {\n type: 'observerOptionsUpdated'\n mutation?: Mutation<any, any, any, any>\n observer: MutationObserver<any, any, any, any>\n}\n\ninterface NotifyEventMutationUpdated extends NotifyEvent {\n type: 'updated'\n mutation: Mutation<any, any, any, any>\n action: Action<any, any, any, any>\n}\n\nexport type MutationCacheNotifyEvent =\n | NotifyEventMutationAdded\n | NotifyEventMutationRemoved\n | NotifyEventMutationObserverAdded\n | NotifyEventMutationObserverRemoved\n | NotifyEventMutationObserverOptionsUpdated\n | NotifyEventMutationUpdated\n\ntype MutationCacheListener = (event: MutationCacheNotifyEvent) => void\n\n// CLASS\n\nexport class MutationCache extends Subscribable<MutationCacheListener> {\n #mutations: Set<Mutation<any, any, any, any>>\n #scopes: Map<string, Array<Mutation<any, any, any, any>>>\n #mutationId: number\n\n constructor(public config: MutationCacheConfig = {}) {\n super()\n this.#mutations = new Set()\n this.#scopes = new Map()\n this.#mutationId = 0\n }\n\n build<TData, TError, TVariables, TOnMutateResult>(\n client: QueryClient,\n options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,\n state?: MutationState<TData, TError, TVariables, TOnMutateResult>,\n ): Mutation<TData, TError, TVariables, TOnMutateResult> {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state,\n })\n\n this.add(mutation)\n\n return mutation\n }\n\n add(mutation: Mutation<any, any, any, any>): void {\n this.#mutations.add(mutation)\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const scopedMutations = this.#scopes.get(scope)\n if (scopedMutations) {\n scopedMutations.push(mutation)\n } else {\n this.#scopes.set(scope, [mutation])\n }\n }\n this.notify({ type: 'added', mutation })\n }\n\n remove(mutation: Mutation<any, any, any, any>): void {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const scopedMutations = this.#scopes.get(scope)\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation)\n if (index !== -1) {\n scopedMutations.splice(index, 1)\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope)\n }\n }\n }\n }\n\n // Currently we notify the removal even if the mutation was already removed.\n // Consider making this an error or not notifying of the removal depending on the desired semantics.\n this.notify({ type: 'removed', mutation })\n }\n\n canRun(mutation: Mutation<any, any, any, any>): boolean {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const mutationsWithSameScope = this.#scopes.get(scope)\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === 'pending',\n )\n // we can run if there is no current pending mutation (start use-case)\n // or if WE are the first pending mutation (continue use-case)\n return !firstPendingMutation || firstPendingMutation === mutation\n } else {\n // For unscoped mutations there are never any pending mutations in front of the\n // current mutation\n return true\n }\n }\n\n runNext(mutation: Mutation<any, any, any, any>): Promise<unknown> {\n const scope = scopeFor(mutation)\n if (typeof scope === 'string') {\n const foundMutation = this.#scopes\n .get(scope)\n ?.find((m) => m !== mutation && m.state.isPaused)\n\n return foundMutation?.continue() ?? Promise.resolve()\n } else {\n return Promise.resolve()\n }\n }\n\n clear(): void {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: 'removed', mutation })\n })\n this.#mutations.clear()\n this.#scopes.clear()\n })\n }\n\n getAll(): Array<Mutation> {\n return Array.from(this.#mutations)\n }\n\n find<\n TData = unknown,\n TError = DefaultError,\n TVariables = any,\n TOnMutateResult = unknown,\n >(\n filters: MutationFilters,\n ): Mutation<TData, TError, TVariables, TOnMutateResult> | undefined {\n const defaultedFilters = { exact: true, ...filters }\n\n return this.getAll().find((mutation) =>\n matchMutation(defaultedFilters, mutation),\n ) as Mutation<TData, TError, TVariables, TOnMutateResult> | undefined\n }\n\n findAll(filters: MutationFilters = {}): Array<Mutation> {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation))\n }\n\n notify(event: MutationCacheNotifyEvent) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event)\n })\n })\n }\n\n resumePausedMutations(): Promise<unknown> {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused)\n\n return notifyManager.batch(() =>\n Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop)),\n ),\n )\n }\n}\n\nfunction scopeFor(mutation: Mutation<any, any, any, any>) {\n return mutation.options.scope?.id\n}\n","import { getDefaultState } from './mutation'\nimport { notifyManager } from './notifyManager'\nimport { Subscribable } from './subscribable'\nimport { hashKey, shallowEqualObjects } from './utils'\nimport type { QueryClient } from './queryClient'\nimport type {\n DefaultError,\n MutateOptions,\n MutationFunctionContext,\n MutationObserverOptions,\n MutationObserverResult,\n} from './types'\nimport type { Action, Mutation } from './mutation'\n\n// TYPES\n\ntype MutationObserverListener<TData, TError, TVariables, TOnMutateResult> = (\n result: MutationObserverResult<TData, TError, TVariables, TOnMutateResult>,\n) => void\n\n// CLASS\n\nexport class MutationObserver<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> extends Subscribable<\n MutationObserverListener<TData, TError, TVariables, TOnMutateResult>\n> {\n options!: MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>\n\n #client: QueryClient\n #currentResult: MutationObserverResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n > = undefined!\n #currentMutation?: Mutation<TData, TError, TVariables, TOnMutateResult>\n #mutateOptions?: MutateOptions<TData, TError, TVariables, TOnMutateResult>\n\n constructor(\n client: QueryClient,\n options: MutationObserverOptions<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >,\n ) {\n super()\n\n this.#client = client\n this.setOptions(options)\n this.bindMethods()\n this.#updateResult()\n }\n\n protected bindMethods(): void {\n this.mutate = this.mutate.bind(this)\n this.reset = this.reset.bind(this)\n }\n\n setOptions(\n options: MutationObserverOptions<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n >,\n ) {\n const prevOptions = this.options as\n | MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>\n | undefined\n this.options = this.#client.defaultMutationOptions(options)\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: 'observerOptionsUpdated',\n mutation: this.#currentMutation,\n observer: this,\n })\n }\n\n if (\n prevOptions?.mutationKey &&\n this.options.mutationKey &&\n hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)\n ) {\n this.reset()\n } else if (this.#currentMutation?.state.status === 'pending') {\n this.#currentMutation.setOptions(this.options)\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this)\n }\n }\n\n onMutationUpdate(\n action: Action<TData, TError, TVariables, TOnMutateResult>,\n ): void {\n this.#updateResult()\n\n this.#notify(action)\n }\n\n getCurrentResult(): MutationObserverResult<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n > {\n return this.#currentResult\n }\n\n reset(): void {\n // reset needs to remove the observer from the mutation because there is no way to \"get it back\"\n // another mutate call will yield a new mutation!\n this.#currentMutation?.removeObserver(this)\n this.#currentMutation = undefined\n this.#updateResult()\n this.#notify()\n }\n\n mutate(\n variables: TVariables,\n options?: MutateOptions<TData, TError, TVariables, TOnMutateResult>,\n ): Promise<TData> {\n this.#mutateOptions = options\n\n this.#currentMutation?.removeObserver(this)\n\n this.#currentMutation = this.#client\n .getMutationCache()\n .build(this.#client, this.options)\n\n this.#currentMutation.addObserver(this)\n\n return this.#currentMutation.execute(variables)\n }\n\n #updateResult(): void {\n const state =\n this.#currentMutation?.state ??\n getDefaultState<TData, TError, TVariables, TOnMutateResult>()\n\n this.#currentResult = {\n ...state,\n isPending: state.status === 'pending',\n isSuccess: state.status === 'success',\n isError: state.status === 'error',\n isIdle: state.status === 'idle',\n mutate: this.mutate,\n reset: this.reset,\n } as MutationObserverResult<TData, TError, TVariables, TOnMutateResult>\n }\n\n #notify(action?: Action<TData, TError, TVariables, TOnMutateResult>): void {\n notifyManager.batch(() => {\n // First trigger the mutate callbacks\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables!\n const onMutateResult = this.#currentResult.context\n\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey,\n } satisfies MutationFunctionContext\n\n if (action?.type === 'success') {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n } else if (action?.type === 'error') {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n try {\n this.#mutateOptions.onSettled?.(\n undefined,\n action.error,\n variables,\n onMutateResult,\n context,\n )\n } catch (e) {\n void Promise.reject(e)\n }\n }\n }\n\n // Then trigger the listeners\n this.listeners.forEach((listener) => {\n listener(this.#currentResult)\n })\n })\n }\n}\n","import { hashQueryKeyByOptions, matchQuery } from './utils'\nimport { Query } from './query'\nimport { notifyManager } from './notifyManager'\nimport { Subscribable } from './subscribable'\nimport type { QueryFilters } from './utils'\nimport type { Action, QueryState } from './query'\nimport type {\n DefaultError,\n NotifyEvent,\n QueryKey,\n QueryOptions,\n WithRequired,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { QueryObserver } from './queryObserver'\n\n// TYPES\n\ninterface QueryCacheConfig {\n onError?: (\n error: DefaultError,\n query: Query<unknown, unknown, unknown>,\n ) => void\n onSuccess?: (data: unknown, query: Query<unknown, unknown, unknown>) => void\n onSettled?: (\n data: unknown | undefined,\n error: DefaultError | null,\n query: Query<unknown, unknown, unknown>,\n ) => void\n}\n\ninterface NotifyEventQueryAdded extends NotifyEvent {\n type: 'added'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryRemoved extends NotifyEvent {\n type: 'removed'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryUpdated extends NotifyEvent {\n type: 'updated'\n query: Query<any, any, any, any>\n action: Action<any, any>\n}\n\ninterface NotifyEventQueryObserverAdded extends NotifyEvent {\n type: 'observerAdded'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverRemoved extends NotifyEvent {\n type: 'observerRemoved'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverResultsUpdated extends NotifyEvent {\n type: 'observerResultsUpdated'\n query: Query<any, any, any, any>\n}\n\ninterface NotifyEventQueryObserverOptionsUpdated extends NotifyEvent {\n type: 'observerOptionsUpdated'\n query: Query<any, any, any, any>\n observer: QueryObserver<any, any, any, any, any>\n}\n\nexport type QueryCacheNotifyEvent =\n | NotifyEventQueryAdded\n | NotifyEventQueryRemoved\n | NotifyEventQueryUpdated\n | NotifyEventQueryObserverAdded\n | NotifyEventQueryObserverRemoved\n | NotifyEventQueryObserverResultsUpdated\n | NotifyEventQueryObserverOptionsUpdated\n\ntype QueryCacheListener = (event: QueryCacheNotifyEvent) => void\n\nexport interface QueryStore {\n has: (queryHash: string) => boolean\n set: (queryHash: string, query: Query) => void\n get: (queryHash: string) => Query | undefined\n delete: (queryHash: string) => void\n values: () => IterableIterator<Query>\n}\n\n// CLASS\n\nexport class QueryCache extends Subscribable<QueryCacheListener> {\n #queries: QueryStore\n\n constructor(public config: QueryCacheConfig = {}) {\n super()\n this.#queries = new Map<string, Query>()\n }\n\n build<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n client: QueryClient,\n options: WithRequired<\n QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'queryKey'\n >,\n state?: QueryState<TData, TError>,\n ): Query<TQueryFnData, TError, TData, TQueryKey> {\n const queryKey = options.queryKey\n const queryHash =\n options.queryHash ?? hashQueryKeyByOptions(queryKey, options)\n let query = this.get<TQueryFnData, TError, TData, TQueryKey>(queryHash)\n\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey),\n })\n this.add(query)\n }\n\n return query\n }\n\n add(query: Query<any, any, any, any>): void {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query)\n\n this.notify({\n type: 'added',\n query,\n })\n }\n }\n\n remove(query: Query<any, any, any, any>): void {\n const queryInMap = this.#queries.get(query.queryHash)\n\n if (queryInMap) {\n query.destroy()\n\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash)\n }\n\n this.notify({ type: 'removed', query })\n }\n }\n\n clear(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query)\n })\n })\n }\n\n get<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n queryHash: string,\n ): Query<TQueryFnData, TError, TData, TQueryKey> | undefined {\n return this.#queries.get(queryHash) as\n | Query<TQueryFnData, TError, TData, TQueryKey>\n | undefined\n }\n\n getAll(): Array<Query> {\n return [...this.#queries.values()]\n }\n\n find<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData>(\n filters: WithRequired<QueryFilters, 'queryKey'>,\n ): Query<TQueryFnData, TError, TData> | undefined {\n const defaultedFilters = { exact: true, ...filters }\n\n return this.getAll().find((query) =>\n matchQuery(defaultedFilters, query),\n ) as Query<TQueryFnData, TError, TData> | undefined\n }\n\n findAll(filters: QueryFilters<any> = {}): Array<Query> {\n const queries = this.getAll()\n return Object.keys(filters).length > 0\n ? queries.filter((query) => matchQuery(filters, query))\n : queries\n }\n\n notify(event: QueryCacheNotifyEvent): void {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event)\n })\n })\n }\n\n onFocus(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus()\n })\n })\n }\n\n onOnline(): void {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline()\n })\n })\n }\n}\n","import {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken,\n} from './utils'\nimport { QueryCache } from './queryCache'\nimport { MutationCache } from './mutationCache'\nimport { focusManager } from './focusManager'\nimport { onlineManager } from './onlineManager'\nimport { notifyManager } from './notifyManager'\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior'\nimport type {\n CancelOptions,\n DefaultError,\n DefaultOptions,\n DefaultedQueryObserverOptions,\n EnsureInfiniteQueryDataOptions,\n EnsureQueryDataOptions,\n FetchInfiniteQueryOptions,\n FetchQueryOptions,\n InferDataFromTag,\n InferErrorFromTag,\n InfiniteData,\n InvalidateOptions,\n InvalidateQueryFilters,\n MutationKey,\n MutationObserverOptions,\n MutationOptions,\n NoInfer,\n OmitKeyof,\n QueryClientConfig,\n QueryKey,\n QueryObserverOptions,\n QueryOptions,\n RefetchOptions,\n RefetchQueryFilters,\n ResetOptions,\n SetDataOptions,\n} from './types'\nimport type { QueryState } from './query'\nimport type { MutationFilters, QueryFilters, Updater } from './utils'\n\n// TYPES\n\ninterface QueryDefaults {\n queryKey: QueryKey\n defaultOptions: OmitKeyof<QueryOptions<any, any, any>, 'queryKey'>\n}\n\ninterface MutationDefaults {\n mutationKey: MutationKey\n defaultOptions: MutationOptions<any, any, any, any>\n}\n\n// CLASS\n\nexport class QueryClient {\n #queryCache: QueryCache\n #mutationCache: MutationCache\n #defaultOptions: DefaultOptions\n #queryDefaults: Map<string, QueryDefaults>\n #mutationDefaults: Map<string, MutationDefaults>\n #mountCount: number\n #unsubscribeFocus?: () => void\n #unsubscribeOnline?: () => void\n\n constructor(config: QueryClientConfig = {}) {\n this.#queryCache = config.queryCache || new QueryCache()\n this.#mutationCache = config.mutationCache || new MutationCache()\n this.#defaultOptions = config.defaultOptions || {}\n this.#queryDefaults = new Map()\n this.#mutationDefaults = new Map()\n this.#mountCount = 0\n }\n\n mount(): void {\n this.#mountCount++\n if (this.#mountCount !== 1) return\n\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations()\n this.#queryCache.onFocus()\n }\n })\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations()\n this.#queryCache.onOnline()\n }\n })\n }\n\n unmount(): void {\n this.#mountCount--\n if (this.#mountCount !== 0) return\n\n this.#unsubscribeFocus?.()\n this.#unsubscribeFocus = undefined\n\n this.#unsubscribeOnline?.()\n this.#unsubscribeOnline = undefined\n }\n\n isFetching<TQueryFilters extends QueryFilters<any> = QueryFilters>(\n filters?: TQueryFilters,\n ): number {\n return this.#queryCache.findAll({ ...filters, fetchStatus: 'fetching' })\n .length\n }\n\n isMutating<\n TMutationFilters extends MutationFilters<any, any> = MutationFilters,\n >(filters?: TMutationFilters): number {\n return this.#mutationCache.findAll({ ...filters, status: 'pending' }).length\n }\n\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData<\n TQueryFnData = unknown,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n >(queryKey: TTaggedQueryKey): TInferredQueryFnData | undefined {\n const options = this.defaultQueryOptions({ queryKey })\n\n return this.#queryCache.get<TInferredQueryFnData>(options.queryHash)?.state\n .data\n }\n\n ensureQueryData<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n options: EnsureQueryDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): Promise<TData> {\n const defaultedOptions = this.defaultQueryOptions(options)\n const query = this.#queryCache.build(this, defaultedOptions)\n const cachedData = query.state.data\n\n if (cachedData === undefined) {\n return this.fetchQuery(options)\n }\n\n if (\n options.revalidateIfStale &&\n query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))\n ) {\n void this.prefetchQuery(defaultedOptions)\n }\n\n return Promise.resolve(cachedData)\n }\n\n getQueriesData<\n TQueryFnData = unknown,\n TQueryFilters extends QueryFilters<any> = QueryFilters,\n >(filters: TQueryFilters): Array<[QueryKey, TQueryFnData | undefined]> {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data as TQueryFnData | undefined\n return [queryKey, data]\n })\n }\n\n setQueryData<\n TQueryFnData = unknown,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n >(\n queryKey: TTaggedQueryKey,\n updater: Updater<\n NoInfer<TInferredQueryFnData> | undefined,\n NoInfer<TInferredQueryFnData> | undefined\n >,\n options?: SetDataOptions,\n ): NoInfer<TInferredQueryFnData> | undefined {\n const defaultedOptions = this.defaultQueryOptions<\n any,\n any,\n unknown,\n any,\n QueryKey\n >({ queryKey })\n\n const query = this.#queryCache.get<TInferredQueryFnData>(\n defaultedOptions.queryHash,\n )\n const prevData = query?.state.data\n const data = functionalUpdate(updater, prevData)\n\n if (data === undefined) {\n return undefined\n }\n\n return this.#queryCache\n .build(this, defaultedOptions)\n .setData(data, { ...options, manual: true })\n }\n\n setQueriesData<\n TQueryFnData,\n TQueryFilters extends QueryFilters<any> = QueryFilters,\n >(\n filters: TQueryFilters,\n updater: Updater<\n NoInfer<TQueryFnData> | undefined,\n NoInfer<TQueryFnData> | undefined\n >,\n options?: SetDataOptions,\n ): Array<[QueryKey, TQueryFnData | undefined]> {\n return notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .map(({ queryKey }) => [\n queryKey,\n this.setQueryData<TQueryFnData>(queryKey, updater, options),\n ]),\n )\n }\n\n getQueryState<\n TQueryFnData = unknown,\n TError = DefaultError,\n TTaggedQueryKey extends QueryKey = QueryKey,\n TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,\n TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,\n >(\n queryKey: TTaggedQueryKey,\n ): QueryState<TInferredQueryFnData, TInferredError> | undefined {\n const options = this.defaultQueryOptions({ queryKey })\n return this.#queryCache.get<TInferredQueryFnData, TInferredError>(\n options.queryHash,\n )?.state\n }\n\n removeQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n ): void {\n const queryCache = this.#queryCache\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query)\n })\n })\n }\n\n resetQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n options?: ResetOptions,\n ): Promise<void> {\n const queryCache = this.#queryCache\n\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset()\n })\n return this.refetchQueries(\n {\n type: 'active',\n ...filters,\n },\n options,\n )\n })\n }\n\n cancelQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: QueryFilters<TTaggedQueryKey>,\n cancelOptions: CancelOptions = {},\n ): Promise<void> {\n const defaultedCancelOptions = { revert: true, ...cancelOptions }\n\n const promises = notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .map((query) => query.cancel(defaultedCancelOptions)),\n )\n\n return Promise.all(promises).then(noop).catch(noop)\n }\n\n invalidateQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: InvalidateQueryFilters<TTaggedQueryKey>,\n options: InvalidateOptions = {},\n ): Promise<void> {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate()\n })\n\n if (filters?.refetchType === 'none') {\n return Promise.resolve()\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? 'active',\n },\n options,\n )\n })\n }\n\n refetchQueries<TTaggedQueryKey extends QueryKey = QueryKey>(\n filters?: RefetchQueryFilters<TTaggedQueryKey>,\n options: RefetchOptions = {},\n ): Promise<void> {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true,\n }\n const promises = notifyManager.batch(() =>\n this.#queryCache\n .findAll(filters)\n .filter((query) => !query.isDisabled() && !query.isStatic())\n .map((query) => {\n let promise = query.fetch(undefined, fetchOptions)\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop)\n }\n return query.state.fetchStatus === 'paused'\n ? Promise.resolve()\n : promise\n }),\n )\n\n return Promise.all(promises).then(noop)\n }\n\n fetchQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n options: FetchQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<TData> {\n const defaultedOptions = this.defaultQueryOptions(options)\n\n // https://github.com/tannerlinsley/react-query/issues/652\n if (defaultedOptions.retry === undefined) {\n defaultedOptions.retry = false\n }\n\n const query = this.#queryCache.build(this, defaultedOptions)\n\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query),\n )\n ? query.fetch(defaultedOptions)\n : Promise.resolve(query.state.data as TData)\n }\n\n prefetchQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n >(\n options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): Promise<void> {\n return this.fetchQuery(options).then(noop).catch(noop)\n }\n\n fetchInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: FetchInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<InfiniteData<TData, TPageParam>> {\n options.behavior = infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n TPageParam\n >(options.pages)\n return this.fetchQuery(options as any)\n }\n\n prefetchInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: FetchInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<void> {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop)\n }\n\n ensureInfiniteQueryData<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n >(\n options: EnsureInfiniteQueryDataOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n ): Promise<InfiniteData<TData, TPageParam>> {\n options.behavior = infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n TPageParam\n >(options.pages)\n\n return this.ensureQueryData(options as any)\n }\n\n resumePausedMutations(): Promise<unknown> {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations()\n }\n return Promise.resolve()\n }\n\n getQueryCache(): QueryCache {\n return this.#queryCache\n }\n\n getMutationCache(): MutationCache {\n return this.#mutationCache\n }\n\n getDefaultOptions(): DefaultOptions {\n return this.#defaultOptions\n }\n\n setDefaultOptions(options: DefaultOptions): void {\n this.#defaultOptions = options\n }\n\n setQueryDefaults<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n >(\n queryKey: QueryKey,\n options: Partial<\n OmitKeyof<\n QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>,\n 'queryKey'\n >\n >,\n ): void {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options,\n })\n }\n\n getQueryDefaults(\n queryKey: QueryKey,\n ): OmitKeyof<QueryObserverOptions<any, any, any, any, any>, 'queryKey'> {\n const defaults = [...this.#queryDefaults.values()]\n\n const result: OmitKeyof<\n QueryObserverOptions<any, any, any, any, any>,\n 'queryKey'\n > = {}\n\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions)\n }\n })\n return result\n }\n\n setMutationDefaults<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n >(\n mutationKey: MutationKey,\n options: OmitKeyof<\n MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>,\n 'mutationKey'\n >,\n ): void {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options,\n })\n }\n\n getMutationDefaults(\n mutationKey: MutationKey,\n ): OmitKeyof<MutationObserverOptions<any, any, any, any>, 'mutationKey'> {\n const defaults = [...this.#mutationDefaults.values()]\n\n const result: OmitKeyof<\n MutationObserverOptions<any, any, any, any>,\n 'mutationKey'\n > = {}\n\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions)\n }\n })\n\n return result\n }\n\n defaultQueryOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n options:\n | QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey,\n TPageParam\n >\n | DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n > {\n if (options._defaulted) {\n return options as DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n }\n\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true,\n }\n\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions,\n )\n }\n\n // dependent default values\n if (defaultedOptions.refetchOnReconnect === undefined) {\n defaultedOptions.refetchOnReconnect =\n defaultedOptions.networkMode !== 'always'\n }\n if (defaultedOptions.throwOnError === undefined) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense\n }\n\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = 'offlineFirst'\n }\n\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false\n }\n\n return defaultedOptions as DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n }\n\n defaultMutationOptions<T extends MutationOptions<any, any, any, any>>(\n options?: T,\n ): T {\n if (options?._defaulted) {\n return options\n }\n return {\n ...this.#defaultOptions.mutations,\n ...(options?.mutationKey &&\n this.getMutationDefaults(options.mutationKey)),\n ...options,\n _defaulted: true,\n } as T\n }\n\n clear(): void {\n this.#queryCache.clear()\n this.#mutationCache.clear()\n }\n}\n","'use client'\nimport * as React from 'react'\n\nimport type { QueryClient } from '@tanstack/query-core'\n\nexport const QueryClientContext = React.createContext<QueryClient | undefined>(\n undefined,\n)\n\nexport const useQueryClient = (queryClient?: QueryClient) => {\n const client = React.useContext(QueryClientContext)\n\n if (queryClient) {\n return queryClient\n }\n\n if (!client) {\n throw new Error('No QueryClient set, use QueryClientProvider to set one')\n }\n\n return client\n}\n\nexport type QueryClientProviderProps = {\n client: QueryClient\n children?: React.ReactNode\n}\n\nexport const QueryClientProvider = ({\n client,\n children,\n}: QueryClientProviderProps): React.JSX.Element => {\n React.useEffect(() => {\n client.mount()\n return () => {\n client.unmount()\n }\n }, [client])\n\n return (\n <QueryClientContext.Provider value={client}>\n {children}\n </QueryClientContext.Provider>\n )\n}\n","'use client'\nimport * as React from 'react'\n\nconst IsRestoringContext = React.createContext(false)\n\nexport const useIsRestoring = () => React.useContext(IsRestoringContext)\nexport const IsRestoringProvider = IsRestoringContext.Provider\n","'use client'\nimport * as React from 'react'\n\n// CONTEXT\nexport type QueryErrorResetFunction = () => void\nexport type QueryErrorIsResetFunction = () => boolean\nexport type QueryErrorClearResetFunction = () => void\n\nexport interface QueryErrorResetBoundaryValue {\n clearReset: QueryErrorClearResetFunction\n isReset: QueryErrorIsResetFunction\n reset: QueryErrorResetFunction\n}\n\nfunction createValue(): QueryErrorResetBoundaryValue {\n let isReset = false\n return {\n clearReset: () => {\n isReset = false\n },\n reset: () => {\n isReset = true\n },\n isReset: () => {\n return isReset\n },\n }\n}\n\nconst QueryErrorResetBoundaryContext = React.createContext(createValue())\n\n// HOOK\n\nexport const useQueryErrorResetBoundary = () =>\n React.useContext(QueryErrorResetBoundaryContext)\n\n// COMPONENT\n\nexport type QueryErrorResetBoundaryFunction = (\n value: QueryErrorResetBoundaryValue,\n) => React.ReactNode\n\nexport interface QueryErrorResetBoundaryProps {\n children: QueryErrorResetBoundaryFunction | React.ReactNode\n}\n\nexport const QueryErrorResetBoundary = ({\n children,\n}: QueryErrorResetBoundaryProps) => {\n const [value] = React.useState(() => createValue())\n return (\n <QueryErrorResetBoundaryContext.Provider value={value}>\n {typeof children === 'function' ? children(value) : children}\n </QueryErrorResetBoundaryContext.Provider>\n )\n}\n","'use client'\nimport * as React from 'react'\nimport { shouldThrowError } from '@tanstack/query-core'\nimport type {\n DefaultedQueryObserverOptions,\n Query,\n QueryKey,\n QueryObserverResult,\n ThrowOnError,\n} from '@tanstack/query-core'\nimport type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary'\n\nexport const ensurePreventErrorBoundaryRetry = <\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n errorResetBoundary: QueryErrorResetBoundaryValue,\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey> | undefined,\n) => {\n const throwOnError =\n query?.state.error && typeof options.throwOnError === 'function'\n ? shouldThrowError(options.throwOnError, [query.state.error, query])\n : options.throwOnError\n\n if (\n options.suspense ||\n options.experimental_prefetchInRender ||\n throwOnError\n ) {\n // Prevent retrying failed query if the error boundary has not been reset yet\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false\n }\n }\n}\n\nexport const useClearResetErrorBoundary = (\n errorResetBoundary: QueryErrorResetBoundaryValue,\n) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset()\n }, [errorResetBoundary])\n}\n\nexport const getHasError = <\n TData,\n TError,\n TQueryFnData,\n TQueryData,\n TQueryKey extends QueryKey,\n>({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense,\n}: {\n result: QueryObserverResult<TData, TError>\n errorResetBoundary: QueryErrorResetBoundaryValue\n throwOnError: ThrowOnError<TQueryFnData, TError, TQueryData, TQueryKey>\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey> | undefined\n suspense: boolean | undefined\n}) => {\n return (\n result.isError &&\n !errorResetBoundary.isReset() &&\n !result.isFetching &&\n query &&\n ((suspense && result.data === undefined) ||\n shouldThrowError(throwOnError, [result.error, query]))\n )\n}\n","import type {\n DefaultError,\n DefaultedQueryObserverOptions,\n Query,\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary'\n\nexport const defaultThrowOnError = <\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n _error: TError,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n) => query.state.data === undefined\n\nexport const ensureSuspenseTimers = (\n defaultedOptions: DefaultedQueryObserverOptions<any, any, any, any, any>,\n) => {\n if (defaultedOptions.suspense) {\n // Handle staleTime to ensure minimum 1000ms in Suspense mode\n // This prevents unnecessary refetching when components remount after suspending\n const MIN_SUSPENSE_TIME_MS = 1000\n\n const clamp = (value: number | 'static' | undefined) =>\n value === 'static'\n ? value\n : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS)\n\n const originalStaleTime = defaultedOptions.staleTime\n defaultedOptions.staleTime =\n typeof originalStaleTime === 'function'\n ? (...args) => clamp(originalStaleTime(...args))\n : clamp(originalStaleTime)\n\n if (typeof defaultedOptions.gcTime === 'number') {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS,\n )\n }\n }\n}\n\nexport const willFetch = (\n result: QueryObserverResult<any, any>,\n isRestoring: boolean,\n) => result.isLoading && result.isFetching && !isRestoring\n\nexport const shouldSuspend = (\n defaultedOptions:\n | DefaultedQueryObserverOptions<any, any, any, any, any>\n | undefined,\n result: QueryObserverResult<any, any>,\n) => defaultedOptions?.suspense && result.isPending\n\nexport const fetchOptimistic = <\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n defaultedOptions: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>,\n errorResetBoundary: QueryErrorResetBoundaryValue,\n) =>\n observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset()\n })\n","'use client'\nimport * as React from 'react'\n\nimport { isServer, noop, notifyManager } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary,\n} from './errorBoundaryUtils'\nimport { useIsRestoring } from './IsRestoringProvider'\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch,\n} from './suspense'\nimport type {\n QueryClient,\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { UseBaseQueryOptions } from './types'\n\nexport function useBaseQuery<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: UseBaseQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n Observer: typeof QueryObserver,\n queryClient?: QueryClient,\n): QueryObserverResult<TData, TError> {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof options !== 'object' || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object',\n )\n }\n }\n\n const isRestoring = useIsRestoring()\n const errorResetBoundary = useQueryErrorResetBoundary()\n const client = useQueryClient(queryClient)\n const defaultedOptions = client.defaultQueryOptions(options)\n ;(client.getDefaultOptions().queries as any)?._experimental_beforeQuery?.(\n defaultedOptions,\n )\n\n const query = client\n .getQueryCache()\n .get<\n TQueryFnData,\n TError,\n TQueryData,\n TQueryKey\n >(defaultedOptions.queryHash)\n\n if (process.env.NODE_ENV !== 'production') {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`,\n )\n }\n }\n\n // Make sure results are optimistically set in fetching state before subscribing or updating options\n defaultedOptions._optimisticResults = isRestoring\n ? 'isRestoring'\n : 'optimistic'\n\n ensureSuspenseTimers(defaultedOptions)\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query)\n useClearResetErrorBoundary(errorResetBoundary)\n\n // this needs to be invoked before creating the Observer because that can create a cache entry\n const isNewCacheEntry = !client\n .getQueryCache()\n .get(defaultedOptions.queryHash)\n\n const [observer] = React.useState(\n () =>\n new Observer<TQueryFnData, TError, TData, TQueryData, TQueryKey>(\n client,\n defaultedOptions,\n ),\n )\n\n // note: this must be called before useSyncExternalStore\n const result = observer.getOptimisticResult(defaultedOptions)\n\n const shouldSubscribe = !isRestoring && options.subscribed !== false\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe\n ? observer.subscribe(notifyManager.batchCalls(onStoreChange))\n : noop\n\n // Update result to make sure we did not miss any query updates\n // between creating the observer and subscribing to it.\n observer.updateResult()\n\n return unsubscribe\n },\n [observer, shouldSubscribe],\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult(),\n )\n\n React.useEffect(() => {\n observer.setOptions(defaultedOptions)\n }, [defaultedOptions, observer])\n\n // Handle suspense\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n }\n\n // Handle error boundary\n if (\n getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense,\n })\n ) {\n throw result.error\n }\n\n ;(client.getDefaultOptions().queries as any)?._experimental_afterQuery?.(\n defaultedOptions,\n result,\n )\n\n if (\n defaultedOptions.experimental_prefetchInRender &&\n !isServer &&\n willFetch(result, isRestoring)\n ) {\n const promise = isNewCacheEntry\n ? // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n : // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n\n promise?.catch(noop).finally(() => {\n // `.updateResult()` will trigger `.#currentThenable` to finalize\n observer.updateResult()\n })\n }\n\n // Handle result property usage tracking\n return !defaultedOptions.notifyOnChangeProps\n ? observer.trackResult(result)\n : result\n}\n","'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport type {\n DefaultError,\n NoInfer,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport type {\n DefinedUseQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from './types'\nimport type {\n DefinedInitialDataOptions,\n UndefinedInitialDataOptions,\n} from './queryOptions'\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>\n\nexport function useQuery(options: UseQueryOptions, queryClient?: QueryClient) {\n return useBaseQuery(options, QueryObserver, queryClient)\n}\n","'use client'\nimport * as React from 'react'\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError,\n} from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n UseMutateFunction,\n UseMutationOptions,\n UseMutationResult,\n} from './types'\nimport type { DefaultError, QueryClient } from '@tanstack/query-core'\n\n// HOOK\n\nexport function useMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n>(\n options: UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n): UseMutationResult<TData, TError, TVariables, TOnMutateResult> {\n const client = useQueryClient(queryClient)\n\n const [observer] = React.useState(\n () =>\n new MutationObserver<TData, TError, TVariables, TOnMutateResult>(\n client,\n options,\n ),\n )\n\n React.useEffect(() => {\n observer.setOptions(options)\n }, [observer, options])\n\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer],\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult(),\n )\n\n const mutate = React.useCallback<\n UseMutateFunction<TData, TError, TVariables, TOnMutateResult>\n >(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop)\n },\n [observer],\n )\n\n if (\n result.error &&\n shouldThrowError(observer.options.throwOnError, [result.error])\n ) {\n throw result.error\n }\n\n return { ...result, mutate, mutateAsync: result.mutate }\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'separator', separator)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n for (const configKey in override) {\n overrideConfigProperties(\n baseConfig[configKey as keyof typeof override],\n override[configKey as keyof typeof override],\n )\n }\n\n for (const key in extend) {\n mergeConfigProperties(\n baseConfig[key as keyof typeof extend],\n extend[key as keyof typeof extend],\n )\n }\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue)\n }\n }\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge Tailwind classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Convert base64 string to Uint8Array\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to base64 string\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Format timestamp to locale string\n */\nexport function formatTimestamp(\n timestamp: string | number,\n options?: Intl.DateTimeFormatOptions\n): string {\n const date = typeof timestamp === \"number\"\n ? new Date(timestamp > 1e12 ? timestamp : timestamp * 1000) // Handle both ms and seconds\n : new Date(timestamp);\n\n return date.toLocaleString(\"en-US\", options ?? {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date for logs (includes seconds)\n */\nexport function formatLogTimestamp(timestampMs: number): string {\n const date = new Date(timestampMs);\n return date.toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n });\n}\n\n/**\n * Compute optimal number of rows for viewport height\n */\nexport function computeRowsForViewportHeight(\n viewportHeight: number,\n headerPx = 48,\n rowPx = 44\n): number {\n const availablePx = Math.max(0, viewportHeight - headerPx);\n const rows = Math.floor(availablePx / rowPx);\n return Math.max(5, Math.min(200, rows));\n}\n\n/**\n * Delay helper for async operations\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Safe JSON parse\n */\nexport function safeJsonParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch {\n return fallback;\n }\n}\n\n/**\n * Truncate text with ellipsis\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + \"...\";\n}\n\n/**\n * Check if a value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { AutoRefreshOptions, AutoRefreshReturn } from \"../types\";\n\n/**\n * Hook for auto-refreshing data at a configurable interval\n *\n * @example\n * ```tsx\n * const { secondsRemaining, refreshNow, lastError, failureCount } = useAutoRefresh({\n * intervalSeconds: 15,\n * refresh: fetchData,\n * isBlocked: isLoading,\n * onError: (err) => console.error('Refresh failed:', err),\n * maxRetries: 3,\n * });\n * ```\n */\nexport function useAutoRefresh(options: AutoRefreshOptions): AutoRefreshReturn {\n const {\n intervalSeconds,\n enabled = true,\n refresh,\n isBlocked = false,\n onError,\n maxRetries,\n } = options;\n\n const refreshRef = useRef(refresh);\n refreshRef.current = refresh;\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n const isBlockedRef = useRef(isBlocked);\n useEffect(() => {\n isBlockedRef.current = isBlocked;\n }, [isBlocked]);\n\n const [nextRefreshAt, setNextRefreshAt] = useState(() => Date.now() + intervalSeconds * 1000);\n const [now, setNow] = useState(() => Date.now());\n const [lastError, setLastError] = useState<Error | null>(null);\n const [failureCount, setFailureCount] = useState(0);\n const [isStopped, setIsStopped] = useState(false);\n\n const secondsRemaining = useMemo(() => {\n if (!enabled || isStopped) return null;\n return Math.max(0, Math.ceil((nextRefreshAt - now) / 1000));\n }, [enabled, isStopped, nextRefreshAt, now]);\n\n // Update current time every 250ms\n useEffect(() => {\n if (!enabled || isStopped) return;\n const id = window.setInterval(() => setNow(Date.now()), 250);\n return () => window.clearInterval(id);\n }, [enabled, isStopped]);\n\n const runRefresh = useCallback(async () => {\n if (!enabled || isStopped) return;\n if (isBlockedRef.current) return;\n\n try {\n await refreshRef.current();\n // Success - reset error state\n setLastError(null);\n setFailureCount(0);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setLastError(error);\n setFailureCount(prev => {\n const newCount = prev + 1;\n // Stop if max retries exceeded\n if (maxRetries !== undefined && newCount >= maxRetries) {\n setIsStopped(true);\n }\n return newCount;\n });\n // Call error callback\n onErrorRef.current?.(error);\n }\n\n setNextRefreshAt(Date.now() + intervalSeconds * 1000);\n }, [enabled, isStopped, intervalSeconds, maxRetries]);\n\n // Trigger refresh when time is up\n useEffect(() => {\n if (!enabled || isStopped) return;\n if (isBlockedRef.current) return;\n if (now < nextRefreshAt) return;\n void runRefresh();\n }, [enabled, isStopped, now, nextRefreshAt, runRefresh]);\n\n const refreshNow = useCallback(async () => {\n // Allow manual refresh even if stopped\n if (!enabled) return;\n if (isBlockedRef.current) return;\n\n try {\n await refreshRef.current();\n setLastError(null);\n setFailureCount(0);\n setIsStopped(false); // Resume auto-refresh on successful manual refresh\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setLastError(error);\n onErrorRef.current?.(error);\n }\n\n setNextRefreshAt(Date.now() + intervalSeconds * 1000);\n }, [enabled, intervalSeconds]);\n\n const resetTimer = useCallback(() => {\n setNextRefreshAt(Date.now() + intervalSeconds * 1000);\n setIsStopped(false); // Also resume auto-refresh\n setFailureCount(0);\n setLastError(null);\n }, [intervalSeconds]);\n\n return { secondsRemaining, refreshNow, resetTimer, lastError, failureCount, isStopped };\n}\n","import { useCallback, useState } from \"react\";\nimport type { BaseDataItem, SelectionReturn } from \"../types\";\n\n/**\n * Hook for managing multi-select state in tables\n *\n * @example\n * ```tsx\n * const selection = useSelection<MyItem>();\n *\n * // Toggle single item\n * selection.toggle(item.id);\n *\n * // Check if selected\n * const isSelected = selection.isSelected(item.id);\n *\n * // Toggle all\n * selection.toggleAll(items);\n * ```\n */\nexport function useSelection<T extends BaseDataItem>(): SelectionReturn<T> {\n const [selectedIds, setSelectedIds] = useState<string[]>([]);\n\n const isSelected = useCallback(\n (id: string) => selectedIds.includes(id),\n [selectedIds]\n );\n\n const toggle = useCallback((id: string) => {\n setSelectedIds((prev) =>\n prev.includes(id) ? prev.filter((p) => p !== id) : [...prev, id]\n );\n }, []);\n\n const selectAll = useCallback((items: T[]) => {\n setSelectedIds(items.map((item) => item.id));\n }, []);\n\n const clearAll = useCallback(() => {\n setSelectedIds([]);\n }, []);\n\n const toggleAll = useCallback(\n (items: T[]) => {\n if (selectedIds.length === items.length) {\n setSelectedIds([]);\n } else {\n setSelectedIds(items.map((item) => item.id));\n }\n },\n [selectedIds.length]\n );\n\n const getSelected = useCallback(\n (items: T[]) => items.filter((item) => selectedIds.includes(item.id)),\n [selectedIds]\n );\n\n const allSelected = useCallback(\n (items: T[]) => items.length > 0 && selectedIds.length === items.length,\n [selectedIds.length]\n );\n\n const someSelected = useCallback(\n (items: T[]) =>\n selectedIds.length > 0 && selectedIds.length < items.length,\n [selectedIds.length]\n );\n\n return {\n selectedIds,\n isSelected,\n toggle,\n selectAll,\n clearAll,\n toggleAll,\n getSelected,\n allSelected,\n someSelected,\n };\n}\n","import { useCallback, useMemo, useState, useEffect, useRef } from \"react\";\nimport type { PaginationReturn } from \"../types\";\nimport { computeRowsForViewportHeight } from \"../utils\";\n\nexport type PageSizeMode = \"auto\" | \"manual\";\n\nexport interface UsePaginationOptions {\n /** Initial page (0-indexed) */\n initialPage?: number;\n /** Initial page size */\n initialPageSize?: number;\n /** Total number of items (for calculating total pages) */\n totalItems?: number;\n /** Whether to enable auto page size based on viewport */\n autoPageSize?: boolean;\n /** Ref to viewport element for auto sizing */\n viewportRef?: React.RefObject<HTMLDivElement>;\n /** Callback when page changes */\n onPageChange?: (page: number) => void;\n /** Callback when page size changes */\n onPageSizeChange?: (pageSize: number) => void;\n}\n\n/**\n * Hook for managing pagination state\n *\n * @example\n * ```tsx\n * const pagination = usePagination({\n * initialPageSize: 25,\n * totalItems: data.length,\n * });\n *\n * // Use in query\n * const { data } = useQuery({\n * queryKey: ['items', pagination.page, pagination.pageSize],\n * queryFn: () => fetchItems(pagination.pageSize, pagination.page * pagination.pageSize),\n * });\n * ```\n */\nexport function usePagination(options: UsePaginationOptions = {}): PaginationReturn & {\n pageSizeMode: PageSizeMode;\n setPageSizeMode: (mode: PageSizeMode) => void;\n pageSizeSelectValue: string;\n onPageSizeSelect: (value: string) => void;\n} {\n const {\n initialPage = 0,\n initialPageSize = 25,\n totalItems = 0,\n autoPageSize = false,\n viewportRef,\n onPageChange,\n onPageSizeChange,\n } = options;\n\n const [page, setPageState] = useState(initialPage);\n const [pageSize, setPageSizeState] = useState(initialPageSize);\n const [pageSizeMode, setPageSizeMode] = useState<PageSizeMode>(\n autoPageSize ? \"auto\" : \"manual\"\n );\n\n // Handle auto page size with ResizeObserver\n useEffect(() => {\n if (pageSizeMode !== \"auto\" || !viewportRef?.current) return;\n\n const el = viewportRef.current;\n const ro = new ResizeObserver((entries) => {\n const h = entries[0]?.contentRect.height ?? 0;\n if (!h) return;\n const newSize = computeRowsForViewportHeight(h);\n setPageSizeState(newSize);\n onPageSizeChange?.(newSize);\n });\n\n ro.observe(el);\n return () => ro.disconnect();\n }, [pageSizeMode, viewportRef, onPageSizeChange]);\n\n const setPage = useCallback(\n (newPage: number) => {\n setPageState(newPage);\n onPageChange?.(newPage);\n },\n [onPageChange]\n );\n\n const setPageSize = useCallback(\n (newSize: number) => {\n setPageSizeState(newSize);\n onPageSizeChange?.(newSize);\n // Reset to first page when page size changes\n setPageState(0);\n onPageChange?.(0);\n },\n [onPageChange, onPageSizeChange]\n );\n\n const totalPages = useMemo(\n () => Math.max(1, Math.ceil(totalItems / pageSize)),\n [totalItems, pageSize]\n );\n\n const nextPage = useCallback(() => {\n const newPage = Math.min(page + 1, totalPages - 1);\n setPage(newPage);\n }, [page, totalPages, setPage]);\n\n const prevPage = useCallback(() => {\n const newPage = Math.max(0, page - 1);\n setPage(newPage);\n }, [page, setPage]);\n\n const canNextPage = page < totalPages - 1;\n const canPrevPage = page > 0;\n\n const startIndex = page * pageSize;\n const endIndex = Math.min(startIndex + pageSize, totalItems);\n\n // For select component\n const pageSizeSelectValue = pageSizeMode === \"auto\" ? \"auto\" : String(pageSize);\n\n const onPageSizeSelect = useCallback(\n (value: string) => {\n if (value === \"auto\") {\n setPageSizeMode(\"auto\");\n } else {\n setPageSizeMode(\"manual\");\n setPageSize(parseInt(value, 10));\n }\n },\n [setPageSize]\n );\n\n return {\n page,\n pageSize,\n setPage,\n setPageSize,\n nextPage,\n prevPage,\n canNextPage,\n canPrevPage,\n totalPages,\n startIndex,\n endIndex,\n pageSizeMode,\n setPageSizeMode,\n pageSizeSelectValue,\n onPageSizeSelect,\n };\n}\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n })\n .join(' ');\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) => {\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props,\n }),\n );\n\n Component.displayName = `${iconName}`;\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTIuNDhhMiAyIDAgMCAwLTEuOTMgMS40NmwtMi4zNSA4LjM2YS4yNS4yNSAwIDAgMS0uNDggMEw5LjI0IDIuMThhLjI1LjI1IDAgMCAwLS40OCAwbC0yLjM1IDguMzZBMiAyIDAgMCAxIDQuNDkgMTJIMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon('Activity', [\n [\n 'path',\n {\n d: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n key: '169zse',\n },\n ],\n]);\n\nexport default Activity;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Ban\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtNC45IDQuOSAxNC4yIDE0LjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/ban\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ban = createLucideIcon('Ban', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm4.9 4.9 14.2 14.2', key: '1m5liu' }],\n]);\n\nexport default Ban;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('Check', [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]]);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon('ChevronDown', [\n ['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }],\n]);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('ChevronRight', [\n ['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }],\n]);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleAlert = createLucideIcon('CircleAlert', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default CircleAlert;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleCheck\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtOSAxMiAyIDIgNC00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleCheck = createLucideIcon('CircleCheck', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm9 12 2 2 4-4', key: 'dzmm74' }],\n]);\n\nexport default CircleCheck;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJtMTUgOS02IDYiIC8+CiAgPHBhdGggZD0ibTkgOSA2IDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleX = createLucideIcon('CircleX', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'm15 9-6 6', key: '1uzhvr' }],\n ['path', { d: 'm9 9 6 6', key: 'z0biqf' }],\n]);\n\nexport default CircleX;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cG9seWxpbmUgcG9pbnRzPSIxMiA2IDEyIDEyIDE2IDE0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('Clock', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['polyline', { points: '12 6 12 12 16 14', key: '68esgv' }],\n]);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Code\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cG9seWxpbmUgcG9pbnRzPSIxNiAxOCAyMiAxMiAxNiA2IiAvPgogIDxwb2x5bGluZSBwb2ludHM9IjggNiAyIDEyIDggMTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/code\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Code = createLucideIcon('Code', [\n ['polyline', { points: '16 18 22 12 16 6', key: 'z7tu5w' }],\n ['polyline', { points: '8 6 2 12 8 18', key: '1eg1df' }],\n]);\n\nexport default Code;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Copy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Copy = createLucideIcon('Copy', [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2', key: '17jyea' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2', key: 'zix9uf' }],\n]);\n\nexport default Copy;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Download\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCIgLz4KICA8cG9seWxpbmUgcG9pbnRzPSI3IDEwIDEyIDE1IDE3IDEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMTUiIHkyPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/download\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Download = createLucideIcon('Download', [\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n ['polyline', { points: '7 10 12 15 17 10', key: '2ggqvy' }],\n ['line', { x1: '12', x2: '12', y1: '15', y2: '3', key: '1vk2je' }],\n]);\n\nexport default Download;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Ellipsis\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ellipsis = createLucideIcon('Ellipsis', [\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n]);\n\nexport default Ellipsis;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiAxMnMzLTcgMTAtNyAxMCA3IDEwIDctMyA3LTEwIDctMTAtNy0xMC03WiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Eye = createLucideIcon('Eye', [\n ['path', { d: 'M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z', key: 'rwhkz3' }],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n]);\n\nexport default Eye;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name FileCode\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTIuNSA4IDE1bDIgMi41IiAvPgogIDxwYXRoIGQ9Im0xNCAxMi41IDIgMi41LTIgMi41IiAvPgogIDxwYXRoIGQ9Ik0xNCAydjRhMiAyIDAgMCAwIDIgMmg0IiAvPgogIDxwYXRoIGQ9Ik0xNSAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWN3oiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-code\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileCode = createLucideIcon('FileCode', [\n ['path', { d: 'M10 12.5 8 15l2 2.5', key: '1tg20x' }],\n ['path', { d: 'm14 12.5 2 2.5-2 2.5', key: 'yinavb' }],\n ['path', { d: 'M14 2v4a2 2 0 0 0 2 2h4', key: 'tnqrlb' }],\n ['path', { d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z', key: '1mlx9k' }],\n]);\n\nexport default FileCode;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name FileKey\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjdaIiAvPgogIDxjaXJjbGUgY3g9IjEwIiBjeT0iMTYiIHI9IjIiIC8+CiAgPHBhdGggZD0ibTE2IDEwLTQuNSA0LjUiIC8+CiAgPHBhdGggZD0ibTE1IDExIDEgMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file-key\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FileKey = createLucideIcon('FileKey', [\n ['path', { d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z', key: '1rqfz7' }],\n ['circle', { cx: '10', cy: '16', r: '2', key: '4ckbqe' }],\n ['path', { d: 'm16 10-4.5 4.5', key: '7p3ebg' }],\n ['path', { d: 'm15 11 1 1', key: '1bsyx3' }],\n]);\n\nexport default FileKey;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiAxNCAxLjUtMi45QTIgMiAwIDAgMSA5LjI0IDEwSDIwYTIgMiAwIDAgMSAxLjk0IDIuNWwtMS41NCA2YTIgMiAwIDAgMS0xLjk1IDEuNUg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgxOGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-open\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderOpen = createLucideIcon('FolderOpen', [\n [\n 'path',\n {\n d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',\n key: 'usdka0',\n },\n ],\n]);\n\nexport default FolderOpen;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Inbox\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cG9seWxpbmUgcG9pbnRzPSIyMiAxMiAxNiAxMiAxNCAxNSAxMCAxNSA4IDEyIDIgMTIiIC8+CiAgPHBhdGggZD0iTTUuNDUgNS4xMSAyIDEydjZhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi02bC0zLjQ1LTYuODlBMiAyIDAgMCAwIDE2Ljc2IDRINy4yNGEyIDIgMCAwIDAtMS43OSAxLjExeiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/inbox\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Inbox = createLucideIcon('Inbox', [\n ['polyline', { points: '22 12 16 12 14 15 10 15 8 12 2 12', key: 'o97t9d' }],\n [\n 'path',\n {\n d: 'M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z',\n key: 'oot6mr',\n },\n ],\n]);\n\nexport default Inbox;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Info\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMTZ2LTQiIC8+CiAgPHBhdGggZD0iTTEyIDhoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/info\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Info = createLucideIcon('Info', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 16v-4', key: '1dtifu' }],\n ['path', { d: 'M12 8h.01', key: 'e9boi3' }],\n]);\n\nexport default Info;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name KeyRound\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiAxOHYzYzAgLjYuNCAxIDEgMWg0di0zaDN2LTNoMmwxLjQtMS40YTYuNSA2LjUgMCAxIDAtNC00WiIgLz4KICA8Y2lyY2xlIGN4PSIxNi41IiBjeT0iNy41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/key-round\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst KeyRound = createLucideIcon('KeyRound', [\n ['path', { d: 'M2 18v3c0 .6.4 1 1 1h4v-3h3v-3h2l1.4-1.4a6.5 6.5 0 1 0-4-4Z', key: '167ctg' }],\n ['circle', { cx: '16.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'w0ekpg' }],\n]);\n\nexport default KeyRound;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Link\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTNhNSA1IDAgMCAwIDcuNTQuNTRsMy0zYTUgNSAwIDAgMC03LjA3LTcuMDdsLTEuNzIgMS43MSIgLz4KICA8cGF0aCBkPSJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Link = createLucideIcon('Link', [\n ['path', { d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71', key: '1cjeqo' }],\n ['path', { d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71', key: '19qd67' }],\n]);\n\nexport default Link;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Pencil\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pencil = createLucideIcon('Pencil', [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n ['path', { d: 'm15 5 4 4', key: '1mk7zo' }],\n]);\n\nexport default Pencil;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Plus = createLucideIcon('Plus', [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n]);\n\nexport default Plus;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('RefreshCw', [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n]);\n\nexport default RefreshCw;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ScrollText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMTJoLTUiIC8+CiAgPHBhdGggZD0iTTE1IDhoLTUiIC8+CiAgPHBhdGggZD0iTTE5IDE3VjVhMiAyIDAgMCAwLTItMkg0IiAvPgogIDxwYXRoIGQ9Ik04IDIxaDEyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMUgxMWExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAxLTQgMFY1YTIgMiAwIDEgMC00IDB2MmExIDEgMCAwIDAgMSAxaDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/scroll-text\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ScrollText = createLucideIcon('ScrollText', [\n ['path', { d: 'M15 12h-5', key: 'r7krc0' }],\n ['path', { d: 'M15 8h-5', key: '1khuty' }],\n ['path', { d: 'M19 17V5a2 2 0 0 0-2-2H4', key: 'zz82l3' }],\n [\n 'path',\n {\n d: 'M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3',\n key: '1ph1d7',\n },\n ],\n]);\n\nexport default ScrollText;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4IiAvPgogIDxwYXRoIGQ9Im0yMSAyMS00LjMtNC4zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon('Search', [\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ['path', { d: 'm21 21-4.3-4.3', key: '1qie3q' }],\n]);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuMjIgMmgtLjQ0YTIgMiAwIDAgMC0yIDJ2LjE4YTIgMiAwIDAgMS0xIDEuNzNsLS40My4yNWEyIDIgMCAwIDEtMiAwbC0uMTUtLjA4YTIgMiAwIDAgMC0yLjczLjczbC0uMjIuMzhhMiAyIDAgMCAwIC43MyAyLjczbC4xNS4xYTIgMiAwIDAgMSAxIDEuNzJ2LjUxYTIgMiAwIDAgMS0xIDEuNzRsLS4xNS4wOWEyIDIgMCAwIDAtLjczIDIuNzNsLjIyLjM4YTIgMiAwIDAgMCAyLjczLjczbC4xNS0uMDhhMiAyIDAgMCAxIDIgMGwuNDMuMjVhMiAyIDAgMCAxIDEgMS43M1YyMGEyIDIgMCAwIDAgMiAyaC40NGEyIDIgMCAwIDAgMi0ydi0uMThhMiAyIDAgMCAxIDEtMS43M2wuNDMtLjI1YTIgMiAwIDAgMSAyIDBsLjE1LjA4YTIgMiAwIDAgMCAyLjczLS43M2wuMjItLjM5YTIgMiAwIDAgMC0uNzMtMi43M2wtLjE1LS4wOGEyIDIgMCAwIDEtMS0xLjc0di0uNWEyIDIgMCAwIDEgMS0xLjc0bC4xNS0uMDlhMiAyIDAgMCAwIC43My0yLjczbC0uMjItLjM4YTIgMiAwIDAgMC0yLjczLS43M2wtLjE1LjA4YTIgMiAwIDAgMS0yIDBsLS40My0uMjVhMiAyIDAgMCAxLTEtMS43M1Y0YTIgMiAwIDAgMC0yLTJ6IiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings = createLucideIcon('Settings', [\n [\n 'path',\n {\n d: 'M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z',\n key: '1qme2f',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n]);\n\nexport default Settings;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Shield\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/shield\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Shield = createLucideIcon('Shield', [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n key: 'oel41y',\n },\n ],\n]);\n\nexport default Shield;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name SquareCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxMSAzIDNMMjIgNCIgLz4KICA8cGF0aCBkPSJNMjEgMTJ2N2EyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/square-check-big\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst SquareCheckBig = createLucideIcon('SquareCheckBig', [\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n ['path', { d: 'M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11', key: '1jnkn4' }],\n]);\n\nexport default SquareCheckBig;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA2aDE4IiAvPgogIDxwYXRoIGQ9Ik0xOSA2djE0YzAgMS0xIDItMiAySDdjLTEgMC0yLTEtMi0yVjYiIC8+CiAgPHBhdGggZD0iTTggNlY0YzAtMSAxLTIgMi0yaDRjMSAwIDIgMSAyIDJ2MiIgLz4KICA8bGluZSB4MT0iMTAiIHgyPSIxMCIgeTE9IjExIiB5Mj0iMTciIC8+CiAgPGxpbmUgeDE9IjE0IiB4Mj0iMTQiIHkxPSIxMSIgeTI9IjE3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash2 = createLucideIcon('Trash2', [\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6', key: '4alrt4' }],\n ['path', { d: 'M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2', key: 'v07s0e' }],\n ['line', { x1: '10', x2: '10', y1: '11', y2: '17', key: '1uufr5' }],\n ['line', { x1: '14', x2: '14', y1: '11', y2: '17', key: 'xtxkd' }],\n]);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTMiIC8+CiAgPHBhdGggZD0iTTEyIDl2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTdoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TriangleAlert = createLucideIcon('TriangleAlert', [\n [\n 'path',\n {\n d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',\n key: 'wmoenq',\n },\n ],\n ['path', { d: 'M12 9v4', key: 'juzpu7' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n]);\n\nexport default TriangleAlert;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Undo2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxNCA0IDlsNS01IiAvPgogIDxwYXRoIGQ9Ik00IDloMTAuNWE1LjUgNS41IDAgMCAxIDUuNSA1LjVhNS41IDUuNSAwIDAgMS01LjUgNS41SDExIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/undo-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Undo2 = createLucideIcon('Undo2', [\n ['path', { d: 'M9 14 4 9l5-5', key: '102s5s' }],\n ['path', { d: 'M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11', key: 'f3b9sd' }],\n]);\n\nexport default Undo2;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Unlink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTguODQgMTIuMjUgMS43Mi0xLjcxaC0uMDJhNS4wMDQgNS4wMDQgMCAwIDAtLjEyLTcuMDcgNS4wMDYgNS4wMDYgMCAwIDAtNi45NSAwbC0xLjcyIDEuNzEiIC8+CiAgPHBhdGggZD0ibTUuMTcgMTEuNzUtMS43MSAxLjcxYTUuMDA0IDUuMDA0IDAgMCAwIC4xMiA3LjA3IDUuMDA2IDUuMDA2IDAgMCAwIDYuOTUgMGwxLjcxLTEuNzEiIC8+CiAgPGxpbmUgeDE9IjgiIHgyPSI4IiB5MT0iMiIgeTI9IjUiIC8+CiAgPGxpbmUgeDE9IjIiIHgyPSI1IiB5MT0iOCIgeTI9IjgiIC8+CiAgPGxpbmUgeDE9IjE2IiB4Mj0iMTYiIHkxPSIxOSIgeTI9IjIyIiAvPgogIDxsaW5lIHgxPSIxOSIgeDI9IjIyIiB5MT0iMTYiIHkyPSIxNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/unlink\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Unlink = createLucideIcon('Unlink', [\n [\n 'path',\n {\n d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71',\n key: 'yqzxt4',\n },\n ],\n [\n 'path',\n {\n d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71',\n key: '4qinb0',\n },\n ],\n ['line', { x1: '8', x2: '8', y1: '2', y2: '5', key: '1041cp' }],\n ['line', { x1: '2', x2: '5', y1: '8', y2: '8', key: '14m1p5' }],\n ['line', { x1: '16', x2: '16', y1: '19', y2: '22', key: 'rzdirn' }],\n ['line', { x1: '19', x2: '22', y1: '16', y2: '16', key: 'ox905f' }],\n]);\n\nexport default Unlink;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCIgLz4KICA8cG9seWxpbmUgcG9pbnRzPSIxNyA4IDEyIDMgNyA4IiAvPgogIDxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iMyIgeTI9IjE1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Upload = createLucideIcon('Upload', [\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4', key: 'ih7n3h' }],\n ['polyline', { points: '17 8 12 3 7 8', key: 't8dd8p' }],\n ['line', { x1: '12', x2: '12', y1: '3', y2: '15', key: 'widbto' }],\n]);\n\nexport default Upload;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgMjF2LTJhNCA0IDAgMCAwLTQtNEg5YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjciIHI9IjQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/user\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst User = createLucideIcon('User', [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n]);\n\nexport default User;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Users\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iNyIgcj0iNCIgLz4KICA8cGF0aCBkPSJNMjIgMjF2LTJhNCA0IDAgMCAwLTMtMy44NyIgLz4KICA8cGF0aCBkPSJNMTYgMy4xM2E0IDQgMCAwIDEgMCA3Ljc1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/users\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Users = createLucideIcon('Users', [\n ['path', { d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2', key: '1yyitq' }],\n ['circle', { cx: '9', cy: '7', r: '4', key: 'nufk8' }],\n ['path', { d: 'M22 21v-2a4 4 0 0 0-3-3.87', key: 'kshegd' }],\n ['path', { d: 'M16 3.13a4 4 0 0 1 0 7.75', key: '1da9ce' }],\n]);\n\nexport default Users;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Variable\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAyMXMtNC0zLTQtOSA0LTkgNC05IiAvPgogIDxwYXRoIGQ9Ik0xNiAzczQgMyA0IDktNCA5LTQgOSIgLz4KICA8bGluZSB4MT0iMTUiIHgyPSI5IiB5MT0iOSIgeTI9IjE1IiAvPgogIDxsaW5lIHgxPSI5IiB4Mj0iMTUiIHkxPSI5IiB5Mj0iMTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/variable\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Variable = createLucideIcon('Variable', [\n ['path', { d: 'M8 21s-4-3-4-9 4-9 4-9', key: 'uto9ud' }],\n ['path', { d: 'M16 3s4 3 4 9-4 9-4 9', key: '4w2vsq' }],\n ['line', { x1: '15', x2: '9', y1: '9', y2: '15', key: 'f7djnv' }],\n ['line', { x1: '9', x2: '15', y1: '9', y2: '15', key: '1shsy8' }],\n]);\n\nexport default Variable;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('X', [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n]);\n\nexport default X;\n","import React from \"react\";\nimport { RefreshCw } from \"lucide-react\";\n\nexport interface RefreshButtonProps {\n onClick: () => void;\n isRefreshing: boolean;\n secondsRemaining: number | null;\n disabled?: boolean;\n className?: string;\n \"data-testid\"?: string;\n title?: string;\n /** Accessible label for screen readers */\n \"aria-label\"?: string;\n ButtonComponent?: React.ComponentType<{\n variant?: string;\n onClick: () => void;\n disabled?: boolean;\n \"data-testid\"?: string;\n title?: string;\n className?: string;\n style?: React.CSSProperties;\n \"aria-label\"?: string;\n \"aria-busy\"?: boolean;\n children: React.ReactNode;\n }>;\n}\n\n/**\n * RefreshButton - Displays refresh button with auto-refresh countdown\n *\n * @example\n * ```tsx\n * <RefreshButton\n * onClick={() => void refreshNow()}\n * isRefreshing={isLoading}\n * secondsRemaining={secondsRemaining}\n * title=\"Refresh now\"\n * />\n * ```\n */\nexport function RefreshButton({\n onClick,\n isRefreshing,\n secondsRemaining,\n disabled,\n className,\n \"data-testid\": dataTestId,\n title,\n \"aria-label\": ariaLabel,\n ButtonComponent,\n}: RefreshButtonProps) {\n const label = isRefreshing ? \"Refreshing...\" : \"Refresh\";\n const subtitle = secondsRemaining !== null ? `Auto refresh in ${secondsRemaining}s` : null;\n const accessibleLabel = ariaLabel || (subtitle ? `${label}. ${subtitle}` : label);\n\n const iconStyle: React.CSSProperties = {\n height: \"1rem\",\n width: \"1rem\",\n ...(isRefreshing && { animation: \"spin 1s linear infinite\" }),\n };\n\n const buttonContent = (\n <>\n <RefreshCw style={iconStyle} />\n <span style={{ display: \"flex\", alignItems: \"baseline\", gap: \"0.5rem\" }}>\n <span>{label}</span>\n {subtitle && (\n <span style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {subtitle}\n </span>\n )}\n </span>\n </>\n );\n\n // If a custom button component is provided, use it\n if (ButtonComponent) {\n return (\n <ButtonComponent\n variant=\"outline\"\n onClick={onClick}\n disabled={disabled || isRefreshing}\n data-testid={dataTestId}\n title={title || accessibleLabel}\n aria-label={accessibleLabel}\n aria-busy={isRefreshing}\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"0.5rem\" }}\n className={className}\n >\n {buttonContent}\n </ButtonComponent>\n );\n }\n\n // Default button implementation\n const buttonStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.5rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n height: \"2.5rem\",\n padding: \"0.5rem 1rem\",\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n cursor: disabled || isRefreshing ? \"not-allowed\" : \"pointer\",\n opacity: disabled || isRefreshing ? 0.5 : 1,\n };\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled || isRefreshing}\n data-testid={dataTestId}\n title={title || accessibleLabel}\n aria-label={accessibleLabel}\n aria-busy={isRefreshing}\n style={buttonStyle}\n className={className}\n >\n {buttonContent}\n </button>\n );\n}\n","import React from \"react\";\nimport {\n Clock,\n CheckCircle2,\n XCircle,\n Check,\n Ban,\n AlertCircle,\n Info,\n AlertTriangle,\n} from \"lucide-react\";\nimport type { StatusType, StatusConfig } from \"../../types\";\n\n/**\n * Status color configurations as inline styles\n */\nexport const STATUS_STYLES: Record<StatusType, React.CSSProperties> = {\n pending: { backgroundColor: \"#fefce8\", color: \"#a16207\", borderColor: \"#fef08a\" },\n approved: { backgroundColor: \"#f0fdf4\", color: \"#15803d\", borderColor: \"#bbf7d0\" },\n rejected: { backgroundColor: \"#fef2f2\", color: \"#b91c1c\", borderColor: \"#fecaca\" },\n committed: { backgroundColor: \"#eff6ff\", color: \"#1d4ed8\", borderColor: \"#bfdbfe\" },\n cancelled: { backgroundColor: \"#f9fafb\", color: \"#374151\", borderColor: \"#e5e7eb\" },\n mixed: { backgroundColor: \"#faf5ff\", color: \"#7e22ce\", borderColor: \"#e9d5ff\" },\n ready: { backgroundColor: \"#f0fdf4\", color: \"#15803d\", borderColor: \"#bbf7d0\" },\n error: { backgroundColor: \"#fef2f2\", color: \"#b91c1c\", borderColor: \"#fecaca\" },\n warning: { backgroundColor: \"#fff7ed\", color: \"#c2410c\", borderColor: \"#fed7aa\" },\n info: { backgroundColor: \"#eff6ff\", color: \"#1d4ed8\", borderColor: \"#bfdbfe\" },\n success: { backgroundColor: \"#f0fdf4\", color: \"#15803d\", borderColor: \"#bbf7d0\" },\n};\n\n// Keep class names for backwards compatibility with custom Badge components\nexport const STATUS_COLORS: Record<StatusType, string> = {\n pending: \"bg-yellow-50 text-yellow-700 border-yellow-200\",\n approved: \"bg-green-50 text-green-700 border-green-200\",\n rejected: \"bg-red-50 text-red-700 border-red-200\",\n committed: \"bg-blue-50 text-blue-700 border-blue-200\",\n cancelled: \"bg-gray-50 text-gray-700 border-gray-200\",\n mixed: \"bg-purple-50 text-purple-700 border-purple-200\",\n ready: \"bg-green-50 text-green-700 border-green-200\",\n error: \"bg-red-50 text-red-700 border-red-200\",\n warning: \"bg-orange-50 text-orange-700 border-orange-200\",\n info: \"bg-blue-50 text-blue-700 border-blue-200\",\n success: \"bg-green-50 text-green-700 border-green-200\",\n};\n\n/**\n * Default status icons\n */\nexport const STATUS_ICONS: Record<StatusType, React.ComponentType<{ style?: React.CSSProperties }>> = {\n pending: Clock,\n approved: CheckCircle2,\n rejected: XCircle,\n committed: Check,\n cancelled: Ban,\n mixed: AlertCircle,\n ready: CheckCircle2,\n error: XCircle,\n warning: AlertTriangle,\n info: Info,\n success: CheckCircle2,\n};\n\nexport interface StatusBadgeProps {\n /** Status type */\n status: StatusType | string;\n /** Custom label (defaults to capitalized status) */\n label?: string;\n /** Show icon */\n showIcon?: boolean;\n /** Custom icon override */\n icon?: React.ReactNode;\n /** Additional class name */\n className?: string;\n /** Custom status configurations for non-standard statuses */\n customStatuses?: Record<string, { colorClass?: string; style?: React.CSSProperties; icon?: React.ComponentType<{ style?: React.CSSProperties }> }>;\n /** Custom badge component */\n BadgeComponent?: React.ComponentType<{\n variant?: string;\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n }>;\n}\n\n/**\n * StatusBadge - Displays a colored badge based on status\n *\n * @example\n * ```tsx\n * <StatusBadge status=\"pending\" />\n * <StatusBadge status=\"approved\" showIcon />\n * <StatusBadge status=\"custom\" customStatuses={{ custom: { style: { backgroundColor: \"#fdf4ff\", color: \"#a21caf\" } } }} />\n * ```\n */\nexport function StatusBadge({\n status,\n label,\n showIcon = true,\n icon,\n className,\n customStatuses = {},\n BadgeComponent,\n}: StatusBadgeProps) {\n const normalizedStatus = status.toLowerCase() as StatusType;\n\n // Get style from built-in statuses or custom statuses\n const statusStyle =\n STATUS_STYLES[normalizedStatus] ||\n customStatuses[normalizedStatus]?.style ||\n STATUS_STYLES.info;\n\n // Get color class for custom Badge components\n const colorClass =\n STATUS_COLORS[normalizedStatus] ||\n customStatuses[normalizedStatus]?.colorClass ||\n STATUS_COLORS.info;\n\n // Get icon\n const IconComponent =\n STATUS_ICONS[normalizedStatus] ||\n customStatuses[normalizedStatus]?.icon ||\n Info;\n\n const displayLabel = label || status.charAt(0).toUpperCase() + status.slice(1);\n\n const iconStyle: React.CSSProperties = { height: \"0.75rem\", width: \"0.75rem\", marginRight: \"0.25rem\" };\n\n const badgeContent = (\n <>\n {showIcon && (\n icon || <IconComponent style={iconStyle} />\n )}\n {displayLabel}\n </>\n );\n\n // If custom badge component provided, use it\n if (BadgeComponent) {\n return (\n <BadgeComponent variant=\"outline\" className={className} style={statusStyle}>\n {badgeContent}\n </BadgeComponent>\n );\n }\n\n // Default badge implementation with inline styles\n const badgeStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n borderRadius: \"9999px\",\n border: \"1px solid\",\n padding: \"0.125rem 0.625rem\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n ...statusStyle,\n };\n\n return (\n <span style={badgeStyle} className={className}>\n {badgeContent}\n </span>\n );\n}\n\n/**\n * Helper to get status badge configuration\n */\nexport function getStatusConfig(status: string): StatusConfig {\n const normalizedStatus = status.toLowerCase() as StatusType;\n const Icon = STATUS_ICONS[normalizedStatus] || Info;\n\n return {\n label: status.charAt(0).toUpperCase() + status.slice(1),\n variant: STATUS_COLORS[normalizedStatus] ? normalizedStatus : \"info\",\n icon: <Icon style={{ height: \"0.75rem\", width: \"0.75rem\", marginRight: \"0.25rem\" }} />,\n };\n}\n","import React, { useState } from \"react\";\nimport {\n Eye,\n Upload,\n X,\n Check,\n Trash2,\n Pencil,\n Plus,\n Undo2,\n Code,\n Download,\n Settings,\n MoreHorizontal,\n} from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\n/**\n * Action button color presets (Tailwind classes for custom Button components)\n */\nexport const ACTION_COLORS = {\n view: \"text-cyan-600 dark:text-cyan-400\",\n review: \"text-cyan-600 dark:text-cyan-400\",\n approve: \"text-green-600 dark:text-green-400\",\n commit: \"text-green-600 dark:text-green-400\",\n reject: \"text-red-600 dark:text-red-400\",\n delete: \"text-red-600 dark:text-red-400\",\n cancel: \"text-red-600 dark:text-red-400\",\n revoke: \"text-orange-600 dark:text-orange-400\",\n edit: \"text-blue-600 dark:text-blue-400\",\n create: \"text-primary\",\n download: \"text-purple-600 dark:text-purple-400\",\n settings: \"text-gray-600 dark:text-gray-400\",\n default: \"\",\n} as const;\n\n/**\n * Action button inline color styles (for default button without Tailwind)\n */\nconst ACTION_INLINE_COLORS: Record<ActionType, { color: string; hoverBg: string }> = {\n view: { color: \"#0891b2\", hoverBg: \"#ecfeff\" },\n review: { color: \"#0891b2\", hoverBg: \"#ecfeff\" },\n approve: { color: \"#16a34a\", hoverBg: \"#dcfce7\" },\n commit: { color: \"#16a34a\", hoverBg: \"#dcfce7\" },\n reject: { color: \"#dc2626\", hoverBg: \"#fef2f2\" },\n delete: { color: \"#dc2626\", hoverBg: \"#fef2f2\" },\n cancel: { color: \"#dc2626\", hoverBg: \"#fef2f2\" },\n revoke: { color: \"#ea580c\", hoverBg: \"#fff7ed\" },\n edit: { color: \"#2563eb\", hoverBg: \"#eff6ff\" },\n create: { color: \"#6366f1\", hoverBg: \"#eef2ff\" },\n download: { color: \"#9333ea\", hoverBg: \"#faf5ff\" },\n settings: { color: \"#6b7280\", hoverBg: \"#f9fafb\" },\n default: { color: \"#6b7280\", hoverBg: \"#f9fafb\" },\n};\n\nexport type ActionType = keyof typeof ACTION_COLORS;\n\n/**\n * Default icons for action types\n */\nexport const ACTION_ICONS: Record<ActionType, React.ComponentType<{ className?: string }>> = {\n view: Eye,\n review: Eye,\n approve: Check,\n commit: Upload,\n reject: X,\n delete: Trash2,\n cancel: X,\n revoke: Undo2,\n edit: Pencil,\n create: Plus,\n download: Download,\n settings: Settings,\n default: MoreHorizontal,\n};\n\nexport interface ActionButtonProps {\n /** Action type for automatic styling */\n action?: ActionType;\n /** Click handler */\n onClick: () => void | Promise<void>;\n /** Custom icon override */\n icon?: React.ReactNode;\n /** Button label (for accessibility) */\n label?: string;\n /** Tooltip title */\n title?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Loading state */\n isLoading?: boolean;\n /** Custom color class override */\n colorClass?: string;\n /** Additional class name */\n className?: string;\n /** Button size */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Button variant */\n variant?: \"ghost\" | \"outline\" | \"default\";\n /** Custom button component */\n ButtonComponent?: React.ComponentType<{\n size?: string;\n variant?: string;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n className?: string;\n children: React.ReactNode;\n }>;\n}\n\n/**\n * ActionButton - Icon button with preset action types\n *\n * @example\n * ```tsx\n * <ActionButton action=\"view\" onClick={() => handleView(item)} title=\"View details\" />\n * <ActionButton action=\"delete\" onClick={() => handleDelete(item)} title=\"Delete item\" />\n * ```\n */\nexport function ActionButton({\n action = \"default\",\n onClick,\n icon,\n label,\n title,\n disabled = false,\n isLoading = false,\n colorClass,\n className,\n size = \"sm\",\n variant = \"ghost\",\n ButtonComponent,\n}: ActionButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n const IconComponent = ACTION_ICONS[action];\n const defaultColorClass = ACTION_COLORS[action];\n const inlineColors = ACTION_INLINE_COLORS[action];\n\n const iconSizeClass = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n }[size];\n\n const buttonSize = {\n sm: { height: \"2rem\", width: \"2rem\" },\n md: { height: \"2.25rem\", width: \"2.25rem\" },\n lg: { height: \"2.5rem\", width: \"2.5rem\" },\n }[size];\n\n const handleClick = async () => {\n if (disabled || isLoading) return;\n await onClick();\n };\n\n // Create icon element\n const iconElement = icon || <IconComponent className={iconSizeClass} />;\n\n // If custom button component provided, use it with Tailwind classes\n if (ButtonComponent) {\n return (\n <ButtonComponent\n size={size}\n variant={variant}\n onClick={handleClick}\n disabled={disabled || isLoading}\n title={title || label}\n className={cn(colorClass || defaultColorClass, className)}\n >\n {iconElement}\n </ButtonComponent>\n );\n }\n\n // Accessible label - use label prop, title, or action name\n const accessibleLabel = label || title || action.charAt(0).toUpperCase() + action.slice(1);\n\n // Default button implementation with inline styles\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n title={title || label}\n aria-label={accessibleLabel}\n aria-busy={isLoading}\n aria-disabled={disabled || isLoading}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"0.375rem\",\n fontWeight: 500,\n border: variant === \"outline\" ? \"1px solid #e5e7eb\" : \"none\",\n backgroundColor: isHovered ? inlineColors.hoverBg : (variant === \"default\" ? inlineColors.color : \"transparent\"),\n color: variant === \"default\" ? \"#ffffff\" : inlineColors.color,\n cursor: disabled || isLoading ? \"not-allowed\" : \"pointer\",\n opacity: disabled || isLoading ? 0.5 : 1,\n transition: \"all 0.15s ease\",\n ...buttonSize,\n }}\n className={className}\n >\n {iconElement}\n </button>\n );\n}\n\nexport interface ActionButtonGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * ActionButtonGroup - Container for action buttons\n */\nexport function ActionButtonGroup({ children, className }: ActionButtonGroupProps) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: \"0.25rem\"\n }}\n className={className}\n >\n {children}\n </div>\n );\n}\n","import React from \"react\";\nimport { FileX, Search, Inbox, FolderOpen } from \"lucide-react\";\nimport type { EmptyStateConfig } from \"../../types\";\n\nexport interface EmptyStateProps extends EmptyStateConfig {\n /** Additional class name */\n className?: string;\n /** Custom button component for action */\n ButtonComponent?: React.ComponentType<{\n onClick: () => void;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n }>;\n}\n\n/**\n * EmptyState - Displays when there's no data\n *\n * @example\n * ```tsx\n * <EmptyState\n * icon={<FileKey style={{ height: \"3rem\", width: \"3rem\" }} />}\n * title=\"No pending requests\"\n * description=\"New requests will appear here.\"\n * />\n * ```\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n ButtonComponent,\n}: EmptyStateProps) {\n const defaultIcon = <Inbox style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />;\n\n const containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"3rem 0\",\n textAlign: \"center\",\n };\n\n return (\n <div style={containerStyle} className={className} role=\"status\" aria-label={title}>\n <div style={{ marginBottom: \"1rem\", color: \"#6b7280\" }} aria-hidden=\"true\">\n {icon || defaultIcon}\n </div>\n <h3 style={{ fontWeight: 500, margin: 0 }}>{title}</h3>\n {description && (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", marginTop: \"0.25rem\", maxWidth: \"24rem\" }}>\n {description}\n </p>\n )}\n {action && ButtonComponent && (\n <ButtonComponent\n onClick={action.onClick}\n style={{ marginTop: \"1rem\" }}\n >\n {action.label}\n </ButtonComponent>\n )}\n {action && !ButtonComponent && (\n <button\n type=\"button\"\n onClick={action.onClick}\n style={{\n marginTop: \"1rem\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n height: \"2.5rem\",\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#3b82f6\",\n color: \"#ffffff\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n {action.label}\n </button>\n )}\n </div>\n );\n}\n\n/**\n * Preset empty states for common scenarios\n */\nexport function EmptyStateNoData({\n title = \"No data found\",\n description,\n ...props\n}: Partial<EmptyStateProps>) {\n return (\n <EmptyState\n icon={<Inbox style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />}\n title={title}\n description={description}\n {...props}\n />\n );\n}\n\nexport function EmptyStateNoResults({\n title = \"No results found\",\n description = \"Try adjusting your search or filters.\",\n ...props\n}: Partial<EmptyStateProps>) {\n return (\n <EmptyState\n icon={<Search style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />}\n title={title}\n description={description}\n {...props}\n />\n );\n}\n\nexport function EmptyStateNoFiles({\n title = \"No files found\",\n description,\n ...props\n}: Partial<EmptyStateProps>) {\n return (\n <EmptyState\n icon={<FolderOpen style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />}\n title={title}\n description={description}\n {...props}\n />\n );\n}\n","import React from \"react\";\n\nexport interface SkeletonProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Base Skeleton component with inline styles\n */\nexport function Skeleton({ className, style }: SkeletonProps) {\n const baseStyle: React.CSSProperties = {\n backgroundColor: \"#e5e7eb\",\n borderRadius: \"0.375rem\",\n animation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n ...style,\n };\n\n return <div style={baseStyle} className={className} />;\n}\n\nexport interface LoadingSkeletonProps {\n /** Number of skeleton rows */\n rows?: number;\n /** Type of skeleton layout */\n type?: \"table\" | \"card\" | \"list\";\n /** Additional class name */\n className?: string;\n /** Custom skeleton component */\n SkeletonComponent?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;\n}\n\n/**\n * LoadingSkeleton - Displays loading state with skeleton placeholders\n *\n * @example\n * ```tsx\n * <LoadingSkeleton rows={5} type=\"table\" />\n * ```\n */\nexport function LoadingSkeleton({\n rows = 3,\n type = \"table\",\n className,\n SkeletonComponent = Skeleton,\n}: LoadingSkeletonProps) {\n if (type === \"table\") {\n return (\n <div style={{ padding: \"1rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }} className={className} role=\"status\" aria-label=\"Loading content\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: \"1rem\" }}>\n <SkeletonComponent style={{ height: \"2.5rem\", width: \"2.5rem\", borderRadius: \"9999px\" }} />\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <SkeletonComponent style={{ height: \"1rem\", width: \"8rem\" }} />\n <SkeletonComponent style={{ height: \"0.75rem\", width: \"12rem\" }} />\n </div>\n <SkeletonComponent style={{ height: \"1.5rem\", width: \"4rem\" }} />\n </div>\n ))}\n </div>\n );\n }\n\n if (type === \"card\") {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }} className={className} role=\"status\" aria-label=\"Loading content\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.5rem\", padding: \"1rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\n <SkeletonComponent style={{ height: \"1.25rem\", width: \"75%\" }} />\n <SkeletonComponent style={{ height: \"1rem\", width: \"50%\" }} />\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <SkeletonComponent style={{ height: \"1.5rem\", width: \"4rem\" }} />\n <SkeletonComponent style={{ height: \"1.5rem\", width: \"5rem\" }} />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n // list type\n return (\n <div style={{ padding: \"1rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }} className={className} role=\"status\" aria-label=\"Loading content\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: \"1rem\" }}>\n <SkeletonComponent style={{ height: \"1rem\", width: \"10rem\" }} />\n <SkeletonComponent style={{ height: \"1rem\", width: \"7rem\" }} />\n <SkeletonComponent style={{ height: \"1rem\", width: \"10rem\" }} />\n <SkeletonComponent style={{ height: \"1rem\", width: \"11rem\" }} />\n </div>\n ))}\n </div>\n );\n}\n\n/**\n * TableRowSkeleton - Single skeleton row for tables\n */\nexport function TableRowSkeleton({\n columns = 4,\n className,\n SkeletonComponent = Skeleton,\n}: {\n columns?: number;\n className?: string;\n SkeletonComponent?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;\n}) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"1rem\", padding: \"0.75rem 1rem\" }} className={className}>\n {Array.from({ length: columns }).map((_, i) => (\n <SkeletonComponent\n key={i}\n style={{\n height: \"1rem\",\n width: i === 0 ? \"8rem\" : i === columns - 1 ? \"5rem\" : \"6rem\",\n }}\n />\n ))}\n </div>\n );\n}\n","import React from \"react\";\nimport { LoadingSkeleton } from \"../common/LoadingSkeleton\";\nimport { EmptyState } from \"../common/EmptyState\";\nimport type { BaseDataItem, ColumnDef, EmptyStateConfig } from \"../../types\";\n\nexport interface DataTableProps<T extends BaseDataItem> {\n /** Data items to display */\n data: T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Loading state */\n isLoading?: boolean;\n /** Row key getter (defaults to item.id) */\n getRowKey?: (item: T) => string;\n /** Row click handler */\n onRowClick?: (item: T) => void;\n /** Selected row IDs for highlighting */\n selectedIds?: string[];\n /** Empty state configuration */\n emptyState?: EmptyStateConfig;\n /** Additional class name */\n className?: string;\n /** Custom table components */\n components?: {\n Table?: React.ComponentType<{ children: React.ReactNode; className?: string; style?: React.CSSProperties }>;\n TableHeader?: React.ComponentType<{ children: React.ReactNode }>;\n TableBody?: React.ComponentType<{ children: React.ReactNode }>;\n TableRow?: React.ComponentType<{ children: React.ReactNode; className?: string; style?: React.CSSProperties; onClick?: () => void }>;\n TableHead?: React.ComponentType<{ children: React.ReactNode; className?: string; style?: React.CSSProperties }>;\n TableCell?: React.ComponentType<{ children: React.ReactNode; className?: string; style?: React.CSSProperties }>;\n Skeleton?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;\n };\n}\n\n/**\n * Alignment style mapping\n */\nconst ALIGN_STYLES: Record<string, React.CSSProperties> = {\n left: { textAlign: \"left\" },\n center: { textAlign: \"center\" },\n right: { textAlign: \"right\" },\n};\n\n/**\n * DataTable - Generic data table component\n *\n * @example\n * ```tsx\n * <DataTable\n * data={items}\n * columns={[\n * { key: 'name', header: 'Name', cell: (item) => item.name },\n * { key: 'status', header: 'Status', cell: (item) => <StatusBadge status={item.status} /> },\n * { key: 'actions', header: 'Actions', cell: (item) => <ActionButton action=\"view\" onClick={() => view(item)} /> },\n * ]}\n * isLoading={isLoading}\n * emptyState={{ title: 'No items', description: 'Create an item to get started.' }}\n * />\n * ```\n */\nexport function DataTable<T extends BaseDataItem>({\n data,\n columns,\n isLoading = false,\n getRowKey = (item) => item.id,\n onRowClick,\n selectedIds = [],\n emptyState = { title: \"No data found\" },\n className,\n components = {},\n}: DataTableProps<T>) {\n // Default components (can be overridden with shadcn/ui components)\n const Table = components.Table || DefaultTable;\n const TableHeader = components.TableHeader || DefaultTableHeader;\n const TableBody = components.TableBody || DefaultTableBody;\n const TableRow = components.TableRow || DefaultTableRow;\n const TableHead = components.TableHead || DefaultTableHead;\n const TableCell = components.TableCell || DefaultTableCell;\n const Skeleton = components.Skeleton;\n\n // Show loading skeleton\n if (isLoading && data.length === 0) {\n return <LoadingSkeleton rows={5} type=\"table\" SkeletonComponent={Skeleton} />;\n }\n\n // Show empty state\n if (!data || data.length === 0) {\n return <EmptyState {...emptyState} />;\n }\n\n return (\n <div style={{ overflowX: \"auto\" }} className={className}>\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={column.key}\n style={column.align ? ALIGN_STYLES[column.align] : undefined}\n >\n {column.header}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((item, index) => {\n const rowKey = getRowKey(item);\n const isSelected = selectedIds.includes(rowKey);\n\n return (\n <TableRow\n key={rowKey}\n onClick={onRowClick ? () => onRowClick(item) : undefined}\n style={{\n cursor: onRowClick ? \"pointer\" : undefined,\n backgroundColor: isSelected ? \"rgba(59, 130, 246, 0.05)\" : undefined,\n }}\n >\n {columns.map((column) => (\n <TableCell\n key={column.key}\n style={column.align ? ALIGN_STYLES[column.align] : undefined}\n >\n {column.cell(item, index)}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n );\n}\n\n// Default table component implementations with inline styles\nfunction DefaultTable({ children, className, style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return (\n <table style={{ width: \"100%\", fontSize: \"0.875rem\", borderCollapse: \"collapse\", ...style }} className={className}>\n {children}\n </table>\n );\n}\n\nfunction DefaultTableHeader({ children }: { children: React.ReactNode }) {\n return <thead>{children}</thead>;\n}\n\nfunction DefaultTableBody({ children }: { children: React.ReactNode }) {\n return <tbody>{children}</tbody>;\n}\n\nfunction DefaultTableRow({\n children,\n className,\n style,\n onClick,\n}: {\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}) {\n return (\n <tr\n style={{ borderBottom: \"1px solid #e5e7eb\", ...style }}\n className={className}\n onClick={onClick}\n >\n {children}\n </tr>\n );\n}\n\nfunction DefaultTableHead({ children, className, style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return (\n <th\n style={{\n height: \"3rem\",\n padding: \"0 1rem\",\n textAlign: \"left\",\n verticalAlign: \"middle\",\n fontWeight: 500,\n color: \"#6b7280\",\n ...style,\n }}\n className={className}\n >\n {children}\n </th>\n );\n}\n\nfunction DefaultTableCell({ children, className, style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return (\n <td style={{ padding: \"1rem\", verticalAlign: \"middle\", ...style }} className={className}>\n {children}\n </td>\n );\n}\n","import React, { useRef } from \"react\";\nimport { cn } from \"../../utils\";\nimport { DataTable, type DataTableProps } from \"./DataTable\";\nimport { usePagination, type UsePaginationOptions } from \"../../hooks/usePagination\";\nimport type { BaseDataItem } from \"../../types\";\n\nexport interface PaginatedTableProps<T extends BaseDataItem> extends Omit<DataTableProps<T>, 'data'> {\n /** Data items (all or paginated from server) */\n data: T[];\n /** Total items count (for server-side pagination) */\n totalItems?: number;\n /** Whether pagination is server-side */\n serverSide?: boolean;\n /** Current page (controlled) */\n page?: number;\n /** Page size (controlled) */\n pageSize?: number;\n /** Page change callback */\n onPageChange?: (page: number) => void;\n /** Page size change callback */\n onPageSizeChange?: (pageSize: number) => void;\n /** Whether to show pagination controls */\n showPagination?: boolean;\n /** Available page sizes */\n pageSizes?: number[];\n /** Whether to enable auto page size */\n autoPageSize?: boolean;\n /** Header content (rendered above table) */\n headerContent?: React.ReactNode;\n /** Custom components */\n components?: DataTableProps<T>['components'] & {\n Select?: React.ComponentType<{\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n }>;\n SelectTrigger?: React.ComponentType<{ className?: string; children: React.ReactNode }>;\n SelectValue?: React.ComponentType<Record<string, unknown>>;\n SelectContent?: React.ComponentType<{ children: React.ReactNode }>;\n SelectItem?: React.ComponentType<{ value: string; children: React.ReactNode }>;\n Button?: React.ComponentType<{\n size?: string;\n variant?: string;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n }>;\n };\n}\n\n/**\n * PaginatedTable - DataTable with built-in pagination\n *\n * @example\n * ```tsx\n * // Client-side pagination\n * <PaginatedTable\n * data={items}\n * columns={columns}\n * showPagination\n * />\n *\n * // Server-side pagination\n * <PaginatedTable\n * data={pageData}\n * columns={columns}\n * serverSide\n * totalItems={totalCount}\n * page={page}\n * pageSize={pageSize}\n * onPageChange={setPage}\n * onPageSizeChange={setPageSize}\n * />\n * ```\n */\nexport function PaginatedTable<T extends BaseDataItem>({\n data,\n totalItems,\n serverSide = false,\n page: controlledPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n showPagination = true,\n pageSizes = [25, 50, 100, 200],\n autoPageSize = false,\n headerContent,\n components = {},\n className,\n ...tableProps\n}: PaginatedTableProps<T>) {\n const viewportRef = useRef<HTMLDivElement>(null);\n\n // Use internal pagination hook for client-side pagination\n const pagination = usePagination({\n initialPage: controlledPage ?? 0,\n initialPageSize: controlledPageSize ?? 25,\n totalItems: serverSide ? totalItems : data.length,\n autoPageSize,\n viewportRef: autoPageSize ? viewportRef : undefined,\n onPageChange,\n onPageSizeChange,\n });\n\n // Use controlled values if provided\n const page = controlledPage ?? pagination.page;\n const pageSize = controlledPageSize ?? pagination.pageSize;\n\n // Compute visible data for client-side pagination\n const visibleData = serverSide\n ? data\n : data.slice(page * pageSize, (page + 1) * pageSize);\n\n const hasNextPage = serverSide\n ? data.length === pageSize\n : (page + 1) * pageSize < data.length;\n\n const canPrevPage = page > 0;\n\n // Components\n const Button = components.Button || DefaultButton;\n const Select = components.Select;\n const SelectTrigger = components.SelectTrigger;\n const SelectValue = components.SelectValue;\n const SelectContent = components.SelectContent;\n const SelectItem = components.SelectItem;\n\n const hasSelectComponents = Select && SelectTrigger && SelectValue && SelectContent && SelectItem;\n\n return (\n <div className={cn(\"flex flex-col\", className)}>\n {/* Pagination Header */}\n {showPagination && (\n <div className=\"flex items-center justify-between gap-2 px-3 sm:px-4 py-2 sm:py-3 border-b border-border\">\n <div className=\"text-xs sm:text-sm text-muted-foreground\">\n Page <span className=\"font-medium text-foreground\">{page + 1}</span>\n </div>\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {/* Page Size Selector */}\n {hasSelectComponents && (\n <div className=\"hidden sm:flex items-center gap-2 text-sm text-muted-foreground\">\n Page size\n <Select\n value={pagination.pageSizeSelectValue}\n onValueChange={pagination.onPageSizeSelect}\n >\n <SelectTrigger className=\"h-8 w-[92px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {autoPageSize && <SelectItem value=\"auto\">Auto</SelectItem>}\n {pageSizes.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Page Navigation */}\n <div className=\"flex items-center gap-1 sm:gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n const newPage = Math.max(0, page - 1);\n if (onPageChange) onPageChange(newPage);\n else pagination.setPage(newPage);\n }}\n disabled={!canPrevPage}\n className=\"px-2 sm:px-3\"\n >\n <span className=\"hidden sm:inline\">Previous</span>\n <span className=\"sm:hidden\">Prev</span>\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n const newPage = page + 1;\n if (onPageChange) onPageChange(newPage);\n else pagination.setPage(newPage);\n }}\n disabled={!hasNextPage}\n className=\"px-2 sm:px-3\"\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Header Content */}\n {headerContent}\n\n {/* Table */}\n <div\n ref={viewportRef}\n className={cn(\n autoPageSize && \"h-[max(200px,calc(100vh-480px))] sm:h-[max(240px,calc(100vh-420px))] md:h-[max(320px,calc(100vh-360px))] overflow-auto\"\n )}\n >\n <DataTable\n {...tableProps}\n data={visibleData}\n components={components}\n />\n </div>\n </div>\n );\n}\n\n// Default button\nfunction DefaultButton({\n children,\n className,\n disabled,\n onClick,\n}: {\n size?: string;\n variant?: string;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium\",\n \"h-8 px-3\",\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n >\n {children}\n </button>\n );\n}\n","import React from \"react\";\nimport type { TabDef } from \"../../types\";\n\nexport interface TabsViewProps {\n /** Tab definitions */\n tabs: TabDef[];\n /** Currently active tab key */\n activeTab: string;\n /** Tab change callback */\n onTabChange: (tabKey: string) => void;\n /** Additional class name */\n className?: string;\n /** Tab list class name */\n tabListClassName?: string;\n /** Custom components */\n components?: {\n Tabs?: React.ComponentType<{\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n }>;\n TabsList?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n TabsTrigger?: React.ComponentType<{\n value: string;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n }>;\n TabsContent?: React.ComponentType<{\n value: string;\n className?: string;\n children: React.ReactNode;\n }>;\n Badge?: React.ComponentType<{\n variant?: string;\n className?: string;\n children: React.ReactNode;\n }>;\n };\n}\n\n/**\n * TabsView - Generic tabbed view component\n *\n * @example\n * ```tsx\n * <TabsView\n * tabs={[\n * { key: 'access', label: 'Access', badge: 5, content: <AccessTab /> },\n * { key: 'roles', label: 'Roles', badge: 2, content: <RolesTab /> },\n * { key: 'policies', label: 'Policies', content: <PoliciesTab /> },\n * ]}\n * activeTab={activeTab}\n * onTabChange={setActiveTab}\n * />\n * ```\n */\nexport function TabsView({\n tabs,\n activeTab,\n onTabChange,\n className,\n tabListClassName,\n components = {},\n}: TabsViewProps) {\n // Use custom components or defaults\n const Tabs = components.Tabs || DefaultTabs;\n const TabsList = components.TabsList || DefaultTabsList;\n const TabsTrigger = components.TabsTrigger || DefaultTabsTrigger;\n const TabsContent = components.TabsContent || DefaultTabsContent;\n const Badge = components.Badge || DefaultBadge;\n\n return (\n <Tabs value={activeTab} onValueChange={onTabChange} className={className}>\n <TabsList className={tabListClassName}>\n {tabs.map((tab) => (\n <TabsTrigger\n key={tab.key}\n value={tab.key}\n disabled={tab.disabled}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n {tab.icon}\n {tab.label}\n {tab.badge !== undefined && tab.badge !== null && tab.badge > 0 && (\n <Badge\n variant={tab.badgeVariant || \"destructive\"}\n >\n {tab.badge > 99 ? \"99+\" : tab.badge}\n </Badge>\n )}\n </span>\n </TabsTrigger>\n ))}\n </TabsList>\n\n {tabs.map((tab) => (\n <TabsContent key={tab.key} value={tab.key}>\n {tab.content}\n </TabsContent>\n ))}\n </Tabs>\n );\n}\n\n// Default component implementations\nfunction DefaultTabs({\n value,\n onValueChange,\n children,\n className,\n}: {\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={className} data-value={value}>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child as React.ReactElement<any>, {\n activeTab: value,\n onTabChange: onValueChange,\n });\n }\n return child;\n })}\n </div>\n );\n}\n\nfunction DefaultTabsList({\n children,\n className,\n activeTab,\n onTabChange,\n}: {\n children: React.ReactNode;\n className?: string;\n activeTab?: string;\n onTabChange?: (value: string) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"stretch\",\n borderBottom: \"1px solid #e5e7eb\",\n backgroundColor: \"#f9fafb\",\n padding: \"0 1rem\",\n gap: \"0\",\n }}\n className={className}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child as React.ReactElement<any>, {\n activeTab,\n onTabChange,\n });\n }\n return child;\n })}\n </div>\n );\n}\n\nfunction DefaultTabsTrigger({\n value,\n disabled,\n className,\n children,\n activeTab,\n onTabChange,\n}: {\n value: string;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n activeTab?: string;\n onTabChange?: (value: string) => void;\n}) {\n const isActive = activeTab === value;\n\n const baseStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n whiteSpace: \"nowrap\",\n padding: \"0.75rem 1rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n transition: \"all 150ms ease\",\n border: \"none\",\n borderBottom: isActive ? \"2px solid #1f2937\" : \"2px solid transparent\",\n marginBottom: \"-1px\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n backgroundColor: isActive ? \"#ffffff\" : \"transparent\",\n color: isActive ? \"#111827\" : \"#6b7280\",\n };\n\n return (\n <button\n type=\"button\"\n onClick={() => onTabChange?.(value)}\n disabled={disabled}\n style={baseStyle}\n className={className}\n >\n {children}\n </button>\n );\n}\n\nfunction DefaultTabsContent({\n value,\n className,\n children,\n activeTab,\n}: {\n value: string;\n className?: string;\n children: React.ReactNode;\n activeTab?: string;\n}) {\n if (activeTab !== value) return null;\n\n return (\n <div\n style={{ marginTop: 0 }}\n className={className}\n >\n {children}\n </div>\n );\n}\n\nfunction DefaultBadge({\n variant,\n className,\n children,\n}: {\n variant?: string;\n className?: string;\n children: React.ReactNode;\n}) {\n const getVariantStyles = (): React.CSSProperties => {\n switch (variant) {\n case \"destructive\":\n return {\n backgroundColor: \"#dc2626\",\n color: \"#ffffff\",\n borderColor: \"transparent\",\n };\n case \"secondary\":\n return {\n backgroundColor: \"#f3f4f6\",\n color: \"#374151\",\n borderColor: \"transparent\",\n };\n case \"outline\":\n return {\n backgroundColor: \"transparent\",\n color: \"#111827\",\n borderColor: \"#e5e7eb\",\n };\n default:\n return {\n backgroundColor: \"#3b82f6\",\n color: \"#ffffff\",\n borderColor: \"transparent\",\n };\n }\n };\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n border: \"1px solid\",\n padding: \"0 0.5rem\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n height: \"1.25rem\",\n minWidth: \"1.25rem\",\n marginLeft: \"0.25rem\",\n ...getVariantStyles(),\n }}\n className={className}\n >\n {children}\n </span>\n );\n}\n","import React from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { DetailField, BaseDataItem } from \"../../types\";\n\nexport interface DetailDialogProps<T extends BaseDataItem> {\n /** Whether dialog is open */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Item to display */\n item: T | null;\n /** Dialog title */\n title: string;\n /** Dialog description */\n description?: string;\n /** Field definitions */\n fields: DetailField<T>[];\n /** Footer content (actions) */\n footer?: React.ReactNode;\n /** Additional content after fields */\n children?: React.ReactNode;\n /** Dialog size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n /** Additional class name */\n className?: string;\n /** Custom components */\n components?: {\n Dialog?: React.ComponentType<{\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: React.ReactNode;\n }>;\n DialogContent?: React.ComponentType<{\n className?: string;\n children: React.ReactNode;\n }>;\n DialogHeader?: React.ComponentType<{ children: React.ReactNode }>;\n DialogTitle?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n DialogDescription?: React.ComponentType<{ children: React.ReactNode }>;\n DialogFooter?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n };\n}\n\nconst SIZE_CLASSES = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n full: \"max-w-4xl\",\n};\n\n/**\n * DetailDialog - Dialog for displaying item details\n *\n * @example\n * ```tsx\n * <DetailDialog\n * open={!!selectedItem}\n * onClose={() => setSelectedItem(null)}\n * item={selectedItem}\n * title=\"Policy Details\"\n * fields={[\n * { key: 'role', label: 'Role', render: (item) => item.roleId },\n * { key: 'status', label: 'Status', render: (item) => <StatusBadge status={item.status} /> },\n * ]}\n * footer={<Button onClick={() => handleApprove()}>Approve</Button>}\n * />\n * ```\n */\nexport function DetailDialog<T extends BaseDataItem>({\n open,\n onClose,\n item,\n title,\n description,\n fields,\n footer,\n children,\n size = \"lg\",\n className,\n components = {},\n}: DetailDialogProps<T>) {\n // Use custom components or defaults\n const Dialog = components.Dialog || DefaultDialog;\n const DialogContent = components.DialogContent || DefaultDialogContent;\n const DialogHeader = components.DialogHeader || DefaultDialogHeader;\n const DialogTitle = components.DialogTitle || DefaultDialogTitle;\n const DialogDescription = components.DialogDescription || DefaultDialogDescription;\n const DialogFooter = components.DialogFooter || DefaultDialogFooter;\n\n if (!item) return null;\n\n // Filter visible fields\n const visibleFields = fields.filter(\n (field) => !field.hidden || !field.hidden(item)\n );\n\n return (\n <Dialog open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <DialogContent className={cn(SIZE_CLASSES[size], \"max-h-[90vh] overflow-y-auto\", className)}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n\n <div className=\"space-y-4\">\n {/* Fields Grid */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm\">\n {visibleFields.map((field) => (\n <div\n key={field.key}\n className={field.fullWidth ? \"col-span-2\" : \"\"}\n >\n <p className=\"text-muted-foreground\">{field.label}</p>\n <div className=\"font-medium mt-1\">{field.render(item)}</div>\n </div>\n ))}\n </div>\n\n {/* Additional content */}\n {children}\n </div>\n\n {/* Footer */}\n {footer && <DialogFooter>{footer}</DialogFooter>}\n </DialogContent>\n </Dialog>\n );\n}\n\n// Default dialog components\nfunction DefaultDialog({\n open,\n onOpenChange,\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: React.ReactNode;\n}) {\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/80\"\n onClick={() => onOpenChange(false)}\n />\n {/* Content container */}\n <div className=\"fixed inset-0 flex items-center justify-center p-4\">\n {children}\n </div>\n </div>\n );\n}\n\nfunction DefaultDialogContent({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n className={cn(\n \"relative z-50 grid w-full gap-4 border bg-background p-6 shadow-lg\",\n \"duration-200 sm:rounded-lg\",\n className\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n );\n}\n\nfunction DefaultDialogHeader({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col space-y-1.5 text-center sm:text-left\">\n {children}\n </div>\n );\n}\n\nfunction DefaultDialogTitle({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <h2\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n >\n {children}\n </h2>\n );\n}\n\nfunction DefaultDialogDescription({ children }: { children: React.ReactNode }) {\n return <p className=\"text-sm text-muted-foreground\">{children}</p>;\n}\n\nfunction DefaultDialogFooter({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface ConfirmDialogProps {\n /** Whether dialog is open */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Confirm handler */\n onConfirm: () => void | Promise<void>;\n /** Dialog title */\n title: string;\n /** Dialog description */\n description: string;\n /** Confirm button label */\n confirmLabel?: string;\n /** Cancel button label */\n cancelLabel?: string;\n /** Confirm button variant */\n confirmVariant?: \"default\" | \"destructive\";\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom components */\n components?: {\n AlertDialog?: React.ComponentType<{\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: React.ReactNode;\n }>;\n AlertDialogContent?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogHeader?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogTitle?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogDescription?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogFooter?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogAction?: React.ComponentType<{\n onClick: () => void;\n className?: string;\n style?: React.CSSProperties;\n disabled?: boolean;\n children: React.ReactNode;\n }>;\n AlertDialogCancel?: React.ComponentType<{\n onClick?: () => void;\n children: React.ReactNode;\n }>;\n };\n}\n\n/**\n * ConfirmDialog - Confirmation dialog for destructive actions\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * open={showDelete}\n * onClose={() => setShowDelete(false)}\n * onConfirm={handleDelete}\n * title=\"Delete Item\"\n * description=\"Are you sure? This action cannot be undone.\"\n * confirmLabel=\"Delete\"\n * confirmVariant=\"destructive\"\n * isLoading={isDeleting}\n * />\n * ```\n */\nexport function ConfirmDialog({\n open,\n onClose,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n confirmVariant = \"default\",\n isLoading = false,\n className,\n components = {},\n}: ConfirmDialogProps) {\n const AlertDialog = components.AlertDialog || DefaultAlertDialog;\n const AlertDialogContent = components.AlertDialogContent || DefaultAlertDialogContent;\n const AlertDialogHeader = components.AlertDialogHeader || DefaultAlertDialogHeader;\n const AlertDialogTitle = components.AlertDialogTitle || DefaultAlertDialogTitle;\n const AlertDialogDescription = components.AlertDialogDescription || DefaultAlertDialogDescription;\n const AlertDialogFooter = components.AlertDialogFooter || DefaultAlertDialogFooter;\n const AlertDialogAction = components.AlertDialogAction || DefaultAlertDialogAction;\n const AlertDialogCancel = components.AlertDialogCancel || DefaultAlertDialogCancel;\n\n const handleConfirm = async () => {\n await onConfirm();\n onClose();\n };\n\n const destructiveStyle: React.CSSProperties = confirmVariant === \"destructive\"\n ? { backgroundColor: \"#ef4444\", color: \"#ffffff\" }\n : {};\n\n return (\n <AlertDialog open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={onClose}>{cancelLabel}</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleConfirm}\n disabled={isLoading}\n style={destructiveStyle}\n >\n {isLoading ? \"Processing...\" : confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n\n// Default alert dialog components with inline styles\nfunction DefaultAlertDialog({\n open,\n onOpenChange,\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: React.ReactNode;\n}) {\n if (!open) return null;\n\n return (\n <div style={{ position: \"fixed\", inset: 0, zIndex: 50 }} role=\"presentation\">\n <div\n style={{ position: \"fixed\", inset: 0, backgroundColor: \"rgba(0, 0, 0, 0.8)\" }}\n onClick={() => onOpenChange(false)}\n aria-hidden=\"true\"\n />\n <div style={{ position: \"fixed\", inset: 0, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"1rem\" }}>\n {children}\n </div>\n </div>\n );\n}\n\nfunction DefaultAlertDialogContent({ children }: { children: React.ReactNode }) {\n return (\n <div\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"alert-dialog-title\"\n aria-describedby=\"alert-dialog-description\"\n style={{\n position: \"relative\",\n zIndex: 50,\n display: \"grid\",\n width: \"100%\",\n maxWidth: \"32rem\",\n gap: \"1rem\",\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n padding: \"1.5rem\",\n boxShadow: \"0 10px 15px -3px rgba(0, 0, 0, 0.1)\",\n borderRadius: \"0.5rem\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n );\n}\n\nfunction DefaultAlertDialogHeader({ children }: { children: React.ReactNode }) {\n return <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>{children}</div>;\n}\n\nfunction DefaultAlertDialogTitle({ children }: { children: React.ReactNode }) {\n return <h2 id=\"alert-dialog-title\" style={{ fontSize: \"1.125rem\", fontWeight: 600, margin: 0 }}>{children}</h2>;\n}\n\nfunction DefaultAlertDialogDescription({ children }: { children: React.ReactNode }) {\n return <p id=\"alert-dialog-description\" style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: 0 }}>{children}</p>;\n}\n\nfunction DefaultAlertDialogFooter({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}>\n {children}\n </div>\n );\n}\n\nfunction DefaultAlertDialogAction({\n onClick,\n className,\n style,\n disabled,\n children,\n}: {\n onClick: () => void;\n className?: string;\n style?: React.CSSProperties;\n disabled?: boolean;\n children: React.ReactNode;\n}) {\n const baseStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n height: \"2.5rem\",\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#3b82f6\",\n color: \"#ffffff\",\n border: \"none\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n ...style,\n };\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n style={baseStyle}\n className={className}\n >\n {children}\n </button>\n );\n}\n\nfunction DefaultAlertDialogCancel({\n onClick,\n children,\n}: {\n onClick?: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n height: \"2.5rem\",\n padding: \"0.5rem 1rem\",\n border: \"1px solid #e5e7eb\",\n backgroundColor: \"#ffffff\",\n cursor: \"pointer\",\n }}\n >\n {children}\n </button>\n );\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport interface CollapsibleSectionProps {\n /** Trigger/header content */\n trigger: React.ReactNode;\n /** Collapsible content */\n children: React.ReactNode;\n /** Default open state */\n defaultOpen?: boolean;\n /** Controlled open state */\n open?: boolean;\n /** Open state change handler */\n onOpenChange?: (open: boolean) => void;\n /** Icon to show when collapsed */\n collapsedIcon?: React.ReactNode;\n /** Icon to show when expanded */\n expandedIcon?: React.ReactNode;\n /** Additional class name */\n className?: string;\n /** Trigger class name */\n triggerClassName?: string;\n /** Content class name */\n contentClassName?: string;\n /** Custom components */\n components?: {\n Collapsible?: React.ComponentType<{\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: React.ReactNode;\n }>;\n CollapsibleTrigger?: React.ComponentType<{\n asChild?: boolean;\n children: React.ReactNode;\n }>;\n CollapsibleContent?: React.ComponentType<{\n children: React.ReactNode;\n className?: string;\n }>;\n Button?: React.ComponentType<{\n variant?: string;\n size?: string;\n className?: string;\n children: React.ReactNode;\n onClick?: () => void;\n }>;\n };\n}\n\n/**\n * CollapsibleSection - Expandable content section\n *\n * @example\n * ```tsx\n * <CollapsibleSection\n * trigger={<><Code className=\"h-4 w-4\" /> View Code</>}\n * defaultOpen={false}\n * >\n * <pre className=\"p-3 text-xs font-mono\">{code}</pre>\n * </CollapsibleSection>\n * ```\n */\nexport function CollapsibleSection({\n trigger,\n children,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n collapsedIcon,\n expandedIcon,\n className,\n triggerClassName,\n contentClassName,\n components = {},\n}: CollapsibleSectionProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const handleOpenChange = (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n };\n\n // Custom components\n const Collapsible = components.Collapsible;\n const CollapsibleTrigger = components.CollapsibleTrigger;\n const CollapsibleContent = components.CollapsibleContent;\n const Button = components.Button;\n\n // Use custom Radix-style components if all are provided\n if (Collapsible && CollapsibleTrigger && CollapsibleContent && Button) {\n return (\n <Collapsible open={isOpen} onOpenChange={handleOpenChange}>\n <CollapsibleTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\"w-full justify-start gap-2 text-muted-foreground hover:text-foreground\", triggerClassName)}\n >\n {isOpen\n ? (expandedIcon || <ChevronDown className=\"h-4 w-4\" />)\n : (collapsedIcon || <ChevronRight className=\"h-4 w-4\" />)\n }\n {trigger}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className={contentClassName}>\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n }\n\n // Default implementation\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={() => handleOpenChange(!isOpen)}\n className={cn(\n \"flex w-full items-center justify-start gap-2 rounded-md px-3 py-2 text-sm\",\n \"text-muted-foreground hover:text-foreground hover:bg-accent\",\n triggerClassName\n )}\n >\n {isOpen\n ? (expandedIcon || <ChevronDown className=\"h-4 w-4\" />)\n : (collapsedIcon || <ChevronRight className=\"h-4 w-4\" />)\n }\n {trigger}\n </button>\n {isOpen && (\n <div className={cn(\"mt-2\", contentClassName)}>\n {children}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * CodePreview - Pre-styled collapsible code section\n */\nexport function CodePreview({\n code,\n language = \"text\",\n label = \"View Code\",\n icon,\n maxHeight = \"300px\",\n className,\n ...props\n}: {\n code: string;\n language?: string;\n label?: string;\n icon?: React.ReactNode;\n maxHeight?: string;\n className?: string;\n} & Omit<CollapsibleSectionProps, 'trigger' | 'children'>) {\n return (\n <CollapsibleSection\n trigger={\n <>\n {icon}\n {label}\n </>\n }\n contentClassName={cn(\"mt-2 border rounded-lg bg-muted/50\", className)}\n {...props}\n >\n <pre\n className=\"p-3 text-xs font-mono overflow-x-auto overflow-y-auto whitespace-pre-wrap\"\n style={{ maxHeight }}\n >\n {code}\n </pre>\n </CollapsibleSection>\n );\n}\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport { CheckSquare, User, Shield, FileKey, Eye, Upload, X, Undo2, Check, Clock, CheckCircle2, XCircle, Trash2 } from \"lucide-react\";\nimport { formatTimestamp, delay } from \"../../../utils\";\nimport { useAutoRefresh } from \"../../../hooks/useAutoRefresh\";\nimport { useSelection } from \"../../../hooks/useSelection\";\nimport { RefreshButton } from \"../../common/RefreshButton\";\nimport { StatusBadge } from \"../../common/StatusBadge\";\nimport { ActionButton, ActionButtonGroup } from \"../../common/ActionButton\";\nimport { LoadingSkeleton } from \"../../common/LoadingSkeleton\";\nimport { EmptyState } from \"../../common/EmptyState\";\nimport { TabsView } from \"../../tabs/TabsView\";\nimport { DataTable } from \"../../data-table/DataTable\";\nimport { DetailDialog } from \"../../dialogs/DetailDialog\";\nimport { defaultComponents } from \"../../ui\";\nimport type { BaseDataItem, ColumnDef, DetailField, ChangeSetRequest, ToastConfig } from \"../../../types\";\n\nexport interface BaseApprovalItem extends BaseDataItem {\n status: string;\n timestamp: string | number;\n retrievalInfo?: ChangeSetRequest;\n}\n\nexport interface AccessApprovalItem extends BaseApprovalItem {\n username: string;\n role: string;\n clientId: string;\n commitReady: boolean;\n decisionMade: boolean;\n rejectionFound?: boolean;\n}\n\nexport interface RoleApprovalItem extends BaseApprovalItem {\n role: string;\n compositeRole?: string;\n clientId: string;\n requestType: string;\n requestedBy: string;\n}\n\nexport interface PolicyApprovalItem extends BaseApprovalItem {\n roleId: string;\n requestedBy: string;\n requestedByEmail?: string;\n threshold: number;\n approvalCount: number;\n rejectionCount?: number;\n commitReady?: boolean;\n approvedBy?: string[];\n deniedBy?: string[];\n policyRequestData: string;\n contractCode?: string;\n}\n\nexport interface ApprovalDecision {\n decidedBy: string;\n decidedByEmail?: string;\n decision: \"approved\" | \"rejected\";\n timestamp: string | number;\n}\n\nexport interface ApprovalTabConfig<T extends BaseApprovalItem> {\n key: string;\n label: string;\n icon?: React.ReactNode;\n /** Data fetcher */\n fetchData: () => Promise<T[]>;\n /** Column definitions for the table */\n columns: ColumnDef<T>[];\n /** Empty state configuration */\n emptyState: {\n icon: React.ReactNode;\n title: string;\n description: string;\n };\n /** Action handlers */\n actions: {\n onReview?: (item: T) => Promise<void>;\n onCommit?: (item: T) => Promise<void>;\n onCancel?: (item: T) => Promise<void>;\n onRevoke?: (item: T) => Promise<void>;\n onView?: (item: T) => void;\n onDelete?: (item: T) => Promise<void>;\n };\n /** Check if item is ready to commit */\n canCommit?: (item: T) => boolean;\n /** Check if user has made a decision */\n hasUserDecided?: (item: T) => boolean;\n /** Query keys for cache invalidation */\n queryKeys?: string[];\n}\n\nexport interface ApprovalsPageBaseProps<\n TAccess extends AccessApprovalItem = AccessApprovalItem,\n TRole extends RoleApprovalItem = RoleApprovalItem,\n TPolicy extends PolicyApprovalItem = PolicyApprovalItem\n> {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Tab configurations for default tabs */\n tabs: {\n access?: ApprovalTabConfig<TAccess>;\n roles?: ApprovalTabConfig<TRole>;\n policies?: ApprovalTabConfig<TPolicy>;\n };\n /** Additional custom tabs */\n additionalTabs?: ApprovalTabConfig<any>[];\n /** Initial active tab (can be any tab key) */\n initialTab?: string;\n /** Toast notification handler */\n toast?: (config: ToastConfig) => void;\n /** Auto-refresh interval in seconds */\n refreshInterval?: number;\n /** Query invalidation handler */\n invalidateQueries?: (queryKeys: string[]) => void;\n /** Current user ID (for checking decisions) */\n currentUserId?: string;\n /** Custom components */\n components?: {\n Card?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n CardContent?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n Button?: React.ComponentType<any>;\n Badge?: React.ComponentType<any>;\n Skeleton?: React.ComponentType<{ className?: string }>;\n // Table components\n Table?: React.ComponentType<any>;\n TableHeader?: React.ComponentType<any>;\n TableBody?: React.ComponentType<any>;\n TableRow?: React.ComponentType<any>;\n TableHead?: React.ComponentType<any>;\n TableCell?: React.ComponentType<any>;\n // Tabs components\n Tabs?: React.ComponentType<any>;\n TabsList?: React.ComponentType<any>;\n TabsTrigger?: React.ComponentType<any>;\n TabsContent?: React.ComponentType<any>;\n // Dialog components\n Dialog?: React.ComponentType<any>;\n DialogContent?: React.ComponentType<any>;\n DialogHeader?: React.ComponentType<any>;\n DialogTitle?: React.ComponentType<any>;\n DialogDescription?: React.ComponentType<any>;\n DialogFooter?: React.ComponentType<any>;\n };\n /** Additional class name */\n className?: string;\n /** Optional help text shown below description */\n helpText?: React.ReactNode;\n}\n\n// ============================================================================\n// GENERIC APPROVAL TAB COMPONENT\n// ============================================================================\n\ninterface ApprovalTabProps<T extends BaseApprovalItem> {\n config: ApprovalTabConfig<T>;\n refreshInterval: number;\n toast?: (config: ToastConfig) => void;\n invalidateQueries?: (queryKeys: string[]) => void;\n currentUserId?: string;\n components?: ApprovalsPageBaseProps['components'];\n /** Trigger to force refresh from parent */\n refreshTrigger?: number;\n /** Callback to report loading state to parent */\n onLoadingChange?: (isLoading: boolean) => void;\n /** Callback to report seconds remaining to parent */\n onSecondsRemainingChange?: (seconds: number) => void;\n}\n\nfunction ApprovalTab<T extends BaseApprovalItem>({\n config,\n refreshInterval,\n toast,\n invalidateQueries,\n currentUserId,\n components = {},\n refreshTrigger,\n onLoadingChange,\n onSecondsRemainingChange,\n}: ApprovalTabProps<T>) {\n const [data, setData] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n\n const fetchData = useCallback(async () => {\n setIsLoading(true);\n onLoadingChange?.(true);\n try {\n const result = await config.fetchData();\n setData(result);\n if (invalidateQueries && config.queryKeys) {\n invalidateQueries(config.queryKeys);\n }\n } catch (error) {\n console.error(`Error fetching ${config.key} approvals:`, error);\n toast?.({\n title: `Failed to fetch ${config.label.toLowerCase()}`,\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoading(false);\n onLoadingChange?.(false);\n }\n }, [config, invalidateQueries, toast, onLoadingChange]);\n\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: fetchData,\n isBlocked: isLoading || isProcessing,\n });\n\n // Report seconds remaining to parent\n useEffect(() => {\n if (secondsRemaining !== null) {\n onSecondsRemainingChange?.(secondsRemaining);\n }\n }, [secondsRemaining, onSecondsRemainingChange]);\n\n useEffect(() => {\n void refreshNow();\n }, [refreshNow]);\n\n // Trigger refresh when refreshTrigger changes from parent\n useEffect(() => {\n if (refreshTrigger && refreshTrigger > 0) {\n void refreshNow();\n }\n }, [refreshTrigger, refreshNow]);\n\n const handleAction = async (\n action: ((item: T) => Promise<void>) | undefined,\n item: T,\n successMessage: string\n ) => {\n if (!action) return;\n setIsProcessing(true);\n try {\n await action(item);\n toast?.({ title: successMessage });\n await delay(500);\n await refreshNow();\n } catch (error) {\n console.error(\"Action error:\", error);\n toast?.({\n title: \"Action failed\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsProcessing(false);\n }\n };\n\n // Add actions column to config columns\n const columnsWithActions: ColumnDef<T>[] = [\n ...config.columns,\n {\n key: \"actions\",\n header: \"Actions\",\n align: \"right\",\n cell: (item) => {\n const canCommit = config.canCommit?.(item) ?? false;\n const hasDecided = config.hasUserDecided?.(item) ?? false;\n\n return (\n <ActionButtonGroup>\n {/* Review button */}\n {config.actions.onReview && !hasDecided && (\n <ActionButton\n action={canCommit ? \"commit\" : \"review\"}\n onClick={() => handleAction(\n canCommit ? config.actions.onCommit : config.actions.onReview,\n item,\n canCommit ? \"Committed successfully\" : \"Reviewed successfully\"\n )}\n title={canCommit ? \"Commit change\" : \"Review request\"}\n disabled={isProcessing}\n ButtonComponent={components.Button}\n />\n )}\n\n {/* Revoke button (shown if user has decided) */}\n {config.actions.onRevoke && hasDecided && (\n <ActionButton\n action=\"revoke\"\n onClick={() => handleAction(config.actions.onRevoke, item, \"Decision revoked\")}\n title=\"Revoke your decision\"\n disabled={isProcessing}\n ButtonComponent={components.Button}\n />\n )}\n\n {/* Commit button (if ready and separate from review) */}\n {config.actions.onCommit && canCommit && !config.actions.onReview && (\n <ActionButton\n action=\"commit\"\n onClick={() => handleAction(config.actions.onCommit, item, \"Committed successfully\")}\n title=\"Commit change\"\n disabled={isProcessing}\n ButtonComponent={components.Button}\n />\n )}\n\n {/* View button */}\n {config.actions.onView && (\n <ActionButton\n action=\"view\"\n onClick={() => config.actions.onView!(item)}\n title=\"View details\"\n ButtonComponent={components.Button}\n />\n )}\n\n {/* Cancel/Delete button */}\n {config.actions.onCancel && (\n <ActionButton\n action=\"cancel\"\n onClick={() => handleAction(config.actions.onCancel, item, \"Cancelled successfully\")}\n title=\"Cancel request\"\n disabled={isProcessing}\n ButtonComponent={components.Button}\n />\n )}\n {config.actions.onDelete && (\n <ActionButton\n action=\"delete\"\n onClick={() => handleAction(config.actions.onDelete, item, \"Deleted successfully\")}\n title=\"Delete request\"\n disabled={isProcessing}\n ButtonComponent={components.Button}\n />\n )}\n </ActionButtonGroup>\n );\n },\n },\n ];\n\n // Loading state\n if (isLoading && data.length === 0) {\n return (\n <div style={{ padding: \"1rem\" }}>\n <LoadingSkeleton rows={3} type=\"table\" SkeletonComponent={components.Skeleton} />\n </div>\n );\n }\n\n // Empty state\n if (!data || data.length === 0) {\n return (\n <div style={{ padding: \"1rem\" }}>\n <EmptyState\n icon={config.emptyState.icon}\n title={config.emptyState.title}\n description={config.emptyState.description}\n />\n </div>\n );\n }\n\n // Table view\n return (\n <DataTable\n data={data}\n columns={columnsWithActions}\n components={{\n Table: components.Table,\n TableHeader: components.TableHeader,\n TableBody: components.TableBody,\n TableRow: components.TableRow,\n TableHead: components.TableHead,\n TableCell: components.TableCell,\n Skeleton: components.Skeleton,\n }}\n />\n );\n}\n\n// ============================================================================\n// MAIN APPROVALS PAGE COMPONENT\n// ============================================================================\n\n/**\n * ApprovalsPage - Generic approvals page with tabs for access, roles, and policies\n *\n * @example\n * ```tsx\n * <ApprovalsPage\n * tabs={{\n * access: {\n * key: 'access',\n * label: 'Access',\n * fetchData: api.admin.accessApprovals.list,\n * columns: accessColumns,\n * emptyState: { icon: <User />, title: 'No pending requests', description: '...' },\n * actions: {\n * onReview: handleReview,\n * onCommit: handleCommit,\n * onCancel: handleCancel,\n * },\n * canCommit: (item) => item.commitReady,\n * },\n * // ... other tabs\n * }}\n * toast={toast}\n * invalidateQueries={queryClient.invalidateQueries}\n * />\n * ```\n */\nexport function ApprovalsPageBase<\n TAccess extends AccessApprovalItem = AccessApprovalItem,\n TRole extends RoleApprovalItem = RoleApprovalItem,\n TPolicy extends PolicyApprovalItem = PolicyApprovalItem\n>({\n title = \"Change Requests\",\n description = \"Review and approve pending access, role, and policy change requests.\",\n tabs,\n additionalTabs = [],\n initialTab = \"access\",\n toast,\n refreshInterval = 15,\n invalidateQueries,\n currentUserId,\n components = {},\n className,\n helpText,\n}: ApprovalsPageBaseProps<TAccess, TRole, TPolicy>) {\n const [activeTab, setActiveTab] = useState<string>(initialTab);\n const [badgeCounts, setBadgeCounts] = useState<Record<string, number>>({});\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [secondsRemaining, setSecondsRemaining] = useState(refreshInterval);\n\n // Components (use defaultComponents from ui if not provided)\n const Card = components.Card || defaultComponents.Card;\n const CardContent = components.CardContent || defaultComponents.CardContent;\n const Button = components.Button || defaultComponents.Button;\n\n // Handle manual refresh\n const handleRefresh = useCallback(() => {\n setRefreshTrigger((prev) => prev + 1);\n }, []);\n\n // Build tab definitions\n const tabDefs = [];\n\n if (tabs.access) {\n tabDefs.push({\n key: \"access\",\n label: tabs.access.label || \"Access\",\n icon: tabs.access.icon || <User style={{ height: \"1rem\", width: \"1rem\" }} />,\n badge: badgeCounts.access,\n content: (\n <ApprovalTab\n config={tabs.access as ApprovalTabConfig<any>}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n currentUserId={currentUserId}\n components={components}\n refreshTrigger={refreshTrigger}\n onLoadingChange={setIsRefreshing}\n onSecondsRemainingChange={setSecondsRemaining}\n />\n ),\n });\n }\n\n if (tabs.roles) {\n tabDefs.push({\n key: \"roles\",\n label: tabs.roles.label || \"Roles\",\n icon: tabs.roles.icon || <Shield style={{ height: \"1rem\", width: \"1rem\" }} />,\n badge: badgeCounts.roles,\n content: (\n <ApprovalTab\n config={tabs.roles as ApprovalTabConfig<any>}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n currentUserId={currentUserId}\n components={components}\n refreshTrigger={refreshTrigger}\n onLoadingChange={setIsRefreshing}\n onSecondsRemainingChange={setSecondsRemaining}\n />\n ),\n });\n }\n\n if (tabs.policies) {\n tabDefs.push({\n key: \"policies\",\n label: tabs.policies.label || \"Policies\",\n icon: tabs.policies.icon || <FileKey style={{ height: \"1rem\", width: \"1rem\" }} />,\n badge: badgeCounts.policies,\n content: (\n <ApprovalTab\n config={tabs.policies as ApprovalTabConfig<any>}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n currentUserId={currentUserId}\n components={components}\n refreshTrigger={refreshTrigger}\n onLoadingChange={setIsRefreshing}\n onSecondsRemainingChange={setSecondsRemaining}\n />\n ),\n });\n }\n\n // Add any additional custom tabs\n for (const tabConfig of additionalTabs) {\n tabDefs.push({\n key: tabConfig.key,\n label: tabConfig.label,\n icon: tabConfig.icon,\n badge: badgeCounts[tabConfig.key],\n content: (\n <ApprovalTab\n config={tabConfig}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n currentUserId={currentUserId}\n components={components}\n refreshTrigger={refreshTrigger}\n onLoadingChange={setIsRefreshing}\n onSecondsRemainingChange={setSecondsRemaining}\n />\n ),\n });\n }\n\n return (\n <div style={{ padding: \"1.5rem\" }} className={className}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: \"1.5rem\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n <div>\n <h1 style={{ fontSize: \"1.5rem\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", margin: 0 }}>\n <CheckSquare style={{ width: \"1.5rem\", height: \"1.5rem\" }} />\n {title}\n </h1>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\" }}>{description}</p>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RefreshButton\n onClick={handleRefresh}\n isRefreshing={isRefreshing}\n secondsRemaining={secondsRemaining}\n title=\"Refresh now\"\n />\n </div>\n </div>\n\n {/* Help text */}\n {helpText && <div style={{ marginBottom: \"1rem\" }}>{helpText}</div>}\n\n {/* Tabs */}\n <Card>\n <CardContent style={{ padding: 0 }}>\n <TabsView\n tabs={tabDefs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n components={{\n Tabs: components.Tabs,\n TabsList: components.TabsList,\n TabsTrigger: components.TabsTrigger,\n TabsContent: components.TabsContent,\n Badge: components.Badge,\n }}\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n\n// ============================================================================\n// HELPER FUNCTIONS FOR CREATING COMMON COLUMNS\n// ============================================================================\n\n/**\n * Create user column for access approvals\n */\nexport function createUserColumn<T extends { username: string }>(): ColumnDef<T> {\n return {\n key: \"user\",\n header: \"User\",\n cell: (item) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <div style={{ display: \"flex\", height: \"2rem\", width: \"2rem\", alignItems: \"center\", justifyContent: \"center\", borderRadius: \"9999px\", backgroundColor: \"rgba(59, 130, 246, 0.1)\" }}>\n <User style={{ height: \"1rem\", width: \"1rem\", color: \"#3b82f6\" }} />\n </div>\n <span style={{ fontWeight: 500 }}>{item.username}</span>\n </div>\n ),\n };\n}\n\n/**\n * Create role column\n */\nexport function createRoleColumn<T extends { role?: string; roleId?: string }>(): ColumnDef<T> {\n return {\n key: \"role\",\n header: \"Role\",\n responsive: \"sm\",\n cell: (item) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Shield style={{ height: \"1rem\", width: \"1rem\", color: \"#6b7280\" }} />\n <span style={{ fontSize: \"0.875rem\", fontFamily: \"monospace\" }}>{item.role || item.roleId}</span>\n </div>\n ),\n };\n}\n\n/**\n * Create timestamp column\n */\nexport function createTimestampColumn<T extends { timestamp?: string | number; createdAt?: number }>(\n options?: { header?: string; responsive?: \"sm\" | \"md\" | \"lg\" }\n): ColumnDef<T> {\n return {\n key: \"timestamp\",\n header: options?.header || \"Created\",\n responsive: options?.responsive || \"md\",\n cell: (item) => {\n const ts = item.timestamp || (item.createdAt ? item.createdAt * 1000 : undefined);\n return (\n <span style={{ fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n {ts ? formatTimestamp(ts) : \"-\"}\n </span>\n );\n },\n };\n}\n\n/**\n * Create status column\n */\nexport function createStatusColumn<T extends { status?: string; commitReady?: boolean }>(\n options?: { getStatus?: (item: T) => string }\n): ColumnDef<T> {\n return {\n key: \"status\",\n header: \"Status\",\n cell: (item) => {\n const status = options?.getStatus?.(item) || item.status || \"pending\";\n return <StatusBadge status={status} />;\n },\n };\n}\n\n/**\n * Create progress column for threshold-based approvals\n */\nexport function createProgressColumn<T extends { approvalCount?: number; rejectionCount?: number; threshold: number }>(): ColumnDef<T> {\n return {\n key: \"progress\",\n header: \"Progress\",\n responsive: \"md\",\n cell: (item) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <span style={{ color: \"#16a34a\" }}>{item.approvalCount || 0}</span>\n <span style={{ color: \"#6b7280\" }}>/</span>\n <span>{item.threshold}</span>\n {(item.rejectionCount ?? 0) > 0 && (\n <span style={{ color: \"#dc2626\", fontSize: \"0.875rem\" }}>\n ({item.rejectionCount} rejected)\n </span>\n )}\n </div>\n ),\n };\n}\n","/**\n * Default UI Components\n *\n * These are simple, styled components that work out of the box.\n * Users can override them by passing their own components prop.\n */\n\nimport React, { useEffect } from \"react\";\n\n// Inject CSS keyframes for animations\nconst KEYFRAMES_ID = \"tidecloak-ui-keyframes\";\nconst KEYFRAMES_CSS = `\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n`;\n\nfunction injectKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(KEYFRAMES_ID)) return;\n const style = document.createElement(\"style\");\n style.id = KEYFRAMES_ID;\n style.textContent = KEYFRAMES_CSS;\n document.head.appendChild(style);\n}\n\n// Inject keyframes on module load (client-side only)\nif (typeof window !== \"undefined\") {\n injectKeyframes();\n}\n\n// Shared styles\nconst baseButtonStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.5rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n border: \"1px solid transparent\",\n transition: \"all 0.2s\",\n padding: \"0.5rem 1rem\",\n};\n\n// Card\nexport function Card({ children, className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n backgroundColor: \"#fff\",\n borderRadius: \"0.5rem\",\n border: \"1px solid #e5e7eb\",\n boxShadow: \"0 1px 3px 0 rgba(0, 0, 0, 0.1)\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function CardContent({ children, className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ padding: \"1.5rem\", ...style }} {...props}>\n {children}\n </div>\n );\n}\n\nexport function CardHeader({ children, className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ padding: \"1.5rem 1.5rem 0\", ...style }} {...props}>\n {children}\n </div>\n );\n}\n\nexport function CardTitle({ children, className, style, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3 style={{ fontSize: \"1.125rem\", fontWeight: 600, margin: 0, ...style }} {...props}>\n {children}\n </h3>\n );\n}\n\nexport function CardDescription({ children, className, style, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\", ...style }} {...props}>\n {children}\n </p>\n );\n}\n\n// Button\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nexport function Button({ children, variant = \"default\", size = \"default\", style, ...props }: ButtonProps) {\n const variantStyles: Record<string, React.CSSProperties> = {\n default: { backgroundColor: \"#1f2937\", color: \"#fff\", border: \"1px solid #1f2937\" },\n destructive: { backgroundColor: \"#dc2626\", color: \"#fff\", border: \"1px solid #dc2626\" },\n outline: { backgroundColor: \"transparent\", color: \"#1f2937\", border: \"1px solid #d1d5db\" },\n secondary: { backgroundColor: \"#f3f4f6\", color: \"#1f2937\", border: \"1px solid #e5e7eb\" },\n ghost: { backgroundColor: \"transparent\", color: \"#1f2937\", border: \"1px solid transparent\" },\n link: { backgroundColor: \"transparent\", color: \"#2563eb\", border: \"none\", textDecoration: \"underline\" },\n };\n\n const sizeStyles: Record<string, React.CSSProperties> = {\n default: { height: \"2.5rem\", padding: \"0.5rem 1rem\" },\n sm: { height: \"2rem\", padding: \"0.25rem 0.75rem\", fontSize: \"0.75rem\" },\n lg: { height: \"3rem\", padding: \"0.75rem 2rem\" },\n icon: { height: \"2.5rem\", width: \"2.5rem\", padding: \"0\" },\n };\n\n return (\n <button\n style={{\n ...baseButtonStyle,\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...style,\n }}\n {...props}\n >\n {children}\n </button>\n );\n}\n\n// Badge\ninterface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\n}\n\nexport function Badge({ children, variant = \"default\", style, ...props }: BadgeProps) {\n const variantStyles: Record<string, React.CSSProperties> = {\n default: { backgroundColor: \"#1f2937\", color: \"#fff\" },\n secondary: { backgroundColor: \"#f3f4f6\", color: \"#1f2937\" },\n destructive: { backgroundColor: \"#fef2f2\", color: \"#dc2626\" },\n outline: { backgroundColor: \"transparent\", color: \"#1f2937\", border: \"1px solid #d1d5db\" },\n };\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n borderRadius: \"9999px\",\n padding: \"0.125rem 0.625rem\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n ...variantStyles[variant],\n ...style,\n }}\n {...props}\n >\n {children}\n </span>\n );\n}\n\n// Input\nexport function Input({ className, style, ...props }: React.InputHTMLAttributes<HTMLInputElement>) {\n return (\n <input\n style={{\n display: \"flex\",\n width: \"100%\",\n height: \"2.5rem\",\n borderRadius: \"0.375rem\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"#fff\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n outline: \"none\",\n boxSizing: \"border-box\",\n ...style,\n }}\n {...props}\n />\n );\n}\n\n// Label\nexport function Label({ children, className, style, ...props }: React.LabelHTMLAttributes<HTMLLabelElement>) {\n return (\n <label\n style={{\n fontSize: \"0.875rem\",\n fontWeight: 500,\n color: \"#1f2937\",\n ...style,\n }}\n {...props}\n >\n {children}\n </label>\n );\n}\n\n// Textarea\nexport function Textarea({ className, style, ...props }: React.TextareaHTMLAttributes<HTMLTextAreaElement>) {\n return (\n <textarea\n style={{\n display: \"flex\",\n width: \"100%\",\n minHeight: \"5rem\",\n borderRadius: \"0.375rem\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"#fff\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n outline: \"none\",\n resize: \"vertical\",\n boxSizing: \"border-box\",\n ...style,\n }}\n {...props}\n />\n );\n}\n\n// Checkbox\ninterface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport function Checkbox({ onCheckedChange, onChange, style, ...props }: CheckboxProps) {\n return (\n <input\n type=\"checkbox\"\n style={{\n width: \"1rem\",\n height: \"1rem\",\n cursor: \"pointer\",\n ...style,\n }}\n onChange={(e) => {\n onChange?.(e);\n onCheckedChange?.(e.target.checked);\n }}\n {...props}\n />\n );\n}\n\n// Select components - with proper open/close state management\nconst SelectContext = React.createContext<{\n value: string;\n onValueChange: (value: string) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n}>({ value: \"\", onValueChange: () => {}, open: false, setOpen: () => {} });\n\nexport function Select({ children, onValueChange, value = \"\", ...props }: {\n children: React.ReactNode;\n onValueChange?: (value: string) => void;\n value?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n const handleValueChange = (newValue: string) => {\n onValueChange?.(newValue);\n setOpen(false);\n };\n\n return (\n <SelectContext.Provider value={{ value, onValueChange: handleValueChange, open, setOpen }}>\n <div ref={containerRef} style={{ position: \"relative\" }}>{children}</div>\n </SelectContext.Provider>\n );\n}\n\nexport function SelectTrigger({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const { open, setOpen } = React.useContext(SelectContext);\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: \"2.5rem\",\n width: \"100%\",\n borderRadius: \"0.375rem\",\n border: \"1px solid #d1d5db\",\n backgroundColor: \"#fff\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n ...style,\n }}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children}\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n marginLeft: \"0.5rem\",\n color: \"#6b7280\",\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n );\n}\n\nexport function SelectValue({ placeholder }: { placeholder?: string }) {\n const { value } = React.useContext(SelectContext);\n return <span style={{ color: value ? \"#1f2937\" : \"#9ca3af\" }}>{value || placeholder}</span>;\n}\n\nexport function SelectContent({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const { open } = React.useContext(SelectContext);\n\n if (!open) return null;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n marginTop: \"0.25rem\",\n backgroundColor: \"#fff\",\n border: \"1px solid #d1d5db\",\n borderRadius: \"0.375rem\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n zIndex: 50,\n maxHeight: \"15rem\",\n overflow: \"auto\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function SelectItem({ children, value, style, ...props }: React.HTMLAttributes<HTMLDivElement> & { value: string }) {\n const { value: selectedValue, onValueChange } = React.useContext(SelectContext);\n const isSelected = selectedValue === value;\n\n return (\n <div\n style={{\n padding: \"0.5rem 0.75rem\",\n cursor: \"pointer\",\n fontSize: \"0.875rem\",\n backgroundColor: isSelected ? \"#f3f4f6\" : \"transparent\",\n ...style,\n }}\n onClick={() => onValueChange(value)}\n onMouseEnter={(e) => {\n if (!isSelected) e.currentTarget.style.backgroundColor = \"#f9fafb\";\n }}\n onMouseLeave={(e) => {\n if (!isSelected) e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// Skeleton\nexport function Skeleton({ className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n backgroundColor: \"#e5e7eb\",\n borderRadius: \"0.375rem\",\n animation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n ...style,\n }}\n {...props}\n />\n );\n}\n\n// Table components\nexport function Table({ children, style, ...props }: React.HTMLAttributes<HTMLTableElement>) {\n return (\n <div style={{ width: \"100%\", overflow: \"auto\" }}>\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: \"0.875rem\", ...style }} {...props}>\n {children}\n </table>\n </div>\n );\n}\n\nexport function TableHeader({ children, style, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <thead style={{ borderBottom: \"1px solid #e5e7eb\", ...style }} {...props}>\n {children}\n </thead>\n );\n}\n\nexport function TableBody({ children, style, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return <tbody style={style} {...props}>{children}</tbody>;\n}\n\nexport function TableRow({ children, style, ...props }: React.HTMLAttributes<HTMLTableRowElement>) {\n return (\n <tr style={{ borderBottom: \"1px solid #e5e7eb\", ...style }} {...props}>\n {children}\n </tr>\n );\n}\n\nexport function TableHead({ children, style, ...props }: React.ThHTMLAttributes<HTMLTableCellElement>) {\n return (\n <th\n style={{\n height: \"3rem\",\n padding: \"0 1rem\",\n textAlign: \"left\",\n fontWeight: 500,\n color: \"#6b7280\",\n ...style,\n }}\n {...props}\n >\n {children}\n </th>\n );\n}\n\nexport function TableCell({ children, style, ...props }: React.TdHTMLAttributes<HTMLTableCellElement>) {\n return (\n <td style={{ padding: \"1rem\", ...style }} {...props}>\n {children}\n </td>\n );\n}\n\n// Dialog components\ninterface DialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nexport function Dialog({ open, onOpenChange, children }: DialogProps) {\n if (!open) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n }}\n onClick={() => onOpenChange?.(false)}\n />\n <div style={{ position: \"relative\", zIndex: 51 }}>{children}</div>\n </div>\n );\n}\n\nexport function DialogContent({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n backgroundColor: \"#fff\",\n borderRadius: \"0.5rem\",\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n padding: \"1.5rem\",\n width: \"100%\",\n maxWidth: \"32rem\",\n maxHeight: \"85vh\",\n overflow: \"auto\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function DialogHeader({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ marginBottom: \"1rem\", ...style }} {...props}>\n {children}\n </div>\n );\n}\n\nexport function DialogTitle({ children, style, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h2 style={{ fontSize: \"1.125rem\", fontWeight: 600, margin: 0, ...style }} {...props}>\n {children}\n </h2>\n );\n}\n\nexport function DialogDescription({ children, style, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\", ...style }} {...props}>\n {children}\n </p>\n );\n}\n\nexport function DialogFooter({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"0.5rem\",\n marginTop: \"1.5rem\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// Tabs components\ninterface TabsProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children: React.ReactNode;\n}\n\nconst TabsContext = React.createContext<{\n value: string;\n onValueChange: (value: string) => void;\n}>({ value: \"\", onValueChange: () => {} });\n\nexport function Tabs({ value, defaultValue = \"\", onValueChange, children }: TabsProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const currentValue = value ?? internalValue;\n\n const handleChange = (newValue: string) => {\n setInternalValue(newValue);\n onValueChange?.(newValue);\n };\n\n return (\n <TabsContext.Provider value={{ value: currentValue, onValueChange: handleChange }}>\n <div>{children}</div>\n </TabsContext.Provider>\n );\n}\n\nexport function TabsList({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n display: \"inline-flex\",\n backgroundColor: \"#f3f4f6\",\n borderRadius: \"0.5rem\",\n padding: \"0.25rem\",\n gap: \"0.25rem\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function TabsTrigger({ children, value, style, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }) {\n const { value: currentValue, onValueChange } = React.useContext(TabsContext);\n const isActive = currentValue === value;\n\n return (\n <button\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n borderRadius: \"0.375rem\",\n border: \"none\",\n cursor: \"pointer\",\n backgroundColor: isActive ? \"#fff\" : \"transparent\",\n color: isActive ? \"#1f2937\" : \"#6b7280\",\n boxShadow: isActive ? \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\" : \"none\",\n ...style,\n }}\n onClick={() => onValueChange(value)}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function TabsContent({ children, value, style, ...props }: React.HTMLAttributes<HTMLDivElement> & { value: string }) {\n const { value: currentValue } = React.useContext(TabsContext);\n\n if (currentValue !== value) return null;\n\n return (\n <div style={{ marginTop: \"1rem\", ...style }} {...props}>\n {children}\n </div>\n );\n}\n\n// AlertDialog (uses same base as Dialog)\nexport function AlertDialog({ open, onOpenChange, children }: {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}) {\n if (!open) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n }}\n onClick={() => onOpenChange?.(false)}\n />\n <div style={{ position: \"relative\", zIndex: 51 }}>{children}</div>\n </div>\n );\n}\n\nexport function AlertDialogContent({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n backgroundColor: \"#fff\",\n borderRadius: \"0.5rem\",\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\",\n padding: \"1.5rem\",\n width: \"100%\",\n maxWidth: \"32rem\",\n ...style,\n }}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function AlertDialogHeader({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ marginBottom: \"1rem\", ...style }} {...props}>\n {children}\n </div>\n );\n}\n\nexport function AlertDialogTitle({ children, style, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h2 style={{ fontSize: \"1.125rem\", fontWeight: 600, margin: 0, ...style }} {...props}>\n {children}\n </h2>\n );\n}\n\nexport function AlertDialogDescription({ children, style, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\", ...style }} {...props}>\n {children}\n </p>\n );\n}\n\nexport function AlertDialogFooter({ children, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"0.5rem\",\n marginTop: \"1.5rem\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function AlertDialogCancel({ children, style, onClick, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n return (\n <button\n style={{\n ...baseButtonStyle,\n backgroundColor: \"transparent\",\n color: \"#1f2937\",\n border: \"1px solid #d1d5db\",\n ...style,\n }}\n onClick={onClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function AlertDialogAction({ children, style, onClick, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n return (\n <button\n style={{\n ...baseButtonStyle,\n backgroundColor: \"#dc2626\",\n color: \"#fff\",\n border: \"1px solid #dc2626\",\n ...style,\n }}\n onClick={onClick}\n {...props}\n >\n {children}\n </button>\n );\n}\n\n// Switch\ninterface SwitchProps {\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nexport function Switch({ checked, onCheckedChange, disabled, style }: SwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onCheckedChange?.(!checked)}\n style={{\n width: \"2.75rem\",\n height: \"1.5rem\",\n borderRadius: \"9999px\",\n backgroundColor: checked ? \"#1f2937\" : \"#d1d5db\",\n position: \"relative\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n border: \"none\",\n padding: 0,\n transition: \"background-color 0.2s\",\n ...style,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n top: \"2px\",\n left: checked ? \"calc(100% - 1.25rem - 2px)\" : \"2px\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: \"#fff\",\n transition: \"left 0.2s\",\n boxShadow: \"0 1px 3px rgba(0, 0, 0, 0.2)\",\n }}\n />\n </button>\n );\n}\n\n// ScrollArea (simple wrapper)\nexport function ScrollArea({ children, className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n overflow: \"auto\",\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// Alert\ninterface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"destructive\";\n}\n\nexport function Alert({ children, variant = \"default\", style, ...props }: AlertProps) {\n const variantStyles: Record<string, React.CSSProperties> = {\n default: {\n backgroundColor: \"#f3f4f6\",\n borderColor: \"#e5e7eb\",\n color: \"#1f2937\",\n },\n destructive: {\n backgroundColor: \"#fef2f2\",\n borderColor: \"#fecaca\",\n color: \"#dc2626\",\n },\n };\n\n return (\n <div\n role=\"alert\"\n style={{\n position: \"relative\",\n width: \"100%\",\n borderRadius: \"0.375rem\",\n border: \"1px solid\",\n padding: \"1rem\",\n ...variantStyles[variant],\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function AlertDescription({ children, style, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n style={{\n fontSize: \"0.875rem\",\n lineHeight: 1.5,\n margin: 0,\n ...style,\n }}\n {...props}\n >\n {children}\n </p>\n );\n}\n\n// CodeEditor (simple textarea-based editor)\ninterface CodeEditorProps {\n value?: string;\n onChange?: (value: string) => void;\n height?: string;\n style?: React.CSSProperties;\n}\n\nexport function CodeEditor({ value, onChange, height = \"300px\", style }: CodeEditorProps) {\n return (\n <textarea\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n style={{\n width: \"100%\",\n height,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: \"0.875rem\",\n lineHeight: 1.5,\n padding: \"0.75rem\",\n backgroundColor: \"#1f2937\",\n color: \"#e5e7eb\",\n border: \"1px solid #374151\",\n borderRadius: \"0.375rem\",\n resize: \"vertical\",\n boxSizing: \"border-box\",\n ...style,\n }}\n spellCheck={false}\n />\n );\n}\n\n// Separator\nexport function Separator({ className, style, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n style={{\n height: \"1px\",\n width: \"100%\",\n backgroundColor: \"#e5e7eb\",\n ...style,\n }}\n {...props}\n />\n );\n}\n\n// Export all as default components object\nexport const defaultComponents = {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Input,\n Label,\n Textarea,\n Checkbox,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Skeleton,\n Switch,\n ScrollArea,\n Alert,\n AlertDescription,\n CodeEditor,\n Table,\n TableHeader,\n TableBody,\n TableRow,\n TableHead,\n TableCell,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n AlertDialog,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogCancel,\n AlertDialogAction,\n Separator,\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n};\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { ScrollText, Activity, Shield, Plus, Check, X, Upload, Ban, Eye } from \"lucide-react\";\nimport { formatLogTimestamp, computeRowsForViewportHeight } from \"../../../utils\";\nimport { useAutoRefresh } from \"../../../hooks/useAutoRefresh\";\nimport { usePagination } from \"../../../hooks/usePagination\";\nimport { RefreshButton } from \"../../common/RefreshButton\";\nimport { StatusBadge } from \"../../common/StatusBadge\";\nimport { ActionButton } from \"../../common/ActionButton\";\nimport { LoadingSkeleton } from \"../../common/LoadingSkeleton\";\nimport { EmptyState } from \"../../common/EmptyState\";\nimport { TabsView } from \"../../tabs/TabsView\";\nimport { DataTable } from \"../../data-table/DataTable\";\nimport { DetailDialog } from \"../../dialogs/DetailDialog\";\nimport { defaultComponents } from \"../../ui\";\nimport type { BaseDataItem, ColumnDef, DetailField, ToastConfig } from \"../../../types\";\n\nexport interface BaseLogItem extends BaseDataItem {\n timestamp: number; // Unix timestamp in milliseconds\n type?: string;\n action?: string;\n}\n\nexport interface AccessLogItem extends BaseLogItem {\n type: string;\n clientId?: string;\n userId?: string;\n ipAddress?: string;\n details?: Record<string, any>;\n}\n\nexport interface PolicyLogItem extends BaseLogItem {\n policyId: string;\n roleId: string;\n action: string;\n performedBy: string;\n performedByEmail?: string;\n details?: string;\n policyStatus?: string;\n policyThreshold?: number;\n approvalCount?: number;\n rejectionCount?: number;\n}\n\nexport interface LogsTabConfig<T extends BaseLogItem> {\n key: string;\n label: string;\n icon?: React.ReactNode;\n /** Data fetcher - receives limit and offset */\n fetchData: (limit: number, offset: number) => Promise<T[]>;\n /** Column definitions for the table */\n columns: ColumnDef<T>[];\n /** Empty state configuration */\n emptyState: {\n icon: React.ReactNode;\n title: string;\n description: string;\n };\n /** Optional row click handler */\n onRowClick?: (item: T) => void;\n /** Query keys for cache invalidation */\n queryKeys?: string[];\n}\n\nexport interface LogsPageBaseProps<\n TAccess extends AccessLogItem = AccessLogItem,\n TPolicy extends PolicyLogItem = PolicyLogItem\n> {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Tab configurations */\n tabs: {\n access?: LogsTabConfig<TAccess>;\n sessions?: {\n key: string;\n label: string;\n icon?: React.ReactNode;\n /** Embedded content component */\n content: React.ReactNode;\n };\n policies?: LogsTabConfig<TPolicy>;\n };\n /** Initial active tab */\n initialTab?: \"access\" | \"sessions\" | \"policies\";\n /** Toast notification handler */\n toast?: (config: ToastConfig) => void;\n /** Auto-refresh interval in seconds */\n refreshInterval?: number;\n /** Query invalidation handler */\n invalidateQueries?: (queryKeys: string[]) => void;\n /** Available page sizes */\n pageSizes?: number[];\n /** Enable auto page sizing */\n autoPageSize?: boolean;\n /** URL state management */\n urlState?: {\n tab: string;\n setTab: (tab: string) => void;\n };\n /** Custom components */\n components?: {\n Card?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n CardContent?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n Button?: React.ComponentType<any>;\n Badge?: React.ComponentType<any>;\n Skeleton?: React.ComponentType<{ className?: string }>;\n Select?: React.ComponentType<any>;\n SelectTrigger?: React.ComponentType<any>;\n SelectValue?: React.ComponentType<any>;\n SelectContent?: React.ComponentType<any>;\n SelectItem?: React.ComponentType<any>;\n // Table components\n Table?: React.ComponentType<any>;\n TableHeader?: React.ComponentType<any>;\n TableBody?: React.ComponentType<any>;\n TableRow?: React.ComponentType<any>;\n TableHead?: React.ComponentType<any>;\n TableCell?: React.ComponentType<any>;\n // Tabs components\n Tabs?: React.ComponentType<any>;\n TabsList?: React.ComponentType<any>;\n TabsTrigger?: React.ComponentType<any>;\n TabsContent?: React.ComponentType<any>;\n // Dialog components\n Dialog?: React.ComponentType<any>;\n DialogContent?: React.ComponentType<any>;\n DialogHeader?: React.ComponentType<any>;\n DialogTitle?: React.ComponentType<any>;\n DialogDescription?: React.ComponentType<any>;\n DialogFooter?: React.ComponentType<any>;\n };\n /** Additional class name */\n className?: string;\n /** Optional help text shown below description */\n helpText?: React.ReactNode;\n}\n\n// ============================================================================\n// GENERIC LOGS TAB COMPONENT\n// ============================================================================\n\ninterface LogsTabProps<T extends BaseLogItem> {\n config: LogsTabConfig<T>;\n refreshInterval: number;\n toast?: (config: ToastConfig) => void;\n invalidateQueries?: (queryKeys: string[]) => void;\n pageSizes: number[];\n autoPageSize: boolean;\n components?: LogsPageBaseProps['components'];\n}\n\nfunction LogsTab<T extends BaseLogItem>({\n config,\n refreshInterval,\n toast,\n invalidateQueries,\n pageSizes,\n autoPageSize,\n components = {},\n}: LogsTabProps<T>) {\n const [data, setData] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const viewportRef = useRef<HTMLDivElement>(null);\n\n // Pagination\n const pagination = usePagination({\n initialPageSize: autoPageSize ? 50 : pageSizes[0],\n autoPageSize,\n viewportRef: autoPageSize ? viewportRef : undefined,\n });\n\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await config.fetchData(\n pagination.pageSize,\n pagination.page * pagination.pageSize\n );\n setData(result);\n if (invalidateQueries && config.queryKeys) {\n invalidateQueries(config.queryKeys);\n }\n } catch (error) {\n console.error(`Error fetching ${config.key} logs:`, error);\n toast?.({\n title: `Failed to fetch ${config.label.toLowerCase()}`,\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: fetchData,\n isBlocked: isLoading,\n });\n\n // Fetch on mount and when pagination changes\n useEffect(() => {\n void fetchData();\n }, [pagination.page, pagination.pageSize]);\n\n const hasNextPage = data.length === pagination.pageSize;\n\n // Components (use defaultComponents from ui if not provided)\n const Card = components.Card || defaultComponents.Card;\n const CardContent = components.CardContent || defaultComponents.CardContent;\n const Button = components.Button || defaultComponents.Button;\n const Select = components.Select || defaultComponents.Select;\n const SelectTrigger = components.SelectTrigger || defaultComponents.SelectTrigger;\n const SelectValue = components.SelectValue || defaultComponents.SelectValue;\n const SelectContent = components.SelectContent || defaultComponents.SelectContent;\n const SelectItem = components.SelectItem || defaultComponents.SelectItem;\n\n const hasSelectComponents = Select && SelectTrigger && SelectValue && SelectContent && SelectItem;\n\n return (\n <Card>\n <CardContent style={{ padding: 0 }}>\n {/* Pagination Controls */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: \"0.5rem\", padding: \"0.75rem 1rem\", borderBottom: \"1px solid #e5e7eb\" }}>\n <div style={{ fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n Page <span style={{ fontWeight: 500, color: \"#111827\" }}>{pagination.page + 1}</span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.75rem\" }}>\n {/* Page Size Selector */}\n {hasSelectComponents && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n Page size\n <Select\n value={pagination.pageSizeSelectValue}\n onValueChange={pagination.onPageSizeSelect}\n >\n <SelectTrigger style={{ height: \"2rem\", width: \"5.75rem\" }}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {autoPageSize && <SelectItem value=\"auto\">Auto</SelectItem>}\n {pageSizes.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Navigation */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => pagination.setPage(Math.max(0, pagination.page - 1))}\n disabled={pagination.page === 0 || isLoading}\n >\n Previous\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => pagination.setPage(pagination.page + 1)}\n disabled={!hasNextPage || isLoading}\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n\n {/* Content */}\n {isLoading && data.length === 0 ? (\n <LoadingSkeleton rows={5} type=\"list\" SkeletonComponent={components.Skeleton} />\n ) : data.length > 0 ? (\n <div\n ref={viewportRef}\n style={autoPageSize ? { height: \"max(320px, calc(100vh - 360px))\", overflow: \"auto\" } : undefined}\n >\n <div style={{ minWidth: \"850px\" }}>\n <DataTable\n data={data}\n columns={config.columns}\n onRowClick={config.onRowClick}\n components={{\n Table: components.Table,\n TableHeader: components.TableHeader,\n TableBody: components.TableBody,\n TableRow: components.TableRow,\n TableHead: components.TableHead,\n TableCell: components.TableCell,\n Skeleton: components.Skeleton,\n }}\n />\n </div>\n </div>\n ) : (\n <EmptyState\n icon={config.emptyState.icon}\n title={config.emptyState.title}\n description={config.emptyState.description}\n />\n )}\n </CardContent>\n </Card>\n );\n}\n\n// ============================================================================\n// MAIN LOGS PAGE COMPONENT\n// ============================================================================\n\n/**\n * LogsPage - Generic logs page with tabs for access, sessions, and policies\n *\n * @example\n * ```tsx\n * <LogsPage\n * tabs={{\n * access: {\n * key: 'access',\n * label: 'Access',\n * fetchData: (limit, offset) => api.admin.logs.access(limit, offset),\n * columns: accessColumns,\n * emptyState: { icon: <ScrollText />, title: 'No logs', description: '...' },\n * },\n * sessions: {\n * key: 'sessions',\n * label: 'Sessions',\n * content: <SessionHistoryContent />,\n * },\n * policies: {\n * key: 'policies',\n * label: 'Policies',\n * fetchData: (limit, offset) => api.admin.sshPolicies.getLogs(limit, offset),\n * columns: policyColumns,\n * emptyState: { icon: <Shield />, title: 'No policy logs', description: '...' },\n * },\n * }}\n * />\n * ```\n */\nexport function LogsPageBase<\n TAccess extends AccessLogItem = AccessLogItem,\n TPolicy extends PolicyLogItem = PolicyLogItem\n>({\n title = \"Logs\",\n description = \"Review access changes and activity\",\n tabs,\n initialTab = \"access\",\n toast,\n refreshInterval = 15,\n invalidateQueries,\n pageSizes = [25, 50, 100, 200],\n autoPageSize = true,\n urlState,\n components = {},\n className,\n helpText,\n}: LogsPageBaseProps<TAccess, TPolicy>) {\n const [activeTab, setActiveTab] = useState<string>(urlState?.tab || initialTab);\n\n // Sync with URL state\n useEffect(() => {\n if (urlState?.tab && urlState.tab !== activeTab) {\n setActiveTab(urlState.tab);\n }\n }, [urlState?.tab]);\n\n const handleTabChange = (tab: string) => {\n setActiveTab(tab);\n urlState?.setTab(tab);\n };\n\n // Build tab definitions\n const tabDefs = [];\n\n if (tabs.access) {\n tabDefs.push({\n key: \"access\",\n label: tabs.access.label || \"Access\",\n icon: tabs.access.icon,\n content: (\n <LogsTab\n config={tabs.access as LogsTabConfig<any>}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n pageSizes={pageSizes}\n autoPageSize={autoPageSize}\n components={components}\n />\n ),\n });\n }\n\n if (tabs.sessions) {\n tabDefs.push({\n key: \"sessions\",\n label: tabs.sessions.label || \"Sessions\",\n icon: tabs.sessions.icon || <Activity style={{ height: \"1rem\", width: \"1rem\" }} />,\n content: tabs.sessions.content,\n });\n }\n\n if (tabs.policies) {\n tabDefs.push({\n key: \"policies\",\n label: tabs.policies.label || \"Policies\",\n icon: tabs.policies.icon || <Shield style={{ height: \"1rem\", width: \"1rem\" }} />,\n content: (\n <LogsTab\n config={tabs.policies as LogsTabConfig<any>}\n refreshInterval={refreshInterval}\n toast={toast}\n invalidateQueries={invalidateQueries}\n pageSizes={pageSizes}\n autoPageSize={autoPageSize}\n components={components}\n />\n ),\n });\n }\n\n // Get current isFetching state for refresh button\n const [isFetching, setIsFetching] = useState(false);\n\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: async () => {\n // Trigger refetch - actual fetching happens in tabs\n },\n isBlocked: isFetching,\n });\n\n return (\n <div style={{ padding: \"1.5rem\" }} className={className}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: \"1.5rem\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n <div>\n <h1 style={{ fontSize: \"1.5rem\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", margin: 0 }}>\n <ScrollText style={{ width: \"1.5rem\", height: \"1.5rem\" }} />\n {title}\n </h1>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\" }}>{description}</p>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RefreshButton\n onClick={() => void refreshNow()}\n isRefreshing={isFetching}\n secondsRemaining={secondsRemaining}\n title=\"Refresh now\"\n />\n </div>\n </div>\n\n {/* Help text */}\n {helpText && <div style={{ marginBottom: \"1rem\" }}>{helpText}</div>}\n\n {/* Tabs */}\n <TabsView\n tabs={tabDefs}\n activeTab={activeTab}\n onTabChange={handleTabChange}\n components={{\n Tabs: components.Tabs,\n TabsList: components.TabsList,\n TabsTrigger: components.TabsTrigger,\n TabsContent: components.TabsContent,\n Badge: components.Badge,\n }}\n />\n </div>\n );\n}\n\n// ============================================================================\n// HELPER FUNCTIONS FOR CREATING COMMON COLUMNS\n// ============================================================================\n\n/**\n * Create timestamp column for logs\n */\nexport function createLogTimestampColumn<T extends { timestamp?: number; createdAt?: number; time?: number }>(\n options?: { header?: string; field?: \"timestamp\" | \"createdAt\" | \"time\" }\n): ColumnDef<T> {\n return {\n key: \"timestamp\",\n header: options?.header || \"Timestamp\",\n cell: (item) => {\n const field = options?.field || \"timestamp\";\n let ts = (item as any)[field];\n\n // Handle various timestamp formats\n if (field === \"createdAt\" && ts) {\n ts = ts * 1000; // Convert seconds to ms\n } else if (field === \"time\") {\n ts = (item as any).time;\n }\n\n return (\n <span style={{ fontSize: \"0.875rem\", whiteSpace: \"nowrap\" }}>\n {ts ? formatLogTimestamp(ts) : \"-\"}\n </span>\n );\n },\n };\n}\n\n/**\n * Create action column with icon and color\n */\nexport function createActionColumn<T extends { action: string }>(): ColumnDef<T> {\n const iconStyle = { height: \"1rem\", width: \"1rem\" };\n\n const getActionIcon = (action: string) => {\n switch (action) {\n case \"created\": return <Plus style={iconStyle} />;\n case \"approved\": return <Check style={iconStyle} />;\n case \"rejected\":\n case \"denied\": return <X style={iconStyle} />;\n case \"committed\": return <Upload style={iconStyle} />;\n case \"cancelled\": return <Ban style={iconStyle} />;\n default: return <Activity style={iconStyle} />;\n }\n };\n\n const getActionColor = (action: string): string => {\n switch (action) {\n case \"created\": return \"#2563eb\";\n case \"approved\": return \"#16a34a\";\n case \"rejected\":\n case \"denied\": return \"#dc2626\";\n case \"committed\": return \"#9333ea\";\n case \"cancelled\": return \"#6b7280\";\n default: return \"#6b7280\";\n }\n };\n\n return {\n key: \"action\",\n header: \"Action\",\n cell: (item) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.375rem\", fontSize: \"0.875rem\", fontWeight: 500, color: getActionColor(item.action) }}>\n {getActionIcon(item.action)}\n <span style={{ textTransform: \"capitalize\" }}>{item.action === \"denied\" ? \"rejected\" : item.action}</span>\n </div>\n ),\n };\n}\n\n/**\n * Create progress column for policy logs\n */\nexport function createLogProgressColumn<T extends { policyThreshold?: number; approvalCount?: number; rejectionCount?: number }>(): ColumnDef<T> {\n return {\n key: \"progress\",\n header: \"Progress\",\n cell: (item) => {\n if (!item.policyThreshold) {\n return <span style={{ color: \"#6b7280\" }}>-</span>;\n }\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.25rem\", fontSize: \"0.875rem\" }}>\n <span style={{ color: \"#16a34a\" }}>{item.approvalCount || 0}</span>\n <span style={{ color: \"#6b7280\" }}>/</span>\n <span>{item.policyThreshold}</span>\n {(item.rejectionCount ?? 0) > 0 && (\n <span style={{ color: \"#dc2626\", fontSize: \"0.75rem\", marginLeft: \"0.25rem\" }}>\n ({item.rejectionCount} ✗)\n </span>\n )}\n </div>\n );\n },\n };\n}\n","import React, { useState } from \"react\";\nimport { FileCode, Pencil, Plus, Trash2, Search, Code, Variable } from \"lucide-react\";\nimport { useAutoRefresh } from \"../../../hooks/useAutoRefresh\";\nimport { RefreshButton } from \"../../common/RefreshButton\";\nimport { LoadingSkeleton } from \"../../common/LoadingSkeleton\";\nimport { EmptyState } from \"../../common/EmptyState\";\nimport { DataTable } from \"../../data-table/DataTable\";\nimport { ConfirmDialog } from \"../../dialogs/ConfirmDialog\";\nimport { defaultComponents } from \"../../ui\";\nimport type { BaseDataItem, ColumnDef, ToastConfig, ParameterDef, FormFieldType } from \"../../../types\";\n\nexport interface TemplateParameter {\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"select\";\n helpText: string;\n required: boolean;\n defaultValue?: any;\n options?: string[];\n}\n\nexport interface PolicyTemplateItem extends BaseDataItem {\n name: string;\n description: string;\n csCode: string;\n parameters: TemplateParameter[];\n createdBy: string;\n}\n\nexport interface TemplateFormData {\n name: string;\n description: string;\n csCode: string;\n parameters: TemplateParameter[];\n}\n\nexport interface TemplatesPageBaseProps<T extends PolicyTemplateItem = PolicyTemplateItem> {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Help text shown below description */\n helpText?: React.ReactNode;\n /** Data fetcher */\n fetchData: () => Promise<{ templates: T[] }>;\n /** Create handler */\n onCreate: (data: TemplateFormData) => Promise<void>;\n /** Update handler */\n onUpdate: (id: string, data: Partial<TemplateFormData>) => Promise<void>;\n /** Delete handler */\n onDelete: (id: string) => Promise<void>;\n /** Check if user can edit templates */\n canEdit?: boolean;\n /** Default code for new templates */\n defaultCode?: string;\n /** Code editor language */\n codeLanguage?: string;\n /** Toast notification handler */\n toast?: (config: ToastConfig) => void;\n /** Auto-refresh interval in seconds */\n refreshInterval?: number;\n /** Query invalidation handler */\n invalidateQueries?: (queryKeys: string[]) => void;\n /** Query keys */\n queryKeys?: string[];\n /** Custom column definitions */\n columns?: ColumnDef<T>[];\n /** Empty state configuration */\n emptyState?: {\n icon?: React.ReactNode;\n title?: string;\n description?: string;\n };\n /** Custom components */\n components?: {\n Card?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n CardContent?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n Button?: React.ComponentType<any>;\n Badge?: React.ComponentType<any>;\n Skeleton?: React.ComponentType<{ className?: string }>;\n Input?: React.ComponentType<any>;\n Textarea?: React.ComponentType<any>;\n Label?: React.ComponentType<any>;\n Switch?: React.ComponentType<any>;\n Select?: React.ComponentType<any>;\n SelectTrigger?: React.ComponentType<any>;\n SelectValue?: React.ComponentType<any>;\n SelectContent?: React.ComponentType<any>;\n SelectItem?: React.ComponentType<any>;\n // Table components\n Table?: React.ComponentType<any>;\n TableHeader?: React.ComponentType<any>;\n TableBody?: React.ComponentType<any>;\n TableRow?: React.ComponentType<any>;\n TableHead?: React.ComponentType<any>;\n TableCell?: React.ComponentType<any>;\n // Dialog components\n Dialog?: React.ComponentType<any>;\n DialogContent?: React.ComponentType<any>;\n DialogHeader?: React.ComponentType<any>;\n DialogTitle?: React.ComponentType<any>;\n DialogDescription?: React.ComponentType<any>;\n DialogFooter?: React.ComponentType<any>;\n // Alert dialog\n AlertDialog?: React.ComponentType<any>;\n AlertDialogContent?: React.ComponentType<any>;\n AlertDialogHeader?: React.ComponentType<any>;\n AlertDialogTitle?: React.ComponentType<any>;\n AlertDialogDescription?: React.ComponentType<any>;\n AlertDialogFooter?: React.ComponentType<any>;\n AlertDialogAction?: React.ComponentType<any>;\n AlertDialogCancel?: React.ComponentType<any>;\n // Code editor\n CodeEditor?: React.ComponentType<{\n value: string;\n onChange: (value: string) => void;\n language?: string;\n height?: string;\n }>;\n };\n /** Additional class name */\n className?: string;\n}\n\n// ============================================================================\n// DEFAULT CODE TEMPLATE\n// ============================================================================\nconst DEFAULT_CS_CODE = `using Ork.Forseti.Sdk;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\n/// <summary>\n/// Forseti contract - start here.\n/// </summary>\npublic class Contract : IAccessPolicy\n{\n // These policy parameters are filled in by the policy \"params\" map.\n // Marking them Required ensures missing values result in deny/validation failures.\n [PolicyParam(Required = true, Description = \"Role required for SSH access (e.g., ssh:root)\")]\n public string Role { get; set; }\n\n [PolicyParam(Required = true, Description = \"Resource identifier for role checks\")]\n public string Resource { get; set; }\n\n // Called for every request. Validate the request data payload and return Allow/Deny.\n // For SSH signing, ctx.Data is the SSHv2 publickey auth \"to-be-signed\" payload.\n public PolicyDecision ValidateData(DataContext ctx)\n {\n throw new NotImplementedException(\"Implement SSH challenge validation in ValidateData().\");\n }\n\n // Called for explicit approvals. Validate that the approvers are allowed to approve this request.\n public PolicyDecision ValidateApprovers(ApproversContext ctx)\n {\n throw new NotImplementedException(\"Implement approver validation in ValidateApprovers().\");\n }\n\n // Called for execution. Validate that the executor (caller) is allowed to execute this request.\n public PolicyDecision ValidateExecutor(ExecutorContext ctx)\n {\n throw new NotImplementedException(\"Implement executor validation in ValidateExecutor().\");\n }\n}`;\n\nconst defaultFormData: TemplateFormData = {\n name: \"\",\n description: \"\",\n csCode: DEFAULT_CS_CODE,\n parameters: [],\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * TemplatesPage - Generic template management page\n *\n * @example\n * ```tsx\n * <TemplatesPage\n * fetchData={api.admin.policyTemplates.list}\n * onCreate={api.admin.policyTemplates.create}\n * onUpdate={api.admin.policyTemplates.update}\n * onDelete={api.admin.policyTemplates.delete}\n * canEdit={canManageTemplates()}\n * toast={toast}\n * />\n * ```\n */\nexport function TemplatesPageBase<T extends PolicyTemplateItem = PolicyTemplateItem>({\n title = \"Policy Templates\",\n description = \"Create reusable templates for policies\",\n helpText,\n fetchData,\n onCreate,\n onUpdate,\n onDelete,\n canEdit = true,\n defaultCode = DEFAULT_CS_CODE,\n codeLanguage = \"csharp\",\n toast,\n refreshInterval = 30,\n invalidateQueries,\n queryKeys,\n columns: customColumns,\n emptyState,\n components = {},\n className,\n}: TemplatesPageBaseProps<T>) {\n const [templates, setTemplates] = useState<T[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [editingTemplate, setEditingTemplate] = useState<T | null>(null);\n const [creatingTemplate, setCreatingTemplate] = useState(false);\n const [deletingTemplate, setDeletingTemplate] = useState<T | null>(null);\n const [formData, setFormData] = useState<TemplateFormData>({\n ...defaultFormData,\n csCode: defaultCode,\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Fetch data\n const loadData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchData();\n // Handle both array and object with templates property\n const templateList = Array.isArray(result) ? result : (result.templates || []);\n setTemplates(templateList as T[]);\n if (invalidateQueries && queryKeys) {\n invalidateQueries(queryKeys);\n }\n } catch (error) {\n console.error(\"Error fetching templates:\", error);\n toast?.({\n title: \"Failed to fetch templates\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: loadData,\n isBlocked: isLoading || isSubmitting,\n });\n\n React.useEffect(() => {\n void loadData();\n }, []);\n\n // Handlers\n const handleEdit = (template: T) => {\n setEditingTemplate(template);\n setFormData({\n name: template.name,\n description: template.description,\n csCode: template.csCode,\n parameters: template.parameters || [],\n });\n };\n\n const handleCreate = () => {\n setFormData({ ...defaultFormData, csCode: defaultCode });\n setCreatingTemplate(true);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!formData.name.trim()) {\n toast?.({ title: \"Template name is required\", variant: \"destructive\" });\n return;\n }\n if (!formData.description.trim()) {\n toast?.({ title: \"Description is required\", variant: \"destructive\" });\n return;\n }\n if (!formData.csCode.trim()) {\n toast?.({ title: \"Contract code is required\", variant: \"destructive\" });\n return;\n }\n\n setIsSubmitting(true);\n try {\n if (editingTemplate) {\n await onUpdate(editingTemplate.id, formData);\n toast?.({ title: \"Template updated successfully\" });\n } else {\n await onCreate(formData);\n toast?.({ title: \"Template created successfully\" });\n }\n setCreatingTemplate(false);\n setEditingTemplate(null);\n setFormData({ ...defaultFormData, csCode: defaultCode });\n await loadData();\n } catch (error) {\n toast?.({\n title: editingTemplate ? \"Failed to update template\" : \"Failed to create template\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleDeleteConfirm = async () => {\n if (!deletingTemplate) return;\n\n setIsSubmitting(true);\n try {\n await onDelete(deletingTemplate.id);\n toast?.({ title: \"Template deleted successfully\" });\n setDeletingTemplate(null);\n setEditingTemplate(null);\n await loadData();\n } catch (error) {\n toast?.({\n title: \"Failed to delete template\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Parameter management\n const addParameter = () => {\n setFormData({\n ...formData,\n parameters: [\n ...formData.parameters,\n {\n name: \"\",\n type: \"string\",\n helpText: \"\",\n required: true,\n defaultValue: \"\",\n },\n ],\n });\n };\n\n const updateParameter = (index: number, field: keyof TemplateParameter, value: any) => {\n const updated = [...formData.parameters];\n updated[index] = { ...updated[index], [field]: value };\n setFormData({ ...formData, parameters: updated });\n };\n\n const removeParameter = (index: number) => {\n const updated = formData.parameters.filter((_, i) => i !== index);\n setFormData({ ...formData, parameters: updated });\n };\n\n // Filter templates\n const filteredTemplates = templates.filter(\n (template) =>\n template.name.toLowerCase().includes(search.toLowerCase()) ||\n template.description.toLowerCase().includes(search.toLowerCase())\n );\n\n // Components (use defaultComponents from ui if not provided)\n const Card = components.Card || defaultComponents.Card;\n const CardContent = components.CardContent || defaultComponents.CardContent;\n const Button = components.Button || defaultComponents.Button;\n const Badge = components.Badge || defaultComponents.Badge;\n const Input = components.Input || defaultComponents.Input;\n const Textarea = components.Textarea || defaultComponents.Textarea;\n const Label = components.Label || defaultComponents.Label;\n const Switch = components.Switch || defaultComponents.Switch;\n const Select = components.Select || defaultComponents.Select;\n const SelectTrigger = components.SelectTrigger || defaultComponents.SelectTrigger;\n const SelectValue = components.SelectValue || defaultComponents.SelectValue;\n const SelectContent = components.SelectContent || defaultComponents.SelectContent;\n const SelectItem = components.SelectItem || defaultComponents.SelectItem;\n const Dialog = components.Dialog || defaultComponents.Dialog;\n const DialogContent = components.DialogContent || defaultComponents.DialogContent;\n const DialogHeader = components.DialogHeader || defaultComponents.DialogHeader;\n const DialogTitle = components.DialogTitle || defaultComponents.DialogTitle;\n const DialogDescription = components.DialogDescription || defaultComponents.DialogDescription;\n const DialogFooter = components.DialogFooter || defaultComponents.DialogFooter;\n const CodeEditor = components.CodeEditor || defaultComponents.CodeEditor;\n\n const hasSelectComponents = Select && SelectTrigger && SelectValue && SelectContent && SelectItem;\n\n // Default columns\n const defaultColumns: ColumnDef<T>[] = [\n {\n key: \"name\",\n header: \"Template Name\",\n cell: (template) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.75rem\" }}>\n <div style={{ display: \"flex\", height: \"2.25rem\", width: \"2.25rem\", alignItems: \"center\", justifyContent: \"center\", borderRadius: \"9999px\", backgroundColor: \"rgba(59, 130, 246, 0.1)\" }}>\n <Code style={{ height: \"1rem\", width: \"1rem\", color: \"#3b82f6\" }} />\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <p style={{ fontWeight: 500, margin: 0 }}>{template.name}</p>\n {template.createdBy === \"system\" && (\n <Badge variant=\"secondary\" style={{ fontSize: \"0.75rem\" }}>System</Badge>\n )}\n </div>\n </div>\n ),\n },\n {\n key: \"description\",\n header: \"Description\",\n cell: (template) => (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\" }}>{template.description}</p>\n ),\n },\n {\n key: \"parameters\",\n header: \"Parameters\",\n cell: (template) => (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.25rem\" }}>\n {template.parameters.slice(0, 3).map((param) => (\n <Badge key={param.name} variant=\"outline\" style={{ fontSize: \"0.75rem\" }}>{param.name}</Badge>\n ))}\n {template.parameters.length > 3 && (\n <Badge variant=\"outline\" style={{ fontSize: \"0.75rem\" }}>+{template.parameters.length - 3}</Badge>\n )}\n {template.parameters.length === 0 && (\n <span style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>None</span>\n )}\n </div>\n ),\n },\n {\n key: \"createdBy\",\n header: \"Created By\",\n cell: (template) => (\n <span style={{ fontSize: \"0.875rem\", color: \"#6b7280\" }}>{template.createdBy}</span>\n ),\n },\n {\n key: \"actions\",\n header: \"Actions\",\n align: \"right\",\n cell: (template) => (\n canEdit && (\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}>\n <Button size=\"icon\" variant=\"ghost\" onClick={() => handleEdit(template)}>\n <Pencil style={{ height: \"1rem\", width: \"1rem\" }} />\n </Button>\n {template.createdBy !== \"system\" && (\n <Button size=\"icon\" variant=\"ghost\" onClick={() => setDeletingTemplate(template)}>\n <Trash2 style={{ height: \"1rem\", width: \"1rem\" }} />\n </Button>\n )}\n </div>\n )\n ),\n },\n ];\n\n const columns = customColumns || defaultColumns;\n const isDialogOpen = creatingTemplate || !!editingTemplate;\n\n return (\n <div style={{ padding: \"1.5rem\" }} className={className}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: \"1.5rem\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n <div>\n <h1 style={{ fontSize: \"1.5rem\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", margin: 0 }}>\n <FileCode style={{ width: \"1.5rem\", height: \"1.5rem\" }} />\n {title}\n </h1>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\" }}>{description}</p>\n {helpText && <div style={{ fontSize: \"0.75rem\", color: \"#6b7280\", marginTop: \"0.25rem\" }}>{helpText}</div>}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RefreshButton\n onClick={() => void refreshNow()}\n isRefreshing={isLoading}\n secondsRemaining={secondsRemaining}\n title=\"Refresh now\"\n />\n {canEdit && (\n <Button onClick={handleCreate}>\n <Plus style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n Create Template\n </Button>\n )}\n </div>\n </div>\n\n {/* Search & Table */}\n <Card>\n <div style={{ padding: \"1rem\", borderBottom: \"1px solid #e5e7eb\" }}>\n <div style={{ position: \"relative\", maxWidth: \"20rem\" }}>\n <Search style={{ position: \"absolute\", left: \"0.75rem\", top: \"50%\", transform: \"translateY(-50%)\", width: \"1rem\", height: \"1rem\", color: \"#9ca3af\" }} />\n <Input\n placeholder=\"Search templates...\"\n value={search}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}\n style={{ paddingLeft: \"2.25rem\" }}\n />\n </div>\n </div>\n <CardContent style={{ padding: 0 }}>\n {isLoading && templates.length === 0 ? (\n <LoadingSkeleton rows={3} type=\"table\" SkeletonComponent={components.Skeleton} />\n ) : filteredTemplates.length > 0 ? (\n <DataTable\n data={filteredTemplates}\n columns={columns}\n components={{\n Table: components.Table,\n TableHeader: components.TableHeader,\n TableBody: components.TableBody,\n TableRow: components.TableRow,\n TableHead: components.TableHead,\n TableCell: components.TableCell,\n Skeleton: components.Skeleton,\n }}\n />\n ) : (\n <EmptyState\n icon={emptyState?.icon || <FileCode style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />}\n title={emptyState?.title || \"No templates found\"}\n description={emptyState?.description || (search ? \"Try a different search term\" : \"Create a template to get started\")}\n />\n )}\n </CardContent>\n </Card>\n\n {/* Create/Edit Dialog */}\n <Dialog open={isDialogOpen} onOpenChange={(open: boolean) => {\n if (!open) {\n setCreatingTemplate(false);\n setEditingTemplate(null);\n }\n }}>\n <DialogContent style={{ maxWidth: \"56rem\", maxHeight: \"90vh\", overflow: \"auto\" }}>\n <DialogHeader>\n <DialogTitle>{editingTemplate ? \"Edit Template\" : \"Create Template\"}</DialogTitle>\n <DialogDescription>\n {editingTemplate\n ? \"Update the template configuration and contract code\"\n : \"Create a reusable policy template with configurable parameters\"}\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} style={{ display: \"flex\", flexDirection: \"column\", gap: \"1.5rem\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"name\">Template Name</Label>\n <Input\n id=\"name\"\n value={formData.name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., SSH Access Policy\"\n required\n />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\", gridColumn: \"span 2\" }}>\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={formData.description}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this template does and when to use it...\"\n rows={2}\n required\n />\n </div>\n </div>\n\n {/* Code Editor */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <Label>Contract Code ({codeLanguage})</Label>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\", margin: 0 }}>\n Use <code style={{ backgroundColor: \"#f3f4f6\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>{\"{{PARAM_NAME}}\"}</code> for dynamic values\n </p>\n </div>\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\", overflow: \"hidden\" }}>\n <CodeEditor\n value={formData.csCode}\n onChange={(value) => setFormData({ ...formData, csCode: value })}\n language={codeLanguage}\n height=\"300px\"\n />\n </div>\n </div>\n\n {/* Parameters Section */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Variable style={{ height: \"1rem\", width: \"1rem\", color: \"#6b7280\" }} />\n <Label>Template Parameters</Label>\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addParameter}>\n <Plus style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.25rem\" }} />\n Add Parameter\n </Button>\n </div>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\", margin: 0 }}>\n Define parameters that users will fill in when using this template.\n </p>\n\n {formData.parameters.length === 0 ? (\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\", padding: \"1rem\", textAlign: \"center\", fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n No parameters defined. Add parameters to make your template configurable.\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n {formData.parameters.map((param, index) => (\n <div key={index} style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\", padding: \"1rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <span style={{ fontSize: \"0.875rem\", fontWeight: 500 }}>Parameter {index + 1}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => removeParameter(index)}>\n <Trash2 style={{ height: \"1rem\", width: \"1rem\" }} />\n </Button>\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"0.75rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>Name (placeholder)</Label>\n <Input\n value={param.name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateParameter(index, \"name\", e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, \"_\"))}\n placeholder=\"e.g., APPROVAL_TYPE\"\n style={{ fontFamily: \"monospace\", fontSize: \"0.875rem\" }}\n />\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\", margin: 0 }}>\n Use in code as: <code>{`{{${param.name || \"NAME\"}}}`}</code>\n </p>\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>Type</Label>\n {hasSelectComponents ? (\n <Select\n value={param.type}\n onValueChange={(v: string) => updateParameter(index, \"type\", v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"string\">Text</SelectItem>\n <SelectItem value=\"number\">Number</SelectItem>\n <SelectItem value=\"boolean\">Yes/No</SelectItem>\n <SelectItem value=\"select\">Select (Dropdown)</SelectItem>\n </SelectContent>\n </Select>\n ) : (\n <select\n value={param.type}\n onChange={(e) => updateParameter(index, \"type\", e.target.value)}\n style={{ display: \"flex\", height: \"2.5rem\", width: \"100%\", borderRadius: \"0.375rem\", border: \"1px solid #d1d5db\", backgroundColor: \"#fff\", padding: \"0.5rem 0.75rem\", fontSize: \"0.875rem\" }}\n >\n <option value=\"string\">Text</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Yes/No</option>\n <option value=\"select\">Select (Dropdown)</option>\n </select>\n )}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\", gridColumn: \"span 2\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>Help Text</Label>\n <Input\n value={param.helpText}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateParameter(index, \"helpText\", e.target.value)}\n placeholder=\"Explain what this parameter does...\"\n />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>Default Value</Label>\n <Input\n value={param.defaultValue?.toString() || \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateParameter(index, \"defaultValue\", e.target.value)}\n placeholder=\"Optional default\"\n />\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", paddingTop: \"1.25rem\" }}>\n <Switch\n checked={param.required}\n onCheckedChange={(v: boolean) => updateParameter(index, \"required\", v)}\n />\n <Label style={{ fontSize: \"0.75rem\" }}>Required</Label>\n </div>\n {param.type === \"select\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\", gridColumn: \"span 2\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>Options (comma-separated)</Label>\n <Input\n value={param.options?.join(\", \") || \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateParameter(index, \"options\", e.target.value.split(\",\").map(s => s.trim()).filter(Boolean))}\n placeholder=\"e.g., option1, option2, option3\"\n />\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <DialogFooter style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n {editingTemplate && editingTemplate.createdBy !== \"system\" && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => setDeletingTemplate(editingTemplate)}\n >\n <Trash2 style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n Delete\n </Button>\n )}\n {(!editingTemplate || editingTemplate.createdBy === \"system\") && <div />}\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setCreatingTemplate(false);\n setEditingTemplate(null);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? \"Saving...\" : editingTemplate ? \"Save Changes\" : \"Create Template\"}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation */}\n <ConfirmDialog\n open={!!deletingTemplate}\n onClose={() => setDeletingTemplate(null)}\n onConfirm={handleDeleteConfirm}\n title=\"Delete Template\"\n description={`Are you sure you want to delete \"${deletingTemplate?.name}\"? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n confirmVariant=\"destructive\"\n isLoading={isSubmitting}\n components={{\n AlertDialog: components.AlertDialog,\n AlertDialogContent: components.AlertDialogContent,\n AlertDialogHeader: components.AlertDialogHeader,\n AlertDialogTitle: components.AlertDialogTitle,\n AlertDialogDescription: components.AlertDialogDescription,\n AlertDialogFooter: components.AlertDialogFooter,\n AlertDialogAction: components.AlertDialogAction,\n AlertDialogCancel: components.AlertDialogCancel,\n }}\n />\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { Users, Pencil, Search, Shield, User as UserIcon, Plus, Trash2, X, Link, Unlink, Copy, Check, AlertCircle } from \"lucide-react\";\nimport { useAutoRefresh } from \"../../../hooks/useAutoRefresh\";\nimport { RefreshButton } from \"../../common/RefreshButton\";\nimport { StatusBadge } from \"../../common/StatusBadge\";\nimport { LoadingSkeleton } from \"../../common/LoadingSkeleton\";\nimport { EmptyState } from \"../../common/EmptyState\";\nimport { DataTable } from \"../../data-table/DataTable\";\nimport { ConfirmDialog } from \"../../dialogs/ConfirmDialog\";\nimport { defaultComponents } from \"../../ui\";\nimport type { BaseDataItem, ColumnDef, ToastConfig } from \"../../../types\";\n\nexport interface UserItem extends BaseDataItem {\n username?: string;\n firstName: string;\n lastName: string;\n email: string;\n role: string | string[];\n enabled: boolean;\n linked?: boolean;\n isAdmin?: boolean;\n}\n\nexport interface RoleItem {\n id: string;\n name: string;\n description?: string;\n}\n\nexport interface UserFormData {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n assignedRoles: string[];\n}\n\nexport interface CreateUserFormData {\n username: string;\n firstName: string;\n lastName: string;\n email: string;\n}\n\nexport interface UsersPageBaseProps<T extends UserItem = UserItem> {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Whether the API is ready to be called (defaults to true for backwards compatibility) */\n isReady?: boolean;\n /** Data fetcher */\n fetchUsers: () => Promise<T[]>;\n /** Fetch available roles */\n fetchRoles: () => Promise<{ roles: RoleItem[] }>;\n /** Create user handler */\n onCreate: (data: CreateUserFormData) => Promise<void>;\n /** Update profile handler */\n onUpdateProfile: (data: { id: string; firstName: string; lastName: string; email: string }) => Promise<void>;\n /** Update roles handler */\n onUpdateRoles: (data: { id: string; rolesToAdd?: string[]; rolesToRemove?: string[] }) => Promise<void>;\n /** Delete user handler */\n onDelete: (userId: string) => Promise<void>;\n /** Set user enabled/disabled */\n onSetEnabled?: (userId: string, enabled: boolean) => Promise<void>;\n /** Get Tide link URL */\n getTideLinkUrl?: (userId: string) => Promise<{ linkUrl: string }>;\n /** Check if user can create more users */\n checkUserLimit?: () => Promise<{ allowed: boolean; current: number; limit: number; tierName?: string }>;\n /** License info for over-limit warnings */\n licenseInfo?: {\n overLimit?: {\n users: {\n isOverLimit: boolean;\n enabled: number;\n limit: number;\n overBy: number;\n };\n };\n };\n /** Toast handler */\n toast?: (config: ToastConfig) => void;\n /** Auto-refresh interval */\n refreshInterval?: number;\n /** Query invalidation */\n invalidateQueries?: (queryKeys: string[]) => void;\n /** Query keys */\n queryKeys?: string[];\n /** Custom columns */\n columns?: ColumnDef<T>[];\n /** Custom components */\n components?: {\n Card?: React.ComponentType<any>;\n CardContent?: React.ComponentType<any>;\n Button?: React.ComponentType<any>;\n Badge?: React.ComponentType<any>;\n Skeleton?: React.ComponentType<any>;\n Input?: React.ComponentType<any>;\n Label?: React.ComponentType<any>;\n Switch?: React.ComponentType<any>;\n ScrollArea?: React.ComponentType<any>;\n Table?: React.ComponentType<any>;\n TableHeader?: React.ComponentType<any>;\n TableBody?: React.ComponentType<any>;\n TableRow?: React.ComponentType<any>;\n TableHead?: React.ComponentType<any>;\n TableCell?: React.ComponentType<any>;\n Dialog?: React.ComponentType<any>;\n DialogContent?: React.ComponentType<any>;\n DialogHeader?: React.ComponentType<any>;\n DialogTitle?: React.ComponentType<any>;\n DialogDescription?: React.ComponentType<any>;\n DialogFooter?: React.ComponentType<any>;\n AlertDialog?: React.ComponentType<any>;\n AlertDialogContent?: React.ComponentType<any>;\n AlertDialogHeader?: React.ComponentType<any>;\n AlertDialogTitle?: React.ComponentType<any>;\n AlertDialogDescription?: React.ComponentType<any>;\n AlertDialogFooter?: React.ComponentType<any>;\n AlertDialogAction?: React.ComponentType<any>;\n AlertDialogCancel?: React.ComponentType<any>;\n Alert?: React.ComponentType<any>;\n AlertDescription?: React.ComponentType<any>;\n UpgradeBanner?: React.ComponentType<any>;\n };\n /** Additional class name */\n className?: string;\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * UsersPage - Generic user management page\n *\n * @example\n * ```tsx\n * <UsersPage\n * fetchUsers={api.admin.users.list}\n * fetchRoles={() => api.admin.roles.listAll()}\n * onCreate={api.admin.users.add}\n * onUpdateProfile={api.admin.users.updateProfile}\n * onUpdateRoles={api.admin.users.updateRoles}\n * onDelete={api.admin.users.delete}\n * onSetEnabled={(id, enabled) => api.admin.users.setEnabled(id, enabled)}\n * toast={toast}\n * />\n * ```\n */\nexport function UsersPageBase<T extends UserItem = UserItem>({\n title = \"Manage Users\",\n description = \"Manage user accounts, roles, and permissions\",\n isReady = true,\n fetchUsers,\n fetchRoles,\n onCreate,\n onUpdateProfile,\n onUpdateRoles,\n onDelete,\n onSetEnabled,\n getTideLinkUrl,\n checkUserLimit,\n licenseInfo,\n toast,\n refreshInterval = 15,\n invalidateQueries,\n queryKeys,\n columns: customColumns,\n components = {},\n className,\n}: UsersPageBaseProps<T>) {\n // State\n const [users, setUsers] = useState<T[]>([]);\n const [allRoles, setAllRoles] = useState<RoleItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [editingUser, setEditingUser] = useState<T | null>(null);\n const [creatingUser, setCreatingUser] = useState(false);\n const [deletingUser, setDeletingUser] = useState<T | null>(null);\n const [copyStatus, setCopyStatus] = useState(\"\");\n const [userLimit, setUserLimit] = useState<{ allowed: boolean; current: number; limit: number; tierName?: string } | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const [formData, setFormData] = useState<UserFormData>({\n id: \"\",\n firstName: \"\",\n lastName: \"\",\n email: \"\",\n assignedRoles: [],\n });\n const [initialRoles, setInitialRoles] = useState<string[]>([]);\n\n const [createFormData, setCreateFormData] = useState<CreateUserFormData>({\n username: \"\",\n firstName: \"\",\n lastName: \"\",\n email: \"\",\n });\n\n // Components (use defaultComponents from ui if not provided)\n const Card = components.Card || defaultComponents.Card;\n const CardContent = components.CardContent || defaultComponents.CardContent;\n const Button = components.Button || defaultComponents.Button;\n const Badge = components.Badge || defaultComponents.Badge;\n const Input = components.Input || defaultComponents.Input;\n const Label = components.Label || defaultComponents.Label;\n const Switch = components.Switch || defaultComponents.Switch;\n const ScrollArea = components.ScrollArea || defaultComponents.ScrollArea;\n const Dialog = components.Dialog || defaultComponents.Dialog;\n const DialogContent = components.DialogContent || defaultComponents.DialogContent;\n const DialogHeader = components.DialogHeader || defaultComponents.DialogHeader;\n const DialogTitle = components.DialogTitle || defaultComponents.DialogTitle;\n const DialogDescription = components.DialogDescription || defaultComponents.DialogDescription;\n const DialogFooter = components.DialogFooter || defaultComponents.DialogFooter;\n const Alert = components.Alert || defaultComponents.Alert;\n const AlertDescription = components.AlertDescription || defaultComponents.AlertDescription;\n\n // Fetch data\n const loadData = async () => {\n setIsLoading(true);\n try {\n const [usersResult, rolesResult, limitResult] = await Promise.all([\n fetchUsers(),\n fetchRoles(),\n checkUserLimit?.(),\n ]);\n setUsers(Array.isArray(usersResult) ? usersResult : (usersResult as any).users || []);\n setAllRoles(Array.isArray(rolesResult) ? rolesResult : (rolesResult as any).roles || []);\n if (limitResult) setUserLimit(limitResult);\n if (invalidateQueries && queryKeys) {\n invalidateQueries(queryKeys);\n }\n } catch (error) {\n console.error(\"Error fetching users:\", error);\n toast?.({\n title: \"Failed to fetch users\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n // Auto refresh (blocked until API is ready)\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: loadData,\n isBlocked: !isReady || isLoading || isSubmitting,\n });\n\n // Initial fetch (only when API is ready)\n useEffect(() => {\n if (isReady) {\n void loadData();\n }\n }, [isReady]);\n\n // Handlers\n const handleEdit = (user: T) => {\n const userRoles = Array.isArray(user.role) ? user.role : user.role ? [user.role] : [];\n setEditingUser(user);\n setInitialRoles(userRoles);\n setFormData({\n id: user.id,\n firstName: user.firstName,\n lastName: user.lastName,\n email: user.email,\n assignedRoles: userRoles,\n });\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!editingUser) return;\n\n const profileChanged =\n editingUser.firstName !== formData.firstName ||\n editingUser.lastName !== formData.lastName ||\n editingUser.email !== formData.email;\n\n const rolesToAdd = formData.assignedRoles.filter((role) => !initialRoles.includes(role));\n const rolesToRemove = initialRoles.filter((role) => !formData.assignedRoles.includes(role));\n const rolesChanged = rolesToAdd.length > 0 || rolesToRemove.length > 0;\n\n setIsSubmitting(true);\n try {\n if (profileChanged) {\n await onUpdateProfile({\n id: formData.id,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n });\n }\n\n if (rolesChanged) {\n await onUpdateRoles({\n id: formData.id,\n rolesToAdd: rolesToAdd.length > 0 ? rolesToAdd : undefined,\n rolesToRemove: rolesToRemove.length > 0 ? rolesToRemove : undefined,\n });\n }\n\n setEditingUser(null);\n toast?.({ title: \"User updated successfully\" });\n await loadData();\n } catch (error) {\n toast?.({\n title: \"Failed to update user\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleCreateSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n try {\n await onCreate(createFormData);\n setCreatingUser(false);\n setCreateFormData({ username: \"\", firstName: \"\", lastName: \"\", email: \"\" });\n toast?.({ title: \"User created successfully\" });\n await loadData();\n } catch (error) {\n toast?.({\n title: \"Failed to create user\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleDeleteConfirm = async () => {\n if (!deletingUser) return;\n setIsSubmitting(true);\n try {\n await onDelete(deletingUser.id);\n setDeletingUser(null);\n setEditingUser(null);\n toast?.({ title: \"User deleted successfully\" });\n await loadData();\n } catch (error) {\n toast?.({\n title: \"Failed to delete user\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSetEnabled = async (userId: string, enabled: boolean) => {\n if (!onSetEnabled) return;\n try {\n await onSetEnabled(userId, enabled);\n toast?.({ title: enabled ? \"User enabled\" : \"User disabled\" });\n await loadData();\n } catch (error) {\n toast?.({\n title: \"Failed to update user status\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n }\n };\n\n const handleCopyTideLink = async () => {\n if (!editingUser || !getTideLinkUrl) return;\n try {\n const response = await getTideLinkUrl(editingUser.id);\n await navigator.clipboard.writeText(response.linkUrl);\n setCopyStatus(\"Copied!\");\n setTimeout(() => setCopyStatus(\"\"), 2000);\n } catch {\n setCopyStatus(\"Failed to copy\");\n setTimeout(() => setCopyStatus(\"\"), 2000);\n }\n };\n\n const assignRole = (roleName: string) => {\n setFormData((prev) => ({\n ...prev,\n assignedRoles: [...prev.assignedRoles, roleName],\n }));\n };\n\n const unassignRole = (roleName: string) => {\n setFormData((prev) => ({\n ...prev,\n assignedRoles: prev.assignedRoles.filter((r) => r !== roleName),\n }));\n };\n\n const availableRoles = allRoles\n .map((role) => role.name)\n .filter((roleName) => !formData.assignedRoles.includes(roleName));\n\n const filteredUsers = users.filter(\n (user) =>\n user.username?.toLowerCase().includes(search.toLowerCase()) ||\n user.email.toLowerCase().includes(search.toLowerCase()) ||\n user.firstName.toLowerCase().includes(search.toLowerCase()) ||\n user.lastName.toLowerCase().includes(search.toLowerCase())\n );\n\n // Default columns\n const defaultColumns: ColumnDef<T>[] = [\n {\n key: \"user\",\n header: \"User\",\n cell: (user) => {\n const userRoles = Array.isArray(user.role) ? user.role : user.role ? [user.role] : [];\n const isAdmin = userRoles.some((r) => r.toLowerCase().includes(\"admin\"));\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.75rem\" }}>\n <div style={{ display: \"flex\", height: \"2.25rem\", width: \"2.25rem\", alignItems: \"center\", justifyContent: \"center\", borderRadius: \"9999px\", backgroundColor: \"rgba(59, 130, 246, 0.1)\" }}>\n {isAdmin ? (\n <Shield style={{ height: \"1rem\", width: \"1rem\", color: \"#3b82f6\" }} />\n ) : (\n <UserIcon style={{ height: \"1rem\", width: \"1rem\", color: \"#3b82f6\" }} />\n )}\n </div>\n <div>\n <p style={{ fontWeight: 500 }}>{user.firstName} {user.lastName}</p>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>{user.email}</p>\n </div>\n </div>\n );\n },\n },\n {\n key: \"roles\",\n header: \"Roles\",\n responsive: \"sm\",\n cell: (user) => {\n const userRoles = Array.isArray(user.role) ? user.role : user.role ? [user.role] : [];\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.25rem\" }}>\n {userRoles.length > 0 ? (\n <>\n {userRoles.slice(0, 2).map((role) => (\n <Badge key={role} variant=\"secondary\" style={{ fontSize: \"0.75rem\" }}>{role}</Badge>\n ))}\n {userRoles.length > 2 && (\n <Badge variant=\"outline\" style={{ fontSize: \"0.75rem\" }}>+{userRoles.length - 2}</Badge>\n )}\n </>\n ) : (\n <span style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>No roles</span>\n )}\n </div>\n );\n },\n },\n {\n key: \"status\",\n header: \"Account Status\",\n responsive: \"md\",\n cell: (user) => (\n user.linked ? (\n <StatusBadge status=\"success\" label=\"Linked\" icon={<Link style={{ height: \"0.75rem\", width: \"0.75rem\", marginRight: \"0.25rem\" }} />} />\n ) : (\n <StatusBadge status=\"info\" label=\"Not linked\" icon={<Unlink style={{ height: \"0.75rem\", width: \"0.75rem\", marginRight: \"0.25rem\" }} />} />\n )\n ),\n },\n {\n key: \"access\",\n header: \"Access\",\n responsive: \"lg\",\n cell: (user) => {\n const userRoles = Array.isArray(user.role) ? user.role : user.role ? [user.role] : [];\n const isAdmin = userRoles.some((r) => r.toLowerCase().includes(\"admin\"));\n\n if (isAdmin) {\n return <span style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>Admin (cannot disable)</span>;\n }\n\n return onSetEnabled ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Switch\n checked={user.enabled}\n onCheckedChange={(enabled: boolean) => handleSetEnabled(user.id, enabled)}\n />\n <span style={{ fontSize: \"0.75rem\", color: user.enabled ? \"#16a34a\" : \"#6b7280\" }}>\n {user.enabled ? \"Enabled\" : \"Disabled\"}\n </span>\n </div>\n ) : (\n <span style={{ fontSize: \"0.75rem\", color: user.enabled ? \"#16a34a\" : \"#6b7280\" }}>\n {user.enabled ? \"Enabled\" : \"Disabled\"}\n </span>\n );\n },\n },\n {\n key: \"actions\",\n header: \"Actions\",\n align: \"right\",\n cell: (user) => (\n <Button size=\"icon\" variant=\"ghost\" onClick={() => handleEdit(user)}>\n <Pencil style={{ height: \"1rem\", width: \"1rem\" }} />\n </Button>\n ),\n },\n ];\n\n const columns = customColumns || defaultColumns;\n\n return (\n <div style={{ padding: \"1.5rem\", display: \"flex\", flexDirection: \"column\", gap: \"1.5rem\" }} className={className}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <h1 style={{ fontSize: \"1.5rem\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", margin: 0 }}>\n <Users style={{ height: \"1.5rem\", width: \"1.5rem\" }} />\n {title}\n </h1>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: 0 }}>{description}</p>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RefreshButton\n onClick={() => void refreshNow()}\n isRefreshing={isLoading}\n secondsRemaining={secondsRemaining}\n title=\"Refresh now\"\n ButtonComponent={components.Button}\n />\n <Button\n onClick={() => setCreatingUser(true)}\n disabled={userLimit ? !userLimit.allowed : false}\n title={\n userLimit && !userLimit.allowed\n ? `User limit reached (${userLimit.current}/${userLimit.limit})`\n : \"Add User\"\n }\n >\n <Plus style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n Add User\n </Button>\n </div>\n </div>\n\n {/* Limit Warning */}\n {userLimit && !userLimit.allowed && components.UpgradeBanner && (\n <components.UpgradeBanner\n message={`User limit reached (${userLimit.current}/${userLimit.limit}) on the ${userLimit.tierName} plan.`}\n current={userLimit.current}\n limit={userLimit.limit}\n tierName={userLimit.tierName}\n />\n )}\n\n {/* Over Limit Alert */}\n {licenseInfo?.overLimit?.users.isOverLimit && (\n <Alert style={{ backgroundColor: \"#fef2f2\", borderColor: \"#fecaca\" }}>\n <AlertCircle style={{ height: \"1rem\", width: \"1rem\", color: \"#dc2626\" }} />\n <AlertDescription style={{ color: \"#991b1b\" }}>\n <strong>User limit exceeded.</strong> You have {licenseInfo.overLimit.users.enabled} enabled users but your plan allows {licenseInfo.overLimit.users.limit}.\n Please disable {licenseInfo.overLimit.users.overBy} user(s) or upgrade your plan.\n </AlertDescription>\n </Alert>\n )}\n\n {/* Users Table */}\n <Card>\n <div style={{ padding: \"1rem\", borderBottom: \"1px solid #e5e7eb\" }}>\n <div style={{ position: \"relative\", maxWidth: \"20rem\" }}>\n <Search style={{ position: \"absolute\", left: \"0.75rem\", top: \"50%\", transform: \"translateY(-50%)\", height: \"1rem\", width: \"1rem\", color: \"#9ca3af\" }} />\n <Input\n placeholder=\"Search users...\"\n value={search}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}\n style={{ paddingLeft: \"2.25rem\" }}\n />\n </div>\n </div>\n <CardContent style={{ padding: 0 }}>\n {isLoading && users.length === 0 ? (\n <LoadingSkeleton rows={3} type=\"table\" SkeletonComponent={components.Skeleton} />\n ) : filteredUsers.length > 0 ? (\n <DataTable\n data={filteredUsers}\n columns={columns}\n components={{\n Table: components.Table,\n TableHeader: components.TableHeader,\n TableBody: components.TableBody,\n TableRow: components.TableRow,\n TableHead: components.TableHead,\n TableCell: components.TableCell,\n Skeleton: components.Skeleton,\n }}\n />\n ) : (\n <EmptyState\n icon={<Users style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />}\n title=\"No users found\"\n description={search ? \"Try a different search term\" : \"No users have been created yet\"}\n />\n )}\n </CardContent>\n </Card>\n\n {/* Edit User Dialog */}\n <Dialog open={!!editingUser} onOpenChange={(open: boolean) => !open && setEditingUser(null)}>\n <DialogContent style={{ maxWidth: \"32rem\" }}>\n <DialogHeader>\n <DialogTitle>Edit User</DialogTitle>\n <DialogDescription>Update user details and manage role assignments</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>First Name</Label>\n <Input\n value={formData.firstName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormData({ ...formData, firstName: e.target.value })}\n required\n />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Last Name</Label>\n <Input\n value={formData.lastName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormData({ ...formData, lastName: e.target.value })}\n required\n />\n </div>\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Email</Label>\n <Input\n type=\"email\"\n value={formData.email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormData({ ...formData, email: e.target.value })}\n required\n />\n </div>\n\n {/* Role Manager */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Manage Roles</Label>\n {!editingUser?.linked && (\n <p style={{ fontSize: \"0.875rem\", color: \"#d97706\" }}>\n User must be linked before roles can be assigned.\n </p>\n )}\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\", opacity: !editingUser?.linked ? 0.5 : 1, pointerEvents: !editingUser?.linked ? \"none\" : \"auto\" }}>\n {/* Assigned Roles */}\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\" }}>\n <div style={{ padding: \"0.5rem\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\" }}>\n <h4 style={{ fontSize: \"0.875rem\", fontWeight: 500 }}>Assigned Roles</h4>\n </div>\n <ScrollArea style={{ height: \"8rem\" }}>\n <div style={{ padding: \"0.5rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n {formData.assignedRoles.length > 0 ? (\n formData.assignedRoles.map((roleName) => (\n <div key={roleName} style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"0.5rem\", borderRadius: \"0.375rem\", backgroundColor: \"#f3f4f6\", fontSize: \"0.875rem\" }}>\n <span>{roleName}</span>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n style={{ height: \"1.5rem\", width: \"1.5rem\" }}\n onClick={() => unassignRole(roleName)}\n disabled={!editingUser?.linked}\n >\n <X style={{ height: \"0.75rem\", width: \"0.75rem\" }} />\n </Button>\n </div>\n ))\n ) : (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", textAlign: \"center\", padding: \"1rem 0\" }}>No roles assigned</p>\n )}\n </div>\n </ScrollArea>\n </div>\n\n {/* Available Roles */}\n <div style={{ border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\" }}>\n <div style={{ padding: \"0.5rem\", backgroundColor: \"#f9fafb\", borderBottom: \"1px solid #e5e7eb\" }}>\n <h4 style={{ fontSize: \"0.875rem\", fontWeight: 500 }}>Available Roles</h4>\n </div>\n <ScrollArea style={{ height: \"8rem\" }}>\n <div style={{ padding: \"0.5rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n {availableRoles.length > 0 ? (\n availableRoles.map((roleName) => (\n <div\n key={roleName}\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"0.5rem\", borderRadius: \"0.375rem\", fontSize: \"0.875rem\", cursor: \"pointer\" }}\n onClick={() => editingUser?.linked && assignRole(roleName)}\n >\n <span>{roleName}</span>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n style={{ height: \"1.5rem\", width: \"1.5rem\" }}\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); assignRole(roleName); }}\n disabled={!editingUser?.linked}\n >\n <Plus style={{ height: \"0.75rem\", width: \"0.75rem\" }} />\n </Button>\n </div>\n ))\n ) : (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", textAlign: \"center\", padding: \"1rem 0\" }}>All roles assigned</p>\n )}\n </div>\n </ScrollArea>\n </div>\n </div>\n </div>\n\n {/* Link Tide Account */}\n {!editingUser?.linked && getTideLinkUrl && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Link Tide Account</Label>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Button type=\"button\" variant=\"outline\" onClick={handleCopyTideLink}>\n <Copy style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n Copy Tide Link\n </Button>\n {copyStatus && (\n <span style={{ fontSize: \"0.875rem\", color: \"#6b7280\", display: \"flex\", alignItems: \"center\", gap: \"0.25rem\" }}>\n <Check style={{ height: \"1rem\", width: \"1rem\", color: \"#16a34a\" }} />\n {copyStatus}\n </span>\n )}\n </div>\n </div>\n )}\n\n <DialogFooter style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n <Button type=\"button\" variant=\"destructive\" onClick={() => editingUser && setDeletingUser(editingUser)}>\n <Trash2 style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n Delete\n </Button>\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <Button type=\"button\" variant=\"outline\" onClick={() => setEditingUser(null)}>Cancel</Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? \"Saving...\" : \"Save Changes\"}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n {/* Create User Dialog */}\n <Dialog open={creatingUser} onOpenChange={(open: boolean) => !open && setCreatingUser(false)}>\n <DialogContent style={{ maxWidth: \"28rem\" }}>\n <DialogHeader>\n <DialogTitle>Add New User</DialogTitle>\n <DialogDescription>Create a new user account</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleCreateSubmit} style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"username\">Username</Label>\n <Input\n id=\"username\"\n value={createFormData.username}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setCreateFormData({ ...createFormData, username: e.target.value })}\n placeholder=\"johndoe\"\n required\n />\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"firstName\">First Name</Label>\n <Input\n id=\"firstName\"\n value={createFormData.firstName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setCreateFormData({ ...createFormData, firstName: e.target.value })}\n placeholder=\"John\"\n required\n />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"lastName\">Last Name</Label>\n <Input\n id=\"lastName\"\n value={createFormData.lastName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setCreateFormData({ ...createFormData, lastName: e.target.value })}\n placeholder=\"Doe\"\n required\n />\n </div>\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n value={createFormData.email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setCreateFormData({ ...createFormData, email: e.target.value })}\n placeholder=\"john@example.com\"\n required\n />\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreatingUser(false)}>Cancel</Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? \"Creating...\" : \"Create User\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation */}\n <ConfirmDialog\n open={!!deletingUser}\n onClose={() => setDeletingUser(null)}\n onConfirm={handleDeleteConfirm}\n title=\"Delete User\"\n description={`Are you sure you want to delete ${deletingUser?.firstName} ${deletingUser?.lastName}? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n confirmVariant=\"destructive\"\n isLoading={isSubmitting}\n components={{\n AlertDialog: components.AlertDialog,\n AlertDialogContent: components.AlertDialogContent,\n AlertDialogHeader: components.AlertDialogHeader,\n AlertDialogTitle: components.AlertDialogTitle,\n AlertDialogDescription: components.AlertDialogDescription,\n AlertDialogFooter: components.AlertDialogFooter,\n AlertDialogAction: components.AlertDialogAction,\n AlertDialogCancel: components.AlertDialogCancel,\n }}\n />\n </div>\n );\n}\n","import React, { useState, useMemo, useCallback } from \"react\";\nimport {\n KeyRound,\n Pencil,\n Plus,\n Trash2,\n Search,\n Shield,\n FileCode,\n} from \"lucide-react\";\nimport { useAutoRefresh } from \"../../../hooks/useAutoRefresh\";\nimport { RefreshButton } from \"../../common/RefreshButton\";\nimport { defaultComponents } from \"../../ui\";\nimport type { BaseDataItem, ColumnDef, FormFieldDef } from \"../../../types\";\n\nexport interface RoleItem extends BaseDataItem {\n name: string;\n description?: string;\n clientRole?: boolean;\n /** For display purposes - which type this role belongs to */\n roleType?: \"realm\" | \"client\";\n}\n\n/** Role type configuration for RolesPage */\nexport type RoleTypeConfig = \"realm\" | \"client\" | \"all\";\n\nexport interface PolicyTemplateItem {\n id: string;\n name: string;\n description?: string;\n csCode: string;\n parameters: TemplateParameter[];\n}\n\nexport interface TemplateParameter {\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"select\";\n required?: boolean;\n defaultValue?: string | number | boolean;\n helpText?: string;\n options?: string[]; // For select type\n}\n\nexport interface PolicyConfig {\n enabled: boolean;\n contractType: string;\n approvalType: \"implicit\" | \"explicit\";\n executionType: \"public\" | \"private\";\n threshold: number;\n}\n\nexport interface RolesPageBaseProps<TRole extends RoleItem = RoleItem> {\n /** Page title */\n title?: string;\n /** Page description */\n description?: string;\n /** Help text shown below description */\n helpText?: React.ReactNode;\n /** SSH role info text */\n sshRoleInfo?: string;\n /** Whether the API is ready to be called (defaults to true for backwards compatibility) */\n isReady?: boolean;\n /** Role type configuration: 'realm', 'client', or 'all' (default: 'realm') */\n roleType?: RoleTypeConfig;\n /** Special role prefix (e.g., \"ssh:\", \"admin:\"). Used to identify and auto-prefix special roles. */\n specialRolePrefix?: string;\n /** Special role type label (e.g., \"SSH\", \"Admin\"). Used for display purposes. */\n specialRoleType?: string;\n\n // Data fetching\n /** Fetch roles */\n fetchRoles: () => Promise<{ roles: TRole[] } | TRole[]>;\n /** Fetch policy templates */\n fetchTemplates?: () => Promise<{ templates: PolicyTemplateItem[] } | PolicyTemplateItem[]>;\n /** Fetch users for threshold calculation */\n fetchUsers?: () => Promise<any[]>;\n /** Fetch pending approvals */\n fetchPendingApprovals?: () => Promise<any[]>;\n /** Fetch existing policy for a role */\n fetchRolePolicy?: (roleName: string) => Promise<{ policy: PolicyConfig | null }>;\n\n // Actions\n /** Create role */\n onCreate: (data: { name: string; description?: string; policy?: PolicyConfig; roleType?: \"realm\" | \"client\" }) => Promise<void>;\n /** Update role */\n onUpdate: (data: { name: string; description?: string }) => Promise<void>;\n /** Delete role */\n onDelete: (roleName: string) => Promise<{ approvalCreated?: boolean }>;\n /** Create policy request (for SSH roles) */\n onCreatePolicy?: (params: {\n roleName: string;\n policyConfig: PolicyConfig;\n templateId?: string;\n templateParams?: Record<string, any>;\n threshold: number;\n }) => Promise<void>;\n\n // Configuration\n /** Contract type options */\n contractTypes?: { value: string; label: string; description?: string }[];\n /** Default policy config */\n defaultPolicyConfig?: PolicyConfig;\n /** Check if role is a special prefixed role */\n isSpecialRole?: (role: TRole | string) => boolean;\n /** Normalize special role name (add prefix) */\n normalizeSpecialRoleName?: (name: string) => string;\n /** Customizable UI labels */\n labels?: {\n /** Special role prefix (default: \"ssh:\") */\n specialRolePrefix?: string;\n /** Special role type label (default: \"SSH\") */\n specialRoleType?: string;\n /** Special role checkbox label */\n specialRoleCheckbox?: string;\n /** Special role hint text */\n specialRoleHint?: string;\n /** Policy section title */\n policySectionTitle?: string;\n /** Policy section description */\n policySectionDescription?: string;\n /** Default policy option label */\n defaultPolicyLabel?: string;\n /** Default policy description */\n defaultPolicyDescription?: string;\n /** Create policy checkbox label */\n createPolicyCheckbox?: string;\n /** Role type labels */\n clientRoleLabel?: string;\n realmRoleLabel?: string;\n /** Info text shown in header */\n specialRoleInfo?: string;\n /** Button labels */\n addRoleButton?: string;\n createButton?: string;\n saveButton?: string;\n cancelButton?: string;\n deleteButton?: string;\n /** Dialog titles */\n addRoleTitle?: string;\n editRoleTitle?: string;\n deleteRoleTitle?: string;\n /** Placeholders */\n searchPlaceholder?: string;\n roleNamePlaceholder?: string;\n specialRoleNamePlaceholder?: string;\n descriptionPlaceholder?: string;\n /** Empty state */\n noRolesTitle?: string;\n noRolesDescription?: string;\n /** No search results message */\n noSearchResultsMessage?: string;\n /** Messages */\n roleCreatedMessage?: string;\n roleUpdatedMessage?: string;\n roleDeletedMessage?: string;\n policyCreatedMessage?: string;\n /** Badge text for special roles in table */\n specialRoleBadge?: string;\n /** Description for create role dialog */\n createRoleDescription?: string;\n /** Description for edit role dialog */\n editRoleDescription?: string;\n /** Role name disabled hint */\n roleNameDisabledHint?: string;\n /** Policy update warning */\n policyUpdateWarning?: string;\n /** Delete confirmation message */\n deleteConfirmMessage?: string;\n /** Approval request message */\n approvalRequestMessage?: string;\n /** No description text */\n noDescriptionText?: string;\n /** Loading policy text */\n loadingPolicyText?: string;\n /** Update signing policy checkbox label */\n updatePolicyCheckbox?: string;\n /** Policy template label */\n policyTemplateLabel?: string;\n };\n /** Calculate threshold from users */\n calculateThreshold?: (users: any[], pendingApprovals: any[]) => number;\n /** Admin role set for threshold calculation */\n adminRoleSet?: Set<string>;\n\n // UI\n /** Custom columns for role table */\n columns?: ColumnDef<TRole>[];\n /** Toast function */\n toast?: (options: { title: string; description?: string; variant?: string }) => void;\n /** Invalidate queries */\n invalidateQueries?: (keys: string[]) => void;\n /** Query keys to invalidate on changes */\n queryKeys?: string[];\n /** Auto-refresh interval in seconds */\n refreshInterval?: number;\n /** Additional class name */\n className?: string;\n\n // Custom components\n components?: {\n Card?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n CardContent?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n Button?: React.ComponentType<any>;\n Badge?: React.ComponentType<{ children: React.ReactNode; variant?: string; className?: string }>;\n Skeleton?: React.ComponentType<{ className?: string }>;\n Input?: React.ComponentType<any>;\n Label?: React.ComponentType<any>;\n Textarea?: React.ComponentType<any>;\n Checkbox?: React.ComponentType<any>;\n Select?: React.ComponentType<any>;\n SelectTrigger?: React.ComponentType<any>;\n SelectValue?: React.ComponentType<any>;\n SelectContent?: React.ComponentType<any>;\n SelectItem?: React.ComponentType<any>;\n Table?: React.ComponentType<{ children: React.ReactNode }>;\n TableHeader?: React.ComponentType<{ children: React.ReactNode }>;\n TableBody?: React.ComponentType<{ children: React.ReactNode }>;\n TableRow?: React.ComponentType<{ children: React.ReactNode }>;\n TableHead?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n TableCell?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n Dialog?: React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }>;\n DialogContent?: React.ComponentType<{ className?: string; children: React.ReactNode }>;\n DialogHeader?: React.ComponentType<{ children: React.ReactNode }>;\n DialogTitle?: React.ComponentType<{ children: React.ReactNode }>;\n DialogDescription?: React.ComponentType<{ children: React.ReactNode }>;\n DialogFooter?: React.ComponentType<{ children: React.ReactNode; className?: string }>;\n AlertDialog?: React.ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }>;\n AlertDialogContent?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogHeader?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogTitle?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogDescription?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogFooter?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogCancel?: React.ComponentType<{ children: React.ReactNode }>;\n AlertDialogAction?: React.ComponentType<any>;\n Separator?: React.ComponentType<{ className?: string }>;\n };\n}\n\n// Default contract types\nconst DEFAULT_CONTRACT_TYPES = [\n { value: \"BasicCustom<Policy>:BasicCustom<1>\", label: \"Basic - All data at creation time\" },\n { value: \"DynamicCustom<Policy>:DynamicCustom<1>\", label: \"Dynamic - Challenge can change\" },\n { value: \"DynamicApprovedCustom<Policy>:DynamicApprovedCustom<1>\", label: \"Dynamic Approved - With human readable approval\" },\n];\n\nconst DEFAULT_POLICY_CONFIG: PolicyConfig = {\n enabled: true,\n contractType: \"BasicCustom<Policy>:BasicCustom<1>\",\n approvalType: \"implicit\",\n executionType: \"private\",\n threshold: 1,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n// Default labels\nconst DEFAULT_LABELS = {\n specialRoleCheckbox: \"Special role (auto-prefix)\",\n specialRoleHint: \"This will create a prefixed role.\",\n policySectionTitle: \"Signing Policy\",\n policySectionDescription: \"Configure the policy for this role.\",\n defaultPolicyLabel: \"Default Policy\",\n defaultPolicyDescription: \"Uses the built-in policy contract\",\n createPolicyCheckbox: \"Create signing policy for this role\",\n clientRoleLabel: \"Client Role\",\n realmRoleLabel: \"Realm Role\",\n specialRoleInfo: \"\",\n addRoleButton: \"Add Role\",\n createButton: \"Create Role\",\n saveButton: \"Save Changes\",\n cancelButton: \"Cancel\",\n deleteButton: \"Delete\",\n addRoleTitle: \"Add New Role\",\n editRoleTitle: \"Edit Role\",\n deleteRoleTitle: \"Delete Role\",\n searchPlaceholder: \"Search roles...\",\n roleNamePlaceholder: \"e.g., developer\",\n specialRoleNamePlaceholder: \"e.g., root\",\n descriptionPlaceholder: \"Describe the role's purpose...\",\n noRolesTitle: \"No roles found\",\n noRolesDescription: \"Create a role to get started\",\n noSearchResultsMessage: \"Try a different search term\",\n roleCreatedMessage: \"Role created successfully\",\n roleUpdatedMessage: \"Role updated successfully\",\n roleDeletedMessage: \"Role deleted successfully\",\n policyCreatedMessage: \"Policy request created\",\n specialRoleBadge: \"Special\",\n createRoleDescription: \"Create a new role for access control\",\n editRoleDescription: \"Update the role settings\",\n roleNameDisabledHint: \"Role names cannot be changed\",\n policyUpdateWarning: \"Updating the policy will create a new pending approval request that must be approved by admins.\",\n deleteConfirmMessage: \"Are you sure you want to delete the role \\\"{name}\\\"? This action cannot be undone.\",\n approvalRequestMessage: \"Role has users assigned. An approval request has been created for review.\",\n noDescriptionText: \"No description\",\n loadingPolicyText: \"Loading policy...\",\n updatePolicyCheckbox: \"Update signing policy\",\n policyTemplateLabel: \"Policy Template\",\n};\n\nexport function RolesPageBase<TRole extends RoleItem = RoleItem>({\n title = \"Manage Roles\",\n description = \"Create and manage user roles for access control\",\n helpText,\n isReady = true,\n roleType = \"realm\",\n specialRolePrefix = \"roleWithPolicy:\",\n specialRoleType = \"Policy Role\",\n fetchRoles,\n fetchTemplates,\n fetchUsers,\n fetchPendingApprovals,\n fetchRolePolicy,\n onCreate,\n onUpdate,\n onDelete,\n onCreatePolicy,\n contractTypes = DEFAULT_CONTRACT_TYPES,\n defaultPolicyConfig = DEFAULT_POLICY_CONFIG,\n isSpecialRole: isSpecialRoleProp,\n normalizeSpecialRoleName: normalizeSpecialRoleNameProp,\n labels: customLabels = {},\n calculateThreshold,\n adminRoleSet,\n columns,\n toast,\n invalidateQueries,\n queryKeys = [],\n refreshInterval = 15,\n className,\n components = {},\n}: RolesPageBaseProps<TRole>) {\n // Merge labels with defaults, using specialRolePrefix and specialRoleType for default labels\n const labels = {\n ...DEFAULT_LABELS,\n specialRolePrefix,\n specialRoleType,\n ...customLabels,\n };\n\n // Create default implementations using the prefix\n const prefixPattern = specialRolePrefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/:$/, '[:\\\\-]');\n const prefixRegex = new RegExp(`^${prefixPattern}`, 'i');\n\n const isSpecialRole = isSpecialRoleProp ?? ((role: TRole | string) => {\n const name = typeof role === \"string\" ? role : role.name;\n return prefixRegex.test(name);\n });\n\n const normalizeSpecialRoleName = normalizeSpecialRoleNameProp ?? ((value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (prefixRegex.test(trimmed)) return trimmed;\n return `${specialRolePrefix}${trimmed}`;\n });\n\n // Get components (use defaultComponents from ui if not provided)\n const Card = components.Card || defaultComponents.Card;\n const CardContent = components.CardContent || defaultComponents.CardContent;\n const Button = components.Button || defaultComponents.Button;\n const Badge = components.Badge || defaultComponents.Badge;\n const Skeleton = components.Skeleton || defaultComponents.Skeleton;\n const Input = components.Input || defaultComponents.Input;\n const Label = components.Label || defaultComponents.Label;\n const Textarea = components.Textarea || defaultComponents.Textarea;\n const Checkbox = components.Checkbox || defaultComponents.Checkbox;\n const Select = components.Select || defaultComponents.Select;\n const SelectTrigger = components.SelectTrigger || defaultComponents.SelectTrigger;\n const SelectValue = components.SelectValue || defaultComponents.SelectValue;\n const SelectContent = components.SelectContent || defaultComponents.SelectContent;\n const SelectItem = components.SelectItem || defaultComponents.SelectItem;\n const Table = components.Table || defaultComponents.Table;\n const TableHeader = components.TableHeader || defaultComponents.TableHeader;\n const TableBody = components.TableBody || defaultComponents.TableBody;\n const TableRow = components.TableRow || defaultComponents.TableRow;\n const TableHead = components.TableHead || defaultComponents.TableHead;\n const TableCell = components.TableCell || defaultComponents.TableCell;\n const Dialog = components.Dialog || defaultComponents.Dialog;\n const DialogContent = components.DialogContent || defaultComponents.DialogContent;\n const DialogHeader = components.DialogHeader || defaultComponents.DialogHeader;\n const DialogTitle = components.DialogTitle || defaultComponents.DialogTitle;\n const DialogDescription = components.DialogDescription || defaultComponents.DialogDescription;\n const DialogFooter = components.DialogFooter || defaultComponents.DialogFooter;\n const AlertDialog = components.AlertDialog || defaultComponents.AlertDialog;\n const AlertDialogContent = components.AlertDialogContent || defaultComponents.AlertDialogContent;\n const AlertDialogHeader = components.AlertDialogHeader || defaultComponents.AlertDialogHeader;\n const AlertDialogTitle = components.AlertDialogTitle || defaultComponents.AlertDialogTitle;\n const AlertDialogDescription = components.AlertDialogDescription || defaultComponents.AlertDialogDescription;\n const AlertDialogFooter = components.AlertDialogFooter || defaultComponents.AlertDialogFooter;\n const AlertDialogCancel = components.AlertDialogCancel || defaultComponents.AlertDialogCancel;\n const AlertDialogAction = components.AlertDialogAction || defaultComponents.AlertDialogAction;\n\n // State\n const [roles, setRoles] = useState<TRole[]>([]);\n const [templates, setTemplates] = useState<PolicyTemplateItem[]>([]);\n const [users, setUsers] = useState<any[]>([]);\n const [pendingApprovals, setPendingApprovals] = useState<any[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n const [search, setSearch] = useState(\"\");\n\n // Dialog state\n const [editingRole, setEditingRole] = useState<TRole | null>(null);\n const [creatingRole, setCreatingRole] = useState(false);\n const [deletingRole, setDeletingRole] = useState<TRole | null>(null);\n const [createAsSshRole, setCreateAsSshRole] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isCreatingPolicy, setIsCreatingPolicy] = useState(false);\n // Role type selection (only relevant when roleType is 'all')\n const [createRoleType, setCreateRoleType] = useState<\"realm\" | \"client\">(\n roleType === \"client\" ? \"client\" : \"realm\"\n );\n\n // Form state\n const [formData, setFormData] = useState({ name: \"\", description: \"\" });\n const [policyConfig, setPolicyConfig] = useState<PolicyConfig>(defaultPolicyConfig);\n const [selectedTemplateId, setSelectedTemplateId] = useState<string | null>(null);\n const [templateParams, setTemplateParams] = useState<Record<string, any>>({});\n\n // Edit policy state\n const [editingPolicyConfig, setEditingPolicyConfig] = useState<PolicyConfig | null>(null);\n const [loadingPolicy, setLoadingPolicy] = useState(false);\n const [isUpdatingPolicy, setIsUpdatingPolicy] = useState(false);\n const [editSelectedTemplateId, setEditSelectedTemplateId] = useState<string | null>(null);\n const [editTemplateParams, setEditTemplateParams] = useState<Record<string, any>>({});\n\n // Fetch data\n const fetchData = useCallback(async () => {\n setIsFetching(true);\n try {\n const rolesResult = await fetchRoles();\n const rolesList = Array.isArray(rolesResult) ? rolesResult : rolesResult.roles || [];\n setRoles(rolesList);\n\n if (fetchTemplates) {\n const templatesResult = await fetchTemplates();\n const templatesList = Array.isArray(templatesResult) ? templatesResult : templatesResult.templates || [];\n setTemplates(templatesList);\n }\n\n if (fetchUsers) {\n const usersResult = await fetchUsers();\n setUsers(usersResult);\n }\n\n if (fetchPendingApprovals) {\n const approvalsResult = await fetchPendingApprovals();\n setPendingApprovals(approvalsResult);\n }\n } catch (error) {\n console.error(\"Failed to fetch roles data:\", error);\n toast?.({\n title: \"Failed to fetch data\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoading(false);\n setIsFetching(false);\n }\n }, [fetchRoles, fetchTemplates, fetchUsers, fetchPendingApprovals, toast]);\n\n // Initial fetch (only when API is ready)\n React.useEffect(() => {\n if (isReady) {\n void fetchData();\n }\n }, [fetchData, isReady]);\n\n // Auto refresh (blocked until API is ready)\n const { secondsRemaining, refreshNow } = useAutoRefresh({\n intervalSeconds: refreshInterval,\n refresh: fetchData,\n isBlocked: !isReady || isFetching,\n });\n\n // Calculate threshold\n const calculatedThreshold = useMemo(() => {\n if (calculateThreshold) {\n return calculateThreshold(users, pendingApprovals);\n }\n // Default: 70% of active admins\n const activeAdminCount = users.filter((u) => u.enabled && u.linked && u.isAdmin).length;\n return Math.max(1, Math.floor(activeAdminCount * 0.7));\n }, [users, pendingApprovals, calculateThreshold]);\n\n const activeAdminCount = useMemo(() => {\n return users.filter((u) => u.enabled && u.linked && u.isAdmin).length;\n }, [users]);\n\n // Get selected template\n const selectedTemplate = selectedTemplateId\n ? templates.find((t) => t.id === selectedTemplateId)\n : null;\n\n // SSH role count\n const specialRoleCount = useMemo(\n () => roles.filter((r) => isSpecialRole(r)).length,\n [roles, isSpecialRole]\n );\n\n // Filter roles\n const filteredRoles = useMemo(() => {\n return roles.filter(\n (role) =>\n role.name.toLowerCase().includes(search.toLowerCase()) ||\n (role.description?.toLowerCase().includes(search.toLowerCase()) ?? false)\n );\n }, [roles, search]);\n\n // Handlers\n const handleCreate = () => {\n setFormData({ name: \"\", description: \"\" });\n setCreateAsSshRole(true);\n setPolicyConfig(defaultPolicyConfig);\n setSelectedTemplateId(null);\n setTemplateParams({});\n setCreateRoleType(roleType === \"client\" ? \"client\" : \"realm\");\n setCreatingRole(true);\n };\n\n const handleEdit = async (role: TRole) => {\n setEditingRole(role);\n setFormData({\n name: role.name,\n description: role.description || \"\",\n });\n\n // If SSH role, fetch current policy\n if (isSpecialRole(role) && fetchRolePolicy) {\n setLoadingPolicy(true);\n setEditingPolicyConfig(null);\n setEditSelectedTemplateId(null);\n setEditTemplateParams({});\n try {\n const { policy } = await fetchRolePolicy(role.name);\n if (policy) {\n setEditingPolicyConfig({\n enabled: true,\n contractType: policy.contractType || defaultPolicyConfig.contractType,\n approvalType: policy.approvalType || \"implicit\",\n executionType: policy.executionType || \"private\",\n threshold: policy.threshold || 1,\n });\n } else {\n setEditingPolicyConfig({ ...defaultPolicyConfig, enabled: false });\n }\n } catch {\n setEditingPolicyConfig({ ...defaultPolicyConfig, enabled: false });\n } finally {\n setLoadingPolicy(false);\n }\n } else {\n setEditingPolicyConfig(null);\n }\n };\n\n const handleCreateSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const name = createAsSshRole ? normalizeSpecialRoleName(formData.name) : formData.name.trim();\n if (!name) {\n toast?.({ title: \"Role name is required\", variant: \"destructive\" });\n return;\n }\n\n setIsSubmitting(true);\n try {\n await onCreate({\n name,\n description: formData.description || undefined,\n policy: policyConfig.enabled ? policyConfig : undefined,\n roleType: roleType === \"all\" ? createRoleType : (roleType === \"client\" ? \"client\" : \"realm\"),\n });\n\n // Create policy if enabled\n if (policyConfig.enabled && onCreatePolicy) {\n setIsCreatingPolicy(true);\n try {\n await onCreatePolicy({\n roleName: name,\n policyConfig,\n templateId: selectedTemplateId || undefined,\n templateParams,\n threshold: calculatedThreshold,\n });\n toast?.({ title: \"Policy request created\", description: \"Pending admin approval\" });\n } catch (error) {\n console.error(\"Failed to create policy request:\", error);\n toast?.({\n title: \"Policy creation failed\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsCreatingPolicy(false);\n }\n }\n\n if (invalidateQueries && queryKeys.length > 0) {\n invalidateQueries(queryKeys);\n }\n await fetchData();\n setCreatingRole(false);\n setFormData({ name: \"\", description: \"\" });\n setPolicyConfig(defaultPolicyConfig);\n setSelectedTemplateId(null);\n setTemplateParams({});\n toast?.({ title: \"Role created successfully\" });\n } catch (error) {\n toast?.({\n title: \"Failed to create role\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleEditSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!editingRole) return;\n\n setIsSubmitting(true);\n try {\n await onUpdate({\n name: formData.name,\n description: formData.description || undefined,\n });\n\n // Update policy if changed for SSH role\n if (\n editingPolicyConfig &&\n editingPolicyConfig.enabled &&\n isSpecialRole(editingRole) &&\n onCreatePolicy\n ) {\n setIsUpdatingPolicy(true);\n try {\n await onCreatePolicy({\n roleName: editingRole.name,\n policyConfig: editingPolicyConfig,\n templateId: editSelectedTemplateId || undefined,\n templateParams: editTemplateParams,\n threshold: calculatedThreshold,\n });\n toast?.({ title: \"Policy update request created\", description: \"Pending admin approval\" });\n } catch (error) {\n console.error(\"Failed to create policy update request:\", error);\n toast?.({\n title: \"Policy update failed\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsUpdatingPolicy(false);\n }\n }\n\n if (invalidateQueries && queryKeys.length > 0) {\n invalidateQueries(queryKeys);\n }\n await fetchData();\n setEditingRole(null);\n toast?.({ title: \"Role updated successfully\" });\n } catch (error) {\n toast?.({\n title: \"Failed to update role\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleDeleteConfirm = async () => {\n if (!deletingRole) return;\n\n setIsSubmitting(true);\n try {\n const result = await onDelete(deletingRole.name);\n if (invalidateQueries && queryKeys.length > 0) {\n invalidateQueries(queryKeys);\n }\n await fetchData();\n setDeletingRole(null);\n setEditingRole(null);\n\n if (result?.approvalCreated) {\n toast?.({\n title: \"Approval request created\",\n description: \"Role has users assigned. An approval request has been created for review.\",\n });\n } else {\n toast?.({ title: \"Role deleted successfully\" });\n }\n } catch (error) {\n toast?.({\n title: \"Failed to delete role\",\n description: error instanceof Error ? error.message : \"Unknown error\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Template selection helper\n const handleTemplateSelect = (\n templateId: string | null,\n setTemplateIdFn: (id: string | null) => void,\n setParamsFn: (params: Record<string, any>) => void\n ) => {\n if (!templateId || templateId === \"default\") {\n setTemplateIdFn(null);\n setParamsFn({});\n return;\n }\n\n setTemplateIdFn(templateId);\n const template = templates.find((t) => t.id === templateId);\n if (template) {\n const defaults: Record<string, any> = {};\n template.parameters.forEach((p) => {\n if (p.defaultValue !== undefined) {\n defaults[p.name] = p.defaultValue;\n }\n });\n setParamsFn(defaults);\n }\n };\n\n // Render template parameters\n const renderTemplateParams = (\n template: PolicyTemplateItem | null,\n params: Record<string, any>,\n setParams: (params: Record<string, any>) => void\n ) => {\n if (!template || template.parameters.length === 0) return null;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\", padding: \"0.75rem\", border: \"1px solid #e5e7eb\", borderRadius: \"0.375rem\", backgroundColor: \"#f9fafb\" }}>\n <p style={{ fontSize: \"0.75rem\", fontWeight: 500 }}>Template Parameters</p>\n {template.parameters.map((param) => (\n <div key={param.name} style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <Label style={{ fontSize: \"0.75rem\" }}>\n {param.name}\n {param.required && <span style={{ color: \"#ef4444\", marginLeft: \"0.25rem\" }}>*</span>}\n </Label>\n {param.helpText && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>{param.helpText}</p>\n )}\n {param.type === \"string\" && (\n <Input\n value={params[param.name] || \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setParams({ ...params, [param.name]: e.target.value })\n }\n placeholder={param.defaultValue?.toString() || \"\"}\n required={param.required}\n style={{ height: \"2rem\", fontSize: \"0.875rem\" }}\n />\n )}\n {param.type === \"number\" && (\n <Input\n type=\"number\"\n value={params[param.name] || \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setParams({ ...params, [param.name]: parseInt(e.target.value) || 0 })\n }\n placeholder={param.defaultValue?.toString() || \"\"}\n required={param.required}\n style={{ height: \"2rem\", fontSize: \"0.875rem\" }}\n />\n )}\n {param.type === \"boolean\" && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Checkbox\n checked={params[param.name] || false}\n onCheckedChange={(v: boolean) =>\n setParams({ ...params, [param.name]: Boolean(v) })\n }\n />\n <span style={{ fontSize: \"0.75rem\" }}>{params[param.name] ? \"Yes\" : \"No\"}</span>\n </div>\n )}\n {param.type === \"select\" && (\n <Select\n value={params[param.name] || param.defaultValue?.toString() || \"\"}\n onValueChange={(v: string) => setParams({ ...params, [param.name]: v })}\n >\n <SelectTrigger style={{ height: \"2rem\", fontSize: \"0.875rem\" }}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {param.options?.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n ))}\n </div>\n );\n };\n\n // Default columns\n const defaultColumns: ColumnDef<TRole>[] = [\n {\n key: \"name\",\n header: \"Role Name\",\n cell: (role) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.75rem\" }}>\n <div style={{ display: \"flex\", height: \"2.25rem\", width: \"2.25rem\", alignItems: \"center\", justifyContent: \"center\", borderRadius: \"9999px\", backgroundColor: \"rgba(59, 130, 246, 0.1)\" }}>\n <KeyRound style={{ height: \"1rem\", width: \"1rem\", color: \"#3b82f6\" }} />\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <p style={{ fontWeight: 500 }}>{role.name}</p>\n {isSpecialRole(role) && (\n <Badge variant=\"outline\" style={{ fontSize: \"0.75rem\" }}>\n {labels.specialRoleBadge}\n </Badge>\n )}\n </div>\n </div>\n ),\n },\n {\n key: \"description\",\n header: \"Description\",\n responsive: \"sm\",\n cell: (role) => (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n {role.description || labels.noDescriptionText}\n </p>\n ),\n },\n {\n key: \"type\",\n header: \"Type\",\n responsive: \"md\",\n cell: (role) => (\n <Badge variant={role.clientRole ? \"secondary\" : \"default\"}>\n {role.clientRole ? labels.clientRoleLabel : labels.realmRoleLabel}\n </Badge>\n ),\n },\n ];\n\n const tableColumns = columns || defaultColumns;\n\n return (\n <div style={{ padding: \"1.5rem\" }} className={className}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: \"1.5rem\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n <div>\n <h1 style={{ fontSize: \"1.5rem\", fontWeight: 600, display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", margin: 0 }}>\n <KeyRound style={{ width: \"1.5rem\", height: \"1.5rem\" }} />\n {title}\n </h1>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\" }}>{description}</p>\n {helpText && <div style={{ marginTop: \"0.5rem\" }}>{helpText}</div>}\n {labels.specialRoleInfo && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\", margin: \"0.25rem 0 0\" }}>\n {labels.specialRoleInfo} — {specialRoleCount} configured.\n </p>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RefreshButton\n onClick={() => void refreshNow()}\n isRefreshing={isFetching}\n secondsRemaining={secondsRemaining}\n title=\"Refresh now\"\n />\n <Button onClick={handleCreate} title={labels.addRoleButton}>\n <Plus style={{ width: \"1rem\", height: \"1rem\", marginRight: \"0.5rem\" }} />\n {labels.addRoleButton}\n </Button>\n </div>\n </div>\n\n {/* Roles Table */}\n <Card>\n <div style={{ padding: \"1rem\", borderBottom: \"1px solid #e5e7eb\" }}>\n <div style={{ position: \"relative\", maxWidth: \"20rem\" }}>\n <Search style={{ position: \"absolute\", left: \"0.75rem\", top: \"50%\", transform: \"translateY(-50%)\", width: \"1rem\", height: \"1rem\", color: \"#9ca3af\" }} />\n <Input\n placeholder={labels.searchPlaceholder}\n value={search}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}\n style={{ paddingLeft: \"2.25rem\" }}\n />\n </div>\n </div>\n <CardContent style={{ padding: 0 }}>\n {isLoading ? (\n <div style={{ padding: \"1rem\", display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\n {[1, 2, 3].map((i) => (\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: \"1rem\" }}>\n <Skeleton style={{ height: \"2.5rem\", width: \"2.5rem\", borderRadius: \"9999px\" }} />\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Skeleton style={{ height: \"1rem\", width: \"8rem\" }} />\n <Skeleton style={{ height: \"0.75rem\", width: \"12rem\" }} />\n </div>\n <Skeleton style={{ height: \"1.5rem\", width: \"4rem\" }} />\n </div>\n ))}\n </div>\n ) : filteredRoles.length > 0 ? (\n <Table>\n <TableHeader>\n <TableRow>\n {tableColumns.map((col) => (\n <TableHead key={col.key}>\n {col.header}\n </TableHead>\n ))}\n <TableHead style={{ textAlign: \"right\" }}>Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredRoles.map((role, rowIndex) => (\n <TableRow key={role.id}>\n {tableColumns.map((col) => (\n <TableCell key={col.key}>\n {col.cell(role, rowIndex)}\n </TableCell>\n ))}\n <TableCell style={{ textAlign: \"right\" }}>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => void handleEdit(role)}\n >\n <Pencil style={{ width: \"1rem\", height: \"1rem\" }} />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => setDeletingRole(role)}\n >\n <Trash2 style={{ width: \"1rem\", height: \"1rem\" }} />\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", padding: \"3rem\", textAlign: \"center\" }}>\n <KeyRound style={{ width: \"3rem\", height: \"3rem\", color: \"#9ca3af\", marginBottom: \"1rem\" }} />\n <h3 style={{ fontWeight: 500, margin: 0 }}>{labels.noRolesTitle}</h3>\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", marginTop: \"0.25rem\" }}>\n {search ? labels.noSearchResultsMessage : labels.noRolesDescription}\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Create Role Dialog */}\n <Dialog open={creatingRole} onOpenChange={(open) => !open && setCreatingRole(false)}>\n <DialogContent style={{ maxWidth: \"28rem\", maxHeight: \"90vh\", overflow: \"auto\" }}>\n <DialogHeader>\n <DialogTitle>{labels.addRoleTitle}</DialogTitle>\n <DialogDescription>{labels.createRoleDescription}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleCreateSubmit} style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n {/* Role Type Selection - only show when 'all' is configured */}\n {roleType === \"all\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Role Type</Label>\n <div style={{ display: \"flex\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <input\n type=\"radio\"\n id=\"roleTypeRealm\"\n name=\"roleType\"\n checked={createRoleType === \"realm\"}\n onChange={() => setCreateRoleType(\"realm\")}\n style={{ width: \"1rem\", height: \"1rem\" }}\n />\n <Label htmlFor=\"roleTypeRealm\" style={{ fontSize: \"0.875rem\", fontWeight: 400, cursor: \"pointer\" }}>\n {labels.realmRoleLabel}\n </Label>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <input\n type=\"radio\"\n id=\"roleTypeClient\"\n name=\"roleType\"\n checked={createRoleType === \"client\"}\n onChange={() => setCreateRoleType(\"client\")}\n style={{ width: \"1rem\", height: \"1rem\" }}\n />\n <Label htmlFor=\"roleTypeClient\" style={{ fontSize: \"0.875rem\", fontWeight: 400, cursor: \"pointer\" }}>\n {labels.clientRoleLabel}\n </Label>\n </div>\n </div>\n </div>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"roleName\">Role Name</Label>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Checkbox\n id=\"createAsSshRole\"\n checked={createAsSshRole}\n onCheckedChange={(v: boolean) => setCreateAsSshRole(Boolean(v))}\n />\n <Label htmlFor=\"createAsSshRole\" style={{ fontSize: \"0.875rem\", fontWeight: 400 }}>\n {labels.specialRoleCheckbox}\n </Label>\n </div>\n <Input\n id=\"roleName\"\n value={formData.name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n setFormData({\n ...formData,\n name: createAsSshRole ? normalizeSpecialRoleName(raw) : raw,\n });\n }}\n placeholder={createAsSshRole ? labels.specialRoleNamePlaceholder : labels.roleNamePlaceholder}\n required\n />\n {createAsSshRole && labels.specialRoleHint && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {labels.specialRoleHint}\n </p>\n )}\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"roleDescription\">Description</Label>\n <Textarea\n id=\"roleDescription\"\n value={formData.description}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setFormData({ ...formData, description: e.target.value })\n }\n placeholder={labels.descriptionPlaceholder}\n rows={3}\n />\n </div>\n\n {/* Policy Configuration - available when onCreatePolicy is provided */}\n {onCreatePolicy && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\", paddingTop: \"1rem\", borderTop: \"1px solid #e5e7eb\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Shield style={{ width: \"1rem\", height: \"1rem\", color: \"#6b7280\" }} />\n <h4 style={{ fontWeight: 500 }}>{labels.policySectionTitle}</h4>\n </div>\n {labels.policySectionDescription && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {labels.policySectionDescription}\n </p>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Checkbox\n id=\"policyEnabled\"\n checked={policyConfig.enabled}\n onCheckedChange={(v: boolean) =>\n setPolicyConfig({ ...policyConfig, enabled: Boolean(v) })\n }\n />\n <Label htmlFor=\"policyEnabled\" style={{ fontSize: \"0.875rem\", fontWeight: 400 }}>\n {labels.createPolicyCheckbox}\n </Label>\n </div>\n\n {policyConfig.enabled && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\", paddingLeft: \"1.5rem\" }}>\n {/* Template Selection */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <FileCode style={{ width: \"1rem\", height: \"1rem\", color: \"#6b7280\" }} />\n <Label htmlFor=\"templateSelect\">{labels.policyTemplateLabel}</Label>\n </div>\n {templates.length > 0 ? (\n <>\n <Select\n value={selectedTemplateId || \"\"}\n onValueChange={(v: string) =>\n handleTemplateSelect(\n v || null,\n setSelectedTemplateId,\n setTemplateParams\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a template...\" />\n </SelectTrigger>\n <SelectContent>\n {templates.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedTemplate && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {selectedTemplate.description}\n </p>\n )}\n </>\n ) : (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", fontStyle: \"italic\" }}>\n No templates available\n </p>\n )}\n </div>\n\n {/* Template Parameters */}\n {renderTemplateParams(selectedTemplate ?? null, templateParams, setTemplateParams)}\n\n {/* Contract Type */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"contractType\">Contract Type</Label>\n <Select\n value={policyConfig.contractType}\n onValueChange={(v: string) =>\n setPolicyConfig({ ...policyConfig, contractType: v })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {contractTypes.map((ct) => (\n <SelectItem key={ct.value} value={ct.value}>\n {ct.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n Contract ID: <code style={{ backgroundColor: \"#f3f4f6\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>{policyConfig.contractType}</code>\n </p>\n </div>\n\n {/* Approval & Execution Type */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"approvalType\">Approval Type</Label>\n <Select\n value={policyConfig.approvalType}\n onValueChange={(v: string) =>\n setPolicyConfig({\n ...policyConfig,\n approvalType: v as \"implicit\" | \"explicit\",\n })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"implicit\">Implicit</SelectItem>\n <SelectItem value=\"explicit\">Explicit</SelectItem>\n </SelectContent>\n </Select>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {policyConfig.approvalType === \"implicit\"\n ? \"No manual approval required\"\n : \"Requires user approval\"}\n </p>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"executionType\">Execution Type</Label>\n <Select\n value={policyConfig.executionType}\n onValueChange={(v: string) =>\n setPolicyConfig({\n ...policyConfig,\n executionType: v as \"public\" | \"private\",\n })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"public\">Public</SelectItem>\n <SelectItem value=\"private\">Private</SelectItem>\n </SelectContent>\n </Select>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {policyConfig.executionType === \"public\"\n ? \"Anyone can execute\"\n : \"Role-based execution\"}\n </p>\n </div>\n </div>\n\n {/* Threshold */}\n {policyConfig.approvalType === \"explicit\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label htmlFor=\"threshold\">Approval Threshold</Label>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", padding: \"0.5rem\", backgroundColor: \"#f3f4f6\", borderRadius: \"0.375rem\" }}>\n <span style={{ fontWeight: 500 }}>{calculatedThreshold}</span>\n <span style={{ color: \"#6b7280\", fontSize: \"0.875rem\" }}>\n (70% of {activeAdminCount} active admin\n {activeAdminCount !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n Automatically calculated based on active admins\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreatingRole(false)}>\n {labels.cancelButton}\n </Button>\n <Button type=\"submit\" disabled={isSubmitting || isCreatingPolicy}>\n {isSubmitting || isCreatingPolicy ? \"Creating...\" : labels.createButton}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n {/* Edit Role Dialog */}\n <Dialog open={!!editingRole} onOpenChange={(open) => !open && setEditingRole(null)}>\n <DialogContent style={{ maxWidth: \"28rem\", maxHeight: \"90vh\", overflowY: \"auto\" }}>\n <DialogHeader>\n <DialogTitle>{labels.editRoleTitle}</DialogTitle>\n <DialogDescription>{labels.editRoleDescription}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleEditSubmit} style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Role Name</Label>\n <Input value={formData.name} disabled style={{ backgroundColor: \"#f3f4f6\" }} />\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>{labels.roleNameDisabledHint}</p>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Description</Label>\n <Textarea\n value={formData.description}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setFormData({ ...formData, description: e.target.value })\n }\n placeholder={labels.descriptionPlaceholder}\n rows={3}\n />\n </div>\n\n {/* Policy Configuration - special roles only */}\n {editingRole && isSpecialRole(editingRole) && onCreatePolicy && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\", paddingTop: \"1rem\", borderTop: \"1px solid #e5e7eb\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Shield style={{ width: \"1rem\", height: \"1rem\", color: \"#6b7280\" }} />\n <h4 style={{ fontWeight: 500 }}>{labels.policySectionTitle}</h4>\n </div>\n\n {loadingPolicy ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", fontSize: \"0.875rem\", color: \"#6b7280\" }}>\n <div style={{ height: \"1rem\", width: \"1rem\", border: \"2px solid #6b7280\", borderTopColor: \"transparent\", borderRadius: \"9999px\", animation: \"spin 1s linear infinite\" }} />\n {labels.loadingPolicyText}\n </div>\n ) : editingPolicyConfig ? (\n <>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Checkbox\n id=\"editPolicyEnabled\"\n checked={editingPolicyConfig.enabled}\n onCheckedChange={(v: boolean) =>\n setEditingPolicyConfig({\n ...editingPolicyConfig,\n enabled: Boolean(v),\n })\n }\n />\n <Label htmlFor=\"editPolicyEnabled\" style={{ fontSize: \"0.875rem\", fontWeight: 400 }}>\n {editingPolicyConfig.enabled\n ? labels.updatePolicyCheckbox\n : labels.createPolicyCheckbox}\n </Label>\n </div>\n\n {editingPolicyConfig.enabled && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\", paddingLeft: \"1.5rem\" }}>\n {/* Template Selection */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <FileCode style={{ width: \"1rem\", height: \"1rem\", color: \"#6b7280\" }} />\n <Label htmlFor=\"editTemplateSelect\">{labels.policyTemplateLabel}</Label>\n </div>\n {templates.length > 0 ? (\n <>\n <Select\n value={editSelectedTemplateId || \"\"}\n onValueChange={(v: string) =>\n handleTemplateSelect(\n v || null,\n setEditSelectedTemplateId,\n setEditTemplateParams\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a template...\" />\n </SelectTrigger>\n <SelectContent>\n {templates.map((t) => (\n <SelectItem key={t.id} value={t.id}>\n {t.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {editSelectedTemplateId && templates.find((t) => t.id === editSelectedTemplateId)?.description && (\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n {templates.find((t) => t.id === editSelectedTemplateId)?.description}\n </p>\n )}\n </>\n ) : (\n <p style={{ fontSize: \"0.875rem\", color: \"#6b7280\", fontStyle: \"italic\" }}>\n No templates available\n </p>\n )}\n </div>\n\n {/* Template Parameters */}\n {editSelectedTemplateId &&\n renderTemplateParams(\n templates.find((t) => t.id === editSelectedTemplateId) || null,\n editTemplateParams,\n setEditTemplateParams\n )}\n\n {/* Approval & Execution Type */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"1rem\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Approval Type</Label>\n <Select\n value={editingPolicyConfig.approvalType}\n onValueChange={(v: string) =>\n setEditingPolicyConfig({\n ...editingPolicyConfig,\n approvalType: v as \"implicit\" | \"explicit\",\n })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"implicit\">Implicit</SelectItem>\n <SelectItem value=\"explicit\">Explicit</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Execution Type</Label>\n <Select\n value={editingPolicyConfig.executionType}\n onValueChange={(v: string) =>\n setEditingPolicyConfig({\n ...editingPolicyConfig,\n executionType: v as \"public\" | \"private\",\n })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"public\">Public</SelectItem>\n <SelectItem value=\"private\">Private</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {/* Threshold */}\n {editingPolicyConfig.approvalType === \"explicit\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.5rem\" }}>\n <Label>Approval Threshold</Label>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", padding: \"0.5rem\", backgroundColor: \"#f3f4f6\", borderRadius: \"0.375rem\" }}>\n <span style={{ fontWeight: 500 }}>{calculatedThreshold}</span>\n <span style={{ color: \"#6b7280\", fontSize: \"0.875rem\" }}>\n (70% of {activeAdminCount} active admin\n {activeAdminCount !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n <p style={{ fontSize: \"0.75rem\", color: \"#6b7280\" }}>\n Automatically calculated based on active admins\n </p>\n </div>\n )}\n\n <p style={{ fontSize: \"0.75rem\", backgroundColor: \"#fffbeb\", color: \"#92400e\", padding: \"0.5rem\", borderRadius: \"0.25rem\" }}>\n {labels.policyUpdateWarning}\n </p>\n </div>\n )}\n </>\n ) : null}\n </div>\n )}\n\n <DialogFooter style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => editingRole && setDeletingRole(editingRole)}\n >\n <Trash2 style={{ height: \"1rem\", width: \"1rem\", marginRight: \"0.5rem\" }} />\n {labels.deleteButton}\n </Button>\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <Button type=\"button\" variant=\"outline\" onClick={() => setEditingRole(null)}>\n {labels.cancelButton}\n </Button>\n <Button type=\"submit\" disabled={isSubmitting || isUpdatingPolicy}>\n {isSubmitting || isUpdatingPolicy ? \"Saving...\" : labels.saveButton}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <AlertDialog open={!!deletingRole} onOpenChange={(open) => !open && setDeletingRole(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{labels.deleteRoleTitle}</AlertDialogTitle>\n <AlertDialogDescription>\n {labels.deleteConfirmMessage.replace(\"{name}\", deletingRole?.name || \"\")}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{labels.cancelButton}</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDeleteConfirm}\n style={{ backgroundColor: \"#ef4444\", color: \"#ffffff\" }}\n >\n {isSubmitting ? \"Deleting...\" : labels.deleteButton}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","/**\n * RolesPage - Create and manage roles with policy support\n *\n * @example\n * ```tsx\n * <RolesPage\n * adminAPI={AdminAPI}\n * policyAPI={policyAPI}\n * tideContext={tideContext}\n * currentUsername={username}\n * />\n * ```\n */\n\nimport { useEffect, useState } from \"react\";\nimport { AdminAPI as DefaultAdminAPI } from \"@tidecloak/js\";\nimport { RolesPageBase, type RolesPageBaseProps, type RoleItem, type RoleTypeConfig } from \"../base\";\nimport { type TemplateAPI } from \"./TemplatesPage\";\nimport { type PolicyApprovalData } from \"./ApprovalsPage\";\nimport { type PolicyLogsAPI } from \"./LogsPage\";\nimport {\n loadTideLibs,\n areTideLibsAvailable,\n createTidePolicyHandler,\n type TideContextMethods,\n} from \"../../../tide\";\n\n// Type for the AdminAPI instance\ntype AdminAPIInstance = {\n setRealm?: (realm: string) => void;\n // Realm roles\n getRoles: () => Promise<any>;\n createRole: (role: any) => Promise<any>;\n updateRole: (roleName: string, role: any) => Promise<any>;\n deleteRole: (roleName: string) => Promise<any>;\n // Client roles\n getClientRoles?: (clientId?: string) => Promise<any>;\n createClientRole?: (role: any, clientId?: string) => Promise<any>;\n updateClientRole?: (roleName: string, role: any, clientId?: string) => Promise<any>;\n deleteClientRole?: (roleName: string, clientId?: string) => Promise<any>;\n // Other\n getTemplates?: () => Promise<any>;\n getUsers?: () => Promise<any>;\n getPendingChangeSets?: () => Promise<any>;\n};\n\nexport interface RolePolicy {\n roleName: string;\n enabled: boolean;\n contractType: string;\n approvalType: \"implicit\" | \"explicit\";\n executionType: \"public\" | \"private\";\n threshold: number;\n templateId?: string;\n templateParams?: Record<string, any>;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/** Implement this to store role policies (or use createLocalStoragePolicyAPI for dev) */\nexport interface PolicyAPI {\n getPolicy: (roleName: string) => Promise<RolePolicy | null>;\n upsertPolicy: (policy: RolePolicy) => Promise<RolePolicy | void>;\n deletePolicy?: (roleName: string) => Promise<void>;\n _isLocalStorage?: boolean;\n}\n\nconst POLICY_STORAGE_KEY = \"tidecloak_role_policies\";\n\n/** localStorage adapter for development */\nexport function createLocalStoragePolicyAPI(storageKey = POLICY_STORAGE_KEY): PolicyAPI {\n const getAll = (): Record<string, RolePolicy> => {\n try {\n const data = localStorage.getItem(storageKey);\n return data ? JSON.parse(data) : {};\n } catch {\n return {};\n }\n };\n\n const saveAll = (policies: Record<string, RolePolicy>) => {\n localStorage.setItem(storageKey, JSON.stringify(policies));\n };\n\n return {\n _isLocalStorage: true as const,\n\n getPolicy: async (roleName: string) => {\n const policies = getAll();\n return policies[roleName] || null;\n },\n\n upsertPolicy: async (policy: RolePolicy) => {\n const policies = getAll();\n const now = new Date().toISOString();\n const existing = policies[policy.roleName];\n\n policies[policy.roleName] = {\n ...policy,\n createdAt: existing?.createdAt || now,\n updatedAt: now,\n };\n\n saveAll(policies);\n return policies[policy.roleName];\n },\n\n deletePolicy: async (roleName: string) => {\n const policies = getAll();\n delete policies[roleName];\n saveAll(policies);\n },\n };\n}\n\nexport interface RolesPageProps<T extends RoleItem = RoleItem>\n extends Omit<\n RolesPageBaseProps<T>,\n | \"fetchRoles\"\n | \"fetchTemplates\"\n | \"fetchUsers\"\n | \"fetchPendingApprovals\"\n | \"fetchRolePolicy\"\n | \"onCreate\"\n | \"onUpdate\"\n | \"onDelete\"\n | \"onCreatePolicy\"\n | \"toast\"\n | \"invalidateQueries\"\n | \"components\"\n | \"roleType\"\n > {\n /** AdminAPI instance */\n adminAPI?: AdminAPIInstance;\n /** Template adapter for policy templates */\n templateAPI?: TemplateAPI;\n /** Policy storage adapter */\n policyAPI?: PolicyAPI;\n /** Policy logs adapter for activity tracking */\n policyLogsAPI?: PolicyLogsAPI;\n /** Tide context for enclave workflow (from useTideCloak hook) */\n tideContext?: TideContextMethods;\n /** Callback when Tide policy request is created */\n onTideRequestCreated?: (request: any, roleName: string) => Promise<void>;\n /** Realm name */\n realm?: string;\n /** Role type: 'realm', 'client', or 'all' (default: 'realm') */\n roleType?: RoleTypeConfig;\n /** Override fetch roles */\n fetchRoles?: RolesPageBaseProps<T>[\"fetchRoles\"];\n /** Override create */\n onCreate?: RolesPageBaseProps<T>[\"onCreate\"];\n /** Override update */\n onUpdate?: RolesPageBaseProps<T>[\"onUpdate\"];\n /** Override delete */\n onDelete?: RolesPageBaseProps<T>[\"onDelete\"];\n /** Override policy creation */\n onCreatePolicy?: RolesPageBaseProps<T>[\"onCreatePolicy\"];\n /** Toast handler */\n toast?: RolesPageBaseProps<T>[\"toast\"];\n /** Query invalidation */\n invalidateQueries?: RolesPageBaseProps<T>[\"invalidateQueries\"];\n /** Custom components */\n components?: RolesPageBaseProps<T>[\"components\"];\n /** Help text below description */\n helpText?: RolesPageBaseProps<T>[\"helpText\"];\n /** Current username for logging */\n currentUsername?: string;\n}\n\n// Warning banner for localStorage\nfunction LocalStorageWarning({ type }: { type: \"policy\" | \"template\" | \"both\" }) {\n const typeText = type === \"both\" ? \"Policies and templates\" : type === \"policy\" ? \"Policies\" : \"Templates\";\n const apiText = type === \"both\" ? \"PolicyAPI and TemplateAPI\" : type === \"policy\" ? \"PolicyAPI\" : \"TemplateAPI\";\n\n return (\n <div\n style={{\n backgroundColor: \"#fef3c7\",\n border: \"1px solid #f59e0b\",\n borderRadius: \"0.375rem\",\n padding: \"0.75rem 1rem\",\n marginBottom: \"1rem\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontSize: \"1rem\" }}>⚠️</span>\n <div style={{ fontSize: \"0.875rem\", color: \"#92400e\" }}>\n <strong>Development Mode:</strong> {typeText} are stored in browser localStorage and will not persist across\n devices or browsers. For production, implement your own{\" \"}\n <code style={{ backgroundColor: \"#fde68a\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>{apiText}</code>{\" \"}\n with a backend database.\n </div>\n </div>\n );\n}\n\nexport function RolesPage<T extends RoleItem = RoleItem>({\n adminAPI: adminAPIProp,\n templateAPI,\n policyAPI,\n policyLogsAPI,\n tideContext,\n onTideRequestCreated,\n realm,\n roleType = \"realm\",\n fetchRoles: fetchRolesProp,\n onCreate: onCreateProp,\n onUpdate: onUpdateProp,\n onDelete: onDeleteProp,\n onCreatePolicy: onCreatePolicyProp,\n helpText: helpTextProp,\n currentUsername,\n ...props\n}: RolesPageProps<T>) {\n // Track if Tide libraries are available\n const [tideLibsReady, setTideLibsReady] = useState(false);\n\n // Load Tide libraries on mount\n useEffect(() => {\n loadTideLibs().then((available) => {\n setTideLibsReady(available);\n });\n }, []);\n\n // Check if using localStorage APIs\n const isPolicyLocalStorage = policyAPI?._isLocalStorage === true;\n const isTemplateLocalStorage = templateAPI?._isLocalStorage === true;\n // Use provided AdminAPI instance or fall back to default singleton\n const api = (adminAPIProp || DefaultAdminAPI) as AdminAPIInstance;\n\n // Set realm if provided\n if (realm && api.setRealm) {\n api.setRealm(realm);\n }\n\n const fetchRoles =\n fetchRolesProp ||\n (async () => {\n let roles: T[] = [];\n\n if (roleType === \"realm\" || roleType === \"all\") {\n const realmRoles = (await api.getRoles()) as T[];\n // Mark as realm roles\n roles = realmRoles.map((r) => ({ ...r, roleType: \"realm\" as const, clientRole: false }));\n }\n\n if ((roleType === \"client\" || roleType === \"all\") && api.getClientRoles) {\n const clientRoles = (await api.getClientRoles()) as T[];\n // Mark as client roles\n const markedClientRoles = clientRoles.map((r) => ({ ...r, roleType: \"client\" as const, clientRole: true }));\n roles = [...roles, ...markedClientRoles];\n }\n\n return { roles };\n });\n\n const fetchTemplates = async () => {\n // Use templateAPI if provided, otherwise fall back to AdminAPI.getTemplates\n if (templateAPI) {\n const templates = await templateAPI.getTemplates();\n return { templates: templates || [] };\n }\n const templates = api.getTemplates ? await api.getTemplates() : [];\n return { templates: templates || [] };\n };\n\n const fetchUsers = async () => {\n const users = api.getUsers ? await api.getUsers() : [];\n return users || [];\n };\n\n const fetchPendingApprovals = async () => {\n const approvals = api.getPendingChangeSets ? await api.getPendingChangeSets() : [];\n return approvals || [];\n };\n\n // Fetch policy using PolicyAPI if provided\n const fetchRolePolicy = policyAPI\n ? async (roleName: string) => {\n const policy = await policyAPI.getPolicy(roleName);\n return { policy };\n }\n : async () => ({ policy: null });\n\n const onCreate =\n onCreateProp ||\n (async (data: { name: string; description?: string; roleType?: \"realm\" | \"client\" }) => {\n const targetType = data.roleType || (roleType === \"client\" ? \"client\" : \"realm\");\n\n if (targetType === \"client\" && api.createClientRole) {\n await api.createClientRole({ name: data.name, description: data.description });\n } else {\n await api.createRole({ name: data.name, description: data.description });\n }\n });\n\n const onUpdate =\n onUpdateProp ||\n (async (data: { name: string; description?: string; clientRole?: boolean }) => {\n // Check if it's a client role\n if (data.clientRole && api.updateClientRole) {\n await api.updateClientRole(data.name, { name: data.name, description: data.description });\n } else {\n await api.updateRole(data.name, { name: data.name, description: data.description });\n }\n });\n\n const onDelete =\n onDeleteProp ||\n (async (roleName: string) => {\n // For delete, we need to determine if it's a client role\n // If roleType is 'client', use client API; if 'realm', use realm API\n // If 'all', we try client first if available, then realm\n if (roleType === \"client\" && api.deleteClientRole) {\n await api.deleteClientRole(roleName);\n } else if (roleType === \"realm\") {\n await api.deleteRole(roleName);\n } else if (roleType === \"all\") {\n // Try to delete from all - one will succeed\n // This is a limitation - ideally we'd know which type\n try {\n await api.deleteRole(roleName);\n } catch {\n if (api.deleteClientRole) {\n await api.deleteClientRole(roleName);\n }\n }\n } else {\n await api.deleteRole(roleName);\n }\n\n // Also delete the policy if policyAPI is provided\n if (policyAPI?.deletePolicy) {\n try {\n await policyAPI.deletePolicy(roleName);\n } catch {\n // Ignore policy deletion errors - role is already deleted\n }\n }\n\n return { approvalCreated: false };\n });\n\n // Determine which policy creation handler to use\n // Priority: 1. User-provided onCreatePolicy, 2. Tide workflow (if available), 3. PolicyAPI localStorage\n const useTideWorkflow = tideContext && tideLibsReady && areTideLibsAvailable() && !onCreatePolicyProp;\n\n // Helper to add a pending approval to PolicyApprovalsAPI\n const addPendingApproval = async (\n params: {\n roleName: string;\n policyConfig: any;\n templateId?: string;\n templateParams?: Record<string, any>;\n threshold: number;\n },\n policyRequestData: string,\n contractCode?: string,\n requestedByEmail?: string\n ) => {\n const policyId = `policy-${params.roleName}-${Date.now()}`;\n const approval: PolicyApprovalData = {\n id: policyId,\n roleId: params.roleName,\n requestedBy: currentUsername || \"unknown\",\n requestedByEmail,\n threshold: params.threshold,\n approvalCount: 0,\n rejectionCount: 0,\n commitReady: false,\n approvedBy: [],\n deniedBy: [],\n status: \"pending\",\n timestamp: Date.now(),\n policyRequestData,\n contractCode,\n };\n\n // Add to localStorage approvals (or custom API)\n const storageKey = \"tidecloak_policy_approvals\";\n try {\n const existing = localStorage.getItem(storageKey);\n const approvals: PolicyApprovalData[] = existing ? JSON.parse(existing) : [];\n approvals.push(approval);\n localStorage.setItem(storageKey, JSON.stringify(approvals));\n } catch {\n // Ignore localStorage errors\n }\n\n // Log the policy creation\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId,\n roleId: params.roleName,\n action: \"created\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: requestedByEmail,\n policyStatus: \"pending\",\n policyThreshold: params.threshold,\n approvalCount: 0,\n rejectionCount: 0,\n });\n }\n };\n\n // Policy creation handler\n const onCreatePolicy = (() => {\n // 1. User provided custom handler - use it\n if (onCreatePolicyProp) {\n return onCreatePolicyProp;\n }\n\n // 2. Tide workflow available - use it as default\n if (useTideWorkflow && tideContext) {\n const tideHandler = createTidePolicyHandler(tideContext, onTideRequestCreated);\n\n return async (params: {\n roleName: string;\n policyConfig: any;\n templateId?: string;\n templateParams?: Record<string, any>;\n threshold: number;\n }) => {\n // Create Tide request (this creates and signs the PolicySignRequest)\n // Returns the signed PolicySignRequest object\n const signedRequest = await tideHandler(params);\n\n // Encode the PolicySignRequest to bytes and convert to base64\n // This is what the approval enclave needs to process the request\n const requestBytes = signedRequest.encode();\n const policyRequestData = btoa(String.fromCharCode(...requestBytes));\n\n await addPendingApproval(params, policyRequestData);\n\n // Also save to PolicyAPI for local tracking if provided\n if (policyAPI) {\n await policyAPI.upsertPolicy({\n roleName: params.roleName,\n enabled: params.policyConfig?.enabled ?? true,\n contractType: params.policyConfig?.contractType || \"tide\",\n approvalType: params.policyConfig?.approvalType || \"explicit\",\n executionType: params.policyConfig?.executionType || \"private\",\n threshold: params.threshold,\n templateId: params.templateId,\n templateParams: params.templateParams,\n });\n }\n };\n }\n\n // 3. PolicyAPI only (localStorage or custom backend without Tide)\n // Still add pending approval so it shows up in approvals page\n return async (params: {\n roleName: string;\n policyConfig: any;\n templateId?: string;\n templateParams?: Record<string, any>;\n threshold: number;\n }) => {\n // Add pending approval\n const policyRequestData = JSON.stringify({\n roleName: params.roleName,\n templateId: params.templateId,\n templateParams: params.templateParams,\n threshold: params.threshold,\n approvalType: params.policyConfig?.approvalType || \"explicit\",\n executionType: params.policyConfig?.executionType || \"private\",\n });\n await addPendingApproval(params, policyRequestData);\n\n // Save to PolicyAPI if provided\n if (policyAPI) {\n await policyAPI.upsertPolicy({\n roleName: params.roleName,\n enabled: params.policyConfig?.enabled ?? true,\n contractType: params.policyConfig?.contractType || \"default\",\n approvalType: params.policyConfig?.approvalType || \"explicit\",\n executionType: params.policyConfig?.executionType || \"private\",\n threshold: params.threshold,\n templateId: params.templateId,\n templateParams: params.templateParams,\n });\n }\n };\n })();\n\n // Determine localStorage warning type\n const localStorageWarningType = isPolicyLocalStorage && isTemplateLocalStorage\n ? \"both\"\n : isPolicyLocalStorage\n ? \"policy\"\n : isTemplateLocalStorage\n ? \"template\"\n : null;\n\n // Show localStorage warning if using localStorage APIs\n const helpText = localStorageWarningType ? (\n <>\n <LocalStorageWarning type={localStorageWarningType} />\n {helpTextProp}\n </>\n ) : (\n helpTextProp\n );\n\n return (\n <RolesPageBase<T>\n fetchRoles={fetchRoles}\n fetchTemplates={fetchTemplates}\n fetchUsers={fetchUsers}\n fetchPendingApprovals={fetchPendingApprovals}\n fetchRolePolicy={fetchRolePolicy}\n onCreate={onCreate}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onCreatePolicy={onCreatePolicy}\n roleType={roleType}\n helpText={helpText}\n {...props}\n />\n );\n}\n","/**\n * Tide Policy Workflow Helpers\n *\n * Provides functions for creating Tide policy requests that can be signed\n * by the TideCloak context. Uses heimdall-tide and asgard-tide libraries.\n *\n * This is the default policy creation workflow used by RolesPage when\n * Tide libraries are available.\n */\n\nimport type { RolePolicy } from \"../components/pages/connected/RolesPage\";\n\n// Lazy imports for optional dependencies\nlet Policy: any;\nlet PolicySignRequest: any;\nlet TideMemory: any;\nlet ApprovalType: any;\nlet ExecutionType: any;\n\nlet tideLibsLoaded = false;\nlet tideLibsAvailable = false;\n\n/**\n * Attempts to load the Tide libraries (heimdall-tide and asgard-tide).\n * Returns true if both libraries are available, false otherwise.\n */\nexport async function loadTideLibs(): Promise<boolean> {\n if (tideLibsLoaded) return tideLibsAvailable;\n\n try {\n const heimdall = await import(\"heimdall-tide\");\n const asgard = await import(\"asgard-tide\");\n\n Policy = heimdall.Policy;\n PolicySignRequest = heimdall.PolicySignRequest;\n TideMemory = heimdall.TideMemory;\n ApprovalType = asgard.ApprovalType;\n ExecutionType = asgard.ExecutionType;\n\n tideLibsAvailable = true;\n } catch {\n tideLibsAvailable = false;\n }\n\n tideLibsLoaded = true;\n return tideLibsAvailable;\n}\n\n/**\n * Checks if Tide libraries are available without loading them.\n * Must call loadTideLibs() first.\n */\nexport function areTideLibsAvailable(): boolean {\n return tideLibsAvailable;\n}\n\n// Default model IDs for different contract types\nexport const DEFAULT_MODEL_IDS = {\n BASIC: \"BasicCustom<Role>:BasicCustom<1>\",\n DYNAMIC: \"DynamicCustom<Role>:DynamicCustom<1>\",\n DYNAMIC_APPROVED: \"DynamicApprovedCustom<Role>:DynamicApprovedCustom<1>\",\n} as const;\n\n/**\n * Default Forseti contract for role-based access control.\n * This is a simple contract that validates approvers and executors have the required role.\n */\nexport const DEFAULT_ROLE_CONTRACT = `using Ork.Forseti.Sdk;\nusing System;\nusing System.Collections.Generic;\n\n/// <summary>\n/// Default Role-Based Access Policy.\n/// Validates that approvers and executors have the required role for a resource.\n/// </summary>\npublic class RolePolicy : IAccessPolicy\n{\n [PolicyParam(Required = true, Description = \"Role required for access\")]\n public string Role { get; set; }\n\n [PolicyParam(Required = true, Description = \"Resource identifier for role check\")]\n public string Resource { get; set; }\n\n public PolicyDecision ValidateData(DataContext ctx)\n {\n // No data validation needed for role-based policies\n return PolicyDecision.Allow();\n }\n\n public PolicyDecision ValidateApprovers(ApproversContext ctx)\n {\n var approvers = DokenDto.WrapAll(ctx.Dokens);\n return Decision\n .Require(approvers != null && approvers.Count > 0, \"No approver dokens provided\")\n .RequireAnyWithRole(approvers, Resource, Role);\n }\n\n public PolicyDecision ValidateExecutor(ExecutorContext ctx)\n {\n var executor = new DokenDto(ctx.Doken);\n return Decision\n .RequireNotExpired(executor)\n .RequireRole(executor, Resource, Role);\n }\n}`;\n\nexport interface TidePolicyConfig {\n roleName: string;\n threshold: number;\n approvalType: \"implicit\" | \"explicit\";\n executionType: \"public\" | \"private\";\n modelId?: string;\n resource: string;\n vendorId: string;\n contractCode?: string;\n}\n\nexport interface TideContextMethods {\n initializeTideRequest: <T extends { encode: () => Uint8Array }>(request: T) => Promise<T>;\n getVendorId: () => string;\n getResource: () => string;\n}\n\n/**\n * Computes the contract ID (SHA512 hash) for a Forseti contract source.\n * This must match what the Ork server computes.\n */\nexport async function computeContractId(source: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(source);\n const hashBuffer = await crypto.subtle.digest(\"SHA-512\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Creates a Tide PolicySignRequest for a role policy.\n *\n * @param config - Policy configuration\n * @param context - TideCloak context methods for signing\n * @returns The signed PolicySignRequest\n * @throws Error if Tide libraries are not available\n */\nexport async function createTidePolicyRequest(\n config: TidePolicyConfig,\n context: TideContextMethods\n): Promise<any> {\n if (!tideLibsAvailable) {\n throw new Error(\n \"Tide libraries (heimdall-tide, asgard-tide) are not available. \" +\n \"Install them or provide a custom onCreatePolicy handler.\"\n );\n }\n\n const contractCode = config.contractCode || DEFAULT_ROLE_CONTRACT;\n const contractId = await computeContractId(contractCode);\n\n // Detect entry type from contract code\n const entryType = detectEntryType(contractCode) || \"RolePolicy\";\n\n // Create policy params\n const policyParams = new Map<string, any>();\n policyParams.set(\"role\", config.roleName);\n policyParams.set(\"threshold\", config.threshold);\n policyParams.set(\"resource\", config.resource);\n policyParams.set(\"approval_type\", config.approvalType);\n policyParams.set(\"execution_type\", config.executionType);\n\n // Create the Policy object\n const policy = new Policy({\n version: \"2\",\n modelId: config.modelId || DEFAULT_MODEL_IDS.DYNAMIC_APPROVED,\n contractId: contractId,\n keyId: config.vendorId,\n approvalType: config.approvalType === \"explicit\" ? ApprovalType.EXPLICIT : ApprovalType.IMPLICIT,\n executionType: config.executionType === \"private\" ? ExecutionType.PRIVATE : ExecutionType.PUBLIC,\n params: policyParams,\n });\n\n // Create the PolicySignRequest\n const policyRequest = PolicySignRequest.New(policy);\n const policyBytes = policy.toBytes();\n\n // Create contract transport\n // Structure: forsetiData[1] = innerPayload = [source, entryType]\n const contractTypeBytes = new TextEncoder().encode(\"forseti\");\n const sourceCodeBytes = new TextEncoder().encode(contractCode);\n const entryTypeBytes = new TextEncoder().encode(entryType);\n const innerPayload = TideMemory.CreateFromArray([sourceCodeBytes, entryTypeBytes]);\n const forsetiData = TideMemory.CreateFromArray([new Uint8Array(0), innerPayload]);\n const contractTransport = TideMemory.CreateFromArray([contractTypeBytes, forsetiData]);\n\n const draftWithContract = TideMemory.CreateFromArray([policyBytes, contractTransport]);\n policyRequest.draft = draftWithContract;\n policyRequest.setCustomExpiry(604800); // 7 days\n\n // Initialize (sign) the request using TideCloak context\n const signedRequest = await context.initializeTideRequest(policyRequest);\n\n return signedRequest;\n}\n\n/**\n * Detects the entry type (class name) from C# source code.\n * Looks for a public class implementing IAccessPolicy.\n */\nfunction detectEntryType(source: string): string | null {\n const match = source.match(/public\\s+class\\s+(\\w+)\\s*:\\s*IAccessPolicy/);\n return match ? match[1] : null;\n}\n\n/**\n * Creates a policy creation handler that uses the Tide workflow.\n * This is used as the default onCreatePolicy in RolesPage when Tide libs are available.\n *\n * @param context - TideCloak context methods\n * @param onRequestCreated - Optional callback when request is created (for custom handling)\n * @returns Policy creation handler function\n */\nexport function createTidePolicyHandler(\n context: TideContextMethods,\n onRequestCreated?: (request: any, roleName: string) => Promise<void>\n) {\n return async (params: {\n roleName: string;\n policyConfig: any;\n templateId?: string;\n templateParams?: Record<string, any>;\n threshold: number;\n contractCode?: string;\n }) => {\n const config: TidePolicyConfig = {\n roleName: params.roleName,\n threshold: params.threshold,\n approvalType: params.policyConfig?.approvalType || \"explicit\",\n executionType: params.policyConfig?.executionType || \"private\",\n resource: context.getResource(),\n vendorId: context.getVendorId(),\n contractCode: params.contractCode,\n modelId: params.policyConfig?.modelId,\n };\n\n const signedRequest = await createTidePolicyRequest(config, context);\n\n // Call the callback if provided (e.g., to submit to backend)\n if (onRequestCreated) {\n await onRequestCreated(signedRequest, params.roleName);\n }\n\n return signedRequest;\n };\n}\n\n/**\n * Converts a RolePolicy to TidePolicyConfig.\n * Useful when loading existing policies for re-signing or updates.\n */\nexport function rolePolicyToTideConfig(\n policy: RolePolicy,\n context: TideContextMethods\n): TidePolicyConfig {\n return {\n roleName: policy.roleName,\n threshold: policy.threshold,\n approvalType: policy.approvalType,\n executionType: policy.executionType,\n resource: context.getResource(),\n vendorId: context.getVendorId(),\n };\n}\n","/**\n * UsersPage - Pre-made user management page\n *\n * Uses AdminAPI from @tidecloak/js for data fetching.\n * Just drop it in and it works.\n */\n\nimport { AdminAPI as DefaultAdminAPI } from \"@tidecloak/js\";\nimport { UsersPageBase, type UsersPageBaseProps, type UserItem } from \"../base\";\nimport type { AccessMetadataAPI, AccessMetadataRecord } from \"./ApprovalsPage\";\n\n// Type for the AdminAPI instance\ntype AdminAPIInstance = {\n setRealm?: (realm: string) => void;\n getUsers: () => Promise<any>;\n getRoles: () => Promise<any>;\n getRole: (roleName: string) => Promise<any>;\n createUser: (user: any) => Promise<any>;\n updateUser: (userId: string, user: any) => Promise<any>;\n deleteUser: (userId: string) => Promise<any>;\n addUserRoles?: (userId: string, roles: any[]) => Promise<any>;\n removeUserRoles?: (userId: string, roles: any[]) => Promise<any>;\n setUserEnabled?: (userId: string, enabled: boolean) => Promise<any>;\n getTideLinkUrl?: (userId: string, redirectUri: string, lifespan?: number) => Promise<string>;\n};\n\nexport interface ChangeSetInfo {\n changeSetId: string;\n changeSetType: string;\n actionType: string;\n username: string;\n userId: string;\n roles: string[];\n timestamp: number;\n}\n\nexport interface UsersPageProps<T extends UserItem = UserItem>\n extends Omit<\n UsersPageBaseProps<T>,\n | \"fetchUsers\"\n | \"fetchRoles\"\n | \"onCreate\"\n | \"onUpdateProfile\"\n | \"onUpdateRoles\"\n | \"onDelete\"\n | \"onSetEnabled\"\n | \"getTideLinkUrl\"\n > {\n /** AdminAPI instance */\n adminAPI?: AdminAPIInstance;\n /** Realm name */\n realm?: string;\n /** Redirect URI for Tide link */\n tideLinkRedirectUri?: string;\n /** Access metadata adapter (saves metadata when role changes create change sets) */\n accessMetadataAPI?: AccessMetadataAPI;\n /** Callback when a change set is created */\n onChangeSetCreated?: (info: ChangeSetInfo) => void | Promise<void>;\n /** Override fetch users */\n fetchUsers?: UsersPageBaseProps<T>[\"fetchUsers\"];\n /** Override create */\n onCreate?: UsersPageBaseProps<T>[\"onCreate\"];\n /** Override delete */\n onDelete?: UsersPageBaseProps<T>[\"onDelete\"];\n /** Override getTideLinkUrl */\n getTideLinkUrl?: UsersPageBaseProps<T>[\"getTideLinkUrl\"];\n}\n\nexport function UsersPage<T extends UserItem = UserItem>({\n adminAPI: adminAPIProp,\n realm,\n tideLinkRedirectUri,\n accessMetadataAPI,\n onChangeSetCreated,\n fetchUsers: fetchUsersProp,\n onCreate: onCreateProp,\n onDelete: onDeleteProp,\n getTideLinkUrl: getTideLinkUrlProp,\n ...props\n}: UsersPageProps<T>) {\n // Use provided AdminAPI instance or fall back to default singleton\n const api = adminAPIProp || DefaultAdminAPI;\n\n // Set realm if provided\n if (realm && api.setRealm) {\n api.setRealm(realm);\n }\n\n const fetchUsers =\n fetchUsersProp ||\n (async () => {\n const rawUsers = await api.getUsers();\n // Transform users to include linked status based on vuid attribute\n const users = (rawUsers || []).map((u: any) => ({\n ...u,\n // User is linked if they have a vuid attribute (Tide account linked)\n linked: !!(u.attributes?.vuid?.[0]),\n // Ensure role is an array\n role: Array.isArray(u.role) ? u.role : u.role ? [u.role] : [],\n })) as T[];\n return users;\n });\n\n const fetchRoles = async () => {\n const roles = await api.getRoles();\n return { roles: roles || [] };\n };\n\n const onCreate =\n onCreateProp ||\n (async (data) => {\n await api.createUser(data);\n });\n\n const onUpdateProfile = async (data: {\n id: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n }) => {\n await api.updateUser(data.id, {\n firstName: data.firstName,\n lastName: data.lastName,\n email: data.email,\n });\n };\n\n // Helper to track change set metadata\n const trackChangeSet = async (\n response: any,\n userId: string,\n username: string,\n roles: string[],\n actionType: string\n ) => {\n // Extract changeSetId from response (AdminAPI returns this)\n const changeSetId = response?.changeSetId || response?.draftRecordId || response?.id;\n if (!changeSetId) {\n return;\n }\n\n const timestamp = Date.now();\n const info: ChangeSetInfo = {\n changeSetId,\n changeSetType: response?.changeSetType || \"USER\",\n actionType,\n username,\n userId,\n roles,\n timestamp,\n };\n\n // Call the callback if provided\n if (onChangeSetCreated) {\n await onChangeSetCreated(info);\n }\n\n // Save to metadata API if provided\n if (accessMetadataAPI) {\n const record: AccessMetadataRecord = {\n changeSetId,\n username,\n role: roles.join(\", \"),\n timestamp,\n actionType,\n changeSetType: info.changeSetType,\n };\n await accessMetadataAPI.saveMetadata(record);\n }\n };\n\n const onUpdateRoles = async (data: {\n id: string;\n username?: string;\n rolesToAdd?: string[];\n rolesToRemove?: string[];\n }) => {\n // Get username for metadata tracking\n const username = data.username || data.id;\n\n if (data.rolesToAdd?.length && api.addUserRoles) {\n // Fetch role details first\n const roles = await Promise.all(\n data.rolesToAdd.map((name) => api.getRole(name))\n );\n const response = await api.addUserRoles(data.id, roles);\n // Track the change set\n await trackChangeSet(response, data.id, username, data.rolesToAdd, \"ADD\");\n }\n if (data.rolesToRemove?.length && api.removeUserRoles) {\n const roles = await Promise.all(\n data.rolesToRemove.map((name) => api.getRole(name))\n );\n const response = await api.removeUserRoles(data.id, roles);\n // Track the change set\n await trackChangeSet(response, data.id, username, data.rolesToRemove, \"REMOVE\");\n }\n };\n\n const onDelete =\n onDeleteProp ||\n (async (userId: string) => {\n await api.deleteUser(userId);\n });\n\n const onSetEnabled = api.setUserEnabled\n ? async (userId: string, enabled: boolean) => {\n await api.setUserEnabled!(userId, enabled);\n }\n : undefined;\n\n // Get Tide link URL for user invitation\n const getTideLinkUrl =\n getTideLinkUrlProp ||\n (api.getTideLinkUrl\n ? async (userId: string) => {\n // Default redirect to current origin if not specified\n const redirectUri = tideLinkRedirectUri || (typeof window !== \"undefined\" ? window.location.origin : \"\");\n const linkUrl = await api.getTideLinkUrl!(userId, redirectUri);\n return { linkUrl };\n }\n : undefined);\n\n return (\n <UsersPageBase<T>\n fetchUsers={fetchUsers}\n fetchRoles={fetchRoles}\n onCreate={onCreate}\n onUpdateProfile={onUpdateProfile}\n onUpdateRoles={onUpdateRoles}\n onDelete={onDelete}\n onSetEnabled={onSetEnabled}\n getTideLinkUrl={getTideLinkUrl}\n {...props}\n />\n );\n}\n","/**\n * TemplatesPage - Manage policy templates\n *\n * @example\n * ```tsx\n * <TemplatesPage api={createLocalStorageTemplateAPI()} />\n * ```\n */\n\nimport { TemplatesPageBase, type TemplatesPageBaseProps, type PolicyTemplateItem, type TemplateFormData } from \"../base\";\n\n/** Implement this to store templates (or use createLocalStorageTemplateAPI for dev) */\nexport interface TemplateAPI {\n getTemplates: () => Promise<PolicyTemplateItem[]>;\n getTemplate?: (id: string) => Promise<PolicyTemplateItem>;\n createTemplate: (data: TemplateFormData) => Promise<PolicyTemplateItem | void>;\n updateTemplate: (id: string, data: Partial<TemplateFormData>) => Promise<PolicyTemplateItem | void>;\n deleteTemplate: (id: string) => Promise<void>;\n _isLocalStorage?: boolean;\n}\n\nconst STORAGE_KEY = \"tidecloak_policy_templates\";\n\n/** localStorage adapter for development */\nexport function createLocalStorageTemplateAPI(storageKey = STORAGE_KEY): TemplateAPI {\n const getAll = (): PolicyTemplateItem[] => {\n try {\n const data = localStorage.getItem(storageKey);\n return data ? JSON.parse(data) : [];\n } catch {\n return [];\n }\n };\n\n const saveAll = (templates: PolicyTemplateItem[]) => {\n localStorage.setItem(storageKey, JSON.stringify(templates));\n };\n\n return {\n _isLocalStorage: true,\n\n getTemplates: async () => {\n return getAll();\n },\n\n getTemplate: async (id: string) => {\n const templates = getAll();\n const template = templates.find((t) => t.id === id);\n if (!template) throw new Error(`Template not found: ${id}`);\n return template;\n },\n\n createTemplate: async (data: TemplateFormData) => {\n const templates = getAll();\n const newTemplate: PolicyTemplateItem = {\n id: crypto.randomUUID(),\n ...data,\n createdBy: \"user\",\n };\n templates.push(newTemplate);\n saveAll(templates);\n return newTemplate;\n },\n\n updateTemplate: async (id: string, data: Partial<TemplateFormData>) => {\n const templates = getAll();\n const index = templates.findIndex((t) => t.id === id);\n if (index === -1) throw new Error(`Template not found: ${id}`);\n templates[index] = { ...templates[index], ...data };\n saveAll(templates);\n return templates[index];\n },\n\n deleteTemplate: async (id: string) => {\n const templates = getAll();\n const filtered = templates.filter((t) => t.id !== id);\n if (filtered.length === templates.length) {\n throw new Error(`Template not found: ${id}`);\n }\n saveAll(filtered);\n },\n };\n}\n\nexport interface TemplatesPageProps<T extends PolicyTemplateItem = PolicyTemplateItem>\n extends Omit<TemplatesPageBaseProps<T>, \"fetchData\" | \"onCreate\" | \"onUpdate\" | \"onDelete\"> {\n /** Template storage adapter */\n api: TemplateAPI;\n /** Override fetch templates */\n fetchData?: TemplatesPageBaseProps<T>[\"fetchData\"];\n /** Override create */\n onCreate?: TemplatesPageBaseProps<T>[\"onCreate\"];\n /** Override update */\n onUpdate?: TemplatesPageBaseProps<T>[\"onUpdate\"];\n /** Override delete */\n onDelete?: TemplatesPageBaseProps<T>[\"onDelete\"];\n}\n\n// Warning banner for localStorage\nfunction LocalStorageWarning() {\n return (\n <div\n style={{\n backgroundColor: \"#fef3c7\",\n border: \"1px solid #f59e0b\",\n borderRadius: \"0.375rem\",\n padding: \"0.75rem 1rem\",\n marginBottom: \"1rem\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontSize: \"1rem\" }}>⚠️</span>\n <div style={{ fontSize: \"0.875rem\", color: \"#92400e\" }}>\n <strong>Development Mode:</strong> Templates are stored in browser localStorage and will not persist across\n devices or browsers. For production, implement your own{\" \"}\n <code style={{ backgroundColor: \"#fde68a\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>TemplateAPI</code>{\" \"}\n with a backend database.\n </div>\n </div>\n );\n}\n\nexport function TemplatesPage<T extends PolicyTemplateItem = PolicyTemplateItem>({\n api,\n fetchData: fetchDataProp,\n onCreate: onCreateProp,\n onUpdate: onUpdateProp,\n onDelete: onDeleteProp,\n helpText: helpTextProp,\n ...props\n}: TemplatesPageProps<T>) {\n const isLocalStorage = api._isLocalStorage === true;\n\n const fetchData =\n fetchDataProp ||\n (async () => {\n const templates = (await api.getTemplates()) as T[];\n return { templates: templates || [] };\n });\n\n const onCreate =\n onCreateProp ||\n (async (data) => {\n await api.createTemplate(data);\n });\n\n const onUpdate =\n onUpdateProp ||\n (async (id, data) => {\n await api.updateTemplate(id, data);\n });\n\n const onDelete =\n onDeleteProp ||\n (async (id) => {\n await api.deleteTemplate(id);\n });\n\n // Show localStorage warning if using localStorage API\n const helpText = isLocalStorage ? (\n <>\n <LocalStorageWarning />\n {helpTextProp}\n </>\n ) : (\n helpTextProp\n );\n\n return (\n <TemplatesPageBase<T>\n fetchData={fetchData}\n onCreate={onCreate}\n onUpdate={onUpdate}\n onDelete={onDelete}\n helpText={helpText}\n {...props}\n />\n );\n}\n","/**\n * LogsPage - View access and policy activity logs\n *\n * @example\n * ```tsx\n * <LogsPage adminAPI={AdminAPI} policyLogsAPI={policyLogsAPI} />\n * ```\n */\n\nimport { AdminAPI as DefaultAdminAPI } from \"@tidecloak/js\";\nimport {\n LogsPageBase,\n type LogsPageBaseProps,\n type AccessLogItem,\n type PolicyLogItem,\n createLogTimestampColumn,\n createActionColumn,\n createLogProgressColumn,\n} from \"../base\";\nimport { User, Shield } from \"lucide-react\";\nimport { StatusBadge } from \"../../common/StatusBadge\";\n\n// Type for the AdminAPI instance\ntype AdminAPIInstance = {\n setRealm?: (realm: string) => void;\n getAccessLogs: (params: { first: number; max: number }) => Promise<any>;\n};\n\nexport interface PolicyLogData {\n id: string;\n policyId: string;\n roleId: string;\n action: string;\n performedBy: string;\n performedByEmail?: string;\n timestamp: number; // Unix timestamp in milliseconds\n createdAt?: number; // Unix timestamp in seconds (for display)\n policyStatus?: string;\n policyThreshold?: number;\n approvalCount?: number;\n rejectionCount?: number;\n details?: string;\n}\n\n/** Implement this to store policy logs (or use createLocalStoragePolicyLogsAPI for dev) */\nexport interface PolicyLogsAPI {\n getPolicyLogs: (params: { first: number; max: number }) => Promise<PolicyLogData[]>;\n addLog: (log: Omit<PolicyLogData, \"id\" | \"timestamp\" | \"createdAt\">) => Promise<void>;\n _isLocalStorage?: boolean;\n}\n\nconst POLICY_LOGS_STORAGE_KEY = \"tidecloak_policy_logs\";\n\n/** localStorage adapter for development */\nexport function createLocalStoragePolicyLogsAPI(storageKey = POLICY_LOGS_STORAGE_KEY): PolicyLogsAPI {\n const getAll = (): PolicyLogData[] => {\n try {\n const data = localStorage.getItem(storageKey);\n return data ? JSON.parse(data) : [];\n } catch {\n return [];\n }\n };\n\n const saveAll = (logs: PolicyLogData[]) => {\n localStorage.setItem(storageKey, JSON.stringify(logs));\n };\n\n return {\n _isLocalStorage: true as const,\n\n getPolicyLogs: async (params: { first: number; max: number }) => {\n const logs = getAll();\n // Sort by timestamp descending (newest first)\n logs.sort((a, b) => b.timestamp - a.timestamp);\n return logs.slice(params.first, params.first + params.max);\n },\n\n addLog: async (log: Omit<PolicyLogData, \"id\" | \"timestamp\" | \"createdAt\">) => {\n const logs = getAll();\n const now = Date.now();\n const newLog: PolicyLogData = {\n ...log,\n id: `log-${now}-${Math.random().toString(36).slice(2, 9)}`,\n timestamp: now,\n createdAt: Math.floor(now / 1000), // Unix seconds for display\n };\n logs.push(newLog);\n saveAll(logs);\n },\n };\n}\n\nexport interface LogsPageProps extends Omit<LogsPageBaseProps, \"tabs\"> {\n /** AdminAPI instance */\n adminAPI?: AdminAPIInstance;\n /** Policy logs adapter */\n policyLogsAPI?: PolicyLogsAPI;\n /** Realm name */\n realm?: string;\n /** Custom tabs config */\n tabs?: LogsPageBaseProps[\"tabs\"];\n /** Show policy tab (default: true) */\n showPolicyTab?: boolean;\n /** Help text below description */\n helpText?: LogsPageBaseProps[\"helpText\"];\n}\n\n// Warning banner for localStorage\nfunction LocalStorageWarning() {\n return (\n <div\n style={{\n backgroundColor: \"#fef3c7\",\n border: \"1px solid #f59e0b\",\n borderRadius: \"0.375rem\",\n padding: \"0.75rem 1rem\",\n marginBottom: \"1rem\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontSize: \"1rem\" }}>⚠️</span>\n <div style={{ fontSize: \"0.875rem\", color: \"#92400e\" }}>\n <strong>Development Mode:</strong> Policy logs are stored in browser localStorage and will not persist across\n devices or browsers. For production, implement your own{\" \"}\n <code style={{ backgroundColor: \"#fde68a\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>PolicyLogsAPI</code>{\" \"}\n with a backend database.\n </div>\n </div>\n );\n}\n\nexport function LogsPage({\n adminAPI: adminAPIProp,\n policyLogsAPI: policyLogsAPIProp,\n realm,\n tabs: tabsProp,\n showPolicyTab = true,\n helpText: helpTextProp,\n ...props\n}: LogsPageProps) {\n // Use localStorage by default for policy logs (like RolesPage pattern)\n const policyLogsAPI = policyLogsAPIProp ?? createLocalStoragePolicyLogsAPI();\n const isPolicyLocalStorage = policyLogsAPI._isLocalStorage === true;\n\n // Use provided AdminAPI instance or fall back to default singleton\n const api = (adminAPIProp || DefaultAdminAPI) as AdminAPIInstance;\n\n // Set realm if provided\n if (realm && api.setRealm) {\n api.setRealm(realm);\n }\n\n const defaultTabs: LogsPageBaseProps[\"tabs\"] = {\n access: {\n key: \"access\",\n label: \"Access Logs\",\n icon: <User style={{ height: \"1rem\", width: \"1rem\" }} />,\n fetchData: async (limit, offset) => {\n const events = await api.getAccessLogs({ first: offset, max: limit });\n return (events || []) as AccessLogItem[];\n },\n columns: [\n createLogTimestampColumn<AccessLogItem>({ field: \"time\" }),\n {\n key: \"type\",\n header: \"Event\",\n cell: (item) => <span style={{ fontSize: \"0.875rem\" }}>{item.type}</span>,\n },\n {\n key: \"username\",\n header: \"Username\",\n cell: (item) => (\n <span style={{ fontSize: \"0.875rem\" }}>{item.details?.username || \"-\"}</span>\n ),\n },\n {\n key: \"ip\",\n header: \"IP Address\",\n responsive: \"md\" as const,\n cell: (item) => (\n <span style={{ fontSize: \"0.875rem\", fontFamily: \"monospace\" }}>\n {item.ipAddress || \"-\"}\n </span>\n ),\n },\n ],\n emptyState: {\n icon: <User style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />,\n title: \"No access logs found\",\n description: \"User events will appear here.\",\n },\n queryKeys: [\"access-logs\"],\n },\n };\n\n // Add policy tab (shown by default, can be hidden with showPolicyTab={false})\n if (showPolicyTab) {\n defaultTabs.policies = {\n key: \"policies\",\n label: \"Policy Logs\",\n icon: <Shield style={{ height: \"1rem\", width: \"1rem\" }} />,\n fetchData: async (limit, offset) => {\n try {\n const logs = await policyLogsAPI.getPolicyLogs({ first: offset, max: limit });\n return (logs || []) as PolicyLogItem[];\n } catch {\n return [];\n }\n },\n columns: [\n createLogTimestampColumn<PolicyLogItem>({ field: \"createdAt\" }),\n createActionColumn<PolicyLogItem>(),\n {\n key: \"role\",\n header: \"Role\",\n cell: (item) => (\n <span style={{ fontSize: \"0.875rem\", fontFamily: \"monospace\" }}>\n {item.roleId || \"N/A\"}\n </span>\n ),\n },\n {\n key: \"performedBy\",\n header: \"Performed By\",\n responsive: \"md\" as const,\n cell: (item) => (\n <span style={{ fontSize: \"0.875rem\" }}>\n {item.performedByEmail || item.performedBy || \"-\"}\n </span>\n ),\n },\n createLogProgressColumn<PolicyLogItem>(),\n {\n key: \"status\",\n header: \"Status\",\n cell: (item) => {\n if (!item.policyStatus) {\n return <span style={{ color: \"#6b7280\", fontSize: \"0.875rem\" }}>-</span>;\n }\n return <StatusBadge status={item.policyStatus} />;\n },\n },\n ],\n emptyState: {\n icon: <Shield style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />,\n title: \"No policy logs found\",\n description: \"Policy activity will appear here.\",\n },\n queryKeys: [\"policy-logs\"],\n };\n }\n\n // Show localStorage warning if using localStorage API\n const helpText = isPolicyLocalStorage ? (\n <>\n <LocalStorageWarning />\n {helpTextProp}\n </>\n ) : (\n helpTextProp\n );\n\n return <LogsPageBase tabs={tabsProp || defaultTabs} helpText={helpText} {...props} />;\n}\n","/**\n * ApprovalsPage - Review and approve pending changes\n *\n * @example\n * ```tsx\n * <ApprovalsPage\n * adminAPI={AdminAPI}\n * tideContext={tideContext}\n * policyLogsAPI={policyLogsAPI}\n * currentUsername={username}\n * />\n * ```\n */\n\nimport { AdminAPI as DefaultAdminAPI } from \"@tidecloak/js\";\nimport {\n ApprovalsPageBase,\n type ApprovalsPageBaseProps,\n type ApprovalTabConfig,\n type BaseApprovalItem,\n type AccessApprovalItem,\n type PolicyApprovalItem,\n createUserColumn,\n createRoleColumn,\n createTimestampColumn,\n createStatusColumn,\n createProgressColumn,\n} from \"../base\";\nimport { User, Shield, FileKey } from \"lucide-react\";\nimport { type PolicyLogsAPI } from \"./LogsPage\";\n\ntype AdminAPIInstance = {\n setRealm?: (realm: string) => void;\n getPendingChangeSets: () => Promise<any>;\n approveChangeSet: (changeSet: any) => Promise<any>;\n commitChangeSet: (changeSet: any) => Promise<any>;\n cancelChangeSet: (changeSet: any) => Promise<any>;\n getRawChangeSetRequest?: (changeSet: any) => Promise<any[]>;\n approveChangeSetWithSignature?: (changeSet: any, signedRequest: string) => Promise<void>;\n};\n\nexport interface TideApprovalResult {\n id: string;\n approved?: { request: Uint8Array };\n denied?: boolean;\n pending?: boolean;\n}\n\n/** Get from useTideCloak() hook */\nexport interface TideApprovalContext {\n initializeTideRequest: <T extends { encode: () => Uint8Array }>(request: T) => Promise<T>;\n approveTideRequests: (requests: { id: string; request: Uint8Array }[]) => Promise<TideApprovalResult[]>;\n}\n\nexport interface PolicyApprovalData {\n id: string;\n roleId: string;\n requestedBy: string;\n requestedByEmail?: string;\n threshold: number;\n approvalCount: number;\n rejectionCount?: number;\n commitReady?: boolean;\n approvedBy?: string[];\n deniedBy?: string[];\n status: string;\n timestamp: string | number;\n policyRequestData: string;\n contractCode?: string;\n}\n\n/** Implement this to store policy approvals (or use createLocalStoragePolicyApprovalsAPI for dev) */\nexport interface PolicyApprovalsAPI {\n getPendingPolicies: () => Promise<PolicyApprovalData[]>;\n approve?: (id: string, rejected?: boolean, username?: string) => Promise<void>;\n revoke?: (id: string, username?: string) => Promise<void>;\n commit?: (id: string) => Promise<void>;\n cancel?: (id: string) => Promise<void>;\n _isLocalStorage?: boolean;\n}\n\nconst POLICY_APPROVALS_STORAGE_KEY = \"tidecloak_policy_approvals\";\n\n/** localStorage adapter for development */\nexport function createLocalStoragePolicyApprovalsAPI(\n storageKey = POLICY_APPROVALS_STORAGE_KEY\n): PolicyApprovalsAPI {\n const getAll = (): PolicyApprovalData[] => {\n try {\n const data = localStorage.getItem(storageKey);\n return data ? JSON.parse(data) : [];\n } catch {\n return [];\n }\n };\n\n const saveAll = (approvals: PolicyApprovalData[]) => {\n localStorage.setItem(storageKey, JSON.stringify(approvals));\n };\n\n return {\n _isLocalStorage: true as const,\n\n getPendingPolicies: async () => {\n return getAll().filter((a) => a.status === \"pending\");\n },\n\n approve: async (id: string, rejected?: boolean, username?: string) => {\n const approvals = getAll();\n const index = approvals.findIndex((a) => a.id === id);\n if (index >= 0) {\n const approval = approvals[index];\n approval.approvedBy = approval.approvedBy || [];\n approval.deniedBy = approval.deniedBy || [];\n\n if (rejected) {\n if (username && !approval.deniedBy.includes(username)) {\n approval.deniedBy.push(username);\n }\n } else {\n if (username && !approval.approvedBy.includes(username)) {\n approval.approvedBy.push(username);\n }\n }\n\n approval.approvalCount = approval.approvedBy.length;\n approval.rejectionCount = approval.deniedBy.length;\n approval.commitReady = approval.approvalCount >= approval.threshold;\n saveAll(approvals);\n }\n },\n\n revoke: async (id: string, username?: string) => {\n const approvals = getAll();\n const index = approvals.findIndex((a) => a.id === id);\n if (index >= 0) {\n const approval = approvals[index];\n if (username) {\n approval.approvedBy = (approval.approvedBy || []).filter((u) => u !== username);\n approval.deniedBy = (approval.deniedBy || []).filter((u) => u !== username);\n }\n approval.approvalCount = (approval.approvedBy || []).length;\n approval.rejectionCount = (approval.deniedBy || []).length;\n approval.commitReady = approval.approvalCount >= approval.threshold;\n saveAll(approvals);\n }\n },\n\n commit: async (id: string) => {\n const approvals = getAll();\n const index = approvals.findIndex((a) => a.id === id);\n if (index >= 0) {\n approvals[index].status = \"committed\";\n saveAll(approvals);\n }\n },\n\n cancel: async (id: string) => {\n const approvals = getAll().filter((a) => a.id !== id);\n saveAll(approvals);\n },\n };\n}\n\nexport interface AccessMetadataRecord {\n changeSetId: string;\n username: string;\n userEmail?: string;\n clientId?: string;\n role?: string;\n timestamp: string | number;\n actionType?: string;\n changeSetType?: string;\n}\n\n/** Implement this to store access change metadata (or use createLocalStorageAccessMetadataAPI for dev) */\nexport interface AccessMetadataAPI {\n getMetadata: (changeSetId: string) => Promise<AccessMetadataRecord | null>;\n getAllMetadata: () => Promise<AccessMetadataRecord[]>;\n saveMetadata: (record: AccessMetadataRecord) => Promise<void>;\n deleteMetadata: (changeSetId: string) => Promise<void>;\n _isLocalStorage?: boolean;\n}\n\nconst ACCESS_METADATA_STORAGE_KEY = \"tidecloak_access_metadata\";\n\n/** localStorage adapter for development */\nexport function createLocalStorageAccessMetadataAPI(\n storageKey = ACCESS_METADATA_STORAGE_KEY\n): AccessMetadataAPI {\n const getAll = (): AccessMetadataRecord[] => {\n try {\n const data = localStorage.getItem(storageKey);\n return data ? JSON.parse(data) : [];\n } catch {\n return [];\n }\n };\n\n const saveAll = (records: AccessMetadataRecord[]) => {\n localStorage.setItem(storageKey, JSON.stringify(records));\n };\n\n return {\n _isLocalStorage: true as const,\n\n getMetadata: async (changeSetId: string) => {\n const records = getAll();\n return records.find((r) => r.changeSetId === changeSetId) || null;\n },\n\n getAllMetadata: async () => {\n return getAll();\n },\n\n saveMetadata: async (record: AccessMetadataRecord) => {\n const records = getAll();\n const index = records.findIndex((r) => r.changeSetId === record.changeSetId);\n if (index >= 0) {\n records[index] = record;\n } else {\n records.push(record);\n }\n saveAll(records);\n },\n\n deleteMetadata: async (changeSetId: string) => {\n const records = getAll().filter((r) => r.changeSetId !== changeSetId);\n saveAll(records);\n },\n };\n}\n\n/** Tab config with optional enclave support */\nexport interface EnclaveApprovalTabConfig {\n /** Get raw request bytes for enclave approval (enables enclave if provided) */\n getRawRequest?: (item: any) => Promise<Uint8Array | null>;\n /** Submit signed approval after user approves in enclave */\n submitSignedApproval?: (item: any, signedRequest: string) => Promise<void>;\n /** Handle denial from enclave */\n onEnclaveDenied?: (item: any) => Promise<void>;\n}\n\nexport interface ApprovalsPageProps extends Omit<ApprovalsPageBaseProps, \"tabs\"> {\n /** AdminAPI instance */\n adminAPI?: AdminAPIInstance;\n /** Policy approvals storage adapter */\n policyApprovalsAPI?: PolicyApprovalsAPI;\n /** Policy logs adapter for activity tracking */\n policyLogsAPI?: PolicyLogsAPI;\n /** Access metadata adapter (merges with AdminAPI data) */\n accessMetadataAPI?: AccessMetadataAPI;\n /** Tide context for enclave approvals (from useTideCloak hook) */\n tideContext?: TideApprovalContext;\n /** Realm name */\n realm?: string;\n /** Custom tabs config */\n tabs?: ApprovalsPageBaseProps[\"tabs\"];\n /** Additional tabs with optional enclave support */\n additionalTabs?: (ApprovalTabConfig<BaseApprovalItem> & EnclaveApprovalTabConfig)[];\n /** Show policy tab (default: true) */\n showPolicyTab?: boolean;\n /** Help text below description */\n helpText?: ApprovalsPageBaseProps[\"helpText\"];\n /** Current username for logging */\n currentUsername?: string;\n}\n\n/**\n * Helper function to wrap an onReview handler with approval enclave logic.\n * When tideContext is provided, the review will open the Tide approval enclave.\n */\nfunction createEnclaveReviewHandler<T extends { id: string }>(\n tideContext: TideApprovalContext | undefined,\n getRawRequest: (item: T) => Promise<Uint8Array | null>,\n submitSignedApproval: (item: T, signedRequest: string) => Promise<void>,\n onDenied: (item: T) => Promise<void>,\n fallbackApprove: (item: T) => Promise<void>\n): (item: T) => Promise<void> {\n return async (item: T) => {\n // Use Tide approval enclave if context is provided\n if (tideContext?.approveTideRequests) {\n try {\n const rawBytes = await getRawRequest(item);\n\n if (rawBytes && rawBytes.length > 0) {\n // Open Tide approval enclave (shows approval UI popup)\n const results = await tideContext.approveTideRequests([{\n id: `approval-${item.id}`,\n request: rawBytes,\n }]);\n\n const result = results[0];\n\n if (result?.approved) {\n // Convert approved request back to base64 for the API\n const signedRequest = btoa(String.fromCharCode(...result.approved.request));\n await submitSignedApproval(item, signedRequest);\n return;\n } else if (result?.denied) {\n // User denied in the enclave\n await onDenied(item);\n return;\n }\n // If pending, do nothing - user closed the popup without deciding\n return;\n }\n } catch {\n // Tide approval enclave failed, fall back to simple approval\n }\n }\n\n // Fallback to simple approval (no enclave)\n await fallbackApprove(item);\n };\n}\n\n// Warning banner for localStorage\nfunction LocalStorageWarning() {\n return (\n <div\n style={{\n backgroundColor: \"#fef3c7\",\n border: \"1px solid #f59e0b\",\n borderRadius: \"0.375rem\",\n padding: \"0.75rem 1rem\",\n marginBottom: \"1rem\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontSize: \"1rem\" }}>⚠️</span>\n <div style={{ fontSize: \"0.875rem\", color: \"#92400e\" }}>\n <strong>Development Mode:</strong> Policy approvals are stored in browser localStorage and will not persist\n across devices or browsers. For production, implement your own{\" \"}\n <code style={{ backgroundColor: \"#fde68a\", padding: \"0 0.25rem\", borderRadius: \"0.25rem\" }}>\n PolicyApprovalsAPI\n </code>{\" \"}\n with a backend database.\n </div>\n </div>\n );\n}\n\n/**\n * Helper to check if an error is a JSON parse error from a text success response.\n * AdminAPI methods try to JSON.parse responses, but the server often returns plain text\n * like \"Successful\", \"Change set cancelled\", etc. These are actually success messages.\n */\nfunction isTextResponseError(err: unknown): boolean {\n return err instanceof SyntaxError && (\n err.message.includes(\"Unexpected token\") ||\n err.message.includes(\"is not valid JSON\")\n );\n}\n\n/**\n * Helper to extract change set info from an item.\n * AdminAPI returns { changeSetId, changeSetType, actionType } directly on items.\n * For backwards compatibility, also checks for retrievalInfo.\n */\nfunction getChangeSet(item: any): { changeSetId: string; changeSetType: string; actionType: string } {\n // If item has retrievalInfo (backwards compat), use it\n if (item.retrievalInfo) {\n return item.retrievalInfo;\n }\n // Otherwise use properties directly on item (AdminAPI format)\n return {\n changeSetId: item.changeSetId || item.draftRecordId || item.id,\n changeSetType: item.changeSetType || \"USER\",\n actionType: item.actionType || \"ADD\",\n };\n}\n\nexport function ApprovalsPage({\n adminAPI: adminAPIProp,\n policyApprovalsAPI: policyApprovalsAPIProp,\n policyLogsAPI,\n accessMetadataAPI: accessMetadataAPIProp,\n tideContext,\n realm,\n tabs: tabsProp,\n additionalTabs,\n showPolicyTab = true,\n helpText: helpTextProp,\n currentUsername,\n ...props\n}: ApprovalsPageProps) {\n // Use localStorage by default for policy approvals (like RolesPage pattern)\n const policyApprovalsAPI = policyApprovalsAPIProp ?? createLocalStoragePolicyApprovalsAPI();\n const isPolicyLocalStorage = policyApprovalsAPI._isLocalStorage === true;\n\n // Use localStorage by default for access metadata\n const accessMetadataAPI = accessMetadataAPIProp ?? createLocalStorageAccessMetadataAPI();\n const isAccessMetadataLocalStorage = accessMetadataAPI._isLocalStorage === true;\n\n // Use provided AdminAPI instance or fall back to default singleton\n const api = (adminAPIProp || DefaultAdminAPI) as AdminAPIInstance;\n\n // Set realm if provided\n if (realm && api.setRealm) {\n api.setRealm(realm);\n }\n\n // Build tabs based on what APIs are available\n const defaultTabs: ApprovalsPageBaseProps[\"tabs\"] = {\n access: {\n key: \"access\",\n label: \"Access\",\n icon: <User style={{ height: \"1rem\", width: \"1rem\" }} />,\n fetchData: async () => {\n const approvals = await api.getPendingChangeSets();\n\n // Get all metadata records for merging\n const allMetadata = await accessMetadataAPI.getAllMetadata();\n const metadataMap = new Map(allMetadata.map((m) => [m.changeSetId, m]));\n\n // Map items and merge with metadata\n return (approvals || []).map((item: any) => {\n const changeSetId = item.changeSetId || item.draftRecordId || item.id;\n const metadata = metadataMap.get(changeSetId);\n\n // Extract from userRecord array if available (server returns user info there)\n const firstUserRecord = item.userRecord?.[0];\n\n // Determine commit readiness based on status field\n // Server sets status to \"APPROVED\" after enclave approval\n const isCommitReady =\n item.status === \"APPROVED\" ||\n item.deleteStatus === \"APPROVED\" ||\n item.commitReady === true;\n\n return {\n ...item,\n id: changeSetId,\n // Extract username from userRecord[0] or item or metadata\n username: firstUserRecord?.username || item.username || item.userName || metadata?.username || \"\",\n // Extract clientId from userRecord[0] or item or metadata\n clientId: firstUserRecord?.clientId || item.clientId || item.client || metadata?.clientId || \"\",\n role: item.role || item.roleName || metadata?.role || \"\",\n timestamp: item.timestamp || item.createdAt || item.created || metadata?.timestamp || Date.now(),\n status: item.status || \"pending\",\n // Add commitReady flag for canCommit check\n commitReady: isCommitReady,\n };\n }) as AccessApprovalItem[];\n },\n columns: [\n createUserColumn<AccessApprovalItem>(),\n createRoleColumn<AccessApprovalItem>(),\n {\n key: \"client\",\n header: \"Client\",\n responsive: \"lg\" as const,\n cell: (item) => (\n <span style={{ fontSize: \"0.875rem\", color: \"#6b7280\" }}>{item.clientId || \"-\"}</span>\n ),\n },\n createTimestampColumn<AccessApprovalItem>({ responsive: \"md\" }),\n createStatusColumn<AccessApprovalItem>(),\n ],\n emptyState: {\n icon: <User style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />,\n title: \"No pending access requests\",\n description: \"User access change requests will appear here.\",\n },\n actions: {\n onReview: createEnclaveReviewHandler<AccessApprovalItem>(\n tideContext,\n // Get raw request from AdminAPI\n async (item) => {\n if (!api.getRawChangeSetRequest) return null;\n const changeSet = getChangeSet(item);\n try {\n const rawRequests = await api.getRawChangeSetRequest(changeSet);\n if (rawRequests && rawRequests.length > 0) {\n const rawRequest = rawRequests[0];\n const changeSetDraftRequests = rawRequest.changeSetDraftRequests;\n if (changeSetDraftRequests) {\n return typeof changeSetDraftRequests === \"string\"\n ? Uint8Array.from(atob(changeSetDraftRequests), c => c.charCodeAt(0))\n : changeSetDraftRequests;\n }\n }\n } catch {\n // Failed to get raw change set request\n }\n return null;\n },\n // Submit signed approval\n async (item, signedRequest) => {\n if (!api.approveChangeSetWithSignature) {\n throw new Error(\"approveChangeSetWithSignature not available\");\n }\n try {\n await api.approveChangeSetWithSignature(getChangeSet(item), signedRequest);\n } catch (err) {\n // Server returns plain text like \"Successful\" - treat as success\n if (isTextResponseError(err)) {\n return;\n }\n throw err;\n }\n },\n // On denied - cancel the change set\n async (item) => {\n const changeSet = getChangeSet(item);\n try {\n await api.cancelChangeSet(changeSet);\n } catch (err) {\n // Server returns plain text - treat as success\n if (!isTextResponseError(err)) {\n throw err;\n }\n }\n // Clean up metadata after denial\n await accessMetadataAPI.deleteMetadata(changeSet.changeSetId);\n },\n // Fallback approve\n async (item) => {\n try {\n await api.approveChangeSet(getChangeSet(item));\n } catch (err) {\n // Server returns plain text - treat as success\n if (isTextResponseError(err)) {\n return;\n }\n throw err;\n }\n }\n ),\n onCommit: async (item) => {\n const changeSet = getChangeSet(item);\n try {\n await api.commitChangeSet(changeSet);\n } catch (err) {\n // Server returns plain text - treat as success\n if (!isTextResponseError(err)) {\n throw err;\n }\n }\n // Clean up metadata after successful commit\n await accessMetadataAPI.deleteMetadata(changeSet.changeSetId);\n },\n onCancel: async (item) => {\n const changeSet = getChangeSet(item);\n try {\n await api.cancelChangeSet(changeSet);\n } catch (err) {\n // Server returns plain text - treat as success\n if (!isTextResponseError(err)) {\n throw err;\n }\n }\n // Clean up metadata after successful cancel\n await accessMetadataAPI.deleteMetadata(changeSet.changeSetId);\n },\n },\n canCommit: (item) => {\n // commitReady is computed in fetchData based on status === \"APPROVED\"\n return (item as any).commitReady === true;\n },\n queryKeys: [\"access-approvals\"],\n },\n };\n\n // Add policy tab (shown by default, can be hidden with showPolicyTab={false})\n if (showPolicyTab) {\n defaultTabs.policies = {\n key: \"policies\",\n label: \"Policies\",\n icon: <FileKey style={{ height: \"1rem\", width: \"1rem\" }} />,\n fetchData: async () => {\n try {\n const policies = await policyApprovalsAPI.getPendingPolicies();\n return (policies || []) as PolicyApprovalItem[];\n } catch {\n return [];\n }\n },\n columns: [\n {\n key: \"role\",\n header: \"Role\",\n cell: (item) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Shield style={{ height: \"1rem\", width: \"1rem\", color: \"#6b7280\" }} />\n <span style={{ fontFamily: \"monospace\" }}>{item.roleId}</span>\n </div>\n ),\n },\n {\n key: \"requestedBy\",\n header: \"Requested By\",\n responsive: \"sm\" as const,\n cell: (item) => item.requestedByEmail || item.requestedBy,\n },\n createProgressColumn<PolicyApprovalItem>(),\n createStatusColumn<PolicyApprovalItem>(),\n ],\n emptyState: {\n icon: <FileKey style={{ height: \"3rem\", width: \"3rem\", color: \"#6b7280\" }} />,\n title: \"No pending policy changes\",\n description: \"Policy change requests will appear here.\",\n },\n actions: {\n onReview: policyApprovalsAPI.approve\n ? createEnclaveReviewHandler<PolicyApprovalItem>(\n tideContext,\n // Get raw request from policyRequestData\n async (item) => {\n if (item.policyRequestData) {\n try {\n return Uint8Array.from(atob(item.policyRequestData), c => c.charCodeAt(0));\n } catch {\n return null;\n }\n }\n return null;\n },\n // Submit signed approval: approve(id, rejected=false, username)\n async (item, _signedRequest) => {\n await policyApprovalsAPI.approve!(item.id, false, currentUsername);\n // Log the approval\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"approved\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: item.requestedByEmail,\n policyStatus: (item.approvalCount || 0) + 1 >= item.threshold ? \"approved\" : \"pending\",\n policyThreshold: item.threshold,\n approvalCount: (item.approvalCount || 0) + 1,\n rejectionCount: item.rejectionCount,\n });\n }\n },\n // On denied: approve(id, rejected=true, username)\n async (item) => {\n await policyApprovalsAPI.approve!(item.id, true, currentUsername);\n // Log the denial\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"denied\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: item.requestedByEmail,\n policyStatus: \"pending\",\n policyThreshold: item.threshold,\n approvalCount: item.approvalCount,\n rejectionCount: (item.rejectionCount || 0) + 1,\n });\n }\n },\n // Fallback approve (no enclave)\n async (item) => {\n await policyApprovalsAPI.approve!(item.id, false, currentUsername);\n // Log the approval\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"approved\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: item.requestedByEmail,\n policyStatus: (item.approvalCount || 0) + 1 >= item.threshold ? \"approved\" : \"pending\",\n policyThreshold: item.threshold,\n approvalCount: (item.approvalCount || 0) + 1,\n rejectionCount: item.rejectionCount,\n });\n }\n }\n )\n : undefined,\n onRevoke: policyApprovalsAPI.revoke && currentUsername\n ? async (item) => {\n if (!confirm(\"Are you sure you want to revoke your decision on this policy?\")) {\n return;\n }\n await policyApprovalsAPI.revoke!(item.id, currentUsername);\n // Log the revoke\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"revoked\",\n performedBy: currentUsername,\n performedByEmail: item.requestedByEmail,\n policyStatus: \"pending\",\n policyThreshold: item.threshold,\n approvalCount: item.approvalCount,\n rejectionCount: item.rejectionCount,\n });\n }\n }\n : undefined,\n onCommit: policyApprovalsAPI.commit\n ? async (item) => {\n await policyApprovalsAPI.commit!(item.id);\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"committed\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: item.requestedByEmail,\n policyStatus: \"committed\",\n policyThreshold: item.threshold,\n approvalCount: item.approvalCount,\n rejectionCount: item.rejectionCount,\n });\n }\n }\n : undefined,\n onCancel: policyApprovalsAPI.cancel\n ? async (item) => {\n await policyApprovalsAPI.cancel!(item.id);\n if (policyLogsAPI) {\n await policyLogsAPI.addLog({\n policyId: item.id,\n roleId: item.roleId,\n action: \"cancelled\",\n performedBy: currentUsername || \"unknown\",\n performedByEmail: item.requestedByEmail,\n policyStatus: \"cancelled\",\n policyThreshold: item.threshold,\n approvalCount: item.approvalCount,\n rejectionCount: item.rejectionCount,\n });\n }\n }\n : undefined,\n },\n canCommit: (item) => item.commitReady || (item.approvalCount || 0) >= item.threshold,\n hasUserDecided: currentUsername\n ? (item) => {\n const approvedBy = item.approvedBy || [];\n const deniedBy = item.deniedBy || [];\n return approvedBy.includes(currentUsername) || deniedBy.includes(currentUsername);\n }\n : undefined,\n queryKeys: [\"policy-approvals\"],\n };\n }\n\n // Process additional tabs to wrap onReview with enclave support\n const processedAdditionalTabs = additionalTabs?.map((tab) => {\n // If tab has getRawRequest, wrap onReview with enclave support\n if (tab.getRawRequest && tab.actions?.onReview) {\n const originalOnReview = tab.actions.onReview;\n return {\n ...tab,\n actions: {\n ...tab.actions,\n onReview: createEnclaveReviewHandler(\n tideContext,\n tab.getRawRequest,\n tab.submitSignedApproval || (async (_item, _signedRequest) => {\n // Default: just call original onReview\n await originalOnReview(_item);\n }),\n tab.onEnclaveDenied || (async (item) => {\n // Default: call onCancel or onDelete if available\n if (tab.actions?.onCancel) await tab.actions.onCancel(item);\n else if (tab.actions?.onDelete) await tab.actions.onDelete(item);\n }),\n originalOnReview\n ),\n },\n };\n }\n return tab;\n });\n\n // Show localStorage warning if using localStorage API\n const helpText = isPolicyLocalStorage ? (\n <>\n <LocalStorageWarning />\n {helpTextProp}\n </>\n ) : (\n helpTextProp\n );\n\n return (\n <ApprovalsPageBase\n tabs={tabsProp || defaultTabs}\n additionalTabs={processedAdditionalTabs}\n helpText={helpText}\n currentUserId={currentUsername}\n {...props}\n />\n );\n}\n"],"mappings":"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","names":["Skeleton","delay","_a","_a","_cleanup","_setup","delay","_a","_a","queryFnContext","context","_a","_client","queryFnContext","_a","_client","_retryer","getDefaultState","dispatch_fn","_a","_a","_client","_currentResult","notify_fn","getDefaultState","_a","_a","_mutationCache","_defaultOptions","React","React","import_jsx_runtime","React","React","React","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","fromTheme","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","isArbitraryValue","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","isLength","isArbitraryLength","getNumberWithAutoAndArbitrary","isNumber","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","cacheSize","separator","theme","isAny","isTshirtSize","isPercent","classGroups","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","isInteger","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","isArbitraryNumber","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","isArbitraryPosition","repeat","isArbitrarySize","isArbitraryImage","from","via","to","rounded","border","divide","outline","ring","shadow","isArbitraryShadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","conflictingClassGroups","conflictingClassGroupModifiers","twMerge","createTailwindMerge","getDefaultConfig","import_react","import_react","import_jsx_runtime","import_jsx_runtime","Icon","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","Skeleton","import_react","import_jsx_runtime","Button","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","import_react","import_jsx_runtime","Tabs","TabsList","TabsTrigger","TabsContent","Badge","React","import_jsx_runtime","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","import_jsx_runtime","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogAction","AlertDialogCancel","import_react","import_jsx_runtime","Button","import_react","import_react","import_jsx_runtime","React","Skeleton","import_jsx_runtime","Card","CardContent","Button","import_react","import_jsx_runtime","Card","CardContent","Button","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","import_react","import_jsx_runtime","React","Card","CardContent","Button","Badge","Input","Textarea","Label","Switch","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","CodeEditor","import_react","import_jsx_runtime","Card","CardContent","Button","Badge","Input","Label","Switch","ScrollArea","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Alert","AlertDescription","r","import_react","import_jsx_runtime","Card","CardContent","Button","Badge","Skeleton","Input","Label","Textarea","Checkbox","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","React","activeAdminCount","r","import_react","import_jsx_runtime","DefaultAdminAPI","r","templates","import_js","import_jsx_runtime","DefaultAdminAPI","import_jsx_runtime","LocalStorageWarning","import_js","import_jsx_runtime","LocalStorageWarning","DefaultAdminAPI","import_js","import_jsx_runtime","r","LocalStorageWarning","DefaultAdminAPI"]}