tempest-react-sdk 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -61
- package/dist/sw.cjs +1 -1
- package/dist/sw.cjs.map +1 -1
- package/dist/sw.d.ts +26 -0
- package/dist/sw.js +90 -74
- package/dist/sw.js.map +1 -1
- package/dist/tempest-react-sdk.cjs +3 -3
- package/dist/tempest-react-sdk.cjs.map +1 -1
- package/dist/tempest-react-sdk.d.ts +489 -0
- package/dist/tempest-react-sdk.js +3404 -3153
- package/dist/tempest-react-sdk.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempest-react-sdk.js","sources":["../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.tsx","../src/components/AppBar/AppBar.tsx","../src/hooks/use-breakpoint.ts","../src/components/AppShell/AppShell.tsx","../src/components/AspectRatio/AspectRatio.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.tsx","../src/components/BottomNavigation/BottomNavigation.tsx","../src/components/BottomSheet/BottomSheet.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Center/Center.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/ChipInput/ChipInput.tsx","../src/components/Combobox/Combobox.tsx","../src/components/Modal/Modal.tsx","../src/components/ConfirmDialog/ConfirmDialog.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/Dropzone/Dropzone.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorState/ErrorState.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Form/Form.tsx","../src/components/Layout/Layout.tsx","../src/hooks/use-before-install-prompt.ts","../src/components/InstallBanner/InstallBanner.tsx","../src/components/InstallButton/InstallButton.tsx","../src/components/Kbd/Kbd.tsx","../src/components/ModalsManager/ModalsManager.tsx","../src/components/Navbar/Navbar.tsx","../src/components/NProgress/NProgress.tsx","../src/components/Page/Page.tsx","../src/components/Pagination/Pagination.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/PinInput/PinInput.tsx","../src/components/Popover/Popover.tsx","../src/components/Progress/Progress.tsx","../src/components/Radio/Radio.tsx","../src/components/RangeSlider/RangeSlider.tsx","../src/components/RatingStars/RatingStars.tsx","../src/components/Responsive/Responsive.tsx","../src/components/SafeArea/SafeArea.tsx","../src/components/SearchBar/SearchBar.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Spacer/Spacer.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Stat/Stat.tsx","../src/components/Stepper/Stepper.tsx","../src/utils/numbers.ts","../src/components/StepperInput/StepperInput.tsx","../src/components/Switch/Switch.tsx","../src/components/Tag/Tag.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Timeline/Timeline.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Toast/ToastProvider.tsx","../src/components/VirtualList/VirtualList.tsx","../src/components/CopyButton/CopyButton.tsx","../src/utils/relative-time.ts","../src/components/RelativeTime/RelativeTime.tsx","../src/components/Money/Money.tsx","../src/components/TruncateText/TruncateText.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Portal/Portal.tsx","../src/components/ClickOutside/ClickOutside.tsx","../src/components/ConditionalWrapper/ConditionalWrapper.tsx","../src/components/For/For.tsx","../src/components/ErrorText/ErrorText.tsx","../src/components/Image/Image.tsx","../src/components/DataList/DataList.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Toggle/Toggle.tsx","../src/components/ToggleGroup/ToggleGroup.tsx","../src/components/Label/Label.tsx","../src/components/Collapsible/Collapsible.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/HoverCard/HoverCard.tsx","../src/hooks/use-focus-trap.ts","../src/components/Command/Command.tsx","../src/components/ScrollArea/ScrollArea.tsx","../src/components/Resizable/Resizable.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Slider/Slider.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/components/Menubar/Menubar.tsx","../src/components/Carousel/Carousel.tsx","../src/hooks/use-pagination.ts","../src/hooks/use-client-filter.ts","../src/hooks/use-media-query.ts","../src/hooks/use-event-listener.ts","../src/hooks/use-local-storage.ts","../src/hooks/use-toggle.ts","../src/hooks/use-async.ts","../src/hooks/use-online.ts","../src/hooks/use-document-visibility.ts","../src/hooks/use-intersection-observer.ts","../src/hooks/use-resize-observer.ts","../src/hooks/use-clipboard.ts","../src/hooks/use-keyboard-shortcut.ts","../src/hooks/use-idle.ts","../src/hooks/use-geolocation.ts","../src/hooks/use-scroll-lock.ts","../src/hooks/use-stable-callback.ts","../src/hooks/use-deep-memo.ts","../src/hooks/use-previous.ts","../src/hooks/use-interval.ts","../src/hooks/use-timeout.ts","../src/hooks/use-throttle.ts","../src/hooks/use-window-size.ts","../src/hooks/use-hover.ts","../src/hooks/use-long-press.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-list-state.ts","../src/hooks/use-counter.ts","../src/hooks/use-document-title.ts","../src/hooks/use-favicon.ts","../src/hooks/use-map.ts","../src/hooks/use-set.ts","../src/hooks/use-queue.ts","../src/hooks/use-click-outside.ts","../src/hooks/use-is-first-render.ts","../src/hooks/use-object-url.ts","../src/components/DataTable/DataTable.tsx","../src/components/ListTile/ListTile.tsx","../src/components/FloatingActionButton/FloatingActionButton.tsx","../src/components/NavigationRail/NavigationRail.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/RefreshIndicator/RefreshIndicator.tsx","../src/utils/format.ts","../src/utils/storage.ts","../src/utils/strings.ts","../src/utils/arrays.ts","../src/utils/objects.ts","../src/utils/guards.ts","../src/utils/functions.ts","../src/utils/promises.ts","../src/utils/ids.ts","../src/http/errors.ts","../src/http/api-client.ts","../src/http/parse-response.ts","../src/http/upload-with-progress.ts","../src/http/retry.ts","../src/http/idempotency.ts","../src/http/use-poll.ts","../src/auth/create-auth-store.ts","../src/auth/AuthGuard.tsx","../src/auth/jwt.ts","../src/auth/lazy-with-retry.ts","../src/auth/refresh-queue.ts","../src/auth/create-tempest-auth.ts","../src/access/access-control-context.tsx","../src/access/use-can.ts","../src/access/Can.tsx","../src/access/create-role-access-control.ts","../src/access/permissions-from-token.ts","../src/oauth/GoogleSignIn.tsx","../src/oauth/use-oauth-callback.ts","../src/query/constants.ts","../src/query/create-query-keys.ts","../src/query/QueryProvider.tsx","../src/query/pagination.ts","../src/query/use-paginated-query.ts","../src/query/use-cursor-query.ts","../src/data/create-data-provider.ts","../src/data/data-provider-context.tsx","../src/data/use-resource.ts","../src/router/RouteGuard.tsx","../src/router/AppRouter.tsx","../src/store/create-store.ts","../src/store/create-selectors.ts","../src/theme/ThemeProvider.tsx","../src/i18n/create-i18n.ts","../src/i18n/I18nProvider.tsx","../src/error-boundary/ErrorBoundary.tsx","../src/app/AppProviders.tsx","../src/sse/create-event-stream.ts","../src/sse/use-event-stream.ts","../src/push/utils.ts","../src/push/web-push-client.ts","../src/push/use-push-subscription.ts","../src/audio/audio-player.ts","../src/audio/use-audio.ts","../src/offline/create-offline-store.ts","../src/error-boundary/use-error-handler.ts","../src/forms/FormField.tsx","../src/forms/validate-form.ts","../src/forms/zod-resolver.ts","../src/forms/use-zod-form.ts","../src/forms/br-validators.ts","../src/forms/masked-inputs.tsx","../src/forms/use-viacep.ts","../src/ws/create-web-socket.ts","../src/ws/use-web-socket.ts","../src/geo/estimate.ts","../src/geo/bounds.ts","../src/geo/routing.ts","../src/geo/create-position-tracker.ts","../src/geo/use-position-tracker.ts","../src/geo/TrajectoryMap.tsx","../src/theme/initial-theme.ts","../src/logger/logger.ts","../src/telemetry/TelemetryProvider.tsx","../src/telemetry/console-adapter.ts","../src/telemetry/sentry-adapter.ts","../src/telemetry/posthog-adapter.ts","../src/feature-flags/FeatureFlagsProvider.tsx","../src/feature-flags/in-memory-adapter.ts","../src/feature-flags/growthbook-adapter.ts","../src/feature-flags/launchdarkly-adapter.ts","../src/share/share.ts"],"sourcesContent":["import { useCallback, useId, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Accordion.module.css\";\n\nexport interface AccordionItem {\n /** Stable identifier. */\n id: string;\n title: ReactNode;\n children: ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** When `true` multiple items can be open simultaneously. Default `false`. */\n multiple?: boolean;\n /** Controlled open ids. */\n value?: string[];\n /** Uncontrolled default open ids. */\n defaultValue?: string[];\n onChange?: (openIds: string[]) => void;\n className?: string;\n}\n\n/**\n * Accessible accordion. Each item collapses/expands its content. Single-mode by\n * default — pass `multiple` to allow more than one item open at a time. Can be\n * controlled via `value` + `onChange`, or uncontrolled via `defaultValue`.\n */\nexport function Accordion({\n items,\n multiple = false,\n value,\n defaultValue = [],\n onChange,\n className,\n}: AccordionProps) {\n const reactId = useId();\n const isControlled = value !== undefined;\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultValue);\n const openIds = isControlled ? value : internalOpen;\n\n const toggle = useCallback(\n (id: string): void => {\n const isOpen = openIds.includes(id);\n const next = multiple\n ? isOpen\n ? openIds.filter((x) => x !== id)\n : [...openIds, id]\n : isOpen\n ? []\n : [id];\n if (!isControlled) setInternalOpen(next);\n onChange?.(next);\n },\n [openIds, multiple, isControlled, onChange],\n );\n\n return (\n <div className={cn(styles.accordion, className)}>\n {items.map((item) => {\n const open = openIds.includes(item.id);\n const panelId = `${reactId}-${item.id}-panel`;\n const triggerId = `${reactId}-${item.id}-trigger`;\n return (\n <div key={item.id} className={cn(styles.item, open && styles.open)}>\n <h3 className={styles.header}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={open}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n >\n <span>{item.title}</span>\n <ChevronIcon className={styles.chevron} />\n </button>\n </h3>\n {open && (\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={styles.panel}\n >\n {item.children}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Alert.module.css\";\n\nexport type AlertVariant = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\nexport type AlertAppearance = \"soft\" | \"solid\" | \"outline\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n variant?: AlertVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: AlertAppearance;\n title?: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Show a close button and invoke this when clicked. */\n onClose?: () => void;\n /** Custom close button label for screen readers. */\n closeLabel?: string;\n}\n\n/**\n * Inline alert / notice with tone (info/success/warning/danger) and appearance\n * (soft/solid/outline). Accepts optional `icon`, `title`, `description` and\n * a dismiss button via `onClose`.\n */\nexport function Alert({\n variant = \"info\",\n appearance = \"soft\",\n title,\n description,\n icon,\n onClose,\n closeLabel = \"Dismiss\",\n className,\n children,\n ...props\n}: AlertProps) {\n return (\n <div\n role=\"alert\"\n className={cn(\n styles.alert,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n className,\n )}\n {...props}\n >\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.content}>\n {title && <p className={styles.title}>{title}</p>}\n {description && <p className={styles.description}>{description}</p>}\n {children}\n </div>\n {onClose && (\n <button\n type=\"button\"\n className={styles.close}\n onClick={onClose}\n aria-label={closeLabel}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <path\n d=\"M6 6l12 12M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./AppBar.module.css\";\n\nexport type AppBarTone = \"surface\" | \"primary\" | \"transparent\";\n\nexport interface AppBarProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title — string or any node. Rendered as the bar's `<h1>`. */\n title?: ReactNode;\n /**\n * Replace the whole left slot. When set, the auto back button and `brand`\n * are ignored — you own the leading content.\n */\n leading?: ReactNode;\n /** Show a back button in the left slot. Ignored when `leading` is set. */\n showBack?: boolean;\n /**\n * Back-button handler. Defaults to `window.history.back()`. With a router,\n * pass `onBack={() => navigate(-1)}`.\n */\n onBack?: () => void;\n /** Accessible label for the back button. Default `\"Go back\"`. */\n backLabel?: string;\n /** Custom back icon. Default a left arrow. */\n backIcon?: ReactNode;\n /** Brand / logo node shown in the left slot (after the back button). */\n brand?: ReactNode;\n /** Right slot — action buttons / menu. One node or many. */\n actions?: ReactNode;\n /** Center the title (three-column grid). Default `false` (left-aligned). */\n centered?: boolean;\n /** Stick to the top of the scroll container. Default `true`. */\n sticky?: boolean;\n /** Visual tone. Default `\"surface\"`. */\n tone?: AppBarTone;\n /** Thin bottom border. Default `true`. */\n bordered?: boolean;\n /** Add `env(safe-area-inset-top)` padding (iOS notch / PWA). Default `true`. */\n safeArea?: boolean;\n}\n\n/**\n * Mobile-first top app bar for PWAs — leading (back / brand) + title +\n * trailing actions, sticky with safe-area padding out of the box.\n *\n * Consumers customise via tokens (`--tempest-*`) and slots; the SDK ships the\n * layout, sticky/safe-area behaviour, and accessible back button so apps don't\n * hand-roll one per screen. For a desktop three-slot nav use [[Navbar]].\n *\n * @example\n * // Detail screen with back + a trailing action\n * <AppBar\n * title=\"Profile\"\n * showBack\n * onBack={() => navigate(-1)}\n * actions={<IconButton icon={<Settings />} onClick={openSettings} />}\n * />\n *\n * @example\n * // Home screen — brand left, centered title disabled\n * <AppBar brand={<Logo />} actions={<UserMenu />} />\n */\nexport function AppBar({\n title,\n leading,\n showBack = false,\n onBack,\n backLabel = \"Go back\",\n backIcon,\n brand,\n actions,\n centered = false,\n sticky = true,\n tone = \"surface\",\n bordered = true,\n safeArea = true,\n className,\n ...props\n}: AppBarProps) {\n const handleBack = onBack ?? (() => window.history.back());\n\n const leadingContent = leading ?? (\n <>\n {showBack && (\n <button\n type=\"button\"\n className={styles.iconBtn}\n onClick={handleBack}\n aria-label={backLabel}\n >\n {backIcon ?? <ArrowLeft size={22} aria-hidden=\"true\" />}\n </button>\n )}\n {brand && <span className={styles.brand}>{brand}</span>}\n </>\n );\n\n return (\n <header\n className={cn(\n styles.bar,\n styles[tone],\n centered && styles.centered,\n sticky && styles.sticky,\n bordered && styles.bordered,\n safeArea && styles.safeArea,\n className,\n )}\n {...props}\n >\n <div className={styles.leading}>{leadingContent}</div>\n {title != null && title !== \"\" && (\n <h1 className={styles.title} aria-live=\"polite\">\n {title}\n </h1>\n )}\n <div className={styles.actions}>{actions}</div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./AppShell.module.css\";\n\nexport interface AppShellProps extends HTMLAttributes<HTMLDivElement> {\n /** Top navigation bar (Navbar / custom). Renders on every breakpoint. */\n navbar?: ReactNode;\n /** Side navigation (Sidebar). Hidden below `md` — pair with `<Drawer>` for mobile. */\n sidebar?: ReactNode;\n /** Mobile-only bottom navigation (BottomNavigation). Hidden at `md+`. */\n bottomNav?: ReactNode;\n /** Footer rendered after the main content. */\n footer?: ReactNode;\n /** Breakpoint at which the sidebar appears. Default `\"md\"`. */\n sidebarBreakpoint?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n children?: ReactNode;\n}\n\n/**\n * Full app layout — composes [[Navbar]] + [[Sidebar]] + content +\n * [[BottomNavigation]] + footer with responsive behaviour:\n *\n * - **Desktop (`>= sidebarBreakpoint`)**: navbar + sidebar + main + footer.\n * - **Mobile (`< sidebarBreakpoint`)**: navbar + main + bottom nav + footer\n * (sidebar hidden — app should expose it via `<Drawer>` from a hamburger).\n *\n * @example\n * <AppShell\n * navbar={<Navbar logo={<Brand />} actions={<UserMenu />} />}\n * sidebar={<Sidebar items={...} value={tab} onChange={setTab} />}\n * bottomNav={<BottomNavigation items={...} value={tab} onChange={setTab} />}\n * footer={<Footer />}\n * >\n * <Page title=\"Dashboard\">{content}</Page>\n * </AppShell>\n */\nexport function AppShell({\n navbar,\n sidebar,\n bottomNav,\n footer,\n sidebarBreakpoint = \"md\",\n className,\n children,\n ...props\n}: AppShellProps) {\n const bp = useBreakpoint();\n const showSidebar = bp.above(sidebarBreakpoint);\n return (\n <div className={cn(styles.shell, className)} {...props}>\n {navbar && <div className={styles.navbar}>{navbar}</div>}\n <div className={styles.row}>\n {sidebar && showSidebar && <div className={styles.sidebar}>{sidebar}</div>}\n <main className={styles.main}>{children}</main>\n </div>\n {footer && <div className={styles.footer}>{footer}</div>}\n {bottomNav && !showSidebar && <div className={styles.bottomNav}>{bottomNav}</div>}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./AspectRatio.module.css\";\n\nexport interface AspectRatioProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Width-to-height ratio. Pass `16/9` for widescreen, `1` for square,\n * `4/3` for SD video, `3/4` for portrait, etc. Default `16/9`.\n */\n ratio?: number;\n children?: ReactNode;\n}\n\n/**\n * Preserve a constant aspect ratio for media (images, video, embeds). The\n * inner child stretches to fill the box. Uses the native `aspect-ratio`\n * CSS property — works on all modern browsers (Safari 15+, Chrome 88+).\n *\n * @example\n * <AspectRatio ratio={16 / 9}>\n * <img src=\"/cover.jpg\" alt=\"\" style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }} />\n * </AspectRatio>\n */\nexport function AspectRatio({\n ratio = 16 / 9,\n className,\n style,\n children,\n ...props\n}: AspectRatioProps) {\n const finalStyle: CSSProperties = { aspectRatio: String(ratio), ...style };\n return (\n <div className={cn(styles.aspect, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Avatar.module.css\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\";\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n status?: AvatarStatus;\n className?: string;\n onClick?: () => void;\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0]!.slice(0, 2);\n return `${parts[0]!.charAt(0)}${parts[parts.length - 1]!.charAt(0)}`;\n}\n\n/**\n * Round avatar. Falls back to colored initials when the image fails to load\n * or no `src` is provided. Optional status dot in the bottom-right corner.\n */\nexport function Avatar({\n src,\n alt,\n name = \"\",\n size = \"md\",\n status,\n className,\n onClick,\n}: AvatarProps) {\n const [errored, setErrored] = useState<boolean>(false);\n const initials = useMemo(() => getInitials(name), [name]);\n\n const showImage = src && !errored;\n const role = onClick ? \"button\" : undefined;\n const tabIndex = onClick ? 0 : undefined;\n\n return (\n <span\n className={cn(styles.avatar, styles[size], status && styles.status, className)}\n role={role}\n tabIndex={tabIndex}\n onClick={onClick}\n onKeyDown={\n onClick\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n {showImage ? (\n <img\n src={src}\n alt={alt ?? name}\n className={styles.image}\n onError={() => setErrored(true)}\n />\n ) : (\n <span aria-label={alt ?? name}>{initials}</span>\n )}\n {status && <span className={cn(styles.dot, styles[status])} aria-hidden />}\n </span>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n","import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n","import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n","import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"ghost\"\n | \"soft\"\n | \"outline\"\n | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Card.module.css\";\n\nexport type CardElevation = \"flat\" | \"default\" | \"raised\" | \"elevated\";\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n actions?: ReactNode;\n footer?: ReactNode;\n flush?: boolean;\n /** Hoverable card — adds elevation lift, cursor pointer and focus ring. */\n interactive?: boolean;\n /** Visual elevation level. Defaults to `default` (subtle shadow + border). */\n elevation?: CardElevation;\n}\n\n/**\n * Card container with optional header (title + actions) and footer slot.\n * Use `flush` when you need to host content (tables, lists) without inner padding.\n * Use `interactive` for clickable cards — adds hover lift and focus ring.\n */\nexport function Card({\n title,\n actions,\n footer,\n flush = false,\n interactive = false,\n elevation = \"default\",\n className,\n children,\n ...props\n}: CardProps) {\n const hasHeader = !!(title || actions);\n return (\n <div\n className={cn(\n styles.card,\n elevation === \"flat\" && styles.flat,\n elevation === \"raised\" && styles.raised,\n elevation === \"elevated\" && styles.elevated,\n interactive && styles.interactive,\n !hasHeader && !flush && styles.padded,\n flush && styles.flush,\n className,\n )}\n tabIndex={interactive ? (props.tabIndex ?? 0) : props.tabIndex}\n {...props}\n >\n {hasHeader && (\n <header className={styles.header}>\n {typeof title === \"string\" ? <h3 className={styles.title}>{title}</h3> : title}\n {actions}\n </header>\n )}\n {hasHeader ? <div className={styles.body}>{children}</div> : children}\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Center.module.css\";\n\nexport type CenterAxis = \"both\" | \"horizontal\" | \"vertical\";\n\nexport interface CenterProps extends HTMLAttributes<HTMLDivElement> {\n /** Which axis to center on. Default `\"both\"`. */\n axis?: CenterAxis;\n /** Fixed height for the container. Numbers map to `${n}px`; strings pass through. Useful when centering inside an unsized parent. */\n minHeight?: number | string;\n /** When `true` (default), takes up `100%` width of the parent. */\n fullWidth?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Center children horizontally, vertically, or both. Flex-based; works with\n * any child size. Pair with `minHeight` (or set parent height) when\n * centering vertically.\n *\n * @example\n * <Center axis=\"both\" minHeight=\"100vh\">\n * <Spinner />\n * </Center>\n */\nexport function Center({\n axis = \"both\",\n minHeight,\n fullWidth = true,\n className,\n style,\n children,\n ...props\n}: CenterProps) {\n const finalStyle: CSSProperties = {\n ...(minHeight !== undefined\n ? { minHeight: typeof minHeight === \"number\" ? `${minHeight}px` : minHeight }\n : null),\n ...(fullWidth ? { width: \"100%\" } : null),\n ...style,\n };\n return (\n <div className={cn(styles.center, styles[axis], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import { forwardRef, useEffect, useRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n description?: ReactNode;\n /** Render the box in the indeterminate state regardless of `checked`. */\n indeterminate?: boolean;\n wrapperClassName?: string;\n}\n\n/**\n * Accessible checkbox. Supports a tri-state via `indeterminate` and pairs the\n * input with a label/description column for forms.\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { label, description, indeterminate, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n const innerRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = Boolean(indeterminate);\n }, [indeterminate]);\n\n function setRef(node: HTMLInputElement | null): void {\n innerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={setRef}\n type=\"checkbox\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.box} aria-hidden>\n {indeterminate ? <DashIcon /> : <CheckIcon />}\n </span>\n {(label || description) && (\n <span className={styles.labelWrap}>\n {label && <span className={styles.label}>{label}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </span>\n )}\n </label>\n );\n});\n\nfunction CheckIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 12l5 5L20 7\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DashIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ChipInput.module.css\";\n\nexport interface ChipInputProps {\n value: string[];\n onChange: (next: string[]) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n /** Keys that commit the current draft as a chip. Default: Enter, comma, Tab. */\n commitKeys?: string[];\n /** Lowercase + trim each chip + dedupe. Default: true. */\n normalize?: boolean;\n className?: string;\n}\n\n/**\n * Multi-value input. Type a value and press Enter (or comma / Tab) to push a\n * chip. Backspace on empty input removes the last chip.\n */\nexport function ChipInput({\n value,\n onChange,\n label,\n placeholder = \"Adicionar e pressionar Enter…\",\n helperText,\n error,\n commitKeys = [\"Enter\", \",\", \"Tab\"],\n normalize = true,\n className,\n}: ChipInputProps) {\n const [draft, setDraft] = useState<string>(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n function commit(): void {\n const next = normalize ? draft.trim().toLowerCase() : draft.trim();\n if (!next) return;\n if (value.includes(next)) {\n setDraft(\"\");\n return;\n }\n onChange([...value, next]);\n setDraft(\"\");\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>): void {\n if (commitKeys.includes(event.key)) {\n event.preventDefault();\n commit();\n return;\n }\n if (event.key === \"Backspace\" && !draft && value.length > 0) {\n onChange(value.slice(0, -1));\n }\n }\n\n function remove(index: number): void {\n const next = value.slice();\n next.splice(index, 1);\n onChange(next);\n }\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={styles.field} onClick={() => inputRef.current?.focus()}>\n {value.map((chip, index) => (\n <span key={`${chip}-${index}`} className={styles.chip}>\n {chip}\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={`Remover ${chip}`}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n className={styles.input}\n value={draft}\n placeholder={value.length === 0 ? placeholder : \"\"}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commit}\n />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Combobox.module.css\";\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n disabled?: boolean;\n /** Custom filter — return true to keep the option. Default is case-insensitive substring match on label. */\n filter?: (option: ComboboxOption, query: string) => boolean;\n /** Message shown when no option matches. */\n emptyMessage?: string;\n className?: string;\n}\n\nfunction defaultFilter(option: ComboboxOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * Combobox — text input with a filterable dropdown of options.\n *\n * Selecting an option fires `onChange(value)`. Typing filters the list.\n * Keyboard: ArrowUp/ArrowDown to navigate, Enter to select, Esc to close.\n */\nexport function Combobox({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione\",\n helperText,\n error,\n disabled,\n filter = defaultFilter,\n emptyMessage = \"Nenhuma opção encontrada\",\n className,\n}: ComboboxProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const selectedLabel = useMemo(\n () => options.find((o) => o.value === value)?.label ?? \"\",\n [options, value],\n );\n\n const filtered = useMemo(\n () => options.filter((o) => filter(o, query)),\n [options, filter, query],\n );\n\n const closeAndReset = useCallback((): void => {\n setOpen(false);\n setQuery(\"\");\n setActiveIndex(0);\n }, []);\n\n const handleSelect = useCallback(\n (option: ComboboxOption): void => {\n if (option.disabled) return;\n onChange(option.value);\n closeAndReset();\n },\n [onChange, closeAndReset],\n );\n\n useEffect(() => {\n if (!open) return;\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n closeAndReset();\n }\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => window.removeEventListener(\"mousedown\", onDown);\n }, [open, closeAndReset]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => Math.min(filtered.length - 1, current + 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((current) => Math.max(0, current - 1));\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const option = filtered[activeIndex];\n if (option) handleSelect(option);\n } else if (event.key === \"Escape\") {\n closeAndReset();\n }\n };\n\n return (\n <div ref={rootRef} className={cn(styles.wrapper, error && styles.error, className)}>\n {label && (\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n id={id}\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={`${id}-listbox`}\n aria-autocomplete=\"list\"\n className={styles.input}\n placeholder={placeholder}\n disabled={disabled}\n value={open ? query : selectedLabel}\n onFocus={() => setOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n <span className={styles.caret} aria-hidden>\n ▾\n </span>\n </div>\n {open && (\n <ul id={`${id}-listbox`} role=\"listbox\" className={styles.menu}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n filtered.map((option, index) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={option.value === value}\n className={cn(\n styles.option,\n index === activeIndex && styles.active,\n option.value === value && styles.selected,\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelect(option);\n }}\n >\n {option.label}\n </li>\n ))\n )}\n </ul>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Modal.module.css\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n size?: ModalSize;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n hideCloseButton?: boolean;\n /** Force fullscreen at all breakpoints. */\n fullscreen?: boolean;\n /** Auto-fullscreen on mobile viewports (< 640px). Default `false`. */\n fullscreenOnMobile?: boolean;\n}\n\n/**\n * Portal-rendered modal dialog with backdrop, Esc handler, and slots for\n * header/body/footer. Locks body scroll while open.\n */\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n size = \"md\",\n closeOnBackdrop = true,\n closeOnEsc = true,\n className,\n hideCloseButton = false,\n fullscreen = false,\n fullscreenOnMobile = false,\n}: ModalProps) {\n useEffect(() => {\n if (!open) return;\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const handleKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handleKey);\n\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className={styles.overlay}\n role=\"presentation\"\n onClick={() => {\n if (closeOnBackdrop) onClose();\n }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(\n styles.dialog,\n sizeClassName(size),\n fullscreen && styles.fullscreen,\n fullscreenOnMobile && styles.fullscreenOnMobile,\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {(title || !hideCloseButton) && (\n <header className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {!hideCloseButton && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n )}\n </header>\n )}\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction sizeClassName(size: ModalSize): string | undefined {\n if (size === \"2xl\") return styles.size2xl;\n if (size === \"3xl\") return styles.size3xl;\n return styles[size];\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { Input } from \"@/components/Input\";\n\nexport interface DatePickerProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"size\"\n> {\n /** ISO date string (`YYYY-MM-DD`) or empty. */\n value: string;\n onChange: (value: string) => void;\n label?: string;\n helperText?: string;\n error?: string;\n /** Lower bound (`YYYY-MM-DD`). */\n min?: string;\n /** Upper bound (`YYYY-MM-DD`). */\n max?: string;\n /** Mode. `date` (default), `datetime-local`, `time`, or `month`. */\n mode?: \"date\" | \"datetime-local\" | \"time\" | \"month\";\n wrapperClassName?: string;\n}\n\n/**\n * Thin wrapper around the native `<input type=\"date\">` (or `datetime-local`,\n * `time`, `month`). For richer pickers, pair with `react-datepicker` directly\n * — this primitive keeps the SDK dep-free.\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(function DatePicker(\n { value, onChange, mode = \"date\", ...props },\n ref,\n) {\n return (\n <Input\n {...props}\n ref={ref}\n type={mode}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Divider.module.css\";\n\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerVariant = \"solid\" | \"dashed\";\nexport type DividerAlign = \"start\" | \"center\" | \"end\";\n\nexport interface DividerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n orientation?: DividerOrientation;\n variant?: DividerVariant;\n /** Optional label rendered inside the divider (horizontal only). */\n label?: ReactNode;\n /** Label horizontal position (only when `label` provided). Defaults to `center`. */\n align?: DividerAlign;\n}\n\n/**\n * Horizontal or vertical visual separator. When `label` is provided in\n * horizontal mode the divider splits and centers the label between two lines.\n */\nexport function Divider({\n orientation = \"horizontal\",\n variant = \"solid\",\n label,\n align = \"center\",\n className,\n ...props\n}: DividerProps) {\n if (orientation === \"vertical\") {\n return (\n <span\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n styles.divider,\n styles.vertical,\n variant === \"dashed\" && styles.dashed,\n className,\n )}\n {...props}\n />\n );\n }\n\n if (!label) {\n return (\n <hr\n className={cn(\n styles.divider,\n styles.horizontal,\n styles.bare,\n variant === \"dashed\" && styles.dashed,\n className,\n )}\n />\n );\n }\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className={cn(\n styles.divider,\n styles.horizontal,\n variant === \"dashed\" && styles.dashed,\n align === \"start\" && styles.alignStart,\n align === \"end\" && styles.alignEnd,\n className,\n )}\n {...props}\n >\n {label}\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Drawer.module.css\";\n\nexport type DrawerPlacement = \"right\" | \"left\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n placement?: DrawerPlacement;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n hideCloseButton?: boolean;\n className?: string;\n /**\n * Auto-switch to bottom-sheet placement on mobile viewports (< md).\n * Modern mobile apps default to bottom drawers; on desktop the original\n * `placement` is preserved.\n */\n mobilePlacement?: DrawerPlacement;\n /** Render a drag handle indicator at the leading edge (bottom-sheet style). */\n showHandle?: boolean;\n}\n\n/**\n * Sliding side panel. Same building blocks as {@link Modal} but anchored to\n * an edge. Locks body scroll while open.\n */\nexport function Drawer({\n open,\n onClose,\n placement = \"right\",\n title,\n children,\n footer,\n closeOnBackdrop = true,\n closeOnEsc = true,\n hideCloseButton = false,\n className,\n mobilePlacement,\n showHandle = false,\n}: DrawerProps) {\n const { isMobile } = useBreakpoint();\n const effectivePlacement: DrawerPlacement =\n isMobile && mobilePlacement ? mobilePlacement : placement;\n\n useEffect(() => {\n if (!open) return;\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const handleKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <>\n <div\n className={styles.overlay}\n onClick={() => {\n if (closeOnBackdrop) onClose();\n }}\n />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(styles.panel, styles[effectivePlacement], className)}\n >\n {showHandle &&\n (effectivePlacement === \"bottom\" || effectivePlacement === \"top\") && (\n <div\n className={cn(\n styles.handle,\n effectivePlacement === \"top\" && styles.handleTop,\n )}\n aria-hidden\n />\n )}\n {(title || !hideCloseButton) && (\n <header className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {!hideCloseButton && (\n <button\n type=\"button\"\n aria-label=\"Fechar\"\n className={styles.close}\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n )}\n </header>\n )}\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </aside>\n </>,\n document.body,\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DropdownMenu.module.css\";\n\nexport type DropdownMenuPlacement = \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n\nexport type DropdownMenuEntry =\n | {\n type: \"item\";\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n onSelect: () => void;\n }\n | { type: \"separator\"; id: string }\n | { type: \"label\"; id: string; label: ReactNode };\n\nexport interface DropdownMenuProps {\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n \"aria-haspopup\"?: boolean | \"menu\";\n }>;\n items: DropdownMenuEntry[];\n placement?: DropdownMenuPlacement;\n className?: string;\n}\n\nfunction placementClass(placement: DropdownMenuPlacement): string {\n switch (placement) {\n case \"bottom-end\":\n return styles.bottomEnd;\n case \"top-start\":\n return styles.topStart;\n case \"top-end\":\n return styles.topEnd;\n case \"bottom-start\":\n default:\n return styles.bottomStart;\n }\n}\n\n/**\n * Dropdown menu — list of selectable actions anchored to a trigger.\n *\n * - Toggle on trigger click.\n * - Close on outside click / Escape / item selection.\n * - Arrow keys navigate, Enter activates focused item.\n */\nexport function DropdownMenu({\n trigger,\n items,\n placement = \"bottom-start\",\n className,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const selectableIndexes = items\n .map((entry, index) => (entry.type === \"item\" && !entry.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const next = selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1;\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const prev =\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1;\n setActiveIndex(prev);\n itemRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [open, activeIndex, selectableIndexes, close]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen((prev) => !prev);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": open,\n \"aria-controls\": id,\n \"aria-haspopup\": \"menu\" as const,\n },\n } as ReactElement;\n\n const handleSelect = (entry: Extract<DropdownMenuEntry, { type: \"item\" }>): void => {\n entry.onSelect();\n close();\n };\n\n return (\n <span ref={rootRef} className={styles.root}>\n {triggerClone}\n {open && (\n <ul\n id={id}\n role=\"menu\"\n className={cn(styles.menu, placementClass(placement), className)}\n >\n {items.map((entry, index) => {\n if (entry.type === \"separator\") {\n return (\n <li\n key={entry.id}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n if (entry.type === \"label\") {\n return (\n <li key={entry.id} role=\"presentation\" className={styles.label}>\n {entry.label}\n </li>\n );\n }\n return (\n <li key={entry.id} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n entry.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={entry.disabled}\n onClick={() => handleSelect(entry)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {entry.icon && <span aria-hidden>{entry.icon}</span>}\n {entry.label}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </span>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Dropzone.module.css\";\n\n/** Props for {@link Dropzone}. */\nexport interface DropzoneProps {\n /** Called with the accepted files after a drop or file-dialog selection. */\n onDrop: (files: File[]) => void;\n /** `accept` attribute forwarded to the hidden file input. */\n accept?: string;\n /** Allow selecting/dropping multiple files. Default `true`. */\n multiple?: boolean;\n /** Disable interaction. */\n disabled?: boolean;\n /** Maximum file size in bytes; larger files are filtered out. */\n maxSize?: number;\n /** Called with files rejected by `maxSize`. */\n onReject?: (files: File[]) => void;\n /** Custom inner content. Falls back to a default prompt. */\n children?: ReactNode;\n /** Extra class applied to the drop area. */\n className?: string;\n}\n\n/**\n * Drag-and-drop file area with a hidden file input. Clickable and keyboard\n * focusable; filters by `maxSize` before calling `onDrop`.\n *\n * @example\n * <Dropzone accept=\"image/*\" maxSize={5 * 1024 * 1024} onDrop={setFiles}>\n * Solte imagens aqui ou clique para selecionar\n * </Dropzone>\n */\nexport function Dropzone({\n onDrop,\n accept,\n multiple = true,\n disabled = false,\n maxSize,\n onReject,\n children,\n className,\n}: DropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleFiles = (fileList: FileList | null): void => {\n if (!fileList || fileList.length === 0) return;\n const all = Array.from(fileList);\n const limited = multiple ? all : all.slice(0, 1);\n\n if (maxSize === undefined) {\n onDrop(limited);\n return;\n }\n\n const accepted: File[] = [];\n const rejected: File[] = [];\n for (const file of limited) {\n if (file.size > maxSize) rejected.push(file);\n else accepted.push(file);\n }\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length > 0) onDrop(accepted);\n };\n\n const openDialog = (): void => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n if (disabled) return;\n setIsDragging(true);\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openDialog();\n }\n };\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={cn(\n styles.zone,\n isDragging && styles.dragging,\n disabled && styles.disabled,\n className,\n )}\n onClick={openDialog}\n onKeyDown={handleKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className={styles.input}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n {children ?? (\n <span className={styles.prompt}>\n Arraste arquivos aqui ou clique para selecionar\n </span>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./EmptyState.module.css\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\n/** Centered \"nothing here yet\" placeholder with optional icon and CTA. */\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={cn(styles.wrapper, className)}>\n {icon && <div className={styles.icon}>{icon}</div>}\n <h4 className={styles.title}>{title}</h4>\n {description && <p className={styles.description}>{description}</p>}\n {action && <div className={styles.action}>{action}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ErrorState.module.css\";\n\nexport interface ErrorStateProps {\n title?: ReactNode;\n description?: ReactNode;\n onRetry?: () => void;\n retryLabel?: string;\n icon?: ReactNode;\n className?: string;\n}\n\n/** Error placeholder with optional retry CTA. Use when a request fails. */\nexport function ErrorState({\n title = \"Algo deu errado\",\n description = \"Não foi possível carregar essas informações.\",\n onRetry,\n retryLabel = \"Tentar novamente\",\n icon,\n className,\n}: ErrorStateProps) {\n return (\n <div className={cn(styles.wrapper, className)}>\n <div className={styles.icon}>{icon ?? <AlertIcon />}</div>\n <h4 className={styles.title}>{title}</h4>\n {description && <p className={styles.description}>{description}</p>}\n {onRetry && (\n <div className={styles.action}>\n <Button variant=\"secondary\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction AlertIcon() {\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./FileUpload.module.css\";\n\nexport interface FileUploadProps {\n /** Files currently in the dropzone (controlled). */\n value: File[];\n /** Called with the new list when the user adds or removes a file. */\n onChange: (files: File[]) => void;\n label?: string;\n /** Accept attribute forwarded to `<input>`. */\n accept?: string;\n /** Allow multiple files. Default: false. */\n multiple?: boolean;\n /** Max file size in bytes. Files above are rejected via `onReject`. */\n maxSize?: number;\n /** Called with rejected files when they exceed `maxSize` or fail the `accept` filter. */\n onReject?: (rejected: { file: File; reason: \"size\" | \"type\" }[]) => void;\n disabled?: boolean;\n /** Title shown on the empty dropzone. */\n title?: string;\n /** Helper line below the title. */\n subtitle?: string;\n className?: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const tokens = accept.split(\",\").map((t) => t.trim().toLowerCase());\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith(\".\")) return name.endsWith(token);\n if (token.endsWith(\"/*\")) return type.startsWith(token.replace(\"/*\", \"/\"));\n return type === token;\n });\n}\n\n/**\n * Drag-and-drop file dropzone. Pair with `uploadWithProgress` from the SDK\n * to wire actual uploads with byte-level progress.\n */\nexport function FileUpload({\n value,\n onChange,\n label,\n accept,\n multiple = false,\n maxSize,\n onReject,\n disabled,\n title = \"Arraste arquivos aqui ou clique para selecionar\",\n subtitle,\n className,\n}: FileUploadProps) {\n const [dragging, setDragging] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n function addFiles(incoming: FileList | File[]): void {\n const accepted: File[] = [];\n const rejected: { file: File; reason: \"size\" | \"type\" }[] = [];\n\n for (const file of Array.from(incoming)) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: \"type\" });\n continue;\n }\n if (maxSize && file.size > maxSize) {\n rejected.push({ file, reason: \"size\" });\n continue;\n }\n accepted.push(file);\n }\n\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length === 0) return;\n\n const next = multiple ? [...value, ...accepted] : accepted.slice(0, 1);\n onChange(next);\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n event.preventDefault();\n setDragging(false);\n if (disabled) return;\n if (event.dataTransfer?.files) addFiles(event.dataTransfer.files);\n }\n\n function remove(index: number): void {\n const next = value.slice();\n next.splice(index, 1);\n onChange(next);\n }\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div\n className={cn(\n styles.dropzone,\n dragging && styles.active,\n disabled && styles.disabled,\n )}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && inputRef.current?.click()}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragEnter={(event) => {\n event.preventDefault();\n if (!disabled) setDragging(true);\n }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n >\n <div className={styles.icon} aria-hidden>\n <UploadIcon />\n </div>\n <p className={styles.title}>{title}</p>\n {subtitle && <p className={styles.subtitle}>{subtitle}</p>}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className={styles.hidden}\n onChange={(event) => {\n if (event.target.files) addFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n </div>\n\n {value.length > 0 && (\n <ul className={styles.files}>\n {value.map((file, index) => (\n <li key={`${file.name}-${index}`} className={styles.file}>\n <div>\n <div>{file.name}</div>\n <div className={styles.fileMeta}>{formatSize(file.size)}</div>\n </div>\n <button\n type=\"button\"\n aria-label={`Remover ${file.name}`}\n className={styles.remove}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction UploadIcon() {\n return (\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 16V4m0 0l-4 4m4-4l4 4M4 20h16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"@/components/Button\";\nimport { useBeforeInstallPrompt } from \"@/hooks/use-before-install-prompt\";\nimport type { InstallOutcome } from \"@/components/InstallButton\";\nimport styles from \"./InstallBanner.module.css\";\n\nexport interface InstallBannerProps {\n /** Headline. Default `\"Instale o app\"`. */\n title?: ReactNode;\n /** Supporting copy under the title. */\n description?: ReactNode;\n /** Install button label. Default `\"Instalar\"`. */\n installLabel?: string;\n /** Accessible label for the dismiss button. Default `\"Dispensar\"`. */\n dismissLabel?: string;\n /** Optional leading icon. */\n icon?: ReactNode;\n /**\n * `localStorage` key used to remember dismissal across reloads. Omit to\n * make dismissal last only for the current session (component state).\n */\n storageKey?: string;\n /** Called with the user's choice after the install prompt resolves. */\n onResult?: (outcome: InstallOutcome) => void;\n className?: string;\n}\n\nfunction readDismissed(storageKey?: string): boolean {\n if (!storageKey || typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(storageKey) === \"1\";\n } catch {\n return false;\n }\n}\n\n/**\n * Dismissible bottom banner that invites the user to install the PWA. Wired to\n * {@link useBeforeInstallPrompt}: it renders only when the browser captured an\n * install prompt and the app is not already running standalone — so on\n * platforms that never fire `beforeinstallprompt` (e.g. iOS Safari) it stays\n * hidden and you can surface manual instructions elsewhere.\n *\n * @example\n * <InstallBanner\n * title=\"Instale o FAMACHApp\"\n * description=\"Acesso offline e atalho na tela inicial.\"\n * storageKey=\"famacha:install-dismissed\"\n * />\n */\nexport function InstallBanner({\n title = \"Instale o app\",\n description,\n installLabel = \"Instalar\",\n dismissLabel = \"Dispensar\",\n icon,\n storageKey,\n onResult,\n className,\n}: InstallBannerProps) {\n const { installable, installed, isStandalone, prompt } = useBeforeInstallPrompt();\n const [dismissed, setDismissed] = useState<boolean>(() => readDismissed(storageKey));\n\n if (!installable || installed || isStandalone || dismissed) return null;\n\n const dismiss = (): void => {\n setDismissed(true);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, \"1\");\n } catch {\n /* ignore quota errors */\n }\n }\n };\n\n return (\n <div className={cn(styles.banner, className)} role=\"region\" aria-label={String(title)}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n <p className={styles.title}>{title}</p>\n {description && <p className={styles.description}>{description}</p>}\n </div>\n <Button\n size=\"sm\"\n onClick={async () => {\n onResult?.(await prompt());\n }}\n >\n {installLabel}\n </Button>\n <button\n type=\"button\"\n className={styles.close}\n aria-label={dismissLabel}\n onClick={dismiss}\n >\n <X size={18} aria-hidden />\n </button>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button, type ButtonProps } from \"@/components/Button\";\nimport { useBeforeInstallPrompt } from \"@/hooks/use-before-install-prompt\";\n\nexport type InstallOutcome = \"accepted\" | \"dismissed\" | \"unsupported\";\n\nexport interface InstallButtonProps extends Omit<ButtonProps, \"onClick\" | \"children\"> {\n /** Button label. Default `\"Instalar app\"`. */\n label?: ReactNode;\n /** Called with the user's choice after the install prompt resolves. */\n onResult?: (outcome: InstallOutcome) => void;\n}\n\n/**\n * Button wired to the PWA install prompt ({@link useBeforeInstallPrompt}).\n * Renders nothing when the app can't be installed — no prompt captured yet,\n * already installed, or running standalone — so you can drop it anywhere\n * without guarding visibility yourself.\n *\n * Inherits every {@link Button} prop (`variant`, `size`, `leftIcon`, …).\n *\n * @example\n * <InstallButton variant=\"primary\" leftIcon={<Download />} />\n */\nexport function InstallButton({ label = \"Instalar app\", onResult, ...props }: InstallButtonProps) {\n const { installable, installed, isStandalone, prompt } = useBeforeInstallPrompt();\n if (!installable || installed || isStandalone) return null;\n return (\n <Button\n onClick={async () => {\n onResult?.(await prompt());\n }}\n {...props}\n >\n {label}\n </Button>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n","import { createContext, useCallback, useContext, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { ConfirmDialog } from \"@/components/ConfirmDialog\";\nimport { Modal } from \"@/components/Modal\";\nimport type { ModalSize } from \"@/components/Modal\";\nimport styles from \"./ModalsManager.module.css\";\n\n/** Options accepted by {@link ModalsApi.open}. */\nexport interface OpenModalOptions {\n /** Header title. */\n title?: ReactNode;\n /** Modal body content. */\n children: ReactNode;\n /** Dialog size. Default `md`. */\n size?: ModalSize;\n /** Allow closing by clicking the backdrop. Default `true`. */\n closeOnBackdrop?: boolean;\n /** Allow closing with the Esc key. Default `true`. */\n closeOnEsc?: boolean;\n /** Hide the header close button. */\n hideCloseButton?: boolean;\n /** Called after the modal is removed from the stack. */\n onClose?: () => void;\n}\n\n/** Options accepted by {@link ModalsApi.confirm}. */\nexport interface ConfirmModalOptions {\n /** Header title. */\n title?: ReactNode;\n /** Prompt message rendered in the dialog body. */\n message: ReactNode;\n /** Confirm button label. Default `Confirmar`. */\n confirmLabel?: string;\n /** Cancel button label. Default `Cancelar`. */\n cancelLabel?: string;\n /** Render the confirm button in the danger variant. */\n danger?: boolean;\n /** Called when the user confirms. */\n onConfirm?: () => void | Promise<void>;\n /** Called when the user cancels or dismisses. */\n onCancel?: () => void;\n}\n\n/** Imperative API returned by {@link useModals}. */\nexport interface ModalsApi {\n /** Push a content modal. Returns its stack id. */\n open: (options: OpenModalOptions) => string;\n /** Push a confirmation dialog. Returns its stack id. */\n confirm: (options: ConfirmModalOptions) => string;\n /** Remove the modal with the given id. */\n close: (id: string) => void;\n /** Remove every modal from the stack. */\n closeAll: () => void;\n}\n\ninterface ContentEntry {\n kind: \"content\";\n id: string;\n options: OpenModalOptions;\n}\n\ninterface ConfirmEntry {\n kind: \"confirm\";\n id: string;\n options: ConfirmModalOptions;\n}\n\ntype StackEntry = ContentEntry | ConfirmEntry;\n\nconst ModalsContext = createContext<ModalsApi | null>(null);\n\n/** Props for {@link ModalsProvider}. */\nexport interface ModalsProviderProps {\n children: ReactNode;\n}\n\n/**\n * Provides imperative modal control via {@link useModals} and renders the open\n * modal stack. Mount once near the app root.\n *\n * @example\n * <ModalsProvider>\n * <App />\n * </ModalsProvider>\n */\nexport function ModalsProvider({ children }: ModalsProviderProps) {\n const [stack, setStack] = useState<StackEntry[]>([]);\n const counter = useRef(0);\n\n const nextId = useCallback((): string => {\n counter.current += 1;\n return `modal-${counter.current}`;\n }, []);\n\n const close = useCallback((id: string): void => {\n setStack((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const closeAll = useCallback((): void => {\n setStack([]);\n }, []);\n\n const open = useCallback(\n (options: OpenModalOptions): string => {\n const id = nextId();\n setStack((current) => [...current, { kind: \"content\", id, options }]);\n return id;\n },\n [nextId],\n );\n\n const confirm = useCallback(\n (options: ConfirmModalOptions): string => {\n const id = nextId();\n setStack((current) => [...current, { kind: \"confirm\", id, options }]);\n return id;\n },\n [nextId],\n );\n\n const api = useMemo<ModalsApi>(\n () => ({ open, confirm, close, closeAll }),\n [open, confirm, close, closeAll],\n );\n\n return (\n <ModalsContext.Provider value={api}>\n {children}\n <div className={styles.stack}>\n {stack.map((entry) =>\n entry.kind === \"content\" ? (\n <ContentModal key={entry.id} entry={entry} close={close} />\n ) : (\n <ConfirmModal key={entry.id} entry={entry} close={close} />\n ),\n )}\n </div>\n </ModalsContext.Provider>\n );\n}\n\ninterface ContentModalProps {\n entry: ContentEntry;\n close: (id: string) => void;\n}\n\nfunction ContentModal({ entry, close }: ContentModalProps) {\n const { options, id } = entry;\n const handleClose = (): void => {\n options.onClose?.();\n close(id);\n };\n return (\n <Modal\n open\n onClose={handleClose}\n title={options.title}\n size={options.size}\n closeOnBackdrop={options.closeOnBackdrop}\n closeOnEsc={options.closeOnEsc}\n hideCloseButton={options.hideCloseButton}\n >\n {options.children}\n </Modal>\n );\n}\n\ninterface ConfirmModalProps {\n entry: ConfirmEntry;\n close: (id: string) => void;\n}\n\nfunction ConfirmModal({ entry, close }: ConfirmModalProps) {\n const { options, id } = entry;\n const [loading, setLoading] = useState(false);\n\n const handleConfirm = async (): Promise<void> => {\n try {\n setLoading(true);\n await options.onConfirm?.();\n } finally {\n setLoading(false);\n close(id);\n }\n };\n\n const handleCancel = (): void => {\n options.onCancel?.();\n close(id);\n };\n\n return (\n <ConfirmDialog\n open\n title={options.title ?? \"\"}\n description={options.message}\n confirmLabel={options.confirmLabel}\n cancelLabel={options.cancelLabel}\n variant={options.danger ? \"danger\" : \"primary\"}\n loading={loading}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n );\n}\n\n/**\n * Access the imperative modals API. Must be used within a {@link ModalsProvider}.\n *\n * @example\n * const modals = useModals();\n * modals.confirm({ message: \"Excluir item?\", danger: true, onConfirm: del });\n *\n * @throws Error when called outside a {@link ModalsProvider}.\n */\nexport function useModals(): ModalsApi {\n const api = useContext(ModalsContext);\n if (api === null) {\n throw new Error(\"useModals must be used within a <ModalsProvider>\");\n }\n return api;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Navbar.module.css\";\n\nexport type NavbarTone = \"surface\" | \"primary\" | \"transparent\";\n\nexport interface NavbarProps extends HTMLAttributes<HTMLElement> {\n /** Left slot — typically logo + brand name. */\n logo?: ReactNode;\n /** Center slot — typically nav links. */\n nav?: ReactNode;\n /** Right slot — typically user menu / actions. */\n actions?: ReactNode;\n /** Make the bar sticky at the top of the scroll container. Default `true`. */\n sticky?: boolean;\n /** Visual tone. Default `\"surface\"`. */\n tone?: NavbarTone;\n /** When set, renders a thin bottom border. Default `true`. */\n bordered?: boolean;\n}\n\n/**\n * Top app bar. Three-slot layout (logo / nav / actions) that collapses\n * gracefully on mobile (nav slot wraps below).\n *\n * @example\n * <Navbar\n * logo={<img src=\"/logo.svg\" alt=\"App\" />}\n * nav={<NavLinks />}\n * actions={<UserMenu />}\n * />\n */\nexport function Navbar({\n logo,\n nav,\n actions,\n sticky = true,\n tone = \"surface\",\n bordered = true,\n className,\n ...props\n}: NavbarProps) {\n return (\n <header\n className={cn(\n styles.navbar,\n styles[tone],\n sticky && styles.sticky,\n bordered && styles.bordered,\n className,\n )}\n {...props}\n >\n {logo && <div className={styles.logo}>{logo}</div>}\n {nav && <nav className={styles.nav}>{nav}</nav>}\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NProgress.module.css\";\n\n/** Snapshot of the progress controller state delivered to subscribers. */\nexport interface NProgressState {\n /** Current progress, `0` (empty) to `1` (complete). */\n value: number;\n /** Whether the bar should be visible. */\n active: boolean;\n}\n\n/** Listener invoked whenever the progress state changes. */\nexport type NProgressListener = (state: NProgressState) => void;\n\n/** Imperative top-loading-bar controller. */\nexport interface NProgressController {\n /** Show the bar and start trickling toward ~0.9. */\n start: () => void;\n /** Complete to `1`, then hide the bar shortly after. */\n done: () => void;\n /** Set the progress explicitly. Values are clamped to `0..1`. */\n set: (n: number) => void;\n /** Increment progress by `amount` (default a small trickle step). */\n inc: (amount?: number) => void;\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe: (listener: NProgressListener) => () => void;\n}\n\nconst TRICKLE_INTERVAL_MS = 300;\nconst TRICKLE_CEILING = 0.9;\nconst DONE_HIDE_DELAY_MS = 300;\n\nfunction clamp(n: number): number {\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n\nfunction createNProgress(): NProgressController {\n let state: NProgressState = { value: 0, active: false };\n const listeners = new Set<NProgressListener>();\n let trickleTimer: ReturnType<typeof setInterval> | null = null;\n let hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n const emit = (): void => {\n for (const listener of listeners) listener(state);\n };\n\n const update = (next: Partial<NProgressState>): void => {\n state = { ...state, ...next };\n emit();\n };\n\n const stopTrickle = (): void => {\n if (trickleTimer !== null) {\n clearInterval(trickleTimer);\n trickleTimer = null;\n }\n };\n\n const clearHide = (): void => {\n if (hideTimer !== null) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n const inc = (amount?: number): void => {\n const current = state.value;\n if (current >= TRICKLE_CEILING) return;\n const step = amount ?? (1 - current) * 0.1 + 0.01;\n update({ value: Math.min(clamp(current + step), TRICKLE_CEILING) });\n };\n\n const start = (): void => {\n clearHide();\n if (state.active) return;\n update({ active: true, value: state.value > 0 ? state.value : 0.08 });\n stopTrickle();\n trickleTimer = setInterval(() => inc(), TRICKLE_INTERVAL_MS);\n };\n\n const done = (): void => {\n stopTrickle();\n clearHide();\n update({ value: 1, active: true });\n hideTimer = setTimeout(() => {\n update({ active: false, value: 0 });\n hideTimer = null;\n }, DONE_HIDE_DELAY_MS);\n };\n\n const set = (n: number): void => {\n clearHide();\n const value = clamp(n);\n update({ value, active: value < 1 ? true : state.active });\n };\n\n const subscribe = (listener: NProgressListener): (() => void) => {\n listeners.add(listener);\n listener(state);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return { start, done, set, inc, subscribe };\n}\n\n/**\n * Module-level singleton progress controller. Drive it imperatively from\n * anywhere (router transitions, fetch interceptors) and render the visual bar\n * with {@link NProgressBar}.\n *\n * @example\n * nprogress.start();\n * await loadData();\n * nprogress.done();\n */\nexport const nprogress: NProgressController = createNProgress();\n\n/** Props for {@link NProgressBar}. */\nexport interface NProgressBarProps {\n /** Bar color. Defaults to `var(--tempest-primary)`. */\n color?: string;\n /** Bar height in pixels. Default `3`. */\n height?: number;\n /** Extra class applied to the bar element. */\n className?: string;\n}\n\n/**\n * Fixed top loading bar bound to the {@link nprogress} singleton. Mount once\n * near the app root; it renders nothing while inactive.\n *\n * @example\n * <NProgressBar />\n */\nexport function NProgressBar({ color, height = 3, className }: NProgressBarProps) {\n const [state, setState] = useState<NProgressState>({ value: 0, active: false });\n\n useEffect(() => nprogress.subscribe(setState), []);\n\n if (!state.active) return null;\n\n const style: CSSProperties = {\n width: `${Math.round(state.value * 100)}%`,\n height: `${height}px`,\n background: color ?? \"var(--tempest-primary)\",\n };\n\n return (\n <div\n className={cn(styles.bar, className)}\n style={style}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(state.value * 100)}\n />\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n const hasHeader = title || eyebrow || description || actions;\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n {hasHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && <h1 className={styles.title}>{title}</h1>}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Pagination.module.css\";\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n pageSize?: number;\n onPageSizeChange?: (size: number) => void;\n pageSizeOptions?: number[];\n /** Total items count; if provided, renders the summary text. */\n totalItems?: number;\n /** Max number of numbered page buttons to show. Default 7. */\n siblingCount?: number;\n className?: string;\n}\n\nfunction buildRange(page: number, totalPages: number, siblings: number): (number | \"...\")[] {\n const totalSlots = siblings + 4;\n if (totalPages <= totalSlots) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n const start = Math.max(2, page - Math.floor(siblings / 2));\n const end = Math.min(totalPages - 1, start + siblings - 1);\n const range: (number | \"...\")[] = [1];\n if (start > 2) range.push(\"...\");\n for (let i = start; i <= end; i++) range.push(i);\n if (end < totalPages - 1) range.push(\"...\");\n range.push(totalPages);\n return range;\n}\n\n/**\n * Numeric pagination controls. Pair with {@link usePagination} for state.\n */\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n pageSize,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n totalItems,\n siblingCount = 3,\n className,\n}: PaginationProps) {\n const pages = useMemo(\n () => buildRange(page, totalPages, siblingCount),\n [page, totalPages, siblingCount],\n );\n\n if (totalPages <= 1 && !onPageSizeChange) return null;\n\n return (\n <div className={cn(styles.wrapper, className)}>\n <div className={styles.summary}>\n {typeof totalItems === \"number\"\n ? `${totalItems} resultado${totalItems === 1 ? \"\" : \"s\"}`\n : `Página ${page} de ${totalPages}`}\n </div>\n <div className={styles.controls}>\n <button\n type=\"button\"\n className={styles.page}\n onClick={() => onPageChange(Math.max(1, page - 1))}\n disabled={page <= 1}\n aria-label=\"Página anterior\"\n >\n ‹\n </button>\n {pages.map((entry, index) =>\n entry === \"...\" ? (\n <span\n key={`ellipsis-${index}`}\n className={cn(styles.ellipsis, styles.numeric)}\n >\n …\n </span>\n ) : (\n <button\n type=\"button\"\n key={entry}\n className={cn(\n styles.page,\n styles.numeric,\n entry === page && styles.active,\n )}\n onClick={() => onPageChange(entry)}\n aria-current={entry === page ? \"page\" : undefined}\n >\n {entry}\n </button>\n ),\n )}\n <button\n type=\"button\"\n className={styles.page}\n onClick={() => onPageChange(Math.min(totalPages, page + 1))}\n disabled={page >= totalPages}\n aria-label=\"Próxima página\"\n >\n ›\n </button>\n {onPageSizeChange && (\n <select\n className={styles.sizeSelect}\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n aria-label=\"Itens por página\"\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt} / página\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n );\n}\n","import { forwardRef, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n ...inputProps\n },\n ref,\n ) {\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n },\n);\n","import { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/**\n * Lightweight popover. Renders a positioned panel anchored to a trigger,\n * dismissed on outside click / Escape. Does NOT include collision detection\n * or smart positioning — pair with Floating UI if you need that.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") setOpen(false);\n };\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnEsc, closeOnOutsideClick, setOpen]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n return (\n <span ref={rootRef} className={styles.root}>\n {triggerClone}\n {isOpen && (\n <div\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, styles[placement], className)}\n >\n {children}\n </div>\n )}\n </span>\n );\n}\n","import { cn } from \"@/utils/cn\";\nimport styles from \"./Progress.module.css\";\n\nexport type ProgressVariant = \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface ProgressProps {\n /** Value between 0 and `max` (or 0-100 by default). Ignored when `indeterminate`. */\n value?: number;\n max?: number;\n variant?: ProgressVariant;\n /** Show an animated indeterminate bar. Default: false. */\n indeterminate?: boolean;\n /** Render a numeric label \"x% / max\" above the bar. Default: false. */\n showLabel?: boolean;\n /** Optional left-aligned descriptor (e.g. \"Enviando arquivo…\"). */\n label?: string;\n className?: string;\n}\n\n/** Linear progress bar with determinate / indeterminate modes. */\nexport function Progress({\n value = 0,\n max = 100,\n variant = \"primary\",\n indeterminate = false,\n showLabel = false,\n label,\n className,\n}: ProgressProps) {\n const pct = indeterminate ? 0 : Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {(showLabel || label) && (\n <div className={styles.label}>\n {label && <span>{label}</span>}\n {showLabel && !indeterminate && <span>{Math.round(pct)}%</span>}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n className={cn(styles.bar, indeterminate && styles.indeterminate)}\n >\n <div\n className={cn(styles.fill, variant !== \"primary\" && styles[variant])}\n style={{ width: indeterminate ? undefined : `${pct}%` }}\n />\n </div>\n </div>\n );\n}\n","import { createContext, forwardRef, useContext, useId, useState } from \"react\";\nimport type { ChangeEvent, InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Radio.module.css\";\n\ninterface RadioGroupContextValue {\n name: string;\n value?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n description?: ReactNode;\n value: string;\n wrapperClassName?: string;\n}\n\n/**\n * Single radio button. Inside a {@link RadioGroup}, name/checked/onChange are\n * managed by the group; outside, behaves as a regular radio input.\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n label,\n description,\n value,\n disabled,\n name,\n checked,\n onChange,\n wrapperClassName,\n className,\n ...props\n },\n ref,\n) {\n const group = useContext(RadioGroupContext);\n const resolvedName = group?.name ?? name;\n const resolvedDisabled = group?.disabled ?? disabled;\n const isChecked = group ? group.value === value : checked;\n\n function handleChange(event: ChangeEvent<HTMLInputElement>): void {\n if (group) group.onChange?.(value);\n onChange?.(event);\n }\n\n return (\n <label\n className={cn(styles.wrapper, resolvedDisabled && styles.disabled, wrapperClassName)}\n >\n <input\n ref={ref}\n type=\"radio\"\n name={resolvedName}\n value={value}\n checked={isChecked}\n disabled={resolvedDisabled}\n onChange={handleChange}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.dot} aria-hidden />\n {(label || description) && (\n <span className={styles.labelWrap}>\n {label && <span className={styles.label}>{label}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </span>\n )}\n </label>\n );\n});\n\nexport interface RadioGroupProps {\n /** Selected value (controlled). */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Called when the selection changes. */\n onChange?: (value: string) => void;\n /** `name` attribute applied to every Radio inside. Auto-generated if omitted. */\n name?: string;\n /** Disable every Radio inside. */\n disabled?: boolean;\n /** Lay out radios horizontally. Default: false (column). */\n horizontal?: boolean;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Wraps multiple {@link Radio} children and coordinates selection via context.\n * Pass `value` for controlled mode or `defaultValue` for uncontrolled.\n */\nexport function RadioGroup({\n value,\n defaultValue,\n onChange,\n name,\n disabled,\n horizontal = false,\n className,\n children,\n}: RadioGroupProps) {\n const generatedName = useId();\n const resolvedName = name ?? generatedName;\n\n const [internal, setInternal] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n\n function handleChange(next: string): void {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n }\n\n return (\n <RadioGroupContext.Provider\n value={{ name: resolvedName, value: current, onChange: handleChange, disabled }}\n >\n <div\n role=\"radiogroup\"\n className={cn(styles.group, horizontal && styles.horizontal, className)}\n >\n {children}\n </div>\n </RadioGroupContext.Provider>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RangeSlider.module.css\";\n\nexport type RangeValue = [number, number];\n\nexport interface RangeSliderProps {\n value: RangeValue;\n onChange: (value: RangeValue) => void;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n /** Formatter for the value badge next to the label. Defaults to `min – max`. */\n formatValue?: (value: RangeValue) => string;\n className?: string;\n}\n\n/**\n * Dual-thumb range slider. Built on two native `<input type=\"range\">` so it\n * stays accessible and works with keyboards/screen readers without\n * heavyweight positioning libs. The active fill is positioned via percentages.\n */\nexport function RangeSlider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n helperText,\n disabled = false,\n formatValue,\n className,\n}: RangeSliderProps) {\n const [low, high] = value;\n const range = max - min;\n\n const fillLeft = useMemo(() => ((low - min) / range) * 100, [low, min, range]);\n const fillRight = useMemo(() => ((high - min) / range) * 100, [high, min, range]);\n\n const valueText = formatValue?.(value) ?? `${low} – ${high}`;\n\n const handleLow = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n const next = Math.min(Number(event.target.value), high);\n onChange([next, high]);\n },\n [high, onChange],\n );\n\n const handleHigh = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n const next = Math.max(Number(event.target.value), low);\n onChange([low, next]);\n },\n [low, onChange],\n );\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && (\n <div className={styles.label}>\n <span>{label}</span>\n <span className={styles.value}>{valueText}</span>\n </div>\n )}\n <div className={styles.field}>\n <div className={styles.track} />\n <div\n className={styles.fill}\n style={{ left: `${fillLeft}%`, right: `${100 - fillRight}%` }}\n />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={low}\n onChange={handleLow}\n disabled={disabled}\n aria-label={label ? `${label} (mínimo)` : \"Mínimo\"}\n />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={high}\n onChange={handleHigh}\n disabled={disabled}\n aria-label={label ? `${label} (máximo)` : \"Máximo\"}\n />\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RatingStars.module.css\";\n\nexport type RatingSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RatingStarsProps {\n /** Current selected value (1..max). 0 means none. */\n value: number;\n /** Total number of stars. Default 5. */\n max?: number;\n onChange?: (value: number) => void;\n size?: RatingSize;\n readonly?: boolean;\n disabled?: boolean;\n /** Accessible label for the rating group. */\n label?: string;\n className?: string;\n}\n\n/**\n * Star rating control. Renders `max` stars, fills the first `value`. Click a\n * star to set rating (when not readonly). Hovering previews the value.\n */\nexport function RatingStars({\n value,\n max = 5,\n onChange,\n size = \"md\",\n readonly = false,\n disabled = false,\n label = \"Avaliação\",\n className,\n}: RatingStarsProps) {\n const [hover, setHover] = useState<number>(0);\n const displayed = hover > 0 ? hover : value;\n\n const handleClick = (next: number): void => {\n if (readonly || disabled) return;\n onChange?.(next);\n };\n\n return (\n <span\n role=\"radiogroup\"\n aria-label={label}\n className={cn(\n styles.wrapper,\n styles[size],\n disabled && styles.disabled,\n readonly && styles.readonly,\n className,\n )}\n onMouseLeave={() => setHover(0)}\n >\n {Array.from({ length: max }, (_, i) => {\n const starIndex = i + 1;\n const filled = starIndex <= displayed;\n return (\n <button\n key={starIndex}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === starIndex}\n aria-label={`${starIndex} ${starIndex === 1 ? \"estrela\" : \"estrelas\"}`}\n className={cn(styles.star, filled && styles.filled)}\n disabled={disabled}\n onMouseEnter={() => !readonly && !disabled && setHover(starIndex)}\n onClick={() => handleClick(starIndex)}\n >\n <StarIcon filled={filled} />\n </button>\n );\n })}\n </span>\n );\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill={filled ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87L18.18 22 12 18.56 5.82 22 7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useBreakpoint, type Breakpoint } from \"@/hooks/use-breakpoint\";\n\nexport interface ShowProps {\n /** Render children only when viewport width is `>=` this breakpoint. */\n above?: Breakpoint;\n /** Render children only when viewport width is `<` this breakpoint. */\n below?: Breakpoint;\n /** Render only on specific breakpoints. Wins over `above`/`below` when set. */\n only?: Breakpoint | Breakpoint[];\n children: ReactNode;\n}\n\nfunction shouldRender(\n current: Breakpoint,\n above: Breakpoint | undefined,\n below: Breakpoint | undefined,\n only: Breakpoint | Breakpoint[] | undefined,\n helpers: { above: (bp: Breakpoint) => boolean; below: (bp: Breakpoint) => boolean },\n): boolean {\n if (only) {\n const list = Array.isArray(only) ? only : [only];\n return list.includes(current);\n }\n if (above && !helpers.above(above)) return false;\n if (below && !helpers.below(below)) return false;\n return true;\n}\n\n/**\n * Conditionally render children based on the viewport breakpoint.\n *\n * - `above` — render when viewport width is `>=` the given breakpoint.\n * - `below` — render when viewport width is `<` the given breakpoint.\n * - `only` — render only on the listed breakpoint(s).\n *\n * SSR-safe: first render uses `xs` (renders mobile content first); the\n * component re-renders once `useBreakpoint` has the real viewport width.\n */\nexport function Show({ above, below, only, children }: ShowProps): ReactNode {\n const bp = useBreakpoint();\n if (!shouldRender(bp.current, above, below, only, bp)) return null;\n return children;\n}\n\nexport interface HideProps {\n /** Hide children when viewport width is `>=` this breakpoint. */\n above?: Breakpoint;\n /** Hide children when viewport width is `<` this breakpoint. */\n below?: Breakpoint;\n /** Hide on specific breakpoints. */\n only?: Breakpoint | Breakpoint[];\n children: ReactNode;\n}\n\n/** Inverse of `<Show>` — hides children when the condition matches. */\nexport function Hide({ above, below, only, children }: HideProps): ReactNode {\n const bp = useBreakpoint();\n if (shouldRender(bp.current, above, below, only, bp)) return null;\n return children;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SafeArea.module.css\";\n\nexport type SafeAreaEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface SafeAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** Edges to pad. Default `[\"top\",\"right\",\"bottom\",\"left\"]` (all). */\n edges?: SafeAreaEdge[];\n /** Render as inline (use `display: contents`). */\n inline?: boolean;\n children?: ReactNode;\n}\n\nconst ALL_EDGES: SafeAreaEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Apply `env(safe-area-inset-*)` padding so content avoids iOS notch /\n * Android navbar / device chrome. Wrap the outermost container of pages\n * with sticky headers/footers.\n *\n * @example\n * <SafeArea edges={[\"top\"]}>\n * <Navbar />\n * </SafeArea>\n */\nexport function SafeArea({\n edges = ALL_EDGES,\n inline = false,\n className,\n children,\n ...props\n}: SafeAreaProps) {\n return (\n <div\n className={cn(\n styles.safe,\n inline && styles.inline,\n edges.includes(\"top\") && styles.top,\n edges.includes(\"right\") && styles.right,\n edges.includes(\"bottom\") && styles.bottom,\n edges.includes(\"left\") && styles.left,\n className,\n )}\n data-edges={edges.join(\" \")}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SearchBar.module.css\";\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\"> {\n value: string;\n onChange: (value: string) => void;\n onClear?: () => void;\n wrapperClassName?: string;\n}\n\n/**\n * Search input with magnifier icon and a clear button. Controlled component:\n * pass `value` and `onChange`.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { value, onChange, onClear, wrapperClassName, placeholder = \"Buscar...\", className, ...props },\n ref,\n) {\n function handleClear(): void {\n onChange(\"\");\n onClear?.();\n }\n\n return (\n <div className={cn(styles.wrapper, wrapperClassName)}>\n <span className={styles.iconLeft} aria-hidden>\n <SearchIcon />\n </span>\n <input\n ref={ref}\n type=\"search\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n className={cn(styles.input, className)}\n {...props}\n />\n {value && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label=\"Limpar busca\"\n onClick={handleClear}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n );\n});\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SegmentedControl.module.css\";\n\nexport interface SegmentedControlOption<TValue extends string = string> {\n value: TValue;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SegmentedControlProps<TValue extends string = string> extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\"\n> {\n /** Available segments. */\n options: SegmentedControlOption<TValue>[];\n /** Selected value. */\n value: TValue;\n /** Fires with the new value when a segment is selected. */\n onChange: (value: TValue) => void;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Stretch to full width of container. Default `false`. */\n fullWidth?: boolean;\n /** Group label for screen readers. */\n \"aria-label\"?: string;\n}\n\n/**\n * iOS-style segmented control. Two-to-five mutually-exclusive options\n * rendered as a single connected pill bar.\n *\n * @example\n * <SegmentedControl\n * value={view}\n * onChange={setView}\n * options={[\n * { value: \"list\", label: \"Lista\" },\n * { value: \"grid\", label: \"Grade\" },\n * ]}\n * />\n */\nexport function SegmentedControl<TValue extends string = string>({\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = false,\n className,\n \"aria-label\": ariaLabel,\n ...props\n}: SegmentedControlProps<TValue>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(styles.group, styles[size], fullWidth && styles.fullWidth, className)}\n {...props}\n >\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={option.disabled}\n className={cn(styles.segment, selected && styles.active)}\n onClick={() => onChange(option.value)}\n >\n {option.icon && <span className={styles.icon}>{option.icon}</span>}\n <span className={styles.label}>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Sidebar.module.css\";\n\nexport interface SidebarItem {\n key: string;\n label: ReactNode;\n icon?: ReactNode;\n badge?: ReactNode;\n disabled?: boolean;\n href?: string;\n}\n\nexport interface SidebarProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n /** Top slot — typically the logo + brand. */\n header?: ReactNode;\n /** Navigation items. */\n items: SidebarItem[];\n /** Active item key. */\n value?: string;\n /** Fires when an item is clicked. Receives the item's `key`. */\n onChange?: (key: string) => void;\n /** Bottom slot — typically settings/profile/logout. */\n footer?: ReactNode;\n /** Collapsed mode — only icons visible. Default `false`. */\n collapsed?: boolean;\n /** Width when expanded, in pixels or any CSS length. Default `240px`. */\n width?: number | string;\n /** Width when collapsed, in pixels or any CSS length. Default `64px`. */\n collapsedWidth?: number | string;\n}\n\n/**\n * Desktop sidebar navigation. Pair with `<Show above=\"md\">` and a `Drawer`\n * for mobile.\n *\n * @example\n * const [tab, setTab] = useState(\"home\");\n * <Show above=\"md\">\n * <Sidebar\n * header={<Brand />}\n * items={[{ key: \"home\", label: \"Home\", icon: <Home /> }]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function Sidebar({\n header,\n items,\n value,\n onChange,\n footer,\n collapsed = false,\n width = 240,\n collapsedWidth = 64,\n className,\n style,\n ...props\n}: SidebarProps) {\n const finalWidth =\n typeof (collapsed ? collapsedWidth : width) === \"number\"\n ? `${collapsed ? collapsedWidth : width}px`\n : collapsed\n ? collapsedWidth\n : width;\n return (\n <aside\n className={cn(styles.sidebar, collapsed && styles.collapsed, className)}\n style={{ width: finalWidth, ...style }}\n {...props}\n >\n {header && <div className={styles.header}>{header}</div>}\n <nav className={styles.nav} aria-label=\"Navegação lateral\">\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange?.(item.key)}\n title={\n collapsed && typeof item.label === \"string\" ? item.label : undefined\n }\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {!collapsed && <span className={styles.label}>{item.label}</span>}\n {!collapsed && item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </button>\n );\n })}\n </nav>\n {footer && <div className={styles.footer}>{footer}</div>}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Skeleton.module.css\";\n\nexport interface SkeletonProps {\n variant?: \"rect\" | \"text\" | \"circle\";\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Loading placeholder block. Use `variant=\"text\"` for inline lines, `circle` for avatars. */\nexport function Skeleton({ variant = \"rect\", width, height, className, style }: SkeletonProps) {\n return (\n <span\n aria-hidden\n className={cn(\n styles.skeleton,\n variant === \"text\" && styles.text,\n variant === \"circle\" && styles.circle,\n className,\n )}\n style={{ width, height, ...style }}\n />\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spacer.module.css\";\n\nexport type SpacerAxis = \"both\" | \"x\" | \"y\";\n\nexport interface SpacerProps extends HTMLAttributes<HTMLDivElement> {\n /** Axis to flex along. Default `\"both\"` (`flex: 1`). */\n axis?: SpacerAxis;\n}\n\n/**\n * Flex spacer — pushes siblings apart inside a flex container. Equivalent\n * to `<div style={{ flex: 1 }}>` but typed and intent-revealing.\n *\n * @example\n * <Stack direction=\"horizontal\">\n * <Button>Cancelar</Button>\n * <Spacer />\n * <Button variant=\"primary\">Salvar</Button>\n * </Stack>\n */\nexport function Spacer({ axis = \"both\", className, ...props }: SpacerProps) {\n return <div className={cn(styles.spacer, styles[axis], className)} {...props} />;\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n","import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({ steps, current, orientation = \"horizontal\", className }: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n <span className={styles.dot}>{completed ? \"✓\" : index + 1}</span>\n <span className={styles.label}>{step.label}</span>\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n","/**\n * Clamp `value` between `min` and `max` (inclusive).\n *\n * @example\n * clamp(120, 0, 100); // 100\n * clamp(-5, 0, 100); // 0\n * clamp(42, 0, 100); // 42\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (Number.isNaN(value)) return value;\n if (min > max) {\n const swap = min;\n min = max;\n max = swap;\n }\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n\n/**\n * Format a byte count as a human-readable size string.\n *\n * Scales through B, KB, MB, GB and TB using 1024 as the base. `decimals`\n * controls the fractional digits for scaled units (default 1); `0` bytes\n * always renders as `\"0 B\"`.\n *\n * @example\n * formatBytes(0); // \"0 B\"\n * formatBytes(1536); // \"1.5 KB\"\n * formatBytes(1048576); // \"1 MB\"\n * formatBytes(1536, 2); // \"1.50 KB\"\n */\nexport function formatBytes(bytes: number, decimals: number = 1): string {\n if (bytes === 0) return \"0 B\";\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const base = 1024;\n const exponent = Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(base)),\n units.length - 1,\n );\n const value = bytes / base ** exponent;\n const digits = exponent === 0 ? 0 : Math.max(0, decimals);\n const formatted = parseFloat(value.toFixed(digits)).toString();\n\n return `${formatted} ${units[exponent]}`;\n}\n\n/**\n * Format a number using compact notation (e.g. `1.2K`, `3.4M`).\n *\n * Wraps `Intl.NumberFormat` with `notation: \"compact\"`. The `locale` defaults\n * to `\"en-US\"`.\n *\n * @example\n * formatCompactNumber(1234); // \"1.2K\"\n * formatCompactNumber(5600000); // \"5.6M\"\n * formatCompactNumber(1234, \"pt-BR\"); // \"1,2 mil\"\n */\nexport function formatCompactNumber(value: number, locale: string = \"en-US\"): string {\n return new Intl.NumberFormat(locale, { notation: \"compact\", maximumFractionDigits: 1 }).format(\n value,\n );\n}\n","import { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n}: TableProps<T>) {\n return (\n <div className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}>\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Timeline.module.css\";\n\nexport type TimelineMarker = \"primary\" | \"success\" | \"warning\" | \"danger\" | \"neutral\";\n\nexport interface TimelineItem {\n /** Stable identifier (used as React key). */\n id: string;\n /** Title rendered as the entry headline. */\n title: ReactNode;\n /** Optional subtitle / description below the title. */\n description?: ReactNode;\n /** Right-aligned meta column (timestamps, durations). */\n meta?: ReactNode;\n /** Optional custom icon rendered inside the marker. */\n icon?: ReactNode;\n /** Marker color. Default `\"primary\"`. */\n marker?: TimelineMarker;\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n items: TimelineItem[];\n /** Show the connecting line between markers. Default `true`. */\n connector?: boolean;\n}\n\n/**\n * Vertical event timeline — activity feeds, order trackers, audit logs.\n * Each entry has a marker (color or custom icon), title, optional\n * description and right-aligned meta column.\n *\n * @example\n * <Timeline items={[\n * { id: \"1\", title: \"Pedido criado\", meta: \"10:24\", marker: \"primary\" },\n * { id: \"2\", title: \"Aprovação\", meta: \"10:25\", marker: \"success\" },\n * { id: \"3\", title: \"Saiu pra entrega\", meta: \"11:00\", marker: \"warning\" },\n * ]} />\n */\nexport function Timeline({ items, connector = true, className, ...props }: TimelineProps) {\n return (\n <ol className={cn(styles.timeline, connector && styles.connector, className)} {...props}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={item.id} className={styles.item}>\n <div className={styles.markerColumn}>\n <span\n className={cn(\n styles.marker,\n styles[`marker-${item.marker ?? \"primary\"}`],\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n {connector && !isLast && (\n <span className={styles.line} aria-hidden=\"true\" />\n )}\n </div>\n <div className={styles.body}>\n <div className={styles.row}>\n <span className={styles.title}>{item.title}</span>\n {item.meta && <span className={styles.meta}>{item.meta}</span>}\n </div>\n {item.description && (\n <p className={styles.description}>{item.description}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","import { cloneElement, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tooltip.module.css\";\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n /** Tooltip content. Plain text recommended; rich content also works. */\n content: ReactNode;\n /** Placement relative to the trigger. Default: `\"top\"`. */\n placement?: TooltipPlacement;\n /** Single React element to attach hover/focus listeners to. */\n children: ReactElement;\n /** Disable the tooltip without changing the trigger. */\n disabled?: boolean;\n /** Delay (ms) before showing the tooltip. Default: 150. */\n openDelay?: number;\n}\n\n/**\n * Lightweight tooltip. Shows on hover and on focus (keyboard-friendly). Wraps\n * a single child element via `cloneElement`, so the trigger keeps its own ref\n * and props.\n */\nexport function Tooltip({\n content,\n placement = \"top\",\n children,\n disabled = false,\n openDelay = 150,\n}: TooltipProps) {\n const [open, setOpen] = useState<boolean>(false);\n const tooltipId = useId();\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function show(): void {\n if (disabled) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => setOpen(true), openDelay);\n }\n\n function hide(): void {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n setOpen(false);\n }\n\n const trigger = cloneElement(children, {\n onMouseEnter: show,\n onMouseLeave: hide,\n onFocus: show,\n onBlur: hide,\n \"aria-describedby\": open ? tooltipId : undefined,\n } as Record<string, unknown>);\n\n return (\n <span className={styles.trigger}>\n {trigger}\n {open && (\n <span\n id={tooltipId}\n role=\"tooltip\"\n className={cn(styles.bubble, styles[placement])}\n >\n {content}\n </span>\n )}\n </span>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Toast.module.css\";\n\nexport type ToastVariant = \"success\" | \"warning\" | \"error\" | \"info\";\n\nexport interface ToastOptions {\n id?: string;\n title?: string;\n description?: string;\n variant?: ToastVariant;\n /** Auto-dismiss timeout in ms. Pass `0` to keep the toast until dismissed manually. */\n duration?: number;\n}\n\ninterface ToastEntry extends Required<Omit<ToastOptions, \"id\" | \"title\" | \"description\">> {\n id: string;\n title?: string;\n description?: string;\n}\n\nexport interface ToastApi {\n show: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n success: (\n description: string,\n options?: Omit<ToastOptions, \"variant\" | \"description\">,\n ) => string;\n error: (description: string, options?: Omit<ToastOptions, \"variant\" | \"description\">) => string;\n warning: (\n description: string,\n options?: Omit<ToastOptions, \"variant\" | \"description\">,\n ) => string;\n info: (description: string, options?: Omit<ToastOptions, \"variant\" | \"description\">) => string;\n}\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\n/**\n * Access the toast API. Must be used inside a {@link ToastProvider}.\n *\n * @returns Methods to show and dismiss toasts.\n */\nexport function useToast(): ToastApi {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used inside a <ToastProvider>\");\n return ctx;\n}\n\nexport type ToastPosition =\n | \"top-right\"\n | \"top-left\"\n | \"top-center\"\n | \"bottom-right\"\n | \"bottom-left\"\n | \"bottom-center\";\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Default auto-dismiss duration (ms). Default 4000. */\n defaultDuration?: number;\n /** Stack position on screen. Default `\"top-right\"`. */\n position?: ToastPosition;\n}\n\n/**\n * Renders a portalled toast container and exposes the imperative {@link useToast} API.\n */\nexport function ToastProvider({\n children,\n defaultDuration = 4000,\n position = \"top-right\",\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n const counter = useRef<number>(0);\n\n const dismiss = useCallback((id: string): void => {\n setToasts((current) => current.filter((toast) => toast.id !== id));\n }, []);\n\n const show = useCallback(\n (options: ToastOptions): string => {\n const id = options.id ?? `toast-${++counter.current}`;\n const entry: ToastEntry = {\n id,\n title: options.title,\n description: options.description,\n variant: options.variant ?? \"info\",\n duration: options.duration ?? defaultDuration,\n };\n setToasts((current) => [...current, entry]);\n return id;\n },\n [defaultDuration],\n );\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n dismiss,\n success: (description, options) =>\n show({ ...options, description, variant: \"success\" }),\n error: (description, options) => show({ ...options, description, variant: \"error\" }),\n warning: (description, options) =>\n show({ ...options, description, variant: \"warning\" }),\n info: (description, options) => show({ ...options, description, variant: \"info\" }),\n }),\n [show, dismiss],\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismiss} position={position} />\n </ToastContext.Provider>\n );\n}\n\ninterface ContainerProps {\n toasts: ToastEntry[];\n onDismiss: (id: string) => void;\n position: ToastPosition;\n}\n\nfunction positionClass(position: ToastPosition): string {\n switch (position) {\n case \"top-left\":\n return styles.positionTopLeft;\n case \"top-center\":\n return styles.positionTopCenter;\n case \"bottom-right\":\n return styles.positionBottomRight;\n case \"bottom-left\":\n return styles.positionBottomLeft;\n case \"bottom-center\":\n return styles.positionBottomCenter;\n case \"top-right\":\n default:\n return styles.positionTopRight;\n }\n}\n\nfunction ToastContainer({ toasts, onDismiss, position }: ContainerProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div\n className={cn(styles.container, positionClass(position))}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>,\n document.body,\n );\n}\n\ninterface ItemProps {\n toast: ToastEntry;\n onDismiss: (id: string) => void;\n}\n\nfunction ToastItem({ toast, onDismiss }: ItemProps) {\n useEffect(() => {\n if (!toast.duration) return;\n const timer = setTimeout(() => onDismiss(toast.id), toast.duration);\n return () => clearTimeout(timer);\n }, [toast.id, toast.duration, onDismiss]);\n\n return (\n <div className={cn(styles.toast, styles[toast.variant])} role=\"status\">\n <div>\n {toast.title && <p className={styles.title}>{toast.title}</p>}\n {toast.description && <p className={styles.description}>{toast.description}</p>}\n </div>\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar notificação\"\n onClick={() => onDismiss(toast.id)}\n >\n <CloseIcon />\n </button>\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./VirtualList.module.css\";\n\nexport interface VirtualListProps<T> {\n items: T[];\n /** Fixed pixel height for each row. */\n itemHeight: number;\n /** Render a single row. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Container height (px) or any CSS length. */\n height: number | string;\n /** Number of items rendered above/below the viewport. Default: 4. */\n overscan?: number;\n /** Stable key derivation; defaults to the index. */\n getKey?: (item: T, index: number) => string | number;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Fixed-height virtual list. Renders only the visible window plus a small\n * overscan buffer. Suitable for lists of thousands of identical rows.\n *\n * For variable heights, use `react-window`/`@tanstack/react-virtual` — those\n * solve a more general problem at the cost of extra setup.\n */\nexport function VirtualList<T>({\n items,\n itemHeight,\n renderItem,\n height,\n overscan = 4,\n getKey,\n className,\n style,\n}: VirtualListProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState<number>(0);\n const [viewport, setViewport] = useState<number>(0);\n\n useEffect(() => {\n const element = containerRef.current;\n if (!element) return;\n setViewport(element.clientHeight);\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => setViewport(element.clientHeight));\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const totalHeight = items.length * itemHeight;\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const visibleCount = Math.ceil(viewport / itemHeight) + overscan * 2;\n const end = Math.min(items.length, start + visibleCount);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.scroll, className)}\n style={{ height, ...style }}\n onScroll={(event) => setScrollTop((event.target as HTMLDivElement).scrollTop)}\n role=\"list\"\n >\n <div className={styles.spacer} style={{ height: totalHeight }}>\n {items.slice(start, end).map((item, offset) => {\n const index = start + offset;\n const key = getKey ? getKey(item, index) : index;\n return (\n <div\n key={key}\n role=\"listitem\"\n className={styles.row}\n style={{ top: index * itemHeight, height: itemHeight }}\n >\n {renderItem(item, index)}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* clipboard unavailable — silently ignore */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n","export type RelativeTimeLocale = \"pt-BR\" | \"en\";\n\ninterface Strings {\n justNow: string;\n secondsAgo: (n: number) => string;\n minutesAgo: (n: number) => string;\n hoursAgo: (n: number) => string;\n daysAgo: (n: number) => string;\n weeksAgo: (n: number) => string;\n monthsAgo: (n: number) => string;\n yearsAgo: (n: number) => string;\n inSeconds: (n: number) => string;\n inMinutes: (n: number) => string;\n inHours: (n: number) => string;\n inDays: (n: number) => string;\n inWeeks: (n: number) => string;\n inMonths: (n: number) => string;\n inYears: (n: number) => string;\n}\n\nconst PT_BR: Strings = {\n justNow: \"agora há pouco\",\n secondsAgo: (n) => `${n} s atrás`,\n minutesAgo: (n) => `${n} min atrás`,\n hoursAgo: (n) => (n === 1 ? \"1 hora atrás\" : `${n} horas atrás`),\n daysAgo: (n) => (n === 1 ? \"ontem\" : `${n} dias atrás`),\n weeksAgo: (n) => (n === 1 ? \"semana passada\" : `${n} semanas atrás`),\n monthsAgo: (n) => (n === 1 ? \"mês passado\" : `${n} meses atrás`),\n yearsAgo: (n) => (n === 1 ? \"ano passado\" : `${n} anos atrás`),\n inSeconds: (n) => `em ${n} s`,\n inMinutes: (n) => `em ${n} min`,\n inHours: (n) => `em ${n} h`,\n inDays: (n) => `em ${n} ${n === 1 ? \"dia\" : \"dias\"}`,\n inWeeks: (n) => `em ${n} ${n === 1 ? \"semana\" : \"semanas\"}`,\n inMonths: (n) => `em ${n} ${n === 1 ? \"mês\" : \"meses\"}`,\n inYears: (n) => `em ${n} ${n === 1 ? \"ano\" : \"anos\"}`,\n};\n\nconst EN: Strings = {\n justNow: \"just now\",\n secondsAgo: (n) => `${n}s ago`,\n minutesAgo: (n) => `${n}m ago`,\n hoursAgo: (n) => `${n}h ago`,\n daysAgo: (n) => (n === 1 ? \"yesterday\" : `${n} days ago`),\n weeksAgo: (n) => `${n}w ago`,\n monthsAgo: (n) => `${n}mo ago`,\n yearsAgo: (n) => `${n}y ago`,\n inSeconds: (n) => `in ${n}s`,\n inMinutes: (n) => `in ${n}m`,\n inHours: (n) => `in ${n}h`,\n inDays: (n) => `in ${n}d`,\n inWeeks: (n) => `in ${n}w`,\n inMonths: (n) => `in ${n}mo`,\n inYears: (n) => `in ${n}y`,\n};\n\nconst LOCALES: Record<RelativeTimeLocale, Strings> = { \"pt-BR\": PT_BR, en: EN };\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\n/**\n * Render a `Date` / ISO string as a relative-time string. Supports past and\n * future, PT-BR (default) and English.\n *\n * @example\n * relativeTime(new Date(Date.now() - 90_000)); // \"1 min atrás\"\n * relativeTime(\"2026-05-17T10:00:00Z\", { locale: \"en\" }); // \"5h ago\"\n */\nexport function relativeTime(\n input: Date | string | number,\n options: { locale?: RelativeTimeLocale; now?: Date | number } = {},\n): string {\n const { locale = \"pt-BR\", now = Date.now() } = options;\n const strings = LOCALES[locale];\n const target = input instanceof Date ? input.getTime() : new Date(input).getTime();\n const nowMs = typeof now === \"number\" ? now : now.getTime();\n const diff = nowMs - target;\n const past = diff >= 0;\n const abs = Math.abs(diff);\n\n if (abs < 30 * SECOND) return strings.justNow;\n if (abs < MINUTE) {\n const n = Math.round(abs / SECOND);\n return past ? strings.secondsAgo(n) : strings.inSeconds(n);\n }\n if (abs < HOUR) {\n const n = Math.round(abs / MINUTE);\n return past ? strings.minutesAgo(n) : strings.inMinutes(n);\n }\n if (abs < DAY) {\n const n = Math.round(abs / HOUR);\n return past ? strings.hoursAgo(n) : strings.inHours(n);\n }\n if (abs < WEEK) {\n const n = Math.round(abs / DAY);\n return past ? strings.daysAgo(n) : strings.inDays(n);\n }\n if (abs < MONTH) {\n const n = Math.round(abs / WEEK);\n return past ? strings.weeksAgo(n) : strings.inWeeks(n);\n }\n if (abs < YEAR) {\n const n = Math.round(abs / MONTH);\n return past ? strings.monthsAgo(n) : strings.inMonths(n);\n }\n const n = Math.round(abs / YEAR);\n return past ? strings.yearsAgo(n) : strings.inYears(n);\n}\n","import type { HTMLAttributes } from \"react\";\nimport { relativeTime } from \"@/utils/relative-time\";\n\nexport interface RelativeTimeProps extends HTMLAttributes<HTMLTimeElement> {\n /** The instant to render relative to now. */\n date: Date | string | number;\n /** Output language. Defaults to \"pt\". */\n locale?: \"pt\" | \"en\";\n}\n\n/**\n * Render a date as a human-friendly relative-time string (e.g. \"5 min atrás\")\n * inside a semantic `<time>` element with a machine-readable `dateTime`.\n *\n * Delegates the wording to the `relativeTime` util; \"pt\" maps to its \"pt-BR\"\n * locale.\n *\n * @example\n * <RelativeTime date={post.createdAt} locale=\"en\" />\n */\nexport function RelativeTime({ date, locale = \"pt\", ...props }: RelativeTimeProps) {\n const target = date instanceof Date ? date : new Date(date);\n const iso = Number.isNaN(target.getTime()) ? undefined : target.toISOString();\n const label = relativeTime(date, { locale: locale === \"pt\" ? \"pt-BR\" : \"en\" });\n\n return (\n <time dateTime={iso} {...props}>\n {label}\n </time>\n );\n}\n","import type { HTMLAttributes } from \"react\";\n\nexport interface MoneyProps extends HTMLAttributes<HTMLSpanElement> {\n /** Amount in the smallest currency unit (e.g. cents). */\n cents: number;\n /** ISO 4217 currency code. Defaults to \"BRL\". */\n currency?: string;\n /** BCP 47 locale used for formatting. Defaults to \"pt-BR\". */\n locale?: string;\n}\n\n/**\n * Render a monetary amount given in cents as a localized currency string\n * inside a `<span>`.\n *\n * The integer cents are divided by 100 and formatted with `Intl.NumberFormat`.\n *\n * @example\n * <Money cents={1990} /> // \"R$ 19,90\"\n * <Money cents={500} currency=\"USD\" locale=\"en-US\" /> // \"$5.00\"\n */\nexport function Money({ cents, currency = \"BRL\", locale = \"pt-BR\", ...props }: MoneyProps) {\n const formatted = new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n\n return <span {...props}>{formatted}</span>;\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TruncateText.module.css\";\n\nexport interface TruncateTextProps extends HTMLAttributes<HTMLDivElement> {\n /** Maximum number of lines to show before clamping. Defaults to 1. */\n lines?: number;\n /** Content to clamp. */\n children: ReactNode;\n}\n\n/**\n * Clamp text to a fixed number of lines using a CSS line-clamp, adding an\n * ellipsis on overflow. The line count is driven by the\n * `--tempest-clamp-lines` custom property.\n *\n * @example\n * <TruncateText lines={2}>{longDescription}</TruncateText>\n */\nexport function TruncateText({\n lines = 1,\n className,\n style,\n children,\n ...props\n}: TruncateTextProps) {\n const mergedStyle = {\n ...style,\n \"--tempest-clamp-lines\": lines,\n } as CSSProperties;\n\n return (\n <div className={cn(styles.clamp, className)} style={mergedStyle} {...props}>\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, JSX } from \"react\";\nimport { createElement } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./VisuallyHidden.module.css\";\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {\n /** Intrinsic element to render. Defaults to \"span\". */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * Render content that is hidden visually but remains available to screen\n * readers — the standard \"sr-only\" pattern. Useful for accessible labels on\n * icon-only controls.\n *\n * @example\n * <button><Icon /><VisuallyHidden>Close</VisuallyHidden></button>\n */\nexport function VisuallyHidden({\n as = \"span\",\n className,\n children,\n ...props\n}: VisuallyHiddenProps) {\n return createElement(as, { className: cn(styles.hidden, className), ...props }, children);\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /** Target DOM node to render into. Defaults to `document.body`. */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts. Defaults to `document.body` when no `container`\n * is provided.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted || typeof document === \"undefined\") {\n return null;\n }\n\n return createPortal(children, container ?? document.body);\n}\n","import { useEffect, useRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface ClickOutsideProps extends HTMLAttributes<HTMLDivElement> {\n /** Called when a pointer event lands outside the wrapped subtree. */\n onOutside: (event: MouseEvent | TouchEvent) => void;\n /** Content wrapped by the outside-click boundary. */\n children: ReactNode;\n}\n\n/**\n * Wraps its children in a `<div>` and invokes `onOutside` whenever a\n * `mousedown` or `touchstart` event occurs outside that subtree.\n *\n * Useful for dismissing popovers, dropdowns and menus on outside interaction.\n * Listeners are attached to `document` on mount and removed on unmount.\n *\n * @param props - The click-outside props, plus any `<div>` attributes.\n * @returns The wrapper element containing the children.\n */\nexport function ClickOutside({ onOutside, children, ...props }: ClickOutsideProps): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n const handlerRef = useRef(onOutside);\n handlerRef.current = onOutside;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n function handle(event: MouseEvent | TouchEvent): void {\n const node = ref.current;\n const target = event.target as Node | null;\n if (node && target && !node.contains(target)) {\n handlerRef.current(event);\n }\n }\n\n document.addEventListener(\"mousedown\", handle);\n document.addEventListener(\"touchstart\", handle);\n return () => {\n document.removeEventListener(\"mousedown\", handle);\n document.removeEventListener(\"touchstart\", handle);\n };\n }, []);\n\n return (\n <div ref={ref} {...props}>\n {children}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n","import { Fragment, type ReactNode } from \"react\";\n\nexport interface ForProps<T> {\n /** The collection to iterate over. */\n each: readonly T[];\n /** Render function called for each item with its index. */\n children: (item: T, index: number) => ReactNode;\n /** Rendered when `each` is empty. Defaults to `null`. */\n fallback?: ReactNode;\n}\n\n/**\n * Typed, JSX-friendly list renderer.\n *\n * Maps over `each`, calling `children(item, index)` for every entry. When\n * `each` is empty, it renders `fallback` (or nothing). The generic parameter is\n * inferred from `each`, so the render callback's `item` is fully typed:\n * `<For each={users}>{(user) => <li>{user.name}</li>}</For>`.\n *\n * @typeParam T - The element type of the `each` collection.\n * @param props - The list-rendering props.\n * @returns The mapped children, or the fallback when `each` is empty.\n */\nexport function For<T>({ each, children, fallback = null }: ForProps<T>): ReactNode {\n if (each.length === 0) {\n return <>{fallback}</>;\n }\n return (\n <>\n {each.map((item, index) => (\n <Fragment key={index}>{children(item, index)}</Fragment>\n ))}\n </>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ErrorText.module.css\";\n\nexport interface ErrorTextProps extends HTMLAttributes<HTMLParagraphElement> {\n /** The error message. When empty, the component renders nothing. */\n children?: ReactNode;\n}\n\n/**\n * Renders a form-field error message as a `<p role=\"alert\">`.\n *\n * Renders `null` when there are no children, so it can be placed\n * unconditionally below a field and only appears when an error is present.\n * Styled with the `--tempest-danger` token (falling back to a red default).\n *\n * @param props - The error-text props, plus any `<p>` attributes.\n * @returns The alert paragraph, or `null` when there is no message.\n */\nexport function ErrorText({ children, className, ...props }: ErrorTextProps): ReactNode {\n if (children === null || children === undefined || children === false || children === \"\") {\n return null;\n }\n return (\n <p role=\"alert\" className={cn(styles.errorText, className)} {...props}>\n {children}\n </p>\n );\n}\n","import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { Fragment } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DescriptionList.module.css\";\n\nexport interface DescriptionListItem {\n /** The key/label rendered inside a `<dt>`. */\n term: ReactNode;\n /** The value rendered inside a `<dd>`. */\n description: ReactNode;\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** Term/description pairs rendered as `<dt>`/`<dd>` rows. */\n items: DescriptionListItem[];\n}\n\n/**\n * Renders a semantic `<dl>` of term/description pairs with minimal\n * token-based key/value styling.\n *\n * @param items - The term/description pairs to render.\n * @returns The rendered description list.\n */\nexport function DescriptionList({ items, className, ...props }: DescriptionListProps) {\n return (\n <dl className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <Fragment key={index}>\n <dt className={styles.term}>{item.term}</dt>\n <dd className={styles.description}>{item.description}</dd>\n </Fragment>\n ))}\n </dl>\n );\n}\n","import { forwardRef, useCallback, useState } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Toggle.module.css\";\n\nexport type ToggleSize = \"sm\" | \"md\" | \"lg\";\nexport type ToggleVariant = \"default\" | \"outline\";\n\nexport interface ToggleProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n /** Controlled pressed state. When provided the component is controlled. */\n pressed?: boolean;\n /** Initial pressed state for the uncontrolled variant. Default `false`. */\n defaultPressed?: boolean;\n /** Fired with the next pressed state whenever the toggle is activated. */\n onPressedChange?: (pressed: boolean) => void;\n /** Visual size. Default `\"md\"`. */\n size?: ToggleSize;\n /** Visual style. Default `\"default\"`. */\n variant?: ToggleVariant;\n}\n\n/**\n * A pressable two-state button — like a checkbox styled as a button.\n *\n * Works controlled (pass `pressed` + `onPressedChange`) or uncontrolled\n * (pass `defaultPressed`). Renders a native `<button type=\"button\">` exposing\n * its state through `aria-pressed`.\n *\n * @param props - {@link ToggleProps}.\n * @returns The toggle button element.\n */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(function Toggle(\n {\n pressed,\n defaultPressed = false,\n onPressedChange,\n size = \"md\",\n variant = \"default\",\n className,\n disabled,\n onClick,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = pressed !== undefined;\n const [internalPressed, setInternalPressed] = useState<boolean>(defaultPressed);\n const isPressed = isControlled ? pressed : internalPressed;\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const next = !isPressed;\n if (!isControlled) setInternalPressed(next);\n onPressedChange?.(next);\n },\n [isPressed, isControlled, onClick, onPressedChange],\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={isPressed}\n disabled={disabled}\n data-state={isPressed ? \"on\" : \"off\"}\n className={cn(\n styles.toggle,\n styles[size],\n styles[variant],\n isPressed && styles.pressed,\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n});\n","import { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ToggleGroup.module.css\";\n\nexport type ToggleGroupType = \"single\" | \"multiple\";\n\ninterface ToggleGroupContextValue {\n type: ToggleGroupType;\n isSelected: (value: string) => boolean;\n toggle: (value: string) => void;\n}\n\nconst ToggleGroupContext = createContext<ToggleGroupContextValue | null>(null);\n\nfunction useToggleGroupContext(): ToggleGroupContextValue {\n const ctx = useContext(ToggleGroupContext);\n if (!ctx) {\n throw new Error(\"ToggleGroupItem must be used within a ToggleGroup\");\n }\n return ctx;\n}\n\nexport interface ToggleGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Selection mode. `\"single\"` keeps one value; `\"multiple\"` keeps a set. Default `\"single\"`. */\n type?: ToggleGroupType;\n /** Controlled value — `string` for `single`, `string[]` for `multiple`. */\n value?: string | string[];\n /** Uncontrolled initial value. */\n defaultValue?: string | string[];\n /** Fired with the next value whenever the selection changes. */\n onValueChange?: (value: string | string[]) => void;\n children: ReactNode;\n}\n\nfunction normalizeArray(value: string | string[] | undefined): string[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * A set of {@link ToggleGroupItem}s that share selection state via context.\n *\n * In `single` mode the value is a `string` (empty string when nothing is\n * selected); in `multiple` mode it is a `string[]`. Works controlled (pass\n * `value` + `onValueChange`) or uncontrolled (pass `defaultValue`).\n *\n * @param props - {@link ToggleGroupProps}.\n * @returns A `role=\"group\"` container wrapping the items.\n */\nexport function ToggleGroup({\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n className,\n children,\n ...props\n}: ToggleGroupProps) {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string[]>(() =>\n normalizeArray(defaultValue),\n );\n const selected = isControlled ? normalizeArray(value) : internalValue;\n\n const commit = useCallback(\n (next: string[]): void => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(type === \"single\" ? (next[0] ?? \"\") : next);\n },\n [isControlled, onValueChange, type],\n );\n\n const toggle = useCallback(\n (itemValue: string): void => {\n const isOn = selected.includes(itemValue);\n if (type === \"single\") {\n commit(isOn ? [] : [itemValue]);\n } else {\n commit(isOn ? selected.filter((v) => v !== itemValue) : [...selected, itemValue]);\n }\n },\n [selected, type, commit],\n );\n\n const ctx = useMemo<ToggleGroupContextValue>(\n () => ({\n type,\n isSelected: (itemValue: string) => selected.includes(itemValue),\n toggle,\n }),\n [type, selected, toggle],\n );\n\n return (\n <ToggleGroupContext.Provider value={ctx}>\n <div role=\"group\" className={cn(styles.group, className)} {...props}>\n {children}\n </div>\n </ToggleGroupContext.Provider>\n );\n}\n\nexport interface ToggleGroupItemProps extends Omit<HTMLAttributes<HTMLButtonElement>, \"onClick\"> {\n /** Stable value identifying this item within the group. */\n value: string;\n /** Disables the item. */\n disabled?: boolean;\n children: ReactNode;\n}\n\n/**\n * A single selectable item inside a {@link ToggleGroup}. Reads and updates the\n * group's shared state through context.\n *\n * @param props - {@link ToggleGroupItemProps}.\n * @returns A `role=\"button\"` element exposing its state via `aria-pressed`.\n */\nexport function ToggleGroupItem({\n value,\n disabled,\n className,\n children,\n ...props\n}: ToggleGroupItemProps) {\n const { isSelected, toggle } = useToggleGroupContext();\n const selected = isSelected(value);\n\n return (\n <button\n type=\"button\"\n role=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n data-state={selected ? \"on\" : \"off\"}\n className={cn(styles.item, selected && styles.selected, className)}\n onClick={() => toggle(value)}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n","import { useCallback, useId, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Collapsible.module.css\";\n\nexport interface CollapsibleProps extends HTMLAttributes<HTMLDivElement> {\n /** Controlled open state. When provided the component is controlled. */\n open?: boolean;\n /** Initial open state for the uncontrolled variant. Default `false`. */\n defaultOpen?: boolean;\n /** Fired with the next open state whenever the trigger is activated. */\n onOpenChange?: (open: boolean) => void;\n /** Content rendered inside the trigger button. */\n trigger: ReactNode;\n /** Collapsible content, hidden while closed. */\n children: ReactNode;\n}\n\n/**\n * A single expand/collapse region — a lighter alternative to `Accordion` for\n * one toggleable block. The trigger is a `<button aria-expanded aria-controls>`\n * wired to a content region sharing the same id; the region is `hidden` while\n * closed. Works controlled (`open` + `onOpenChange`) or uncontrolled\n * (`defaultOpen`).\n *\n * @param props - {@link CollapsibleProps}.\n * @returns The collapsible container.\n */\nexport function Collapsible({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n className,\n children,\n ...props\n}: CollapsibleProps) {\n const reactId = useId();\n const contentId = `${reactId}-content`;\n const triggerId = `${reactId}-trigger`;\n\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = useCallback((): void => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n }, [isOpen, isControlled, onOpenChange]);\n\n return (\n <div className={cn(styles.collapsible, isOpen && styles.open, className)} {...props}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={handleToggle}\n >\n {trigger}\n </button>\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n hidden={!isOpen}\n className={styles.content}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Right-click context menu.\n *\n * - Opens at the cursor position on `onContextMenu` (default browser menu suppressed).\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking contexts.\n * - Closes on outside click, Escape, or item selection.\n * - Arrow Up/Down move focus across selectable items; Enter activates the focused item.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({ items, children, className }: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const menuRef = useRef<HTMLUListElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n event.preventDefault();\n setPosition({ x: event.clientX, y: event.clientY });\n setActiveIndex(-1);\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const next = selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1;\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const prev =\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1;\n setActiveIndex(prev);\n itemRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [open, activeIndex, selectableIndexes, close]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span className={styles.root} onContextMenu={handleContextMenu}>\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={menuRef}\n id={id}\n role=\"menu\"\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n}\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n className,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n return (\n <span\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (\n <div\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], className)}\n {...rest}\n >\n {children}\n </div>\n )}\n </span>\n );\n}\n","import { useEffect } from \"react\";\nimport type { RefObject } from \"react\";\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\n/**\n * Trap keyboard focus inside `containerRef` while `active` is true. Cycles\n * Tab and Shift+Tab between the first and last focusable descendants. Pair\n * with Modal/Drawer for fully-accessible overlays.\n */\nexport function useFocusTrap(containerRef: RefObject<HTMLElement | null>, active: boolean): void {\n useEffect(() => {\n if (!active) return;\n const container = containerRef.current;\n if (!container) return;\n\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n function getFocusable(): HTMLElement[] {\n return Array.from(\n container?.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR) ?? [],\n ).filter((el) => {\n if (el.hasAttribute(\"aria-hidden\")) return false;\n const style = typeof window !== \"undefined\" ? window.getComputedStyle(el) : null;\n if (style && (style.display === \"none\" || style.visibility === \"hidden\")) {\n return false;\n }\n return true;\n });\n }\n\n function handleKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Tab\") return;\n const elements = getFocusable();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0]!;\n const last = elements[elements.length - 1]!;\n const current = document.activeElement as HTMLElement | null;\n if (event.shiftKey) {\n if (current === first || !current || !container?.contains(current)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n if (current === last) {\n event.preventDefault();\n first.focus();\n }\n }\n }\n\n const focusable = getFocusable();\n focusable[0]?.focus();\n document.addEventListener(\"keydown\", handleKeydown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeydown);\n previouslyFocused?.focus?.();\n };\n }, [containerRef, active]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport styles from \"./Command.module.css\";\n\nexport interface CommandItem {\n /** Stable unique identifier for the item. */\n id: string;\n /** Human-readable label shown in the list and matched against the query. */\n label: string;\n /** Optional group heading; items sharing a group are rendered together. */\n group?: string;\n /** Extra terms matched against the query in addition to `label`. */\n keywords?: string[];\n /** Invoked when the item is chosen (click or Enter on the active row). */\n onSelect: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nexport interface CommandProps {\n /** Whether the palette is visible. */\n open: boolean;\n /** Called with the next open state (Escape, selection, backdrop click). */\n onOpenChange: (open: boolean) => void;\n /** Candidate items to filter and display. */\n items: CommandItem[];\n /** Placeholder for the search input. */\n placeholder?: string;\n /** Rendered when no item matches the current query. */\n emptyMessage?: ReactNode;\n /** Forwarded to the dialog element. */\n className?: string;\n}\n\ninterface CommandGroup {\n name: string | undefined;\n items: CommandItem[];\n}\n\n/**\n * Case-insensitively test whether `item` matches `query` by substring against\n * its label and any keywords. An empty query matches everything.\n *\n * @param item - The candidate command item.\n * @param query - The lowercased search query.\n * @returns `true` when the item should be shown.\n */\nfunction matchesQuery(item: CommandItem, query: string): boolean {\n if (query === \"\") return true;\n if (item.label.toLowerCase().includes(query)) return true;\n return (item.keywords ?? []).some((keyword) => keyword.toLowerCase().includes(query));\n}\n\n/**\n * Partition a flat item list into ordered groups, preserving first-seen order\n * for both groups and the items within them.\n *\n * @param items - The (already filtered) items to group.\n * @returns An ordered list of groups.\n */\nfunction groupItems(items: CommandItem[]): CommandGroup[] {\n const groups: CommandGroup[] = [];\n const indexByName = new Map<string | undefined, number>();\n for (const item of items) {\n const existing = indexByName.get(item.group);\n if (existing === undefined) {\n indexByName.set(item.group, groups.length);\n groups.push({ name: item.group, items: [item] });\n } else {\n groups[existing]!.items.push(item);\n }\n }\n return groups;\n}\n\n/**\n * A ⌘K-style command palette: an overlay dialog with a search input that\n * substring-filters items by label and keywords, groups results, and supports\n * full keyboard navigation (Arrow up/down, Enter, Escape). Traps focus while\n * open.\n */\nexport function Command({\n open,\n onOpenChange,\n items,\n placeholder = \"Type a command…\",\n emptyMessage = \"No results\",\n className,\n}: CommandProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const [query, setQuery] = useState<string>(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(0);\n const listId = \"tempest-command-list\";\n\n useFocusTrap(dialogRef, open);\n\n const filtered = useMemo<CommandItem[]>(() => {\n const normalized = query.trim().toLowerCase();\n const visible = items.filter((item) => matchesQuery(item, normalized));\n return groupItems(visible).flatMap((group) => group.items);\n }, [items, query]);\n\n const groups = useMemo<CommandGroup[]>(() => groupItems(filtered), [filtered]);\n\n // Reset transient state whenever the palette opens.\n useEffect(() => {\n if (open) {\n setQuery(\"\");\n setActiveIndex(0);\n }\n }, [open]);\n\n // Keep the active index within bounds as the filtered list shrinks/grows.\n useEffect(() => {\n setActiveIndex((index) => {\n if (filtered.length === 0) return 0;\n return Math.min(index, filtered.length - 1);\n });\n }, [filtered.length]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n function selectItem(item: CommandItem): void {\n item.onSelect();\n onOpenChange(false);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange(false);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index + 1) % filtered.length);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n const item = filtered[activeIndex];\n if (item) selectItem(item);\n }\n }\n\n let renderIndex = -1;\n\n return createPortal(\n <div className={styles.overlay} role=\"presentation\" onClick={() => onOpenChange(false)}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n className={cn(styles.dialog, className)}\n onClick={(event) => event.stopPropagation()}\n >\n <div className={styles.inputRow}>\n <SearchIcon />\n <input\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n autoFocus\n className={styles.input}\n placeholder={placeholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ul id={listId} role=\"listbox\" className={styles.list}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n groups.map((group) => (\n <li key={group.name ?? \"__ungrouped__\"} className={styles.group}>\n {group.name && (\n <div className={styles.groupHeading}>{group.name}</div>\n )}\n <ul role=\"presentation\" className={styles.groupList}>\n {group.items.map((item) => {\n renderIndex += 1;\n const isActive = renderIndex === activeIndex;\n const index = renderIndex;\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\n styles.option,\n isActive && styles.active,\n )}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => selectItem(item)}\n >\n {item.icon && (\n <span className={styles.icon}>{item.icon}</span>\n )}\n <span className={styles.label}>{item.label}</span>\n </li>\n );\n })}\n </ul>\n </li>\n ))\n )}\n </ul>\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n className={styles.searchIcon}\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ScrollArea.module.css\";\n\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** Caps the container height; numbers are treated as pixels. */\n maxHeight?: number | string;\n /** Which axis scrolls. Default `\"vertical\"`. */\n orientation?: ScrollAreaOrientation;\n}\n\n/**\n * A styled scroll container that overflows on the chosen axis and renders a\n * thin custom scrollbar (WebKit) while staying fully functional in browsers\n * without scrollbar styling. Forwards `className`, `style` and the ref to the\n * underlying `<div>`.\n */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(\n { maxHeight, orientation = \"vertical\", className, style, children, ...props },\n ref,\n) {\n const mergedStyle: CSSProperties = {\n overflowX: orientation === \"vertical\" ? \"hidden\" : \"auto\",\n overflowY: orientation === \"horizontal\" ? \"hidden\" : \"auto\",\n ...(maxHeight !== undefined ? { maxHeight } : {}),\n ...style,\n };\n\n return (\n <div ref={ref} className={cn(styles.root, className)} style={mergedStyle} {...props}>\n {children}\n </div>\n );\n});\n","import { useCallback, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, PointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Resizable.module.css\";\n\nexport type ResizableDirection = \"horizontal\" | \"vertical\";\n\nexport interface ResizableProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Split orientation. `horizontal` (default) places panes side by side. */\n direction?: ResizableDirection;\n /** Initial size of the first pane, as a percentage. Defaults to `50`. */\n defaultSize?: number;\n /** Lower clamp for the first pane size, in percent. Defaults to `10`. */\n min?: number;\n /** Upper clamp for the first pane size, in percent. Defaults to `90`. */\n max?: number;\n /** Exactly two panes — `[paneA, paneB]`. */\n children: [ReactNode, ReactNode];\n}\n\nconst KEY_STEP = 2;\n\n/**\n * Clamp a number into the inclusive `[min, max]` range.\n *\n * @param value - The value to clamp.\n * @param min - Lower bound.\n * @param max - Upper bound.\n * @returns The clamped value.\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * A two-pane split layout with a draggable divider. The first pane is sized via\n * `flex-basis` as a percentage; the second pane fills the rest. Drag the divider\n * with a pointer, or focus it and use the arrow keys to adjust by 2% steps.\n *\n * The size is clamped to `[min, max]` at all times.\n */\nexport function Resizable({\n direction = \"horizontal\",\n defaultSize = 50,\n min = 10,\n max = 90,\n children,\n className,\n ...props\n}: ResizableProps) {\n const [size, setSize] = useState<number>(() => clamp(defaultSize, min, max));\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [paneA, paneB] = children;\n const isHorizontal = direction === \"horizontal\";\n\n const updateFromPointer = useCallback(\n (clientX: number, clientY: number): void => {\n const container = containerRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n const total = isHorizontal ? rect.width : rect.height;\n if (total <= 0) return;\n const offset = isHorizontal ? clientX - rect.left : clientY - rect.top;\n const percent = (offset / total) * 100;\n setSize(clamp(percent, min, max));\n },\n [isHorizontal, min, max],\n );\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>): void => {\n event.preventDefault();\n const divider = event.currentTarget;\n divider.setPointerCapture(event.pointerId);\n\n const handleMove = (moveEvent: globalThis.PointerEvent): void => {\n updateFromPointer(moveEvent.clientX, moveEvent.clientY);\n };\n const handleUp = (): void => {\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n },\n [updateFromPointer],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>): void => {\n let delta = 0;\n if (isHorizontal) {\n if (event.key === \"ArrowRight\") delta = KEY_STEP;\n else if (event.key === \"ArrowLeft\") delta = -KEY_STEP;\n } else {\n if (event.key === \"ArrowDown\") delta = KEY_STEP;\n else if (event.key === \"ArrowUp\") delta = -KEY_STEP;\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n setSize(min);\n return;\n }\n if (event.key === \"End\") {\n event.preventDefault();\n setSize(max);\n return;\n }\n if (delta === 0) return;\n event.preventDefault();\n setSize((current) => clamp(current + delta, min, max));\n },\n [isHorizontal, min, max],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn(\n styles.root,\n isHorizontal ? styles.horizontal : styles.vertical,\n className,\n )}\n {...props}\n >\n <div className={styles.pane} style={{ flexBasis: `${size}%` }}>\n {paneA}\n </div>\n <div\n role=\"separator\"\n aria-orientation={isHorizontal ? \"vertical\" : \"horizontal\"}\n aria-valuenow={Math.round(size)}\n aria-valuemin={min}\n aria-valuemax={max}\n tabIndex={0}\n className={styles.divider}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n >\n <span className={styles.handle} aria-hidden=\"true\" />\n </div>\n <div className={styles.pane} style={{ flexBasis: `${100 - size}%` }}>\n {paneB}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Calendar.module.css\";\n\nexport type WeekStart = 0 | 1;\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected date. */\n value?: Date;\n /** Initial selected date for the uncontrolled case. */\n defaultValue?: Date;\n /** Called with the newly selected date. */\n onChange?: (date: Date) => void;\n /** Controlled visible month (any day within it). */\n month?: Date;\n /** Called when the visible month changes (prev/next). */\n onMonthChange?: (month: Date) => void;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst DAYS_IN_GRID = 42;\n\n/**\n * Build a `Date` at midnight local time for the given year/month/day.\n *\n * @param year - Full year.\n * @param month - Zero-based month index.\n * @param day - Day of the month.\n * @returns A normalized `Date`.\n */\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\n/**\n * Strip the time portion so two dates can be compared by calendar day.\n *\n * @param date - The date to normalize.\n * @returns A new `Date` at local midnight.\n */\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/**\n * Whether two dates fall on the same calendar day.\n *\n * @param a - First date.\n * @param b - Second date.\n * @returns `true` when year, month and day match.\n */\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/**\n * Whether a date is outside the inclusive `[minDate, maxDate]` window.\n *\n * @param date - The candidate day.\n * @param minDate - Optional lower bound.\n * @param maxDate - Optional upper bound.\n * @returns `true` when the date is disabled.\n */\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/**\n * Compute the 42-cell (6x7) grid of dates covering the given month, padded with\n * leading/trailing days from the adjacent months.\n *\n * @param month - Any date within the target month.\n * @param weekStartsOn - First column of the week.\n * @returns An array of 42 `Date` objects.\n */\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstOfMonth = makeDate(year, monthIndex, 1);\n const firstWeekday = firstOfMonth.getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n\n const cells: Date[] = [];\n for (let i = 0; i < DAYS_IN_GRID; i += 1) {\n cells.push(makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i));\n }\n return cells;\n}\n\n/**\n * Standalone month-grid date picker. Renders a header with the month/year and\n * prev/next buttons, a weekday row, and a 6x7 grid of day buttons. Selection and\n * the visible month can each be controlled or uncontrolled. Grid arithmetic uses\n * plain `Date` math — no external date libraries.\n *\n * Keyboard: arrow keys move focus by day (left/right) or week (up/down), and\n * Enter/Space selects the focused day.\n */\nexport function Calendar({\n value,\n defaultValue,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: CalendarProps) {\n const isSelectionControlled = value !== undefined;\n const [internalSelected, setInternalSelected] = useState<Date | undefined>(defaultValue);\n const selected = isSelectionControlled ? value : internalSelected;\n\n const isMonthControlled = month !== undefined;\n const [internalMonth, setInternalMonth] = useState<Date>(() => {\n const base = month ?? value ?? defaultValue ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const visibleMonth = isMonthControlled\n ? makeDate(month.getFullYear(), month.getMonth(), 1)\n : internalMonth;\n\n const [focusedDay, setFocusedDay] = useState<number | null>(null);\n const gridRef = useRef<HTMLDivElement | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const cells = useMemo(\n () => buildGrid(visibleMonth, weekStartsOn),\n [visibleMonth, weekStartsOn],\n );\n\n const weekdayLabels = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]);\n }, [weekStartsOn]);\n\n const changeMonth = useCallback(\n (offset: number): void => {\n const next = makeDate(visibleMonth.getFullYear(), visibleMonth.getMonth() + offset, 1);\n if (onMonthChange) onMonthChange(next);\n if (!isMonthControlled) setInternalMonth(next);\n },\n [visibleMonth, onMonthChange, isMonthControlled],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n if (onChange) onChange(date);\n if (!isSelectionControlled) setInternalSelected(date);\n },\n [minDate, maxDate, onChange, isSelectionControlled],\n );\n\n const focusCell = useCallback((index: number): void => {\n const clamped = Math.max(0, Math.min(DAYS_IN_GRID - 1, index));\n setFocusedDay(clamped);\n const grid = gridRef.current;\n if (!grid) return;\n const buttons = grid.querySelectorAll<HTMLButtonElement>(\"button[data-day]\");\n buttons[clamped]?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number): void => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell(index - 1);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell(index + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell(index - 7);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n focusCell(index + 7);\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n selectDate(cells[index]);\n break;\n default:\n break;\n }\n },\n [focusCell, selectDate, cells],\n );\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </span>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span key={label} className={styles.weekday} role=\"columnheader\">\n {label}\n </span>\n ))}\n </div>\n\n <div className={styles.grid} role=\"grid\" ref={gridRef}>\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === visibleMonth.getMonth();\n const isSelected = selected ? isSameDay(date, selected) : false;\n const isToday = isSameDay(date, today);\n const disabled = isOutOfRange(date, minDate, maxDate);\n const isFocusTarget =\n focusedDay === null\n ? inMonth && date.getDate() === 1\n : focusedDay === index;\n return (\n <button\n key={index}\n type=\"button\"\n data-day\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n isSelected && styles.selected,\n isToday && styles.today,\n )}\n aria-pressed={isSelected}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n tabIndex={isFocusTarget ? 0 : -1}\n onClick={() => selectDate(date)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Slider.module.css\";\n\nexport interface SliderProps {\n /** Current value. */\n value: number;\n /** Called with the new value on every change. */\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n /** Formatter for the value badge next to the label. Defaults to the raw number. */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\n/**\n * Single-thumb slider built on a native `<input type=\"range\">`, so it stays\n * accessible (keyboard + screen reader) with no positioning libs. The active\n * fill is a percentage-width bar. For a two-thumb range, use `RangeSlider`.\n */\nexport function Slider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n helperText,\n disabled = false,\n formatValue,\n className,\n}: SliderProps) {\n const pct = useMemo(() => {\n const range = max - min;\n if (range <= 0) return 0;\n return Math.min(100, Math.max(0, ((value - min) / range) * 100));\n }, [value, min, max]);\n\n const valueText = formatValue?.(value) ?? String(value);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n onChange(Number(event.target.value));\n },\n [onChange],\n );\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && (\n <div className={styles.label}>\n <span>{label}</span>\n <span className={styles.value}>{valueText}</span>\n </div>\n )}\n <div className={styles.field}>\n <div className={styles.track} />\n <div className={styles.fill} style={{ width: `${pct}%` }} />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n aria-label={label ?? \"Slider\"}\n aria-valuetext={valueText}\n />\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./MultiSelect.module.css\";\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n options: MultiSelectOption[];\n /** Currently selected values. */\n value: string[];\n onChange: (value: string[]) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n disabled?: boolean;\n /** Cap the number of selectable items. */\n maxItems?: number;\n /** Custom filter — return true to keep the option. Default: case-insensitive substring on label. */\n filter?: (option: MultiSelectOption, query: string) => boolean;\n /** Message shown when no option matches. */\n emptyMessage?: string;\n className?: string;\n}\n\nfunction defaultFilter(option: MultiSelectOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * MultiSelect — a filterable dropdown that selects many options, shown as\n * removable chips inside the field. Selecting toggles a value; Backspace on an\n * empty query removes the last chip.\n *\n * Keyboard: ArrowUp/ArrowDown navigate, Enter toggles the active option, Esc\n * closes, Backspace (empty input) pops the last chip.\n */\nexport function MultiSelect({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione\",\n helperText,\n error,\n disabled,\n maxItems,\n filter = defaultFilter,\n emptyMessage = \"Nenhuma opção encontrada\",\n className,\n}: MultiSelectProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const selectedSet = useMemo(() => new Set(value), [value]);\n const selectedOptions = useMemo(\n () =>\n value\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is MultiSelectOption => Boolean(o)),\n [value, options],\n );\n const filtered = useMemo(\n () => options.filter((o) => filter(o, query)),\n [options, filter, query],\n );\n\n const atMax = maxItems !== undefined && value.length >= maxItems;\n\n const toggle = useCallback(\n (option: MultiSelectOption): void => {\n if (option.disabled) return;\n if (selectedSet.has(option.value)) {\n onChange(value.filter((v) => v !== option.value));\n } else {\n if (atMax) return;\n onChange([...value, option.value]);\n }\n setQuery(\"\");\n inputRef.current?.focus();\n },\n [selectedSet, onChange, value, atMax],\n );\n\n const removeAt = useCallback(\n (optionValue: string): void => {\n onChange(value.filter((v) => v !== optionValue));\n },\n [onChange, value],\n );\n\n useEffect(() => {\n if (!open) return;\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => window.removeEventListener(\"mousedown\", onDown);\n }, [open]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => Math.min(filtered.length - 1, current + 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((current) => Math.max(0, current - 1));\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const option = filtered[activeIndex];\n if (option) toggle(option);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n setQuery(\"\");\n } else if (event.key === \"Backspace\" && query === \"\" && value.length > 0) {\n removeAt(value[value.length - 1]);\n }\n };\n\n return (\n <div ref={rootRef} className={cn(styles.wrapper, error && styles.error, className)}>\n {label && (\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n )}\n <div\n className={cn(styles.field, disabled && styles.disabled)}\n onMouseDown={(event) => {\n if (disabled) return;\n // Keep focus on the input when clicking empty field space.\n if (event.target === event.currentTarget) {\n event.preventDefault();\n inputRef.current?.focus();\n setOpen(true);\n }\n }}\n >\n {selectedOptions.map((option) => (\n <span key={option.value} className={styles.chip}>\n {option.label}\n <button\n type=\"button\"\n className={styles.chipRemove}\n aria-label={`Remover ${option.label}`}\n disabled={disabled}\n onMouseDown={(event) => {\n event.preventDefault();\n removeAt(option.value);\n }}\n >\n ×\n </button>\n </span>\n ))}\n <input\n id={id}\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={`${id}-listbox`}\n aria-autocomplete=\"list\"\n className={styles.input}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n value={query}\n onFocus={() => setOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n {open && (\n <ul\n id={`${id}-listbox`}\n role=\"listbox\"\n aria-multiselectable\n className={styles.menu}\n >\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n filtered.map((option, index) => {\n const isSelected = selectedSet.has(option.value);\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || (!isSelected && atMax)}\n className={cn(\n styles.option,\n index === activeIndex && styles.active,\n isSelected && styles.selected,\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n toggle(option);\n }}\n >\n <span className={styles.check} aria-hidden>\n {isSelected ? \"✓\" : \"\"}\n </span>\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DateRangePicker.module.css\";\n\nexport type WeekStart = 0 | 1;\n\n/** A selected range. Either bound may be `null` while picking. */\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\nexport interface DateRangePickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected range. */\n value: DateRange;\n /** Called with the new range as the user picks start then end. */\n onChange: (range: DateRange) => void;\n /** How many month grids to show side by side. Default `2`. */\n numberOfMonths?: number;\n /** Initial visible month (uncontrolled). Defaults to the range start or today. */\n defaultMonth?: Date;\n minDate?: Date;\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst DAYS_IN_GRID = 42;\n\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction addMonths(date: Date, offset: number): Date {\n return makeDate(date.getFullYear(), date.getMonth() + offset, 1);\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/** Inclusive-exclusive-agnostic \"strictly between a and b\" (a/b order-independent). */\nfunction isBetween(date: Date, a: Date, b: Date): boolean {\n const t = startOfDay(date).getTime();\n const lo = Math.min(startOfDay(a).getTime(), startOfDay(b).getTime());\n const hi = Math.max(startOfDay(a).getTime(), startOfDay(b).getTime());\n return t > lo && t < hi;\n}\n\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstWeekday = makeDate(year, monthIndex, 1).getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n return Array.from({ length: DAYS_IN_GRID }, (_, i) =>\n makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i),\n );\n}\n\n/**\n * Date-range picker: pick a start day, then an end day, across one or more\n * month grids. The hovered day previews the range before the end is committed.\n * Pure `Date` math — no date libraries. For a single date, use `Calendar`.\n *\n * Selection: first click sets `start` (clears `end`); the next click sets `end`\n * (auto-ordered if you click earlier than the start); a third click starts over.\n */\nexport function DateRangePicker({\n value,\n onChange,\n numberOfMonths = 2,\n defaultMonth,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: DateRangePickerProps) {\n const [visibleMonth, setVisibleMonth] = useState<Date>(() => {\n const base = defaultMonth ?? value.start ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const [hovered, setHovered] = useState<Date | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const weekdayLabels = useMemo(\n () => Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]),\n [weekStartsOn],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n const { start, end } = value;\n if (!start || end) {\n onChange({ start: date, end: null });\n } else if (startOfDay(date).getTime() < startOfDay(start).getTime()) {\n onChange({ start: date, end: start });\n } else {\n onChange({ start, end: date });\n }\n },\n [value, onChange, minDate, maxDate],\n );\n\n const changeMonth = useCallback((offset: number): void => {\n setVisibleMonth((current) => addMonths(current, offset));\n }, []);\n\n // Effective end used for preview highlighting (hovered day while picking).\n const previewEnd = value.start && !value.end ? hovered : value.end;\n\n function dayState(date: Date): {\n selected: boolean;\n inRange: boolean;\n isStart: boolean;\n isEnd: boolean;\n } {\n const { start } = value;\n const end = previewEnd;\n const isStart = start ? isSameDay(date, start) : false;\n const isEnd = end ? isSameDay(date, end) : false;\n const inRange = start && end ? isBetween(date, start, end) : false;\n return { selected: isStart || isEnd, inRange, isStart, isEnd };\n }\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.headerSpacer} aria-hidden />\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.months} onMouseLeave={() => setHovered(null)}>\n {Array.from({ length: Math.max(1, numberOfMonths) }, (_, monthOffset) => {\n const month = addMonths(visibleMonth, monthOffset);\n const cells = buildGrid(month, weekStartsOn);\n return (\n <div key={monthOffset} className={styles.month}>\n <div className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[month.getMonth()]} {month.getFullYear()}\n </div>\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span\n key={label}\n className={styles.weekday}\n role=\"columnheader\"\n >\n {label}\n </span>\n ))}\n </div>\n <div className={styles.grid} role=\"grid\">\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === month.getMonth();\n const disabled = isOutOfRange(date, minDate, maxDate);\n const { selected, inRange, isStart, isEnd } = dayState(date);\n const isToday = isSameDay(date, today);\n return (\n <button\n key={index}\n type=\"button\"\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n inRange && styles.inRange,\n selected && styles.selected,\n isStart && styles.rangeStart,\n isEnd && styles.rangeEnd,\n isToday && styles.today,\n )}\n aria-label={`${MONTH_LABELS[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`}\n aria-selected={selected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n onClick={() => selectDate(date)}\n onMouseEnter={() => setHovered(date)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NavigationMenu.module.css\";\n\nexport interface NavigationMenuItem {\n /** Visible label for the entry. */\n label: ReactNode;\n /** When set, the entry renders as an anchor. */\n href?: string;\n /** Invoked when the entry is activated (click / Enter). */\n onSelect?: () => void;\n /** Nested entries — presence turns the item into a submenu trigger. */\n children?: NavigationMenuItem[];\n}\n\nexport interface NavigationMenuProps extends HTMLAttributes<HTMLElement> {\n /** Top-level navigation entries. */\n items: NavigationMenuItem[];\n}\n\n/**\n * Horizontal navigation menu with hover/click/focus dropdown submenus.\n *\n * - Top-level items render in a `<nav><ul>`.\n * - Items with `children` open a submenu panel (`role=\"menu\"`) on hover, focus,\n * or click. Only one panel is open at a time.\n * - Closes on outside click, Escape, or selecting a leaf entry.\n *\n * @example\n * <NavigationMenu\n * items={[\n * { label: \"Home\", href: \"/\" },\n * {\n * label: \"Products\",\n * children: [\n * { label: \"Analytics\", href: \"/analytics\" },\n * { label: \"Billing\", onSelect: () => openBilling() },\n * ],\n * },\n * ]}\n * />\n */\nexport function NavigationMenu({ items, className, ...props }: NavigationMenuProps) {\n const [clickedIndex, setClickedIndex] = useState<number>(-1);\n const [hovered, setHovered] = useState<number>(-1);\n const baseId = useId();\n const rootRef = useRef<HTMLElement>(null);\n\n const close = useCallback((): void => {\n setClickedIndex(-1);\n setHovered(-1);\n }, []);\n\n const openIndex = clickedIndex !== -1 ? clickedIndex : hovered;\n\n useEffect(() => {\n if (openIndex === -1) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") close();\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [openIndex, close]);\n\n const renderLeaf = (item: NavigationMenuItem, role: \"none\" | \"menuitem\"): ReactNode => {\n const handleClick = (): void => {\n item.onSelect?.();\n close();\n };\n if (item.href) {\n return (\n <a\n href={item.href}\n role={role === \"menuitem\" ? \"menuitem\" : undefined}\n className={styles.link}\n onClick={handleClick}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n type=\"button\"\n role={role === \"menuitem\" ? \"menuitem\" : undefined}\n className={styles.link}\n onClick={handleClick}\n >\n {item.label}\n </button>\n );\n };\n\n return (\n <nav ref={rootRef} className={cn(styles.root, className)} {...props}>\n <ul className={styles.list}>\n {items.map((item, index) => {\n const hasChildren = !!item.children && item.children.length > 0;\n if (!hasChildren) {\n return (\n <li key={index} className={styles.item}>\n {renderLeaf(item, \"none\")}\n </li>\n );\n }\n const open = openIndex === index;\n const panelId = `${baseId}-panel-${index}`;\n return (\n <li\n key={index}\n className={styles.item}\n onMouseEnter={() => setHovered(index)}\n onMouseLeave={() => setHovered((prev) => (prev === index ? -1 : prev))}\n >\n <button\n type=\"button\"\n className={styles.trigger}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() =>\n setClickedIndex((prev) => (prev === index ? -1 : index))\n }\n onFocus={() => setHovered(index)}\n >\n {item.label}\n </button>\n {open && (\n <ul id={panelId} role=\"menu\" className={styles.panel}>\n {item.children!.map((child, childIndex) => (\n <li key={childIndex} role=\"none\" className={styles.subItem}>\n {renderLeaf(child, \"menuitem\")}\n </li>\n ))}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Menubar.module.css\";\n\nexport type MenubarItem =\n | {\n /** Visible label for the action. */\n label: ReactNode;\n /** Invoked when the action is selected. */\n onSelect?: () => void;\n /** Disable the action. */\n disabled?: boolean;\n /** Optional shortcut hint rendered right-aligned (e.g. `\"⌘S\"`). */\n shortcut?: string;\n }\n | { separator: true };\n\nexport interface MenubarMenu {\n /** Top-level menu label (e.g. `\"File\"`). */\n label: ReactNode;\n /** Items shown in the menu's dropdown. */\n items: MenubarItem[];\n}\n\nexport interface MenubarProps extends HTMLAttributes<HTMLDivElement> {\n /** Top-level menus rendered left-to-right. */\n menus: MenubarMenu[];\n}\n\nfunction isSeparator(item: MenubarItem): item is { separator: true } {\n return \"separator\" in item;\n}\n\n/**\n * Application menubar (File / Edit-style).\n *\n * - `role=\"menubar\"`; each menu is a button that opens a dropdown.\n * - Arrow Left/Right moves between menus (wrapping); opening one closes others.\n * - Closes on outside click, Escape, or selecting an item.\n * - Items may carry a `shortcut` (right-aligned) or be a `{ separator: true }`.\n *\n * @example\n * <Menubar\n * menus={[\n * {\n * label: \"File\",\n * items: [\n * { label: \"New\", shortcut: \"⌘N\", onSelect: () => create() },\n * { separator: true },\n * { label: \"Quit\", onSelect: () => quit() },\n * ],\n * },\n * ]}\n * />\n */\nexport function Menubar({ menus, className, ...props }: MenubarProps) {\n const [openIndex, setOpenIndex] = useState<number>(-1);\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const close = useCallback((): void => {\n setOpenIndex(-1);\n }, []);\n\n useEffect(() => {\n if (openIndex === -1) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n triggerRefs.current[openIndex]?.focus();\n return;\n }\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n const next = (openIndex + 1) % menus.length;\n setOpenIndex(next);\n triggerRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n const prev = (openIndex - 1 + menus.length) % menus.length;\n setOpenIndex(prev);\n triggerRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [openIndex, menus.length, close]);\n\n return (\n <div ref={rootRef} role=\"menubar\" className={cn(styles.root, className)} {...props}>\n {menus.map((menu, index) => {\n const open = openIndex === index;\n const panelId = `${baseId}-panel-${index}`;\n return (\n <div key={index} className={styles.menu}>\n <button\n ref={(el) => {\n triggerRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? panelId : undefined}\n className={cn(styles.trigger, open && styles.triggerOpen)}\n onClick={() => setOpenIndex((prev) => (prev === index ? -1 : index))}\n >\n {menu.label}\n </button>\n {open && (\n <ul id={panelId} role=\"menu\" className={styles.panel}>\n {menu.items.map((item, itemIndex) => {\n if (isSeparator(item)) {\n return (\n <li\n key={itemIndex}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={itemIndex} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles.item}\n disabled={item.disabled}\n onClick={() => {\n item.onSelect?.();\n close();\n }}\n >\n <span className={styles.itemLabel}>\n {item.label}\n </span>\n {item.shortcut && (\n <span className={styles.shortcut}>\n {item.shortcut}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Carousel.module.css\";\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Slides — one rendered at a time. */\n children: ReactNode[];\n /** Wrap around at the ends instead of stopping. Default `false`. */\n loop?: boolean;\n /** Show prev/next arrow buttons. Default `true`. */\n showArrows?: boolean;\n /** Show dot indicators. Default `true`. */\n showDots?: boolean;\n /** Controlled active index. */\n index?: number;\n /** Initial index for uncontrolled use. Default `0`. */\n defaultIndex?: number;\n /** Called whenever the active index changes. */\n onIndexChange?: (index: number) => void;\n}\n\n/**\n * Horizontal content slider showing one slide at a time.\n *\n * - Track translates by the active index (`translateX(-index * 100%)`).\n * - Prev/next arrows (disabled at the ends unless `loop`); dot indicators jump.\n * - Controlled (`index`) or uncontrolled (`defaultIndex`).\n * - Arrow Left/Right on the focused region navigates.\n *\n * @example\n * <Carousel loop>\n * <img src=\"/1.jpg\" alt=\"\" />\n * <img src=\"/2.jpg\" alt=\"\" />\n * <img src=\"/3.jpg\" alt=\"\" />\n * </Carousel>\n */\nexport function Carousel({\n children,\n loop = false,\n showArrows = true,\n showDots = true,\n index,\n defaultIndex = 0,\n onIndexChange,\n className,\n ...props\n}: CarouselProps) {\n const count = children.length;\n const isControlled = index !== undefined;\n const [internalIndex, setInternalIndex] = useState<number>(defaultIndex);\n const current = isControlled ? index : internalIndex;\n\n const goTo = useCallback(\n (next: number): void => {\n let target = next;\n if (target < 0) target = loop ? count - 1 : 0;\n else if (target >= count) target = loop ? 0 : count - 1;\n if (target === current) return;\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [count, loop, current, isControlled, onIndexChange],\n );\n\n const atStart = current <= 0;\n const atEnd = current >= count - 1;\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n goTo(current + 1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n goTo(current - 1);\n }\n };\n\n return (\n <div\n role=\"region\"\n aria-roledescription=\"carousel\"\n tabIndex={0}\n className={cn(styles.root, className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <div className={styles.viewport}>\n <div\n className={styles.track}\n style={{ transform: `translateX(-${current * 100}%)` }}\n >\n {children.map((slide, slideIndex) => (\n <div\n key={slideIndex}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${slideIndex + 1} of ${count}`}\n aria-hidden={slideIndex !== current}\n className={styles.slide}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <button\n type=\"button\"\n className={cn(styles.arrow, styles.prev)}\n aria-label=\"Previous slide\"\n disabled={!loop && atStart}\n onClick={() => goTo(current - 1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className={cn(styles.arrow, styles.next)}\n aria-label=\"Next slide\"\n disabled={!loop && atEnd}\n onClick={() => goTo(current + 1)}\n >\n ›\n </button>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className={styles.dots} role=\"tablist\" aria-label=\"Slides\">\n {children.map((_, dotIndex) => (\n <button\n key={dotIndex}\n type=\"button\"\n role=\"tab\"\n aria-label={`Go to slide ${dotIndex + 1}`}\n aria-selected={dotIndex === current}\n className={cn(styles.dot, dotIndex === current && styles.dotActive)}\n onClick={() => goTo(dotIndex)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\n\nexport interface UsePaginationResult {\n page: number;\n size: number;\n setPage: (page: number) => void;\n setSize: (size: number) => void;\n reset: () => void;\n}\n\n/**\n * Manage page/size state for paginated lists. Reset goes back to page 1\n * without touching the page size.\n *\n * @param initialPage - Starting page (default 1).\n * @param initialSize - Starting page size (default 50).\n * @returns Pagination state and setters.\n */\nexport function usePagination(initialPage = 1, initialSize = 50): UsePaginationResult {\n const [page, setPage] = useState<number>(initialPage);\n const [size, setSize] = useState<number>(initialSize);\n\n const reset = useCallback(() => setPage(1), []);\n\n return { page, size, setPage, setSize, reset };\n}\n","import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Subscribe to a CSS media query and re-render on match changes.\n *\n * @param query - A standard CSS media query string, e.g. \"(max-width: 768px)\".\n * @returns True when the query matches.\n */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const list = window.matchMedia(query);\n const handler = (event: MediaQueryListEvent): void => setMatches(event.matches);\n setMatches(list.matches);\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n }, [query]);\n\n return matches;\n}\n","import { useEffect, useRef } from \"react\";\n\ntype AnyEventTarget = EventTarget | { current: EventTarget | null } | null | undefined;\n\n/**\n * Subscribe to a DOM event with React-friendly semantics.\n *\n * - Handler is stored in a ref so callers can pass inline functions without\n * resubscribing on every render.\n * - `target` defaults to `window`. Accepts a raw `EventTarget` (window, document,\n * element) OR a ref pointing at one.\n * - Returns nothing — cleanup is automatic on unmount or when `eventName`/`target` change.\n */\nexport function useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener<K extends keyof HTMLElementEventMap>(\n eventName: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener(\n eventName: string,\n handler: (event: Event) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const resolvedTarget: EventTarget | null =\n target === undefined\n ? typeof window === \"undefined\"\n ? null\n : window\n : \"current\" in (target as { current: unknown })\n ? ((target as { current: EventTarget | null }).current ?? null)\n : (target as EventTarget | null);\n\n if (!resolvedTarget?.addEventListener) return;\n\n const listener: EventListener = (event) => handlerRef.current(event);\n resolvedTarget.addEventListener(eventName, listener, options);\n return () => resolvedTarget.removeEventListener(eventName, listener, options);\n }, [eventName, target, options]);\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* swallow quota/exceptions */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* ignore */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* ignore malformed remote value */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n","import { useCallback, useState } from \"react\";\n\nexport interface ToggleHelpers {\n toggle: () => void;\n setTrue: () => void;\n setFalse: () => void;\n set: (next: boolean) => void;\n}\n\n/**\n * Boolean state with `toggle`/`setTrue`/`setFalse` helpers.\n *\n * @param initial - initial value (default `false`).\n * @returns Tuple `[value, helpers]`.\n */\nexport function useToggle(initial = false): [boolean, ToggleHelpers] {\n const [value, setValue] = useState<boolean>(initial);\n\n const toggle = useCallback((): void => setValue((current) => !current), []);\n const setTrue = useCallback((): void => setValue(true), []);\n const setFalse = useCallback((): void => setValue(false), []);\n const set = useCallback((next: boolean): void => setValue(next), []);\n\n return [value, { toggle, setTrue, setFalse, set }];\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useRef(asyncFn);\n fnRef.current = asyncFn;\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, []);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Track the browser's `navigator.onLine` value and re-render on changes.\n * Returns `true` during SSR (assumption: server is online).\n */\nexport function useOnline(): boolean {\n const [online, setOnline] = useState<boolean>(() =>\n typeof navigator === \"undefined\" ? true : navigator.onLine,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handleOnline = (): void => setOnline(true);\n const handleOffline = (): void => setOnline(false);\n window.addEventListener(\"online\", handleOnline);\n window.addEventListener(\"offline\", handleOffline);\n return () => {\n window.removeEventListener(\"online\", handleOnline);\n window.removeEventListener(\"offline\", handleOffline);\n };\n }, []);\n\n return online;\n}\n","import { useEffect, useState } from \"react\";\n\nexport type DocumentVisibility = \"visible\" | \"hidden\";\n\n/** Subscribe to `document.visibilityState`. Returns `\"visible\"` during SSR. */\nexport function useDocumentVisibility(): DocumentVisibility {\n const [state, setState] = useState<DocumentVisibility>(() =>\n typeof document === \"undefined\"\n ? \"visible\"\n : (document.visibilityState as DocumentVisibility),\n );\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const handler = (): void => setState(document.visibilityState as DocumentVisibility);\n document.addEventListener(\"visibilitychange\", handler);\n return () => document.removeEventListener(\"visibilitychange\", handler);\n }, []);\n\n return state;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface ElementSize {\n width: number;\n height: number;\n}\n\n/**\n * Track size changes of a DOM element via `ResizeObserver`.\n * Returns `null` until the first measurement.\n */\nexport function useResizeObserver(ref: RefObject<Element | null>): ElementSize | null {\n const [size, setSize] = useState<ElementSize | null>(null);\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const box = entry.contentRect;\n setSize({ width: box.width, height: box.height });\n });\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref]);\n\n return size;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n","import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n","import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n","import { useEffect, useState } from \"react\";\n\nexport interface GeolocationState {\n loading: boolean;\n error: GeolocationPositionError | null;\n coords: GeolocationCoordinates | null;\n timestamp: number | null;\n}\n\nexport interface UseGeolocationOptions extends PositionOptions {\n /** Use `watchPosition` instead of one-shot `getCurrentPosition`. Default: false. */\n watch?: boolean;\n /** Disable the hook without unmounting. Default: false. */\n disabled?: boolean;\n}\n\n/** React hook around the Geolocation API. */\nexport function useGeolocation(options: UseGeolocationOptions = {}): GeolocationState {\n const { watch = false, disabled = false, ...positionOptions } = options;\n const [state, setState] = useState<GeolocationState>({\n loading: !disabled,\n error: null,\n coords: null,\n timestamp: null,\n });\n\n useEffect(() => {\n if (disabled || typeof navigator === \"undefined\" || !navigator.geolocation) {\n setState((prev) => ({ ...prev, loading: false }));\n return;\n }\n\n const onSuccess = (position: GeolocationPosition): void => {\n setState({\n loading: false,\n error: null,\n coords: position.coords,\n timestamp: position.timestamp,\n });\n };\n const onError = (error: GeolocationPositionError): void => {\n setState((prev) => ({ ...prev, loading: false, error }));\n };\n\n if (watch) {\n const watchId = navigator.geolocation.watchPosition(\n onSuccess,\n onError,\n positionOptions,\n );\n return () => navigator.geolocation.clearWatch(watchId);\n }\n\n navigator.geolocation.getCurrentPosition(onSuccess, onError, positionOptions);\n return undefined;\n }, [\n disabled,\n watch,\n positionOptions.enableHighAccuracy,\n positionOptions.maximumAge,\n positionOptions.timeout,\n ]);\n\n return state;\n}\n","import { useEffect } from \"react\";\n\n/**\n * Lock `<body>` scroll while `active` is true. Restores the previous overflow\n * value on unmount. Safe to nest: stacks the restoration via a counter.\n */\nexport function useScrollLock(active: boolean): void {\n useEffect(() => {\n if (!active || typeof document === \"undefined\") return;\n const body = document.body;\n const previous = body.style.overflow;\n body.style.overflow = \"hidden\";\n return () => {\n body.style.overflow = previous;\n };\n }, [active]);\n}\n","import { useCallback, useRef } from \"react\";\n\n/**\n * Returns a stable function reference that always invokes the latest\n * `callback` argument. Use to break dependency cycles in effects without\n * triggering re-runs when the callback identity changes.\n */\nexport function useStableCallback<TArgs extends unknown[], TReturn>(\n callback: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const ref = useRef(callback);\n ref.current = callback;\n return useCallback((...args: TArgs) => ref.current(...args), []);\n}\n","import { useRef } from \"react\";\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Return the value from the previous render. `undefined` on the first render.\n *\n * @example\n * const previousCount = usePrevious(count);\n * useEffect(() => {\n * if (previousCount !== undefined && previousCount !== count) {\n * analytics.track(\"count.changed\", { from: previousCount, to: count });\n * }\n * }, [count, previousCount]);\n */\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Run a callback after `delay` ms. Pass `null` to disable. Resets when\n * `delay` changes; the callback ref always points at the latest closure.\n *\n * @example\n * useTimeout(() => setShow(false), show ? 3000 : null);\n */\nexport function useTimeout(fn: () => void, delay: number | null): void {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n if (delay === null) return;\n const id = setTimeout(() => fnRef.current(), delay);\n return () => clearTimeout(id);\n }, [delay]);\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Return a value that updates at most once every `delay` ms. Complements\n * `useDebounce` — throttle emits on the leading edge and again after the\n * interval; debounce only emits after a period of stillness.\n *\n * @example\n * const throttledScroll = useThrottle(scrollY, 100);\n */\nexport function useThrottle<T>(value: T, delay: number): T {\n const [throttled, setThrottled] = useState<T>(value);\n const lastEmitRef = useRef<number>(0);\n const pendingRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const now = Date.now();\n const elapsed = now - lastEmitRef.current;\n if (elapsed >= delay) {\n lastEmitRef.current = now;\n setThrottled(value);\n } else {\n if (pendingRef.current) clearTimeout(pendingRef.current);\n pendingRef.current = setTimeout(() => {\n lastEmitRef.current = Date.now();\n setThrottled(value);\n }, delay - elapsed);\n }\n return () => {\n if (pendingRef.current) clearTimeout(pendingRef.current);\n };\n }, [value, delay]);\n\n return throttled;\n}\n","import { useEffect, useState } from \"react\";\n\nexport interface WindowSize {\n width: number;\n height: number;\n}\n\n/**\n * Reactive window dimensions. SSR-safe — returns `{ width: 0, height: 0 }`\n * until the first client render.\n *\n * @example\n * const { width, height } = useWindowSize();\n * const columns = width < 640 ? 1 : width < 1024 ? 2 : 3;\n */\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>(() =>\n typeof window === \"undefined\"\n ? { width: 0, height: 0 }\n : { width: window.innerWidth, height: window.innerHeight },\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void =>\n setSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n return size;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\n/**\n * Track whether the pointer is hovering over the referenced element.\n * Returns `false` on touch-only devices (no pointer hover).\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const hovered = useHover(ref);\n * return <div ref={ref}>{hovered ? \"✨\" : \"\"}</div>;\n */\nexport function useHover<T extends HTMLElement>(ref: RefObject<T | null>): boolean {\n const [hovered, setHovered] = useState<boolean>(false);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n const onEnter = (): void => setHovered(true);\n const onLeave = (): void => setHovered(false);\n node.addEventListener(\"mouseenter\", onEnter);\n node.addEventListener(\"mouseleave\", onLeave);\n return () => {\n node.removeEventListener(\"mouseenter\", onEnter);\n node.removeEventListener(\"mouseleave\", onLeave);\n };\n }, [ref]);\n\n return hovered;\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseLongPressOptions {\n /** Press duration in ms. Default `500`. */\n delay?: number;\n /** Pixel threshold — finger/mouse movement beyond this cancels the press. Default `10`. */\n moveThreshold?: number;\n}\n\n/**\n * Detect long-press / long-tap gestures. Fires `fn` after `delay` ms\n * while the element is held. Cancels on move beyond `moveThreshold` or\n * pointer up before `delay`.\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * useLongPress(ref, () => openContextMenu(), { delay: 600 });\n */\nexport function useLongPress<T extends HTMLElement>(\n ref: RefObject<T | null>,\n fn: () => void,\n options: UseLongPressOptions = {},\n): void {\n const { delay = 500, moveThreshold = 10 } = options;\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let startX = 0;\n let startY = 0;\n\n const cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const onDown = (event: PointerEvent): void => {\n startX = event.clientX;\n startY = event.clientY;\n cancel();\n timer = setTimeout(() => {\n timer = null;\n fnRef.current();\n }, delay);\n };\n\n const onMove = (event: PointerEvent): void => {\n if (timer === null) return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (Math.hypot(dx, dy) > moveThreshold) cancel();\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n node.addEventListener(\"pointermove\", onMove);\n node.addEventListener(\"pointerup\", cancel);\n node.addEventListener(\"pointercancel\", cancel);\n node.addEventListener(\"pointerleave\", cancel);\n return () => {\n cancel();\n node.removeEventListener(\"pointerdown\", onDown);\n node.removeEventListener(\"pointermove\", onMove);\n node.removeEventListener(\"pointerup\", cancel);\n node.removeEventListener(\"pointercancel\", cancel);\n node.removeEventListener(\"pointerleave\", cancel);\n };\n }, [ref, delay, moveThreshold]);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface DisclosureHandlers {\n open: () => void;\n close: () => void;\n toggle: () => void;\n}\n\n/**\n * Manage open/closed boolean state with stable `open`/`close`/`toggle` handlers.\n *\n * Richer than {@link useToggle} for UI elements like modals, drawers and\n * popovers: the handlers are referentially stable across renders.\n *\n * @param initial - initial opened state (default `false`).\n * @returns Tuple `[opened, { open, close, toggle }]`.\n */\nexport function useDisclosure(initial = false): [boolean, DisclosureHandlers] {\n const [opened, setOpened] = useState<boolean>(initial);\n\n const open = useCallback((): void => setOpened(true), []);\n const close = useCallback((): void => setOpened(false), []);\n const toggle = useCallback((): void => setOpened((current) => !current), []);\n\n const handlers = useMemo<DisclosureHandlers>(\n () => ({ open, close, toggle }),\n [open, close, toggle],\n );\n\n return [opened, handlers];\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n","import { useEffect } from \"react\";\n\n/**\n * Set `document.title` while the component is mounted, restoring the previous\n * title on unmount. SSR-safe — no-op when `document` is unavailable.\n *\n * @param title - the title to apply.\n */\nexport function useDocumentTitle(title: string): void {\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const previous = document.title;\n document.title = title;\n return () => {\n document.title = previous;\n };\n }, [title]);\n}\n","import { useEffect } from \"react\";\n\n/**\n * Swap the document favicon by updating the `<link rel=\"icon\">` href.\n * Creates the link element when it is missing. SSR-safe — no-op when\n * `document` is unavailable.\n *\n * @param href - the favicon URL to apply.\n */\nexport function useFavicon(href: string): void {\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = href;\n }, [href]);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseMapResult<K, V> {\n map: ReadonlyMap<K, V>;\n set: (key: K, value: V) => void;\n delete: (key: K) => void;\n clear: () => void;\n get: (key: K) => V | undefined;\n has: (key: K) => boolean;\n size: number;\n}\n\n/**\n * Reactive `Map` wrapper. Mutating via `set` / `delete` / `clear` triggers a\n * re-render and yields a fresh `map` reference each time.\n *\n * @typeParam K - key type.\n * @typeParam V - value type.\n * @param initial - initial entries.\n * @returns `{ map, set, delete, clear, get, has, size }`.\n */\nexport function useMap<K, V>(initial?: Iterable<readonly [K, V]>): UseMapResult<K, V> {\n const [map, setMap] = useState<Map<K, V>>(() => new Map(initial));\n\n const set = useCallback((key: K, value: V): void => {\n setMap((current) => {\n const next = new Map(current);\n next.set(key, value);\n return next;\n });\n }, []);\n\n const remove = useCallback((key: K): void => {\n setMap((current) => {\n if (!current.has(key)) return current;\n const next = new Map(current);\n next.delete(key);\n return next;\n });\n }, []);\n\n const clear = useCallback((): void => {\n setMap((current) => (current.size === 0 ? current : new Map<K, V>()));\n }, []);\n\n const get = useCallback((key: K): V | undefined => map.get(key), [map]);\n const has = useCallback((key: K): boolean => map.has(key), [map]);\n\n return useMemo<UseMapResult<K, V>>(\n () => ({\n map,\n set,\n delete: remove,\n clear,\n get,\n has,\n size: map.size,\n }),\n [map, set, remove, clear, get, has],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseSetResult<T> {\n set: ReadonlySet<T>;\n add: (value: T) => void;\n delete: (value: T) => void;\n clear: () => void;\n has: (value: T) => boolean;\n toggle: (value: T) => void;\n size: number;\n}\n\n/**\n * Reactive `Set` wrapper. Mutating via `add` / `delete` / `clear` / `toggle`\n * triggers a re-render and yields a fresh `set` reference each time.\n *\n * @typeParam T - element type.\n * @param initial - initial values.\n * @returns `{ set, add, delete, clear, has, toggle, size }`.\n */\nexport function useSet<T>(initial?: Iterable<T>): UseSetResult<T> {\n const [set, setSet] = useState<Set<T>>(() => new Set(initial));\n\n const add = useCallback((value: T): void => {\n setSet((current) => {\n if (current.has(value)) return current;\n const next = new Set(current);\n next.add(value);\n return next;\n });\n }, []);\n\n const remove = useCallback((value: T): void => {\n setSet((current) => {\n if (!current.has(value)) return current;\n const next = new Set(current);\n next.delete(value);\n return next;\n });\n }, []);\n\n const clear = useCallback((): void => {\n setSet((current) => (current.size === 0 ? current : new Set<T>()));\n }, []);\n\n const has = useCallback((value: T): boolean => set.has(value), [set]);\n\n const toggle = useCallback((value: T): void => {\n setSet((current) => {\n const next = new Set(current);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n });\n }, []);\n\n return useMemo<UseSetResult<T>>(\n () => ({\n set,\n add,\n delete: remove,\n clear,\n has,\n toggle,\n size: set.size,\n }),\n [set, add, remove, clear, has, toggle],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseQueueOptions<T> {\n initialValues?: T[];\n limit?: number;\n}\n\nexport interface UseQueueResult<T> {\n /** Items currently held within the queue (up to `limit`). */\n queue: T[];\n /** Append items; overflow beyond `limit` is held back, not dropped. */\n add: (...items: T[]) => void;\n /** Replace the held queue via a mapper over the current held items. */\n update: (fn: (state: T[]) => T[]) => void;\n /** Drop all currently held (visible) items, keeping any overflow. */\n cleanQueue: () => void;\n /** Number of visible items in the queue. */\n size: number;\n}\n\n/**\n * FIFO queue with an optional `limit`. When more items are added than `limit`\n * allows, the surplus is kept in an internal overflow buffer and surfaces into\n * `queue` as room frees up (e.g. after `cleanQueue`). Loosely mirrors Mantine's\n * `useQueue` shape.\n *\n * @typeParam T - element type.\n * @param options - `initialValues` and `limit` (default limit `Infinity`).\n * @returns `{ queue, add, update, cleanQueue, size }`.\n */\nexport function useQueue<T>(options: UseQueueOptions<T> = {}): UseQueueResult<T> {\n const { initialValues = [], limit = Infinity } = options;\n\n const [state, setState] = useState<{ queue: T[]; overflow: T[] }>(() => ({\n queue: initialValues.slice(0, limit),\n overflow: initialValues.slice(limit),\n }));\n\n const add = useCallback(\n (...items: T[]): void => {\n setState((current) => {\n const all = [...current.queue, ...current.overflow, ...items];\n return {\n queue: all.slice(0, limit),\n overflow: all.slice(limit),\n };\n });\n },\n [limit],\n );\n\n const update = useCallback(\n (fn: (queueState: T[]) => T[]): void => {\n setState((current) => {\n const all = [...fn(current.queue), ...current.overflow];\n return {\n queue: all.slice(0, limit),\n overflow: all.slice(limit),\n };\n });\n },\n [limit],\n );\n\n const cleanQueue = useCallback((): void => {\n setState((current) => ({\n queue: current.overflow.slice(0, limit),\n overflow: current.overflow.slice(limit),\n }));\n }, [limit]);\n\n return useMemo<UseQueueResult<T>>(\n () => ({\n queue: state.queue,\n add,\n update,\n cleanQueue,\n size: state.queue.length,\n }),\n [state.queue, add, update, cleanQueue],\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, []);\n\n return ref;\n}\n","import { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Create an object URL for a `Blob` (or `File`) and revoke it automatically on\n * unmount or whenever the blob changes. Returns `null` for nullish input.\n *\n * @param blob - the blob to expose as an object URL, or `null`/`undefined`.\n * @returns The object URL string, or `null` when there is no blob.\n */\nexport function useObjectUrl(blob: Blob | null | undefined): string | null {\n const [url, setUrl] = useState<string | null>(null);\n\n useEffect(() => {\n if (!blob) {\n setUrl(null);\n return;\n }\n const next = URL.createObjectURL(blob);\n setUrl(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n return url;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { usePagination } from \"@/hooks\";\nimport { Table, type TableAlign, type TableColumn, type TablePriority } from \"../Table\";\nimport { Pagination } from \"../Pagination\";\nimport { SearchBar } from \"../SearchBar\";\nimport styles from \"./DataTable.module.css\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface DataTableSort<T> {\n key: keyof T;\n direction: SortDirection;\n}\n\n/**\n * Column definition for {@link DataTable}. Extends the headless {@link Table}\n * column shape with a typed `key`, opt-in sorting, and the visual options that\n * are forwarded to the underlying Table cell.\n */\nexport interface DataTableColumn<T> {\n /** Property of the row this column reads from. Doubles as the cell key. */\n key: keyof T;\n /** Column heading. */\n header: ReactNode;\n /** Custom cell renderer. Defaults to `String(row[key])`. */\n render?: (row: T) => ReactNode;\n /** Enable click-to-sort on this column's header. */\n sortable?: boolean;\n /** Text alignment forwarded to the Table cell. */\n align?: TableAlign;\n /** Responsive visibility priority forwarded to the Table cell. */\n priority?: TablePriority;\n /** Fixed column width forwarded to the Table cell. */\n width?: string | number;\n}\n\nexport interface DataTableProps<T> extends HTMLAttributes<HTMLDivElement> {\n /** Full, unfiltered dataset. Sorting/filtering/pagination happen client-side. */\n data: T[];\n /** Column definitions. */\n columns: DataTableColumn<T>[];\n /** Rows per page. Default 10. */\n pageSize?: number;\n /** Render a search input above the table. Default false. */\n searchable?: boolean;\n /**\n * Keys to match the search term against. When omitted, every column whose\n * value is a string or number is searched.\n */\n searchKeys?: (keyof T)[];\n /** Initial sort applied before any header interaction. */\n initialSort?: DataTableSort<T>;\n /** Stable key extractor for rows. Defaults to the row index. */\n rowKey?: (row: T, index: number) => string | number;\n /** Content shown when no rows match. */\n emptyMessage?: ReactNode;\n}\n\n/**\n * Compare two arbitrary cell values with stable, type-aware ordering:\n * numbers numerically, dates by timestamp, everything else by `localeCompare`.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Negative when `a < b`, positive when `a > b`, zero when equal.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return String(a).localeCompare(String(b), undefined, { numeric: true });\n}\n\n/**\n * Stateful, headless data table built on top of {@link Table}. Adds\n * client-side searching, click-to-sort columns, and pagination while\n * delegating all table markup to the underlying Table component.\n *\n * - Clicking a sortable header cycles asc → desc → unsorted.\n * - Search matches a case-insensitive substring across `searchKeys`\n * (or every string/number column when not provided).\n * - Pagination is hidden when the result fits on a single page.\n */\nexport function DataTable<T>({\n data,\n columns,\n pageSize = 10,\n searchable = false,\n searchKeys,\n initialSort,\n rowKey = (_row, index) => index,\n emptyMessage,\n className,\n ...rest\n}: DataTableProps<T>) {\n const [search, setSearch] = useState<string>(\"\");\n const [sort, setSort] = useState<DataTableSort<T> | null>(initialSort ?? null);\n const { page, setPage } = usePagination(1, pageSize);\n\n const effectiveSearchKeys = useMemo<(keyof T)[]>(() => {\n if (searchKeys && searchKeys.length > 0) return searchKeys;\n return columns\n .filter((column) => {\n const sample = data.find((row) => row[column.key] != null);\n const value = sample ? sample[column.key] : undefined;\n return typeof value === \"string\" || typeof value === \"number\";\n })\n .map((column) => column.key);\n }, [searchKeys, columns, data]);\n\n const filtered = useMemo<T[]>(() => {\n const term = search.trim().toLowerCase();\n if (!term || !searchable) return data;\n return data.filter((row) =>\n effectiveSearchKeys.some((key) => {\n const value = row[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [data, search, searchable, effectiveSearchKeys]);\n\n const sorted = useMemo<T[]>(() => {\n if (!sort) return filtered;\n const factor = sort.direction === \"asc\" ? 1 : -1;\n return [...filtered].sort((a, b) => compareValues(a[sort.key], b[sort.key]) * factor);\n }, [filtered, sort]);\n\n const totalPages = Math.max(1, Math.ceil(sorted.length / pageSize));\n\n // Clamp the current page when the dataset shrinks (e.g. after filtering).\n useEffect(() => {\n if (page > totalPages) setPage(totalPages);\n }, [page, totalPages, setPage]);\n\n const safePage = Math.min(page, totalPages);\n const pageRows = useMemo<T[]>(() => {\n const start = (safePage - 1) * pageSize;\n return sorted.slice(start, start + pageSize);\n }, [sorted, safePage, pageSize]);\n\n function toggleSort(key: keyof T): void {\n setSort((current) => {\n if (!current || current.key !== key) return { key, direction: \"asc\" };\n if (current.direction === \"asc\") return { key, direction: \"desc\" };\n return null;\n });\n }\n\n const tableColumns = useMemo<TableColumn<T>[]>(\n () =>\n columns.map((column) => {\n const isSorted = sort?.key === column.key;\n const indicator = isSorted ? (sort?.direction === \"asc\" ? \" ▲\" : \" ▼\") : \"\";\n const header = column.sortable ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={() => toggleSort(column.key)}\n aria-label={`Ordenar por ${\n typeof column.header === \"string\" ? column.header : String(column.key)\n }`}\n >\n {column.header}\n <span className={styles.sortIndicator} aria-hidden>\n {indicator}\n </span>\n </button>\n ) : (\n column.header\n );\n\n return {\n key: String(column.key),\n header,\n align: column.align,\n priority: column.priority,\n width: column.width,\n render: column.render\n ? (row: T) => column.render!(row)\n : (row: T) => (row[column.key] as ReactNode) ?? null,\n };\n }),\n // toggleSort is stable enough for this memo; sort drives header re-render.\n [columns, sort],\n );\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n {searchable && (\n <SearchBar\n value={search}\n onChange={(value) => {\n setSearch(value);\n setPage(1);\n }}\n wrapperClassName={styles.search}\n />\n )}\n <Table\n columns={tableColumns}\n data={pageRows}\n rowKey={(row, index) => rowKey(row, (safePage - 1) * pageSize + index)}\n emptyMessage={emptyMessage}\n />\n {totalPages > 1 && (\n <Pagination\n page={safePage}\n totalPages={totalPages}\n onPageChange={setPage}\n totalItems={sorted.length}\n />\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ListTile.module.css\";\n\nexport interface ListTileProps {\n /** Left slot — typically an icon or avatar. */\n leading?: ReactNode;\n /** Primary line. Required. */\n title: ReactNode;\n /** Secondary line rendered under the title. */\n subtitle?: ReactNode;\n /** Right slot — typically an icon, switch or meta text. */\n trailing?: ReactNode;\n /** When provided, the tile becomes an interactive button. */\n onClick?: () => void;\n /** When true, the tile is dimmed and non-interactive. */\n disabled?: boolean;\n /** When true, the tile is highlighted as the active row. */\n selected?: boolean;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * The canonical Material list row: an optional leading slot, a title with an\n * optional subtitle, and an optional trailing slot. When `onClick` is supplied\n * the tile renders as a full-width, keyboard-accessible `<button>`; otherwise it\n * renders as a static `<div>`.\n *\n * @example\n * <ListTile\n * leading={<User />}\n * title=\"Maria Silva\"\n * subtitle=\"maria@example.com\"\n * trailing={<ChevronRight />}\n * onClick={() => open(user)}\n * />\n */\nexport function ListTile({\n leading,\n title,\n subtitle,\n trailing,\n onClick,\n disabled = false,\n selected = false,\n className,\n}: ListTileProps) {\n const content = (\n <>\n {leading !== undefined && <span className={styles.leading}>{leading}</span>}\n <span className={styles.body}>\n <span className={styles.title}>{title}</span>\n {subtitle !== undefined && <span className={styles.subtitle}>{subtitle}</span>}\n </span>\n {trailing !== undefined && <span className={styles.trailing}>{trailing}</span>}\n </>\n );\n\n const rootClassName = cn(\n styles.tile,\n selected && styles.selected,\n disabled && styles.disabled,\n className,\n );\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n className={cn(rootClassName, styles.interactive)}\n aria-pressed={selected ? true : undefined}\n disabled={disabled}\n onClick={onClick}\n >\n {content}\n </button>\n );\n }\n\n return <div className={rootClassName}>{content}</div>;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./FloatingActionButton.module.css\";\n\nexport type FloatingActionButtonPosition = \"bottom-right\" | \"bottom-left\" | \"none\";\nexport type FloatingActionButtonSize = \"sm\" | \"md\" | \"lg\";\nexport type FloatingActionButtonVariant = \"primary\" | \"surface\";\n\nexport interface FloatingActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Icon rendered inside the FAB. Required. */\n icon: ReactNode;\n /** When present, renders an extended (pill) FAB with icon + label. */\n label?: ReactNode;\n /** Corner placement, or `\"none\"` for static/inline. Default `\"bottom-right\"`. */\n position?: FloatingActionButtonPosition;\n /** Size token. Default `\"md\"`. */\n size?: FloatingActionButtonSize;\n /** Visual style. Default `\"primary\"`. */\n variant?: FloatingActionButtonVariant;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * Material Floating Action Button. Renders a round FAB when only an `icon` is\n * given, or an extended pill FAB when a `label` is also provided. By default it\n * is fixed to the bottom-right corner; set `position=\"none\"` to place it inline.\n *\n * Spreads all native `<button>` props (`onClick`, `disabled`, etc.).\n *\n * @remarks\n * Always pass an `aria-label` when there is no `label`, since an icon-only FAB\n * has no accessible name otherwise.\n *\n * @example\n * <FloatingActionButton icon={<Plus />} aria-label=\"Adicionar\" onClick={create} />\n *\n * @example\n * <FloatingActionButton icon={<Plus />} label=\"Novo\" onClick={create} />\n */\nexport function FloatingActionButton({\n icon,\n label,\n position = \"bottom-right\",\n size = \"md\",\n variant = \"primary\",\n className,\n ...props\n}: FloatingActionButtonProps) {\n const extended = label !== undefined;\n return (\n <button\n type=\"button\"\n className={cn(\n styles.fab,\n styles[size],\n styles[variant],\n extended ? styles.extended : styles.round,\n position !== \"none\" && styles.fixed,\n position === \"bottom-right\" && styles.bottomRight,\n position === \"bottom-left\" && styles.bottomLeft,\n className,\n )}\n {...props}\n >\n <span className={styles.icon}>{icon}</span>\n {extended && <span className={styles.label}>{label}</span>}\n </button>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NavigationRail.module.css\";\n\nexport interface NavigationRailItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered over the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport type NavigationRailLabelVisibility = \"all\" | \"selected\" | \"none\";\n\nexport interface NavigationRailProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: NavigationRailItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Top slot — e.g. a FAB or logo. */\n header?: ReactNode;\n /** Bottom slot — pushed to the bottom of the rail. */\n footer?: ReactNode;\n /** Which item labels to show. Default `\"all\"`. */\n labelVisibility?: NavigationRailLabelVisibility;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * Vertical, compact navigation column for desktop and tablet layouts. Each item\n * stacks an icon over its label, with the active item flagged via\n * `aria-current=\"page\"`. Use `labelVisibility=\"selected\"` to show only the\n * active item's label, or `\"none\"` for an icon-only rail.\n *\n * @example\n * <NavigationRail\n * header={<FloatingActionButton icon={<Plus />} position=\"none\" />}\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"inbox\", label: \"Caixa\", icon: <Inbox />, badge: 3 },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n */\nexport function NavigationRail({\n items,\n value,\n onChange,\n header,\n footer,\n labelVisibility = \"all\",\n className,\n ...props\n}: NavigationRailProps) {\n return (\n <nav className={cn(styles.rail, className)} aria-label=\"Navegação lateral\" {...props}>\n {header !== undefined && <div className={styles.header}>{header}</div>}\n <ul className={styles.list}>\n {items.map((item) => {\n const active = item.key === value;\n const showLabel =\n labelVisibility === \"all\" || (labelVisibility === \"selected\" && active);\n return (\n <li key={item.key}>\n <button\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabel && <span className={styles.label}>{item.label}</span>}\n </button>\n </li>\n );\n })}\n </ul>\n {footer !== undefined && <div className={styles.footer}>{footer}</div>}\n </nav>\n );\n}\n","import { useId, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n /** Selected time as a 24h `\"HH:MM\"` string (e.g. `\"14:30\"`). May be `\"\"` for none. */\n value: string;\n /** Fired with the new 24h `\"HH:MM\"` string whenever a cell is picked. */\n onChange: (value: string) => void;\n /** Granularity of the minute column. Defaults to `5`. */\n minuteStep?: number;\n /** When true, show a 1–12 hour column plus an AM/PM column (still emits 24h). */\n use12Hours?: boolean;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\ntype Period = \"AM\" | \"PM\";\n\ninterface ParsedTime {\n hour24: number | null;\n minute: number | null;\n}\n\nfunction pad2(value: number): string {\n return value.toString().padStart(2, \"0\");\n}\n\n/** Parse a 24h `\"HH:MM\"` string into hour/minute numbers, or nulls when empty/invalid. */\nfunction parseValue(value: string): ParsedTime {\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(value.trim());\n if (!match) return { hour24: null, minute: null };\n const hour24 = Number(match[1]);\n const minute = Number(match[2]);\n if (hour24 < 0 || hour24 > 23 || minute < 0 || minute > 59) {\n return { hour24: null, minute: null };\n }\n return { hour24, minute };\n}\n\n/** Convert a 24h hour into its 12h display hour (1–12). */\nfunction to12Hour(hour24: number): number {\n const mod = hour24 % 12;\n return mod === 0 ? 12 : mod;\n}\n\n/** Convert a 12h display hour + period into a 24h hour (0–23). */\nfunction to24Hour(hour12: number, period: Period): number {\n const base = hour12 % 12;\n return period === \"PM\" ? base + 12 : base;\n}\n\n/**\n * TimePicker — inline, dependency-free time picker with Material \"spinner column\" styling.\n *\n * Renders scrollable columns of selectable cells (hours, minutes, and AM/PM when\n * `use12Hours`). Always emits a 24h `\"HH:MM\"` string via `onChange`, regardless of\n * whether the 12h display is enabled.\n */\nexport function TimePicker({\n value,\n onChange,\n minuteStep = 5,\n use12Hours = false,\n label,\n helperText,\n disabled,\n className,\n}: TimePickerProps) {\n const id = useId();\n const { hour24, minute } = useMemo(() => parseValue(value), [value]);\n\n const period: Period = hour24 !== null && hour24 >= 12 ? \"PM\" : \"AM\";\n\n const hourCells = useMemo<number[]>(() => {\n if (use12Hours) {\n return Array.from({ length: 12 }, (_, index) => index + 1);\n }\n return Array.from({ length: 24 }, (_, index) => index);\n }, [use12Hours]);\n\n const minuteCells = useMemo<number[]>(() => {\n const step = minuteStep > 0 ? minuteStep : 1;\n const cells: number[] = [];\n for (let current = 0; current < 60; current += step) {\n cells.push(current);\n }\n return cells;\n }, [minuteStep]);\n\n const selectedHourDisplay = hour24 === null ? null : use12Hours ? to12Hour(hour24) : hour24;\n\n const emit = (nextHour24: number, nextMinute: number): void => {\n onChange(`${pad2(nextHour24)}:${pad2(nextMinute)}`);\n };\n\n const handleHour = (displayHour: number): void => {\n if (disabled) return;\n const nextMinute = minute ?? 0;\n const nextHour24 = use12Hours ? to24Hour(displayHour, period) : displayHour;\n emit(nextHour24, nextMinute);\n };\n\n const handleMinute = (nextMinute: number): void => {\n if (disabled) return;\n const baseHour24 = hour24 ?? (use12Hours ? to24Hour(12, \"AM\") : 0);\n emit(baseHour24, nextMinute);\n };\n\n const handlePeriod = (nextPeriod: Period): void => {\n if (disabled) return;\n const displayHour = selectedHourDisplay ?? 12;\n const nextMinute = minute ?? 0;\n emit(to24Hour(displayHour, nextPeriod), nextMinute);\n };\n\n return (\n <div className={cn(styles.wrapper, disabled && styles.disabled, className)}>\n {label && (\n <span id={`${id}-label`} className={styles.label}>\n {label}\n </span>\n )}\n <div className={styles.columns}>\n <ul role=\"listbox\" aria-label=\"Horas\" className={styles.column}>\n {hourCells.map((cell) => {\n const active = cell === selectedHourDisplay;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleHour(cell)}\n >\n {use12Hours ? cell : pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n <ul role=\"listbox\" aria-label=\"Minutos\" className={styles.column}>\n {minuteCells.map((cell) => {\n const active = cell === minute;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleMinute(cell)}\n >\n {pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n {use12Hours && (\n <ul role=\"listbox\" aria-label=\"Período\" className={styles.column}>\n {([\"AM\", \"PM\"] as Period[]).map((cell) => {\n const active = selectedHourDisplay !== null && cell === period;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handlePeriod(cell)}\n >\n {cell}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useRef, useState, type ReactNode, type TouchEvent } from \"react\";\nimport { Spinner } from \"@/components/Spinner\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RefreshIndicator.module.css\";\n\nexport interface RefreshIndicatorProps {\n /** Invoked when the user pulls past `threshold` and releases. May be async. */\n onRefresh: () => void | Promise<void>;\n /** Scrollable content to wrap. */\n children: ReactNode;\n /** Pixels the user must pull past to trigger a refresh. Defaults to `80`. */\n threshold?: number;\n /** When true, pull-to-refresh is inert. */\n disabled?: boolean;\n className?: string;\n}\n\n/** Apply resistance so the content lags behind the finger and the pull never runs away. */\nfunction applyResistance(distance: number, threshold: number): number {\n const cap = threshold * 1.5;\n return Math.min(distance / 2, cap);\n}\n\n/**\n * RefreshIndicator — pull-to-refresh wrapper for touch devices.\n *\n * Wraps scrollable `children` and listens for a downward drag that starts while the\n * container is scrolled to the top. Pulling past `threshold` and releasing triggers\n * `onRefresh`; the SDK {@link Spinner} is shown while pulling and during the refresh.\n */\nexport function RefreshIndicator({\n onRefresh,\n children,\n threshold = 80,\n disabled,\n className,\n}: RefreshIndicatorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const startYRef = useRef<number | null>(null);\n const [pull, setPull] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n\n const engaged = startYRef.current !== null;\n\n const handleTouchStart = (event: TouchEvent<HTMLDivElement>): void => {\n if (disabled || refreshing) return;\n const container = containerRef.current;\n if (!container || container.scrollTop > 0) return;\n const touch = event.touches[0];\n if (!touch) return;\n startYRef.current = touch.clientY;\n };\n\n const handleTouchMove = (event: TouchEvent<HTMLDivElement>): void => {\n if (disabled || refreshing) return;\n const startY = startYRef.current;\n if (startY === null) return;\n const touch = event.touches[0];\n if (!touch) return;\n const delta = touch.clientY - startY;\n if (delta <= 0) {\n setPull(0);\n return;\n }\n setPull(applyResistance(delta, threshold));\n };\n\n const reset = (): void => {\n startYRef.current = null;\n setPull(0);\n };\n\n const handleTouchEnd = async (): Promise<void> => {\n if (disabled || refreshing) {\n reset();\n return;\n }\n const startY = startYRef.current;\n const triggered = startY !== null && pull >= threshold;\n if (!triggered) {\n reset();\n return;\n }\n startYRef.current = null;\n setRefreshing(true);\n setPull(threshold);\n try {\n await onRefresh();\n } finally {\n setRefreshing(false);\n setPull(0);\n }\n };\n\n const showIndicator = refreshing || pull > 0;\n const progress = Math.min(1, pull / threshold);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.wrapper, className)}\n data-refreshing={refreshing}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <div\n className={styles.indicator}\n aria-hidden={!showIndicator}\n style={{\n opacity: refreshing ? 1 : progress,\n transform: `translateX(-50%) translateY(${showIndicator ? pull : 0}px) rotate(${progress * 360}deg)`,\n }}\n >\n <Spinner size=\"sm\" label=\"Atualizando\" />\n </div>\n <div\n className={cn(styles.content, (engaged || refreshing) && styles.dragging)}\n style={{ transform: `translateY(${showIndicator ? pull : 0}px)` }}\n >\n {children}\n </div>\n </div>\n );\n}\n","/**\n * Format a number as Brazilian Real currency.\n *\n * @param value - The amount in BRL.\n * @returns A locale-formatted string, e.g. \"R$ 1.234,56\".\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n}\n\n/**\n * Format an ISO date or Date instance as `dd/MM/yyyy`.\n *\n * @param value - ISO string or Date.\n * @returns Formatted date string, or empty string when input is invalid.\n */\nexport function formatDate(value: string | Date): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"pt-BR\").format(date);\n}\n\n/**\n * Format an ISO date or Date instance as `dd/MM/yyyy HH:mm`.\n *\n * @param value - ISO string or Date.\n * @returns Formatted datetime string, or empty string when input is invalid.\n */\nexport function formatDateTime(value: string | Date): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"pt-BR\", {\n dateStyle: \"short\",\n timeStyle: \"short\",\n }).format(date);\n}\n\n/**\n * Apply the Brazilian phone mask `(XX) XXXXX-XXXX` or `(XX) XXXX-XXXX`.\n *\n * @param value - Raw digits or partially masked string.\n * @returns Masked phone string.\n */\nexport function formatPhone(value: string): string {\n const digits = value.replace(/\\D/g, \"\").slice(0, 11);\n if (digits.length <= 10) {\n return digits.replace(/(\\d{2})(\\d)/, \"($1) $2\").replace(/(\\d{4})(\\d)/, \"$1-$2\");\n }\n return digits.replace(/(\\d{2})(\\d)/, \"($1) $2\").replace(/(\\d{5})(\\d)/, \"$1-$2\");\n}\n\n/**\n * Apply the Brazilian CPF mask `XXX.XXX.XXX-XX`.\n *\n * @param value - Raw digits or partially masked string.\n * @returns Masked CPF string.\n */\nexport function formatCPF(value: string): string {\n return value\n .replace(/\\D/g, \"\")\n .slice(0, 11)\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d{1,2})$/, \"$1-$2\");\n}\n\n/**\n * Format a fraction (0-1) as a percentage with one decimal.\n *\n * @param value - Fraction between 0 and 1.\n * @returns Formatted percent string, e.g. \"12,5%\".\n */\nexport function formatPercent(value: number): string {\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value);\n}\n","/**\n * Typed wrapper around `localStorage` that JSON-encodes values and\n * silently handles environments where storage is unavailable (SSR, private mode).\n */\nexport const storage = {\n get<T>(key: string, fallback: T): T {\n if (typeof window === \"undefined\") return fallback;\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set<T>(key: string, value: T): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n /* ignore quota errors */\n }\n },\n remove(key: string): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n },\n};\n","/**\n * Convert a string into a URL-safe slug.\n *\n * - Strips accents/diacritics.\n * - Lowercases.\n * - Replaces non-alphanumeric runs with `-`.\n * - Trims leading/trailing separators.\n *\n * @example\n * slugify(\"São Paulo / Centro\"); // \"sao-paulo-centro\"\n */\nexport function slugify(input: string): string {\n return input\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n/**\n * Truncate a string to `max` characters, appending `suffix` when cut.\n * Returns the original when shorter than (or equal to) `max`.\n *\n * @example\n * truncate(\"The quick brown fox\", 12); // \"The quick…\"\n * truncate(\"The quick brown fox\", 12, \" (more)\"); // \"The qu (more)\"\n */\nexport function truncate(input: string, max: number, suffix: string = \"…\"): string {\n if (input.length <= max) return input;\n const cut = Math.max(0, max - suffix.length);\n return input.slice(0, cut).trimEnd() + suffix;\n}\n\n/**\n * Uppercase the first character of `value`, leaving the rest untouched.\n *\n * @example\n * capitalize(\"hello world\"); // \"Hello world\"\n * capitalize(\"\"); // \"\"\n */\nexport function capitalize(value: string): string {\n if (value.length === 0) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\n/**\n * Convert `value` to `camelCase`.\n *\n * Splits on spaces, hyphens, underscores and other non-alphanumeric runs,\n * lowercases the first word, and capitalizes each subsequent word.\n *\n * @example\n * camelCase(\"hello world\"); // \"helloWorld\"\n * camelCase(\"foo-bar_baz\"); // \"fooBarBaz\"\n * camelCase(\"API response\"); // \"apiResponse\"\n */\nexport function camelCase(value: string): string {\n const words = value\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (words.length === 0) return \"\";\n return words\n .map((word, index) => {\n const lower = word.toLowerCase();\n return index === 0 ? lower : lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join(\"\");\n}\n\n/**\n * Convert `value` to `kebab-case`.\n *\n * Splits camelCase boundaries and non-alphanumeric runs, then joins with `-`\n * and lowercases.\n *\n * @example\n * kebabCase(\"helloWorld\"); // \"hello-world\"\n * kebabCase(\"foo_bar baz\"); // \"foo-bar-baz\"\n * kebabCase(\"APIResponse\"); // \"api-response\"\n */\nexport function kebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n}\n\n/**\n * Pick the singular or plural form of a word based on `count`.\n *\n * Returns only the word (never the count). When `plural` is omitted it defaults\n * to `singular + \"s\"`.\n *\n * @example\n * pluralize(1, \"item\"); // \"item\"\n * pluralize(3, \"item\"); // \"items\"\n * pluralize(2, \"person\", \"people\"); // \"people\"\n */\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : (plural ?? `${singular}s`);\n}\n","/**\n * Group items of a list into buckets keyed by the result of `key`.\n *\n * Items preserve their original order within each bucket.\n *\n * @example\n * groupBy([1, 2, 3, 4], (n) => (n % 2 === 0 ? \"even\" : \"odd\"));\n * // { odd: [1, 3], even: [2, 4] }\n *\n * @example\n * groupBy([{ city: \"SP\" }, { city: \"RJ\" }, { city: \"SP\" }], (u) => u.city);\n * // { SP: [{ city: \"SP\" }, { city: \"SP\" }], RJ: [{ city: \"RJ\" }] }\n */\nexport function groupBy<T, K extends PropertyKey>(items: T[], key: (item: T) => K): Record<K, T[]> {\n const result = {} as Record<K, T[]>;\n for (const item of items) {\n const k = key(item);\n (result[k] ??= []).push(item);\n }\n return result;\n}\n\n/**\n * Remove duplicate items, keeping the first occurrence of each distinct key.\n *\n * Equality is determined by the value returned from `key` (compared with `===`).\n *\n * @example\n * uniqueBy([1, 2, 2, 3, 1], (n) => n); // [1, 2, 3]\n *\n * @example\n * uniqueBy(\n * [{ id: 1, v: \"a\" }, { id: 1, v: \"b\" }, { id: 2, v: \"c\" }],\n * (u) => u.id,\n * );\n * // [{ id: 1, v: \"a\" }, { id: 2, v: \"c\" }]\n */\nexport function uniqueBy<T>(items: T[], key: (item: T) => unknown): T[] {\n const seen = new Set<unknown>();\n const result: T[] = [];\n for (const item of items) {\n const k = key(item);\n if (!seen.has(k)) {\n seen.add(k);\n result.push(item);\n }\n }\n return result;\n}\n\n/**\n * Split a list into consecutive chunks of at most `size` items.\n *\n * The final chunk may be smaller than `size`. An empty input yields `[]`.\n *\n * @param items - The list to split.\n * @param size - Maximum chunk length; must be `>= 1`.\n * @throws {RangeError} When `size` is less than `1`.\n *\n * @example\n * chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]\n *\n * @example\n * chunk([], 3); // []\n */\nexport function chunk<T>(items: T[], size: number): T[][] {\n if (size < 1) {\n throw new RangeError(`chunk size must be >= 1, received ${size}`);\n }\n const result: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n result.push(items.slice(i, i + size));\n }\n return result;\n}\n\n/**\n * Build a numeric range from `start` (inclusive) to `end` (exclusive).\n *\n * - `step` defaults to `1` and may be negative for descending ranges.\n * - Returns an empty array when no progress can be made toward `end`\n * (wrong-direction step, zero step, or `start === end`).\n *\n * @param start - First value of the range.\n * @param end - Exclusive upper (or lower, for negative step) bound.\n * @param step - Increment between values; defaults to `1`.\n *\n * @example\n * range(0, 5); // [0, 1, 2, 3, 4]\n * range(0, 10, 2); // [0, 2, 4, 6, 8]\n * range(5, 0, -1); // [5, 4, 3, 2, 1]\n * range(0, 5, -1); // [] (wrong direction)\n * range(3, 3); // []\n */\nexport function range(start: number, end: number, step: number = 1): number[] {\n const result: number[] = [];\n if (step === 0) return result;\n if (step > 0) {\n for (let i = start; i < end; i += step) result.push(i);\n } else {\n for (let i = start; i > end; i += step) result.push(i);\n }\n return result;\n}\n","/**\n * Determine whether a value is a plain object literal.\n *\n * Returns `false` for arrays, `null`, dates, maps, sets, and class instances.\n *\n * @internal\n */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Create a new object containing only the given `keys` from `obj`.\n *\n * Missing keys are skipped. The input is never mutated.\n *\n * @example\n * pick({ id: 1, name: \"Ana\", age: 30 }, [\"id\", \"name\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Create a new object with the given `keys` removed from `obj`.\n *\n * The input is never mutated.\n *\n * @example\n * omit({ id: 1, name: \"Ana\", age: 30 }, [\"age\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const exclude = new Set<PropertyKey>(keys);\n const result = {} as Record<PropertyKey, unknown>;\n for (const key of Object.keys(obj) as (keyof T)[]) {\n if (!exclude.has(key)) {\n result[key] = obj[key];\n }\n }\n return result as Omit<T, K>;\n}\n\n/**\n * Recursively merge `source` into `target`, returning a new object.\n *\n * - Plain objects are merged key by key, recursing into nested plain objects.\n * - Arrays and non-plain values (dates, class instances, primitives) replace\n * the target value entirely — they are not merged element by element.\n * - Neither `target` nor `source` is mutated.\n *\n * @example\n * deepMerge(\n * { a: 1, nested: { x: 1, y: 2 } },\n * { nested: { y: 20, z: 30 } },\n * );\n * // { a: 1, nested: { x: 1, y: 20, z: 30 } }\n *\n * @example\n * deepMerge({ tags: [\"a\", \"b\"] }, { tags: [\"c\"] });\n * // { tags: [\"c\"] } (arrays replaced, not merged)\n */\nexport function deepMerge<T>(target: T, source: Partial<T>): T {\n if (!isPlainRecord(target) || !isPlainRecord(source)) {\n return (source === undefined ? target : (source as unknown as T)) as T;\n }\n const result: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const sourceValue = (source as Record<string, unknown>)[key];\n const targetValue = result[key];\n if (isPlainRecord(targetValue) && isPlainRecord(sourceValue)) {\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n return result as T;\n}\n\n/**\n * Check whether a value is considered \"empty\".\n *\n * Returns `true` for `null`, `undefined`, empty strings, empty arrays, empty\n * plain objects, and empty `Map`/`Set` instances. Returns `false` for numbers\n * (including `0` and `NaN`), booleans, and dates, which are never empty.\n *\n * @example\n * isEmpty(null); // true\n * isEmpty(\"\"); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(new Map()); // true\n * isEmpty(0); // false\n * isEmpty(false); // false\n * isEmpty(new Date()); // false\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (value instanceof Map || value instanceof Set) return value.size === 0;\n if (isPlainRecord(value)) return Object.keys(value).length === 0;\n return false;\n}\n","/**\n * Type guard asserting a value is neither `null` nor `undefined`.\n *\n * Useful for narrowing in `Array.prototype.filter` to drop nullish entries\n * while preserving the element type.\n *\n * @example\n * const xs: (number | null)[] = [1, null, 2];\n * const clean: number[] = xs.filter(isDefined); // [1, 2]\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Type guard asserting a value is a string primitive.\n *\n * @example\n * isString(\"hi\"); // true\n * isString(42); // false\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Type guard asserting a value is a number, excluding `NaN`.\n *\n * @example\n * isNumber(42); // true\n * isNumber(NaN); // false\n * isNumber(\"42\"); // false\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !Number.isNaN(value);\n}\n\n/**\n * Type guard asserting a value is a plain object literal.\n *\n * Returns `false` for arrays, `null`, dates, maps, sets, and class instances —\n * only objects created from `{}` / `Object.create(null)` / object literals pass.\n *\n * @example\n * isPlainObject({ a: 1 }); // true\n * isPlainObject([]); // false\n * isPlainObject(null); // false\n * isPlainObject(new Date()); // false\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Assert that a code path is unreachable, throwing at runtime if reached.\n *\n * Use in the `default` branch of an exhaustive `switch` so TypeScript flags any\n * unhandled union member at compile time and the runtime fails loudly if an\n * unexpected value slips through.\n *\n * @param value - The value that should be of type `never`.\n * @param message - Optional custom error message.\n * @throws {Error} Always.\n *\n * @example\n * type Shape = \"circle\" | \"square\";\n * function area(shape: Shape): number {\n * switch (shape) {\n * case \"circle\": return 1;\n * case \"square\": return 2;\n * default: return assertNever(shape);\n * }\n * }\n */\nexport function assertNever(value: never, message?: string): never {\n throw new Error(message ?? `Unexpected value: ${String(value)}`);\n}\n","/**\n * Create a trailing-edge debounced version of `fn`.\n *\n * The wrapped function delays invoking `fn` until `wait` milliseconds have\n * elapsed since the last time it was called. Only the latest arguments are\n * used. Call `.cancel()` to clear any pending invocation.\n *\n * @example\n * const save = debounce((q: string) => search(q), 300);\n * save(\"a\"); save(\"ab\"); save(\"abc\"); // only \"abc\" runs after 300ms\n * save.cancel(); // nothing runs\n */\nexport function debounce<A extends unknown[]>(\n fn: (...args: A) => void,\n wait: number,\n): ((...args: A) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = (...args: A): void => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n fn(...args);\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n return debounced;\n}\n\n/**\n * Create a throttled version of `fn` with leading and trailing edges.\n *\n * `fn` runs immediately on the first call (leading edge), then at most once\n * per `wait` milliseconds. If calls happen during the wait window, the last\n * one fires on the trailing edge. Call `.cancel()` to drop any pending\n * trailing call and reset the window.\n *\n * @example\n * const onScroll = throttle(() => render(), 200);\n * window.addEventListener(\"scroll\", onScroll);\n * onScroll.cancel();\n */\nexport function throttle<A extends unknown[]>(\n fn: (...args: A) => void,\n wait: number,\n): ((...args: A) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: A | undefined;\n let lastInvoke = 0;\n\n const invoke = (args: A): void => {\n lastInvoke = Date.now();\n fn(...args);\n };\n\n const throttled = (...args: A): void => {\n const now = Date.now();\n const remaining = wait - (now - lastInvoke);\n\n if (remaining <= 0) {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n invoke(args);\n } else {\n lastArgs = args;\n if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n if (lastArgs !== undefined) {\n const pending = lastArgs;\n lastArgs = undefined;\n invoke(pending);\n }\n }, remaining);\n }\n }\n };\n\n throttled.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastArgs = undefined;\n lastInvoke = 0;\n };\n\n return throttled;\n}\n\n/**\n * Wrap `fn` so it runs at most once; subsequent calls return the cached result.\n *\n * @example\n * const init = once(() => expensiveSetup());\n * init(); // runs expensiveSetup()\n * init(); // returns the same cached result, no re-run\n */\nexport function once<A extends unknown[], R>(fn: (...args: A) => R): (...args: A) => R {\n let called = false;\n let result: R;\n\n return (...args: A): R => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n };\n}\n\n/**\n * Memoize only the most recent call of `fn`, keyed by shallow-equal arguments.\n *\n * If the next call has the same arguments (compared with `Object.is` per\n * position and equal length), the cached result is returned without re-running\n * `fn`. Any different argument list recomputes and replaces the cache.\n *\n * @example\n * const select = memoizeOne((a: number, b: number) => a + b);\n * select(1, 2); // computes 3\n * select(1, 2); // cached 3\n * select(2, 2); // recomputes 4\n */\nexport function memoizeOne<A extends unknown[], R>(fn: (...args: A) => R): (...args: A) => R {\n let hasCache = false;\n let lastArgs: A;\n let lastResult: R;\n\n const sameArgs = (next: A): boolean => {\n if (!hasCache || next.length !== lastArgs.length) return false;\n for (let i = 0; i < next.length; i++) {\n if (!Object.is(next[i], lastArgs[i])) return false;\n }\n return true;\n };\n\n return (...args: A): R => {\n if (sameArgs(args)) return lastResult;\n lastArgs = args;\n lastResult = fn(...args);\n hasCache = true;\n return lastResult;\n };\n}\n","/**\n * Resolve after `ms` milliseconds.\n *\n * @example\n * await sleep(500); // pauses for half a second\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Race `promise` against a timeout.\n *\n * Resolves/rejects with `promise` when it settles first. If `ms` elapses\n * before that, the returned promise rejects with an `Error` whose `name` is\n * `\"TimeoutError\"`.\n *\n * @example\n * await withTimeout(fetch(\"/slow\"), 3000);\n * await withTimeout(fetch(\"/slow\"), 3000, \"request too slow\");\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message?: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n const error = new Error(message ?? `Operation timed out after ${ms}ms`);\n error.name = \"TimeoutError\";\n reject(error);\n }, ms);\n\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (reason) => {\n clearTimeout(timer);\n reject(reason);\n },\n );\n });\n}\n","/**\n * Generate a collision-resistant id suitable for client-side UI keys.\n *\n * Uses `crypto.randomUUID()` when available, falling back to a\n * timestamp + `Math.random()` combination otherwise. When `prefix` is given,\n * the result is formatted as `${prefix}-${id}`.\n *\n * @example\n * randomId(); // \"9f1c2b3a-...\" (uuid) or \"lq3f8k-4a9z1\" (fallback)\n * randomId(\"user\"); // \"user-9f1c2b3a-...\"\n */\nexport function randomId(prefix?: string): string {\n let id: string;\n\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n id = crypto.randomUUID();\n } else {\n const time = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 10);\n id = `${time}-${rand}`;\n }\n\n return prefix ? `${prefix}-${id}` : id;\n}\n","import type { ApiError } from \"./types\";\n\n/**\n * Error thrown by {@link createApiClient} / {@link uploadWithProgress} on a\n * non-2xx response. Mirrors the Tempest FastAPI SDK error envelope\n * (`{ detail, code, details.request_id }`) so callers get a typed `code` and a\n * `requestId` for log correlation, while still being a real `Error` (stack\n * trace, `instanceof Error`).\n *\n * @example\n * try {\n * await api.post(\"/users\", { body });\n * } catch (err) {\n * if (isApiError(err) && err.code === \"EMAIL_TAKEN\") {\n * showFieldError(\"email\", err.detail);\n * }\n * }\n */\nexport class TempestApiError extends Error implements ApiError {\n readonly status: number;\n readonly detail: string;\n readonly code?: string;\n readonly requestId?: string;\n readonly body?: unknown;\n\n constructor(init: ApiError) {\n super(init.detail);\n this.name = \"TempestApiError\";\n this.status = init.status;\n this.detail = init.detail;\n this.code = init.code;\n this.requestId = init.requestId;\n this.body = init.body;\n }\n}\n\n/**\n * Type guard for the {@link ApiError} shape. Matches both {@link TempestApiError}\n * instances and plain objects carrying `status` + `detail`.\n *\n * @param error - The unknown value (typically a caught error).\n * @returns Whether `error` conforms to the `ApiError` contract.\n */\nexport function isApiError(error: unknown): error is ApiError {\n return (\n typeof error === \"object\" &&\n error !== null &&\n typeof (error as ApiError).status === \"number\" &&\n typeof (error as ApiError).detail === \"string\"\n );\n}\n\n/**\n * Parse an error body + response into the Tempest {@link ApiError} envelope.\n *\n * Reads `detail`/`message`, the programmatic `code`, and the correlation id\n * from `details.request_id` (falling back to the `X-Request-ID` header, then\n * the id the client sent).\n *\n * @param status - HTTP status code.\n * @param body - The parsed error body (object, string, or null).\n * @param headers - The response headers (for the `X-Request-ID` fallback).\n * @param sentRequestId - The id the client sent on the request, if any.\n * @returns A fully-populated `ApiError`.\n */\nexport function buildApiError(\n status: number,\n body: unknown,\n headers?: Headers | { get(name: string): string | null },\n sentRequestId?: string,\n): ApiError {\n const obj =\n typeof body === \"object\" && body !== null ? (body as Record<string, unknown>) : null;\n const detail = obj?.detail ?? obj?.message ?? `Erro ${status}`;\n const code = typeof obj?.code === \"string\" ? obj.code : undefined;\n const details =\n typeof obj?.details === \"object\" && obj.details !== null\n ? (obj.details as Record<string, unknown>)\n : null;\n const requestId =\n (typeof details?.request_id === \"string\" ? details.request_id : undefined) ??\n headers?.get(\"X-Request-ID\") ??\n sentRequestId ??\n undefined;\n\n return {\n status,\n detail: String(detail),\n code,\n requestId: requestId ?? undefined,\n retryAfter: parseRetryAfter(headers?.get(\"Retry-After\")),\n body,\n };\n}\n\n/**\n * Parse a `Retry-After` header into seconds. Accepts a delta-seconds integer\n * (`\"120\"`) or an HTTP-date (`\"Wed, 21 Oct 2015 07:28:00 GMT\"`).\n *\n * @param value - The raw header value, or null.\n * @returns The delay in seconds (>= 0), or undefined when absent/unparseable.\n */\nexport function parseRetryAfter(value: string | null | undefined): number | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) return Number(trimmed);\n const when = Date.parse(trimmed);\n if (Number.isNaN(when)) return undefined;\n return Math.max(0, Math.round((when - Date.now()) / 1000));\n}\n","import { randomId } from \"../utils\";\nimport { buildApiError, TempestApiError } from \"./errors\";\nimport type { ApiClient, ApiClientConfig, RequestOptions } from \"./types\";\n\nfunction buildUrl(baseURL: string, path: string, params?: RequestOptions[\"params\"]): string {\n const url = new URL(path, baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== \"undefined\" && body instanceof FormData;\n}\n\nasync function parseError(response: Response, sentRequestId?: string): Promise<TempestApiError> {\n let body: unknown = null;\n try {\n body = await response.clone().json();\n } catch {\n try {\n body = await response.text();\n } catch {\n body = null;\n }\n }\n return new TempestApiError(\n buildApiError(response.status, body, response.headers, sentRequestId),\n );\n}\n\n/**\n * Create a typed HTTP client backed by `fetch`.\n *\n * Handles JSON serialization, query params, bearer auth via `getToken`,\n * automatic refresh + retry on 401 when `refresh` is supplied, and uploads\n * via `FormData`. Throws an `ApiError` on non-2xx responses.\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const fetcher = config.fetcher ?? globalThis.fetch.bind(globalThis);\n\n function authHeaders(): Record<string, string> {\n const token = config.getToken?.();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n async function rawRequest(\n path: string,\n options: RequestOptions,\n requestId?: string,\n ): Promise<Response> {\n const { body, params, headers, ...rest } = options;\n const isForm = isFormData(body);\n\n const finalHeaders: Record<string, string> = {\n ...(isForm ? {} : { \"Content-Type\": \"application/json\" }),\n ...(requestId ? { \"X-Request-ID\": requestId } : {}),\n ...config.headers,\n ...authHeaders(),\n ...(headers as Record<string, string> | undefined),\n };\n\n const init: RequestInit = {\n ...rest,\n headers: finalHeaders,\n credentials: config.withCredentials ? \"include\" : rest.credentials,\n body:\n body === undefined || body === null\n ? undefined\n : isForm\n ? (body as FormData)\n : JSON.stringify(body),\n };\n\n return fetcher(buildUrl(config.baseURL, path, params), init);\n }\n\n async function request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const requestId = config.requestId ? config.requestId() : randomId();\n let response = await rawRequest(path, options, requestId);\n\n if (response.status === 401) {\n if (config.refresh) {\n try {\n await config.refresh();\n response = await rawRequest(path, options, requestId);\n } catch {\n await config.onUnauthorized?.(response);\n throw await parseError(response, requestId);\n }\n } else {\n await config.onUnauthorized?.(response);\n }\n }\n\n if (!response.ok) {\n throw await parseError(response, requestId);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return (await response.json()) as T;\n }\n return (await response.text()) as unknown as T;\n }\n\n async function upload<T>(\n path: string,\n formData: FormData,\n method: \"POST\" | \"PUT\" | \"PATCH\" = \"POST\",\n ): Promise<T> {\n return request<T>(path, { method, body: formData });\n }\n\n return {\n request,\n get: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"GET\" }),\n post: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"POST\" }),\n put: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"PUT\" }),\n patch: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"PATCH\" }),\n delete: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"DELETE\" }),\n upload,\n };\n}\n","import type { z } from \"zod\";\n\n/**\n * Validate an unknown response payload against a zod schema.\n *\n * In development, throws a detailed error pointing at the divergent field.\n * In production, throws a generic error so internals do not leak to users.\n *\n * @param schema - The zod schema to parse against.\n * @param raw - The raw response payload.\n * @param context - A label used in error messages, e.g. \"POST /auth/login\".\n * @returns The parsed, typed payload.\n */\nexport function parseResponse<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n raw: unknown,\n context: string,\n): z.infer<TSchema> {\n const result = schema.safeParse(raw);\n if (result.success) {\n return result.data;\n }\n\n const isDev =\n typeof process !== \"undefined\" &&\n (process.env?.NODE_ENV === \"development\" || process.env?.NODE_ENV === \"test\");\n\n if (isDev) {\n const issues = result.error.issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(\n `[parseResponse] Contract drift on ${context}:\\n${issues}\\n\\nRaw payload: ${JSON.stringify(raw, null, 2)}`,\n );\n }\n throw new Error(`Resposta inválida do servidor (${context}).`);\n}\n","import { randomId } from \"../utils\";\nimport { buildApiError, TempestApiError } from \"./errors\";\n\nexport interface UploadProgressEvent {\n /** Bytes already uploaded. */\n loaded: number;\n /** Total payload size in bytes — only meaningful when `lengthComputable` is true. */\n total: number;\n /** Fraction between 0 and 1, or null when total is unknown. */\n fraction: number | null;\n lengthComputable: boolean;\n}\n\nexport interface UploadWithProgressOptions {\n url: string;\n body: FormData | Blob | File;\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n headers?: Record<string, string>;\n /** Returns the current bearer token. */\n getToken?: () => string | null | undefined;\n /** Send cookies. Defaults to false. */\n withCredentials?: boolean;\n /** Called on every `progress` event from the XHR upload channel. */\n onProgress?: (event: UploadProgressEvent) => void;\n /** Abort the request. */\n signal?: AbortSignal;\n /** Override the JSON parser. Defaults to `JSON.parse`. */\n parser?: (raw: string) => unknown;\n /**\n * Per-request correlation id sent as `X-Request-ID` (Tempest convention).\n * Defaults to a generated id. Return an empty string to disable.\n */\n requestId?: () => string;\n}\n\nfunction parseErrorBody(raw: string): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Upload a file (or any payload) with byte-level progress reporting.\n *\n * `fetch` cannot report upload progress in browsers, so this helper falls\n * back to `XMLHttpRequest`. It mirrors the error contract used by\n * {@link createApiClient}: non-2xx responses reject with a `TempestApiError`.\n *\n * @returns The parsed JSON response, or the raw text when the response is not JSON.\n */\nexport function uploadWithProgress<T = unknown>(options: UploadWithProgressOptions): Promise<T> {\n const {\n url,\n body,\n method = \"POST\",\n headers = {},\n getToken,\n withCredentials = false,\n onProgress,\n signal,\n parser = JSON.parse,\n requestId,\n } = options;\n\n return new Promise<T>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open(method, url);\n xhr.withCredentials = withCredentials;\n\n const token = getToken?.();\n const sentRequestId = requestId ? requestId() : randomId();\n const finalHeaders: Record<string, string> = { ...headers };\n if (token && !(\"Authorization\" in finalHeaders)) {\n finalHeaders.Authorization = `Bearer ${token}`;\n }\n if (sentRequestId && !(\"X-Request-ID\" in finalHeaders)) {\n finalHeaders[\"X-Request-ID\"] = sentRequestId;\n }\n for (const [key, value] of Object.entries(finalHeaders)) {\n xhr.setRequestHeader(key, value);\n }\n\n if (onProgress) {\n xhr.upload.onprogress = (event) => {\n onProgress({\n loaded: event.loaded,\n total: event.total,\n fraction: event.lengthComputable ? event.loaded / event.total : null,\n lengthComputable: event.lengthComputable,\n });\n };\n }\n\n function handleAbort(): void {\n xhr.abort();\n }\n signal?.addEventListener(\"abort\", handleAbort);\n\n xhr.onload = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n const isSuccess = xhr.status >= 200 && xhr.status < 300;\n const contentType = xhr.getResponseHeader(\"content-type\") ?? \"\";\n\n if (!isSuccess) {\n const errorBody = parseErrorBody(xhr.responseText);\n reject(\n new TempestApiError(\n buildApiError(\n xhr.status,\n errorBody,\n { get: (name) => xhr.getResponseHeader(name) },\n sentRequestId,\n ),\n ),\n );\n return;\n }\n\n if (xhr.status === 204 || !xhr.responseText) {\n resolve(undefined as T);\n return;\n }\n\n if (contentType.includes(\"application/json\")) {\n try {\n resolve(parser(xhr.responseText) as T);\n } catch (err) {\n reject(err);\n }\n } else {\n resolve(xhr.responseText as unknown as T);\n }\n };\n\n xhr.onerror = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(\n new TempestApiError({\n status: 0,\n detail: \"Falha de rede no upload.\",\n requestId: sentRequestId || undefined,\n }),\n );\n };\n\n xhr.onabort = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n\n xhr.send(body);\n });\n}\n","export interface RetryOptions {\n /** Max attempts (including the first). Default: 3. */\n retries?: number;\n /** Initial backoff in ms. Doubles each attempt, capped at `maxDelay`. Default: 300. */\n initialDelay?: number;\n /** Maximum delay between attempts. Default: 10_000. */\n maxDelay?: number;\n /**\n * Honor a `Retry-After` hint on the thrown error (`error.retryAfter`, in\n * seconds — populated by {@link createApiClient} on `429`/`503`). When\n * present it overrides the exponential backoff for that attempt. The value\n * is capped at `maxDelay`. Default: true.\n */\n respectRetryAfter?: boolean;\n /**\n * Return false to stop retrying for a specific error.\n * Default: retry on any thrown error.\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Called before each retry with the upcoming delay. */\n onRetry?: (info: { attempt: number; delay: number; error: unknown }) => void;\n /** Cancel pending retries. */\n signal?: AbortSignal;\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n\n/**\n * Run `factory()` with exponential backoff. Each attempt awaits an\n * increasing delay capped at `maxDelay`. Throws the last error if every\n * attempt fails.\n *\n * @example\n * const data = await retry(() => api.get(\"/flaky\"), { retries: 5 });\n */\nexport async function retry<T>(factory: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const {\n retries = 3,\n initialDelay = 300,\n maxDelay = 10_000,\n respectRetryAfter = true,\n shouldRetry = () => true,\n onRetry,\n signal,\n } = options;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt < retries) {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n try {\n return await factory();\n } catch (error) {\n lastError = error;\n attempt += 1;\n if (attempt >= retries || !shouldRetry(error, attempt)) {\n throw error;\n }\n const retryAfter =\n respectRetryAfter &&\n typeof (error as { retryAfter?: unknown })?.retryAfter === \"number\"\n ? (error as { retryAfter: number }).retryAfter * 1000\n : null;\n const delay =\n retryAfter !== null\n ? Math.min(retryAfter, maxDelay)\n : Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n onRetry?.({ attempt, delay, error });\n await wait(delay, signal);\n }\n }\n\n throw lastError;\n}\n","/**\n * Generate an RFC4122 v4 idempotency key (UUID). Use as the value for an\n * `Idempotency-Key` header on POST/PATCH requests that must not run twice.\n */\nexport function generateIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16;\n const value = c === \"x\" ? Math.floor(r) : (Math.floor(r) & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface UsePollOptions<T> {\n /** Polling interval in ms. */\n interval: number;\n /** Disable polling without unmounting. Default: false. */\n disabled?: boolean;\n /** Stop polling once the predicate returns true. */\n stopWhen?: (data: T) => boolean;\n /** Called on each error. */\n onError?: (error: unknown) => void;\n}\n\nexport interface UsePollResult<T> {\n data: T | null;\n error: unknown;\n loading: boolean;\n stop: () => void;\n start: () => void;\n}\n\n/**\n * Poll an async factory on a fixed interval. Skips overlapping requests if a\n * prior call has not finished. Pause via `disabled` or `stopWhen`.\n */\nexport function usePoll<T>(\n factory: () => Promise<T>,\n options: UsePollOptions<T>,\n): UsePollResult<T> {\n const { interval, disabled = false, stopWhen, onError } = options;\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState<boolean>(!disabled);\n const stopped = useRef<boolean>(disabled);\n const inFlight = useRef<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n async function tick(): Promise<void> {\n if (stopped.current || inFlight.current) return;\n inFlight.current = true;\n try {\n const next = await factory();\n if (stopped.current) return;\n setData(next);\n setError(null);\n if (stopWhen?.(next)) stopped.current = true;\n } catch (err) {\n if (!stopped.current) {\n setError(err);\n onError?.(err);\n }\n } finally {\n inFlight.current = false;\n setLoading(false);\n if (!stopped.current) {\n timer.current = setTimeout(tick, interval);\n }\n }\n }\n\n useEffect(() => {\n stopped.current = disabled;\n if (disabled) {\n if (timer.current) clearTimeout(timer.current);\n return;\n }\n setLoading(true);\n void tick();\n return () => {\n stopped.current = true;\n if (timer.current) clearTimeout(timer.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [interval, disabled]);\n\n return {\n data,\n error,\n loading,\n stop: () => {\n stopped.current = true;\n if (timer.current) clearTimeout(timer.current);\n },\n start: () => {\n if (!stopped.current) return;\n stopped.current = false;\n void tick();\n },\n };\n}\n","import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\n\nexport interface AuthState<TUser> {\n user: TUser | null;\n token: string | null;\n isAuthenticated: boolean;\n setSession: (session: { user: TUser; token: string }) => void;\n setUser: (user: TUser | null) => void;\n setToken: (token: string | null) => void;\n logout: () => void;\n}\n\nexport interface CreateAuthStoreOptions<TUser> {\n /** Persist key used in storage (default: \"tempest-auth\"). */\n name?: string;\n /** Which storage to persist into (default: localStorage). */\n storage?: \"local\" | \"session\";\n /** Initial user (useful for SSR hydration). */\n initialUser?: TUser | null;\n /** Initial token. */\n initialToken?: string | null;\n}\n\n/**\n * Build a typed Zustand auth store with `persist` middleware. Each app passes\n * its own `TUser` shape so the SDK does not own the user model.\n *\n * @example\n * const useAuthStore = createAuthStore<UserResponse>();\n * const { user, token, logout } = useAuthStore();\n */\nexport function createAuthStore<TUser>(options: CreateAuthStoreOptions<TUser> = {}) {\n const name = options.name ?? \"tempest-auth\";\n const storageImpl = options.storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<AuthState<TUser>>()(\n persist(\n (set) => ({\n user: options.initialUser ?? null,\n token: options.initialToken ?? null,\n isAuthenticated: !!options.initialToken,\n setSession: ({ user, token }) => set({ user, token, isAuthenticated: true }),\n setUser: (user) => set({ user }),\n setToken: (token) => set({ token, isAuthenticated: !!token }),\n logout: () => set({ user: null, token: null, isAuthenticated: false }),\n }),\n {\n name,\n storage: createJSONStorage(storageImpl),\n partialize: (state) => ({ user: state.user, token: state.token }),\n onRehydrateStorage: () => (state) => {\n if (state) state.isAuthenticated = !!state.token;\n },\n },\n ),\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport interface AuthGuardProps {\n /** Whether the current user is authenticated. */\n isAuthenticated: boolean;\n /** Element to render when authenticated. */\n children: ReactNode;\n /** Element to render when not authenticated. Use this to redirect (e.g. `<Navigate to=\"/login\" />`). */\n fallback: ReactNode;\n}\n\n/**\n * Router-agnostic auth gate. The caller decides what to render in either\n * branch — typically `<Outlet />` for protected layouts and `<Navigate />` for\n * the redirect. Pair with {@link createAuthStore} or any custom auth source.\n *\n * @example\n * <AuthGuard\n * isAuthenticated={useAuthStore((s) => s.isAuthenticated)}\n * fallback={<Navigate to=\"/login\" replace />}\n * >\n * <Outlet />\n * </AuthGuard>\n */\nexport function AuthGuard({ isAuthenticated, children, fallback }: AuthGuardProps) {\n return <>{isAuthenticated ? children : fallback}</>;\n}\n","export interface DecodedJWT {\n header: Record<string, unknown>;\n payload: Record<string, unknown> & { exp?: number; iat?: number; sub?: string };\n signature: string;\n}\n\nfunction base64UrlDecode(input: string): string {\n const padded = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = padded.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (padded.length % 4));\n if (typeof atob !== \"undefined\") {\n return atob(padded + padding);\n }\n return Buffer.from(padded + padding, \"base64\").toString(\"binary\");\n}\n\n/**\n * Decode a JWT into header/payload/signature. Does **not** verify the\n * signature — for that, do it server-side or use a JOSE library on the\n * client.\n *\n * @throws If the token shape is invalid (missing parts, bad JSON).\n */\nexport function decodeJWT(token: string): DecodedJWT {\n const parts = token.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT: must contain three segments.\");\n const [headerSeg, payloadSeg, signature] = parts as [string, string, string];\n try {\n return {\n header: JSON.parse(base64UrlDecode(headerSeg)),\n payload: JSON.parse(base64UrlDecode(payloadSeg)),\n signature,\n };\n } catch {\n throw new Error(\"Invalid JWT: header or payload is not valid JSON.\");\n }\n}\n\n/**\n * Return true when the JWT's `exp` claim is in the past (or missing).\n *\n * @param token - JWT to inspect.\n * @param leewaySeconds - Treat tokens expiring within this window as expired.\n */\nexport function isJWTExpired(token: string, leewaySeconds = 0): boolean {\n try {\n const { payload } = decodeJWT(token);\n if (typeof payload.exp !== \"number\") return true;\n const nowSeconds = Math.floor(Date.now() / 1000);\n return payload.exp <= nowSeconds + leewaySeconds;\n } catch {\n return true;\n }\n}\n","import { lazy } from \"react\";\nimport type { ComponentType } from \"react\";\n\nexport interface LazyWithRetryOptions {\n /** Max attempts. Default: 3. */\n retries?: number;\n /** Initial delay (ms) before retrying. Default: 400. */\n initialDelay?: number;\n /**\n * Reload the page after every retry fails. Helps when the stale chunk\n * error is caused by an old `index.html` referencing deleted bundles.\n * Default: true.\n */\n reloadOnFinalFailure?: boolean;\n}\n\n/**\n * Wrap `React.lazy` with automatic retry. Common cause of failure:\n * deployed-then-cached `index.html` references chunk filenames that no\n * longer exist. Retrying after a short delay typically picks up the new\n * bundle; a final `location.reload()` recovers from stale `index.html`.\n *\n * @example\n * const Settings = lazyWithRetry(() => import(\"./Settings\"));\n */\nexport function lazyWithRetry<T extends ComponentType<unknown>>(\n factory: () => Promise<{ default: T }>,\n options: LazyWithRetryOptions = {},\n): ReturnType<typeof lazy<T>> {\n const { retries = 3, initialDelay = 400, reloadOnFinalFailure = true } = options;\n\n async function load(attempt = 1): Promise<{ default: T }> {\n try {\n return await factory();\n } catch (error) {\n if (attempt >= retries) {\n if (reloadOnFinalFailure && typeof window !== \"undefined\") {\n window.location.reload();\n }\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, initialDelay * 2 ** (attempt - 1)));\n return load(attempt + 1);\n }\n }\n\n return lazy(load) as ReturnType<typeof lazy<T>>;\n}\n","/**\n * Deduplicate concurrent refresh calls. When multiple 401 responses arrive\n * at once, all of them share the same in-flight `refresh()` promise instead\n * of triggering N parallel refreshes.\n *\n * @example\n * const refresh = createRefreshQueue(() => AuthService.refresh());\n *\n * // In every request that hits 401:\n * await refresh();\n * // ...retry the original request\n */\nexport function createRefreshQueue(refresh: () => Promise<void>): () => Promise<void> {\n let current: Promise<void> | null = null;\n\n return () => {\n if (current) return current;\n current = (async () => {\n try {\n await refresh();\n } finally {\n current = null;\n }\n })();\n return current;\n };\n}\n","import { createApiClient } from \"../http\";\nimport type { ApiClient } from \"../http\";\nimport { createAuthStore } from \"./create-auth-store\";\nimport type { AuthState } from \"./create-auth-store\";\nimport { createRefreshQueue } from \"./refresh-queue\";\n\n/** The token envelope returned by a Tempest FastAPI SDK login/refresh route. */\nexport interface TempestTokenResponse {\n /** The bearer access token. */\n access_token: string;\n /** Token type — always `\"bearer\"` for the SDK. */\n token_type?: string;\n /** Optional refresh token (when the API returns it in the body, not a cookie). */\n refresh_token?: string;\n}\n\nexport interface CreateTempestAuthOptions<TUser> {\n /** Base URL of the API. Required. */\n baseURL: string;\n /** Login route (`POST`). Default: `\"/api/auth/login\"`. */\n loginPath?: string;\n /** Refresh route (`POST`). Default: `\"/api/auth/refresh\"`. */\n refreshPath?: string;\n /** Optional current-user route (`GET`) called after login/refresh. */\n mePath?: string;\n /** Persist key for the store. Default: `\"tempest-auth\"`. */\n storeName?: string;\n /** Storage backend. Default: `\"local\"`. */\n storage?: \"local\" | \"session\";\n /** Send cookies (needed when the refresh token lives in an httpOnly cookie). */\n withCredentials?: boolean;\n /** Custom fetch implementation (testing / SSR). Defaults to `globalThis.fetch`. */\n fetcher?: typeof fetch;\n /**\n * Extract tokens from a login/refresh response. Default reads\n * `access_token` + `refresh_token`.\n */\n parseTokens?: (data: unknown) => { token: string; refreshToken?: string };\n /** Pull the user out of the login response, when the API embeds it. */\n parseUser?: (data: unknown) => TUser | null;\n /**\n * Build the refresh request body. Default sends `{ refresh_token }` when a\n * refresh token is stored, else `undefined` (cookie-based refresh).\n */\n refreshBody?: (refreshToken: string | null) => unknown;\n}\n\nexport interface TempestAuth<TUser, TCredentials> {\n /** The persisted Zustand auth store hook (compatible with `<AuthGuard>`). */\n useAuthStore: ReturnType<typeof createAuthStore<TUser>>;\n /** A `createApiClient` wired with bearer auth + 401 → refresh → retry. */\n api: ApiClient;\n /** Authenticate, store the session, and resolve the user (or null). */\n login: (credentials: TCredentials) => Promise<TUser | null>;\n /** Clear the session (and the stored refresh token). */\n logout: () => void;\n /** Refresh the access token (deduplicated across concurrent callers). */\n refresh: () => Promise<void>;\n /** The current access token, or null. */\n getToken: () => string | null;\n}\n\nfunction defaultParseTokens(data: unknown): { token: string; refreshToken?: string } {\n const d = (data ?? {}) as TempestTokenResponse;\n return { token: d.access_token, refreshToken: d.refresh_token };\n}\n\n/**\n * Turn-key auth preset wiring `createAuthStore` + `createRefreshQueue` +\n * `createApiClient` to the Tempest FastAPI SDK auth contract: login returns\n * `{ access_token, token_type }`, requests carry `Authorization: Bearer`, and a\n * `401` triggers a single deduplicated refresh + retry. Logout (or a failed\n * refresh) clears the session.\n *\n * @example\n * const auth = createTempestAuth<User, { email: string; password: string }>({\n * baseURL: import.meta.env.VITE_API_URL,\n * mePath: \"/api/auth/me\",\n * });\n *\n * await auth.login({ email, password }); // stores session, returns the user\n * const orders = await auth.api.get(\"/api/orders\"); // sends the bearer token\n * auth.logout();\n *\n * @param options - The auth configuration.\n * @returns The store hook, a wired API client, and login/logout/refresh helpers.\n */\nexport function createTempestAuth<TUser, TCredentials = { email: string; password: string }>(\n options: CreateTempestAuthOptions<TUser>,\n): TempestAuth<TUser, TCredentials> {\n const {\n baseURL,\n loginPath = \"/api/auth/login\",\n refreshPath = \"/api/auth/refresh\",\n mePath,\n storeName = \"tempest-auth\",\n storage = \"local\",\n withCredentials = false,\n fetcher,\n parseTokens = defaultParseTokens,\n parseUser,\n refreshBody = (rt) => (rt ? { refresh_token: rt } : undefined),\n } = options;\n\n const useAuthStore = createAuthStore<TUser>({ name: storeName, storage });\n const refreshKey = `${storeName}-refresh`;\n\n function storageImpl(): Storage | null {\n if (typeof window === \"undefined\") return null;\n return storage === \"session\" ? window.sessionStorage : window.localStorage;\n }\n function readRefreshToken(): string | null {\n return storageImpl()?.getItem(refreshKey) ?? null;\n }\n function writeRefreshToken(token: string | null): void {\n const s = storageImpl();\n if (!s) return;\n if (token) s.setItem(refreshKey, token);\n else s.removeItem(refreshKey);\n }\n\n const state = (): AuthState<TUser> => useAuthStore.getState();\n const getToken = (): string | null => state().token;\n\n // Bare client (no auth/refresh) used for the login + refresh calls themselves.\n const bareApi = createApiClient({ baseURL, withCredentials, fetcher });\n\n async function fetchUser(): Promise<TUser | null> {\n if (!mePath) return state().user;\n const token = getToken();\n const user = await createApiClient({\n baseURL,\n withCredentials,\n fetcher,\n getToken: () => token,\n }).get<TUser>(mePath);\n state().setUser(user);\n return user;\n }\n\n async function login(credentials: TCredentials): Promise<TUser | null> {\n const data = await bareApi.post<unknown>(loginPath, { body: credentials });\n const { token, refreshToken } = parseTokens(data);\n state().setToken(token);\n writeRefreshToken(refreshToken ?? null);\n const embedded = parseUser?.(data);\n if (embedded != null) {\n state().setUser(embedded);\n return embedded;\n }\n return fetchUser();\n }\n\n function logout(): void {\n state().logout();\n writeRefreshToken(null);\n }\n\n const refresh = createRefreshQueue(async () => {\n const data = await bareApi.post<unknown>(refreshPath, {\n body: refreshBody(readRefreshToken()),\n });\n const { token, refreshToken } = parseTokens(data);\n state().setToken(token);\n if (refreshToken) writeRefreshToken(refreshToken);\n });\n\n const api = createApiClient({\n baseURL,\n withCredentials,\n fetcher,\n getToken,\n refresh,\n onUnauthorized: () => logout(),\n });\n\n return { useAuthStore, api, login, logout, refresh, getToken };\n}\n","import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { AccessControl } from \"./types\";\n\nconst AccessControlContext = createContext<AccessControl | null>(null);\n\nexport interface AccessControlProviderProps {\n /** The access-control strategy made available to descendants. */\n control: AccessControl;\n children: ReactNode;\n}\n\n/**\n * Provide an {@link AccessControl} strategy to the React tree. Components such\n * as `<Can>` and the `useCan` hook read it from context.\n *\n * @example\n * ```tsx\n * <AccessControlProvider control={createRoleAccessControl({ role: \"admin\", roles: { admin: [\"*\"] } })}>\n * <App />\n * </AccessControlProvider>\n * ```\n */\nexport function AccessControlProvider({ control, children }: AccessControlProviderProps) {\n return (\n <AccessControlContext.Provider value={control}>{children}</AccessControlContext.Provider>\n );\n}\n\n/**\n * Read the current {@link AccessControl} from context.\n *\n * Returns `null` when no {@link AccessControlProvider} is present. Callers MUST\n * treat the absence of a provider as **\"allow all\"** — i.e. when this returns\n * `null`, access checks should default to permitted. This keeps the SDK\n * opt-in: dropping in a provider adds enforcement, removing it disables it.\n */\nexport function useAccessControl(): AccessControl | null {\n return useContext(AccessControlContext);\n}\n","import { useEffect, useState } from \"react\";\nimport { useAccessControl } from \"./access-control-context\";\nimport type { CanParams, CanResult } from \"./types\";\n\nexport interface UseCanResult {\n /** Whether the action is permitted. Defaults to `true` while loading is not the concern of the caller. */\n allowed: boolean;\n /** `true` while an async `can` check is pending. */\n isLoading: boolean;\n /** Optional explanation, typically present when `allowed` is `false`. */\n reason?: string;\n}\n\nfunction normalize(result: boolean | CanResult): CanResult {\n return typeof result === \"boolean\" ? { can: result } : result;\n}\n\n/**\n * Resolve an access check against the {@link AccessControl} in context.\n *\n * Handles sync booleans, sync {@link CanResult}, and promises of either. When\n * no provider is present, access is allowed (see `useAccessControl`). The check\n * re-runs whenever the params change.\n *\n * @param params - The action/resource being checked.\n */\nexport function useCan(params: CanParams): UseCanResult {\n const control = useAccessControl();\n const paramsKey = JSON.stringify(params);\n\n const [state, setState] = useState<UseCanResult>(() =>\n control ? { allowed: false, isLoading: true } : { allowed: true, isLoading: false },\n );\n\n useEffect(() => {\n if (!control) {\n setState({ allowed: true, isLoading: false });\n return;\n }\n\n let cancelled = false;\n setState((prev) => ({ ...prev, isLoading: true }));\n\n Promise.resolve(control.can(params))\n .then((raw) => {\n if (cancelled) return;\n const result = normalize(raw);\n setState({ allowed: result.can, isLoading: false, reason: result.reason });\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n setState({\n allowed: false,\n isLoading: false,\n reason: error instanceof Error ? error.message : \"access check failed\",\n });\n });\n\n return () => {\n cancelled = true;\n };\n // `paramsKey` is the stable stringified form of `params`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [control, paramsKey]);\n\n return state;\n}\n","import type { ReactNode } from \"react\";\nimport { useCan } from \"./use-can\";\nimport type { CanParams } from \"./types\";\n\nexport interface CanProps extends CanParams {\n /** Rendered when the action is allowed. */\n children: ReactNode;\n /** Rendered when the action is denied. Defaults to nothing. */\n fallback?: ReactNode;\n}\n\n/**\n * Conditionally render based on an access check. Renders `children` when the\n * action is allowed, otherwise `fallback` (or nothing). While an async check is\n * pending, nothing is rendered.\n *\n * @example\n * ```tsx\n * <Can action=\"create\" resource=\"posts\" fallback={<p>No access</p>}>\n * <NewPostButton />\n * </Can>\n * ```\n */\nexport function Can({ action, resource, params, children, fallback }: CanProps) {\n const { allowed, isLoading } = useCan({ action, resource, params });\n if (isLoading) return <>{fallback ?? null}</>;\n return <>{allowed ? children : (fallback ?? null)}</>;\n}\n","import type { AccessControl, CanParams, CanResult } from \"./types\";\n\nexport interface RoleAccessControlConfig {\n /** Permission strings granted directly, regardless of role. */\n permissions?: string[];\n /** Map of role name → permission strings granted by that role. */\n roles?: Record<string, string[]>;\n /** The active role(s). Their permissions (from `roles`) are merged in. */\n role?: string | string[];\n}\n\nfunction resolvePermissions(config: RoleAccessControlConfig): Set<string> {\n const set = new Set<string>(config.permissions ?? []);\n const roles = config.role ? (Array.isArray(config.role) ? config.role : [config.role]) : [];\n for (const role of roles) {\n for (const perm of config.roles?.[role] ?? []) {\n set.add(perm);\n }\n }\n return set;\n}\n\n/**\n * Build a simple RBAC {@link AccessControl} from a static permission set.\n *\n * Permission strings are `\"<resource>:<action>\"` (e.g. `\"posts:create\"`) or a\n * bare `\"<action>\"`. Wildcards are supported: `\"*\"` grants everything and\n * `\"<resource>:*\"` grants every action on a resource.\n *\n * The effective set is `config.permissions` plus, for each active role in\n * `config.role`, the permissions listed in `config.roles[role]`.\n *\n * @param config - Permissions, role map, and active role(s).\n * @returns An access-control strategy backed by the resolved permission set.\n *\n * @example\n * ```ts\n * const ac = createRoleAccessControl({\n * role: \"editor\",\n * roles: { editor: [\"posts:*\", \"comments:read\"] },\n * });\n * ac.can({ action: \"create\", resource: \"posts\" }); // true\n * ```\n */\nexport function createRoleAccessControl(config: RoleAccessControlConfig): AccessControl {\n const granted = resolvePermissions(config);\n\n return {\n can({ action, resource }: CanParams): CanResult {\n const allowed =\n granted.has(\"*\") ||\n (resource !== undefined &&\n (granted.has(`${resource}:*`) || granted.has(`${resource}:${action}`))) ||\n (resource === undefined && granted.has(action));\n\n return allowed ? { can: true } : { can: false, reason: \"missing permission\" };\n },\n };\n}\n","import { decodeJWT } from \"@/auth/jwt\";\n\nexport interface PermissionsFromTokenOptions {\n /** JWT claim to read permissions from. Default: `\"permissions\"`. */\n claim?: string;\n}\n\nfunction toPermissionList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\") {\n // Space-delimited scope strings (OAuth convention).\n return value.split(/\\s+/).filter(Boolean);\n }\n return [];\n}\n\n/**\n * Extract a permission list from a JWT.\n *\n * Reads the configured claim (default `\"permissions\"`); if absent, falls back to\n * the OAuth `\"scopes\"`/`\"scope\"` claims. Array claims are used as-is; string\n * claims are split on whitespace. Returns `[]` on any decode failure or when no\n * recognizable claim is present.\n *\n * @param token - The JWT to inspect (signature is **not** verified).\n * @param options - Optional claim override.\n * @returns The list of permission strings, or `[]` on failure.\n */\nexport function permissionsFromToken(\n token: string,\n options?: PermissionsFromTokenOptions,\n): string[] {\n try {\n const { payload } = decodeJWT(token);\n const claim = options?.claim ?? \"permissions\";\n const primary = toPermissionList(payload[claim]);\n if (primary.length > 0) return primary;\n\n if (options?.claim === undefined) {\n const scopes = toPermissionList(payload[\"scopes\"]);\n if (scopes.length > 0) return scopes;\n return toPermissionList(payload[\"scope\"]);\n }\n return primary;\n } catch {\n return [];\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { OAuthCredential, OAuthError } from \"./types\";\n\nexport type GoogleSignInTheme = \"filled_blue\" | \"filled_black\" | \"outline\";\nexport type GoogleSignInText = \"signin_with\" | \"signup_with\" | \"continue_with\" | \"signin\";\nexport type GoogleSignInShape = \"rectangular\" | \"pill\" | \"circle\" | \"square\";\nexport type GoogleSignInSize = \"large\" | \"medium\" | \"small\";\n\nexport interface GoogleSignInProps {\n /**\n * `GoogleLogin` component from `@react-oauth/google`. The caller imports\n * it and passes it through so the SDK doesn't take `@react-oauth/google`\n * as a peer dep.\n */\n component: (props: Record<string, unknown>) => ReactNode;\n /** Fired with the validated credential on success. */\n onSuccess: (credential: OAuthCredential) => void | Promise<void>;\n /** Fired with a normalised error on failure. */\n onError?: (error: OAuthError) => void;\n /** Optional locale override (e.g. `\"pt-BR\"`). Falls back to browser locale. */\n locale?: string;\n /** Visual theme — passed through to `<GoogleLogin>`. */\n theme?: GoogleSignInTheme;\n /** Button text variant. */\n text?: GoogleSignInText;\n /** Button shape. */\n shape?: GoogleSignInShape;\n /** Button size. */\n size?: GoogleSignInSize;\n /** Disable Google's \"One Tap\" auto-prompt. Default `false`. */\n disableOneTap?: boolean;\n /** Optional `width` override (px) — Google's button is fixed-width. */\n width?: number;\n /** Optional className applied to the wrapper. */\n className?: string;\n /** Optional inline style applied to the wrapper. */\n style?: CSSProperties;\n}\n\n/**\n * Thin wrapper over `@react-oauth/google`'s `<GoogleLogin>` that:\n *\n * 1. Normalises the success payload into [[OAuthCredential]] (`idToken`,\n * `provider: \"google\"`, `raw`).\n * 2. Normalises errors into [[OAuthError]].\n * 3. Lets you pass `GoogleLogin` via the `component` prop, so the SDK does\n * not declare `@react-oauth/google` as a peer dep — apps that don't use\n * Google never pay for it.\n *\n * @example\n * import { GoogleLogin, GoogleOAuthProvider } from \"@react-oauth/google\";\n * import { GoogleSignIn } from \"tempest-react-sdk\";\n *\n * <GoogleOAuthProvider clientId={import.meta.env.VITE_GOOGLE_CLIENT_ID}>\n * <GoogleSignIn\n * component={GoogleLogin}\n * onSuccess={async ({ idToken }) => {\n * await api.post(\"/auth/google\", { body: { id_token: idToken } });\n * }}\n * onError={(err) => toast.error(err.message)}\n * />\n * </GoogleOAuthProvider>\n */\nexport function GoogleSignIn({\n component: Component,\n onSuccess,\n onError,\n locale,\n theme,\n text,\n shape,\n size,\n disableOneTap,\n width,\n className,\n style,\n}: GoogleSignInProps) {\n return (\n <div className={className} style={style}>\n {Component({\n onSuccess: (response: { credential?: string }) => {\n if (!response.credential) {\n onError?.({\n provider: \"google\",\n message: \"Google returned no credential\",\n raw: response,\n });\n return;\n }\n return onSuccess({\n idToken: response.credential,\n provider: \"google\",\n raw: response,\n });\n },\n onError: () => {\n onError?.({\n provider: \"google\",\n message: \"Google login failed\",\n });\n },\n locale,\n theme,\n text,\n shape,\n size,\n useOneTap: !disableOneTap,\n width,\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface UseOAuthCallbackOptions<T> {\n /** Function that exchanges the provider response for an app session. Called once on mount. */\n exchange: () => Promise<T>;\n /** Fired with the result on success. Receives the value resolved by `exchange`. */\n onSuccess?: (result: T) => void | Promise<void>;\n /** Fired when `exchange` throws or rejects. */\n onError?: (error: unknown) => void;\n}\n\nexport interface UseOAuthCallbackResult<T> {\n /** `true` while the exchange promise is pending. */\n loading: boolean;\n /** Last resolved value, when `status === \"success\"`. */\n data: T | null;\n /** Last rejection reason, when `status === \"error\"`. */\n error: unknown;\n /** Aggregated state — `\"pending\"`, `\"success\"`, or `\"error\"`. */\n status: \"pending\" | \"success\" | \"error\";\n}\n\n/**\n * Run an OAuth-callback \"exchange\" exactly once on mount. Designed for\n * `/callback` routes that receive provider redirects and need to swap a\n * code/token for an app session via the backend.\n *\n * Survives React StrictMode double-mounting in dev — uses a ref guard to\n * ensure `exchange` runs once.\n *\n * @example\n * function OAuthCallback() {\n * const { loading, error } = useOAuthCallback({\n * exchange: async () => {\n * const code = new URLSearchParams(location.search).get(\"code\")!;\n * return api.post(\"/auth/google/exchange\", { body: { code } });\n * },\n * onSuccess: ({ token, user }) => {\n * useAuthStore.getState().setSession({ user, token });\n * navigate(\"/dashboard\", { replace: true });\n * },\n * onError: () => navigate(\"/login?error=oauth\", { replace: true }),\n * });\n *\n * if (loading) return <Spinner />;\n * if (error) return <ErrorState description=\"OAuth falhou\" />;\n * return null;\n * }\n */\nexport function useOAuthCallback<T>(\n options: UseOAuthCallbackOptions<T>,\n): UseOAuthCallbackResult<T> {\n const { exchange, onSuccess, onError } = options;\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [status, setStatus] = useState<\"pending\" | \"success\" | \"error\">(\"pending\");\n const ranRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (ranRef.current) return;\n ranRef.current = true;\n let cancelled = false;\n exchange()\n .then((result) => {\n if (cancelled) return;\n setData(result);\n setStatus(\"success\");\n return onSuccess?.(result);\n })\n .catch((err) => {\n if (cancelled) return;\n setError(err);\n setStatus(\"error\");\n onError?.(err);\n });\n return () => {\n cancelled = true;\n };\n }, [exchange, onSuccess, onError]);\n\n return { loading: status === \"pending\", data, error, status };\n}\n","/** Recommended `staleTime` presets (milliseconds). */\nexport const STALE_TIME = {\n SHORT: 30 * 1000,\n DEFAULT: 5 * 60 * 1000,\n LONG: 30 * 60 * 1000,\n INFINITE: Infinity,\n} as const;\n\n/** Recommended `gcTime` presets (milliseconds). */\nexport const CACHE_TIME = {\n SHORT: 5 * 60 * 1000,\n DEFAULT: 30 * 60 * 1000,\n LONG: 60 * 60 * 1000,\n} as const;\n\n/** Recommended refetch intervals (milliseconds). */\nexport const REFETCH_TIME = {\n REALTIME: 5 * 1000,\n FAST: 30 * 1000,\n DEFAULT: 60 * 1000,\n SLOW: 5 * 60 * 1000,\n} as const;\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KeyBuilder = (...args: any[]) => readonly unknown[];\n\n/**\n * Build a typed query-key factory for a domain. Each entry can be a static\n * tuple or a function returning a tuple. The returned object is `as const`\n * so TanStack Query infers literal keys.\n *\n * @example\n * const userKeys = createQueryKeys(\"user\", {\n * me: () => [\"me\"] as const,\n * byId: (id: string) => [id] as const,\n * list: (filters: { page: number }) => [\"list\", filters] as const,\n * });\n * // userKeys.byId(\"42\") === [\"user\", \"42\"]\n */\nexport function createQueryKeys<\n TKey extends string,\n TEntries extends Record<string, KeyBuilder | readonly unknown[]>,\n>(scope: TKey, entries: TEntries) {\n const output = { all: [scope] as const } as { all: readonly [TKey] } & {\n [K in keyof TEntries]: TEntries[K] extends KeyBuilder\n ? (...args: Parameters<TEntries[K]>) => readonly [TKey, ...ReturnType<TEntries[K]>]\n : TEntries[K] extends readonly unknown[]\n ? readonly [TKey, ...TEntries[K]]\n : never;\n };\n\n for (const [name, entry] of Object.entries(entries) as [\n keyof TEntries,\n KeyBuilder | readonly unknown[],\n ][]) {\n if (typeof entry === \"function\") {\n (output as Record<string, unknown>)[name as string] = (...args: unknown[]) =>\n [scope, ...entry(...args)] as const;\n } else {\n (output as Record<string, unknown>)[name as string] = [scope, ...entry] as const;\n }\n }\n\n return output;\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { DefaultOptions } from \"@tanstack/react-query\";\nimport { STALE_TIME, CACHE_TIME } from \"./constants\";\n\nexport interface QueryProviderProps {\n children: ReactNode;\n /** Pass an existing client to share it across roots. */\n client?: QueryClient;\n /** Overrides for the default options applied when no `client` is provided. */\n defaultOptions?: DefaultOptions;\n}\n\n/**\n * Wrapper around `QueryClientProvider` that bootstraps a `QueryClient` with\n * sane SDK defaults (5-minute stale time, 30-minute gc time, 1 retry).\n */\nexport function QueryProvider({ children, client, defaultOptions }: QueryProviderProps) {\n const [internalClient] = useState<QueryClient>(\n () =>\n client ??\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: STALE_TIME.DEFAULT,\n gcTime: CACHE_TIME.DEFAULT,\n retry: 1,\n refetchOnWindowFocus: false,\n ...(defaultOptions?.queries ?? {}),\n },\n mutations: {\n retry: 0,\n ...(defaultOptions?.mutations ?? {}),\n },\n },\n }),\n );\n\n return <QueryClientProvider client={internalClient}>{children}</QueryClientProvider>;\n}\n","// Contracts mirroring the Tempest FastAPI SDK pagination envelopes, so a\n// React frontend consumes them with no manual mapping.\n//\n// Offset (fastapi-pagination `Page` / BasePaginationSchema):\n// { items, total, page, size, pages } (some configs name the size `page_size`)\n// Cursor (CursorPaginationSchema):\n// { items, next_cursor, has_more, limit }\n\n/** Offset-paginated response envelope (fastapi-pagination `Page[T]`). */\nexport interface OffsetPage<T> {\n /** The rows for the current page. */\n items: T[];\n /** Total number of matching rows across all pages. */\n total: number;\n /** Current 1-based page number. */\n page: number;\n /** Total number of pages. */\n pages: number;\n /** Page size — fastapi-pagination emits `size`. */\n size?: number;\n /** Page size — some backends name it `page_size` instead. */\n page_size?: number;\n}\n\n/** Cursor-paginated response envelope (`CursorPaginationSchema[T]`). */\nexport interface CursorPage<T> {\n /** The rows for this batch. */\n items: T[];\n /** Opaque cursor for the next batch, or null when exhausted. Pass it back verbatim. */\n next_cursor: string | null;\n /** Whether another batch exists. */\n has_more: boolean;\n /** Batch size used for this query. */\n limit: number;\n}\n\n/** Offset filter query params (fastapi-pagination / `BasePaginationFilterSchema`). */\nexport interface OffsetParams {\n page?: number;\n /** Page size — fastapi-pagination convention. */\n size?: number;\n /** Page size — `page_size` convention. */\n page_size?: number;\n order_by?: string;\n ascending?: boolean;\n}\n\n/** Cursor filter query params (`CursorPaginationFilterSchema`). */\nexport interface CursorParams {\n cursor?: string | null;\n limit?: number;\n order_by?: string;\n ascending?: boolean;\n}\n\n/**\n * Type guard for an {@link OffsetPage} envelope.\n *\n * @param value - The unknown value to test.\n * @returns Whether it carries `items` + `total` + `page` + `pages`.\n */\nexport function isOffsetPage<T = unknown>(value: unknown): value is OffsetPage<T> {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.items) && typeof v.total === \"number\" && typeof v.pages === \"number\";\n}\n\n/**\n * Type guard for a {@link CursorPage} envelope.\n *\n * @param value - The unknown value to test.\n * @returns Whether it carries `items` + `has_more` + a `next_cursor` key.\n */\nexport function isCursorPage<T = unknown>(value: unknown): value is CursorPage<T> {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.items) && typeof v.has_more === \"boolean\" && \"next_cursor\" in v;\n}\n\n/**\n * Build an empty {@link OffsetPage} — handy as `placeholderData`/`initialData`.\n *\n * @param pageSize - The page size to report (default 20).\n * @returns An empty offset page on page 1.\n */\nexport function emptyOffsetPage<T>(pageSize = 20): OffsetPage<T> {\n return { items: [], total: 0, page: 1, size: pageSize, pages: 0 };\n}\n","import { useCallback, useState } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { QueryKey, UseQueryOptions } from \"@tanstack/react-query\";\n\nimport type { OffsetPage, OffsetParams } from \"./pagination\";\n\nexport interface UsePaginatedQueryOptions<T> extends Omit<\n UseQueryOptions<OffsetPage<T>, Error, OffsetPage<T>, QueryKey>,\n \"queryKey\" | \"queryFn\"\n> {\n /** Base query key — the current page/sort is appended for cache isolation. */\n queryKey: QueryKey;\n /** Fetcher receiving the offset params; return the backend envelope. */\n queryFn: (params: OffsetParams) => Promise<OffsetPage<T>> | OffsetPage<T>;\n /** Initial 1-based page. Default: 1. */\n initialPage?: number;\n /** Page size. Default: 20. */\n pageSize?: number;\n /**\n * Query-param name for the page size. fastapi-pagination uses `\"size\"`\n * (default); SDK `BasePaginationFilterSchema` configs may use `\"page_size\"`.\n */\n sizeParam?: \"size\" | \"page_size\";\n /** Initial `order_by` (only sent when set). */\n orderBy?: string;\n /** Initial `ascending` (only sent when `orderBy` is set). Default: false. */\n ascending?: boolean;\n}\n\nexport interface UsePaginatedQueryResult<T> {\n /** The current page envelope, or undefined while the first load is pending. */\n page: OffsetPage<T> | undefined;\n /** The rows of the current page (empty array while pending). */\n items: T[];\n /** Current 1-based page number (controlled by the hook). */\n pageNumber: number;\n /** Total page count from the last successful response. */\n pageCount: number;\n /** Total row count from the last successful response. */\n total: number;\n hasNext: boolean;\n hasPrev: boolean;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n /** Jump to a specific 1-based page (clamped to >= 1). */\n setPage: (page: number) => void;\n /** Go to the next page when available. */\n next: () => void;\n /** Go to the previous page when available. */\n prev: () => void;\n /** Refetch the current page. */\n refetch: () => void;\n}\n\n/**\n * Offset-pagination hook over TanStack Query for the fastapi-pagination /\n * Tempest envelope (`{ items, total, page, size, pages }`).\n *\n * It owns the page state, sends `page` + the size param (`size` by default,\n * or `page_size` via `sizeParam`) plus optional `order_by`/`ascending` to your\n * fetcher, keeps the previous page visible while the next loads, and derives\n * `hasNext`/`hasPrev`/`pageCount`.\n *\n * @example\n * const users = usePaginatedQuery<User>({\n * queryKey: [\"users\"],\n * pageSize: 25,\n * queryFn: (params) => usersService.listUsers(params),\n * });\n * // users.items, users.next(), users.hasNext, users.pageCount\n */\nexport function usePaginatedQuery<T>(\n options: UsePaginatedQueryOptions<T>,\n): UsePaginatedQueryResult<T> {\n const {\n queryKey,\n queryFn,\n initialPage = 1,\n pageSize = 20,\n sizeParam = \"size\",\n orderBy,\n ascending = false,\n ...queryOptions\n } = options;\n\n const [pageNumber, setPageNumber] = useState(initialPage);\n\n const query = useQuery<OffsetPage<T>, Error>({\n ...queryOptions,\n queryKey: [...queryKey, { page: pageNumber, pageSize, sizeParam, orderBy, ascending }],\n queryFn: () => {\n const params: OffsetParams = { page: pageNumber, [sizeParam]: pageSize };\n if (orderBy) {\n params.order_by = orderBy;\n params.ascending = ascending;\n }\n return queryFn(params);\n },\n placeholderData: keepPreviousData,\n });\n\n const page = query.data;\n const pageCount = page?.pages ?? 0;\n const hasNext = pageNumber < pageCount;\n const hasPrev = pageNumber > 1;\n\n const setPage = useCallback((next: number) => setPageNumber(Math.max(1, next)), []);\n const next = useCallback(() => setPageNumber((p) => (p < pageCount ? p + 1 : p)), [pageCount]);\n const prev = useCallback(() => setPageNumber((p) => (p > 1 ? p - 1 : p)), []);\n\n return {\n page,\n items: page?.items ?? [],\n pageNumber,\n pageCount,\n total: page?.total ?? 0,\n hasNext,\n hasPrev,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n setPage,\n next,\n prev,\n refetch: () => void query.refetch(),\n };\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { InfiniteData, QueryKey, UseInfiniteQueryOptions } from \"@tanstack/react-query\";\n\nimport type { CursorPage, CursorParams } from \"./pagination\";\n\nexport interface UseCursorQueryOptions<T> extends Omit<\n UseInfiniteQueryOptions<\n CursorPage<T>,\n Error,\n InfiniteData<CursorPage<T>, string | null>,\n QueryKey,\n string | null\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n> {\n /** Base query key — `limit`/sort is appended for cache isolation. */\n queryKey: QueryKey;\n /** Fetcher receiving the cursor params; return the backend envelope. */\n queryFn: (params: CursorParams) => Promise<CursorPage<T>> | CursorPage<T>;\n /** Batch size sent as `limit`. Default: 20. */\n limit?: number;\n /** Initial `order_by`. */\n orderBy?: string;\n /** Initial `ascending`. Default: false. */\n ascending?: boolean;\n}\n\nexport interface UseCursorQueryResult<T> {\n /** All rows fetched so far, flattened across batches. */\n items: T[];\n /** The raw batches, in fetch order. */\n pages: CursorPage<T>[];\n hasNextPage: boolean;\n isLoading: boolean;\n isFetchingNextPage: boolean;\n error: Error | null;\n /** Fetch the next batch (no-op when exhausted). */\n fetchNextPage: () => void;\n /** Refetch from the first batch. */\n refetch: () => void;\n}\n\n/**\n * Cursor-pagination hook over TanStack Query's `useInfiniteQuery` for the\n * Tempest `CursorPaginationSchema` envelope\n * (`{ items, next_cursor, has_more, limit }`).\n *\n * The opaque `next_cursor` is fed straight back as the next page param; the\n * loop stops when `has_more` is false (or `next_cursor` is null).\n *\n * @example\n * const feed = useCursorQuery<Post>({\n * queryKey: [\"feed\"],\n * limit: 30,\n * queryFn: (params) => postsService.listPosts(params),\n * });\n * // feed.items, feed.fetchNextPage(), feed.hasNextPage\n */\nexport function useCursorQuery<T>(options: UseCursorQueryOptions<T>): UseCursorQueryResult<T> {\n const { queryKey, queryFn, limit = 20, orderBy, ascending = false, ...queryOptions } = options;\n\n const query = useInfiniteQuery<\n CursorPage<T>,\n Error,\n InfiniteData<CursorPage<T>, string | null>,\n QueryKey,\n string | null\n >({\n ...queryOptions,\n queryKey: [...queryKey, { limit, orderBy, ascending }],\n initialPageParam: null,\n queryFn: ({ pageParam }) =>\n queryFn({ cursor: pageParam, limit, order_by: orderBy, ascending }),\n getNextPageParam: (last) => (last.has_more ? last.next_cursor : undefined),\n });\n\n const pages = query.data?.pages ?? [];\n\n return {\n items: pages.flatMap((p) => p.items),\n pages,\n hasNextPage: query.hasNextPage,\n isLoading: query.isLoading,\n isFetchingNextPage: query.isFetchingNextPage,\n error: query.error,\n fetchNextPage: () => void query.fetchNextPage(),\n refetch: () => void query.refetch(),\n };\n}\n","import type { ApiClient, RequestOptions } from \"@/http/types\";\nimport type { OffsetPage } from \"@/query/pagination\";\n\n/** Query-param values accepted by the API client for a list request. */\ntype ParamValue = string | number | boolean | undefined | null;\n\n/** Filters passed to {@link DataProvider.getList}, spread verbatim into the query string. */\nexport type DataFilters = Record<string, ParamValue>;\n\n/** Parameters for a paginated, sorted, filtered list request. */\nexport interface GetListParams {\n /** Offset pagination — 1-based `page` and `pageSize`. */\n pagination?: { page?: number; pageSize?: number };\n /** Single-field sort. `order` defaults to `\"asc\"`. */\n sort?: { field: string; order?: \"asc\" | \"desc\" };\n /** Arbitrary filter query params, spread onto the request. */\n filters?: DataFilters;\n}\n\n/**\n * Refine-style data provider over the Tempest FastAPI SDK CRUD/pagination\n * conventions. Implementations are stateless wrappers around an {@link ApiClient}.\n */\nexport interface DataProvider {\n /**\n * Fetch a paginated list of a resource.\n *\n * @param resource - The resource name (e.g. `\"users\"`).\n * @param params - Pagination, sort and filter parameters.\n * @returns The offset-paginated envelope.\n */\n getList<T>(resource: string, params?: GetListParams): Promise<OffsetPage<T>>;\n /**\n * Fetch a single record by id.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns The record.\n */\n getOne<T>(resource: string, id: string | number): Promise<T>;\n /**\n * Fetch many records by id (default: parallel {@link DataProvider.getOne}).\n *\n * @param resource - The resource name.\n * @param ids - The record ids.\n * @returns The records, in the same order as `ids`.\n */\n getMany<T>(resource: string, ids: (string | number)[]): Promise<T[]>;\n /**\n * Create a record.\n *\n * @param resource - The resource name.\n * @param data - The creation payload.\n * @returns The created record.\n */\n create<T>(resource: string, data: unknown): Promise<T>;\n /**\n * Update a record (PATCH by default, PUT when configured).\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @param data - The update payload.\n * @returns The updated record.\n */\n update<T>(resource: string, id: string | number, data: unknown): Promise<T>;\n /**\n * Delete a record by id.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns The delete response (often the deleted record).\n */\n deleteOne<T>(resource: string, id: string | number): Promise<T>;\n}\n\n/** Options to tailor {@link createDataProvider} to a backend's conventions. */\nexport interface DataProviderOptions {\n /** Query-param name for the page number. Default: `\"page\"`. */\n pageParam?: string;\n /** Query-param name for the page size. Default: `\"size\"`. */\n sizeParam?: string;\n /** Query-param name for the sort field. Default: `\"order_by\"`. */\n sortFieldParam?: string;\n /** Query-param name for the sort order. Default: `\"ascending\"`. */\n sortOrderParam?: string;\n /**\n * When `true` (default), emit the sort order as a boolean\n * (`order:\"asc\"` → `true`). When `false`, emit the literal `\"asc\"`/`\"desc\"`.\n */\n sortOrderAsBoolean?: boolean;\n /** HTTP method used by {@link DataProvider.update}. Default: `\"patch\"`. */\n updateMethod?: \"patch\" | \"put\";\n /**\n * Build the request path for a resource (and optional id).\n * Default: `id == null ? \"/\" + resource : \"/\" + resource + \"/\" + id`.\n */\n buildPath?: (resource: string, id?: string | number) => string;\n}\n\nconst defaultBuildPath = (resource: string, id?: string | number): string =>\n id == null ? `/${resource}` : `/${resource}/${id}`;\n\n/**\n * Create a {@link DataProvider} bound to an {@link ApiClient}.\n *\n * Maps Refine-style calls to the Tempest FastAPI SDK conventions: list →\n * `GET /{resource}?page=&size=&order_by=&ascending=&...filters`, one →\n * `GET /{resource}/{id}`, create → `POST`, update → `PATCH`/`PUT`,\n * delete → `DELETE`.\n *\n * @param client - The HTTP client created by `createApiClient`.\n * @param options - Optional overrides for param names, sort encoding,\n * update method and path building.\n * @returns A stateless data provider.\n *\n * @example\n * const dataProvider = createDataProvider(apiClient);\n * const page = await dataProvider.getList<User>(\"users\", {\n * pagination: { page: 1, pageSize: 20 },\n * sort: { field: \"created_at\", order: \"desc\" },\n * filters: { active: true },\n * });\n */\nexport function createDataProvider(\n client: ApiClient,\n options: DataProviderOptions = {},\n): DataProvider {\n const {\n pageParam = \"page\",\n sizeParam = \"size\",\n sortFieldParam = \"order_by\",\n sortOrderParam = \"ascending\",\n sortOrderAsBoolean = true,\n updateMethod = \"patch\",\n buildPath = defaultBuildPath,\n } = options;\n\n const provider: DataProvider = {\n getList<T>(resource: string, params: GetListParams = {}): Promise<OffsetPage<T>> {\n const { pagination, sort, filters } = params;\n const query: Record<string, ParamValue> = {};\n\n if (pagination?.page != null) query[pageParam] = pagination.page;\n if (pagination?.pageSize != null) query[sizeParam] = pagination.pageSize;\n\n if (sort?.field) {\n const order = sort.order ?? \"asc\";\n query[sortFieldParam] = sort.field;\n query[sortOrderParam] = sortOrderAsBoolean ? order === \"asc\" : order;\n }\n\n if (filters) {\n for (const [key, value] of Object.entries(filters)) {\n query[key] = value;\n }\n }\n\n const requestOptions: RequestOptions = { params: query };\n return client.get<OffsetPage<T>>(buildPath(resource), requestOptions);\n },\n\n getOne<T>(resource: string, id: string | number): Promise<T> {\n return client.get<T>(buildPath(resource, id));\n },\n\n getMany<T>(resource: string, ids: (string | number)[]): Promise<T[]> {\n return Promise.all(ids.map((id) => provider.getOne<T>(resource, id)));\n },\n\n create<T>(resource: string, data: unknown): Promise<T> {\n return client.post<T>(buildPath(resource), { body: data });\n },\n\n update<T>(resource: string, id: string | number, data: unknown): Promise<T> {\n const path = buildPath(resource, id);\n return updateMethod === \"put\"\n ? client.put<T>(path, { body: data })\n : client.patch<T>(path, { body: data });\n },\n\n deleteOne<T>(resource: string, id: string | number): Promise<T> {\n return client.delete<T>(buildPath(resource, id));\n },\n };\n\n return provider;\n}\n","import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { DataProvider } from \"./create-data-provider\";\n\nconst DataProviderContext = createContext<DataProvider | null>(null);\n\n/** Props for {@link TempestDataProvider}. */\nexport interface TempestDataProviderProps {\n /** The data provider to expose to descendant resource hooks. */\n provider: DataProvider;\n /** The subtree that consumes the provider. */\n children: ReactNode;\n}\n\n/**\n * Inject a {@link DataProvider} into the React tree so the resource hooks\n * (`useList`, `useOne`, `useCreate`, …) can resolve it via {@link useDataProvider}.\n *\n * @example\n * const dataProvider = createDataProvider(apiClient);\n * <TempestDataProvider provider={dataProvider}>\n * <App />\n * </TempestDataProvider>\n */\nexport function TempestDataProvider({ provider, children }: TempestDataProviderProps) {\n return <DataProviderContext.Provider value={provider}>{children}</DataProviderContext.Provider>;\n}\n\n/**\n * Read the {@link DataProvider} from context.\n *\n * @returns The data provider supplied to the nearest {@link TempestDataProvider}.\n * @throws {Error} When used outside a {@link TempestDataProvider}.\n */\nexport function useDataProvider(): DataProvider {\n const provider = useContext(DataProviderContext);\n if (!provider) {\n throw new Error(\"useDataProvider must be used within a <TempestDataProvider>\");\n }\n return provider;\n}\n","import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n UseMutationOptions,\n UseMutationResult,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\n\nimport type { OffsetPage } from \"@/query/pagination\";\n\nimport type { GetListParams } from \"./create-data-provider\";\nimport { useDataProvider } from \"./data-provider-context\";\n\n/** Extra TanStack Query options for {@link useList} (key + fn are provided). */\nexport type UseListOptions<T> = Omit<\n UseQueryOptions<OffsetPage<T>, Error, OffsetPage<T>>,\n \"queryKey\" | \"queryFn\"\n>;\n\n/** Extra TanStack Query options for {@link useOne} (key + fn + enabled are provided). */\nexport type UseOneOptions<T> = Omit<\n UseQueryOptions<T, Error, T>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> & { enabled?: boolean };\n\n/**\n * Build the cache key for a resource list query.\n *\n * @param resource - The resource name.\n * @param params - The list params (page/sort/filters).\n * @returns A stable TanStack Query key.\n */\nexport function listQueryKey(resource: string, params?: GetListParams): unknown[] {\n return [\"data\", resource, \"list\", params];\n}\n\n/**\n * Build the cache key for a single-record query.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns A stable TanStack Query key.\n */\nexport function oneQueryKey(resource: string, id: string | number | null | undefined): unknown[] {\n return [\"data\", resource, \"one\", id];\n}\n\n/**\n * Query a paginated list of a resource through the active {@link useDataProvider}.\n *\n * @param resource - The resource name.\n * @param params - Pagination, sort and filter parameters.\n * @param options - Extra TanStack Query options.\n * @returns The TanStack Query result for the offset page.\n */\nexport function useList<T>(\n resource: string,\n params?: GetListParams,\n options?: UseListOptions<T>,\n): UseQueryResult<OffsetPage<T>, Error> {\n const provider = useDataProvider();\n return useQuery<OffsetPage<T>, Error>({\n queryKey: listQueryKey(resource, params),\n queryFn: () => provider.getList<T>(resource, params),\n ...options,\n });\n}\n\n/**\n * Query a single record by id through the active {@link useDataProvider}.\n *\n * The query is disabled while `id` is `null`/`undefined`.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @param options - Extra TanStack Query options.\n * @returns The TanStack Query result for the record.\n */\nexport function useOne<T>(\n resource: string,\n id: string | number | null | undefined,\n options?: UseOneOptions<T>,\n): UseQueryResult<T, Error> {\n const provider = useDataProvider();\n const { enabled, ...rest } = options ?? {};\n return useQuery<T, Error>({\n queryKey: oneQueryKey(resource, id),\n queryFn: () => provider.getOne<T>(resource, id as string | number),\n enabled: id != null && (enabled ?? true),\n ...rest,\n });\n}\n\n/** Options for the create mutation (mutationFn + onSuccess are provided). */\nexport type UseCreateOptions<T> = Omit<UseMutationOptions<T, Error, unknown>, \"mutationFn\">;\n\n/**\n * Create a record and invalidate the resource list cache on success.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate(data)` creates the record.\n */\nexport function useCreate<T>(\n resource: string,\n options?: UseCreateOptions<T>,\n): UseMutationResult<T, Error, unknown> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, unknown>({\n mutationFn: (data: unknown) => provider.create<T>(resource, data),\n onSuccess: (...args) => {\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n\n/** Variables accepted by the update mutation. */\nexport interface UpdateVariables {\n /** The record id to update. */\n id: string | number;\n /** The update payload. */\n data: unknown;\n}\n\n/** Options for the update mutation (mutationFn + onSuccess are provided). */\nexport type UseUpdateOptions<T> = Omit<UseMutationOptions<T, Error, UpdateVariables>, \"mutationFn\">;\n\n/**\n * Update a record and invalidate both the list and the single-record caches.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate({ id, data })` updates the record.\n */\nexport function useUpdate<T>(\n resource: string,\n options?: UseUpdateOptions<T>,\n): UseMutationResult<T, Error, UpdateVariables> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, UpdateVariables>({\n mutationFn: ({ id, data }: UpdateVariables) => provider.update<T>(resource, id, data),\n onSuccess: (...args) => {\n const [, variables] = args;\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n void queryClient.invalidateQueries({ queryKey: oneQueryKey(resource, variables.id) });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n\n/** Options for the delete mutation (mutationFn + onSuccess are provided). */\nexport type UseDeleteOptions<T> = Omit<UseMutationOptions<T, Error, string | number>, \"mutationFn\">;\n\n/**\n * Delete a record by id and invalidate the resource list cache on success.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate(id)` deletes the record.\n */\nexport function useDelete<T>(\n resource: string,\n options?: UseDeleteOptions<T>,\n): UseMutationResult<T, Error, string | number> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, string | number>({\n mutationFn: (id: string | number) => provider.deleteOne<T>(resource, id),\n onSuccess: (...args) => {\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n","import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router-dom\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed. Pass a boolean or anything truthy/falsy —\n * typically `useAuthStore((s) => s.isAuthenticated)`.\n */\n when: boolean;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is truthy, otherwise redirects. Pairs naturally with\n * `createAuthStore` for protected areas.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({ when, redirectTo = \"/\", replace = true, children }: RouteGuardProps) {\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n","import { Suspense, useMemo } from \"react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { BrowserRouter, HashRouter, MemoryRouter, Routes, Route } from \"react-router-dom\";\nimport { lazyWithRetry } from \"../auth/lazy-with-retry\";\nimport { RouteGuard } from \"./RouteGuard\";\nimport type { RouterKind, TempestRouteObject } from \"./types\";\n\n/**\n * Identity helper that types a declarative route tree. Use it so editors give\n * autocomplete and type-checking on every node; the array is returned as-is.\n *\n * @example\n * export const routes = defineRoutes([\n * { path: \"/\", element: <Layout />, children: [\n * { index: true, lazy: () => import(\"./pages/Home\") },\n * { path: \"settings\", lazy: () => import(\"./pages/Settings\"),\n * guard: () => useAuth.getState().isAuthenticated, redirectTo: \"/login\" },\n * ] },\n * ]);\n */\nexport function defineRoutes(routes: TempestRouteObject[]): TempestRouteObject[] {\n return routes;\n}\n\nconst lazyCache = new WeakMap<TempestRouteObject, ComponentType<unknown>>();\n\nfunction resolveLazy(route: TempestRouteObject): ComponentType<unknown> {\n let comp = lazyCache.get(route);\n if (!comp) {\n comp = lazyWithRetry(route.lazy!);\n lazyCache.set(route, comp);\n }\n return comp;\n}\n\nfunction GuardedElement({\n guard,\n redirectTo,\n children,\n}: {\n guard: boolean | (() => boolean);\n redirectTo?: string;\n children: ReactNode;\n}) {\n const allowed = typeof guard === \"function\" ? guard() : guard;\n return (\n <RouteGuard when={allowed} redirectTo={redirectTo}>\n {children}\n </RouteGuard>\n );\n}\n\nfunction toRouteElements(routes: TempestRouteObject[]): ReactNode {\n return routes.map((route, i) => {\n let element: ReactNode = route.element;\n if (route.lazy) {\n const LazyComponent = resolveLazy(route);\n element = <LazyComponent />;\n }\n if (route.guard !== undefined) {\n element = (\n <GuardedElement guard={route.guard} redirectTo={route.redirectTo}>\n {element}\n </GuardedElement>\n );\n }\n\n if (route.index) {\n return <Route key={`index-${i}`} index element={element} />;\n }\n\n return (\n <Route\n key={route.path ?? `route-${i}`}\n path={route.path}\n element={element}\n caseSensitive={route.caseSensitive}\n >\n {route.children ? toRouteElements(route.children) : null}\n </Route>\n );\n });\n}\n\nconst ROUTERS: Record<RouterKind, typeof BrowserRouter> = {\n browser: BrowserRouter,\n hash: HashRouter,\n memory: MemoryRouter,\n};\n\nexport interface AppRouterProps {\n /** Declarative route tree, ideally built with {@link defineRoutes}. */\n routes: TempestRouteObject[];\n /** History strategy (default: `\"browser\"`). */\n router?: RouterKind;\n /** App-wide base path forwarded to the underlying router. */\n basename?: string;\n /** Initial URLs for the `\"memory\"` router (tests / non-DOM hosts). */\n initialEntries?: string[];\n /** Suspense fallback shown while a `lazy` route chunk loads. */\n fallback?: ReactNode;\n}\n\n/**\n * Render a full React Router (v7, declarative mode) from a {@link defineRoutes}\n * tree: picks the history strategy, wraps everything in a `<Suspense>` boundary\n * for `lazy` routes, and applies per-route `guard` redirects. This is the\n * single entry point apps mount at their root.\n *\n * @example\n * <AppRouter routes={routes} fallback={<Spinner />} />\n */\nexport function AppRouter({\n routes,\n router = \"browser\",\n basename,\n initialEntries,\n fallback = null,\n}: AppRouterProps) {\n const tree = useMemo(() => toRouteElements(routes), [routes]);\n const Router = ROUTERS[router];\n const routerProps = router === \"memory\" ? { basename, initialEntries } : { basename };\n\n return (\n <Router {...routerProps}>\n <Suspense fallback={fallback}>\n <Routes>{tree}</Routes>\n </Suspense>\n </Router>\n );\n}\n","import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n","import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { ResolvedTheme, ThemeMode } from \"./types\";\n\nexport interface ThemeContextValue {\n /** Raw user preference (light / dark / system). */\n theme: ThemeMode;\n /** Effective theme actually applied to the DOM (light or dark). */\n resolvedTheme: ResolvedTheme;\n /** Update the preference. Persisted to localStorage when `storageKey` is set. */\n setTheme: (next: ThemeMode) => void;\n /** Convenience: flip light ↔ dark. When in `system` mode, switches to the opposite of the current resolved theme. */\n toggle: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n /** Initial preference when nothing is stored. Default: `\"system\"`. */\n defaultTheme?: ThemeMode;\n /** localStorage key used to persist the preference. Pass `null` to disable persistence. Default: `\"tempest-theme\"`. */\n storageKey?: string | null;\n /**\n * Element that receives the theme attribute(s). Defaults to\n * `document.documentElement`. Override when scoping the theme to a subtree.\n */\n target?: () => HTMLElement | null;\n /**\n * Attribute name(s) written on the target with the resolved theme\n * (`\"light\"` / `\"dark\"`). Default: `\"data-tempest-theme\"`.\n *\n * Pass an array to mirror the theme onto more than one attribute — handy\n * when the SDK components read `data-tempest-theme` but the host app's own\n * CSS keys off a different attribute (e.g. `[\"data-tempest-theme\",\n * \"data-theme\"]`). Avoids a separate sync effect in the consumer.\n */\n attribute?: string | string[];\n /**\n * When set, keeps `<meta name=\"theme-color\">` in sync with the resolved\n * theme — `content` becomes `themeColor.dark` in dark mode and\n * `themeColor.light` in light mode. The meta tag must already exist in the\n * document `<head>`. No-op when omitted.\n */\n themeColor?: { light: string; dark: string };\n}\n\nfunction resolve(mode: ThemeMode): ResolvedTheme {\n if (mode === \"dark\" || mode === \"light\") return mode;\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/**\n * Write the resolved theme onto every configured attribute and, when a\n * `themeColor` map is provided, sync the `<meta name=\"theme-color\">` tag.\n */\nfunction applyResolved(\n element: HTMLElement,\n resolved: ResolvedTheme,\n attribute: string | string[],\n themeColor?: { light: string; dark: string },\n): void {\n const attrs = Array.isArray(attribute) ? attribute : [attribute];\n for (const attr of attrs) element.setAttribute(attr, resolved);\n if (themeColor && typeof document !== \"undefined\") {\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"theme-color\"]');\n if (meta) meta.content = themeColor[resolved];\n }\n}\n\nfunction readStored(storageKey: string | null): ThemeMode | null {\n if (!storageKey || typeof window === \"undefined\") return null;\n try {\n const value = window.localStorage.getItem(storageKey);\n if (value === \"light\" || value === \"dark\" || value === \"system\") return value;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Wire dark/light theming. Writes a data attribute on a target element (the\n * `<html>` element by default) and exposes the current preference via\n * {@link useTheme}.\n *\n * Pair with `themeInitScript()` in the HTML head to prevent the flash of\n * incorrect theme on first paint.\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"tempest-theme\",\n target,\n attribute = \"data-tempest-theme\",\n themeColor,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<ThemeMode>(\n () => readStored(storageKey) ?? defaultTheme,\n );\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => resolve(theme));\n\n const targetRef = useRef<typeof target>(target);\n targetRef.current = target;\n\n const attributeKey = Array.isArray(attribute) ? attribute.join(\",\") : attribute;\n const themeColorRef = useRef(themeColor);\n themeColorRef.current = themeColor;\n\n useEffect(() => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next = resolve(theme);\n applyResolved(element, next, attribute, themeColorRef.current);\n setResolvedTheme(next);\n // attributeKey is the stable string form of `attribute`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, attributeKey]);\n\n useEffect(() => {\n if (theme !== \"system\" || typeof window === \"undefined\") return;\n const list = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = (): void => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next: ResolvedTheme = list.matches ? \"dark\" : \"light\";\n applyResolved(element, next, attribute, themeColorRef.current);\n setResolvedTheme(next);\n };\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, attributeKey]);\n\n const setTheme = useCallback(\n (next: ThemeMode) => {\n setThemeState(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, next);\n } catch {\n /* ignore quota errors */\n }\n }\n },\n [storageKey],\n );\n\n const toggle = useCallback(() => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, resolvedTheme, setTheme, toggle }),\n [theme, resolvedTheme, setTheme, toggle],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Read and mutate the current theme. Must be used inside a {@link ThemeProvider}.\n */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used inside a <ThemeProvider>\");\n return ctx;\n}\n","export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to the key itself.\n */\n t: (key: string, params?: InterpolationValues) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n */\n plural: (key: string, count: number, params?: InterpolationValues) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues): string {\n const template = lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, params);\n }\n\n function plural(key: string, count: number, params?: InterpolationValues): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createI18n, type Catalog, type I18n } from \"./create-i18n\";\n\nexport interface I18nContextValue extends I18n {\n /** Switch the active locale. Persisted when `storageKey` is set. */\n setLocale: (locale: string) => void;\n /** Locales available in the catalog. */\n availableLocales: string[];\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\nexport interface I18nProviderProps {\n children: ReactNode;\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing. */\n fallbackLocale?: string;\n /** Translation catalog. */\n messages: Catalog;\n /** localStorage key for persisting the user choice. Pass `null` to disable. Default: `\"tempest-locale\"`. */\n storageKey?: string | null;\n}\n\nfunction readStored(storageKey: string | null, available: string[]): string | null {\n if (!storageKey || typeof window === \"undefined\") return null;\n try {\n const value = window.localStorage.getItem(storageKey);\n if (value && available.includes(value)) return value;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * React provider for the SDK's lightweight i18n. Exposes the translation\n * helpers and a `setLocale` setter to children.\n */\nexport function I18nProvider({\n children,\n locale: initialLocale,\n fallbackLocale,\n messages,\n storageKey = \"tempest-locale\",\n}: I18nProviderProps) {\n const availableLocales = useMemo(() => Object.keys(messages), [messages]);\n const [locale, setLocaleState] = useState<string>(\n () => readStored(storageKey, availableLocales) ?? initialLocale,\n );\n\n useEffect(() => {\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"lang\", locale);\n }\n }, [locale]);\n\n const setLocale = useCallback(\n (next: string) => {\n setLocaleState(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, next);\n } catch {\n /* ignore quota errors */\n }\n }\n },\n [storageKey],\n );\n\n const value = useMemo<I18nContextValue>(() => {\n const i18n = createI18n({ locale, fallbackLocale, messages });\n return { ...i18n, setLocale, availableLocales };\n }, [locale, fallbackLocale, messages, setLocale, availableLocales]);\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\n/**\n * Access translation helpers. Must be used inside an {@link I18nProvider}.\n */\nexport function useI18n(): I18nContextValue {\n const ctx = useContext(I18nContext);\n if (!ctx) throw new Error(\"useI18n must be used inside an <I18nProvider>\");\n return ctx;\n}\n\n/**\n * Shortcut for components that only need the `t` function — avoids destructuring.\n */\nexport function useTranslate(): I18nContextValue[\"t\"] {\n return useI18n().t;\n}\n","import { Component } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\n\nexport interface ErrorBoundaryRenderProps {\n error: Error;\n reset: () => void;\n}\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n /**\n * Element shown when a descendant throws. Receives the captured error and\n * a `reset` callback that clears the boundary state.\n */\n fallback: ReactNode | ((props: ErrorBoundaryRenderProps) => ReactNode);\n /** Forwarded to your error tracker (Sentry, Datadog, console, etc.). */\n onError?: (error: Error, info: ErrorInfo) => void;\n /**\n * When any value in this array changes, the boundary automatically resets.\n * Useful for clearing the error after a navigation.\n */\n resetKeys?: readonly unknown[];\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nfunction keysChanged(a: readonly unknown[] = [], b: readonly unknown[] = []): boolean {\n if (a.length !== b.length) return true;\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return true;\n }\n return false;\n}\n\n/**\n * Class-based React error boundary with a render-prop or static fallback.\n * Auto-resets when any value in `resetKeys` changes.\n *\n * @example\n * <ErrorBoundary\n * resetKeys={[location.pathname]}\n * onError={(err) => reportError(err)}\n * fallback={({ error, reset }) => (\n * <ErrorState description={error.message} onRetry={reset} />\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n override componentDidUpdate(previousProps: ErrorBoundaryProps): void {\n if (this.state.error && keysChanged(previousProps.resetKeys, this.props.resetKeys)) {\n this.reset();\n }\n }\n\n reset = (): void => {\n this.setState({ error: null });\n };\n\n override render(): ReactNode {\n const { error } = this.state;\n if (!error) return this.props.children;\n\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback({ error, reset: this.reset });\n }\n return fallback;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { QueryProvider } from \"../query/QueryProvider\";\nimport type { QueryProviderProps } from \"../query/QueryProvider\";\nimport { ThemeProvider } from \"../theme/ThemeProvider\";\nimport type { ThemeProviderProps } from \"../theme/ThemeProvider\";\nimport { I18nProvider } from \"../i18n/I18nProvider\";\nimport type { I18nProviderProps } from \"../i18n/I18nProvider\";\nimport { ErrorBoundary } from \"../error-boundary/ErrorBoundary\";\nimport type { ErrorBoundaryProps } from \"../error-boundary/ErrorBoundary\";\n\nexport interface AppProvidersProps {\n children: ReactNode;\n /**\n * TanStack Query config. Enabled by default with SDK defaults; pass `false`\n * to opt out (e.g. the app already mounts its own `QueryProvider`).\n */\n query?: Omit<QueryProviderProps, \"children\"> | false;\n /**\n * Theme config. Enabled by default; pass `false` to opt out.\n */\n theme?: Omit<ThemeProviderProps, \"children\"> | false;\n /**\n * i18n config. Opt-in: provide `locale` + `messages` to mount the provider.\n */\n i18n?: Omit<I18nProviderProps, \"children\">;\n /**\n * Top-level error boundary. Opt-in: provide a `fallback` to wrap the tree.\n */\n errorBoundary?: Omit<ErrorBoundaryProps, \"children\">;\n}\n\n/**\n * Compose the Tempest app-wide providers in one place: error boundary →\n * TanStack Query → theme → i18n. Query and theme are on by default; i18n and\n * the error boundary mount only when configured. Each provider can be disabled\n * or tuned independently, so an app's `main.tsx` stays a single declarative\n * block instead of a hand-nested provider pyramid.\n *\n * @example\n * <AppProviders\n * errorBoundary={{ fallback: <Crash /> }}\n * i18n={{ locale: \"pt-BR\", messages }}\n * >\n * <AppRouter routes={routes} />\n * </AppProviders>\n */\nexport function AppProviders({ children, query, theme, i18n, errorBoundary }: AppProvidersProps) {\n let tree: ReactNode = children;\n\n if (i18n) {\n tree = <I18nProvider {...i18n}>{tree}</I18nProvider>;\n }\n\n if (theme !== false) {\n tree = <ThemeProvider {...(theme || {})}>{tree}</ThemeProvider>;\n }\n\n if (query !== false) {\n tree = <QueryProvider {...(query || {})}>{tree}</QueryProvider>;\n }\n\n if (errorBoundary) {\n tree = <ErrorBoundary {...errorBoundary}>{tree}</ErrorBoundary>;\n }\n\n return <>{tree}</>;\n}\n","export type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n onMessage?.({\n event: eventName,\n data: parser(event.data),\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useRef(onMessage);\n onMessageRef.current = onMessage;\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n","/**\n * Convert a base64url-encoded VAPID public key into the `Uint8Array` format\n * required by `PushManager.subscribe({ applicationServerKey })`.\n *\n * @param base64String - VAPID public key (URL-safe base64).\n * @returns The decoded key as bytes.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = window.atob(base64);\n const buffer = new ArrayBuffer(rawData.length);\n const output = new Uint8Array(buffer);\n for (let i = 0; i < rawData.length; i++) {\n output[i] = rawData.charCodeAt(i);\n }\n return output;\n}\n\n/**\n * Convenience check for environments where the Push API is unavailable\n * (Safari iOS without PWA install, older browsers, SSR, etc.).\n */\nexport function isPushSupported(): boolean {\n return (\n typeof window !== \"undefined\" &&\n \"serviceWorker\" in navigator &&\n \"PushManager\" in window &&\n \"Notification\" in window\n );\n}\n","import { isPushSupported, urlBase64ToUint8Array } from \"./utils\";\n\nexport interface WebPushClientConfig {\n /** VAPID public key (URL-safe base64). */\n vapidPublicKey: string;\n /**\n * Persist the subscription on the backend. The SDK does not own this call —\n * the host app decides the endpoint and how the payload is serialized.\n */\n onSubscribe: (subscription: PushSubscriptionJSON) => Promise<void> | void;\n /** Remove the subscription from the backend. Called before `subscription.unsubscribe()`. */\n onUnsubscribe?: (subscription: PushSubscriptionJSON) => Promise<void> | void;\n /**\n * Override how the service worker registration is obtained.\n * Defaults to `navigator.serviceWorker.ready` — provide this only when you\n * register the SW yourself and want to reuse the registration.\n */\n getRegistration?: () => Promise<ServiceWorkerRegistration>;\n}\n\nexport class WebPushUnsupportedError extends Error {\n constructor() {\n super(\"Web Push não suportado neste navegador.\");\n this.name = \"WebPushUnsupportedError\";\n }\n}\n\nexport class WebPushPermissionDeniedError extends Error {\n constructor() {\n super(\"Permissão de notificação negada pelo usuário.\");\n this.name = \"WebPushPermissionDeniedError\";\n }\n}\n\n/**\n * Browser-side Web Push helper. Wraps `Notification.requestPermission`,\n * `pushManager.subscribe`, and the corresponding teardown. Transport is up to\n * the caller via `onSubscribe` / `onUnsubscribe` callbacks.\n */\nexport class WebPushClient {\n private readonly config: WebPushClientConfig;\n\n constructor(config: WebPushClientConfig) {\n this.config = config;\n }\n\n /** Whether the runtime supports the Push API. */\n static isSupported(): boolean {\n return isPushSupported();\n }\n\n private async registration(): Promise<ServiceWorkerRegistration> {\n if (!isPushSupported()) throw new WebPushUnsupportedError();\n return this.config.getRegistration\n ? await this.config.getRegistration()\n : await navigator.serviceWorker.ready;\n }\n\n /** Current `Notification.permission` value, or `\"unsupported\"`. */\n permission(): NotificationPermission | \"unsupported\" {\n if (typeof Notification === \"undefined\") return \"unsupported\";\n return Notification.permission;\n }\n\n /**\n * Ask the user for notification permission.\n *\n * @throws {WebPushUnsupportedError} If the runtime lacks the Notification API.\n * @returns The resulting `NotificationPermission` value.\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (typeof Notification === \"undefined\") throw new WebPushUnsupportedError();\n return Notification.requestPermission();\n }\n\n /** Return the active push subscription, if any. */\n async getSubscription(): Promise<PushSubscription | null> {\n const registration = await this.registration();\n return registration.pushManager.getSubscription();\n }\n\n /** True when a subscription already exists for this browser. */\n async isSubscribed(): Promise<boolean> {\n if (!isPushSupported()) return false;\n const existing = await this.getSubscription();\n return existing !== null;\n }\n\n /**\n * Subscribe the current device. Requests permission, creates a push\n * subscription if none exists, and forwards the JSON payload to\n * `onSubscribe` for backend persistence.\n *\n * @returns The active `PushSubscription`.\n * @throws {WebPushUnsupportedError} If Web Push is unavailable.\n * @throws {WebPushPermissionDeniedError} If the user denies the prompt.\n */\n async subscribe(): Promise<PushSubscription> {\n const permission = await this.requestPermission();\n if (permission !== \"granted\") throw new WebPushPermissionDeniedError();\n\n const registration = await this.registration();\n const existing = await registration.pushManager.getSubscription();\n if (existing) {\n await this.config.onSubscribe(existing.toJSON());\n return existing;\n }\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(this.config.vapidPublicKey),\n });\n await this.config.onSubscribe(subscription.toJSON());\n return subscription;\n }\n\n /**\n * Cancel the current subscription. Calls `onUnsubscribe` first (so the\n * backend can purge the record) and then `subscription.unsubscribe()`.\n *\n * @returns True when an active subscription was removed, false otherwise.\n */\n async unsubscribe(): Promise<boolean> {\n const subscription = await this.getSubscription();\n if (!subscription) return false;\n if (this.config.onUnsubscribe) {\n await this.config.onUnsubscribe(subscription.toJSON());\n }\n return subscription.unsubscribe();\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { WebPushClient, type WebPushClientConfig } from \"./web-push-client\";\nimport { isPushSupported } from \"./utils\";\n\nexport interface UsePushSubscriptionResult {\n /** True when the browser exposes the Push + Notification APIs. */\n supported: boolean;\n /** Current `Notification.permission` value, or `\"unsupported\"`. */\n permission: NotificationPermission | \"unsupported\";\n /** True when a subscription is active on this device. */\n subscribed: boolean;\n /** True while a subscribe/unsubscribe call is in-flight. */\n loading: boolean;\n /** Last error thrown by subscribe/unsubscribe, if any. */\n error: Error | null;\n subscribe: () => Promise<void>;\n unsubscribe: () => Promise<void>;\n /** Re-read the current subscription/permission state from the browser. */\n refresh: () => Promise<void>;\n}\n\n/**\n * React hook around {@link WebPushClient}. Tracks subscription, permission and\n * loading state; exposes imperative `subscribe`/`unsubscribe` actions.\n *\n * The hook does NOT register the service worker — the host app must do that\n * (e.g. via `vite-plugin-pwa` or a manual `navigator.serviceWorker.register`).\n *\n * @example\n * const push = usePushSubscription({\n * vapidPublicKey: import.meta.env.VITE_VAPID_PUBLIC_KEY,\n * onSubscribe: (sub) => api.post(\"/webpush/subscribe\", { body: sub }),\n * onUnsubscribe: () => api.delete(\"/webpush/my\"),\n * });\n */\nexport function usePushSubscription(config: WebPushClientConfig): UsePushSubscriptionResult {\n const configRef = useRef(config);\n configRef.current = config;\n\n const client = useMemo(\n () =>\n new WebPushClient({\n vapidPublicKey: config.vapidPublicKey,\n onSubscribe: (sub) => configRef.current.onSubscribe(sub),\n onUnsubscribe: (sub) => configRef.current.onUnsubscribe?.(sub),\n getRegistration: config.getRegistration,\n }),\n [config.vapidPublicKey, config.getRegistration],\n );\n\n const [supported] = useState<boolean>(() => isPushSupported());\n const [permission, setPermission] = useState<NotificationPermission | \"unsupported\">(() =>\n client.permission(),\n );\n const [subscribed, setSubscribed] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!supported) return;\n setPermission(client.permission());\n try {\n const active = await client.isSubscribed();\n setSubscribed(active);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, [client, supported]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const subscribe = useCallback(async () => {\n if (!supported) return;\n setLoading(true);\n setError(null);\n try {\n await client.subscribe();\n setSubscribed(true);\n setPermission(client.permission());\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n throw err;\n } finally {\n setLoading(false);\n }\n }, [client, supported]);\n\n const unsubscribe = useCallback(async () => {\n if (!supported) return;\n setLoading(true);\n setError(null);\n try {\n await client.unsubscribe();\n setSubscribed(false);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n throw err;\n } finally {\n setLoading(false);\n }\n }, [client, supported]);\n\n return {\n supported,\n permission,\n subscribed,\n loading,\n error,\n subscribe,\n unsubscribe,\n refresh,\n };\n}\n","export interface PlayAudioOptions {\n /** Volume between 0 and 1. Default: 1. */\n volume?: number;\n /** Loop the clip. Default: false. */\n loop?: boolean;\n /** Begin playback immediately. Default: true. */\n autoplay?: boolean;\n /** Stop the previous clip managed by this player. Default: false. */\n stopPrevious?: boolean;\n /** Fired when playback ends naturally. */\n onEnded?: () => void;\n /** Fired on playback error. */\n onError?: (error: unknown) => void;\n}\n\nexport interface AudioPlayer {\n /** Play `src`. Returns the underlying element, or `null` when the browser blocked autoplay. */\n play: (src: string, options?: PlayAudioOptions) => Promise<HTMLAudioElement | null>;\n /** Stop the currently-playing clip and rewind it. */\n stop: () => void;\n /** Currently playing audio element, or `null`. */\n current: () => HTMLAudioElement | null;\n}\n\n/**\n * Create an isolated audio player that tracks a single \"current\" clip.\n * Multiple players coexist independently; use this when several layers of UI\n * need their own playback state.\n */\nexport function createAudioPlayer(): AudioPlayer {\n let current: HTMLAudioElement | null = null;\n\n async function play(\n src: string,\n {\n volume = 1,\n loop = false,\n autoplay = true,\n stopPrevious = false,\n onEnded,\n onError,\n }: PlayAudioOptions = {},\n ): Promise<HTMLAudioElement | null> {\n try {\n if (stopPrevious && current) {\n current.pause();\n current.currentTime = 0;\n }\n const audio = new Audio(src);\n audio.volume = Math.max(0, Math.min(1, volume));\n audio.loop = loop;\n audio.preload = \"auto\";\n if (onEnded) audio.onended = onEnded;\n if (onError) audio.onerror = (event) => onError(event);\n current = audio;\n if (autoplay) await audio.play();\n return audio;\n } catch (error) {\n onError?.(error);\n return null;\n }\n }\n\n function stop(): void {\n if (!current) return;\n current.pause();\n current.currentTime = 0;\n }\n\n return { play, stop, current: () => current };\n}\n\nlet defaultPlayer: AudioPlayer | null = null;\n\nfunction getDefaultPlayer(): AudioPlayer {\n if (!defaultPlayer) defaultPlayer = createAudioPlayer();\n return defaultPlayer;\n}\n\n/**\n * Convenience wrapper around a shared {@link AudioPlayer}. Use this for\n * one-off notification sounds. For more complex flows (e.g. several\n * simultaneous channels), build a dedicated player with {@link createAudioPlayer}.\n */\nexport async function playAudio(\n src: string,\n options?: PlayAudioOptions,\n): Promise<HTMLAudioElement | null> {\n return getDefaultPlayer().play(src, options);\n}\n\n/** Stop the clip currently playing on the shared default player. */\nexport function stopAudio(): void {\n getDefaultPlayer().stop();\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createAudioPlayer, type AudioPlayer, type PlayAudioOptions } from \"./audio-player\";\n\nexport interface UseAudioResult {\n /** Play `src` on the hook's private player. */\n play: (src: string, options?: PlayAudioOptions) => Promise<void>;\n /** Stop the current clip. */\n stop: () => void;\n /**\n * Whether the browser's autoplay policy has been satisfied. Becomes\n * `true` after the first successful `play()`.\n */\n unlocked: boolean;\n}\n\n/**\n * Hook-managed audio player. Each component instance gets its own\n * {@link AudioPlayer}, so unmounting cleanly stops playback. Useful for\n * notification chimes, UI feedback sounds, and per-component soundtracks.\n */\nexport function useAudio(): UseAudioResult {\n const playerRef = useRef<AudioPlayer | null>(null);\n const [unlocked, setUnlocked] = useState<boolean>(false);\n\n if (!playerRef.current) {\n playerRef.current = createAudioPlayer();\n }\n\n useEffect(() => {\n return () => {\n playerRef.current?.stop();\n };\n }, []);\n\n const play = useCallback(async (src: string, options?: PlayAudioOptions): Promise<void> => {\n const result = await playerRef.current!.play(src, options);\n if (result) setUnlocked(true);\n }, []);\n\n const stop = useCallback((): void => {\n playerRef.current?.stop();\n }, []);\n\n return { play, stop, unlocked };\n}\n","import Dexie, { type Table, type UpdateSpec } from \"dexie\";\n\nexport interface OfflineStoreConfig<TItem> {\n /** IndexedDB database name. */\n databaseName: string;\n /** Schema version. Bump when changing indexes; pair with a migration if needed. */\n version: number;\n /** Object-store name. */\n tableName: string;\n /**\n * Dexie index definition for the table. Use `&` for the primary key\n * (unique), e.g. `\"&id, owner_id, created_at\"`. See Dexie docs for the\n * full syntax.\n */\n indexes: string;\n /** Property used as the primary key (default: `\"id\"`). */\n keyPath?: keyof TItem & string;\n /**\n * Optional owner scoping. When set, every read/write method honors the\n * `owner` argument and persists it on each record (e.g. multi-tenant\n * notifications keyed by `user_id`).\n */\n ownerField?: keyof TItem & string;\n}\n\nexport interface ListOptions<TItem> {\n /** Property to order by. Default: `keyPath`. */\n orderBy?: keyof TItem & string;\n /** Reverse the ordering. Default: false. */\n reverse?: boolean;\n /** Maximum number of items to return. */\n limit?: number;\n /** Skip this many items from the start of the result set. */\n offset?: number;\n /** Custom predicate applied after the index query. */\n filter?: (item: TItem) => boolean;\n}\n\nexport interface OfflineStore<TItem, TKey extends string | number> {\n /** Insert or replace a record. */\n put: (item: TItem, owner?: string) => Promise<TKey>;\n /** Insert or replace multiple records in a single transaction. */\n bulkPut: (items: TItem[], owner?: string) => Promise<TKey>;\n /** Fetch one record by its primary key. */\n get: (key: TKey) => Promise<TItem | undefined>;\n /** List records, optionally scoped to `owner` when `ownerField` is configured. */\n list: (owner?: string, options?: ListOptions<TItem>) => Promise<TItem[]>;\n /** Partial update by primary key. Returns the number of records changed. */\n update: (key: TKey, changes: Partial<TItem>) => Promise<number>;\n /** Apply a modification to every record matching `owner`. */\n updateMany: (owner: string | undefined, changes: Partial<TItem>) => Promise<number>;\n /** Delete one record by primary key. */\n delete: (key: TKey) => Promise<void>;\n /** Delete every record matching `owner` (or the entire table when no scope is set). */\n clear: (owner?: string) => Promise<void>;\n /** Count records, optionally scoped to `owner`. */\n count: (owner?: string) => Promise<number>;\n /** Raw Dexie table for advanced queries. */\n raw: Table<TItem, TKey>;\n /** Underlying Dexie instance. */\n db: Dexie;\n}\n\nclass GenericDb<TItem, TKey extends string | number> extends Dexie {\n store!: Table<TItem, TKey>;\n\n constructor(name: string, version: number, tableName: string, indexes: string) {\n super(name);\n this.version(version).stores({ [tableName]: indexes });\n this.store = this.table<TItem, TKey>(tableName);\n }\n}\n\n/**\n * Build a typed IndexedDB-backed store using Dexie. Optionally scope every\n * operation by an `ownerField` (useful for multi-user SSE history, drafts,\n * cache per workspace, etc.).\n *\n * Dexie is an **optional peer dependency** — install it (`npm i dexie`) only\n * when your app needs offline storage.\n *\n * @example\n * type Note = { id: string; owner_id: string; text: string; created_at: string };\n * const notes = createOfflineStore<Note, string>({\n * databaseName: \"TempestNotes\",\n * version: 1,\n * tableName: \"notes\",\n * indexes: \"&id, owner_id, created_at\",\n * ownerField: \"owner_id\",\n * });\n * await notes.put({ id: \"n1\", owner_id: \"u1\", text: \"hi\", created_at: ... }, \"u1\");\n * const mine = await notes.list(\"u1\", { orderBy: \"created_at\", reverse: true });\n */\nexport function createOfflineStore<TItem, TKey extends string | number = string>(\n config: OfflineStoreConfig<TItem>,\n): OfflineStore<TItem, TKey> {\n const { databaseName, version, tableName, indexes, keyPath = \"id\", ownerField } = config;\n\n const db = new GenericDb<TItem, TKey>(databaseName, version, tableName, indexes);\n const table = db.store;\n\n function withOwner(item: TItem, owner?: string): TItem {\n if (!ownerField || !owner) return item;\n return { ...item, [ownerField]: owner } as TItem;\n }\n\n async function list(owner?: string, options: ListOptions<TItem> = {}): Promise<TItem[]> {\n const { orderBy = keyPath, reverse = false, limit, offset, filter } = options;\n\n let collection =\n ownerField && owner ? table.where(ownerField).equals(owner) : table.toCollection();\n\n if (filter) collection = collection.filter(filter);\n\n let items =\n orderBy === keyPath ? await collection.toArray() : await collection.sortBy(orderBy);\n\n if (reverse) items = items.reverse();\n if (offset) items = items.slice(offset);\n if (typeof limit === \"number\") items = items.slice(0, limit);\n return items;\n }\n\n return {\n put: (item, owner) => table.put(withOwner(item, owner)) as Promise<TKey>,\n bulkPut: (items, owner) =>\n table.bulkPut(items.map((item) => withOwner(item, owner))) as Promise<TKey>,\n get: (key) => table.get(key),\n list,\n update: (key, changes) => table.update(key, changes as UpdateSpec<TItem>),\n updateMany: async (owner, changes) => {\n const spec = changes as UpdateSpec<TItem>;\n if (ownerField && owner) {\n return table.where(ownerField).equals(owner).modify(spec);\n }\n return table.toCollection().modify(spec);\n },\n delete: (key) => table.delete(key),\n clear: async (owner) => {\n if (ownerField && owner) {\n await table.where(ownerField).equals(owner).delete();\n return;\n }\n await table.clear();\n },\n count: (owner) => {\n if (ownerField && owner) {\n return table.where(ownerField).equals(owner).count();\n }\n return table.count();\n },\n raw: table,\n db,\n };\n}\n","import { useCallback, useState } from \"react\";\n\n/**\n * Hook that propagates errors to the nearest {@link ErrorBoundary}.\n *\n * React error boundaries only catch errors thrown during render. Async errors\n * (failed mutations, websocket failures, etc.) need to be re-thrown in a\n * render pass — that is what `throwError` does.\n *\n * @example\n * const throwError = useErrorHandler();\n * useEffect(() => {\n * stream.on(\"error\", throwError);\n * }, []);\n */\nexport function useErrorHandler(): (error: unknown) => void {\n const [, setState] = useState<Error | null>(null);\n return useCallback((error: unknown) => {\n setState(() => {\n throw error instanceof Error ? error : new Error(String(error));\n });\n }, []);\n}\n","import { cloneElement, isValidElement } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n Controller,\n useFormContext,\n type Control,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\n\nexport interface FormFieldChildProps {\n name: string;\n value: unknown;\n onChange: (...args: unknown[]) => void;\n onBlur: () => void;\n ref: ControllerRenderProps[\"ref\"];\n error?: string;\n \"aria-invalid\"?: boolean;\n \"aria-describedby\"?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n required?: boolean;\n id?: string;\n}\n\nexport interface FormFieldProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> {\n /** Field name (dot path supported, e.g. `\"address.city\"`). */\n name: TName;\n /** Field label rendered by the wrapped control. */\n label?: ReactNode;\n /** Helper text rendered by the wrapped control when there is no error. */\n helperText?: ReactNode;\n /** When `true`, marks the control as required (visual hint + native attribute). */\n required?: boolean;\n /**\n * Explicit `control` from `useForm()` / `useZodForm()`. Optional when a\n * `FormProvider` is in the tree.\n */\n control?: Control<TValues>;\n /**\n * The control to render. Receives `{ value, onChange, onBlur, ref, error, ... }`\n * via `cloneElement`. Pass `<Input />`, `<Select />`, masked inputs, etc.\n */\n children: ReactElement;\n}\n\n/**\n * Glue between `react-hook-form` `Controller` and the SDK's controlled\n * components. Wraps any control that accepts `{ value, onChange, label,\n * error }` and routes RHF state into it — eliminating the per-field\n * `<Controller render={...} />` boilerplate.\n *\n * @example\n * const form = useZodForm(schema);\n * <FormProvider {...form}>\n * <Form>\n * <FormField name=\"email\" label=\"Email\" required>\n * <Input type=\"email\" />\n * </FormField>\n * <FormField name=\"cep\" label=\"CEP\">\n * <CEPInput />\n * </FormField>\n * </Form>\n * </FormProvider>;\n */\nexport function FormField<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n>({ name, label, helperText, required, control, children }: FormFieldProps<TValues, TName>) {\n const context = useFormContext<TValues>();\n const resolvedControl = control ?? context?.control;\n if (!resolvedControl) {\n throw new Error(\n \"FormField requires either a `control` prop or a <FormProvider> in the tree.\",\n );\n }\n\n return (\n <Controller\n name={name}\n control={resolvedControl}\n render={({ field, fieldState }) => {\n if (!isValidElement(children)) return children;\n const errorMessage = fieldState.error?.message;\n return cloneElement(children as ReactElement<FormFieldChildProps>, {\n name: field.name,\n value: field.value,\n onChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n label,\n helperText: errorMessage ? undefined : helperText,\n error: errorMessage,\n required,\n \"aria-invalid\": !!errorMessage,\n });\n }}\n />\n );\n}\n","import type { z } from \"zod\";\n\nexport interface ValidateFormSuccess<T> {\n success: true;\n data: T;\n errors: Record<string, string>;\n}\n\nexport interface ValidateFormFailure {\n success: false;\n errors: Record<string, string>;\n}\n\nexport type ValidateFormResult<T> = ValidateFormSuccess<T> | ValidateFormFailure;\n\n/**\n * Validate `values` against a zod schema and return a per-field error map\n * compatible with most form libraries.\n *\n * Field paths follow zod's `issue.path.join(\".\")` convention — nested fields\n * become `\"address.city\"`, array entries `\"items.0.name\"`. The first issue\n * per path wins (subsequent ones are dropped to keep error UIs tidy).\n *\n * @param schema - zod schema describing the form shape.\n * @param values - Raw form values (typed as `unknown`).\n * @returns Either `{ success: true, data, errors: {} }` or `{ success: false, errors }`.\n */\nexport function validateForm<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n values: unknown,\n): ValidateFormResult<z.infer<TSchema>> {\n const result = schema.safeParse(values);\n if (result.success) {\n return { success: true, data: result.data, errors: {} };\n }\n const errors: Record<string, string> = {};\n for (const issue of result.error.issues) {\n const path = issue.path.length === 0 ? \"_root\" : issue.path.join(\".\");\n if (!(path in errors)) errors[path] = issue.message;\n }\n return { success: false, errors };\n}\n","import type { z } from \"zod\";\n\ninterface ResolverError {\n type: string;\n message: string;\n}\n\ninterface ResolverOutput<T> {\n values: T | object;\n errors: Record<string, ResolverError | object>;\n}\n\ntype Resolver<T> = (\n values: unknown,\n context: unknown,\n options: { criteriaMode?: \"firstError\" | \"all\" },\n) => Promise<ResolverOutput<T>>;\n\n/**\n * Minimal `react-hook-form` resolver built on top of zod. Mirrors the shape\n * produced by `@hookform/resolvers/zod` so it can be passed straight to\n * `useForm({ resolver })`.\n *\n * @example\n * const form = useForm<LoginForm>({ resolver: zodResolver(loginSchema) });\n */\nexport function zodResolver<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n): Resolver<z.infer<TSchema>> {\n return async (values, _context, options) => {\n const result = schema.safeParse(values);\n if (result.success) {\n return { values: result.data, errors: {} };\n }\n\n const errors: Record<string, ResolverError | object> = {};\n const criteriaMode = options.criteriaMode ?? \"firstError\";\n\n for (const issue of result.error.issues) {\n const path = issue.path.length === 0 ? \"_root\" : issue.path.join(\".\");\n if (criteriaMode === \"firstError\" && errors[path]) continue;\n errors[path] = { type: issue.code, message: issue.message };\n }\n\n return { values: {}, errors };\n };\n}\n","import { useForm } from \"react-hook-form\";\nimport type { FieldValues, UseFormProps, UseFormReturn } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { zodResolver } from \"./zod-resolver\";\n\n/**\n * Convenience wrapper around `react-hook-form`'s `useForm` that wires a zod\n * resolver and infers the form's value type from the schema.\n *\n * Both `react-hook-form` and `zod` are optional peer dependencies — install\n * them when your app uses forms.\n *\n * @example\n * const form = useZodForm(loginSchema, { defaultValues: { email: \"\" } });\n * form.register(\"email\");\n */\nexport function useZodForm<\n TSchema extends z.ZodTypeAny,\n TValues extends FieldValues = z.infer<TSchema> & FieldValues,\n>(schema: TSchema, options: Omit<UseFormProps<TValues>, \"resolver\"> = {}): UseFormReturn<TValues> {\n return useForm<TValues>({\n ...options,\n resolver: zodResolver(schema) as unknown as UseFormProps<TValues>[\"resolver\"],\n });\n}\n","function digitsOnly(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Validate a Brazilian CPF using the standard check-digit algorithm.\n * Accepts masked or raw input; rejects all-equal digits (\"111.111.111-11\").\n */\nexport function validateCPF(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 11) return false;\n if (/^(\\d)\\1+$/.test(digits)) return false;\n\n const numbers = digits.split(\"\").map(Number);\n\n let sum = 0;\n for (let i = 0; i < 9; i++) sum += numbers[i]! * (10 - i);\n let check = (sum * 10) % 11;\n if (check === 10) check = 0;\n if (check !== numbers[9]) return false;\n\n sum = 0;\n for (let i = 0; i < 10; i++) sum += numbers[i]! * (11 - i);\n check = (sum * 10) % 11;\n if (check === 10) check = 0;\n return check === numbers[10];\n}\n\n/**\n * Validate a Brazilian CNPJ using the standard check-digit algorithm.\n * Accepts masked or raw input; rejects all-equal digits.\n */\nexport function validateCNPJ(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 14) return false;\n if (/^(\\d)\\1+$/.test(digits)) return false;\n\n const numbers = digits.split(\"\").map(Number);\n\n const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n\n let sum = 0;\n for (let i = 0; i < 12; i++) sum += numbers[i]! * weights1[i]!;\n let check = sum % 11;\n check = check < 2 ? 0 : 11 - check;\n if (check !== numbers[12]) return false;\n\n sum = 0;\n for (let i = 0; i < 13; i++) sum += numbers[i]! * weights2[i]!;\n check = sum % 11;\n check = check < 2 ? 0 : 11 - check;\n return check === numbers[13];\n}\n\n/** Format an 11-digit Brazilian CEP-like value as `00000-000`. */\nexport function formatCEP(value: string): string {\n return digitsOnly(value)\n .slice(0, 8)\n .replace(/(\\d{5})(\\d)/, \"$1-$2\");\n}\n\n/** Format an unmasked CNPJ-shaped value as `00.000.000/0000-00`. */\nexport function formatCNPJ(value: string): string {\n return digitsOnly(value)\n .slice(0, 14)\n .replace(/(\\d{2})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1/$2\")\n .replace(/(\\d{4})(\\d)/, \"$1-$2\");\n}\n\n/** Strip any masking and return only digits. */\nexport function unmask(value: string): string {\n return digitsOnly(value);\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { Input, type InputProps } from \"@/components/Input\";\nimport { formatCEP, formatCNPJ } from \"./br-validators\";\nimport { formatCPF, formatPhone } from \"@/utils/format\";\n\ntype MaskedFieldProps = Omit<InputProps, \"value\" | \"onChange\"> & {\n value: string;\n onChange: (value: string) => void;\n};\n\nfunction maskedInput(\n mask: (input: string) => string,\n inputMode: InputHTMLAttributes<HTMLInputElement>[\"inputMode\"] = \"numeric\",\n) {\n return forwardRef<HTMLInputElement, MaskedFieldProps>(function MaskedInput(\n { value, onChange, ...props },\n ref,\n ) {\n return (\n <Input\n {...props}\n ref={ref}\n value={mask(value ?? \"\")}\n inputMode={inputMode}\n onChange={(event) => onChange(mask(event.target.value))}\n />\n );\n });\n}\n\nexport const CPFInput = maskedInput(formatCPF);\nexport const CNPJInput = maskedInput(formatCNPJ);\nexport const PhoneInput = maskedInput(formatPhone, \"tel\");\nexport const CEPInput = maskedInput(formatCEP);\n\nexport interface MoneyInputProps extends Omit<InputProps, \"value\" | \"onChange\" | \"type\"> {\n /** Cents (integer). Internally treated as 1/100 of the currency unit. */\n value: number;\n onChange: (cents: number) => void;\n /** Currency code for `Intl.NumberFormat`. Default: `\"BRL\"`. */\n currency?: string;\n /** Locale for `Intl.NumberFormat`. Default: `\"pt-BR\"`. */\n locale?: string;\n}\n\nfunction formatCents(cents: number, locale: string, currency: string): string {\n return new Intl.NumberFormat(locale, { style: \"currency\", currency }).format(cents / 100);\n}\n\nfunction parseCents(text: string): number {\n const digits = text.replace(/\\D/g, \"\");\n if (!digits) return 0;\n return Number.parseInt(digits, 10);\n}\n\n/**\n * Currency-masked input. Stores the value as an integer number of cents to\n * avoid floating-point error. Suitable for `react-hook-form` once you adapt\n * the field to expose cents.\n */\nexport const MoneyInput = forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency = \"BRL\", locale = \"pt-BR\", ...props },\n ref,\n) {\n return (\n <Input\n {...props}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={formatCents(value || 0, locale, currency)}\n onChange={(event) => onChange(parseCents(event.target.value))}\n />\n );\n});\n","import { useCallback, useState } from \"react\";\n\nexport interface ViaCEPResult {\n cep: string;\n logradouro: string;\n complemento: string;\n bairro: string;\n localidade: string;\n uf: string;\n ibge?: string;\n gia?: string;\n ddd?: string;\n siafi?: string;\n}\n\nexport interface UseViaCEPResult {\n loading: boolean;\n error: string | null;\n data: ViaCEPResult | null;\n /** Fetch the given CEP (8 digits or masked). Sets `data`/`error`. Returns the result. */\n lookup: (cep: string) => Promise<ViaCEPResult | null>;\n reset: () => void;\n}\n\n/**\n * React hook for the public ViaCEP service (`viacep.com.br`). No backend\n * required. Returns address fields when the CEP exists, or sets `error` for\n * invalid CEPs.\n */\nexport function useViaCEP(): UseViaCEPResult {\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [data, setData] = useState<ViaCEPResult | null>(null);\n\n const lookup = useCallback(async (cep: string): Promise<ViaCEPResult | null> => {\n const digits = cep.replace(/\\D/g, \"\");\n if (digits.length !== 8) {\n setError(\"CEP inválido.\");\n return null;\n }\n setLoading(true);\n setError(null);\n try {\n const response = await fetch(`https://viacep.com.br/ws/${digits}/json/`);\n const json = (await response.json()) as ViaCEPResult & { erro?: boolean };\n if (\"erro\" in json && json.erro) {\n setError(\"CEP não encontrado.\");\n setData(null);\n return null;\n }\n setData(json);\n return json;\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n setData(null);\n }, []);\n\n return { loading, error, data, lookup, reset };\n}\n","export type WebSocketStatus = \"idle\" | \"connecting\" | \"open\" | \"closing\" | \"closed\" | \"error\";\n\nexport interface WebSocketMessage<T> {\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** The original `MessageEvent`. */\n raw: MessageEvent;\n}\n\nexport interface CreateWebSocketOptions<T> {\n /** Subprotocol(s) forwarded to the `WebSocket` constructor. */\n protocols?: string | string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable. */\n maxRetries?: number;\n /** Initial backoff (ms). Doubles each attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff (ms). Default: 30000. */\n maxBackoff?: number;\n /**\n * Ping interval (ms). When set, the client sends `pingPayload` periodically\n * to keep the socket alive. Default: 0 (disabled).\n */\n pingInterval?: number;\n /** Payload sent on each ping. Default: `JSON.stringify({ type: \"ping\" })`. */\n pingPayload?: string | ArrayBufferLike | Blob | ArrayBufferView;\n /** Parse incoming frames. Default: JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: (event: Event) => void;\n onMessage?: (message: WebSocketMessage<T>) => void;\n onClose?: (event: CloseEvent) => void;\n onError?: (event: Event) => void;\n onStatusChange?: (status: WebSocketStatus) => void;\n}\n\nexport interface WebSocketController {\n /** Send a payload over the current connection. No-op when not open. */\n send: (payload: string | ArrayBufferLike | Blob | ArrayBufferView) => boolean;\n /** Close the connection and stop reconnecting. */\n close: (code?: number, reason?: string) => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: WebSocketStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a WebSocket with automatic exponential-backoff reconnect, optional\n * heartbeat pings, and typed JSON parsing.\n *\n * @param url - Full ws:// or wss:// URL.\n * @param options - Connection configuration and callbacks.\n * @returns Controller exposing `send`, `close`, `reconnect`, and `status`.\n */\nexport function createWebSocket<T = unknown>(\n url: string,\n options: CreateWebSocketOptions<T> = {},\n): WebSocketController {\n const {\n protocols,\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n pingInterval = 0,\n pingPayload = JSON.stringify({ type: \"ping\" }),\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onClose,\n onError,\n onStatusChange,\n } = options;\n\n let socket: WebSocket | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let pingTimer: ReturnType<typeof setInterval> | null = null;\n let retries = 0;\n let status: WebSocketStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: WebSocketStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function clearPing(): void {\n if (pingTimer) {\n clearInterval(pingTimer);\n pingTimer = null;\n }\n }\n\n function startPing(): void {\n if (!pingInterval || pingInterval <= 0) return;\n clearPing();\n pingTimer = setInterval(() => {\n if (socket?.readyState === WebSocket.OPEN) {\n socket.send(pingPayload);\n }\n }, pingInterval);\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (socket) {\n socket.onopen = null;\n socket.onmessage = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.close();\n }\n setStatus(\"connecting\");\n\n const ws = new WebSocket(url, protocols);\n socket = ws;\n\n ws.onopen = (event) => {\n retries = 0;\n setStatus(\"open\");\n startPing();\n onOpen?.(event);\n };\n\n ws.onmessage = (event) => {\n const raw = typeof event.data === \"string\" ? event.data : \"\";\n onMessage?.({\n data: parser(raw),\n raw: event,\n });\n };\n\n ws.onerror = (event) => {\n onError?.(event);\n };\n\n ws.onclose = (event) => {\n clearPing();\n onClose?.(event);\n socket = null;\n setStatus(\"closed\");\n if (!closed && !event.wasClean) {\n scheduleReconnect();\n }\n };\n }\n\n function send(payload: string | ArrayBufferLike | Blob | ArrayBufferView): boolean {\n if (socket?.readyState !== WebSocket.OPEN) return false;\n socket.send(payload);\n return true;\n }\n\n function close(code?: number, reason?: string): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n clearPing();\n retries = 0;\n if (socket) {\n setStatus(\"closing\");\n socket.close(code, reason);\n socket = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n send,\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n createWebSocket,\n type CreateWebSocketOptions,\n type WebSocketController,\n type WebSocketMessage,\n type WebSocketStatus,\n} from \"./create-web-socket\";\n\nexport interface UseWebSocketOptions<T> extends Omit<CreateWebSocketOptions<T>, \"onStatusChange\"> {\n /** When false, the socket is not opened. Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseWebSocketResult<T> {\n status: WebSocketStatus;\n /** Last decoded frame received. */\n lastMessage: WebSocketMessage<T> | null;\n /** Send a payload through the active connection. Returns false when not open. */\n send: (payload: string | ArrayBufferLike | Blob | ArrayBufferView) => boolean;\n /** Force a reconnect, resetting the retry counter. */\n reconnect: () => void;\n}\n\n/**\n * React hook around {@link createWebSocket}. Manages the connection lifecycle\n * for the host component and tears it down on unmount.\n */\nexport function useWebSocket<T = unknown>(\n url: string,\n options: UseWebSocketOptions<T> = {},\n): UseWebSocketResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<WebSocketStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<WebSocketMessage<T> | null>(null);\n const controllerRef = useRef<WebSocketController | null>(null);\n\n const onMessageRef = useRef(onMessage);\n onMessageRef.current = onMessage;\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createWebSocket<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n controllerRef.current = controller;\n\n return () => {\n controller.close();\n controllerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n const send = useCallback(\n (payload: string | ArrayBufferLike | Blob | ArrayBufferView): boolean => {\n return controllerRef.current?.send(payload) ?? false;\n },\n [],\n );\n\n const reconnect = useCallback((): void => {\n controllerRef.current?.reconnect();\n }, []);\n\n return { status, lastMessage, send, reconnect };\n}\n","import { haversineKm } from \"./distance\";\nimport type { Coordinate, TravelEstimate, TravelMode } from \"./types\";\n\n/**\n * Multiplier applied to the great-circle distance to approximate real road\n * distance. Mirrors `DEFAULT_CIRCUITY_FACTOR` from `tempest-fastapi-sdk`.\n */\nexport const DEFAULT_CIRCUITY_FACTOR = 1.3;\n\n/**\n * Default average car speed in km/h used to derive duration from distance.\n * Mirrors `DEFAULT_CAR_SPEED_KMH` from `tempest-fastapi-sdk`.\n */\nexport const DEFAULT_CAR_SPEED_KMH = 50.0;\n\n/**\n * Per-mode multipliers applied to the car duration. Mirrors\n * `DEFAULT_MODE_DURATION_FACTORS` from `tempest-fastapi-sdk` — motorcycles are\n * a touch faster, buses considerably slower (stops + dedicated lanes).\n */\nexport const DEFAULT_MODE_DURATION_FACTORS: Record<TravelMode, number> = {\n car: 1.0,\n motorcycle: 0.95,\n bus: 1.6,\n};\n\n/**\n * Look up the duration multiplier for a travel mode, falling back to `1.0`\n * for unknown modes. Mirrors `duration_factor` from `tempest-fastapi-sdk`.\n *\n * @param mode - Travel mode.\n * @param factors - Optional override map (partial merges over the defaults).\n * @returns The multiplier for `mode`.\n */\nexport function durationFactor(\n mode: TravelMode,\n factors?: Partial<Record<TravelMode, number>>,\n): number {\n return factors?.[mode] ?? DEFAULT_MODE_DURATION_FACTORS[mode] ?? 1.0;\n}\n\n/** Options for {@link estimateTravel}. */\nexport interface EstimateTravelOptions {\n /** Distance multiplier over the great-circle line. Default: `1.3`. */\n circuityFactor?: number;\n /** Average car speed in km/h. Default: `50`. */\n carSpeedKmh?: number;\n /** Per-mode duration multipliers (merged over the defaults). */\n modeDurationFactors?: Partial<Record<TravelMode, number>>;\n}\n\n/**\n * Offline travel estimate between two coordinates. No network — distance comes\n * from {@link haversineKm} scaled by circuity, duration from a mode-adjusted\n * average speed. Mirrors `estimate_travel` from `tempest-fastapi-sdk`.\n *\n * @param origin - Start coordinate.\n * @param destination - End coordinate.\n * @param mode - Travel mode. Default: `\"car\"`.\n * @param options - Tuning knobs (circuity, speed, per-mode factors).\n * @returns A `\"heuristic\"` {@link TravelEstimate}.\n * @throws {RangeError} If `carSpeedKmh <= 0` or `circuityFactor <= 0`.\n *\n * @example\n * estimateTravel(\n * { latitude: -23.5505, longitude: -46.6333 },\n * { latitude: -23.5629, longitude: -46.6544 },\n * \"car\",\n * ); // { mode: \"car\", distance_km: …, duration_minutes: …, source: \"heuristic\" }\n */\nexport function estimateTravel(\n origin: Coordinate,\n destination: Coordinate,\n mode: TravelMode = \"car\",\n options: EstimateTravelOptions = {},\n): TravelEstimate {\n const {\n circuityFactor = DEFAULT_CIRCUITY_FACTOR,\n carSpeedKmh = DEFAULT_CAR_SPEED_KMH,\n modeDurationFactors,\n } = options;\n\n if (carSpeedKmh <= 0) {\n throw new RangeError(\"carSpeedKmh must be greater than 0\");\n }\n if (circuityFactor <= 0) {\n throw new RangeError(\"circuityFactor must be greater than 0\");\n }\n\n const distanceKm = haversineKm(origin, destination) * circuityFactor;\n const carMinutes = (distanceKm / carSpeedKmh) * 60.0;\n const durationMinutes = carMinutes * durationFactor(mode, modeDurationFactors);\n\n return {\n mode,\n distance_km: distanceKm,\n duration_minutes: durationMinutes,\n source: \"heuristic\",\n };\n}\n","import type { Coordinate, GeoBounds } from \"./types\";\n\n/**\n * Compute the axis-aligned bounding box that contains every point. Returns\n * `null` for an empty list (there is nothing to bound).\n *\n * @param points - Coordinates to enclose.\n * @returns The bounds, or `null` when `points` is empty.\n */\nexport function boundingBox(points: readonly Coordinate[]): GeoBounds | null {\n if (points.length === 0) return null;\n\n let minLatitude = points[0].latitude;\n let maxLatitude = points[0].latitude;\n let minLongitude = points[0].longitude;\n let maxLongitude = points[0].longitude;\n\n for (const point of points) {\n if (point.latitude < minLatitude) minLatitude = point.latitude;\n if (point.latitude > maxLatitude) maxLatitude = point.latitude;\n if (point.longitude < minLongitude) minLongitude = point.longitude;\n if (point.longitude > maxLongitude) maxLongitude = point.longitude;\n }\n\n return { minLatitude, maxLatitude, minLongitude, maxLongitude };\n}\n\n/** Geometric center of a bounding box. */\nexport function boundsCenter(bounds: GeoBounds): Coordinate {\n return {\n latitude: (bounds.minLatitude + bounds.maxLatitude) / 2,\n longitude: (bounds.minLongitude + bounds.maxLongitude) / 2,\n };\n}\n\n/**\n * Grow a bounding box outward by `ratio` of its own span on every side, with a\n * small absolute floor so a single-point (zero-span) box still gets padding.\n * A `ratio` of `0.1` adds 10% margin — handy so a plotted trajectory does not\n * hug the edge of the viewport.\n *\n * @param bounds - The box to expand.\n * @param ratio - Fraction of the span to add per side. Default: `0.1`.\n * @returns A new, larger {@link GeoBounds}.\n */\nexport function expandBounds(bounds: GeoBounds, ratio = 0.1): GeoBounds {\n const latSpan = bounds.maxLatitude - bounds.minLatitude;\n const lonSpan = bounds.maxLongitude - bounds.minLongitude;\n const latPad = latSpan * ratio || 0.001;\n const lonPad = lonSpan * ratio || 0.001;\n\n return {\n minLatitude: bounds.minLatitude - latPad,\n maxLatitude: bounds.maxLatitude + latPad,\n minLongitude: bounds.minLongitude - lonPad,\n maxLongitude: bounds.maxLongitude + lonPad,\n };\n}\n","import { durationFactor } from \"./estimate\";\nimport type { Coordinate, TravelEstimate, TravelMode } from \"./types\";\n\n/**\n * Pluggable routing backend. A backend turns two coordinates into a\n * {@link TravelEstimate}. Mirrors the `RoutingBackend` protocol from\n * `tempest-fastapi-sdk` so client and server share the same contract.\n *\n * Implement this to route against your own self-hosted engine (OSRM, Valhalla,\n * GraphHopper). The offline {@link estimateTravel} heuristic satisfies the same\n * shape without any network.\n */\nexport interface RoutingBackend {\n route: (\n origin: Coordinate,\n destination: Coordinate,\n options?: { mode?: TravelMode },\n ) => Promise<TravelEstimate>;\n}\n\n/** Options for {@link createOSRMBackend}. */\nexport interface OSRMBackendOptions {\n /**\n * Base URL of an **OSRM** HTTP server. There is no default on purpose — this\n * SDK ships no external endpoint. Point it at a routing engine **you host**.\n */\n baseUrl: string;\n /** `fetch` implementation. Default: the global `fetch`. */\n fetch?: typeof globalThis.fetch;\n /** Per-mode duration multipliers applied over the car profile. */\n modeDurationFactors?: Partial<Record<TravelMode, number>>;\n}\n\ninterface OSRMRoute {\n distance: number;\n duration: number;\n}\n\ninterface OSRMResponse {\n code?: string;\n routes?: OSRMRoute[];\n}\n\n/**\n * Build a {@link RoutingBackend} backed by an OSRM server **you host**. OSRM\n * only serves a driving profile, so motorcycle/bus durations are derived by\n * scaling the car duration through {@link durationFactor} — same approach as\n * the FastAPI SDK's `OSRMBackend`.\n *\n * !!! warning\n * This makes a network request to `baseUrl`. It is opt-in: nothing in the\n * SDK calls it unless you construct it and pass your own server URL. For a\n * zero-network estimate, use {@link estimateTravel} instead.\n *\n * @param options - Server URL, optional `fetch`, per-mode factors.\n * @returns A backend whose `route()` queries OSRM.\n *\n * @example\n * const backend = createOSRMBackend({ baseUrl: \"https://osrm.internal\" });\n * const estimate = await backend.route(origin, destination, { mode: \"car\" });\n */\nexport function createOSRMBackend(options: OSRMBackendOptions): RoutingBackend {\n const { baseUrl, fetch = globalThis.fetch, modeDurationFactors } = options;\n const trimmedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n\n return {\n async route(origin, destination, routeOptions = {}): Promise<TravelEstimate> {\n const mode = routeOptions.mode ?? \"car\";\n const coords = `${origin.longitude},${origin.latitude};${destination.longitude},${destination.latitude}`;\n const url = `${trimmedBaseUrl}/route/v1/driving/${coords}?overview=false`;\n\n let payload: OSRMResponse;\n try {\n const response = await fetch(url);\n payload = (await response.json()) as OSRMResponse;\n } catch (cause) {\n throw new Error(`OSRM request failed: ${String(cause)}`, { cause });\n }\n\n const route = payload.routes?.[0];\n if (payload.code !== \"Ok\" || !route) {\n throw new Error(`OSRM returned no route (code: ${payload.code ?? \"unknown\"})`);\n }\n\n const distanceKm = route.distance / 1000.0;\n const carMinutes = route.duration / 60.0;\n const durationMinutes = carMinutes * durationFactor(mode, modeDurationFactors);\n\n return {\n mode,\n distance_km: distanceKm,\n duration_minutes: durationMinutes,\n source: \"osrm\",\n };\n },\n };\n}\n","import { haversineKm } from \"./distance\";\nimport type { TrackPoint } from \"./types\";\n\n/** Lifecycle status of a {@link PositionTracker}. */\nexport type TrackerStatus = \"idle\" | \"tracking\" | \"error\";\n\n/** Options for {@link createPositionTracker}. */\nexport interface CreatePositionTrackerOptions {\n /**\n * Discard a new sample when it is closer than this (in km) to the last\n * kept point — filters GPS jitter while standing still. Default: `0.005`\n * (5 meters). Pass `0` to keep every sample.\n */\n minDistanceKm?: number;\n /**\n * Cap the retained trajectory to the most recent N points (older points are\n * dropped, but their distance stays counted). Default: `Infinity`.\n */\n maxPoints?: number;\n /** Forwarded to `navigator.geolocation.watchPosition`. */\n positionOptions?: PositionOptions;\n /** Called with the full trajectory each time a point is added. */\n onUpdate?: (points: readonly TrackPoint[]) => void;\n /** Called on a `GeolocationPositionError`. */\n onError?: (error: GeolocationPositionError) => void;\n /** Called whenever the status changes. */\n onStatusChange?: (status: TrackerStatus) => void;\n}\n\n/** Imperative controller returned by {@link createPositionTracker}. */\nexport interface PositionTracker {\n /** Begin watching position. No-op if already tracking. */\n start: () => void;\n /** Stop watching. Retains the recorded trajectory. */\n stop: () => void;\n /** Stop and discard the recorded trajectory. */\n clear: () => void;\n /** Snapshot of the recorded trajectory (newest last). */\n readonly points: readonly TrackPoint[];\n /** Total distance of the recorded trajectory in kilometers. */\n readonly distanceKm: number;\n /** Current tracker status. */\n readonly status: TrackerStatus;\n}\n\n/**\n * Record a live GPS trajectory from `navigator.geolocation.watchPosition`.\n * Framework-free — the {@link usePositionTracker} hook wraps this for React.\n *\n * Jitter while stationary is filtered by `minDistanceKm`; distance is\n * accumulated across the *full* run even when `maxPoints` trims the retained\n * array. 100% browser-side: no network, no external service.\n *\n * @param options - Filtering, retention and callbacks.\n * @returns A controller with `start`/`stop`/`clear` and live getters.\n *\n * @example\n * const tracker = createPositionTracker({\n * minDistanceKm: 0.01,\n * onUpdate: (pts) => console.log(pts.length, \"points\"),\n * });\n * tracker.start();\n * // …later\n * tracker.stop();\n * console.log(tracker.distanceKm);\n */\nexport function createPositionTracker(options: CreatePositionTrackerOptions = {}): PositionTracker {\n const {\n minDistanceKm = 0.005,\n maxPoints = Infinity,\n positionOptions,\n onUpdate,\n onError,\n onStatusChange,\n } = options;\n\n let points: TrackPoint[] = [];\n let distanceKm = 0;\n let lastKept: TrackPoint | null = null;\n let watchId: number | null = null;\n let status: TrackerStatus = \"idle\";\n\n function setStatus(next: TrackerStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function handlePosition(position: GeolocationPosition): void {\n const point: TrackPoint = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n timestamp: position.timestamp,\n accuracy: position.coords.accuracy,\n };\n\n if (lastKept) {\n const step = haversineKm(lastKept, point);\n if (step < minDistanceKm) return;\n distanceKm += step;\n }\n\n lastKept = point;\n points.push(point);\n if (points.length > maxPoints) {\n points = points.slice(points.length - maxPoints);\n }\n onUpdate?.(points);\n }\n\n function handleError(error: GeolocationPositionError): void {\n setStatus(\"error\");\n onError?.(error);\n }\n\n function start(): void {\n if (watchId !== null) return;\n if (typeof navigator === \"undefined\" || !navigator.geolocation) {\n setStatus(\"error\");\n return;\n }\n setStatus(\"tracking\");\n watchId = navigator.geolocation.watchPosition(handlePosition, handleError, positionOptions);\n }\n\n function stop(): void {\n if (watchId !== null && typeof navigator !== \"undefined\" && navigator.geolocation) {\n navigator.geolocation.clearWatch(watchId);\n }\n watchId = null;\n setStatus(\"idle\");\n }\n\n function clear(): void {\n stop();\n points = [];\n distanceKm = 0;\n lastKept = null;\n onUpdate?.(points);\n }\n\n return {\n start,\n stop,\n clear,\n get points() {\n return points;\n },\n get distanceKm() {\n return distanceKm;\n },\n get status() {\n return status;\n },\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { boundingBox, expandBounds } from \"./bounds\";\nimport { haversineKm } from \"./distance\";\nimport { fitProjection, type PixelPoint } from \"./projection\";\nimport type { Coordinate, GeoMarker } from \"./types\";\nimport styles from \"./TrajectoryMap.module.css\";\n\n// Leaflet layer is loaded on demand — only when a `tileUrl` is supplied, so\n// apps that stick to the tile-free SVG never pull leaflet into their bundle.\nconst LeafletTrajectory = lazy(() =>\n import(\"./leaflet-map\").then((m) => ({ default: m.LeafletTrajectory })),\n);\n\nexport interface TrajectoryMapProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Ordered coordinates forming the trajectory. */\n points: readonly Coordinate[];\n /** Optional \"current position\" marker, drawn on top of the path. */\n current?: Coordinate | null;\n /** Viewport height in pixels. Default: `320`. */\n height?: number;\n /** Inner padding in pixels kept clear on every edge. Default: `24`. */\n padding?: number;\n /** Draw a light reference grid behind the path (SVG mode). Default: `true`. */\n showGrid?: boolean;\n /** Draw a distance scale bar (SVG mode). Default: `true`. */\n showScale?: boolean;\n /** Path stroke color. Default: the primary token. */\n strokeColor?: string;\n /**\n * Tile URL template (`{z}/{x}/{y}`) of a map server **you host**. When set,\n * the map upgrades to a real Leaflet tile layer (requires `leaflet` to be\n * installed). Omit for the zero-dependency, zero-network SVG plot.\n */\n tileUrl?: string;\n /** Attribution text shown over the tile layer. */\n tileAttribution?: string;\n /** Accessible label for the map region. Default: `\"Trajetória\"`. */\n label?: string;\n /** Point markers to overlay (e.g. stops, POIs). Included in the auto-fit. */\n markers?: readonly GeoMarker[];\n /** Fired when a marker is clicked. */\n onMarkerClick?: (marker: GeoMarker, index: number) => void;\n}\n\nconst NICE_KM_STEPS = [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000] as const;\n\n/** Pick the largest \"nice\" distance whose bar fits within `maxPixels`. */\nfunction pickScaleKm(kmPerPixel: number, maxPixels: number): { km: number; pixels: number } {\n const maxKm = kmPerPixel * maxPixels;\n let chosen: number = NICE_KM_STEPS[0];\n for (const step of NICE_KM_STEPS) {\n if (step <= maxKm) chosen = step;\n }\n return { km: chosen, pixels: chosen / kmPerPixel };\n}\n\n/** Format a distance in km for the scale bar (meters below 1 km). */\nfunction formatScale(km: number): string {\n return km < 1 ? `${Math.round(km * 1000)} m` : `${km % 1 === 0 ? km : km.toFixed(1)} km`;\n}\n\n/**\n * Plot a GPS trajectory. By default it renders a **tile-free SVG** map (Web\n * Mercator projection, auto-fit to the points, optional grid + scale bar) —\n * 100% self-contained, no external tiles or paid API. Pass `tileUrl` pointing\n * at a map server **you host** to upgrade to a real Leaflet tile layer.\n *\n * @example\n * // Zero-dependency SVG plot\n * <TrajectoryMap points={points} current={lastPoint} height={360} />\n *\n * @example\n * // Real tiles from your own server (requires `leaflet` installed)\n * <TrajectoryMap points={points} tileUrl=\"https://tiles.internal/{z}/{x}/{y}.png\" />\n */\nexport function TrajectoryMap({\n points,\n current,\n height = 320,\n padding = 24,\n showGrid = true,\n showScale = true,\n strokeColor,\n tileUrl,\n tileAttribution,\n label = \"Trajetória\",\n markers,\n onMarkerClick,\n className,\n style,\n ...rest\n}: TrajectoryMapProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>(600);\n\n useEffect(() => {\n const node = containerRef.current;\n if (!node || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const measured = entries[0]?.contentRect.width;\n if (measured && measured > 0) setWidth(measured);\n });\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n const allPoints = useMemo<Coordinate[]>(\n () => [...points, ...(current ? [current] : []), ...(markers ?? [])],\n [points, current, markers],\n );\n\n const svg = useMemo(() => {\n const box = boundingBox(allPoints);\n if (!box) return null;\n\n const projection = fitProjection(expandBounds(box, 0.12), width, height, { padding });\n const pixels: PixelPoint[] = points.map((p) => projection.project(p));\n const polyline = pixels.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\" \");\n\n const startPixel = pixels[0] ?? null;\n const endPixel = pixels.length > 0 ? pixels[pixels.length - 1] : null;\n const currentPixel = current ? projection.project(current) : null;\n\n // Distance-per-pixel at the map center, for the scale bar: measure the\n // center → east-edge span in both km (haversine) and pixels (projected).\n const centerCoord = {\n latitude: (box.minLatitude + box.maxLatitude) / 2,\n longitude: (box.minLongitude + box.maxLongitude) / 2,\n };\n const center = projection.project(centerCoord);\n const eastRef = projection.project({ ...centerCoord, longitude: box.maxLongitude });\n const edgeKm = haversineKm(centerCoord, { ...centerCoord, longitude: box.maxLongitude });\n const edgePixels = Math.abs(eastRef.x - center.x) || 1;\n const kmPerPixel = edgeKm / edgePixels || 0;\n\n const markerPixels = (markers ?? []).map((m) => ({ marker: m, p: projection.project(m) }));\n\n return { polyline, startPixel, endPixel, currentPixel, kmPerPixel, markerPixels };\n }, [allPoints, points, current, markers, width, height, padding]);\n\n // ── Leaflet tile mode ────────────────────────────────────────────────────\n if (tileUrl) {\n return (\n <div\n ref={containerRef}\n className={cn(styles.map, className)}\n style={{ height, ...style }}\n role=\"img\"\n aria-label={label}\n {...rest}\n >\n <Suspense fallback={<div className={styles.loading}>Carregando mapa…</div>}>\n <LeafletTrajectory\n points={points}\n current={current}\n tileUrl={tileUrl}\n tileAttribution={tileAttribution}\n strokeColor={strokeColor}\n />\n </Suspense>\n </div>\n );\n }\n\n // ── Tile-free SVG mode ─────────────────────────────────────────────────────\n const scale =\n showScale && svg && svg.kmPerPixel > 0\n ? pickScaleKm(svg.kmPerPixel, Math.min(120, width * 0.35))\n : null;\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.map, className)}\n style={{ height, ...style }}\n role=\"img\"\n aria-label={label}\n {...rest}\n >\n {!svg ? (\n <div className={styles.empty}>Sem pontos de trajetória ainda.</div>\n ) : (\n <svg\n className={styles.svg}\n width=\"100%\"\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {showGrid && (\n <g className={styles.grid}>\n {[0.25, 0.5, 0.75].map((f) => (\n <line\n key={`h${f}`}\n x1={0}\n y1={height * f}\n x2={width}\n y2={height * f}\n />\n ))}\n {[0.25, 0.5, 0.75].map((f) => (\n <line\n key={`v${f}`}\n x1={width * f}\n y1={0}\n x2={width * f}\n y2={height}\n />\n ))}\n </g>\n )}\n\n {svg.polyline && (\n <polyline\n className={styles.path}\n points={svg.polyline}\n fill=\"none\"\n stroke={strokeColor}\n data-testid=\"trajectory-path\"\n />\n )}\n\n {svg.startPixel && (\n <circle\n className={styles.start}\n cx={svg.startPixel.x}\n cy={svg.startPixel.y}\n r={5}\n />\n )}\n {svg.endPixel && !current && (\n <circle\n className={styles.end}\n cx={svg.endPixel.x}\n cy={svg.endPixel.y}\n r={5}\n />\n )}\n {svg.currentPixel && (\n <>\n <circle\n className={styles.pulse}\n cx={svg.currentPixel.x}\n cy={svg.currentPixel.y}\n r={10}\n />\n <circle\n className={styles.current}\n cx={svg.currentPixel.x}\n cy={svg.currentPixel.y}\n r={5}\n />\n </>\n )}\n\n {svg.markerPixels.map(({ marker, p }, i) => {\n const interactive = Boolean(onMarkerClick);\n return (\n <circle\n key={marker.id ?? i}\n className={styles.marker}\n cx={p.x}\n cy={p.y}\n r={marker.radius ?? 6}\n style={marker.color ? { fill: marker.color } : undefined}\n data-marker-id={marker.id ?? i}\n tabIndex={interactive ? 0 : undefined}\n role={interactive ? \"button\" : undefined}\n aria-label={marker.label}\n onClick={interactive ? () => onMarkerClick?.(marker, i) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onMarkerClick?.(marker, i);\n }\n }\n : undefined\n }\n >\n {marker.label ? <title>{marker.label}</title> : null}\n </circle>\n );\n })}\n\n {scale && (\n <g\n className={styles.scale}\n transform={`translate(${padding}, ${height - padding})`}\n >\n <line x1={0} y1={0} x2={scale.pixels} y2={0} />\n <line x1={0} y1={-4} x2={0} y2={4} />\n <line x1={scale.pixels} y1={-4} x2={scale.pixels} y2={4} />\n <text x={scale.pixels / 2} y={-8} textAnchor=\"middle\">\n {formatScale(scale.km)}\n </text>\n </g>\n )}\n </svg>\n )}\n </div>\n );\n}\n","import type { ResolvedTheme, ThemeMode } from \"./types\";\n\nexport interface GetInitialThemeOptions {\n /** localStorage key. Default: `\"tempest-theme\"`. */\n storageKey?: string;\n /** Theme used when nothing is stored and the user has no system preference. */\n defaultTheme?: ThemeMode;\n}\n\n/**\n * Inline-safe theme resolution intended for early bootstrap (e.g. inside the\n * `<head>` script that prevents the flash of incorrect theme). Reads from\n * localStorage and falls back to `prefers-color-scheme`.\n */\nexport function getInitialTheme(options: GetInitialThemeOptions = {}): ResolvedTheme {\n const { storageKey = \"tempest-theme\", defaultTheme = \"system\" } = options;\n\n if (typeof window === \"undefined\") {\n return defaultTheme === \"dark\" ? \"dark\" : \"light\";\n }\n\n let stored: ThemeMode | null = null;\n try {\n stored = window.localStorage.getItem(storageKey) as ThemeMode | null;\n } catch {\n stored = null;\n }\n\n const mode: ThemeMode = stored ?? defaultTheme;\n if (mode === \"dark\" || mode === \"light\") return mode;\n\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/**\n * Plain HTML snippet that sets `data-tempest-theme` on `<html>` before React\n * hydrates. Inline this in `<head>` to avoid a flash of the wrong theme on\n * first paint.\n *\n * @example\n * <script dangerouslySetInnerHTML={{ __html: themeInitScript() }} />\n */\nexport function themeInitScript(options: GetInitialThemeOptions = {}): string {\n const storageKey = options.storageKey ?? \"tempest-theme\";\n const defaultTheme = options.defaultTheme ?? \"system\";\n return `\n(function(){try{\n var key=${JSON.stringify(storageKey)};\n var def=${JSON.stringify(defaultTheme)};\n var stored=localStorage.getItem(key);\n var mode=stored||def;\n var resolved=mode===\"dark\"||mode===\"light\"?mode:(matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\");\n document.documentElement.setAttribute(\"data-tempest-theme\",resolved);\n}catch(e){}})();\n`.trim();\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface LoggerSink {\n (entry: LogEntry): void;\n}\n\nexport interface Logger {\n debug: (message: string, context?: Record<string, unknown>) => void;\n info: (message: string, context?: Record<string, unknown>) => void;\n warn: (message: string, context?: Record<string, unknown>) => void;\n error: (message: string, context?: Record<string, unknown>) => void;\n /** Build a child logger that prefixes the namespace to each message. */\n child: (namespace: string) => Logger;\n}\n\nexport interface CreateLoggerOptions {\n /** Lowest level recorded. Default: `\"info\"`. */\n level?: LogLevel;\n /** Output adapters. Default: a `console.*` sink. */\n sinks?: LoggerSink[];\n /** Initial namespace (prepended to every message). */\n namespace?: string;\n}\n\nconst LEVELS: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\nfunction shouldLog(threshold: LogLevel, level: LogLevel): boolean {\n return LEVELS.indexOf(level) >= LEVELS.indexOf(threshold);\n}\n\n/** Default sink that writes to the browser console. */\nexport const consoleSink: LoggerSink = ({ level, message, context }) => {\n const method = level === \"debug\" ? \"log\" : level;\n if (context) {\n console[method](message, context);\n } else {\n console[method](message);\n }\n};\n\n/**\n * Create a structured leveled logger. Plug arbitrary sinks (Sentry, Datadog,\n * remote ingestion) by implementing the `LoggerSink` interface.\n */\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const threshold = options.level ?? \"info\";\n const sinks = options.sinks ?? [consoleSink];\n const namespace = options.namespace ?? \"\";\n\n function emit(level: LogLevel, message: string, context?: Record<string, unknown>): void {\n if (!shouldLog(threshold, level)) return;\n const entry: LogEntry = {\n level,\n message: namespace ? `[${namespace}] ${message}` : message,\n context,\n timestamp: Date.now(),\n };\n for (const sink of sinks) {\n try {\n sink(entry);\n } catch {\n /* never let a sink break the app */\n }\n }\n }\n\n return {\n debug: (message, context) => emit(\"debug\", message, context),\n info: (message, context) => emit(\"info\", message, context),\n warn: (message, context) => emit(\"warn\", message, context),\n error: (message, context) => emit(\"error\", message, context),\n child: (childNamespace: string) =>\n createLogger({\n level: threshold,\n sinks,\n namespace: namespace ? `${namespace}:${childNamespace}` : childNamespace,\n }),\n };\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n","import type { TelemetryAdapter } from \"./types\";\n\n/**\n * Dev-friendly adapter that logs every call to `console`. Use as a default\n * before plugging the real provider (Sentry / Datadog / PostHog).\n */\nexport const consoleTelemetryAdapter: TelemetryAdapter = {\n identify(user) {\n console.info(\"[telemetry] identify\", user);\n },\n track(event) {\n console.info(\"[telemetry] track\", event.name, event.properties);\n },\n captureException(error, context) {\n console.error(\"[telemetry] exception\", error, context);\n },\n};\n","import type { TelemetryAdapter, TelemetryEvent, TelemetryUser } from \"./types\";\n\n/**\n * Minimal subset of `@sentry/browser` used by the adapter. Lets you pass\n * either the real SDK module (`import * as Sentry from \"@sentry/browser\"`)\n * or a stubbed object in tests.\n */\nexport interface SentryLike {\n init?: (options: Record<string, unknown>) => void;\n setUser: (user: Record<string, unknown> | null) => void;\n addBreadcrumb: (breadcrumb: {\n category?: string;\n message?: string;\n level?: string;\n data?: Record<string, unknown>;\n }) => void;\n captureException: (\n error: unknown,\n hint?: { extra?: Record<string, unknown>; contexts?: Record<string, unknown> },\n ) => void;\n flush?: (timeout?: number) => Promise<boolean>;\n}\n\nexport interface CreateSentryTelemetryAdapterOptions {\n /** The Sentry browser SDK namespace. Required. */\n sentry: SentryLike;\n /** Optional init payload — passed verbatim to `Sentry.init` when the provider mounts. */\n initOptions?: Record<string, unknown>;\n /** Flush timeout in ms (default `2000`). */\n flushTimeout?: number;\n /** Breadcrumb category for `track` events (default `\"app\"`). */\n breadcrumbCategory?: string;\n}\n\nfunction userToSentry(user: TelemetryUser | null): Record<string, unknown> | null {\n if (user === null) return null;\n const { id, email, name, traits } = user;\n return {\n ...(id !== undefined ? { id } : null),\n ...(email !== undefined ? { email } : null),\n ...(name !== undefined ? { username: name } : null),\n ...(traits ?? null),\n };\n}\n\n/**\n * Build a [[TelemetryAdapter]] backed by `@sentry/browser`. The Sentry SDK\n * is supplied by the caller (not bundled) so apps that already initialise\n * Sentry at startup can share that instance — and apps that don't use\n * Sentry never pay for it.\n *\n * Mapping:\n * - `identify(user)` → `Sentry.setUser`\n * - `track(event)` → `Sentry.addBreadcrumb({ category, message: event.name, data })`\n * - `captureException(err, ctx)` → `Sentry.captureException(err, { extra: ctx })`\n * - `flush()` → `Sentry.flush(flushTimeout)`\n *\n * @example\n * import * as Sentry from \"@sentry/browser\";\n * import { createSentryTelemetryAdapter, TelemetryProvider } from \"tempest-react-sdk\";\n *\n * const adapter = createSentryTelemetryAdapter({\n * sentry: Sentry,\n * initOptions: { dsn: import.meta.env.VITE_SENTRY_DSN, tracesSampleRate: 0.1 },\n * });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n */\nexport function createSentryTelemetryAdapter(\n options: CreateSentryTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { sentry, initOptions, flushTimeout = 2000, breadcrumbCategory = \"app\" } = options;\n\n return {\n init() {\n if (initOptions && sentry.init) {\n sentry.init(initOptions);\n }\n },\n identify(user: TelemetryUser | null) {\n sentry.setUser(userToSentry(user));\n },\n track(event: TelemetryEvent) {\n sentry.addBreadcrumb({\n category: breadcrumbCategory,\n message: event.name,\n level: \"info\",\n ...(event.properties ? { data: event.properties } : null),\n });\n },\n captureException(error: unknown, context?: Record<string, unknown>) {\n sentry.captureException(error, context ? { extra: context } : undefined);\n },\n async flush() {\n if (sentry.flush) {\n await sentry.flush(flushTimeout);\n }\n },\n };\n}\n","import type { TelemetryAdapter, TelemetryEvent, TelemetryUser } from \"./types\";\n\n/**\n * Minimal subset of `posthog-js` used by the adapter. Pass either the real\n * default export (`import posthog from \"posthog-js\"`) or a stubbed object\n * in tests.\n */\nexport interface PostHogLike {\n init?: (apiKey: string, options?: Record<string, unknown>) => void;\n identify: (distinctId: string, properties?: Record<string, unknown>) => void;\n capture: (eventName: string, properties?: Record<string, unknown>) => void;\n captureException?: (error: unknown, properties?: Record<string, unknown>) => void;\n reset?: () => void;\n}\n\nexport interface CreatePostHogTelemetryAdapterOptions {\n /** The PostHog JS client (the default export of `posthog-js`). Required. */\n posthog: PostHogLike;\n /** Project API key + options. When provided, `Provider.init` calls `posthog.init(apiKey, options)`. */\n init?: { apiKey: string; options?: Record<string, unknown> };\n}\n\nfunction userToProperties(user: TelemetryUser): Record<string, unknown> {\n const { email, name, traits } = user;\n return {\n ...(email !== undefined ? { email } : null),\n ...(name !== undefined ? { name } : null),\n ...(traits ?? null),\n };\n}\n\n/**\n * Build a [[TelemetryAdapter]] backed by [`posthog-js`](https://posthog.com/docs/libraries/js).\n * The PostHog client is supplied by the caller (not bundled).\n *\n * Mapping:\n * - `identify(user)` → `posthog.identify(user.id, { email, name, ...traits })` (or `posthog.reset()` when `null`)\n * - `track({ name, properties })` → `posthog.capture(name, properties)`\n * - `captureException(err, ctx)` → `posthog.captureException(err, ctx)` when available, otherwise `posthog.capture(\"$exception\", { …err, …ctx })`\n * - `flush()` → no-op (PostHog batches automatically)\n *\n * @example\n * import posthog from \"posthog-js\";\n * import { createPostHogTelemetryAdapter, TelemetryProvider } from \"tempest-react-sdk\";\n *\n * const adapter = createPostHogTelemetryAdapter({\n * posthog,\n * init: { apiKey: import.meta.env.VITE_POSTHOG_KEY, options: { api_host: \"https://us.i.posthog.com\" } },\n * });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n */\nexport function createPostHogTelemetryAdapter(\n options: CreatePostHogTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { posthog, init } = options;\n\n return {\n init() {\n if (init && posthog.init) {\n posthog.init(init.apiKey, init.options);\n }\n },\n identify(user: TelemetryUser | null) {\n if (user === null) {\n posthog.reset?.();\n return;\n }\n if (user.id === undefined) return;\n posthog.identify(user.id, userToProperties(user));\n },\n track(event: TelemetryEvent) {\n posthog.capture(event.name, event.properties);\n },\n captureException(error: unknown, context?: Record<string, unknown>) {\n if (posthog.captureException) {\n posthog.captureException(error, context);\n return;\n }\n const err = error instanceof Error ? error : new Error(String(error));\n posthog.capture(\"$exception\", {\n $exception_message: err.message,\n $exception_type: err.name,\n $exception_stack_trace_raw: err.stack,\n ...context,\n });\n },\n };\n}\n","import { createContext, useContext, useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\nconst FeatureFlagsContext = createContext<FeatureFlagsAdapter | null>(null);\n\nexport interface FeatureFlagsProviderProps {\n adapter: FeatureFlagsAdapter;\n children: ReactNode;\n}\n\n/** Inject a feature flags adapter into the tree. */\nexport function FeatureFlagsProvider({ adapter, children }: FeatureFlagsProviderProps) {\n const value = useMemo(() => adapter, [adapter]);\n useEffect(() => undefined, [value]);\n return <FeatureFlagsContext.Provider value={value}>{children}</FeatureFlagsContext.Provider>;\n}\n\nfunction useAdapter(): FeatureFlagsAdapter {\n const ctx = useContext(FeatureFlagsContext);\n if (!ctx) throw new Error(\"useFeatureFlag requires <FeatureFlagsProvider>\");\n return ctx;\n}\n\n/**\n * Read a boolean flag and re-render when the adapter fires `onChange`.\n *\n * @example\n * const showNewFeed = useFeatureFlag(\"new-feed\", false);\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n const adapter = useAdapter();\n const subscribe = (listener: () => void): (() => void) =>\n adapter.onChange ? adapter.onChange(listener) : () => undefined;\n const get = (): boolean => adapter.isEnabled(key, defaultValue);\n return useSyncExternalStore(subscribe, get, get);\n}\n\n/**\n * Read a typed flag value (string / number / boolean / null) and re-render\n * on change.\n */\nexport function useFlagValue<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n const adapter = useAdapter();\n const subscribe = (listener: () => void): (() => void) =>\n adapter.onChange ? adapter.onChange(listener) : () => undefined;\n const get = (): T => adapter.get<T>(key, defaultValue);\n return useSyncExternalStore(subscribe, get, get);\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\nexport interface InMemoryFlagsOptions {\n initial?: Record<string, FlagValue>;\n}\n\n/**\n * Trivial in-memory adapter. Suitable for tests, local development, or as a\n * fallback wrapping the real provider while it loads.\n */\nexport function createInMemoryFlags(options: InMemoryFlagsOptions = {}): FeatureFlagsAdapter & {\n set: (key: string, value: FlagValue) => void;\n} {\n const flags: Record<string, FlagValue> = { ...(options.initial ?? {}) };\n const listeners = new Set<() => void>();\n\n function notify(): void {\n for (const listener of listeners) listener();\n }\n\n return {\n isEnabled(key, defaultValue = false) {\n return key in flags ? Boolean(flags[key]) : defaultValue;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return (key in flags ? (flags[key] as T) : (defaultValue as T)) as T;\n },\n onChange(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n set(key, value) {\n flags[key] = value;\n notify();\n },\n };\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\n/**\n * Minimal subset of [`@growthbook/growthbook`](https://docs.growthbook.io/lib/js)\n * used by the adapter. Pass a `GrowthBook` instance directly.\n */\nexport interface GrowthBookLike {\n isOn: (key: string) => boolean;\n getFeatureValue: <T>(key: string, defaultValue: T) => T;\n /** Registers a renderer fired whenever GrowthBook re-evaluates features. */\n setRenderer?: (renderer: () => void) => void;\n}\n\nexport interface CreateGrowthBookFeatureFlagsAdapterOptions {\n /** The GrowthBook instance. Required. */\n growthbook: GrowthBookLike;\n}\n\n/**\n * Build a [[FeatureFlagsAdapter]] backed by a GrowthBook instance. Apps\n * initialise GrowthBook themselves (so they can load features over the\n * network, set attributes, etc.) — the adapter just routes lookups.\n *\n * Mapping:\n * - `isEnabled(key, default)` → `growthbook.isOn(key)` (falls back to `default` if no value)\n * - `get(key, default)` → `growthbook.getFeatureValue(key, default)`\n * - `onChange(listener)` → `growthbook.setRenderer(listener)` (single-renderer SDK constraint)\n *\n * @example\n * import { GrowthBook } from \"@growthbook/growthbook\";\n * import { FeatureFlagsProvider, createGrowthBookFeatureFlagsAdapter } from \"tempest-react-sdk\";\n *\n * const gb = new GrowthBook({ apiHost: \"...\", clientKey: \"...\" });\n * await gb.loadFeatures();\n * const adapter = createGrowthBookFeatureFlagsAdapter({ growthbook: gb });\n *\n * <FeatureFlagsProvider adapter={adapter}><App /></FeatureFlagsProvider>;\n */\nexport function createGrowthBookFeatureFlagsAdapter(\n options: CreateGrowthBookFeatureFlagsAdapterOptions,\n): FeatureFlagsAdapter {\n const { growthbook } = options;\n const listeners = new Set<() => void>();\n let rendererInstalled = false;\n\n function ensureRenderer(): void {\n if (rendererInstalled || !growthbook.setRenderer) return;\n rendererInstalled = true;\n growthbook.setRenderer(() => {\n for (const listener of listeners) listener();\n });\n }\n\n return {\n isEnabled(key: string, defaultValue = false) {\n const value = growthbook.isOn(key);\n if (typeof value === \"boolean\") return value;\n return defaultValue;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return growthbook.getFeatureValue(key, defaultValue as T);\n },\n onChange(listener) {\n ensureRenderer();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\n/**\n * Minimal subset of [`launchdarkly-js-client-sdk`](https://docs.launchdarkly.com/sdk/client-side/javascript)\n * used by the adapter. Pass an existing `LDClient`.\n */\nexport interface LDClientLike {\n variation: <T = unknown>(key: string, defaultValue: T) => T;\n on?: (event: string, handler: () => void) => void;\n off?: (event: string, handler: () => void) => void;\n}\n\nexport interface CreateLaunchDarklyFeatureFlagsAdapterOptions {\n /** The LaunchDarkly JS client. Required. */\n client: LDClientLike;\n}\n\n/**\n * Build a [[FeatureFlagsAdapter]] backed by a LaunchDarkly JS client. Apps\n * initialise the client themselves (`LDClient.initialize(envKey, ctx)`) and\n * pass it in.\n *\n * Mapping:\n * - `isEnabled(key, default)` → `client.variation(key, default) === true`\n * - `get(key, default)` → `client.variation(key, default)`\n * - `onChange(listener)` → `client.on(\"change\", listener)` / `client.off(\"change\", listener)`\n *\n * @example\n * import * as LDClient from \"launchdarkly-js-client-sdk\";\n * import { FeatureFlagsProvider, createLaunchDarklyFeatureFlagsAdapter } from \"tempest-react-sdk\";\n *\n * const client = LDClient.initialize(import.meta.env.VITE_LD_CLIENT_ID, { kind: \"user\", key: userId });\n * await client.waitUntilReady();\n * const adapter = createLaunchDarklyFeatureFlagsAdapter({ client });\n *\n * <FeatureFlagsProvider adapter={adapter}><App /></FeatureFlagsProvider>;\n */\nexport function createLaunchDarklyFeatureFlagsAdapter(\n options: CreateLaunchDarklyFeatureFlagsAdapterOptions,\n): FeatureFlagsAdapter {\n const { client } = options;\n\n return {\n isEnabled(key: string, defaultValue = false) {\n return client.variation<boolean>(key, defaultValue) === true;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return client.variation<T>(key, defaultValue as T);\n },\n onChange(listener) {\n if (!client.on || !client.off) {\n return () => {};\n }\n client.on(\"change\", listener);\n return () => {\n client.off!(\"change\", listener);\n };\n },\n };\n}\n","export interface SharePayload {\n title?: string;\n text?: string;\n url?: string;\n /** Files to share (supported only on a subset of browsers). */\n files?: File[];\n}\n\nexport interface ShareResult {\n /** True when `navigator.share` resolved successfully. */\n shared: boolean;\n /** True when the platform did not support the requested payload. */\n unsupported: boolean;\n /** True when the user cancelled the share dialog. */\n cancelled: boolean;\n error?: unknown;\n}\n\n/**\n * Wrap the Web Share API with a uniform result object. Falls through to\n * `unsupported: true` when the browser lacks `navigator.share`, leaving the\n * caller free to render a custom fallback (copy-link, social buttons).\n */\nexport async function share(payload: SharePayload): Promise<ShareResult> {\n if (typeof navigator === \"undefined\" || !(\"share\" in navigator)) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n if (payload.files && !navigator.canShare?.({ files: payload.files })) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n try {\n await navigator.share(payload);\n return { shared: true, unsupported: false, cancelled: false };\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return { shared: false, unsupported: false, cancelled: true };\n }\n return { shared: false, unsupported: false, cancelled: false, error };\n }\n}\n\n/** True when the Web Share API is available in this environment. */\nexport function isShareSupported(): boolean {\n return typeof navigator !== \"undefined\" && \"share\" in navigator;\n}\n"],"names":["Accordion","items","multiple","value","defaultValue","onChange","className","reactId","useId","isControlled","internalOpen","setInternalOpen","useState","openIds","toggle","useCallback","id","isOpen","next","x","jsx","cn","styles","item","open","panelId","triggerId","jsxs","ChevronIcon","Alert","variant","appearance","title","description","icon","onClose","closeLabel","children","props","CloseIcon","AppBar","leading","showBack","onBack","backLabel","backIcon","brand","actions","centered","sticky","tone","bordered","safeArea","handleBack","leadingContent","Fragment","ArrowLeft","BREAKPOINTS","ORDER","resolveCurrent","width","current","key","useBreakpoint","setWidth","useEffect","onResize","above","bp","below","AppShell","navbar","sidebar","bottomNav","footer","sidebarBreakpoint","showSidebar","AspectRatio","ratio","style","finalStyle","getInitials","name","parts","Avatar","src","alt","size","status","onClick","errored","setErrored","initials","useMemo","showImage","role","tabIndex","event","Badge","shape","dot","Banner","action","dismissible","onDismiss","setOpen","BottomNavigation","showLabels","active","BottomSheet","showHandle","dismissOnBackdrop","dismissOnEsc","handler","e","previous","createPortal","Breadcrumbs","separator","index","isLast","interactive","Button","loading","fullWidth","iconOnly","pill","leftIcon","rightIcon","disabled","SpinnerIcon","Card","flush","elevation","hasHeader","Center","axis","minHeight","Checkbox","forwardRef","label","indeterminate","wrapperClassName","ref","innerRef","useRef","setRef","node","DashIcon","CheckIcon","ChipInput","placeholder","helperText","error","commitKeys","normalize","draft","setDraft","inputRef","commit","handleKeyDown","remove","chip","defaultFilter","option","query","Combobox","options","filter","emptyMessage","rootRef","setQuery","activeIndex","setActiveIndex","selectedLabel","o","filtered","closeAndReset","handleSelect","onDown","Modal","closeOnBackdrop","closeOnEsc","hideCloseButton","fullscreen","fullscreenOnMobile","previousOverflow","handleKey","sizeClassName","ConfirmDialog","confirmLabel","cancelLabel","onConfirm","onCancel","DatePicker","mode","Input","Divider","orientation","align","Drawer","placement","mobilePlacement","isMobile","effectivePlacement","placementClass","DropdownMenu","trigger","itemRefs","selectableIndexes","entry","i","close","onKey","prev","handleTriggerClick","triggerClone","el","Dropzone","onDrop","accept","maxSize","onReject","isDragging","setIsDragging","handleFiles","fileList","all","limited","accepted","rejected","file","openDialog","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","EmptyState","ErrorState","onRetry","retryLabel","AlertIcon","formatSize","bytes","matchesAccept","tokens","t","type","token","FileUpload","subtitle","dragging","setDragging","addFiles","incoming","UploadIcon","resolveGap","gap","fallback","resolveColumns","columns","Form","layout","FormSection","bodyStyle","FormRow","FormActions","Container","isResponsiveObject","pickResponsive","device","deviceFromBreakpoint","isTablet","Stack","direction","justify","wrap","finalDirection","justifyClass","Grid","templateColumns","finalGap","detectStandalone","matchesDisplayMode","iosStandalone","useBeforeInstallPrompt","deferred","setDeferred","installed","setInstalled","isStandalone","setIsStandalone","installedHandler","displayModeQuery","displayModeHandler","prompt","result","readDismissed","storageKey","InstallBanner","installLabel","dismissLabel","onResult","installable","dismissed","setDismissed","dismiss","X","InstallButton","Kbd","ModalsContext","createContext","ModalsProvider","stack","setStack","counter","nextId","closeAll","confirm","api","ContentModal","ConfirmModal","setLoading","handleConfirm","handleCancel","useModals","useContext","Navbar","logo","nav","TRICKLE_INTERVAL_MS","TRICKLE_CEILING","DONE_HIDE_DELAY_MS","clamp","n","createNProgress","state","listeners","trickleTimer","hideTimer","emit","listener","update","stopTrickle","clearHide","inc","amount","step","nprogress","NProgressBar","color","height","setState","Page","eyebrow","toolbar","padded","buildRange","page","totalPages","siblings","totalSlots","_","start","end","range","Pagination","onPageChange","pageSize","onPageSizeChange","pageSizeOptions","totalItems","siblingCount","pages","opt","DEFAULT_STRENGTH_LABELS","estimatePasswordStrength","score","PasswordInput","showStrength","strength","strengthLabels","toggleLabels","inputProps","revealed","setRevealed","stringValue","computedStrength","on","NUMERIC","ALNUM","PinInput","length","onComplete","masked","autoFocus","internalId","wrapperId","internal","setInternal","cells","inputsRef","pattern","trimmed","focusCell","safe","onCellChange","char","onCellKeyDown","onPaste","text","c","cell","Popover","onOpenChange","defaultOpen","closeOnOutsideClick","Progress","max","showLabel","pct","RadioGroupContext","Radio","checked","group","resolvedName","resolvedDisabled","isChecked","handleChange","RadioGroup","horizontal","generatedName","RangeSlider","min","formatValue","low","high","fillLeft","fillRight","valueText","handleLow","handleHigh","RatingStars","readonly","hover","setHover","displayed","handleClick","starIndex","filled","StarIcon","shouldRender","only","helpers","Show","Hide","ALL_EDGES","SafeArea","edges","inline","SearchBar","onClear","handleClear","SearchIcon","ClearIcon","SegmentedControl","ariaLabel","selected","Sidebar","header","collapsed","collapsedWidth","finalWidth","Skeleton","Spacer","Spinner","caption","overlay","inferTrend","delta","Stat","trend","hint","resolvedTrend","Stepper","steps","completed","swap","formatBytes","decimals","units","base","exponent","digits","formatCompactNumber","locale","StepperInput","format","labels","decrement","increment","display","canDecrement","canIncrement","Switch","Tag","onRemove","removeLabel","priorityClass","priority","Table","data","rowKey","onRowClick","stackOnMobile","column","row","content","Tabs","defaultId","activeId","firstEnabled","activate","isActive","Textarea","required","generatedId","textareaId","Timeline","connector","Tooltip","openDelay","tooltipId","timer","show","hide","cloneElement","ToastContext","useToast","ctx","ToastProvider","defaultDuration","position","toasts","setToasts","toast","ToastContainer","positionClass","ToastItem","VirtualList","itemHeight","renderItem","overscan","getKey","containerRef","scrollTop","setScrollTop","viewport","setViewport","element","observer","totalHeight","visibleCount","offset","CopyButton","timeout","onCopied","copied","setCopied","timerRef","PT_BR","EN","LOCALES","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","relativeTime","input","now","strings","target","diff","past","abs","RelativeTime","date","iso","Money","cents","currency","formatted","TruncateText","lines","mergedStyle","VisuallyHidden","as","createElement","Portal","container","mounted","setMounted","ClickOutside","onOutside","handlerRef","handle","ConditionalWrapper","condition","wrapper","For","each","ErrorText","Image","lazy","onError","currentSrc","setCurrentSrc","usedFallback","setUsedFallback","DataList","keyExtractor","empty","DescriptionList","Toggle","pressed","defaultPressed","onPressedChange","internalPressed","setInternalPressed","isPressed","ToggleGroupContext","useToggleGroupContext","normalizeArray","ToggleGroup","onValueChange","internalValue","setInternalValue","itemValue","isOn","v","ToggleGroupItem","isSelected","Label","Collapsible","contentId","handleToggle","isSeparator","ContextMenu","setPosition","menuRef","handleContextMenu","HoverCard","closeDelay","rest","clearTimer","scheduleOpen","scheduleClose","FOCUSABLE_SELECTOR","useFocusTrap","previouslyFocused","getFocusable","handleKeydown","elements","first","last","matchesQuery","keyword","groupItems","groups","indexByName","existing","Command","dialogRef","listId","normalized","visible","selectItem","renderIndex","ScrollArea","maxHeight","KEY_STEP","Resizable","defaultSize","setSize","paneA","paneB","isHorizontal","updateFromPointer","clientX","clientY","rect","total","percent","handlePointerDown","handleMove","moveEvent","handleUp","WEEKDAY_LABELS","MONTH_LABELS","DAYS_IN_GRID","makeDate","year","month","day","startOfDay","isSameDay","a","b","isOutOfRange","minDate","maxDate","buildGrid","weekStartsOn","monthIndex","Calendar","onMonthChange","isSelectionControlled","internalSelected","setInternalSelected","isMonthControlled","internalMonth","setInternalMonth","visibleMonth","focusedDay","setFocusedDay","gridRef","today","weekdayLabels","changeMonth","selectDate","clamped","grid","inMonth","isToday","isFocusTarget","Slider","MultiSelect","maxItems","selectedSet","selectedOptions","atMax","removeAt","optionValue","addMonths","isBetween","lo","hi","DateRangePicker","numberOfMonths","defaultMonth","setVisibleMonth","hovered","setHovered","previewEnd","dayState","isStart","isEnd","inRange","monthOffset","NavigationMenu","clickedIndex","setClickedIndex","baseId","openIndex","renderLeaf","child","childIndex","Menubar","menus","setOpenIndex","triggerRefs","menu","itemIndex","Carousel","loop","showArrows","showDots","defaultIndex","onIndexChange","count","internalIndex","setInternalIndex","goTo","atStart","atEnd","slide","slideIndex","dotIndex","usePagination","initialPage","initialSize","setPage","reset","useClientFilter","search","keysOrPredicate","term","useMediaQuery","matches","setMatches","list","useEventListener","eventName","resolvedTarget","defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","deserialize","read","setStored","setValue","resolved","onStorage","useToggle","initial","setTrue","setFalse","set","useAsync","asyncFn","deps","immediate","fnRef","callIdRef","mountedRef","run","callId","useOnline","online","setOnline","handleOnline","handleOffline","useDocumentVisibility","useIntersectionObserver","setEntry","once","root","rootMargin","threshold","nextEntry","useResizeObserver","entries","box","useClipboard","resetAfter","copy","textarea","shortcut","ctrl","meta","shift","isEditable","tag","useKeyboardShortcut","ignoreInput","DEFAULT_EVENTS","useIdle","idle","setIdle","useGeolocation","watch","positionOptions","onSuccess","watchId","useScrollLock","body","useStableCallback","callback","args","deepEqual","aKeys","bKeys","useDeepMemo","usePrevious","useInterval","fn","delay","useTimeout","useThrottle","throttled","setThrottled","lastEmitRef","pendingRef","elapsed","useWindowSize","useHover","onEnter","onLeave","useLongPress","moveThreshold","startX","startY","cancel","onMove","dx","dy","useDisclosure","opened","setOpened","handlers","useListState","setList","append","prepend","insert","indices","drop","reorder","from","to","moved","setItem","apply","clear","useCounter","setCount","useDocumentTitle","useFavicon","href","link","useMap","map","setMap","get","has","useSet","setSet","add","useQueue","initialValues","limit","cleanQueue","useClickOutside","useIsFirstRender","isFirst","useObjectUrl","blob","url","setUrl","compareValues","DataTable","searchable","searchKeys","initialSort","_row","setSearch","sort","setSort","effectiveSearchKeys","sample","sorted","factor","safePage","pageRows","toggleSort","tableColumns","indicator","ListTile","trailing","rootClassName","FloatingActionButton","extended","NavigationRail","labelVisibility","pad2","parseValue","match","hour24","minute","to12Hour","mod","to24Hour","hour12","period","TimePicker","minuteStep","use12Hours","hourCells","minuteCells","selectedHourDisplay","nextHour24","nextMinute","handleHour","displayHour","handleMinute","baseHour24","handlePeriod","nextPeriod","applyResistance","distance","cap","RefreshIndicator","onRefresh","startYRef","pull","setPull","refreshing","setRefreshing","engaged","handleTouchStart","touch","handleTouchMove","handleTouchEnd","showIndicator","progress","formatCurrency","formatDate","formatDateTime","formatPhone","formatCPF","formatPercent","storage","slugify","truncate","suffix","cut","capitalize","camelCase","words","word","lower","kebabCase","pluralize","singular","plural","groupBy","k","uniqueBy","seen","chunk","isPlainRecord","proto","pick","obj","keys","omit","exclude","deepMerge","source","sourceValue","targetValue","isEmpty","isDefined","isString","isNumber","isPlainObject","assertNever","message","debounce","wait","debounced","throttle","lastArgs","lastInvoke","invoke","remaining","pending","called","memoizeOne","hasCache","lastResult","sameArgs","sleep","ms","resolve","withTimeout","promise","reject","reason","randomId","prefix","time","rand","TempestApiError","init","isApiError","buildApiError","headers","sentRequestId","detail","code","details","requestId","parseRetryAfter","when","buildUrl","baseURL","path","params","isFormData","parseError","response","createApiClient","config","fetcher","authHeaders","rawRequest","isForm","finalHeaders","request","upload","formData","method","parseResponse","schema","context","issues","parseErrorBody","uploadWithProgress","getToken","withCredentials","onProgress","signal","parser","xhr","handleAbort","isSuccess","contentType","errorBody","err","retry","factory","retries","initialDelay","maxDelay","respectRetryAfter","shouldRetry","attempt","lastError","retryAfter","generateIdempotencyKey","r","usePoll","interval","stopWhen","setData","setError","stopped","inFlight","tick","createAuthStore","storageImpl","create","persist","user","createJSONStorage","AuthGuard","isAuthenticated","base64UrlDecode","padding","decodeJWT","headerSeg","payloadSeg","signature","isJWTExpired","leewaySeconds","payload","nowSeconds","lazyWithRetry","reloadOnFinalFailure","load","createRefreshQueue","refresh","defaultParseTokens","d","createTempestAuth","loginPath","refreshPath","mePath","storeName","parseTokens","parseUser","refreshBody","rt","useAuthStore","refreshKey","readRefreshToken","writeRefreshToken","s","bareApi","fetchUser","login","credentials","refreshToken","embedded","logout","AccessControlContext","AccessControlProvider","control","useAccessControl","useCan","paramsKey","cancelled","Can","resource","allowed","isLoading","resolvePermissions","roles","perm","createRoleAccessControl","granted","toPermissionList","permissionsFromToken","claim","primary","scopes","GoogleSignIn","Component","theme","disableOneTap","useOAuthCallback","exchange","setStatus","ranRef","STALE_TIME","CACHE_TIME","REFETCH_TIME","createQueryKeys","scope","output","QueryProvider","client","defaultOptions","internalClient","QueryClient","QueryClientProvider","isOffsetPage","isCursorPage","emptyOffsetPage","usePaginatedQuery","queryKey","queryFn","sizeParam","orderBy","ascending","queryOptions","pageNumber","setPageNumber","useQuery","keepPreviousData","pageCount","hasNext","hasPrev","p","useCursorQuery","useInfiniteQuery","pageParam","defaultBuildPath","createDataProvider","sortFieldParam","sortOrderParam","sortOrderAsBoolean","updateMethod","buildPath","provider","pagination","filters","order","requestOptions","ids","DataProviderContext","TempestDataProvider","useDataProvider","listQueryKey","oneQueryKey","useList","useOne","enabled","useCreate","queryClient","useQueryClient","useMutation","useUpdate","variables","useDelete","RouteGuard","redirectTo","replace","Navigate","defineRoutes","routes","lazyCache","resolveLazy","route","comp","GuardedElement","guard","toRouteElements","LazyComponent","Route","ROUTERS","BrowserRouter","HashRouter","MemoryRouter","AppRouter","router","basename","initialEntries","tree","Router","Suspense","Routes","createStore","initializer","partialize","version","migrate","createSelectors","store","bound","ThemeContext","applyResolved","attribute","themeColor","attrs","attr","readStored","ThemeProvider","defaultTheme","setThemeState","resolvedTheme","setResolvedTheme","targetRef","attributeKey","themeColorRef","setTheme","useTheme","interpolate","template","_match","lookup","catalog","direct","fallbackValue","createI18n","fallbackLocale","messages","formatNumber","opts","nextLocale","I18nContext","available","I18nProvider","initialLocale","availableLocales","setLocaleState","setLocale","useI18n","useTranslate","keysChanged","ErrorBoundary","info","previousProps","AppProviders","i18n","errorBoundary","defaultParser","createEventStream","namedEvents","heartbeatEvents","maxRetries","initialBackoff","maxBackoff","onOpen","onMessage","onStatusChange","retryTimer","closed","scheduleReconnect","connect","es","reconnect","useEventStream","lastMessage","setLastMessage","reconnectRef","onMessageRef","controller","urlBase64ToUint8Array","base64String","base64","rawData","buffer","isPushSupported","WebPushUnsupportedError","WebPushPermissionDeniedError","WebPushClient","registration","subscription","usePushSubscription","configRef","sub","supported","permission","setPermission","subscribed","setSubscribed","subscribe","unsubscribe","createAudioPlayer","play","volume","autoplay","stopPrevious","onEnded","audio","stop","defaultPlayer","getDefaultPlayer","playAudio","stopAudio","useAudio","playerRef","unlocked","setUnlocked","GenericDb","Dexie","tableName","indexes","createOfflineStore","databaseName","keyPath","ownerField","db","table","withOwner","owner","reverse","collection","changes","spec","useErrorHandler","FormField","useFormContext","resolvedControl","Controller","field","fieldState","isValidElement","errorMessage","validateForm","values","errors","issue","zodResolver","_context","criteriaMode","useZodForm","useForm","digitsOnly","validateCPF","numbers","sum","check","validateCNPJ","weights1","weights2","formatCEP","formatCNPJ","unmask","maskedInput","mask","inputMode","CPFInput","CNPJInput","PhoneInput","CEPInput","formatCents","parseCents","MoneyInput","useViaCEP","cep","json","createWebSocket","protocols","pingInterval","pingPayload","socket","pingTimer","clearPing","startPing","ws","send","useWebSocket","controllerRef","DEFAULT_CIRCUITY_FACTOR","DEFAULT_CAR_SPEED_KMH","DEFAULT_MODE_DURATION_FACTORS","durationFactor","factors","estimateTravel","origin","destination","circuityFactor","carSpeedKmh","modeDurationFactors","distanceKm","haversineKm","durationMinutes","boundingBox","points","minLatitude","maxLatitude","minLongitude","maxLongitude","point","boundsCenter","bounds","expandBounds","latSpan","lonSpan","latPad","lonPad","createOSRMBackend","baseUrl","fetch","trimmedBaseUrl","routeOptions","coords","cause","createPositionTracker","minDistanceKm","maxPoints","onUpdate","lastKept","handlePosition","handleError","usePositionTracker","autoStart","trackerOptions","setPoints","setDistanceKm","trackerRef","onErrorRef","tracker","LeafletTrajectory","m","NICE_KM_STEPS","pickScaleKm","kmPerPixel","maxPixels","maxKm","chosen","formatScale","km","TrajectoryMap","showGrid","showScale","strokeColor","tileUrl","tileAttribution","markers","onMarkerClick","measured","allPoints","svg","projection","fitProjection","pixels","polyline","startPixel","endPixel","currentPixel","centerCoord","center","eastRef","edgeKm","edgePixels","markerPixels","scale","f","marker","getInitialTheme","stored","themeInitScript","LEVELS","shouldLog","level","consoleSink","createLogger","sinks","namespace","sink","childNamespace","TelemetryContext","TelemetryProvider","adapter","useTelemetry","consoleTelemetryAdapter","userToSentry","email","traits","createSentryTelemetryAdapter","sentry","initOptions","flushTimeout","breadcrumbCategory","userToProperties","createPostHogTelemetryAdapter","posthog","FeatureFlagsContext","FeatureFlagsProvider","useAdapter","useFeatureFlag","useSyncExternalStore","useFlagValue","createInMemoryFlags","flags","notify","createGrowthBookFeatureFlagsAdapter","growthbook","rendererInstalled","ensureRenderer","createLaunchDarklyFeatureFlagsAdapter","share","isShareSupported"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,SAASA,GAAU;AAAA,EACtB,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,cAAAC,IAAe,CAAA;AAAA,EACf,UAAAC;AAAA,EACA,WAAAC;AACJ,GAAmB;AACf,QAAMC,IAAUC,EAAA,GACVC,IAAeN,MAAU,QACzB,CAACO,GAAcC,CAAe,IAAIC,EAAmBR,CAAY,GACjES,IAAUJ,IAAeN,IAAQO,GAEjCI,IAASC;AAAA,IACX,CAACC,MAAqB;AAClB,YAAMC,IAASJ,EAAQ,SAASG,CAAE,GAC5BE,IAAOhB,IACPe,IACIJ,EAAQ,OAAO,CAACM,MAAMA,MAAMH,CAAE,IAC9B,CAAC,GAAGH,GAASG,CAAE,IACnBC,IACE,CAAA,IACA,CAACD,CAAE;AACX,MAAKP,KAAcE,EAAgBO,CAAI,GACvCb,IAAWa,CAAI;AAAA,IACnB;AAAA,IACA,CAACL,GAASX,GAAUO,GAAcJ,CAAQ;AAAA,EAAA;AAG9C,SACI,gBAAAe,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,WAAWhB,CAAS,GACzC,UAAAL,EAAM,IAAI,CAACsB,MAAS;AACjB,UAAMC,IAAOX,EAAQ,SAASU,EAAK,EAAE,GAC/BE,IAAU,GAAGlB,CAAO,IAAIgB,EAAK,EAAE,UAC/BG,IAAY,GAAGnB,CAAO,IAAIgB,EAAK,EAAE;AACvC,WACI,gBAAAI,EAAC,SAAkB,WAAWN,EAAGC,GAAO,MAAME,KAAQF,GAAO,IAAI,GAC7D,UAAA;AAAA,MAAA,gBAAAF,EAAC,MAAA,EAAG,WAAWE,GAAO,QAClB,UAAA,gBAAAK;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,IAAID;AAAA,UACJ,WAAWJ,GAAO;AAAA,UAClB,iBAAeE;AAAA,UACf,iBAAeC;AAAA,UACf,UAAUF,EAAK;AAAA,UACf,SAAS,MAAMT,EAAOS,EAAK,EAAE;AAAA,UAE7B,UAAA;AAAA,YAAA,gBAAAH,EAAC,QAAA,EAAM,YAAK,MAAA,CAAM;AAAA,YAClB,gBAAAA,EAACQ,IAAA,EAAY,WAAWN,GAAO,QAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAEhD;AAAA,MACCE,KACG,gBAAAJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAIK;AAAA,UACJ,MAAK;AAAA,UACL,mBAAiBC;AAAA,UACjB,WAAWJ,GAAO;AAAA,UAEjB,UAAAC,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACV,EAAA,GAvBEA,EAAK,EAyBf;AAAA,EAER,CAAC,EAAA,CACL;AAER;AAEA,SAASK,GAAY,EAAE,WAAAtB,KAAqC;AACxD,SACI,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAAd;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAW;AAAA,MAEX,UAAA,gBAAAc;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACnB;AAAA,EAAA;AAGZ;;;;;;;;;;;;;;;;AC5FO,SAASS,GAAM;AAAA,EAClB,SAAAC,IAAU;AAAA,EACV,YAAAC,IAAa;AAAA,EACb,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,WAAA9B;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAe;AACX,SACI,gBAAAX;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOQ,CAAO;AAAA,QACdC,MAAe,WAAWT,GAAO;AAAA,QACjCS,MAAe,aAAaT,GAAO;AAAA,QACnChB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEH,UAAA;AAAA,QAAAJ,KAAQ,gBAAAd,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,QAC7C,gBAAAP,EAAC,OAAA,EAAI,WAAWL,GAAO,SAClB,UAAA;AAAA,UAAAU,KAAS,gBAAAZ,EAAC,KAAA,EAAE,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,UAC5CC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAW,GAAY;AAAA,UAC9DI;AAAA,QAAA,GACL;AAAA,QACCF,KACG,gBAAAf;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,SAASa;AAAA,YACT,cAAYC;AAAA,YAEZ,4BAACG,IAAA,CAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACf;AAAA,IAAA;AAAA,EAAA;AAIhB;AAEA,SAASA,KAAY;AACjB,SACI,gBAAAnB,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,IACnE,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAEtB;AAER;;;;;;;;;;;;;;;;ACjBO,SAASoB,GAAO;AAAA,EACnB,OAAAR;AAAA,EACA,SAAAS;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAA9C;AAAA,EACA,GAAGgC;AACP,GAAgB;AACZ,QAAMe,IAAaV,MAAW,MAAM,OAAO,QAAQ,KAAA,IAE7CW,IAAiBb,KACnB,gBAAAd,EAAA4B,GAAA,EACK,UAAA;AAAA,IAAAb,KACG,gBAAAtB;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,SAAS+B;AAAA,QACT,cAAYT;AAAA,QAEX,eAAY,gBAAAxB,EAACoC,IAAA,EAAU,MAAM,IAAI,eAAY,OAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAG5DV,KAAS,gBAAA1B,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAwB,EAAA,CAAM;AAAA,EAAA,GACpD;AAGJ,SACI,gBAAAnB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAO4B,CAAI;AAAA,QACXF,KAAY1B,GAAO;AAAA,QACnB2B,KAAU3B,GAAO;AAAA,QACjB6B,KAAY7B,GAAO;AAAA,QACnB8B,KAAY9B,GAAO;AAAA,QACnBhB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAlB,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAgC,GAAe;AAAA,QAC/CtB,KAAS,QAAQA,MAAU,MACxB,gBAAAZ,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAO,aAAU,UAClC,UAAAU,EAAA,CACL;AAAA,QAEJ,gBAAAZ,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAyB,EAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGrD;AC/GO,MAAMU,KAA0C;AAAA,EACnD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACX,GAEMC,KAA+B,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAEzE,SAASC,GAAeC,GAA2B;AAC/C,MAAIC,IAAsB;AAC1B,aAAWC,KAAOJ;AACd,IAAIE,KAASH,GAAYK,CAAG,MACxBD,IAAUC;AAGlB,SAAOD;AACX;AAwBO,SAASE,KAAmC;AAC/C,QAAM,CAACH,GAAOI,CAAQ,IAAIpD;AAAA,IAAiB,MACvC,OAAO,SAAW,MAAc,IAAI,OAAO;AAAA,EAAA;AAG/C,EAAAqD,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMC,IAAW,MAAYF,EAAS,OAAO,UAAU;AACvD,WAAAE,EAAA,GACA,OAAO,iBAAiB,UAAUA,GAAU,EAAE,SAAS,IAAM,GACtD,MAAM,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,EAC9D,GAAG,CAAA,CAAE;AAEL,QAAML,IAAUF,GAAeC,CAAK,GAC9BO,IAAQ,CAACC,MAA4BR,KAASH,GAAYW,CAAE,GAC5DC,IAAQ,CAACD,MAA4BR,IAAQH,GAAYW,CAAE;AAEjE,SAAO;AAAA,IACH,SAAAP;AAAA,IACA,OAAAD;AAAA,IACA,OAAAO;AAAA,IACA,OAAAE;AAAA,IACA,UAAUA,EAAM,IAAI;AAAA,IACpB,UAAUF,EAAM,IAAI,KAAKE,EAAM,IAAI;AAAA,IACnC,WAAWF,EAAM,IAAI;AAAA,EAAA;AAE7B;;;;;;;;;;ACzCO,SAASG,GAAS;AAAA,EACrB,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,WAAArE;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAkB;AAEd,QAAMsC,IADKb,GAAA,EACY,MAAMY,CAAiB;AAC9C,SACI,gBAAAhD,EAAC,SAAI,WAAWN,EAAGC,GAAO,OAAOhB,CAAS,GAAI,GAAGgC,GAC5C,UAAA;AAAA,IAAAiC,KAAU,gBAAAnD,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAAiD,GAAO;AAAA,IAClD,gBAAA5C,EAAC,OAAA,EAAI,WAAWL,GAAO,KAClB,UAAA;AAAA,MAAAkD,KAAWI,KAAe,gBAAAxD,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAkD,GAAQ;AAAA,MACpE,gBAAApD,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAe,EAAA,CAAS;AAAA,IAAA,GAC5C;AAAA,IACCqC,KAAU,gBAAAtD,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAAoD,GAAO;AAAA,IACjDD,KAAa,CAACG,KAAe,gBAAAxD,EAAC,SAAI,WAAWE,GAAO,WAAY,UAAAmD,EAAA,CAAU;AAAA,EAAA,GAC/E;AAER;;;;ACrCO,SAASI,GAAY;AAAA,EACxB,OAAAC,IAAQ,KAAK;AAAA,EACb,WAAAxE;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAqB;AACjB,QAAM0C,IAA4B,EAAE,aAAa,OAAOF,CAAK,GAAG,GAAGC,EAAA;AACnE,SACI,gBAAA3D,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,QAAQhB,CAAS,GAAG,OAAO0E,GAAa,GAAG1C,GAChE,UAAAD,EAAA,CACL;AAER;;;;;;;;;;;;;;;ACnBA,SAAS4C,GAAYC,GAAsB;AACvC,QAAMC,IAAQD,EAAK,KAAA,EAAO,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,SAAIC,EAAM,WAAW,IAAU,MAC3BA,EAAM,WAAW,IAAUA,EAAM,CAAC,EAAG,MAAM,GAAG,CAAC,IAC5C,GAAGA,EAAM,CAAC,EAAG,OAAO,CAAC,CAAC,GAAGA,EAAMA,EAAM,SAAS,CAAC,EAAG,OAAO,CAAC,CAAC;AACtE;AAMO,SAASC,GAAO;AAAA,EACnB,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,MAAAJ,IAAO;AAAA,EACP,MAAAK,IAAO;AAAA,EACP,QAAAC;AAAA,EACA,WAAAlF;AAAA,EACA,SAAAmF;AACJ,GAAgB;AACZ,QAAM,CAACC,GAASC,CAAU,IAAI/E,EAAkB,EAAK,GAC/CgF,IAAWC,EAAQ,MAAMZ,GAAYC,CAAI,GAAG,CAACA,CAAI,CAAC,GAElDY,IAAYT,KAAO,CAACK,GACpBK,IAAON,IAAU,WAAW,QAC5BO,IAAWP,IAAU,IAAI;AAE/B,SACI,gBAAA9D;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN,EAAGC,GAAO,QAAQA,GAAOiE,CAAI,GAAGC,KAAUlE,GAAO,QAAQhB,CAAS;AAAA,MAC7E,MAAAyF;AAAA,MACA,UAAAC;AAAA,MACA,SAAAP;AAAA,MACA,WACIA,IACM,CAACQ,MAAU;AACP,SAAIA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACvCA,EAAM,eAAA,GACNR,EAAA;AAAA,MAER,IACA;AAAA,MAGT,UAAA;AAAA,QAAAK,IACG,gBAAA1E;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAAiE;AAAA,YACA,KAAKC,KAAOJ;AAAA,YACZ,WAAW5D,GAAO;AAAA,YAClB,SAAS,MAAMqE,EAAW,EAAI;AAAA,UAAA;AAAA,QAAA,IAGlC,gBAAAvE,EAAC,QAAA,EAAK,cAAYkE,KAAOJ,GAAO,UAAAU,GAAS;AAAA,QAE5CJ,KAAU,gBAAApE,EAAC,QAAA,EAAK,WAAWC,EAAGC,GAAO,KAAKA,GAAOkE,CAAM,CAAC,GAAG,eAAW,GAAA,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGpF;;;;;;;;;;;;;;;;;AC/CO,SAASU,GAAM;AAAA,EAClB,SAAApE,IAAU;AAAA,EACV,YAAAC,IAAa;AAAA,EACb,MAAAwD,IAAO;AAAA,EACP,OAAAY,IAAQ;AAAA,EACR,KAAAC,IAAM;AAAA,EACN,WAAA9F;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAe;AACX,SACI,gBAAAX;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOQ,CAAO;AAAA,QACdC,MAAe,WAAWT,GAAO;AAAA,QACjCS,MAAe,aAAaT,GAAO;AAAA,QACnCA,GAAOiE,CAAI;AAAA,QACXY,MAAU,YAAY7E,GAAO;AAAA,QAC7BhB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEH,UAAA;AAAA,QAAA8D,uBAAQ,QAAA,EAAK,WAAW9E,GAAO,KAAK,eAAW,IAAC;AAAA,QAChDe;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;;ACrBO,SAASgE,GAAO;AAAA,EACnB,SAAAvE,IAAU;AAAA,EACV,MAAAI;AAAA,EACA,OAAAF;AAAA,EACA,QAAAsE;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC;AAAA,EACA,WAAAlG;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAgB;AACZ,QAAM,CAACd,GAAMiF,CAAO,IAAI7F,EAAS,EAAI;AACrC,SAAKY,IAED,gBAAAG,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,QAAQA,GAAOQ,CAAO,GAAGxB,CAAS,GAAG,MAAK,UAAU,GAAGgC,GAC5E,UAAA;AAAA,IAAAJ,KAAQ,gBAAAd,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,IAC7C,gBAAAP,EAAC,OAAA,EAAI,WAAWL,GAAO,MAClB,UAAA;AAAA,MAAAU,KAAS,gBAAAZ,EAAC,KAAA,EAAE,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,MAC5CK,KAAY,gBAAAjB,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAe,EAAA,CAAS;AAAA,IAAA,GAC7D;AAAA,IACCiE,KAAU,gBAAAlF,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAAgF,GAAO;AAAA,IACjDC,KACG,gBAAAnF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,cAAW;AAAA,QACX,SAAS,MAAM;AACX,UAAAmF,EAAQ,EAAK,GACbD,IAAA;AAAA,QACJ;AAAA,QACH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAER,IAtBc;AAwBtB;;;;;;;;;;ACzBO,SAASE,GAAiB;AAAA,EAC7B,OAAAzG;AAAA,EACA,OAAAE;AAAA,EACA,UAAAE;AAAA,EACA,YAAAsG,IAAa;AAAA,EACb,WAAArG;AAAA,EACA,GAAGgC;AACP,GAA0B;AACtB,SACI,gBAAAlB,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,KAAKhB,CAAS,GAAG,cAAW,uBAAuB,GAAGgC,GAC3E,UAAArC,EAAM,IAAI,CAACsB,MAAS;AACjB,UAAMqF,IAASrF,EAAK,QAAQpB;AAC5B,WACI,gBAAAwB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,MAAK;AAAA,QACL,WAAWN,EAAGC,GAAO,MAAMsF,KAAUtF,GAAO,MAAM;AAAA,QAClD,gBAAcsF,IAAS,SAAS;AAAA,QAChC,UAAUrF,EAAK;AAAA,QACf,SAAS,MAAMlB,EAASkB,EAAK,GAAG;AAAA,QAEhC,UAAA;AAAA,UAAA,gBAAAI,EAAC,QAAA,EAAK,WAAWL,GAAO,UACnB,UAAA;AAAA,YAAAC,EAAK,QAAQ,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,YAAK,KAAA,CAAK;AAAA,YACtDC,EAAK,UAAU,UACZ,gBAAAH,EAAC,UAAK,WAAWE,GAAO,OAAQ,UAAAC,EAAK,MAAA,CAAM;AAAA,UAAA,GAEnD;AAAA,UACCoF,KAAc,gBAAAvF,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,YAAK,MAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAbrDC,EAAK;AAAA,IAAA;AAAA,EAgBtB,CAAC,EAAA,CACL;AAER;;;;;;;;;;AC9CO,SAASsF,GAAY;AAAA,EACxB,MAAArF;AAAA,EACA,SAAAW;AAAA,EACA,OAAAH;AAAA,EACA,YAAA8E,IAAa;AAAA,EACb,mBAAAC,IAAoB;AAAA,EACpB,cAAAC,IAAe;AAAA,EACf,WAAA1G;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAqB;AAmBjB,SAlBA2B,EAAU,MAAM;AACZ,QAAI,CAACzC,KAAQ,CAACwF,EAAc;AAC5B,UAAMC,IAAU,CAACC,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAU/E,EAAA;AAAA,IAC5B;AACA,kBAAO,iBAAiB,WAAW8E,CAAO,GACnC,MAAM,OAAO,oBAAoB,WAAWA,CAAO;AAAA,EAC9D,GAAG,CAACzF,GAAMwF,GAAc7E,CAAO,CAAC,GAEhC8B,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAM2F,IAAW,SAAS,KAAK,MAAM;AACrC,oBAAS,KAAK,MAAM,WAAW,UACxB,MAAM;AACT,eAAS,KAAK,MAAM,WAAWA;AAAA,IACnC;AAAA,EACJ,GAAG,CAAC3F,CAAI,CAAC,GAEL,CAACA,KAAQ,OAAO,WAAa,MAAoB,OAE9C4F;AAAA,IACH,gBAAAzF,EAAC,SAAI,WAAWL,GAAO,MAAM,MAAK,UAAS,cAAW,QAClD,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWE,GAAO;AAAA,UAClB,SAAS,MAAMyF,KAAqB5E,EAAA;AAAA,UACpC,eAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhB,gBAAAR,EAAC,SAAI,WAAWN,EAAGC,GAAO,OAAOhB,CAAS,GAAI,GAAGgC,GAC5C,UAAA;AAAA,QAAAwE,KACG,gBAAA1F;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,cAAW;AAAA,YACX,SAASa;AAAA,YAET,UAAA,gBAAAf,EAAC,QAAA,EAAK,WAAWE,GAAO,UAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAG1CU,KAAS,gBAAAZ,EAAC,OAAA,EAAI,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,QAC/C,gBAAAZ,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAe,EAAA,CAAS;AAAA,MAAA,EAAA,CAC3C;AAAA,IAAA,GACJ;AAAA,IACA,SAAS;AAAA,EAAA;AAEjB;;;;;;;;AChEO,SAASgF,GAAY,EAAE,OAAApH,GAAO,WAAAqH,IAAY,KAAK,WAAAhH,KAA+B;AACjF,SACI,gBAAAc,EAAC,OAAA,EAAI,cAAW,cAAa,WAAWC,EAAGC,GAAO,KAAKhB,CAAS,GAC3D,UAAAL,EAAM,IAAI,CAACsB,GAAMgG,MAAU;AACxB,UAAMC,IAASD,MAAUtH,EAAM,SAAS,GAClCwH,IAAc,CAACD,MAAWjG,EAAK,QAAQA,EAAK;AAClD,6BACKgC,IAAA,EACG,UAAA;AAAA,MAAA,gBAAAnC,EAAC,QAAA,EAAK,WAAWE,GAAO,MACnB,UAAAmG,IACG,gBAAArG;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAMG,EAAK;AAAA,UACX,SAAS,CAAC0E,MAAU;AAChB,YAAI1E,EAAK,YACL0E,EAAM,eAAA,GACN1E,EAAK,QAAA;AAAA,UAEb;AAAA,UACA,WAAWD,GAAO;AAAA,UAEjB,UAAAC,EAAK;AAAA,QAAA;AAAA,MAAA,IAGV,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,gBAAcoG,IAAS,SAAS;AAAA,UAChC,WAAWA,IAASlG,GAAO,UAAU;AAAA,UAEpC,UAAAC,EAAK;AAAA,QAAA;AAAA,MAAA,GAGlB;AAAA,MACC,CAACiG,KACE,gBAAApG,EAAC,QAAA,EAAK,WAAWE,GAAO,WAAW,eAAW,IACzC,UAAAgG,EAAA,CACL;AAAA,IAAA,EAAA,GA3BOC,CA6Bf;AAAA,EAER,CAAC,EAAA,CACL;AAER;;;;;;;;;;;;;;;;;;;;;;;;;ACzBO,SAASG,GAAO;AAAA,EACnB,SAAA5F,IAAU;AAAA,EACV,MAAAyD,IAAO;AAAA,EACP,SAAAoC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAA3H;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAgB;AACZ,SACI,gBAAAX;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOQ,CAAO;AAAA,QACdR,GAAOiE,CAAI;AAAA,QACXsC,KAAYvG,GAAO;AAAA,QACnBwG,KAAQxG,GAAO;AAAA,QACfqG,KAAWrG,GAAO;AAAA,QAClBsG,KAAatG,GAAO;AAAA,QACpBhB;AAAA,MAAA;AAAA,MAEJ,UAAU2H,KAAYN;AAAA,MACrB,GAAGrF;AAAA,MAEH,UAAA;AAAA,QAAAqF,KACG,gBAAAvG,EAAC,UAAK,WAAWE,GAAO,SAAS,eAAW,IACxC,UAAA,gBAAAF,EAAC8G,IAAA,CAAA,CAAY,EAAA,CACjB;AAAA,QAEJ,gBAAAvG,EAAC,UAAK,WAAWN,EAAGC,GAAO,SAASqG,KAAWrG,GAAO,UAAU,GAC3D,UAAA;AAAA,UAAAyG;AAAA,UACA1F;AAAA,UACA2F;AAAA,QAAA,EAAA,CACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,SAASE,KAAc;AACnB,SACI,gBAAA9G;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MAEN,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAClB;AAAA,EAAA;AAGZ;;;;;;;;;;;;;;AC5EO,SAAS+G,GAAK;AAAA,EACjB,OAAAnG;AAAA,EACA,SAAAe;AAAA,EACA,QAAA2B;AAAA,EACA,OAAA0D,IAAQ;AAAA,EACR,aAAAX,IAAc;AAAA,EACd,WAAAY,IAAY;AAAA,EACZ,WAAA/H;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAc;AACV,QAAMgG,IAAY,CAAC,EAAEtG,KAASe;AAC9B,SACI,gBAAApB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN;AAAA,QACPC,GAAO;AAAA,QACP+G,MAAc,UAAU/G,GAAO;AAAA,QAC/B+G,MAAc,YAAY/G,GAAO;AAAA,QACjC+G,MAAc,cAAc/G,GAAO;AAAA,QACnCmG,KAAenG,GAAO;AAAA,QACtB,CAACgH,KAAa,CAACF,KAAS9G,GAAO;AAAA,QAC/B8G,KAAS9G,GAAO;AAAA,QAChBhB;AAAA,MAAA;AAAA,MAEJ,UAAUmH,IAAenF,EAAM,YAAY,IAAKA,EAAM;AAAA,MACrD,GAAGA;AAAA,MAEH,UAAA;AAAA,QAAAgG,KACG,gBAAA3G,EAAC,UAAA,EAAO,WAAWL,GAAO,QACrB,UAAA;AAAA,UAAA,OAAOU,KAAU,WAAW,gBAAAZ,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,aAAM,IAAQU;AAAA,UACxEe;AAAA,QAAA,GACL;AAAA,QAEHuF,IAAY,gBAAAlH,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAe,GAAS,IAASA;AAAA,QAC5DqC,KAAU,gBAAAtD,EAAC,UAAA,EAAO,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjE;;;;;;;ACjCO,SAAS6D,GAAO;AAAA,EACnB,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,WAAAb,IAAY;AAAA,EACZ,WAAAtH;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAgB;AACZ,QAAM0C,IAA4B;AAAA,IAC9B,GAAIyD,MAAc,SACZ,EAAE,WAAW,OAAOA,KAAc,WAAW,GAAGA,CAAS,OAAOA,EAAA,IAChE;AAAA,IACN,GAAIb,IAAY,EAAE,OAAO,WAAW;AAAA,IACpC,GAAG7C;AAAA,EAAA;AAEP,SACI,gBAAA3D,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,QAAQA,GAAOkH,CAAI,GAAGlI,CAAS,GAAG,OAAO0E,GAAa,GAAG1C,GAC9E,UAAAD,GACL;AAER;;;;;;;;;GC9BaqG,KAAWC,EAA4C,SAChE,EAAE,OAAAC,GAAO,aAAA3G,GAAa,eAAA4G,GAAe,UAAAZ,GAAU,kBAAAa,GAAkB,WAAAxI,GAAW,GAAGgC,EAAA,GAC/EyG,GACF;AACE,QAAMC,IAAWC,EAAgC,IAAI;AAErD,EAAAhF,EAAU,MAAM;AACZ,IAAI+E,EAAS,YAASA,EAAS,QAAQ,gBAAgB,EAAQH;AAAA,EACnE,GAAG,CAACA,CAAa,CAAC;AAElB,WAASK,EAAOC,GAAqC;AACjD,IAAAH,EAAS,UAAUG,GACf,OAAOJ,KAAQ,aAAYA,EAAII,CAAI,IAC9BJ,MAAMA,EAAwD,UAAUI;AAAA,EACrF;AAEA,SACI,gBAAAxH,EAAC,SAAA,EAAM,WAAWN,EAAGC,GAAO,SAAS2G,KAAY3G,GAAO,UAAUwH,CAAgB,GAC9E,UAAA;AAAA,IAAA,gBAAA1H;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAK8H;AAAA,QACL,MAAK;AAAA,QACL,UAAAjB;AAAA,QACA,WAAW5G,EAAGC,GAAO,OAAOhB,CAAS;AAAA,QACpC,GAAGgC;AAAA,MAAA;AAAA,IAAA;AAAA,IAER,gBAAAlB,EAAC,QAAA,EAAK,WAAWE,GAAO,KAAK,eAAW,IACnC,UAAAuH,IAAgB,gBAAAzH,EAACgI,IAAA,CAAA,CAAS,IAAK,gBAAAhI,EAACiI,MAAU,GAC/C;AAAA,KACET,KAAS3G,MACP,gBAAAN,EAAC,QAAA,EAAK,WAAWL,GAAO,WACnB,UAAA;AAAA,MAAAsH,KAAS,gBAAAxH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAsH,GAAM;AAAA,MAC/C3G,KAAe,gBAAAb,EAAC,QAAA,EAAK,WAAWE,GAAO,aAAc,UAAAW,EAAA,CAAY;AAAA,IAAA,EAAA,CACtE;AAAA,EAAA,GAER;AAER,CAAC;AAED,SAASoH,KAAY;AACjB,SACI,gBAAAjI,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEvB;AAER;AAEA,SAASgI,KAAW;AAChB,SACI,gBAAAhI,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,4BAAC,QAAA,EAAK,GAAE,YAAW,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,EAAA,CACnF;AAER;;;;;;;;;;;;ACpDO,SAASkI,GAAU;AAAA,EACtB,OAAAnJ;AAAA,EACA,UAAAE;AAAA,EACA,OAAAuI;AAAA,EACA,aAAAW,IAAc;AAAA,EACd,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC,IAAa,CAAC,SAAS,KAAK,KAAK;AAAA,EACjC,WAAAC,IAAY;AAAA,EACZ,WAAArJ;AACJ,GAAmB;AACf,QAAM,CAACsJ,GAAOC,CAAQ,IAAIjJ,EAAiB,EAAE,GACvCkJ,IAAWb,EAAyB,IAAI;AAE9C,WAASc,IAAe;AACpB,UAAM7I,IAAOyI,IAAYC,EAAM,KAAA,EAAO,YAAA,IAAgBA,EAAM,KAAA;AAC5D,QAAK1I,GACL;AAAA,UAAIf,EAAM,SAASe,CAAI,GAAG;AACtB,QAAA2I,EAAS,EAAE;AACX;AAAA,MACJ;AACA,MAAAxJ,EAAS,CAAC,GAAGF,GAAOe,CAAI,CAAC,GACzB2I,EAAS,EAAE;AAAA;AAAA,EACf;AAEA,WAASG,EAAc/D,GAA8C;AACjE,QAAIyD,EAAW,SAASzD,EAAM,GAAG,GAAG;AAChC,MAAAA,EAAM,eAAA,GACN8D,EAAA;AACA;AAAA,IACJ;AACA,IAAI9D,EAAM,QAAQ,eAAe,CAAC2D,KAASzJ,EAAM,SAAS,KACtDE,EAASF,EAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EAEnC;AAEA,WAAS8J,EAAO1C,GAAqB;AACjC,UAAMrG,IAAOf,EAAM,MAAA;AACnB,IAAAe,EAAK,OAAOqG,GAAO,CAAC,GACpBlH,EAASa,CAAI;AAAA,EACjB;AAEA,SACI,gBAAAS,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,SAASmI,KAASnI,GAAO,OAAOhB,CAAS,GAC9D,UAAA;AAAA,IAAAsI,KAAS,gBAAAxH,EAAC,SAAA,EAAM,WAAWE,GAAO,OAAQ,UAAAsH,GAAM;AAAA,IACjD,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,GAAO,OAAO,SAAS,MAAMwI,EAAS,SAAS,MAAA,GAC1D,UAAA;AAAA,MAAA3J,EAAM,IAAI,CAAC+J,GAAM3C,wBACb,QAAA,EAA8B,WAAWjG,GAAO,MAC5C,UAAA;AAAA,QAAA4I;AAAA,QACD,gBAAA9I;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,cAAY,WAAW4I,CAAI;AAAA,YAC3B,SAAS,MAAMD,EAAO1C,CAAK;AAAA,YAC9B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,GATO,GAAG2C,CAAI,IAAI3C,CAAK,EAU3B,CACH;AAAA,MACD,gBAAAnG;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,KAAK0I;AAAA,UACL,WAAWxI,GAAO;AAAA,UAClB,OAAOsI;AAAA,UACP,aAAazJ,EAAM,WAAW,IAAIoJ,IAAc;AAAA,UAChD,UAAU,CAACtD,MAAU4D,EAAS5D,EAAM,OAAO,KAAK;AAAA,UAChD,WAAW+D;AAAA,UACX,QAAQD;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,GACJ;AAAA,IACCN,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,GAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,GAAO,QAAS,aAAW,IAC5C;AAAA,EAAA,GACR;AAER;;;;;;;;;;;;;;;;ACzEA,SAAS6I,GAAcC,GAAwBC,GAAwB;AACnE,SAAKA,IACED,EAAO,MAAM,YAAA,EAAc,SAASC,EAAM,aAAa,IAD3C;AAEvB;AAQO,SAASC,GAAS;AAAA,EACrB,SAAAC;AAAA,EACA,OAAApK;AAAA,EACA,UAAAE;AAAA,EACA,OAAAuI;AAAA,EACA,aAAAW,IAAc;AAAA,EACd,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAxB;AAAA,EACA,QAAAuC,IAASL;AAAAA,EACT,cAAAM,IAAe;AAAA,EACf,WAAAnK;AACJ,GAAkB;AACd,QAAMU,IAAKR,EAAA,GACLkK,IAAUzB,EAAuB,IAAI,GACrCa,IAAWb,EAAyB,IAAI,GACxC,CAACzH,GAAMiF,CAAO,IAAI7F,EAAS,EAAK,GAChC,CAACyJ,GAAOM,CAAQ,IAAI/J,EAAS,EAAE,GAC/B,CAACgK,GAAaC,CAAc,IAAIjK,EAAS,CAAC,GAE1CkK,IAAgBjF;AAAA,IAClB,MAAM0E,EAAQ,KAAK,CAACQ,MAAMA,EAAE,UAAU5K,CAAK,GAAG,SAAS;AAAA,IACvD,CAACoK,GAASpK,CAAK;AAAA,EAAA,GAGb6K,IAAWnF;AAAA,IACb,MAAM0E,EAAQ,OAAO,CAACQ,MAAMP,EAAOO,GAAGV,CAAK,CAAC;AAAA,IAC5C,CAACE,GAASC,GAAQH,CAAK;AAAA,EAAA,GAGrBY,IAAgBlK,EAAY,MAAY;AAC1C,IAAA0F,EAAQ,EAAK,GACbkE,EAAS,EAAE,GACXE,EAAe,CAAC;AAAA,EACpB,GAAG,CAAA,CAAE,GAECK,IAAenK;AAAA,IACjB,CAACqJ,MAAiC;AAC9B,MAAIA,EAAO,aACX/J,EAAS+J,EAAO,KAAK,GACrBa,EAAA;AAAA,IACJ;AAAA,IACA,CAAC5K,GAAU4K,CAAa;AAAA,EAAA;AAG5B,EAAAhH,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAM2J,IAAS,CAAClF,MAA4B;AACxC,MAAIyE,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,KACjEgF,EAAA;AAAA,IAER;AACA,kBAAO,iBAAiB,aAAaE,CAAM,GACpC,MAAM,OAAO,oBAAoB,aAAaA,CAAM;AAAA,EAC/D,GAAG,CAAC3J,GAAMyJ,CAAa,CAAC;AAExB,QAAMjB,IAAgB,CAAC/D,MAAuD;AAC1E,QAAIA,EAAM,QAAQ;AACd,MAAAA,EAAM,eAAA,GACNQ,EAAQ,EAAI,GACZoE,EAAe,CAAChH,MAAY,KAAK,IAAImH,EAAS,SAAS,GAAGnH,IAAU,CAAC,CAAC;AAAA,aAC/DoC,EAAM,QAAQ;AACrB,MAAAA,EAAM,eAAA,GACN4E,EAAe,CAAChH,MAAY,KAAK,IAAI,GAAGA,IAAU,CAAC,CAAC;AAAA,aAC7CoC,EAAM,QAAQ,SAAS;AAC9B,MAAAA,EAAM,eAAA;AACN,YAAMmE,IAASY,EAASJ,CAAW;AACnC,MAAIR,OAAqBA,CAAM;AAAA,IACnC,MAAA,CAAWnE,EAAM,QAAQ,YACrBgF,EAAA;AAAA,EAER;AAEA,SACI,gBAAAtJ,EAAC,OAAA,EAAI,KAAK+I,GAAS,WAAWrJ,EAAGC,EAAO,SAASmI,KAASnI,EAAO,OAAOhB,CAAS,GAC5E,UAAA;AAAA,IAAAsI,uBACI,SAAA,EAAM,SAAS5H,GAAI,WAAWM,EAAO,OACjC,UAAAsH,EAAA,CACL;AAAA,IAEJ,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,EAAO,OACnB,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAAJ;AAAA,UACA,KAAK8I;AAAA,UACL,MAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAetI;AAAA,UACf,iBAAe,GAAGR,CAAE;AAAA,UACpB,qBAAkB;AAAA,UAClB,WAAWM,EAAO;AAAA,UAClB,aAAAiI;AAAA,UACA,UAAAtB;AAAA,UACA,OAAOzG,IAAO6I,IAAQS;AAAA,UACtB,SAAS,MAAMrE,EAAQ,EAAI;AAAA,UAC3B,UAAU,CAACR,MAAU;AACjB,YAAA0E,EAAS1E,EAAM,OAAO,KAAK,GAC3BQ,EAAQ,EAAI,GACZoE,EAAe,CAAC;AAAA,UACpB;AAAA,UACA,WAAWb;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEd,QAAA,EAAK,WAAW1I,EAAO,OAAO,eAAW,IAAC,UAAA,IAAA,CAE3C;AAAA,IAAA,GACJ;AAAA,IACCE,KACG,gBAAAJ,EAAC,MAAA,EAAG,IAAI,GAAGJ,CAAE,YAAY,MAAK,WAAU,WAAWM,EAAO,MACrD,UAAA0J,EAAS,WAAW,IACjB,gBAAA5J,EAAC,MAAA,EAAG,WAAWE,EAAO,OAAQ,UAAAmJ,EAAA,CAAa,IAE3CO,EAAS,IAAI,CAACZ,GAAQ7C,MAClB,gBAAAnG;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,MAAK;AAAA,QACL,iBAAegJ,EAAO,UAAUjK;AAAA,QAChC,WAAWkB;AAAA,UACPC,EAAO;AAAA,UACPiG,MAAUqD,KAAetJ,EAAO;AAAA,UAChC8I,EAAO,UAAUjK,KAASmB,EAAO;AAAA,QAAA;AAAA,QAErC,cAAc,MAAMuJ,EAAetD,CAAK;AAAA,QACxC,aAAa,CAACtB,MAAU;AACpB,UAAAA,EAAM,eAAA,GACNiF,EAAad,CAAM;AAAA,QACvB;AAAA,QAEC,UAAAA,EAAO;AAAA,MAAA;AAAA,MAdHA,EAAO;AAAA,IAAA,CAgBnB,GAET;AAAA,IAEHX,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,EAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,EAAO,QAAS,aAAW,IAC5C;AAAA,EAAA,GACR;AAER;;;;;;;;;;;;;;;;;;;;ACnJO,SAAS8J,GAAM;AAAA,EAClB,MAAA5J;AAAA,EACA,SAAAW;AAAA,EACA,OAAAH;AAAA,EACA,UAAAK;AAAA,EACA,QAAAqC;AAAA,EACA,MAAAa,IAAO;AAAA,EACP,iBAAA8F,IAAkB;AAAA,EAClB,YAAAC,IAAa;AAAA,EACb,WAAAhL;AAAA,EACA,iBAAAiL,IAAkB;AAAA,EAClB,YAAAC,IAAa;AAAA,EACb,oBAAAC,IAAqB;AACzB,GAAe;AAiBX,SAhBAxH,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAMkK,IAAmB,SAAS,KAAK,MAAM;AAC7C,aAAS,KAAK,MAAM,WAAW;AAE/B,UAAMC,IAAY,CAAC1F,MAA+B;AAC9C,MAAIqF,KAAcrF,EAAM,QAAQ,YAAU9D,EAAA;AAAA,IAC9C;AACA,kBAAO,iBAAiB,WAAWwJ,CAAS,GAErC,MAAM;AACT,eAAS,KAAK,MAAM,WAAWD,GAC/B,OAAO,oBAAoB,WAAWC,CAAS;AAAA,IACnD;AAAA,EACJ,GAAG,CAACnK,GAAM8J,GAAYnJ,CAAO,CAAC,GAE1B,CAACX,KAAQ,OAAO,WAAa,MAAoB,OAE9C4F;AAAA,IACH,gBAAAhG;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAWE,GAAO;AAAA,QAClB,MAAK;AAAA,QACL,SAAS,MAAM;AACX,UAAI+J,KAAiBlJ,EAAA;AAAA,QACzB;AAAA,QAEA,UAAA,gBAAAR;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,cAAW;AAAA,YACX,WAAWN;AAAA,cACPC,GAAO;AAAA,cACPsK,GAAcrG,CAAI;AAAA,cAClBiG,KAAclK,GAAO;AAAA,cACrBmK,KAAsBnK,GAAO;AAAA,cAC7BhB;AAAA,YAAA;AAAA,YAEJ,SAAS,CAAC2F,MAAUA,EAAM,gBAAA;AAAA,YAExB,UAAA;AAAA,eAAAjE,KAAS,CAACuJ,MACR,gBAAA5J,EAAC,UAAA,EAAO,WAAWL,GAAO,QACtB,UAAA;AAAA,gBAAA,gBAAAF,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,gBACnC,CAACuJ,KACE,gBAAAnK;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACG,MAAK;AAAA,oBACL,WAAWE,GAAO;AAAA,oBAClB,cAAW;AAAA,oBACX,SAASa;AAAA,oBAET,4BAACI,IAAA,CAAA,CAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf,GAER;AAAA,cAEJ,gBAAAnB,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAe,GAAS;AAAA,cACtCqC,KAAU,gBAAAtD,EAAC,UAAA,EAAO,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACzD;AAAA,IAAA;AAAA,IAEJ,SAAS;AAAA,EAAA;AAEjB;AAEA,SAASkH,GAAcrG,GAAqC;AACxD,SAAIA,MAAS,QAAcjE,GAAO,UAC9BiE,MAAS,QAAcjE,GAAO,UAC3BA,GAAOiE,CAAI;AACtB;AAEA,SAAShD,KAAY;AACjB,SACI,gBAAAnB,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAEtB;AAER;ACrGO,SAASyK,GAAc;AAAA,EAC1B,MAAArK;AAAA,EACA,OAAAQ;AAAA,EACA,aAAAC;AAAA,EACA,cAAA6J,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,SAAAjK,IAAU;AAAA,EACV,SAAA6F,IAAU;AAAA,EACV,WAAAqE;AAAA,EACA,UAAAC;AACJ,GAAuB;AACnB,SACI,gBAAA7K;AAAA,IAACgK;AAAA,IAAA;AAAA,MACG,MAAA5J;AAAA,MACA,SAASyK;AAAA,MACT,OAAAjK;AAAA,MACA,MAAK;AAAA,MACL,QACI,gBAAAL,EAAA4B,GAAA,EACI,UAAA;AAAA,QAAA,gBAAAnC,EAACsG,MAAO,SAAQ,aAAY,SAASuE,GAAU,UAAUtE,GACpD,UAAAoE,EAAA,CACL;AAAA,QACA,gBAAA3K,EAACsG,MAAO,SAAA5F,GAAkB,SAAA6F,GAAkB,SAAS,MAAA;AAAM,UAAKqE,EAAA;AAAA,WAC3D,UAAAF,EAAA,CACL;AAAA,MAAA,GACJ;AAAA,MAGH,UAAA7J;AAAA,IAAA;AAAA,EAAA;AAGb;ACvBO,MAAMiK,KAAavD,EAA8C,SACpE,EAAE,OAAAxI,GAAO,UAAAE,GAAU,MAAA8L,IAAO,QAAQ,GAAG7J,EAAA,GACrCyG,GACF;AACE,SACI,gBAAA3H;AAAA,IAACgL;AAAA,IAAA;AAAA,MACI,GAAG9J;AAAA,MACJ,KAAAyG;AAAA,MACA,MAAMoD;AAAA,MACN,OAAAhM;AAAA,MACA,UAAU,CAAC8F,MAAU5F,EAAS4F,EAAM,OAAO,KAAK;AAAA,IAAA;AAAA,EAAA;AAG5D,CAAC;;;;;;;;;ACpBM,SAASoG,GAAQ;AAAA,EACpB,aAAAC,IAAc;AAAA,EACd,SAAAxK,IAAU;AAAA,EACV,OAAA8G;AAAA,EACA,OAAA2D,IAAQ;AAAA,EACR,WAAAjM;AAAA,EACA,GAAGgC;AACP,GAAiB;AACb,SAAIgK,MAAgB,aAEZ,gBAAAlL;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,oBAAiB;AAAA,MACjB,WAAWC;AAAA,QACPC,GAAO;AAAA,QACPA,GAAO;AAAA,QACPQ,MAAY,YAAYR,GAAO;AAAA,QAC/BhB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,IAAA;AAAA,EAAA,IAKXsG,IAeD,gBAAAxH;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,oBAAiB;AAAA,MACjB,WAAWC;AAAA,QACPC,GAAO;AAAA,QACPA,GAAO;AAAA,QACPQ,MAAY,YAAYR,GAAO;AAAA,QAC/BiL,MAAU,WAAWjL,GAAO;AAAA,QAC5BiL,MAAU,SAASjL,GAAO;AAAA,QAC1BhB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEH,UAAAsG;AAAA,IAAA;AAAA,EAAA,IA1BD,gBAAAxH;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACPC,GAAO;AAAA,QACPA,GAAO;AAAA,QACPA,GAAO;AAAA,QACPQ,MAAY,YAAYR,GAAO;AAAA,QAC/BhB;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAsBhB;;;;;;;;;;;;;;;;;;;;;AC1CO,SAASkM,GAAO;AAAA,EACnB,MAAAhL;AAAA,EACA,SAAAW;AAAA,EACA,WAAAsK,IAAY;AAAA,EACZ,OAAAzK;AAAA,EACA,UAAAK;AAAA,EACA,QAAAqC;AAAA,EACA,iBAAA2G,IAAkB;AAAA,EAClB,YAAAC,IAAa;AAAA,EACb,iBAAAC,IAAkB;AAAA,EAClB,WAAAjL;AAAA,EACA,iBAAAoM;AAAA,EACA,YAAA5F,IAAa;AACjB,GAAgB;AACZ,QAAM,EAAE,UAAA6F,EAAA,IAAa5I,GAAA,GACf6I,IACFD,KAAYD,IAAkBA,IAAkBD;AAgBpD,SAdAxI,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAMkK,IAAmB,SAAS,KAAK,MAAM;AAC7C,aAAS,KAAK,MAAM,WAAW;AAC/B,UAAMC,IAAY,CAAC1F,MAA+B;AAC9C,MAAIqF,KAAcrF,EAAM,QAAQ,YAAU9D,EAAA;AAAA,IAC9C;AACA,kBAAO,iBAAiB,WAAWwJ,CAAS,GACrC,MAAM;AACT,eAAS,KAAK,MAAM,WAAWD,GAC/B,OAAO,oBAAoB,WAAWC,CAAS;AAAA,IACnD;AAAA,EACJ,GAAG,CAACnK,GAAM8J,GAAYnJ,CAAO,CAAC,GAE1B,CAACX,KAAQ,OAAO,WAAa,MAAoB,OAE9C4F;AAAA,IACH,gBAAAzF,EAAA4B,GAAA,EACI,UAAA;AAAA,MAAA,gBAAAnC;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWE,GAAO;AAAA,UAClB,SAAS,MAAM;AACX,YAAI+J,KAAiBlJ,EAAA;AAAA,UACzB;AAAA,QAAA;AAAA,MAAA;AAAA,MAEJ,gBAAAR;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAWN,EAAGC,GAAO,OAAOA,GAAOsL,CAAkB,GAAGtM,CAAS;AAAA,UAEhE,UAAA;AAAA,YAAAwG,MACI8F,MAAuB,YAAYA,MAAuB,UACvD,gBAAAxL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAWC;AAAA,kBACPC,GAAO;AAAA,kBACPsL,MAAuB,SAAStL,GAAO;AAAA,gBAAA;AAAA,gBAE3C,eAAW;AAAA,cAAA;AAAA,YAAA;AAAA,aAGrBU,KAAS,CAACuJ,wBACP,UAAA,EAAO,WAAWjK,GAAO,QACtB,UAAA;AAAA,cAAA,gBAAAF,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,cACnC,CAACuJ,KACE,gBAAAnK;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,WAAWE,GAAO;AAAA,kBAClB,SAASa;AAAA,kBAET,4BAACI,IAAA,CAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACf,GAER;AAAA,YAEJ,gBAAAnB,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAe,GAAS;AAAA,YACtCqC,KAAU,gBAAAtD,EAAC,UAAA,EAAO,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACzD,GACJ;AAAA,IACA,SAAS;AAAA,EAAA;AAEjB;AAEA,SAASnC,KAAY;AACjB,SACI,gBAAAnB,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAEtB;AAER;;;;;;;;;;;;;;AC7FA,SAASyL,GAAeJ,GAA0C;AAC9D,UAAQA,GAAA;AAAA,IACJ,KAAK;AACD,aAAOnL,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAElB;AACI,aAAOA,GAAO;AAAA,EAAA;AAE1B;AASO,SAASwL,GAAa;AAAA,EACzB,SAAAC;AAAA,EACA,OAAA9M;AAAA,EACA,WAAAwM,IAAY;AAAA,EACZ,WAAAnM;AACJ,GAAsB;AAClB,QAAM,CAACkB,GAAMiF,CAAO,IAAI7F,EAAS,EAAK,GAChC,CAACgK,GAAaC,CAAc,IAAIjK,EAAiB,EAAE,GACnDI,IAAKR,EAAA,GACLkK,IAAUzB,EAAwB,IAAI,GACtC+D,IAAW/D,EAAwC,EAAE,GAErDgE,IAAoBhN,EACrB,IAAI,CAACiN,GAAO3F,MAAW2F,EAAM,SAAS,UAAU,CAACA,EAAM,WAAW3F,IAAQ,EAAG,EAC7E,OAAO,CAAC4F,MAAMA,MAAM,EAAE,GAErBC,IAAQrM,EAAY,MAAY;AAClC,IAAA0F,EAAQ,EAAK,GACboE,EAAe,EAAE;AAAA,EACrB,GAAG,CAAA,CAAE;AAEL,EAAA5G,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAM6L,IAAQ,CAACpH,MAA+B;AAC1C,UAAIA,EAAM,QAAQ,UAAU;AACxB,QAAAmH,EAAA;AACA;AAAA,MACJ;AACA,UAAInH,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA;AACN,cAAMpC,IAAUoJ,EAAkB,QAAQrC,CAAW,GAC/C1J,IAAO+L,GAAmBpJ,IAAU,KAAKoJ,EAAkB,MAAM,KAAK;AAC5E,QAAApC,EAAe3J,CAAI,GACnB8L,EAAS,QAAQ9L,CAAI,GAAG,MAAA;AAAA,MAC5B;AACA,UAAI+E,EAAM,QAAQ,WAAW;AACzB,QAAAA,EAAM,eAAA;AACN,cAAMpC,IAAUoJ,EAAkB,QAAQrC,CAAW,GAC/C0C,IACFL,GACKpJ,IAAU,IAAIoJ,EAAkB,UAAUA,EAAkB,MACjE,KAAK;AACT,QAAApC,EAAeyC,CAAI,GACnBN,EAAS,QAAQM,CAAI,GAAG,MAAA;AAAA,MAC5B;AAAA,IACJ,GACMnC,IAAS,CAAClF,MAA4B;AACxC,MAAIyE,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,KAAGmH,EAAA;AAAA,IAC5E;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACxC,OAAO,iBAAiB,aAAalC,CAAM,GACpC,MAAM;AACT,aAAO,oBAAoB,WAAWkC,CAAK,GAC3C,OAAO,oBAAoB,aAAalC,CAAM;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC3J,GAAMoJ,GAAaqC,GAAmBG,CAAK,CAAC;AAEhD,QAAMG,IAAqB,CAACtH,MAAkC;AAC1D,IAAA8G,EAAQ,MAAM,UAAU9G,CAAK,GAC7BQ,EAAQ,CAAC6G,MAAS,CAACA,CAAI;AAAA,EAC3B,GAEME,IAAe;AAAA,IACjB,GAAGT;AAAA,IACH,OAAO;AAAA,MACH,GAAGA,EAAQ;AAAA,MACX,SAASQ;AAAA,MACT,iBAAiB/L;AAAA,MACjB,iBAAiBR;AAAA,MACjB,iBAAiB;AAAA,IAAA;AAAA,EACrB,GAGEkK,IAAe,CAACgC,MAA8D;AAChF,IAAAA,EAAM,SAAA,GACNE,EAAA;AAAA,EACJ;AAEA,2BACK,QAAA,EAAK,KAAK1C,GAAS,WAAWpJ,GAAO,MACjC,UAAA;AAAA,IAAAkM;AAAA,IACAhM,KACG,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAAJ;AAAA,QACA,MAAK;AAAA,QACL,WAAWK,EAAGC,GAAO,MAAMuL,GAAeJ,CAAS,GAAGnM,CAAS;AAAA,QAE9D,UAAAL,EAAM,IAAI,CAACiN,GAAO3F,MACX2F,EAAM,SAAS,cAEX,gBAAA9L;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,eAAW;AAAA,UAAA;AAAA,UAHN4L,EAAM;AAAA,QAAA,IAOnBA,EAAM,SAAS,UAEX,gBAAA9L,EAAC,MAAA,EAAkB,MAAK,gBAAe,WAAWE,GAAO,OACpD,UAAA4L,EAAM,MAAA,GADFA,EAAM,EAEf,IAIJ,gBAAA9L,EAAC,MAAA,EAAkB,MAAK,QACpB,UAAA,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAK,CAAC8L,MAAO;AACT,cAAAT,EAAS,QAAQzF,CAAK,IAAIkG;AAAA,YAC9B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAWpM;AAAA,cACPC,GAAO;AAAA,cACP4L,EAAM,UAAU5L,GAAO;AAAA,cACvBsJ,MAAgBrD,KAASjG,GAAO;AAAA,YAAA;AAAA,YAEpC,UAAU4L,EAAM;AAAA,YAChB,SAAS,MAAMhC,EAAagC,CAAK;AAAA,YACjC,cAAc,MAAMrC,EAAetD,CAAK;AAAA,YAEvC,UAAA;AAAA,cAAA2F,EAAM,QAAQ,gBAAA9L,EAAC,QAAA,EAAK,eAAW,IAAE,YAAM,MAAK;AAAA,cAC5C8L,EAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACX,GAlBKA,EAAM,EAmBf,CAEP;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GAER;AAER;;;;;;;;ACvJO,SAASQ,GAAS;AAAA,EACrB,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAA1N,IAAW;AAAA,EACX,UAAA+H,IAAW;AAAA,EACX,SAAA4F;AAAA,EACA,UAAAC;AAAA,EACA,UAAAzL;AAAA,EACA,WAAA/B;AACJ,GAAkB;AACd,QAAMwJ,IAAWb,EAAyB,IAAI,GACxC,CAAC8E,GAAYC,CAAa,IAAIpN,EAAS,EAAK,GAE5CqN,IAAc,CAACC,MAAoC;AACrD,QAAI,CAACA,KAAYA,EAAS,WAAW,EAAG;AACxC,UAAMC,IAAM,MAAM,KAAKD,CAAQ,GACzBE,IAAUlO,IAAWiO,IAAMA,EAAI,MAAM,GAAG,CAAC;AAE/C,QAAIN,MAAY,QAAW;AACvB,MAAAF,EAAOS,CAAO;AACd;AAAA,IACJ;AAEA,UAAMC,IAAmB,CAAA,GACnBC,IAAmB,CAAA;AACzB,eAAWC,KAAQH;AACf,MAAIG,EAAK,OAAOV,IAASS,EAAS,KAAKC,CAAI,IACtCF,EAAS,KAAKE,CAAI;AAE3B,IAAID,EAAS,SAAS,KAAGR,IAAWQ,CAAQ,GACxCD,EAAS,SAAS,KAAGV,EAAOU,CAAQ;AAAA,EAC5C,GAEMG,IAAa,MAAY;AAC3B,IAAIvG,KACJ6B,EAAS,SAAS,MAAA;AAAA,EACtB,GAEM2E,IAAkB,CAACxI,MAA2C;AAEhE,IADAA,EAAM,eAAA,GACF,CAAAgC,KACJ+F,EAAc,EAAI;AAAA,EACtB,GAEMU,IAAiB,CAACzI,MAA2C;AAC/D,IAAAA,EAAM,eAAA;AAAA,EACV,GAEM0I,IAAkB,CAAC1I,MAA2C;AAChE,IAAAA,EAAM,eAAA,GACN+H,EAAc,EAAK;AAAA,EACvB,GAEMY,IAAa,CAAC3I,MAA2C;AAG3D,IAFAA,EAAM,eAAA,GACN+H,EAAc,EAAK,GACf,CAAA/F,KACJgG,EAAYhI,EAAM,aAAa,KAAK;AAAA,EACxC,GAEM+D,IAAgB,CAAC/D,MAA+C;AAClE,KAAIA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACvCA,EAAM,eAAA,GACNuI,EAAA;AAAA,EAER;AAEA,SACI,gBAAA7M;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,UAAUsG,IAAW,KAAK;AAAA,MAC1B,iBAAeA,KAAY;AAAA,MAC3B,WAAW5G;AAAA,QACPC,GAAO;AAAA,QACPyM,KAAczM,GAAO;AAAA,QACrB2G,KAAY3G,GAAO;AAAA,QACnBhB;AAAA,MAAA;AAAA,MAEJ,SAASkO;AAAA,MACT,WAAWxE;AAAA,MACX,aAAayE;AAAA,MACb,YAAYC;AAAA,MACZ,aAAaC;AAAA,MACb,QAAQC;AAAA,MAER,UAAA;AAAA,QAAA,gBAAAxN;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAK0I;AAAA,YACL,MAAK;AAAA,YACL,WAAWxI,GAAO;AAAA,YAClB,QAAAsM;AAAA,YACA,UAAA1N;AAAA,YACA,UAAA+H;AAAA,YACA,UAAU,CAAChC,MAAU;AACjB,cAAAgI,EAAYhI,EAAM,OAAO,KAAK,GAC9BA,EAAM,OAAO,QAAQ;AAAA,YACzB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH5D,KACG,gBAAAjB,EAAC,QAAA,EAAK,WAAWE,GAAO,QAAQ,UAAA,kDAAA,CAEhC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhB;;;;;;;;AC7HO,SAASuN,GAAW,EAAE,MAAA3M,GAAM,OAAAF,GAAO,aAAAC,GAAa,QAAAqE,GAAQ,WAAAhG,KAA8B;AACzF,2BACK,OAAA,EAAI,WAAWe,EAAGC,GAAO,SAAShB,CAAS,GACvC,UAAA;AAAA,IAAA4B,KAAQ,gBAAAd,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,IAC5C,gBAAAd,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,IACnCC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAW,GAAY;AAAA,IAC9DqE,KAAU,gBAAAlF,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAAgF,EAAA,CAAO;AAAA,EAAA,GACtD;AAER;;;;;;;;ACPO,SAASwI,GAAW;AAAA,EACvB,OAAA9M,IAAQ;AAAA,EACR,aAAAC,IAAc;AAAA,EACd,SAAA8M;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,MAAA9M;AAAA,EACA,WAAA5B;AACJ,GAAoB;AAChB,2BACK,OAAA,EAAI,WAAWe,EAAGC,GAAO,SAAShB,CAAS,GACxC,UAAA;AAAA,IAAA,gBAAAc,EAAC,SAAI,WAAWE,GAAO,MAAO,UAAAY,KAAQ,gBAAAd,EAAC6N,MAAU,EAAA,CAAG;AAAA,IACpD,gBAAA7N,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,IACnCC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAW,GAAY;AAAA,IAC9D8M,KACG,gBAAA3N,EAAC,OAAA,EAAI,WAAWE,GAAO,QACnB,UAAA,gBAAAF,EAACsG,IAAA,EAAO,SAAQ,aAAY,SAASqH,GAChC,aACL,EAAA,CACJ;AAAA,EAAA,GAER;AAER;AAEA,SAASE,KAAY;AACjB,SACI,gBAAA7N,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEvB;AAER;;;;;;;;;;;;;;;;ACxBA,SAAS8N,GAAWC,GAAuB;AACvC,SAAIA,IAAQ,OAAa,GAAGA,CAAK,OAC7BA,IAAQ,OAAO,OAAa,IAAIA,IAAQ,MAAM,QAAQ,CAAC,CAAC,QACrD,IAAIA,IAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC9C;AAEA,SAASC,GAAcb,GAAYX,GAA0B;AACzD,MAAI,CAACA,EAAQ,QAAO;AACpB,QAAMyB,IAASzB,EAAO,MAAM,GAAG,EAAE,IAAI,CAAC0B,MAAMA,EAAE,KAAA,EAAO,YAAA,CAAa,GAC5DpK,IAAOqJ,EAAK,KAAK,YAAA,GACjBgB,IAAOhB,EAAK,KAAK,YAAA;AACvB,SAAOc,EAAO,KAAK,CAACG,MACZA,EAAM,WAAW,GAAG,IAAUtK,EAAK,SAASsK,CAAK,IACjDA,EAAM,SAAS,IAAI,IAAUD,EAAK,WAAWC,EAAM,QAAQ,MAAM,GAAG,CAAC,IAClED,MAASC,CACnB;AACL;AAMO,SAASC,GAAW;AAAA,EACvB,OAAAtP;AAAA,EACA,UAAAE;AAAA,EACA,OAAAuI;AAAA,EACA,QAAAgF;AAAA,EACA,UAAA1N,IAAW;AAAA,EACX,SAAA2N;AAAA,EACA,UAAAC;AAAA,EACA,UAAA7F;AAAA,EACA,OAAAjG,IAAQ;AAAA,EACR,UAAA0N;AAAA,EACA,WAAApP;AACJ,GAAoB;AAChB,QAAM,CAACqP,GAAUC,CAAW,IAAIhP,EAAkB,EAAK,GACjDkJ,IAAWb,EAAyB,IAAI;AAE9C,WAAS4G,EAASC,GAAmC;AACjD,UAAMzB,IAAmB,CAAA,GACnBC,IAAsD,CAAA;AAE5D,eAAWC,KAAQ,MAAM,KAAKuB,CAAQ,GAAG;AACrC,UAAI,CAACV,GAAcb,GAAMX,CAAM,GAAG;AAC9B,QAAAU,EAAS,KAAK,EAAE,MAAAC,GAAM,QAAQ,QAAQ;AACtC;AAAA,MACJ;AACA,UAAIV,KAAWU,EAAK,OAAOV,GAAS;AAChC,QAAAS,EAAS,KAAK,EAAE,MAAAC,GAAM,QAAQ,QAAQ;AACtC;AAAA,MACJ;AACA,MAAAF,EAAS,KAAKE,CAAI;AAAA,IACtB;AAGA,QADID,EAAS,SAAS,KAAGR,IAAWQ,CAAQ,GACxCD,EAAS,WAAW,EAAG;AAE3B,UAAMnN,IAAOhB,IAAW,CAAC,GAAGC,GAAO,GAAGkO,CAAQ,IAAIA,EAAS,MAAM,GAAG,CAAC;AACrE,IAAAhO,EAASa,CAAI;AAAA,EACjB;AAEA,WAAS0N,EAAW3I,GAAwC;AAGxD,IAFAA,EAAM,eAAA,GACN2J,EAAY,EAAK,GACb,CAAA3H,KACAhC,EAAM,cAAc,SAAO4J,EAAS5J,EAAM,aAAa,KAAK;AAAA,EACpE;AAEA,WAASgE,EAAO1C,GAAqB;AACjC,UAAMrG,IAAOf,EAAM,MAAA;AACnB,IAAAe,EAAK,OAAOqG,GAAO,CAAC,GACpBlH,EAASa,CAAI;AAAA,EACjB;AAEA,2BACK,OAAA,EAAI,WAAWG,EAAGC,EAAO,SAAShB,CAAS,GACvC,UAAA;AAAA,IAAAsI,KAAS,gBAAAxH,EAAC,SAAA,EAAM,WAAWE,EAAO,OAAQ,UAAAsH,GAAM;AAAA,IACjD,gBAAAjH;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAWN;AAAA,UACPC,EAAO;AAAA,UACPqO,KAAYrO,EAAO;AAAA,UACnB2G,KAAY3G,EAAO;AAAA,QAAA;AAAA,QAEvB,MAAK;AAAA,QACL,UAAU2G,IAAW,KAAK;AAAA,QAC1B,SAAS,MAAM,CAACA,KAAY6B,EAAS,SAAS,MAAA;AAAA,QAC9C,WAAW,CAAC7D,MAAU;AAClB,WAAIA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACvCA,EAAM,eAAA,GACN6D,EAAS,SAAS,MAAA;AAAA,QAE1B;AAAA,QACA,aAAa,CAAC7D,MAAU;AACpB,UAAAA,EAAM,eAAA,GACDgC,KAAU2H,EAAY,EAAI;AAAA,QACnC;AAAA,QACA,YAAY,CAAC3J,MAAUA,EAAM,eAAA;AAAA,QAC7B,aAAa,MAAM2J,EAAY,EAAK;AAAA,QACpC,QAAQhB;AAAA,QAER,UAAA;AAAA,UAAA,gBAAAxN,EAAC,OAAA,EAAI,WAAWE,EAAO,MAAM,eAAW,IACpC,UAAA,gBAAAF,EAAC2O,MAAW,EAAA,CAChB;AAAA,UACA,gBAAA3O,EAAC,KAAA,EAAE,WAAWE,EAAO,OAAQ,UAAAU,GAAM;AAAA,UAClC0N,KAAY,gBAAAtO,EAAC,KAAA,EAAE,WAAWE,EAAO,UAAW,UAAAoO,GAAS;AAAA,UACtD,gBAAAtO;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,KAAK0I;AAAA,cACL,MAAK;AAAA,cACL,QAAA8D;AAAA,cACA,UAAA1N;AAAA,cACA,UAAA+H;AAAA,cACA,WAAW3G,EAAO;AAAA,cAClB,UAAU,CAAC2E,MAAU;AACjB,gBAAIA,EAAM,OAAO,SAAO4J,EAAS5J,EAAM,OAAO,KAAK,GACnDA,EAAM,OAAO,QAAQ;AAAA,cACzB;AAAA,YAAA;AAAA,UAAA;AAAA,QACJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH9F,EAAM,SAAS,KACZ,gBAAAiB,EAAC,MAAA,EAAG,WAAWE,EAAO,OACjB,UAAAnB,EAAM,IAAI,CAACoO,GAAMhH,wBACb,MAAA,EAAiC,WAAWjG,EAAO,MAChD,UAAA;AAAA,MAAA,gBAAAK,EAAC,OAAA,EACG,UAAA;AAAA,QAAA,gBAAAP,EAAC,OAAA,EAAK,YAAK,KAAA,CAAK;AAAA,QAChB,gBAAAA,EAAC,SAAI,WAAWE,EAAO,UAAW,UAAA4N,GAAWX,EAAK,IAAI,EAAA,CAAE;AAAA,MAAA,GAC5D;AAAA,MACA,gBAAAnN;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,cAAY,WAAWmN,EAAK,IAAI;AAAA,UAChC,WAAWjN,EAAO;AAAA,UAClB,SAAS,MAAM2I,EAAO1C,CAAK;AAAA,UAC9B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,GAZK,GAAGgH,EAAK,IAAI,IAAIhH,CAAK,EAa9B,CACH,EAAA,CACL;AAAA,EAAA,GAER;AAER;AAEA,SAASwI,KAAa;AAClB,SACI,gBAAA3O,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,IAAA;AAAA,EAAA,GAEvB;AAER;;;;;;;;;;;;;;;;;;ACrKA,SAAS4O,GAAWC,GAAkCC,GAA0B;AAC5E,SAAID,MAAQ,SAAkB,GAAGC,IAAW,CAAC,OACtC,OAAOD,KAAQ,WAAW,GAAGA,IAAM,CAAC,OAAOA;AACtD;AAEA,SAASE,GAAeC,GAA8C;AAClE,SAAIA,MAAY,SAAkB,8BAC3B,OAAOA,KAAY,WAAW,UAAUA,CAAO,sBAAsBA;AAChF;AAkBO,MAAMC,KAAO1H,EAAuC,SACvD,EAAE,QAAA2H,IAAS,SAAS,SAAAF,GAAS,KAAAH,GAAK,WAAA3P,GAAW,OAAAyE,GAAO,UAAA1C,GAAU,GAAGC,EAAA,GACjEyG,GACF;AACE,QAAM/D,IAA4B;AAAA,IAC9B,KAAKgL,GAAWC,GAAK,CAAC;AAAA,IACtB,GAAIK,MAAW,SAAS,EAAE,qBAAqBH,GAAeC,CAAO,MAAM;AAAA,IAC3E,GAAGrL;AAAA,EAAA;AAEP,SACI,gBAAA3D;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAA2H;AAAA,MACA,WAAW1H,EAAGC,GAAO,MAAMA,GAAOgP,CAAM,GAAGhQ,CAAS;AAAA,MACpD,OAAO0E;AAAA,MACN,GAAG1C;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;AAmBM,SAASkO,GAAY;AAAA,EACxB,OAAAvO;AAAA,EACA,aAAAC;AAAA,EACA,QAAAqO,IAAS;AAAA,EACT,SAAAF;AAAA,EACA,KAAAH;AAAA,EACA,WAAA3P;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAqB;AACjB,QAAMkO,IAA2B;AAAA,IAC7B,KAAKR,GAAWC,GAAK,CAAC;AAAA,IACtB,GAAIK,MAAW,SAAS,EAAE,qBAAqBH,GAAeC,CAAO,MAAM;AAAA,EAAA;AAE/E,SACI,gBAAAzO,EAAC,WAAA,EAAQ,WAAWN,EAAGC,GAAO,SAAShB,CAAS,GAAG,OAAAyE,GAAe,GAAGzC,GAC/D,UAAA;AAAA,KAAAN,KAASC,MACP,gBAAAN,EAAC,UAAA,EAAO,WAAWL,GAAO,eACrB,UAAA;AAAA,MAAAU,KAAS,gBAAAZ,EAAC,MAAA,EAAG,WAAWE,GAAO,cAAe,UAAAU,GAAM;AAAA,MACpDC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,oBAAqB,UAAAW,EAAA,CAAY;AAAA,IAAA,GAC1E;AAAA,IAEJ,gBAAAb,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,aAAaA,GAAOgP,CAAM,CAAC,GAAG,OAAOE,GAC1D,UAAAnO,EAAA,CACL;AAAA,EAAA,GACJ;AAER;AAqBO,SAASoO,GAAQ,EAAE,KAAAR,GAAK,WAAA3P,GAAW,OAAAyE,GAAO,UAAA1C,GAAU,GAAGC,KAAuB;AACjF,QAAM0C,IAA4B,EAAE,KAAKgL,GAAWC,GAAK,CAAC,GAAG,GAAGlL,EAAA;AAChE,SACI,gBAAA3D,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,KAAKhB,CAAS,GAAG,OAAO0E,GAAa,GAAG1C,GAC7D,UAAAD,EAAA,CACL;AAER;AAkBO,SAASqO,GAAY;AAAA,EACxB,OAAAnE,IAAQ;AAAA,EACR,KAAA0D;AAAA,EACA,WAAA3P;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAqB;AACjB,QAAM0C,IAA4B,EAAE,KAAKgL,GAAWC,GAAK,CAAC,GAAG,GAAGlL,EAAA;AAChE,SACI,gBAAA3D,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,SAASA,GAAOiL,CAAK,GAAGjM,CAAS,GAAG,OAAO0E,GAAa,GAAG1C,GAChF,UAAAD,GACL;AAER;;;;;;;;;;;;;;;;;;;;;;AC1JO,SAASsO,GAAU,EAAE,MAAApL,IAAO,MAAM,WAAAjF,GAAW,UAAA+B,GAAU,GAAGC,KAAyB;AACtF,SACI,gBAAAlB,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,WAAWA,GAAOiE,CAAI,GAAGjF,CAAS,GAAI,GAAGgC,GAC9D,UAAAD,EAAA,CACL;AAER;AAeA,SAASuO,GAAsBzQ,GAI7B;AACE,SACI,OAAOA,KAAU,YACjBA,MAAU,SACT,YAAYA,KAAS,YAAYA,KAAS,aAAaA;AAEhE;AAEA,SAAS0Q,GACL1Q,GACA2Q,GACa;AACb,MAAI3Q,MAAU;AACd,WAAKyQ,GAAmBzQ,CAAK,IACzB2Q,MAAW,YAAkB3Q,EAAM,WAAWA,EAAM,UAAUA,EAAM,SACpE2Q,MAAW,WAAiB3Q,EAAM,UAAUA,EAAM,UAAUA,EAAM,UAC/DA,EAAM,UAAUA,EAAM,UAAUA,EAAM,UAHNA;AAI3C;AAiBA,SAAS6P,GAAWC,GAAsD;AACtE,MAAIA,MAAQ;AACZ,WAAO,OAAOA,KAAQ,WAAW,GAAGA,IAAM,CAAC,OAAOA;AACtD;AAEA,SAASc,GACLpE,GACAqE,GAC+B;AAC/B,SAAIrE,IAAiB,WACjBqE,IAAiB,WACd;AACX;AAGO,SAASC,GAAM;AAAA,EAClB,WAAAC,IAAY;AAAA,EACZ,KAAAjB,IAAM;AAAA,EACN,OAAA1D;AAAA,EACA,SAAA4E;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAA9Q;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAe;AACX,QAAM,EAAE,UAAAqK,GAAU,UAAAqE,EAAA,IAAajN,GAAA,GACzB+M,IAASC,GAAqBpE,GAAUqE,CAAQ,GAChDK,IAAiCR,GAAeK,GAAWJ,CAAM,KAAK,YAEtE9L,IAA4B,EAAE,KADnBgL,GAAWa,GAAeZ,GAAKa,CAAM,CAAC,GACJ,GAAG/L,EAAA,GAChDuM,IACFH,MAAY,YACN7P,GAAO,iBACP6P,MAAY,WACV7P,GAAO,gBACP6P,MAAY,QACV7P,GAAO,aACP6P,MAAY,UACV7P,GAAO,eACP;AAChB,SACI,gBAAAF;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACPC,GAAO;AAAA,QACP+P,MAAmB,aAAa/P,GAAO,WAAWA,GAAO;AAAA,QACzDiL,KAASjL,GAAOiL,CAAK;AAAA,QACrB+E;AAAA,QACAF,KAAQ9P,GAAO;AAAA,QACfhB;AAAA,MAAA;AAAA,MAEJ,OAAO0E;AAAA,MACN,GAAG1C;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb;AAUA,SAAS8N,GAAeC,GAA0D;AAC9E,MAAIA,MAAY;AAChB,WAAO,OAAOA,KAAY,WAAW,UAAUA,CAAO,sBAAsBA;AAChF;AAGO,SAASmB,GAAK,EAAE,SAAAnB,IAAU,GAAG,KAAAH,IAAM,GAAG,WAAA3P,GAAW,OAAAyE,GAAO,UAAA1C,GAAU,GAAGC,KAAoB;AAC5F,QAAM,EAAE,UAAAqK,GAAU,UAAAqE,EAAA,IAAajN,GAAA,GACzB+M,IAASC,GAAqBpE,GAAUqE,CAAQ,GAChDQ,IAAkBrB,GAAeU,GAAeT,GAASU,CAAM,CAAC,GAChEW,IAAWzB,GAAWa,GAAeZ,GAAKa,CAAM,CAAC;AACvD,SACI,gBAAA1P;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAGC,GAAO,MAAMhB,CAAS;AAAA,MACpC,OAAO,EAAE,qBAAqBkR,GAAiB,KAAKC,GAAU,GAAG1M,EAAA;AAAA,MAChE,GAAGzC;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb;ACzIA,SAASqP,KAA4B;AACjC,MAAI,OAAO,SAAW,IAAa,QAAO;AAE1C,QAAMC,IADe,CAAC,cAAc,cAAc,YAAY,EACtB;AAAA,IACpC,CAACxF,MAAS,OAAO,aAAa,kBAAkBA,CAAI,GAAG,GAAG;AAAA,EAAA,GAGxDyF,IACD,OAAO,UAAmD,eAAe;AAC9E,SAAOD,KAAsBC;AACjC;AAMO,SAASC,KAAuD;AACnE,QAAM,CAACC,GAAUC,CAAW,IAAInR,EAA0C,IAAI,GACxE,CAACoR,GAAWC,CAAY,IAAIrR,EAAkB,EAAK,GACnD,CAACsR,GAAcC,CAAe,IAAIvR,EAAkB8Q,EAAgB;AAE1E,EAAAzN,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMgD,IAAU,CAAChB,MAAuB;AACpC,MAAAA,EAAM,eAAA,GACN8L,EAAY9L,CAAiC;AAAA,IACjD,GACMmM,IAAmB,MAAY;AACjC,MAAAL,EAAY,IAAI,GAChBE,EAAa,EAAI,GACjBE,EAAgB,EAAI;AAAA,IACxB,GACME,IAAmB,OAAO,aAAa,4BAA4B,GACnEC,IAAqB,MAAYH,EAAgBT,IAAkB;AACzE,kBAAO,iBAAiB,uBAAuBzK,CAAO,GACtD,OAAO,iBAAiB,gBAAgBmL,CAAgB,GACxDC,GAAkB,iBAAiB,UAAUC,CAAkB,GACxD,MAAM;AACT,aAAO,oBAAoB,uBAAuBrL,CAAO,GACzD,OAAO,oBAAoB,gBAAgBmL,CAAgB,GAC3DC,GAAkB,oBAAoB,UAAUC,CAAkB;AAAA,IACtE;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,QAAMC,IAASxR,EAAY,YAA+D;AACtF,QAAI,CAAC+Q,EAAU,QAAO;AACtB,UAAMA,EAAS,OAAA;AACf,UAAMU,IAAS,MAAMV,EAAS;AAC9B,WAAAC,EAAY,IAAI,GACZS,EAAO,YAAY,cAAYP,EAAa,EAAI,GAC7CO,EAAO;AAAA,EAClB,GAAG,CAACV,CAAQ,CAAC;AAEb,SAAO;AAAA,IACH,aAAa,CAAC,CAACA;AAAA,IACf,WAAAE;AAAA,IACA,cAAAE;AAAA,IACA,QAAAK;AAAA,EAAA;AAER;;;;;;;;;ACrDA,SAASE,GAAcC,GAA8B;AACjD,MAAI,CAACA,KAAc,OAAO,SAAW,IAAa,QAAO;AACzD,MAAI;AACA,WAAO,OAAO,aAAa,QAAQA,CAAU,MAAM;AAAA,EACvD,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAgBO,SAASC,GAAc;AAAA,EAC1B,OAAA3Q,IAAQ;AAAA,EACR,aAAAC;AAAA,EACA,cAAA2Q,IAAe;AAAA,EACf,cAAAC,IAAe;AAAA,EACf,MAAA3Q;AAAA,EACA,YAAAwQ;AAAA,EACA,UAAAI;AAAA,EACA,WAAAxS;AACJ,GAAuB;AACnB,QAAM,EAAE,aAAAyS,GAAa,WAAAf,GAAW,cAAAE,GAAc,QAAAK,EAAA,IAAWV,GAAA,GACnD,CAACmB,GAAWC,CAAY,IAAIrS,EAAkB,MAAM6R,GAAcC,CAAU,CAAC;AAEnF,MAAI,CAACK,KAAef,KAAaE,KAAgBc,EAAW,QAAO;AAEnE,QAAME,IAAU,MAAY;AAExB,QADAD,EAAa,EAAI,GACbP,KAAc,OAAO,SAAW;AAChC,UAAI;AACA,eAAO,aAAa,QAAQA,GAAY,GAAG;AAAA,MAC/C,QAAQ;AAAA,MAER;AAAA,EAER;AAEA,SACI,gBAAA/Q,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,QAAQhB,CAAS,GAAG,MAAK,UAAS,cAAY,OAAO0B,CAAK,GAC/E,UAAA;AAAA,IAAAE,KAAQ,gBAAAd,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,IAC7C,gBAAAP,EAAC,OAAA,EAAI,WAAWL,GAAO,MACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,KAAA,EAAE,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,MAClCC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAW,EAAA,CAAY;AAAA,IAAA,GACnE;AAAA,IACA,gBAAAb;AAAA,MAACsG;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,SAAS,YAAY;AACjB,UAAAoL,IAAW,MAAMP,GAAQ;AAAA,QAC7B;AAAA,QAEC,UAAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL,gBAAAxR;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,cAAYuR;AAAA,QACZ,SAASK;AAAA,QAET,UAAA,gBAAA9R,EAAC+R,IAAA,EAAE,MAAM,IAAI,eAAW,GAAA,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAC7B,GACJ;AAER;AChFO,SAASC,GAAc,EAAE,OAAAxK,IAAQ,gBAAgB,UAAAkK,GAAU,GAAGxQ,KAA6B;AAC9F,QAAM,EAAE,aAAAyQ,GAAa,WAAAf,GAAW,cAAAE,GAAc,QAAAK,EAAA,IAAWV,GAAA;AACzD,SAAI,CAACkB,KAAef,KAAaE,IAAqB,OAElD,gBAAA9Q;AAAA,IAACsG;AAAA,IAAA;AAAA,MACG,SAAS,YAAY;AACjB,QAAAoL,IAAW,MAAMP,GAAQ;AAAA,MAC7B;AAAA,MACC,GAAGjQ;AAAA,MAEH,UAAAsG;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;ACvBO,SAASyK,GAAI,EAAE,MAAA9N,IAAO,MAAM,WAAAjF,GAAW,UAAA+B,GAAU,GAAGC,KAAmB;AAC1E,SACI,gBAAAlB,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,KAAKA,GAAOiE,CAAI,GAAGjF,CAAS,GAAI,GAAGgC,GACxD,UAAAD,EAAA,CACL;AAER;;;GCiDMiR,KAAgBC,GAAgC,IAAI;AAgBnD,SAASC,GAAe,EAAE,UAAAnR,KAAiC;AAC9D,QAAM,CAACoR,GAAOC,CAAQ,IAAI9S,EAAuB,CAAA,CAAE,GAC7C+S,IAAU1K,EAAO,CAAC,GAElB2K,IAAS7S,EAAY,OACvB4S,EAAQ,WAAW,GACZ,SAASA,EAAQ,OAAO,KAChC,CAAA,CAAE,GAECvG,IAAQrM,EAAY,CAACC,MAAqB;AAC5C,IAAA0S,EAAS,CAAC7P,MAAYA,EAAQ,OAAO,CAACqJ,MAAUA,EAAM,OAAOlM,CAAE,CAAC;AAAA,EACpE,GAAG,CAAA,CAAE,GAEC6S,IAAW9S,EAAY,MAAY;AACrC,IAAA2S,EAAS,CAAA,CAAE;AAAA,EACf,GAAG,CAAA,CAAE,GAEClS,IAAOT;AAAA,IACT,CAACwJ,MAAsC;AACnC,YAAMvJ,IAAK4S,EAAA;AACX,aAAAF,EAAS,CAAC7P,MAAY,CAAC,GAAGA,GAAS,EAAE,MAAM,WAAW,IAAA7C,GAAI,SAAAuJ,EAAA,CAAS,CAAC,GAC7DvJ;AAAA,IACX;AAAA,IACA,CAAC4S,CAAM;AAAA,EAAA,GAGLE,IAAU/S;AAAA,IACZ,CAACwJ,MAAyC;AACtC,YAAMvJ,IAAK4S,EAAA;AACX,aAAAF,EAAS,CAAC7P,MAAY,CAAC,GAAGA,GAAS,EAAE,MAAM,WAAW,IAAA7C,GAAI,SAAAuJ,EAAA,CAAS,CAAC,GAC7DvJ;AAAA,IACX;AAAA,IACA,CAAC4S,CAAM;AAAA,EAAA,GAGLG,IAAMlO;AAAA,IACR,OAAO,EAAE,MAAArE,GAAM,SAAAsS,GAAS,OAAA1G,GAAO,UAAAyG,EAAA;AAAA,IAC/B,CAACrS,GAAMsS,GAAS1G,GAAOyG,CAAQ;AAAA,EAAA;AAGnC,SACI,gBAAAlS,EAAC2R,GAAc,UAAd,EAAuB,OAAOS,GAC1B,UAAA;AAAA,IAAA1R;AAAA,IACD,gBAAAjB,EAAC,OAAA,EAAI,WAAWE,GAAO,OAClB,UAAAmS,EAAM;AAAA,MAAI,CAACvG,MACRA,EAAM,SAAS,8BACV8G,IAAA,EAA4B,OAAA9G,GAAc,OAAAE,EAAA,GAAxBF,EAAM,EAAgC,IAEzD,gBAAA9L,EAAC6S,MAA4B,OAAA/G,GAAc,OAAAE,EAAA,GAAxBF,EAAM,EAAgC;AAAA,IAAA,EAEjE,CACJ;AAAA,EAAA,GACJ;AAER;AAOA,SAAS8G,GAAa,EAAE,OAAA9G,GAAO,OAAAE,KAA4B;AACvD,QAAM,EAAE,SAAA7C,GAAS,IAAAvJ,EAAA,IAAOkM;AAKxB,SACI,gBAAA9L;AAAA,IAACgK;AAAA,IAAA;AAAA,MACG,MAAI;AAAA,MACJ,SAPY,MAAY;AAC5B,QAAAb,EAAQ,UAAA,GACR6C,EAAMpM,CAAE;AAAA,MACZ;AAAA,MAKQ,OAAOuJ,EAAQ;AAAA,MACf,MAAMA,EAAQ;AAAA,MACd,iBAAiBA,EAAQ;AAAA,MACzB,YAAYA,EAAQ;AAAA,MACpB,iBAAiBA,EAAQ;AAAA,MAExB,UAAAA,EAAQ;AAAA,IAAA;AAAA,EAAA;AAGrB;AAOA,SAAS0J,GAAa,EAAE,OAAA/G,GAAO,OAAAE,KAA4B;AACvD,QAAM,EAAE,SAAA7C,GAAS,IAAAvJ,EAAA,IAAOkM,GAClB,CAACvF,GAASuM,CAAU,IAAItT,EAAS,EAAK,GAEtCuT,IAAgB,YAA2B;AAC7C,QAAI;AACA,MAAAD,EAAW,EAAI,GACf,MAAM3J,EAAQ,YAAA;AAAA,IAClB,UAAA;AACI,MAAA2J,EAAW,EAAK,GAChB9G,EAAMpM,CAAE;AAAA,IACZ;AAAA,EACJ,GAEMoT,IAAe,MAAY;AAC7B,IAAA7J,EAAQ,WAAA,GACR6C,EAAMpM,CAAE;AAAA,EACZ;AAEA,SACI,gBAAAI;AAAA,IAACyK;AAAA,IAAA;AAAA,MACG,MAAI;AAAA,MACJ,OAAOtB,EAAQ,SAAS;AAAA,MACxB,aAAaA,EAAQ;AAAA,MACrB,cAAcA,EAAQ;AAAA,MACtB,aAAaA,EAAQ;AAAA,MACrB,SAASA,EAAQ,SAAS,WAAW;AAAA,MACrC,SAAA5C;AAAA,MACA,WAAWwM;AAAA,MACX,UAAUC;AAAA,IAAA;AAAA,EAAA;AAGtB;AAWO,SAASC,KAAuB;AACnC,QAAMN,IAAMO,GAAWhB,EAAa;AACpC,MAAIS,MAAQ;AACR,UAAM,IAAI,MAAM,kDAAkD;AAEtE,SAAOA;AACX;;;;;;;;;;;;AC7LO,SAASQ,GAAO;AAAA,EACnB,MAAAC;AAAA,EACA,KAAAC;AAAA,EACA,SAAA1R;AAAA,EACA,QAAAE,IAAS;AAAA,EACT,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,WAAA7C;AAAA,EACA,GAAGgC;AACP,GAAgB;AACZ,SACI,gBAAAX;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAO4B,CAAI;AAAA,QACXD,KAAU3B,GAAO;AAAA,QACjB6B,KAAY7B,GAAO;AAAA,QACnBhB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEH,UAAA;AAAA,QAAAkS,KAAQ,gBAAApT,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAO,UAAAkT,GAAK;AAAA,QAC3CC,KAAO,gBAAArT,EAAC,OAAA,EAAI,WAAWE,GAAO,KAAM,UAAAmT,GAAI;AAAA,QACxC1R,KAAW,gBAAA3B,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAyB,EAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjE;;;GC5BM2R,KAAsB,KACtBC,KAAkB,KAClBC,KAAqB;AAE3B,SAASC,GAAMC,GAAmB;AAC9B,SAAIA,IAAI,IAAU,IACdA,IAAI,IAAU,IACXA;AACX;AAEA,SAASC,KAAuC;AAC5C,MAAIC,IAAwB,EAAE,OAAO,GAAG,QAAQ,GAAA;AAChD,QAAMC,wBAAgB,IAAA;AACtB,MAAIC,IAAsD,MACtDC,IAAkD;AAEtD,QAAMC,IAAO,MAAY;AACrB,eAAWC,KAAYJ,EAAW,CAAAI,EAASL,CAAK;AAAA,EACpD,GAEMM,IAAS,CAACpU,MAAwC;AACpD,IAAA8T,IAAQ,EAAE,GAAGA,GAAO,GAAG9T,EAAA,GACvBkU,EAAA;AAAA,EACJ,GAEMG,IAAc,MAAY;AAC5B,IAAIL,MAAiB,SACjB,cAAcA,CAAY,GAC1BA,IAAe;AAAA,EAEvB,GAEMM,IAAY,MAAY;AAC1B,IAAIL,MAAc,SACd,aAAaA,CAAS,GACtBA,IAAY;AAAA,EAEpB,GAEMM,IAAM,CAACC,MAA0B;AACnC,UAAM7R,IAAUmR,EAAM;AACtB,QAAInR,KAAW8Q,GAAiB;AAChC,UAAMgB,IAAOD,MAAW,IAAI7R,KAAW,MAAM;AAC7C,IAAAyR,EAAO,EAAE,OAAO,KAAK,IAAIT,GAAMhR,IAAU8R,CAAI,GAAGhB,EAAe,GAAG;AAAA,EACtE;AAkCA,SAAO,EAAE,OAhCK,MAAY;AAEtB,IADAa,EAAA,GACI,CAAAR,EAAM,WACVM,EAAO,EAAE,QAAQ,IAAM,OAAON,EAAM,QAAQ,IAAIA,EAAM,QAAQ,KAAA,CAAM,GACpEO,EAAA,GACAL,IAAe,YAAY,MAAMO,EAAA,GAAOf,EAAmB;AAAA,EAC/D,GA0BgB,MAxBH,MAAY;AACrB,IAAAa,EAAA,GACAC,EAAA,GACAF,EAAO,EAAE,OAAO,GAAG,QAAQ,IAAM,GACjCH,IAAY,WAAW,MAAM;AACzB,MAAAG,EAAO,EAAE,QAAQ,IAAO,OAAO,GAAG,GAClCH,IAAY;AAAA,IAChB,GAAGP,EAAkB;AAAA,EACzB,GAgBsB,KAdV,CAACE,MAAoB;AAC7B,IAAAU,EAAA;AACA,UAAMrV,IAAQ0U,GAAMC,CAAC;AACrB,IAAAQ,EAAO,EAAE,OAAAnV,GAAO,QAAQA,IAAQ,IAAI,KAAO6U,EAAM,QAAQ;AAAA,EAC7D,GAU2B,KAAAS,GAAK,WARd,CAACJ,OACfJ,EAAU,IAAII,CAAQ,GACtBA,EAASL,CAAK,GACP,MAAM;AACT,IAAAC,EAAU,OAAOI,CAAQ;AAAA,EAC7B,GAG4B;AACpC;AAYO,MAAMO,KAAiCb,GAAA;AAmBvC,SAASc,GAAa,EAAE,OAAAC,GAAO,QAAAC,IAAS,GAAG,WAAAzV,KAAgC;AAC9E,QAAM,CAAC0U,GAAOgB,CAAQ,IAAIpV,EAAyB,EAAE,OAAO,GAAG,QAAQ,IAAO;AAI9E,MAFAqD,EAAU,MAAM2R,GAAU,UAAUI,CAAQ,GAAG,CAAA,CAAE,GAE7C,CAAChB,EAAM,OAAQ,QAAO;AAE1B,QAAMjQ,IAAuB;AAAA,IACzB,OAAO,GAAG,KAAK,MAAMiQ,EAAM,QAAQ,GAAG,CAAC;AAAA,IACvC,QAAQ,GAAGe,CAAM;AAAA,IACjB,YAAYD,KAAS;AAAA,EAAA;AAGzB,SACI,gBAAA1U;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAGC,GAAO,KAAKhB,CAAS;AAAA,MACnC,OAAAyE;AAAA,MACA,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAe,KAAK,MAAMiQ,EAAM,QAAQ,GAAG;AAAA,IAAA;AAAA,EAAA;AAGvD;;;;;;;;;;;;;;ACpIO,SAASiB,GAAK;AAAA,EACjB,OAAAjU;AAAA,EACA,SAAAkU;AAAA,EACA,aAAAjU;AAAA,EACA,SAAAc;AAAA,EACA,SAAAoT;AAAA,EACA,QAAAzR;AAAA,EACA,QAAA0R,IAAS;AAAA,EACT,WAAA9V;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAc;AACV,QAAMgG,IAAYtG,KAASkU,KAAWjU,KAAec;AACrD,SACI,gBAAApB,EAAC,QAAA,EAAK,WAAWN,EAAGC,GAAO,MAAM8U,KAAU9U,GAAO,QAAQhB,CAAS,GAAI,GAAGgC,GACrE,UAAA;AAAA,IAAAgG,KACG,gBAAA3G,EAAC,UAAA,EAAO,WAAWL,GAAO,QACtB,UAAA;AAAA,MAAA,gBAAAK,EAAC,OAAA,EAAI,WAAWL,GAAO,YAClB,UAAA;AAAA,QAAA4U,KAAW,gBAAA9U,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAA4U,GAAQ;AAAA,QACpDlU,KAAS,gBAAAZ,EAAC,MAAA,EAAG,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,QAC7CC,KAAe,gBAAAb,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,UAAAW,EAAA,CAAY;AAAA,MAAA,GACnE;AAAA,MACCc,KAAW,gBAAA3B,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAyB,EAAA,CAAQ;AAAA,IAAA,GACzD;AAAA,IAEHoT,KAAW,gBAAA/U,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAA6U,GAAQ;AAAA,IACrD,gBAAA/U,EAAC,OAAA,EAAI,WAAWE,GAAO,SAAU,UAAAe,GAAS;AAAA,IACzCqC,KAAU,gBAAAtD,EAAC,UAAA,EAAO,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,EAAA,GACzD;AAER;;;;;;;;;;;AC3CA,SAAS2R,GAAWC,GAAcC,GAAoBC,GAAsC;AACxF,QAAMC,IAAaD,IAAW;AAC9B,MAAID,KAAcE;AACd,WAAO,MAAM,KAAK,EAAE,QAAQF,KAAc,CAACG,GAAGvJ,MAAMA,IAAI,CAAC;AAE7D,QAAMwJ,IAAQ,KAAK,IAAI,GAAGL,IAAO,KAAK,MAAME,IAAW,CAAC,CAAC,GACnDI,IAAM,KAAK,IAAIL,IAAa,GAAGI,IAAQH,IAAW,CAAC,GACnDK,IAA4B,CAAC,CAAC;AACpC,EAAIF,IAAQ,KAAGE,EAAM,KAAK,KAAK;AAC/B,WAAS1J,IAAIwJ,GAAOxJ,KAAKyJ,GAAKzJ,IAAK,CAAA0J,EAAM,KAAK1J,CAAC;AAC/C,SAAIyJ,IAAML,IAAa,KAAGM,EAAM,KAAK,KAAK,GAC1CA,EAAM,KAAKN,CAAU,GACdM;AACX;AAKO,SAASC,GAAW;AAAA,EACvB,MAAAR;AAAA,EACA,YAAAC;AAAA,EACA,cAAAQ;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC,IAAkB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EAClC,YAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,WAAA9W;AACJ,GAAoB;AAChB,QAAM+W,IAAQxR;AAAA,IACV,MAAMwQ,GAAWC,GAAMC,GAAYa,CAAY;AAAA,IAC/C,CAACd,GAAMC,GAAYa,CAAY;AAAA,EAAA;AAGnC,SAAIb,KAAc,KAAK,CAACU,IAAyB,yBAG5C,OAAA,EAAI,WAAW5V,EAAGC,GAAO,SAAShB,CAAS,GACxC,UAAA;AAAA,IAAA,gBAAAc,EAAC,SAAI,WAAWE,GAAO,SAClB,UAAA,OAAO6V,KAAe,WACjB,GAAGA,CAAU,aAAaA,MAAe,IAAI,KAAK,GAAG,KACrD,UAAUb,CAAI,OAAOC,CAAU,GAAA,CACzC;AAAA,IACA,gBAAA5U,EAAC,OAAA,EAAI,WAAWL,GAAO,UACnB,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,SAAS,MAAMyV,EAAa,KAAK,IAAI,GAAGT,IAAO,CAAC,CAAC;AAAA,UACjD,UAAUA,KAAQ;AAAA,UAClB,cAAW;AAAA,UACd,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGAe,EAAM;AAAA,QAAI,CAACnK,GAAO3F,MACf2F,MAAU,QACN,gBAAA9L;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,WAAWC,EAAGC,GAAO,UAAUA,GAAO,OAAO;AAAA,YAChD,UAAA;AAAA,UAAA;AAAA,UAFQ,YAAYiG,CAAK;AAAA,QAAA,IAM1B,gBAAAnG;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YAEL,WAAWC;AAAA,cACPC,GAAO;AAAA,cACPA,GAAO;AAAA,cACP4L,MAAUoJ,KAAQhV,GAAO;AAAA,YAAA;AAAA,YAE7B,SAAS,MAAMyV,EAAa7J,CAAK;AAAA,YACjC,gBAAcA,MAAUoJ,IAAO,SAAS;AAAA,YAEvC,UAAApJ;AAAA,UAAA;AAAA,UATIA;AAAA,QAAA;AAAA,MAUT;AAAA,MAGR,gBAAA9L;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,SAAS,MAAMyV,EAAa,KAAK,IAAIR,GAAYD,IAAO,CAAC,CAAC;AAAA,UAC1D,UAAUA,KAAQC;AAAA,UAClB,cAAW;AAAA,UACd,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGAU,KACG,gBAAA7V;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWE,GAAO;AAAA,UAClB,OAAO0V;AAAA,UACP,UAAU,CAAC/Q,MAAUgR,EAAiB,OAAOhR,EAAM,OAAO,KAAK,CAAC;AAAA,UAChE,cAAW;AAAA,UAEV,YAAgB,IAAI,CAACqR,MAClB,gBAAA3V,EAAC,UAAA,EAAiB,OAAO2V,GACpB,UAAA;AAAA,YAAAA;AAAA,YAAI;AAAA,UAAA,EAAA,GADIA,CAEb,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IACL,EAAA,CAER;AAAA,EAAA,GACJ;AAER;;;;;;;;;;;;;;;;;;;;;GC5FMC,KAA0B,CAAC,eAAe,SAAS,YAAY,SAAS,WAAW;AAElF,SAASC,GAAyBrX,GAAiC;AACtE,MAAI,CAACA,EAAO,QAAO;AACnB,MAAIsX,IAAQ;AACZ,SAAItX,EAAM,UAAU,MAAGsX,KAAS,IAC5BtX,EAAM,UAAU,OAAIsX,KAAS,IAC7B,QAAQ,KAAKtX,CAAK,KAAK,QAAQ,KAAKA,CAAK,MAAGsX,KAAS,IACrD,QAAQ,KAAKtX,CAAK,MAAGsX,KAAS,IAC9B,eAAe,KAAKtX,CAAK,MAAGsX,KAAS,IAClC,KAAK,IAAI,GAAGA,CAAK;AAC5B;AAQO,MAAMC,KAAgB/O;AAAA,EACzB,SACI;AAAA,IACI,OAAAC;AAAA,IACA,YAAAY;AAAA,IACA,OAAAC;AAAA,IACA,MAAAlE,IAAO;AAAA,IACP,cAAAoS,IAAe;AAAA,IACf,UAAAC;AAAA,IACA,gBAAAC,IAAiBN;AAAA,IACjB,cAAAO,IAAe,EAAE,MAAM,iBAAiB,MAAM,iBAAA;AAAA,IAC9C,WAAAxX;AAAA,IACA,OAAAH;AAAA,IACA,cAAAC;AAAA,IACA,GAAG2X;AAAA,EAAA,GAEPhP,GACF;AACE,UAAM,CAACiP,GAAUC,CAAW,IAAIrX,EAAkB,EAAK,GACjDsX,IAAc,OAAQ/X,KAASC,KAAgB,EAAa,GAC5D+X,IACFP,KAAYJ,GAAyBU,CAAW;AAEpD,WACI,gBAAAvW,EAAC,OAAA,EAAI,WAAWN,EAAGC,EAAO,SAASA,EAAOiE,CAAI,GAAGkE,KAASnI,EAAO,OAAOhB,CAAS,GAC5E,UAAA;AAAA,MAAAsI,KAAS,gBAAAxH,EAAC,SAAA,EAAM,WAAWE,EAAO,OAAQ,UAAAsH,GAAM;AAAA,MACjD,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,EAAO,OACnB,UAAA;AAAA,QAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAA2H;AAAA,YACC,GAAGgP;AAAA,YACJ,OAAA5X;AAAA,YACA,cAAAC;AAAA,YACA,MAAM4X,IAAW,SAAS;AAAA,YAC1B,gBAAc,CAAC,CAACvO;AAAA,YAChB,WAAWnI,EAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEtB,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAWE,EAAO;AAAA,YAClB,cAAY0W,IAAWF,EAAa,OAAOA,EAAa;AAAA,YACxD,gBAAcE;AAAA,YACd,SAAS,MAAMC,EAAY,CAACG,MAAO,CAACA,CAAE;AAAA,YAErC,cAAW,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MACvB,GACJ;AAAA,MACCT,KACG,gBAAAhW;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWN,EAAGC,EAAO,UAAUA,EAAO,QAAQ6W,CAAgB,EAAE,CAAC;AAAA,UACjE,cAAYN,EAAeM,CAAgB;AAAA,UAE3C,UAAA;AAAA,YAAA,gBAAA/W,EAAC,OAAA,EAAI,WAAWE,EAAO,aACnB,4BAAC,QAAA,EAAK,OAAO,EAAE,OAAO,GAAI6W,IAAmB,IAAK,GAAG,OAAO,GAChE;AAAA,8BACC,QAAA,EAAK,WAAW7W,EAAO,eACnB,UAAAuW,EAAeM,CAAgB,EAAA,CACpC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGP1O,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,EAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,EAAO,QAAS,aAAW,IAC5C;AAAA,IAAA,GACR;AAAA,EAER;AACJ;;;;;;;;;;;GC3EM+W,KAAU,SACVC,KAAQ,eASDC,KAAW5P,EAA0C,SAC9D;AAAA,EACI,QAAA6P,IAAS;AAAA,EACT,MAAAjJ,IAAO;AAAA,EACP,MAAAhK,IAAO;AAAA,EACP,OAAApF;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAoY;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,OAAA9P;AAAA,EACA,YAAAY;AAAA,EACA,OAAAC;AAAA,EACA,UAAAxB,IAAW;AAAA,EACX,WAAA0Q,IAAY;AAAA,EACZ,IAAA3X;AAAA,EACA,WAAAV;AACJ,GACAyI,GACF;AACE,QAAM6P,IAAapY,EAAA,GACbqY,IAAY7X,KAAM4X,GAClBnY,IAAeN,MAAU,QACzB,CAAC2Y,GAAUC,CAAW,IAAInY,EAAiBR,KAAgB,EAAE,GAC7DyD,IAAUpD,IAAgBN,KAAS,KAAM2Y,GACzCE,IAAQ,MAAM,KAAK,EAAE,QAAAR,EAAA,GAAU,CAAC9B,GAAGnP,MAAU1D,EAAQ0D,CAAK,KAAK,EAAE,GACjE0R,IAAYhQ,EAAoC,EAAE,GAClDiQ,IAAU3J,MAAS,YAAY8I,KAAUC;AAE/C,EAAArU,EAAU,MAAM;AACZ,IAAI0U,KAAWM,EAAU,QAAQ,CAAC,GAAG,MAAA;AAAA,EACzC,GAAG,CAACN,CAAS,CAAC;AAEd,QAAMrD,IAAS,CAACpU,MAAuB;AACnC,UAAMiY,IAAUjY,EAAK,MAAM,GAAGsX,CAAM;AACpC,IAAK/X,KAAcsY,EAAYI,CAAO,GACtC9Y,IAAW8Y,CAAO,GACdA,EAAQ,WAAWX,KAAQC,IAAaU,CAAO;AAAA,EACvD,GAEMC,IAAY,CAAC7R,MAAwB;AACvC,UAAM8R,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIb,IAAS,GAAGjR,CAAK,CAAC;AACpD,IAAA0R,EAAU,QAAQI,CAAI,GAAG,MAAA,GACzBJ,EAAU,QAAQI,CAAI,GAAG,OAAA;AAAA,EAC7B,GAEMC,IAAe,CAAC/R,MAAkB,CAACtB,MAAyC;AAC9E,UAAMsT,IAAOtT,EAAM,OAAO,MAAM,MAAM,EAAE;AACxC,QAAIsT,KAAQ,CAACL,EAAQ,KAAKK,CAAI,EAAG;AACjC,UAAMrY,KAAO8X,EAAM,MAAA;AACnB,IAAA9X,GAAKqG,CAAK,IAAIgS,GACdjE,EAAOpU,GAAK,KAAK,EAAE,CAAC,GAChBqY,KAAMH,EAAU7R,IAAQ,CAAC;AAAA,EACjC,GAEMiS,IAAgB,CAACjS,MAAkB,CAACtB,MAA2C;AACjF,QAAIA,EAAM,QAAQ;AACd,UAAI,CAAC+S,EAAMzR,CAAK,KAAKA,IAAQ,GAAG;AAC5B,QAAAtB,EAAM,eAAA;AACN,cAAM/E,IAAO8X,EAAM,MAAA;AACnB,QAAA9X,EAAKqG,IAAQ,CAAC,IAAI,IAClB+N,EAAOpU,EAAK,KAAK,EAAE,CAAC,GACpBkY,EAAU7R,IAAQ,CAAC;AAAA,MACvB;AAAA,UACJ,CAAWtB,EAAM,QAAQ,eACrBA,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC,KACZtB,EAAM,QAAQ,iBACrBA,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC;AAAA,EAE3B,GAEMkS,IAAU,CAACxT,MAAkD;AAC/D,UAAMyT,IAAOzT,EAAM,cACd,QAAQ,MAAM,EACd,MAAM,EAAE,EACR,OAAO,CAAC0T,MAAMT,EAAQ,KAAKS,CAAC,CAAC,EAC7B,KAAK,EAAE;AACZ,IAAKD,MACLzT,EAAM,eAAA,GACNqP,EAAOoE,CAAI,GACXN,EAAU,KAAK,IAAIZ,IAAS,GAAGkB,EAAK,MAAM,CAAC;AAAA,EAC/C;AAEA,SACI,gBAAA/X;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAAoH;AAAA,MACA,WAAW1H,EAAGC,GAAO,SAASmI,KAASnI,GAAO,OAAOhB,CAAS;AAAA,MAC9D,IAAIuY;AAAA,MAEH,UAAA;AAAA,QAAAjQ,KAAS,gBAAAxH,EAAC,SAAA,EAAM,WAAWE,GAAO,OAAQ,UAAAsH,GAAM;AAAA,0BAChD,OAAA,EAAI,WAAWvH,EAAGC,GAAO,OAAOA,GAAOiE,CAAI,CAAC,GAAG,MAAK,SAAQ,cAAYqD,GACpE,YAAM,IAAI,CAACgR,GAAMrS,MACd,gBAAAnG;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,KAAK,CAAC+H,MAAS;AACX,cAAA8P,EAAU,QAAQ1R,CAAK,IAAI4B;AAAA,YAC/B;AAAA,YACA,MAAMuP,IAAS,aAAa;AAAA,YAC5B,WAAWnJ,MAAS,YAAY,YAAY;AAAA,YAC5C,cAAchI,MAAU,IAAI,kBAAkB;AAAA,YAC9C,WAAW;AAAA,YACX,OAAOqS;AAAA,YACP,UAAA3R;AAAA,YACA,WAAW3G,GAAO;AAAA,YAClB,cAAY,UAAUiG,IAAQ,CAAC;AAAA,YAC/B,gBAAc,CAAC,CAACkC;AAAA,YAChB,UAAU6P,EAAa/R,CAAK;AAAA,YAC5B,WAAWiS,EAAcjS,CAAK;AAAA,YAC9B,SAAAkS;AAAA,UAAA;AAAA,UAfKlS;AAAA,QAAA,CAiBZ,GACL;AAAA,QACCkC,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,GAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,GAAO,QAAS,aAAW,IAC5C;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGhB,CAAC;;;;;;;;;ACzIM,SAASuY,GAAQ;AAAA,EACpB,SAAA9M;AAAA,EACA,UAAA1K;AAAA,EACA,WAAAoK,IAAY;AAAA,EACZ,MAAAjL;AAAA,EACA,cAAAsY;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAzO,IAAa;AAAA,EACb,qBAAA0O,IAAsB;AAAA,EACtB,WAAA1Z;AACJ,GAAiB;AACb,QAAMG,IAAee,MAAS,QACxB,CAACd,GAAcC,CAAe,IAAIC,EAAkBmZ,CAAW,GAC/D9Y,IAASR,IAAee,IAAOd,GAC/BM,IAAKR,EAAA,GACLkK,IAAUzB,EAAwB,IAAI,GAEtCxC,IAAU1F;AAAA,IACZ,CAACG,MAAwB;AACrB,MAAKT,KAAcE,EAAgBO,CAAI,GACvC4Y,IAAe5Y,CAAI;AAAA,IACvB;AAAA,IACA,CAACT,GAAcqZ,CAAY;AAAA,EAAA;AAG/B,EAAA7V,EAAU,MAAM;AACZ,QAAI,CAAChD,EAAQ;AACb,UAAMoM,IAAQ,CAACpH,MAA+B;AAC1C,MAAIqF,KAAcrF,EAAM,QAAQ,cAAkB,EAAK;AAAA,IAC3D,GACMkF,IAAS,CAAClF,MAA4B;AACxC,MAAK+T,KACDtP,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,KACjEQ,EAAQ,EAAK;AAAA,IAErB;AACA,kBAAO,iBAAiB,WAAW4G,CAAK,GACxC,OAAO,iBAAiB,aAAalC,CAAM,GACpC,MAAM;AACT,aAAO,oBAAoB,WAAWkC,CAAK,GAC3C,OAAO,oBAAoB,aAAalC,CAAM;AAAA,IAClD;AAAA,EACJ,GAAG,CAAClK,GAAQqK,GAAY0O,GAAqBvT,CAAO,CAAC;AAErD,QAAM8G,IAAqB,CAACtH,MAAkC;AAC1D,IAAA8G,EAAQ,MAAM,UAAU9G,CAAK,GAC7BQ,EAAQ,CAACxF,CAAM;AAAA,EACnB,GAEMuM,IAAe;AAAA,IACjB,GAAGT;AAAA,IACH,OAAO;AAAA,MACH,GAAGA,EAAQ;AAAA,MACX,SAASQ;AAAA,MACT,iBAAiBtM;AAAA,MACjB,iBAAiBD;AAAA,IAAA;AAAA,EACrB;AAGJ,2BACK,QAAA,EAAK,KAAK0J,GAAS,WAAWpJ,GAAO,MACjC,UAAA;AAAA,IAAAkM;AAAA,IACAvM,KACG,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAAJ;AAAA,QACA,MAAK;AAAA,QACL,WAAWK,EAAGC,GAAO,SAASA,GAAOmL,CAAS,GAAGnM,CAAS;AAAA,QAEzD,UAAA+B;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GAER;AAER;;;;;;;;;;;;ACvFO,SAAS4X,GAAS;AAAA,EACrB,OAAA9Z,IAAQ;AAAA,EACR,KAAA+Z,IAAM;AAAA,EACN,SAAApY,IAAU;AAAA,EACV,eAAA+G,IAAgB;AAAA,EAChB,WAAAsR,IAAY;AAAA,EACZ,OAAAvR;AAAA,EACA,WAAAtI;AACJ,GAAkB;AACd,QAAM8Z,IAAMvR,IAAgB,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM1I,IAAQ+Z,IAAO,GAAG,CAAC;AAE9E,2BACK,OAAA,EAAI,WAAW7Y,EAAGC,GAAO,SAAShB,CAAS,GACtC,UAAA;AAAA,KAAA6Z,KAAavR,MACX,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,GAAO,OAClB,UAAA;AAAA,MAAAsH,KAAS,gBAAAxH,EAAC,UAAM,UAAAwH,EAAA,CAAM;AAAA,MACtBuR,KAAa,CAACtR,KAAiB,gBAAAlH,EAAC,QAAA,EAAM,UAAA;AAAA,QAAA,KAAK,MAAMyY,CAAG;AAAA,QAAE;AAAA,MAAA,EAAA,CAAC;AAAA,IAAA,GAC5D;AAAA,IAEJ,gBAAAhZ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe8Y;AAAA,QACf,iBAAerR,IAAgB,SAAY1I;AAAA,QAC3C,WAAWkB,EAAGC,GAAO,KAAKuH,KAAiBvH,GAAO,aAAa;AAAA,QAE/D,UAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWC,EAAGC,GAAO,MAAMQ,MAAY,aAAaR,GAAOQ,CAAO,CAAC;AAAA,YACnE,OAAO,EAAE,OAAO+G,IAAgB,SAAY,GAAGuR,CAAG,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MAC1D;AAAA,IAAA;AAAA,EACJ,GACJ;AAER;;;;;;;;;;;GCzCMC,KAAoB9G,GAA6C,IAAI,GAa9D+G,KAAQ3R,EAAyC,SAC1D;AAAA,EACI,OAAAC;AAAA,EACA,aAAA3G;AAAA,EACA,OAAA9B;AAAA,EACA,UAAA8H;AAAA,EACA,MAAA/C;AAAA,EACA,SAAAqV;AAAA,EACA,UAAAla;AAAA,EACA,kBAAAyI;AAAA,EACA,WAAAxI;AAAA,EACA,GAAGgC;AACP,GACAyG,GACF;AACE,QAAMyR,IAAQlG,GAAW+F,EAAiB,GACpCI,IAAeD,GAAO,QAAQtV,GAC9BwV,IAAmBF,GAAO,YAAYvS,GACtC0S,IAAYH,IAAQA,EAAM,UAAUra,IAAQoa;AAElD,WAASK,EAAa3U,GAA4C;AAC9D,IAAIuU,KAAOA,EAAM,WAAWra,CAAK,GACjCE,IAAW4F,CAAK;AAAA,EACpB;AAEA,SACI,gBAAAtE;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN,EAAGC,GAAO,SAASoZ,KAAoBpZ,GAAO,UAAUwH,CAAgB;AAAA,MAEnF,UAAA;AAAA,QAAA,gBAAA1H;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAA2H;AAAA,YACA,MAAK;AAAA,YACL,MAAM0R;AAAA,YACN,OAAAta;AAAA,YACA,SAASwa;AAAA,YACT,UAAUD;AAAA,YACV,UAAUE;AAAA,YACV,WAAWvZ,EAAGC,GAAO,OAAOhB,CAAS;AAAA,YACpC,GAAGgC;AAAA,UAAA;AAAA,QAAA;AAAA,0BAEP,QAAA,EAAK,WAAWhB,GAAO,KAAK,eAAW,IAAC;AAAA,SACvCsH,KAAS3G,MACP,gBAAAN,EAAC,QAAA,EAAK,WAAWL,GAAO,WACnB,UAAA;AAAA,UAAAsH,KAAS,gBAAAxH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAsH,GAAM;AAAA,UAC/C3G,KAAe,gBAAAb,EAAC,QAAA,EAAK,WAAWE,GAAO,aAAc,UAAAW,EAAA,CAAY;AAAA,QAAA,EAAA,CACtE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhB,CAAC;AAuBM,SAAS4Y,GAAW;AAAA,EACvB,OAAA1a;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAA6E;AAAA,EACA,UAAA+C;AAAA,EACA,YAAA6S,IAAa;AAAA,EACb,WAAAxa;AAAA,EACA,UAAA+B;AACJ,GAAoB;AAChB,QAAM0Y,IAAgBva,EAAA,GAChBia,IAAevV,KAAQ6V,GAEvB,CAACjC,GAAUC,CAAW,IAAInY,EAA6BR,CAAY,GACnEK,IAAeN,MAAU,QACzB0D,IAAUpD,IAAeN,IAAQ2Y;AAEvC,WAAS8B,EAAa1Z,GAAoB;AACtC,IAAKT,KAAcsY,EAAY7X,CAAI,GACnCb,IAAWa,CAAI;AAAA,EACnB;AAEA,SACI,gBAAAE;AAAA,IAACiZ,GAAkB;AAAA,IAAlB;AAAA,MACG,OAAO,EAAE,MAAMI,GAAc,OAAO5W,GAAS,UAAU+W,GAAc,UAAA3S,EAAA;AAAA,MAErE,UAAA,gBAAA7G;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWC,EAAGC,GAAO,OAAOwZ,KAAcxZ,GAAO,YAAYhB,CAAS;AAAA,UAErE,UAAA+B;AAAA,QAAA;AAAA,MAAA;AAAA,IACL;AAAA,EAAA;AAGZ;;;;;;;;;;;AC1GO,SAAS2Y,GAAY;AAAA,EACxB,OAAA7a;AAAA,EACA,UAAAE;AAAA,EACA,KAAA4a,IAAM;AAAA,EACN,KAAAf,IAAM;AAAA,EACN,MAAAvE,IAAO;AAAA,EACP,OAAA/M;AAAA,EACA,YAAAY;AAAA,EACA,UAAAvB,IAAW;AAAA,EACX,aAAAiT;AAAA,EACA,WAAA5a;AACJ,GAAqB;AACjB,QAAM,CAAC6a,GAAKC,CAAI,IAAIjb,GACd0W,IAAQqD,IAAMe,GAEdI,IAAWxV,EAAQ,OAAQsV,IAAMF,KAAOpE,IAAS,KAAK,CAACsE,GAAKF,GAAKpE,CAAK,CAAC,GACvEyE,IAAYzV,EAAQ,OAAQuV,IAAOH,KAAOpE,IAAS,KAAK,CAACuE,GAAMH,GAAKpE,CAAK,CAAC,GAE1E0E,IAAYL,IAAc/a,CAAK,KAAK,GAAGgb,CAAG,MAAMC,CAAI,IAEpDI,IAAYza;AAAA,IACd,CAACkF,MAAqD;AAClD,YAAM/E,IAAO,KAAK,IAAI,OAAO+E,EAAM,OAAO,KAAK,GAAGmV,CAAI;AACtD,MAAA/a,EAAS,CAACa,GAAMka,CAAI,CAAC;AAAA,IACzB;AAAA,IACA,CAACA,GAAM/a,CAAQ;AAAA,EAAA,GAGbob,IAAa1a;AAAA,IACf,CAACkF,MAAqD;AAClD,YAAM/E,IAAO,KAAK,IAAI,OAAO+E,EAAM,OAAO,KAAK,GAAGkV,CAAG;AACrD,MAAA9a,EAAS,CAAC8a,GAAKja,CAAI,CAAC;AAAA,IACxB;AAAA,IACA,CAACia,GAAK9a,CAAQ;AAAA,EAAA;AAGlB,2BACK,OAAA,EAAI,WAAWgB,EAAGC,GAAO,SAAShB,CAAS,GACvC,UAAA;AAAA,IAAAsI,KACG,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,GAAO,OACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,UAAM,UAAAwH,EAAA,CAAM;AAAA,MACb,gBAAAxH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAia,EAAA,CAAU;AAAA,IAAA,GAC9C;AAAA,IAEJ,gBAAA5Z,EAAC,OAAA,EAAI,WAAWL,GAAO,OACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAA,CAAO;AAAA,MAC9B,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWE,GAAO;AAAA,UAClB,OAAO,EAAE,MAAM,GAAG+Z,CAAQ,KAAK,OAAO,GAAG,MAAMC,CAAS,IAAA;AAAA,QAAI;AAAA,MAAA;AAAA,MAEhE,gBAAAla;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,KAAA2Z;AAAA,UACA,KAAAf;AAAA,UACA,MAAAvE;AAAA,UACA,OAAOwF;AAAA,UACP,UAAUK;AAAA,UACV,UAAAvT;AAAA,UACA,cAAYW,IAAQ,GAAGA,CAAK,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9C,gBAAAxH;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,KAAA2Z;AAAA,UACA,KAAAf;AAAA,UACA,MAAAvE;AAAA,UACA,OAAOyF;AAAA,UACP,UAAUK;AAAA,UACV,UAAAxT;AAAA,UACA,cAAYW,IAAQ,GAAGA,CAAK,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9C,GACJ;AAAA,IACCY,KAAc,gBAAApI,EAAC,QAAA,EAAK,WAAWE,GAAO,QAAS,UAAAkI,EAAA,CAAW;AAAA,EAAA,GAC/D;AAER;;;;;;;;;;;AC7EO,SAASkS,GAAY;AAAA,EACxB,OAAAvb;AAAA,EACA,KAAA+Z,IAAM;AAAA,EACN,UAAA7Z;AAAA,EACA,MAAAkF,IAAO;AAAA,EACP,UAAAoW,IAAW;AAAA,EACX,UAAA1T,IAAW;AAAA,EACX,OAAAW,IAAQ;AAAA,EACR,WAAAtI;AACJ,GAAqB;AACjB,QAAM,CAACsb,GAAOC,CAAQ,IAAIjb,EAAiB,CAAC,GACtCkb,IAAYF,IAAQ,IAAIA,IAAQzb,GAEhC4b,IAAc,CAAC7a,MAAuB;AACxC,IAAIya,KAAY1T,KAChB5H,IAAWa,CAAI;AAAA,EACnB;AAEA,SACI,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAYwH;AAAA,MACZ,WAAWvH;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOiE,CAAI;AAAA,QACX0C,KAAY3G,GAAO;AAAA,QACnBqa,KAAYra,GAAO;AAAA,QACnBhB;AAAA,MAAA;AAAA,MAEJ,cAAc,MAAMub,EAAS,CAAC;AAAA,MAE7B,UAAA,MAAM,KAAK,EAAE,QAAQ3B,KAAO,CAACxD,GAAGvJ,MAAM;AACnC,cAAM6O,IAAY7O,IAAI,GAChB8O,IAASD,KAAaF;AAC5B,eACI,gBAAA1a;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAcjB,MAAU6b;AAAA,YACxB,cAAY,GAAGA,CAAS,IAAIA,MAAc,IAAI,YAAY,UAAU;AAAA,YACpE,WAAW3a,EAAGC,GAAO,MAAM2a,KAAU3a,GAAO,MAAM;AAAA,YAClD,UAAA2G;AAAA,YACA,cAAc,MAAM,CAAC0T,KAAY,CAAC1T,KAAY4T,EAASG,CAAS;AAAA,YAChE,SAAS,MAAMD,EAAYC,CAAS;AAAA,YAEpC,UAAA,gBAAA5a,EAAC8a,MAAS,QAAAD,EAAA,CAAgB;AAAA,UAAA;AAAA,UAVrBD;AAAA,QAAA;AAAA,MAajB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGb;AAEA,SAASE,GAAS,EAAE,QAAAD,KAA+B;AAC/C,SACI,gBAAA7a;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAM6a,IAAS,iBAAiB;AAAA,MAChC,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA,MACf,eAAW;AAAA,MAEX,UAAA,gBAAA7a,EAAC,QAAA,EAAK,GAAE,2FAAA,CAA2F;AAAA,IAAA;AAAA,EAAA;AAG/G;AChFA,SAAS+a,GACLtY,GACAM,GACAE,GACA+X,GACAC,GACO;AACP,SAAID,KACa,MAAM,QAAQA,CAAI,IAAIA,IAAO,CAACA,CAAI,GACnC,SAASvY,CAAO,IAE5B,EAAAM,KAAS,CAACkY,EAAQ,MAAMlY,CAAK,KAC7BE,KAAS,CAACgY,EAAQ,MAAMhY,CAAK;AAErC;AAYO,SAASiY,GAAK,EAAE,OAAAnY,GAAO,OAAAE,GAAO,MAAA+X,GAAM,UAAA/Z,KAAkC;AACzE,QAAM+B,IAAKL,GAAA;AACX,SAAKoY,GAAa/X,EAAG,SAASD,GAAOE,GAAO+X,GAAMhY,CAAE,IAC7C/B,IADuD;AAElE;AAaO,SAASka,GAAK,EAAE,OAAApY,GAAO,OAAAE,GAAO,MAAA+X,GAAM,UAAA/Z,KAAkC;AACzE,QAAM+B,IAAKL,GAAA;AACX,SAAIoY,GAAa/X,EAAG,SAASD,GAAOE,GAAO+X,GAAMhY,CAAE,IAAU,OACtD/B;AACX;;;;;;;;GC9CMma,KAA4B,CAAC,OAAO,SAAS,UAAU,MAAM;AAY5D,SAASC,GAAS;AAAA,EACrB,OAAAC,IAAQF;AAAA,EACR,QAAAG,IAAS;AAAA,EACT,WAAArc;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAkB;AACd,SACI,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACPC,GAAO;AAAA,QACPqb,KAAUrb,GAAO;AAAA,QACjBob,EAAM,SAAS,KAAK,KAAKpb,GAAO;AAAA,QAChCob,EAAM,SAAS,OAAO,KAAKpb,GAAO;AAAA,QAClCob,EAAM,SAAS,QAAQ,KAAKpb,GAAO;AAAA,QACnCob,EAAM,SAAS,MAAM,KAAKpb,GAAO;AAAA,QACjChB;AAAA,MAAA;AAAA,MAEJ,cAAYoc,EAAM,KAAK,GAAG;AAAA,MACzB,GAAGpa;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;GClCaua,KAAYjU,EAA6C,SAClE,EAAE,OAAAxI,GAAO,UAAAE,GAAU,SAAAwc,GAAS,kBAAA/T,GAAkB,aAAAS,IAAc,aAAa,WAAAjJ,GAAW,GAAGgC,EAAA,GACvFyG,GACF;AACE,WAAS+T,IAAoB;AACzB,IAAAzc,EAAS,EAAE,GACXwc,IAAA;AAAA,EACJ;AAEA,2BACK,OAAA,EAAI,WAAWxb,EAAGC,GAAO,SAASwH,CAAgB,GAC/C,UAAA;AAAA,IAAA,gBAAA1H,EAAC,QAAA,EAAK,WAAWE,GAAO,UAAU,eAAW,IACzC,UAAA,gBAAAF,EAAC2b,MAAW,EAAA,CAChB;AAAA,IACA,gBAAA3b;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAA2H;AAAA,QACA,MAAK;AAAA,QACL,OAAA5I;AAAA,QACA,UAAU,CAAC8F,MAAU5F,EAAS4F,EAAM,OAAO,KAAK;AAAA,QAChD,aAAAsD;AAAA,QACA,WAAWlI,EAAGC,GAAO,OAAOhB,CAAS;AAAA,QACpC,GAAGgC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEPnC,KACG,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,cAAW;AAAA,QACX,SAASwb;AAAA,QAET,4BAACE,IAAA,CAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACf,GAER;AAER,CAAC;AAED,SAASD,KAAa;AAClB,SACI,gBAAApb,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA;AAAA,IAAA,gBAAAP,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,QAAO,gBAAe,aAAY,IAAA,CAAI;AAAA,IACpE,gBAAAA,EAAC,UAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,KAAI,eAAc,QAAA,CAAQ;AAAA,EAAA,GAC1F;AAER;AAEA,SAAS4b,KAAY;AACjB,SACI,gBAAA5b,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAEtB;AAER;;;;;;;;;;;;AC9BO,SAAS6b,GAAiD;AAAA,EAC7D,SAAA1S;AAAA,EACA,OAAApK;AAAA,EACA,UAAAE;AAAA,EACA,MAAAkF,IAAO;AAAA,EACP,WAAAqC,IAAY;AAAA,EACZ,WAAAtH;AAAA,EACA,cAAc4c;AAAA,EACd,GAAG5a;AACP,GAAkC;AAC9B,SACI,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY8b;AAAA,MACZ,WAAW7b,EAAGC,GAAO,OAAOA,GAAOiE,CAAI,GAAGqC,KAAatG,GAAO,WAAWhB,CAAS;AAAA,MACjF,GAAGgC;AAAA,MAEH,UAAAiI,EAAQ,IAAI,CAACH,MAAW;AACrB,cAAM+S,IAAW/S,EAAO,UAAUjK;AAClC,eACI,gBAAAwB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAcwb;AAAA,YACd,UAAU/S,EAAO;AAAA,YACjB,WAAW/I,EAAGC,GAAO,SAAS6b,KAAY7b,GAAO,MAAM;AAAA,YACvD,SAAS,MAAMjB,EAAS+J,EAAO,KAAK;AAAA,YAEnC,UAAA;AAAA,cAAAA,EAAO,QAAQ,gBAAAhJ,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,YAAO,KAAA,CAAK;AAAA,gCAC1D,QAAA,EAAK,WAAWA,GAAO,OAAQ,YAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UATxC8I,EAAO;AAAA,QAAA;AAAA,MAYxB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;AChCO,SAASgT,GAAQ;AAAA,EACpB,QAAAC;AAAA,EACA,OAAApd;AAAA,EACA,OAAAE;AAAA,EACA,UAAAE;AAAA,EACA,QAAAqE;AAAA,EACA,WAAA4Y,IAAY;AAAA,EACZ,OAAA1Z,IAAQ;AAAA,EACR,gBAAA2Z,IAAiB;AAAA,EACjB,WAAAjd;AAAA,EACA,OAAAyE;AAAA,EACA,GAAGzC;AACP,GAAiB;AACb,QAAMkb,IACF,QAAQF,IAAYC,IAAiB3Z,MAAW,WAC1C,GAAG0Z,IAAYC,IAAiB3Z,CAAK,OACrC0Z,IACEC,IACA3Z;AACZ,SACI,gBAAAjC;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWN,EAAGC,GAAO,SAASgc,KAAahc,GAAO,WAAWhB,CAAS;AAAA,MACtE,OAAO,EAAE,OAAOkd,GAAY,GAAGzY,EAAA;AAAA,MAC9B,GAAGzC;AAAA,MAEH,UAAA;AAAA,QAAA+a,KAAU,gBAAAjc,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAA+b,GAAO;AAAA,QAClD,gBAAAjc,EAAC,OAAA,EAAI,WAAWE,GAAO,KAAK,cAAW,qBAClC,UAAArB,EAAM,IAAI,CAACsB,MAAS;AACjB,gBAAMqF,IAASrF,EAAK,QAAQpB;AAC5B,iBACI,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,MAAK;AAAA,cACL,WAAWN,EAAGC,GAAO,MAAMsF,KAAUtF,GAAO,MAAM;AAAA,cAClD,gBAAcsF,IAAS,SAAS;AAAA,cAChC,UAAUrF,EAAK;AAAA,cACf,SAAS,MAAMlB,IAAWkB,EAAK,GAAG;AAAA,cAClC,OACI+b,KAAa,OAAO/b,EAAK,SAAU,WAAWA,EAAK,QAAQ;AAAA,cAG9D,UAAA;AAAA,gBAAAA,EAAK,QAAQ,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,YAAK,KAAA,CAAK;AAAA,gBACtD,CAACgc,KAAa,gBAAAlc,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,YAAK,OAAM;AAAA,gBACzD,CAACgc,KAAa/b,EAAK,UAAU,UAC1B,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAC,EAAK,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAb1CA,EAAK;AAAA,UAAA;AAAA,QAiBtB,CAAC,EAAA,CACL;AAAA,QACCmD,KAAU,gBAAAtD,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG9D;;;;;;ACvFO,SAAS+Y,GAAS,EAAE,SAAA3b,IAAU,QAAQ,OAAA8B,GAAO,QAAAmS,GAAQ,WAAAzV,GAAW,OAAAyE,KAAwB;AAC3F,SACI,gBAAA3D;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,eAAW;AAAA,MACX,WAAWC;AAAA,QACPC,GAAO;AAAA,QACPQ,MAAY,UAAUR,GAAO;AAAA,QAC7BQ,MAAY,YAAYR,GAAO;AAAA,QAC/BhB;AAAA,MAAA;AAAA,MAEJ,OAAO,EAAE,OAAAsD,GAAO,QAAAmS,GAAQ,GAAGhR,EAAA;AAAA,IAAM;AAAA,EAAA;AAG7C;;;;;;;ACJO,SAAS2Y,GAAO,EAAE,MAAAlV,IAAO,QAAQ,WAAAlI,GAAW,GAAGgC,KAAsB;AACxE,SAAO,gBAAAlB,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,QAAQA,GAAOkH,CAAI,GAAGlI,CAAS,GAAI,GAAGgC,EAAA,CAAO;AAClF;;;;;;;;;;;;;ACSO,SAASqb,GAAQ;AAAA,EACpB,MAAApY,IAAO;AAAA,EACP,WAAAjF;AAAA,EACA,OAAAsI,IAAQ;AAAA,EACR,SAAAgV;AAAA,EACA,SAAAC,IAAU;AACd,GAAiB;AACb,QAAMzX,IAAM,gBAAAhF,EAAC,QAAA,EAAK,eAAW,IAAC,WAAWC,EAAGC,GAAO,SAASA,GAAOiE,CAAI,CAAC,EAAA,CAAG;AAE3E,SAAI,CAACsY,KAAWD,MAAY,SAEpB,gBAAAxc;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAYwH;AAAA,MACZ,WAAWvH,EAAGC,GAAO,SAASA,GAAOiE,CAAI,GAAGjF,CAAS;AAAA,IAAA;AAAA,EAAA,IAM7D,gBAAAqB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAYiH;AAAA,MACZ,aAAU;AAAA,MACV,WAAWvH,EAAGC,GAAO,MAAMuc,KAAWvc,GAAO,SAAShB,CAAS;AAAA,MAE9D,UAAA;AAAA,QAAA8F;AAAA,QACAwX,MAAY,UAAa,gBAAAxc,EAAC,UAAK,WAAWE,GAAO,SAAU,UAAAsc,EAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGhF;;;;;;;;;;;;;;AC1CA,SAASE,GAAWC,GAAqD;AACrE,MAAI,OAAOA,KAAU,SAAU;AAC/B,QAAM5E,IAAU4E,EAAM,KAAA;AACtB,MAAI5E,EAAQ,WAAW,GAAG,EAAG,QAAO;AACpC,MAAIA,EAAQ,WAAW,GAAG,KAAKA,EAAQ,WAAW,GAAG,EAAG,QAAO;AAEnE;AASO,SAAS6E,GAAK,EAAE,OAAApV,GAAO,OAAAzI,GAAO,OAAA4d,GAAO,OAAAE,GAAO,MAAAC,GAAM,MAAAhc,GAAM,WAAA5B,GAAW,GAAGgC,KAAoB;AAC7F,QAAM6b,IAAuCF,KAASH,GAAWC,CAAK;AACtE,SACI,gBAAApc,EAAC,SAAI,WAAWN,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC5C,UAAA;AAAA,IAAA,gBAAAX,EAAC,OAAA,EAAI,WAAWL,GAAO,QAClB,UAAA;AAAA,MAAAY,KAAQ,gBAAAd,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,MAC7C,gBAAAd,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAsH,EAAA,CAAM;AAAA,IAAA,GAC1C;AAAA,IACA,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,GAAO,KACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAnB,GAAM;AAAA,MACrC4d,MAAU,UACP,gBAAA3c;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWC;AAAA,YACPC,GAAO;AAAA,YACP6c,MAAkB,QAAQ7c,GAAO;AAAA,YACjC6c,MAAkB,UAAU7c,GAAO;AAAA,YACnC6c,MAAkB,UAAU7c,GAAO;AAAA,UAAA;AAAA,UAGtC,UAAAyc;AAAA,QAAA;AAAA,MAAA;AAAA,IACL,GAER;AAAA,IACCG,KAAQ,gBAAA9c,EAAC,KAAA,EAAE,WAAWE,GAAO,MAAO,UAAA4c,EAAA,CAAK;AAAA,EAAA,GAC9C;AAER;;;;;;;;;;;ACxCO,SAASE,GAAQ,EAAE,OAAAC,GAAO,SAAAxa,GAAS,aAAAyI,IAAc,cAAc,WAAAhM,KAA2B;AAC7F,SACI,gBAAAc;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAGC,GAAO,SAASgL,MAAgB,cAAchL,GAAO,UAAUhB,CAAS;AAAA,MAErF,UAAA+d,EAAM,IAAI,CAAC1I,GAAMpO,MAAU;AACxB,cAAM+W,IAAY/W,IAAQ1D,GACpB+C,IAASW,MAAU1D;AACzB,iCACKN,IAAA,EACG,UAAA;AAAA,UAAA,gBAAA5B;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAWN;AAAA,gBACPC,GAAO;AAAA,gBACPgd,KAAahd,GAAO;AAAA,gBACpBsF,KAAUtF,GAAO;AAAA,cAAA;AAAA,cAErB,gBAAcsF,IAAS,SAAS;AAAA,cAEhC,UAAA;AAAA,gBAAA,gBAAAxF,EAAC,UAAK,WAAWE,GAAO,KAAM,UAAAgd,IAAY,MAAM/W,IAAQ,EAAA,CAAE;AAAA,kCACzD,QAAA,EAAK,WAAWjG,GAAO,OAAQ,YAAK,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAE9CiG,IAAQ8W,EAAM,SAAS,KACpB,gBAAAjd;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAWC,EAAGC,GAAO,WAAWgd,KAAahd,GAAO,SAAS;AAAA,cAC7D,eAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QACf,EAAA,GAhBOiG,CAkBf;AAAA,MAER,CAAC;AAAA,IAAA;AAAA,EAAA;AAGb;AC9CO,SAASsN,GAAM1U,GAAe8a,GAAaf,GAAqB;AACnE,MAAI,OAAO,MAAM/Z,CAAK,EAAG,QAAOA;AAChC,MAAI8a,IAAMf,GAAK;AACX,UAAMqE,IAAOtD;AACb,IAAAA,IAAMf,GACNA,IAAMqE;AAAA,EACV;AACA,SAAIpe,IAAQ8a,IAAYA,IACpB9a,IAAQ+Z,IAAYA,IACjB/Z;AACX;AAeO,SAASqe,GAAYrP,GAAesP,IAAmB,GAAW;AACrE,MAAItP,MAAU,EAAG,QAAO;AAExB,QAAMuP,IAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI,GACpCC,IAAO,MACPC,IAAW,KAAK;AAAA,IAClB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAIzP,CAAK,CAAC,IAAI,KAAK,IAAIwP,CAAI,CAAC;AAAA,IACrDD,EAAM,SAAS;AAAA,EAAA,GAEbve,IAAQgP,IAAQwP,KAAQC,GACxBC,IAASD,MAAa,IAAI,IAAI,KAAK,IAAI,GAAGH,CAAQ;AAGxD,SAAO,GAFW,WAAWte,EAAM,QAAQ0e,CAAM,CAAC,EAAE,SAAA,CAEjC,IAAIH,EAAME,CAAQ,CAAC;AAC1C;AAaO,SAASE,GAAoB3e,GAAe4e,IAAiB,SAAiB;AACjF,SAAO,IAAI,KAAK,aAAaA,GAAQ,EAAE,UAAU,WAAW,uBAAuB,EAAA,CAAG,EAAE;AAAA,IACpF5e;AAAA,EAAA;AAER;;;;;;;;;;;GC3Ba6e,KAAerW,EAA8C,SACtE;AAAA,EACI,OAAAxI;AAAA,EACA,UAAAE;AAAA,EACA,KAAA4a,IAAM;AAAA,EACN,KAAAf,IAAM,OAAO;AAAA,EACb,MAAAvE,IAAO;AAAA,EACP,MAAApQ,IAAO;AAAA,EACP,UAAA0C,IAAW;AAAA,EACX,OAAAW;AAAA,EACA,QAAAqW;AAAA,EACA,QAAAC,IAAS,EAAE,WAAW,YAAY,WAAW,WAAA;AAAA,EAC7C,WAAA5e;AACJ,GACAyI,GACF;AACE,QAAMoW,IAAY,MAAY;AAC1B,IAAIlX,KACJ5H,EAASwU,GAAM1U,IAAQwV,GAAMsF,GAAKf,CAAG,CAAC;AAAA,EAC1C,GACMkF,IAAY,MAAY;AAC1B,IAAInX,KACJ5H,EAASwU,GAAM1U,IAAQwV,GAAMsF,GAAKf,CAAG,CAAC;AAAA,EAC1C,GAEMmF,IAAUJ,IAASA,EAAO9e,CAAK,IAAI,OAAOA,CAAK,GAC/Cmf,IAAe,CAACrX,KAAY9H,IAAQ8a,GACpCsE,IAAe,CAACtX,KAAY9H,IAAQ+Z;AAE1C,SACI,gBAAAvY,EAAC,SAAI,KAAAoH,GAAU,WAAW1H,EAAGC,GAAO,SAAShB,CAAS,GACjD,UAAA;AAAA,IAAAsI,KAAS,gBAAAxH,EAAC,SAAA,EAAM,WAAWE,GAAO,OAAQ,UAAAsH,GAAM;AAAA,IACjD,gBAAAjH,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,KAAKA,GAAOiE,CAAI,GAAG0C,KAAY3G,GAAO,QAAQ,GACpE,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,cAAY4d,EAAO;AAAA,UACnB,SAASC;AAAA,UACT,UAAU,CAACG;AAAA,UACd,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAle,EAAC,UAAK,WAAWE,GAAO,OAAO,MAAK,UAAS,aAAU,UAClD,UAAA+d,EAAA,CACL;AAAA,MACA,gBAAAje;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,cAAY4d,EAAO;AAAA,UACnB,SAASE;AAAA,UACT,UAAU,CAACG;AAAA,UACd,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACJ;AAAA,EAAA,GACJ;AAER,CAAC;;;;;;;GCnFYC,KAAS7W,EAA0C,SAC5D,EAAE,OAAAC,GAAO,UAAAX,GAAU,kBAAAa,GAAkB,WAAAxI,GAAW,GAAGgC,EAAA,GACnDyG,GACF;AACE,SACI,gBAAApH,EAAC,SAAA,EAAM,WAAWN,EAAGC,GAAO,SAAS2G,KAAY3G,GAAO,UAAUwH,CAAgB,GAC9E,UAAA;AAAA,IAAA,gBAAA1H;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAA2H;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAAd;AAAA,QACA,WAAW5G,EAAGC,GAAO,OAAOhB,CAAS;AAAA,QACpC,GAAGgC;AAAA,MAAA;AAAA,IAAA;AAAA,IAER,gBAAAlB,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAO,eAAW,IACtC,UAAA,gBAAAF,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAA,CAAO,GACnC;AAAA,IACCsH,KAAS,gBAAAxH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAsH,EAAA,CAAM;AAAA,EAAA,GACpD;AAER,CAAC;;;;;;;;;;;;;;ACHM,SAAS6W,GAAI;AAAA,EAChB,SAAA3d,IAAU;AAAA,EACV,MAAAyD,IAAO;AAAA,EACP,UAAAma;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAArf;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAa;AACT,SACI,gBAAAX,EAAC,QAAA,EAAK,WAAWN,EAAGC,GAAO,KAAKA,GAAOQ,CAAO,GAAGR,GAAOiE,CAAI,GAAGjF,CAAS,GAAI,GAAGgC,GAC3E,UAAA;AAAA,IAAA,gBAAAlB,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAe,GAAS;AAAA,IACxCqd,KACG,gBAAAte;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,cAAYqe;AAAA,QACZ,SAASD;AAAA,QACZ,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAER;AAER;;;;;;;;;;;;;;;;;AChBA,SAASE,GAAcC,GAAyD;AAC5E,MAAIA,MAAa,SAAU,QAAOve,EAAO;AACzC,MAAIue,MAAa,UAAW,QAAOve,EAAO;AAE9C;AASO,SAASwe,GAAS;AAAA,EACrB,SAAA1P;AAAA,EACA,MAAA2P;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAxV,IAAe;AAAA,EACf,WAAAnK;AAAA,EACA,eAAA4f,IAAgB;AACpB,GAAkB;AACd,SACI,gBAAA9e,EAAC,OAAA,EAAI,WAAWC,EAAGC,EAAO,QAAQ4e,KAAiB5e,EAAO,WAAWhB,CAAS,GAC1E,UAAA,gBAAAqB,EAAC,SAAA,EAAM,WAAWL,EAAO,OACrB,UAAA;AAAA,IAAA,gBAAAF,EAAC,SAAA,EAAM,WAAWC,EAAG6e,KAAiB5e,EAAO,aAAa,GACtD,UAAA,gBAAAF,EAAC,MAAA,EACI,UAAAgP,EAAQ,IAAI,CAAC+P,MACV,gBAAA/e;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,WAAWC;AAAA,UACPC,EAAO;AAAA,UACP6e,EAAO,UAAU,WAAW7e,EAAO;AAAA,UACnC6e,EAAO,UAAU,YAAY7e,EAAO;AAAA,UACpCse,GAAcO,EAAO,QAAQ;AAAA,QAAA;AAAA,QAEjC,OAAO,EAAE,OAAOA,EAAO,MAAA;AAAA,QAEtB,UAAAA,EAAO;AAAA,MAAA;AAAA,MATHA,EAAO;AAAA,IAAA,CAWnB,GACL,EAAA,CACJ;AAAA,IACA,gBAAA/e,EAAC,WACI,UAAA2e,EAAK,WAAW,IACb,gBAAA3e,EAAC,MAAA,EACG,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAWE,EAAO,UAAU,SAAS8O,EAAQ,QAC5C,UAAA3F,EAAA,CACL,EAAA,CACJ,IAEAsV,EAAK,IAAI,CAACK,GAAK7Y,MACX,gBAAAnG;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,WAAWC;AAAA,UACPC,EAAO;AAAA,UACP2e,KAAc3e,EAAO;AAAA,UACrB4e,KAAiB5e,EAAO;AAAA,QAAA;AAAA,QAE5B,SAAS2e,IAAa,MAAMA,EAAWG,CAAG,IAAI;AAAA,QAE7C,UAAAhQ,EAAQ,IAAI,CAAC+P,MAAW;AACrB,gBAAME,IAAUF,EAAO,SACjBA,EAAO,OAAOC,GAAK7Y,CAAK,IACvB6Y,EAAkCD,EAAO,GAAG;AACnD,iBACI,gBAAA/e;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,WAAWC;AAAA,gBACPC,EAAO;AAAA,gBACP6e,EAAO,UAAU,WAAW7e,EAAO;AAAA,gBACnC6e,EAAO,UAAU,YAAY7e,EAAO;AAAA,gBACpCse,GAAcO,EAAO,QAAQ;AAAA,gBAC7BA,EAAO;AAAA,cAAA;AAAA,cAEX,cACI,OAAOA,EAAO,UAAW,WACnBA,EAAO,SACP;AAAA,cAGT,UAAAE;AAAA,YAAA;AAAA,YAdIF,EAAO;AAAA,UAAA;AAAA,QAiBxB,CAAC;AAAA,MAAA;AAAA,MA/BIH,EAAOI,GAAK7Y,CAAK;AAAA,IAAA,CAiC7B,EAAA,CAET;AAAA,EAAA,EAAA,CACJ,EAAA,CACJ;AAER;;;;;;;;ACrGO,SAAS+Y,GAAK;AAAA,EACjB,OAAArgB;AAAA,EACA,WAAAsgB;AAAA,EACA,UAAAC;AAAA,EACA,UAAAngB;AAAA,EACA,SAAAyB,IAAU;AAAA,EACV,WAAAxB;AACJ,GAAc;AACV,QAAMmgB,IAAexgB,EAAM,KAAK,CAACsB,MAAS,CAACA,EAAK,QAAQ,GAClD,CAACuX,GAAUC,CAAW,IAAInY,EAA6B2f,KAAaE,GAAc,EAAE,GAEpFhgB,IAAe+f,MAAa,QAC5B3c,IAAUpD,IAAe+f,IAAW1H,GACpClS,IAAS3G,EAAM,KAAK,CAACsB,MAASA,EAAK,OAAOsC,CAAO,KAAK4c;AAE5D,WAASC,EAAS1f,GAAkB;AAChC,IAAKP,KAAcsY,EAAY/X,CAAE,GACjCX,IAAWW,CAAE;AAAA,EACjB;AAEA,SACI,gBAAAW,EAAC,SAAI,WAAArB,GACD,UAAA;AAAA,IAAA,gBAAAc,EAAC,OAAA,EAAI,MAAK,WAAU,WAAWC,EAAGC,GAAO,SAASQ,MAAY,UAAUR,GAAO,IAAI,GAC9E,UAAArB,EAAM,IAAI,CAACsB,MAAS;AACjB,YAAMof,IAAWpf,EAAK,OAAOqF,GAAQ;AACrC,aACI,gBAAAxF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEG,MAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAeuf;AAAA,UACf,iBAAe,SAASpf,EAAK,EAAE;AAAA,UAC/B,IAAI,OAAOA,EAAK,EAAE;AAAA,UAClB,UAAUA,EAAK;AAAA,UACf,WAAWF,EAAGC,GAAO,KAAKqf,KAAYrf,GAAO,MAAM;AAAA,UACnD,SAAS,MAAMof,EAASnf,EAAK,EAAE;AAAA,UAE9B,UAAAA,EAAK;AAAA,QAAA;AAAA,QAVDA,EAAK;AAAA,MAAA;AAAA,IAatB,CAAC,EAAA,CACL;AAAA,IACCqF,KACG,gBAAAxF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,IAAI,SAASwF,EAAO,EAAE;AAAA,QACtB,mBAAiB,OAAOA,EAAO,EAAE;AAAA,QACjC,WAAWtF,GAAO;AAAA,QAEjB,UAAAsF,EAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GAER;AAER;;;;;;;;;GClEaga,KAAWjY,EAA+C,SACnE,EAAE,OAAAC,GAAO,YAAAY,GAAY,OAAAC,GAAO,kBAAAX,GAAkB,WAAAxI,GAAW,IAAAU,GAAI,UAAA6f,GAAU,GAAGve,EAAA,GAC1EyG,GACF;AACE,QAAM+X,IAActgB,EAAA,GACdugB,IAAa/f,KAAM8f;AAEzB,SACI,gBAAAnf,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,SAASmI,KAASnI,GAAO,OAAOwH,CAAgB,GACrE,UAAA;AAAA,IAAAF,uBACI,SAAA,EAAM,SAASmY,GAAY,WAAWzf,GAAO,OACzC,UAAA;AAAA,MAAAsH;AAAA,MACAiY,KAAY,gBAAAzf,EAAC,QAAA,EAAK,WAAWE,GAAO,UAAU,UAAA,IAAA,CAAC;AAAA,IAAA,GACpD;AAAA,IAEJ,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAA2H;AAAA,QACA,IAAIgY;AAAA,QACJ,gBAAc,CAAC,CAACtX;AAAA,QAChB,UAAAoX;AAAA,QACA,WAAWxf,EAAGC,GAAO,UAAUhB,CAAS;AAAA,QACvC,GAAGgC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEPmH,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,GAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,GAAO,QAAS,aAAW,IAC5C;AAAA,EAAA,GACR;AAER,CAAC;;;;;;;;;;;;;;;;;ACNM,SAAS0f,GAAS,EAAE,OAAA/gB,GAAO,WAAAghB,IAAY,IAAM,WAAA3gB,GAAW,GAAGgC,KAAwB;AACtF,2BACK,MAAA,EAAG,WAAWjB,EAAGC,GAAO,UAAU2f,KAAa3f,GAAO,WAAWhB,CAAS,GAAI,GAAGgC,GAC7E,YAAM,IAAI,CAACf,GAAMgG,MAAU;AACxB,UAAMC,IAASD,MAAUtH,EAAM,SAAS;AACxC,WACI,gBAAA0B,EAAC,MAAA,EAAiB,WAAWL,GAAO,MAChC,UAAA;AAAA,MAAA,gBAAAK,EAAC,OAAA,EAAI,WAAWL,GAAO,cACnB,UAAA;AAAA,QAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWC;AAAA,cACPC,GAAO;AAAA,cACPA,GAAO,UAAUC,EAAK,UAAU,SAAS,EAAE;AAAA,YAAA;AAAA,YAE/C,eAAY;AAAA,YAEX,UAAAA,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAET0f,KAAa,CAACzZ,KACX,gBAAApG,EAAC,UAAK,WAAWE,GAAO,MAAM,eAAY,OAAA,CAAO;AAAA,MAAA,GAEzD;AAAA,MACA,gBAAAK,EAAC,OAAA,EAAI,WAAWL,GAAO,MACnB,UAAA;AAAA,QAAA,gBAAAK,EAAC,OAAA,EAAI,WAAWL,GAAO,KACnB,UAAA;AAAA,UAAA,gBAAAF,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,YAAK,OAAM;AAAA,UAC1CC,EAAK,QAAQ,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,YAAK,KAAA,CAAK;AAAA,QAAA,GAC3D;AAAA,QACCC,EAAK,eACF,gBAAAH,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,YAAK,YAAA,CAAY;AAAA,MAAA,EAAA,CAE5D;AAAA,IAAA,EAAA,GAvBKC,EAAK,EAwBd;AAAA,EAER,CAAC,EAAA,CACL;AAER;;;;;;;;;;ACjDO,SAAS2f,GAAQ;AAAA,EACpB,SAAAb;AAAA,EACA,WAAA5T,IAAY;AAAA,EACZ,UAAApK;AAAA,EACA,UAAA4F,IAAW;AAAA,EACX,WAAAkZ,IAAY;AAChB,GAAiB;AACb,QAAM,CAAC3f,GAAMiF,CAAO,IAAI7F,EAAkB,EAAK,GACzCwgB,IAAY5gB,EAAA;AAClB,MAAI6gB,IAA8C;AAElD,WAASC,IAAa;AAClB,IAAIrZ,MACAoZ,kBAAoBA,CAAK,GAC7BA,IAAQ,WAAW,MAAM5a,EAAQ,EAAI,GAAG0a,CAAS;AAAA,EACrD;AAEA,WAASI,IAAa;AAClB,IAAIF,MACA,aAAaA,CAAK,GAClBA,IAAQ,OAEZ5a,EAAQ,EAAK;AAAA,EACjB;AAEA,QAAMsG,IAAUyU,GAAanf,GAAU;AAAA,IACnC,cAAcif;AAAA,IACd,cAAcC;AAAA,IACd,SAASD;AAAA,IACT,QAAQC;AAAA,IACR,oBAAoB/f,IAAO4f,IAAY;AAAA,EAAA,CACf;AAE5B,SACI,gBAAAzf,EAAC,QAAA,EAAK,WAAWL,GAAO,SACnB,UAAA;AAAA,IAAAyL;AAAA,IACAvL,KACG,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAIggB;AAAA,QACJ,MAAK;AAAA,QACL,WAAW/f,EAAGC,GAAO,QAAQA,GAAOmL,CAAS,CAAC;AAAA,QAE7C,UAAA4T;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GAER;AAER;;;;;;;;;;;;;;;;;;GC1BMoB,KAAelO,GAA+B,IAAI;AAOjD,SAASmO,KAAqB;AACjC,QAAMC,IAAMrN,GAAWmN,EAAY;AACnC,MAAI,CAACE,EAAK,OAAM,IAAI,MAAM,gDAAgD;AAC1E,SAAOA;AACX;AAqBO,SAASC,GAAc;AAAA,EAC1B,UAAAvf;AAAA,EACA,iBAAAwf,IAAkB;AAAA,EAClB,UAAAC,IAAW;AACf,GAAuB;AACnB,QAAM,CAACC,GAAQC,CAAS,IAAIphB,EAAuB,CAAA,CAAE,GAC/C+S,IAAU1K,EAAe,CAAC,GAE1BiK,IAAUnS,EAAY,CAACC,MAAqB;AAC9C,IAAAghB,EAAU,CAACne,MAAYA,EAAQ,OAAO,CAACoe,MAAUA,EAAM,OAAOjhB,CAAE,CAAC;AAAA,EACrE,GAAG,CAAA,CAAE,GAECsgB,IAAOvgB;AAAA,IACT,CAACwJ,MAAkC;AAC/B,YAAMvJ,IAAKuJ,EAAQ,MAAM,SAAS,EAAEoJ,EAAQ,OAAO,IAC7CzG,IAAoB;AAAA,QACtB,IAAAlM;AAAA,QACA,OAAOuJ,EAAQ;AAAA,QACf,aAAaA,EAAQ;AAAA,QACrB,SAASA,EAAQ,WAAW;AAAA,QAC5B,UAAUA,EAAQ,YAAYsX;AAAA,MAAA;AAElC,aAAAG,EAAU,CAACne,MAAY,CAAC,GAAGA,GAASqJ,CAAK,CAAC,GACnClM;AAAA,IACX;AAAA,IACA,CAAC6gB,CAAe;AAAA,EAAA,GAGd9N,IAAMlO;AAAA,IACR,OAAO;AAAA,MACH,MAAAyb;AAAA,MACA,SAAApO;AAAA,MACA,SAAS,CAACjR,GAAasI,MACnB+W,EAAK,EAAE,GAAG/W,GAAS,aAAAtI,GAAa,SAAS,WAAW;AAAA,MACxD,OAAO,CAACA,GAAasI,MAAY+W,EAAK,EAAE,GAAG/W,GAAS,aAAAtI,GAAa,SAAS,SAAS;AAAA,MACnF,SAAS,CAACA,GAAasI,MACnB+W,EAAK,EAAE,GAAG/W,GAAS,aAAAtI,GAAa,SAAS,WAAW;AAAA,MACxD,MAAM,CAACA,GAAasI,MAAY+W,EAAK,EAAE,GAAG/W,GAAS,aAAAtI,GAAa,SAAS,OAAA,CAAQ;AAAA,IAAA;AAAA,IAErF,CAACqf,GAAMpO,CAAO;AAAA,EAAA;AAGlB,SACI,gBAAAvR,EAAC8f,GAAa,UAAb,EAAsB,OAAO1N,GACzB,UAAA;AAAA,IAAA1R;AAAA,IACD,gBAAAjB,EAAC8gB,IAAA,EAAe,QAAAH,GAAgB,WAAW7O,GAAS,UAAA4O,EAAA,CAAoB;AAAA,EAAA,GAC5E;AAER;AAQA,SAASK,GAAcL,GAAiC;AACpD,UAAQA,GAAA;AAAA,IACJ,KAAK;AACD,aAAOxgB,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAClB,KAAK;AACD,aAAOA,GAAO;AAAA,IAElB;AACI,aAAOA,GAAO;AAAA,EAAA;AAE1B;AAEA,SAAS4gB,GAAe,EAAE,QAAAH,GAAQ,WAAAvb,GAAW,UAAAsb,KAA4B;AACrE,SAAI,OAAO,WAAa,MAAoB,OACrC1a;AAAA,IACH,gBAAAhG;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAWC,EAAGC,GAAO,WAAW6gB,GAAcL,CAAQ,CAAC;AAAA,QACvD,aAAU;AAAA,QACV,eAAY;AAAA,QAEX,UAAAC,EAAO,IAAI,CAACE,MACT,gBAAA7gB,EAACghB,MAAyB,OAAAH,GAAc,WAAAzb,KAAxByb,EAAM,EAAwC,CACjE;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL,SAAS;AAAA,EAAA;AAEjB;AAOA,SAASG,GAAU,EAAE,OAAAH,GAAO,WAAAzb,KAAwB;AAChD,SAAAvC,EAAU,MAAM;AACZ,QAAI,CAACge,EAAM,SAAU;AACrB,UAAMZ,IAAQ,WAAW,MAAM7a,EAAUyb,EAAM,EAAE,GAAGA,EAAM,QAAQ;AAClE,WAAO,MAAM,aAAaZ,CAAK;AAAA,EACnC,GAAG,CAACY,EAAM,IAAIA,EAAM,UAAUzb,CAAS,CAAC,GAGpC,gBAAA7E,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,OAAOA,GAAO2gB,EAAM,OAAO,CAAC,GAAG,MAAK,UAC1D,UAAA;AAAA,IAAA,gBAAAtgB,EAAC,OAAA,EACI,UAAA;AAAA,MAAAsgB,EAAM,SAAS,gBAAA7gB,EAAC,KAAA,EAAE,WAAWE,GAAO,OAAQ,YAAM,MAAA,CAAM;AAAA,MACxD2gB,EAAM,eAAe,gBAAA7gB,EAAC,KAAA,EAAE,WAAWE,GAAO,aAAc,YAAM,YAAA,CAAY;AAAA,IAAA,GAC/E;AAAA,IACA,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWE,GAAO;AAAA,QAClB,cAAW;AAAA,QACX,SAAS,MAAMkF,EAAUyb,EAAM,EAAE;AAAA,QAEjC,4BAAC1f,IAAA,CAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACf,GACJ;AAER;AAEA,SAASA,KAAY;AACjB,SACI,gBAAAnB,EAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACjD,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,IAAA;AAAA,EAAA,GAEtB;AAER;;;;;;ACrLO,SAASihB,GAAe;AAAA,EAC3B,OAAApiB;AAAA,EACA,YAAAqiB;AAAA,EACA,YAAAC;AAAA,EACA,QAAAxM;AAAA,EACA,UAAAyM,IAAW;AAAA,EACX,QAAAC;AAAA,EACA,WAAAniB;AAAA,EACA,OAAAyE;AACJ,GAAwB;AACpB,QAAM2d,IAAezZ,EAAuB,IAAI,GAC1C,CAAC0Z,GAAWC,CAAY,IAAIhiB,EAAiB,CAAC,GAC9C,CAACiiB,GAAUC,CAAW,IAAIliB,EAAiB,CAAC;AAElD,EAAAqD,EAAU,MAAM;AACZ,UAAM8e,IAAUL,EAAa;AAG7B,QAFI,CAACK,MACLD,EAAYC,EAAQ,YAAY,GAC5B,OAAO,iBAAmB,KAAa;AAC3C,UAAMC,IAAW,IAAI,eAAe,MAAMF,EAAYC,EAAQ,YAAY,CAAC;AAC3E,WAAAC,EAAS,QAAQD,CAAO,GACjB,MAAMC,EAAS,WAAA;AAAA,EAC1B,GAAG,CAAA,CAAE;AAEL,QAAMC,IAAchjB,EAAM,SAASqiB,GAC7B3L,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAMgM,IAAYL,CAAU,IAAIE,CAAQ,GACjEU,IAAe,KAAK,KAAKL,IAAWP,CAAU,IAAIE,IAAW,GAC7D5L,IAAM,KAAK,IAAI3W,EAAM,QAAQ0W,IAAQuM,CAAY;AAEvD,SACI,gBAAA9hB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAKshB;AAAA,MACL,WAAWrhB,EAAGC,GAAO,QAAQhB,CAAS;AAAA,MACtC,OAAO,EAAE,QAAAyV,GAAQ,GAAGhR,EAAA;AAAA,MACpB,UAAU,CAACkB,MAAU2c,EAAc3c,EAAM,OAA0B,SAAS;AAAA,MAC5E,MAAK;AAAA,MAEL,4BAAC,OAAA,EAAI,WAAW3E,GAAO,QAAQ,OAAO,EAAE,QAAQ2hB,EAAA,GAC3C,UAAAhjB,EAAM,MAAM0W,GAAOC,CAAG,EAAE,IAAI,CAACrV,GAAM4hB,MAAW;AAC3C,cAAM5b,IAAQoP,IAAQwM,GAChBrf,IAAM2e,IAASA,EAAOlhB,GAAMgG,CAAK,IAAIA;AAC3C,eACI,gBAAAnG;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,OAAO,EAAE,KAAKiG,IAAQ+a,GAAY,QAAQA,EAAA;AAAA,YAEzC,UAAAC,EAAWhhB,GAAMgG,CAAK;AAAA,UAAA;AAAA,UALlBzD;AAAA,QAAA;AAAA,MAQjB,CAAC,EAAA,CACL;AAAA,IAAA;AAAA,EAAA;AAGZ;;;;;ACxDO,SAASsf,GAAW;AAAA,EACvB,OAAAjjB;AAAA,EACA,SAAAkjB,IAAU;AAAA,EACV,UAAAhhB;AAAA,EACA,UAAAihB;AAAA,EACA,WAAAhjB;AAAA,EACA,SAAAmF;AAAA,EACA,GAAGnD;AACP,GAAoB;AAChB,QAAM,CAACihB,GAAQC,CAAS,IAAI5iB,EAAS,EAAK,GACpC6iB,IAAWxa,EAA6C,IAAI;AAElE,EAAAhF,EAAU,MACC,MAAM;AACT,IAAIwf,EAAS,YAAY,QAAM,aAAaA,EAAS,OAAO;AAAA,EAChE,GACD,CAAA,CAAE;AAEL,QAAM1H,IAAchb;AAAA,IAChB,OAAOkF,MAA+C;AAClD,MAAAR,IAAUQ,CAAK;AACf,UAAI;AACA,cAAM,UAAU,UAAU,UAAU9F,CAAK,GACzCqjB,EAAU,EAAI,GACdF,IAAA,GACIG,EAAS,YAAY,QAAM,aAAaA,EAAS,OAAO,GAC5DA,EAAS,UAAU,WAAW,MAAMD,EAAU,EAAK,GAAGH,CAAO;AAAA,MACjE,QAAQ;AAAA,MAER;AAAA,IACJ;AAAA,IACA,CAACljB,GAAOkjB,GAASC,GAAU7d,CAAO;AAAA,EAAA;AAGtC,SACI,gBAAArE;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAWC,EAAGC,GAAO,QAAQiiB,KAAUjiB,GAAO,QAAQhB,CAAS;AAAA,MAC/D,eAAaijB,KAAU;AAAA,MACvB,SAASxH;AAAA,MACR,GAAGzZ;AAAA,MAEH,UAAAD,MAAakhB,IAAS,WAAW;AAAA,IAAA;AAAA,EAAA;AAG9C;ACpDA,MAAMG,KAAiB;AAAA,EACnB,SAAS;AAAA,EACT,YAAY,CAAC5O,MAAM,GAAGA,CAAC;AAAA,EACvB,YAAY,CAACA,MAAM,GAAGA,CAAC;AAAA,EACvB,UAAU,CAACA,MAAOA,MAAM,IAAI,iBAAiB,GAAGA,CAAC;AAAA,EACjD,SAAS,CAACA,MAAOA,MAAM,IAAI,UAAU,GAAGA,CAAC;AAAA,EACzC,UAAU,CAACA,MAAOA,MAAM,IAAI,mBAAmB,GAAGA,CAAC;AAAA,EACnD,WAAW,CAACA,MAAOA,MAAM,IAAI,gBAAgB,GAAGA,CAAC;AAAA,EACjD,UAAU,CAACA,MAAOA,MAAM,IAAI,gBAAgB,GAAGA,CAAC;AAAA,EAChD,WAAW,CAACA,MAAM,MAAMA,CAAC;AAAA,EACzB,WAAW,CAACA,MAAM,MAAMA,CAAC;AAAA,EACzB,SAAS,CAACA,MAAM,MAAMA,CAAC;AAAA,EACvB,QAAQ,CAACA,MAAM,MAAMA,CAAC,IAAIA,MAAM,IAAI,QAAQ,MAAM;AAAA,EAClD,SAAS,CAACA,MAAM,MAAMA,CAAC,IAAIA,MAAM,IAAI,WAAW,SAAS;AAAA,EACzD,UAAU,CAACA,MAAM,MAAMA,CAAC,IAAIA,MAAM,IAAI,QAAQ,OAAO;AAAA,EACrD,SAAS,CAACA,MAAM,MAAMA,CAAC,IAAIA,MAAM,IAAI,QAAQ,MAAM;AACvD,GAEM6O,KAAc;AAAA,EAChB,SAAS;AAAA,EACT,YAAY,CAAC7O,MAAM,GAAGA,CAAC;AAAA,EACvB,YAAY,CAACA,MAAM,GAAGA,CAAC;AAAA,EACvB,UAAU,CAACA,MAAM,GAAGA,CAAC;AAAA,EACrB,SAAS,CAACA,MAAOA,MAAM,IAAI,cAAc,GAAGA,CAAC;AAAA,EAC7C,UAAU,CAACA,MAAM,GAAGA,CAAC;AAAA,EACrB,WAAW,CAACA,MAAM,GAAGA,CAAC;AAAA,EACtB,UAAU,CAACA,MAAM,GAAGA,CAAC;AAAA,EACrB,WAAW,CAACA,MAAM,MAAMA,CAAC;AAAA,EACzB,WAAW,CAACA,MAAM,MAAMA,CAAC;AAAA,EACzB,SAAS,CAACA,MAAM,MAAMA,CAAC;AAAA,EACvB,QAAQ,CAACA,MAAM,MAAMA,CAAC;AAAA,EACtB,SAAS,CAACA,MAAM,MAAMA,CAAC;AAAA,EACvB,UAAU,CAACA,MAAM,MAAMA,CAAC;AAAA,EACxB,SAAS,CAACA,MAAM,MAAMA,CAAC;AAC3B,GAEM8O,KAA+C,EAAE,SAASF,IAAO,IAAIC,GAAA,GAErEE,KAAS,KACTC,KAAS,KAAKD,IACdE,KAAO,KAAKD,IACZE,KAAM,KAAKD,IACXE,KAAO,IAAID,IACXE,KAAQ,KAAKF,IACbG,KAAO,MAAMH;AAUZ,SAASI,GACZC,GACA9Z,IAAgE,IAC1D;AACN,QAAM,EAAE,QAAAwU,IAAS,SAAS,KAAAuF,IAAM,KAAK,IAAA,MAAU/Z,GACzCga,IAAUX,GAAQ7E,CAAM,GACxByF,IAASH,aAAiB,OAAOA,EAAM,QAAA,IAAY,IAAI,KAAKA,CAAK,EAAE,QAAA,GAEnEI,KADQ,OAAOH,KAAQ,WAAWA,IAAMA,EAAI,QAAA,KAC7BE,GACfE,IAAOD,KAAQ,GACfE,IAAM,KAAK,IAAIF,CAAI;AAEzB,MAAIE,IAAM,KAAKd,GAAQ,QAAOU,EAAQ;AACtC,MAAII,IAAMb,IAAQ;AACd,UAAMhP,IAAI,KAAK,MAAM6P,IAAMd,EAAM;AACjC,WAAOa,IAAOH,EAAQ,WAAWzP,CAAC,IAAIyP,EAAQ,UAAUzP,CAAC;AAAA,EAC7D;AACA,MAAI6P,IAAMZ,IAAM;AACZ,UAAMjP,IAAI,KAAK,MAAM6P,IAAMb,EAAM;AACjC,WAAOY,IAAOH,EAAQ,WAAWzP,CAAC,IAAIyP,EAAQ,UAAUzP,CAAC;AAAA,EAC7D;AACA,MAAI6P,IAAMX,IAAK;AACX,UAAMlP,IAAI,KAAK,MAAM6P,IAAMZ,EAAI;AAC/B,WAAOW,IAAOH,EAAQ,SAASzP,CAAC,IAAIyP,EAAQ,QAAQzP,CAAC;AAAA,EACzD;AACA,MAAI6P,IAAMV,IAAM;AACZ,UAAMnP,IAAI,KAAK,MAAM6P,IAAMX,EAAG;AAC9B,WAAOU,IAAOH,EAAQ,QAAQzP,CAAC,IAAIyP,EAAQ,OAAOzP,CAAC;AAAA,EACvD;AACA,MAAI6P,IAAMT,IAAO;AACb,UAAMpP,IAAI,KAAK,MAAM6P,IAAMV,EAAI;AAC/B,WAAOS,IAAOH,EAAQ,SAASzP,CAAC,IAAIyP,EAAQ,QAAQzP,CAAC;AAAA,EACzD;AACA,MAAI6P,IAAMR,IAAM;AACZ,UAAMrP,IAAI,KAAK,MAAM6P,IAAMT,EAAK;AAChC,WAAOQ,IAAOH,EAAQ,UAAUzP,CAAC,IAAIyP,EAAQ,SAASzP,CAAC;AAAA,EAC3D;AACA,QAAMA,IAAI,KAAK,MAAM6P,IAAMR,EAAI;AAC/B,SAAOO,IAAOH,EAAQ,SAASzP,CAAC,IAAIyP,EAAQ,QAAQzP,CAAC;AACzD;AC7FO,SAAS8P,GAAa,EAAE,MAAAC,GAAM,QAAA9F,IAAS,MAAM,GAAGzc,KAA4B;AAC/E,QAAMkiB,IAASK,aAAgB,OAAOA,IAAO,IAAI,KAAKA,CAAI,GACpDC,IAAM,OAAO,MAAMN,EAAO,SAAS,IAAI,SAAYA,EAAO,YAAA,GAC1D5b,IAAQwb,GAAaS,GAAM,EAAE,QAAQ9F,MAAW,OAAO,UAAU,MAAM;AAE7E,2BACK,QAAA,EAAK,UAAU+F,GAAM,GAAGxiB,GACpB,UAAAsG,GACL;AAER;ACTO,SAASmc,GAAM,EAAE,OAAAC,GAAO,UAAAC,IAAW,OAAO,QAAAlG,IAAS,SAAS,GAAGzc,KAAqB;AACvF,QAAM4iB,IAAY,IAAI,KAAK,aAAanG,GAAQ;AAAA,IAC5C,OAAO;AAAA,IACP,UAAAkG;AAAA,EAAA,CACH,EAAE,OAAOD,IAAQ,GAAG;AAErB,SAAO,gBAAA5jB,EAAC,QAAA,EAAM,GAAGkB,GAAQ,UAAA4iB,GAAU;AACvC;;;;ACTO,SAASC,GAAa;AAAA,EACzB,OAAAC,IAAQ;AAAA,EACR,WAAA9kB;AAAA,EACA,OAAAyE;AAAA,EACA,UAAA1C;AAAA,EACA,GAAGC;AACP,GAAsB;AAClB,QAAM+iB,IAAc;AAAA,IAChB,GAAGtgB;AAAA,IACH,yBAAyBqgB;AAAA,EAAA;AAG7B,SACI,gBAAAhkB,EAAC,OAAA,EAAI,WAAWC,EAAGC,GAAO,OAAOhB,CAAS,GAAG,OAAO+kB,GAAc,GAAG/iB,GAChE,UAAAD,EAAA,CACL;AAER;;;;AClBO,SAASijB,GAAe;AAAA,EAC3B,IAAAC,IAAK;AAAA,EACL,WAAAjlB;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAwB;AACpB,SAAOkjB,GAAcD,GAAI,EAAE,WAAWlkB,EAAGC,GAAO,QAAQhB,CAAS,GAAG,GAAGgC,EAAA,GAASD,CAAQ;AAC5F;ACFO,SAASojB,GAAO,EAAE,UAAApjB,GAAU,WAAAqjB,KAAqC;AACpE,QAAM,CAACC,GAASC,CAAU,IAAIhlB,EAAS,EAAK;AAO5C,SALAqD,EAAU,OACN2hB,EAAW,EAAI,GACR,MAAMA,EAAW,EAAK,IAC9B,CAAA,CAAE,GAED,CAACD,KAAW,OAAO,WAAa,MACzB,OAGJve,GAAa/E,GAAUqjB,KAAa,SAAS,IAAI;AAC5D;ACjBO,SAASG,GAAa,EAAE,WAAAC,GAAW,UAAAzjB,GAAU,GAAGC,KAAuC;AAC1F,QAAMyG,IAAME,EAAuB,IAAI,GACjC8c,IAAa9c,EAAO6c,CAAS;AACnC,SAAAC,EAAW,UAAUD,GAErB7hB,EAAU,MAAM;AACZ,QAAI,OAAO,WAAa;AACpB;AAGJ,aAAS+hB,EAAO/f,GAAsC;AAClD,YAAMkD,IAAOJ,EAAI,SACXyb,IAASve,EAAM;AACrB,MAAIkD,KAAQqb,KAAU,CAACrb,EAAK,SAASqb,CAAM,KACvCuB,EAAW,QAAQ9f,CAAK;AAAA,IAEhC;AAEA,oBAAS,iBAAiB,aAAa+f,CAAM,GAC7C,SAAS,iBAAiB,cAAcA,CAAM,GACvC,MAAM;AACT,eAAS,oBAAoB,aAAaA,CAAM,GAChD,SAAS,oBAAoB,cAAcA,CAAM;AAAA,IACrD;AAAA,EACJ,GAAG,CAAA,CAAE,GAGD,gBAAA5kB,EAAC,OAAA,EAAI,KAAA2H,GAAW,GAAGzG,GACd,UAAAD,GACL;AAER;AC7BO,SAAS4jB,GAAmB;AAAA,EAC/B,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAA9jB;AACJ,GAAuC;AACnC,SAAO6jB,IAAYC,EAAQ9jB,CAAQ,2BAAO,UAAAA,GAAS;AACvD;ACJO,SAAS+jB,GAAO,EAAE,MAAAC,GAAM,UAAAhkB,GAAU,UAAA6N,IAAW,QAAgC;AAChF,SAAImW,EAAK,WAAW,2BACN,UAAAnW,EAAA,CAAS,IAGnB,gBAAA9O,EAAAmC,GAAA,EACK,UAAA8iB,EAAK,IAAI,CAAC9kB,GAAMgG,MACb,gBAAAnG,EAACmC,IAAA,EAAsB,YAAShC,GAAMgG,CAAK,KAA5BA,CAA8B,CAChD,GACL;AAER;;;;ACfO,SAAS+e,GAAU,EAAE,UAAAjkB,GAAU,WAAA/B,GAAW,GAAGgC,KAAoC;AACpF,SAAID,KAAa,QAAkCA,MAAa,MAASA,MAAa,KAC3E,OAGP,gBAAAjB,EAAC,KAAA,EAAE,MAAK,SAAQ,WAAWC,EAAGC,GAAO,WAAWhB,CAAS,GAAI,GAAGgC,GAC3D,UAAAD,EAAA,CACL;AAER;;;;ACAO,SAASkkB,GAAM;AAAA,EAClB,KAAAlhB;AAAA,EACA,UAAA6K;AAAA,EACA,KAAA5K;AAAA,EACA,MAAAkhB,IAAO;AAAA,EACP,WAAAlmB;AAAA,EACA,SAAAmmB;AAAA,EACA,GAAGnkB;AACP,GAAe;AACX,QAAM,CAACokB,GAAYC,CAAa,IAAI/lB,EAAiByE,CAAG,GAClD,CAACuhB,GAAcC,CAAe,IAAIjmB,EAAkB,EAAK;AAE/D,SACI,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAKslB;AAAA,MACL,KAAAphB;AAAA,MACA,SAASkhB,IAAO,SAAS;AAAA,MACzB,WAAWnlB,EAAGC,GAAO,OAAOhB,CAAS;AAAA,MACrC,SAAS,CAAC2F,MAAU;AAChB,QAAIiK,KAAY,CAAC0W,KAAgBF,MAAexW,MAC5C2W,EAAgB,EAAI,GACpBF,EAAczW,CAAQ,IAE1BuW,IAAUxgB,CAAK;AAAA,MACnB;AAAA,MACC,GAAG3D;AAAA,IAAA;AAAA,EAAA;AAGhB;;;;;AC5BO,SAASwkB,GAAY;AAAA,EACxB,OAAA7mB;AAAA,EACA,YAAAsiB;AAAA,EACA,cAAAwE;AAAA,EACA,OAAAC;AAAA,EACA,WAAA1mB;AAAA,EACA,GAAGgC;AACP,GAAqB;AACjB,SAAIrC,EAAM,WAAW,IACV,gBAAAmB,EAAAmC,GAAA,EAAG,eAAS,KAAA,CAAK,IAIxB,gBAAAnC,EAAC,MAAA,EAAG,WAAWC,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC1C,UAAArC,EAAM,IAAI,CAACsB,GAAMgG,MACd,gBAAAnG,EAAC,MAAA,EAA0D,WAAWE,GAAO,MACxE,UAAAihB,EAAWhhB,GAAMgG,CAAK,EAAA,GADlBwf,IAAeA,EAAaxlB,GAAMgG,CAAK,IAAIA,CAEpD,CACH,GACL;AAER;;;;;;ACzBO,SAAS0f,GAAgB,EAAE,OAAAhnB,GAAO,WAAAK,GAAW,GAAGgC,KAA+B;AAClF,2BACK,MAAA,EAAG,WAAWjB,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC1C,YAAM,IAAI,CAACf,GAAMgG,wBACbhE,IAAA,EACG,UAAA;AAAA,IAAA,gBAAAnC,EAAC,MAAA,EAAG,WAAWE,GAAO,MAAO,YAAK,MAAK;AAAA,sBACtC,MAAA,EAAG,WAAWA,GAAO,aAAc,YAAK,YAAA,CAAY;AAAA,EAAA,KAF1CiG,CAGf,CACH,GACL;AAER;;;;;;;;GCJa2f,KAASve,EAA2C,SAC7D;AAAA,EACI,SAAAwe;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,iBAAAC;AAAA,EACA,MAAA9hB,IAAO;AAAA,EACP,SAAAzD,IAAU;AAAA,EACV,WAAAxB;AAAA,EACA,UAAA2H;AAAA,EACA,SAAAxC;AAAA,EACA,UAAApD;AAAA,EACA,GAAGC;AACP,GACAyG,GACF;AACE,QAAMtI,IAAe0mB,MAAY,QAC3B,CAACG,GAAiBC,CAAkB,IAAI3mB,EAAkBwmB,CAAc,GACxEI,IAAY/mB,IAAe0mB,IAAUG,GAErCvL,IAAchb;AAAA,IAChB,CAACkF,MAAqD;AAElD,UADAR,IAAUQ,CAAK,GACXA,EAAM,iBAAkB;AAC5B,YAAM/E,IAAO,CAACsmB;AACd,MAAK/mB,KAAc8mB,EAAmBrmB,CAAI,GAC1CmmB,IAAkBnmB,CAAI;AAAA,IAC1B;AAAA,IACA,CAACsmB,GAAW/mB,GAAcgF,GAAS4hB,CAAe;AAAA,EAAA;AAGtD,SACI,gBAAAjmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAA2H;AAAA,MACA,MAAK;AAAA,MACL,gBAAcye;AAAA,MACd,UAAAvf;AAAA,MACA,cAAYuf,IAAY,OAAO;AAAA,MAC/B,WAAWnmB;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOiE,CAAI;AAAA,QACXjE,GAAOQ,CAAO;AAAA,QACd0lB,KAAalmB,GAAO;AAAA,QACpBhB;AAAA,MAAA;AAAA,MAEJ,SAASyb;AAAA,MACR,GAAGzZ;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;;;;GCpEKolB,KAAqBlU,GAA8C,IAAI;AAE7E,SAASmU,KAAiD;AACtD,QAAM/F,IAAMrN,GAAWmT,EAAkB;AACzC,MAAI,CAAC9F;AACD,UAAM,IAAI,MAAM,mDAAmD;AAEvE,SAAOA;AACX;AAcA,SAASgG,GAAexnB,GAAgD;AACpE,SAAIA,MAAU,SAAkB,CAAA,IACzB,MAAM,QAAQA,CAAK,IAAIA,IAAQ,CAACA,CAAK;AAChD;AAYO,SAASynB,GAAY;AAAA,EACxB,MAAArY,IAAO;AAAA,EACP,OAAApP;AAAA,EACA,cAAAC;AAAA,EACA,eAAAynB;AAAA,EACA,WAAAvnB;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAqB;AACjB,QAAM7B,IAAeN,MAAU,QACzB,CAAC2nB,GAAeC,CAAgB,IAAInnB;AAAA,IAAmB,MACzD+mB,GAAevnB,CAAY;AAAA,EAAA,GAEzB+c,IAAW1c,IAAeknB,GAAexnB,CAAK,IAAI2nB,GAElD/d,IAAShJ;AAAA,IACX,CAACG,MAAyB;AACtB,MAAKT,KAAcsnB,EAAiB7mB,CAAI,GACxC2mB,IAAgBtY,MAAS,WAAYrO,EAAK,CAAC,KAAK,KAAMA,CAAI;AAAA,IAC9D;AAAA,IACA,CAACT,GAAconB,GAAetY,CAAI;AAAA,EAAA,GAGhCzO,IAASC;AAAA,IACX,CAACinB,MAA4B;AACzB,YAAMC,IAAO9K,EAAS,SAAS6K,CAAS;AACxC,MACIje,EADAwF,MAAS,WACF0Y,IAAO,KAAK,CAACD,CAAS,IAEtBC,IAAO9K,EAAS,OAAO,CAAC+K,MAAMA,MAAMF,CAAS,IAAI,CAAC,GAAG7K,GAAU6K,CAAS,CAFjD;AAAA,IAItC;AAAA,IACA,CAAC7K,GAAU5N,GAAMxF,CAAM;AAAA,EAAA,GAGrB4X,IAAM9b;AAAA,IACR,OAAO;AAAA,MACH,MAAA0J;AAAA,MACA,YAAY,CAACyY,MAAsB7K,EAAS,SAAS6K,CAAS;AAAA,MAC9D,QAAAlnB;AAAA,IAAA;AAAA,IAEJ,CAACyO,GAAM4N,GAAUrc,CAAM;AAAA,EAAA;AAG3B,2BACK2mB,GAAmB,UAAnB,EAA4B,OAAO9F,GAChC,4BAAC,OAAA,EAAI,MAAK,SAAQ,WAAWtgB,EAAGC,GAAO,OAAOhB,CAAS,GAAI,GAAGgC,GACzD,UAAAD,GACL,GACJ;AAER;AAiBO,SAAS8lB,GAAgB;AAAA,EAC5B,OAAAhoB;AAAA,EACA,UAAA8H;AAAA,EACA,WAAA3H;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAyB;AACrB,QAAM,EAAE,YAAA8lB,GAAY,QAAAtnB,EAAA,IAAW4mB,GAAA,GACzBvK,IAAWiL,EAAWjoB,CAAK;AAEjC,SACI,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc+b;AAAA,MACd,UAAAlV;AAAA,MACA,cAAYkV,IAAW,OAAO;AAAA,MAC9B,WAAW9b,EAAGC,GAAO,MAAM6b,KAAY7b,GAAO,UAAUhB,CAAS;AAAA,MACjE,SAAS,MAAMQ,EAAOX,CAAK;AAAA,MAC1B,GAAGmC;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGb;;;;GC7HagmB,KAAQ1f,EAAyC,SAC1D,EAAE,UAAAkY,IAAW,IAAO,WAAAvgB,GAAW,UAAA+B,GAAU,GAAGC,EAAA,GAC5CyG,GACF;AACE,SACI,gBAAApH,EAAC,SAAA,EAAM,KAAAoH,GAAU,WAAW1H,EAAGC,GAAO,OAAOhB,CAAS,GAAI,GAAGgC,GACxD,UAAA;AAAA,IAAAD;AAAA,IACAwe,uBACI,QAAA,EAAK,WAAWvf,GAAO,UAAU,eAAW,IAAC,UAAA,IAAA,CAE9C;AAAA,EAAA,GAER;AAER,CAAC;;;;;ACHM,SAASgnB,GAAY;AAAA,EACxB,MAAA9mB;AAAA,EACA,aAAAuY,IAAc;AAAA,EACd,cAAAD;AAAA,EACA,SAAA/M;AAAA,EACA,WAAAzM;AAAA,EACA,UAAA+B;AAAA,EACA,GAAGC;AACP,GAAqB;AACjB,QAAM/B,IAAUC,EAAA,GACV+nB,IAAY,GAAGhoB,CAAO,YACtBmB,IAAY,GAAGnB,CAAO,YAEtBE,IAAee,MAAS,QACxB,CAACd,GAAcC,CAAe,IAAIC,EAAkBmZ,CAAW,GAC/D9Y,IAASR,IAAee,IAAOd,GAE/B8nB,IAAeznB,EAAY,MAAY;AACzC,UAAMG,IAAO,CAACD;AACd,IAAKR,KAAcE,EAAgBO,CAAI,GACvC4Y,IAAe5Y,CAAI;AAAA,EACvB,GAAG,CAACD,GAAQR,GAAcqZ,CAAY,CAAC;AAEvC,SACI,gBAAAnY,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,aAAaL,KAAUK,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC1E,UAAA;AAAA,IAAA,gBAAAlB;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,IAAIM;AAAA,QACJ,WAAWJ,GAAO;AAAA,QAClB,iBAAeL;AAAA,QACf,iBAAesnB;AAAA,QACf,SAASC;AAAA,QAER,UAAAzb;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL,gBAAA3L;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAImnB;AAAA,QACJ,MAAK;AAAA,QACL,mBAAiB7mB;AAAA,QACjB,QAAQ,CAACT;AAAA,QACT,WAAWK,GAAO;AAAA,QAEjB,UAAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAER;;;;;;;;;AC7CA,SAASomB,GAAYlnB,GAAoD;AACrE,SAAO,eAAeA,KAAQA,EAAK,cAAc;AACrD;AAaO,SAASmnB,GAAY,EAAE,OAAAzoB,GAAO,UAAAoC,GAAU,WAAA/B,KAA+B;AAC1E,QAAM,CAACkB,GAAMiF,CAAO,IAAI7F,EAAS,EAAK,GAChC,CAACkhB,GAAU6G,CAAW,IAAI/nB,EAAmB,EAAE,GAAG,GAAG,GAAG,GAAG,GAC3D,CAACgK,GAAaC,CAAc,IAAIjK,EAAiB,EAAE,GACnDI,IAAKR,EAAA,GACLooB,IAAU3f,EAAyB,IAAI,GACvC+D,IAAW/D,EAAwC,EAAE,GAErDgE,IAAoBhN,EACrB,IAAI,CAACsB,GAAMgG,MAAW,CAACkhB,GAAYlnB,CAAI,KAAK,CAACA,EAAK,WAAWgG,IAAQ,EAAG,EACxE,OAAO,CAAC4F,MAAMA,MAAM,EAAE,GAErBC,IAAQrM,EAAY,MAAY;AAClC,IAAA0F,EAAQ,EAAK,GACboE,EAAe,EAAE;AAAA,EACrB,GAAG,CAAA,CAAE,GAECge,IAAoB,CAAC5iB,MAAkC;AACzD,IAAAA,EAAM,eAAA,GACN0iB,EAAY,EAAE,GAAG1iB,EAAM,SAAS,GAAGA,EAAM,SAAS,GAClD4E,EAAe,EAAE,GACjBpE,EAAQ,EAAI;AAAA,EAChB;AAEA,EAAAxC,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAM6L,IAAQ,CAACpH,MAA+B;AAC1C,UAAIA,EAAM,QAAQ,UAAU;AACxB,QAAAmH,EAAA;AACA;AAAA,MACJ;AACA,UAAInH,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA;AACN,cAAMpC,IAAUoJ,EAAkB,QAAQrC,CAAW,GAC/C1J,IAAO+L,GAAmBpJ,IAAU,KAAKoJ,EAAkB,MAAM,KAAK;AAC5E,QAAApC,EAAe3J,CAAI,GACnB8L,EAAS,QAAQ9L,CAAI,GAAG,MAAA;AAAA,MAC5B;AACA,UAAI+E,EAAM,QAAQ,WAAW;AACzB,QAAAA,EAAM,eAAA;AACN,cAAMpC,IAAUoJ,EAAkB,QAAQrC,CAAW,GAC/C0C,IACFL,GACKpJ,IAAU,IAAIoJ,EAAkB,UAAUA,EAAkB,MACjE,KAAK;AACT,QAAApC,EAAeyC,CAAI,GACnBN,EAAS,QAAQM,CAAI,GAAG,MAAA;AAAA,MAC5B;AAAA,IACJ,GACMnC,IAAS,CAAClF,MAA4B;AACxC,MAAI2iB,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAAS3iB,EAAM,MAAc,KAAGmH,EAAA;AAAA,IAC5E;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACxC,OAAO,iBAAiB,aAAalC,CAAM,GACpC,MAAM;AACT,aAAO,oBAAoB,WAAWkC,CAAK,GAC3C,OAAO,oBAAoB,aAAalC,CAAM;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC3J,GAAMoJ,GAAaqC,GAAmBG,CAAK,CAAC;AAEhD,QAAMlC,IAAe,CAAC3J,MAA+D;AACjF,IAAAA,EAAK,WAAA,GACL6L,EAAA;AAAA,EACJ;AAEA,SACI,gBAAAzL,EAAA4B,GAAA,EACI,UAAA;AAAA,IAAA,gBAAAnC,EAAC,UAAK,WAAWE,GAAO,MAAM,eAAeunB,GACxC,UAAAxmB,GACL;AAAA,IACCb,uBACIikB,IAAA,EACG,UAAA,gBAAArkB;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKwnB;AAAA,QACL,IAAA5nB;AAAA,QACA,MAAK;AAAA,QACL,WAAWK,EAAGC,GAAO,MAAMhB,CAAS;AAAA,QACpC,OAAO,EAAE,KAAKwhB,EAAS,GAAG,MAAMA,EAAS,EAAA;AAAA,QAExC,UAAA7hB,EAAM,IAAI,CAACsB,GAAMgG,MACVkhB,GAAYlnB,CAAI,IAEZ,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,WAAWE,GAAO;AAAA,YAClB,eAAW;AAAA,UAAA;AAAA,UAHN,aAAaiG,CAAK;AAAA,QAAA,IAQ/B,gBAAAnG,EAAC,MAAA,EAAyB,MAAK,QAC3B,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAK,CAACqM,MAAO;AACT,cAAAT,EAAS,QAAQzF,CAAK,IAAIkG;AAAA,YAC9B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAWpM;AAAA,cACPC,GAAO;AAAA,cACPC,EAAK,UAAUD,GAAO;AAAA,cACtBsJ,MAAgBrD,KAASjG,GAAO;AAAA,YAAA;AAAA,YAEpC,UAAUC,EAAK;AAAA,YACf,SAAS,MAAM2J,EAAa3J,CAAI;AAAA,YAChC,cAAc,MAAMsJ,EAAetD,CAAK;AAAA,YAEvC,UAAAhG,EAAK;AAAA,UAAA;AAAA,QAAA,EACV,GAjBK,QAAQgG,CAAK,EAkBtB,CAEP;AAAA,MAAA;AAAA,IAAA,EACL,CACJ;AAAA,EAAA,GAER;AAER;;;;;;;;;;;AClIO,SAASuhB,GAAU;AAAA,EACtB,SAAA/b;AAAA,EACA,UAAA1K;AAAA,EACA,WAAA8e,IAAY;AAAA,EACZ,YAAA4H,IAAa;AAAA,EACb,WAAAtc,IAAY;AAAA,EACZ,WAAAnM;AAAA,EACA,GAAG0oB;AACP,GAAmB;AACf,QAAM,CAACxnB,GAAMiF,CAAO,IAAI7F,EAAS,EAAK,GAChCI,IAAKR,EAAA,GACLijB,IAAWxa,EAA6C,IAAI,GAE5DggB,IAAaloB,EAAY,MAAY;AACvC,IAAI0iB,EAAS,YAAY,SACrB,aAAaA,EAAS,OAAO,GAC7BA,EAAS,UAAU;AAAA,EAE3B,GAAG,CAAA,CAAE,GAECyF,IAAenoB,EAAY,MAAY;AACzC,IAAAkoB,EAAA,GACAxF,EAAS,UAAU,WAAW,MAAMhd,EAAQ,EAAI,GAAG0a,CAAS;AAAA,EAChE,GAAG,CAAC8H,GAAY9H,CAAS,CAAC,GAEpBgI,IAAgBpoB,EAAY,MAAY;AAC1C,IAAAkoB,EAAA,GACAxF,EAAS,UAAU,WAAW,MAAMhd,EAAQ,EAAK,GAAGsiB,CAAU;AAAA,EAClE,GAAG,CAACE,GAAYF,CAAU,CAAC;AAE3B,SAAA9kB,EAAU,MAAMglB,GAAY,CAACA,CAAU,CAAC,GAGpC,gBAAAtnB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWL,GAAO;AAAA,MAClB,cAAc4nB;AAAA,MACd,cAAcC;AAAA,MACd,SAASD;AAAA,MACT,QAAQC;AAAA,MAER,UAAA;AAAA,QAAA,gBAAA/nB,EAAC,QAAA,EAAK,oBAAkBI,IAAOR,IAAK,QAAW,WAAWM,GAAO,SAC5D,UAAAyL,EAAA,CACL;AAAA,QACCvL,KACG,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,IAAAJ;AAAA,YACA,MAAK;AAAA,YACL,WAAWK,EAAGC,GAAO,MAAMA,GAAOmL,CAAS,GAAGnM,CAAS;AAAA,YACtD,GAAG0oB;AAAA,YAEH,UAAA3mB;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAAA;AAIhB;ACnFA,MAAM+mB,KAAqB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,EAAE,KAAK,GAAG;AAOH,SAASC,GAAa3G,GAA6C9b,GAAuB;AAC7F,EAAA3C,EAAU,MAAM;AACZ,QAAI,CAAC2C,EAAQ;AACb,UAAM8e,IAAYhD,EAAa;AAC/B,QAAI,CAACgD,EAAW;AAEhB,UAAM4D,IAAoB,SAAS;AAEnC,aAASC,IAA8B;AACnC,aAAO,MAAM;AAAA,QACT7D,GAAW,iBAA8B0D,EAAkB,KAAK,CAAA;AAAA,MAAC,EACnE,OAAO,CAAC3b,MAAO;AACb,YAAIA,EAAG,aAAa,aAAa,EAAG,QAAO;AAC3C,cAAM1I,IAAQ,OAAO,SAAW,MAAc,OAAO,iBAAiB0I,CAAE,IAAI;AAC5E,eAAI,EAAA1I,MAAUA,EAAM,YAAY,UAAUA,EAAM,eAAe;AAAA,MAInE,CAAC;AAAA,IACL;AAEA,aAASykB,EAAcvjB,GAA4B;AAC/C,UAAIA,EAAM,QAAQ,MAAO;AACzB,YAAMwjB,IAAWF,EAAA;AACjB,UAAIE,EAAS,WAAW,GAAG;AACvB,QAAAxjB,EAAM,eAAA;AACN;AAAA,MACJ;AACA,YAAMyjB,IAAQD,EAAS,CAAC,GAClBE,IAAOF,EAASA,EAAS,SAAS,CAAC,GACnC5lB,IAAU,SAAS;AACzB,MAAIoC,EAAM,YACFpC,MAAY6lB,KAAS,CAAC7lB,KAAW,CAAC6hB,GAAW,SAAS7hB,CAAO,OAC7DoC,EAAM,eAAA,GACN0jB,EAAK,MAAA,KAGL9lB,MAAY8lB,MACZ1jB,EAAM,eAAA,GACNyjB,EAAM,MAAA;AAAA,IAGlB;AAGA,WADkBH,EAAA,EACR,CAAC,GAAG,MAAA,GACd,SAAS,iBAAiB,WAAWC,CAAa,GAC3C,MAAM;AACT,eAAS,oBAAoB,WAAWA,CAAa,GACrDF,GAAmB,QAAA;AAAA,IACvB;AAAA,EACJ,GAAG,CAAC5G,GAAc9b,CAAM,CAAC;AAC7B;;;;;;;;;;;;;;;;;ACnBA,SAASgjB,GAAaroB,GAAmB8I,GAAwB;AAE7D,SADIA,MAAU,MACV9I,EAAK,MAAM,YAAA,EAAc,SAAS8I,CAAK,IAAU,MAC7C9I,EAAK,YAAY,CAAA,GAAI,KAAK,CAACsoB,MAAYA,EAAQ,YAAA,EAAc,SAASxf,CAAK,CAAC;AACxF;AASA,SAASyf,GAAW7pB,GAAsC;AACtD,QAAM8pB,IAAyB,CAAA,GACzBC,wBAAkB,IAAA;AACxB,aAAWzoB,KAAQtB,GAAO;AACtB,UAAMgqB,IAAWD,EAAY,IAAIzoB,EAAK,KAAK;AAC3C,IAAI0oB,MAAa,UACbD,EAAY,IAAIzoB,EAAK,OAAOwoB,EAAO,MAAM,GACzCA,EAAO,KAAK,EAAE,MAAMxoB,EAAK,OAAO,OAAO,CAACA,CAAI,GAAG,KAE/CwoB,EAAOE,CAAQ,EAAG,MAAM,KAAK1oB,CAAI;AAAA,EAEzC;AACA,SAAOwoB;AACX;AAQO,SAASG,GAAQ;AAAA,EACpB,MAAA1oB;AAAA,EACA,cAAAsY;AAAA,EACA,OAAA7Z;AAAA,EACA,aAAAsJ,IAAc;AAAA,EACd,cAAAkB,IAAe;AAAA,EACf,WAAAnK;AACJ,GAAiB;AACb,QAAM6pB,IAAYlhB,EAAuB,IAAI,GACvC,CAACoB,GAAOM,CAAQ,IAAI/J,EAAiB,EAAE,GACvC,CAACgK,GAAaC,CAAc,IAAIjK,EAAiB,CAAC,GAClDwpB,IAAS;AAEf,EAAAf,GAAac,GAAW3oB,CAAI;AAE5B,QAAMwJ,IAAWnF,EAAuB,MAAM;AAC1C,UAAMwkB,IAAahgB,EAAM,KAAA,EAAO,YAAA,GAC1BigB,IAAUrqB,EAAM,OAAO,CAACsB,MAASqoB,GAAaroB,GAAM8oB,CAAU,CAAC;AACrE,WAAOP,GAAWQ,CAAO,EAAE,QAAQ,CAAC9P,MAAUA,EAAM,KAAK;AAAA,EAC7D,GAAG,CAACva,GAAOoK,CAAK,CAAC,GAEX0f,IAASlkB,EAAwB,MAAMikB,GAAW9e,CAAQ,GAAG,CAACA,CAAQ,CAAC;AAkB7E,MAfA/G,EAAU,MAAM;AACZ,IAAIzC,MACAmJ,EAAS,EAAE,GACXE,EAAe,CAAC;AAAA,EAExB,GAAG,CAACrJ,CAAI,CAAC,GAGTyC,EAAU,MAAM;AACZ,IAAA4G,EAAe,CAACtD,MACRyD,EAAS,WAAW,IAAU,IAC3B,KAAK,IAAIzD,GAAOyD,EAAS,SAAS,CAAC,CAC7C;AAAA,EACL,GAAG,CAACA,EAAS,MAAM,CAAC,GAEhB,CAACxJ,KAAQ,OAAO,WAAa,IAAa,QAAO;AAErD,WAAS+oB,EAAWhpB,GAAyB;AACzC,IAAAA,EAAK,SAAA,GACLuY,EAAa,EAAK;AAAA,EACtB;AAEA,WAAS9P,EAAc/D,GAAoD;AACvE,QAAIA,EAAM,QAAQ,UAAU;AACxB,MAAAA,EAAM,eAAA,GACN6T,EAAa,EAAK;AAClB;AAAA,IACJ;AACA,QAAI7T,EAAM,QAAQ,aAAa;AAE3B,UADAA,EAAM,eAAA,GACF+E,EAAS,WAAW,EAAG;AAC3B,MAAAH,EAAe,CAACtD,OAAWA,IAAQ,KAAKyD,EAAS,MAAM;AACvD;AAAA,IACJ;AACA,QAAI/E,EAAM,QAAQ,WAAW;AAEzB,UADAA,EAAM,eAAA,GACF+E,EAAS,WAAW,EAAG;AAC3B,MAAAH,EAAe,CAACtD,OAAWA,IAAQ,IAAIyD,EAAS,UAAUA,EAAS,MAAM;AACzE;AAAA,IACJ;AACA,QAAI/E,EAAM,QAAQ,SAAS;AACvB,MAAAA,EAAM,eAAA;AACN,YAAM1E,IAAOyJ,EAASJ,CAAW;AACjC,MAAIrJ,OAAiBA,CAAI;AAAA,IAC7B;AAAA,EACJ;AAEA,MAAIipB,IAAc;AAElB,SAAOpjB;AAAA,IACH,gBAAAhG,EAAC,OAAA,EAAI,WAAWE,EAAO,SAAS,MAAK,gBAAe,SAAS,MAAMwY,EAAa,EAAK,GACjF,UAAA,gBAAAnY;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKwoB;AAAA,QACL,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAW;AAAA,QACX,WAAW9oB,EAAGC,EAAO,QAAQhB,CAAS;AAAA,QACtC,SAAS,CAAC2F,MAAUA,EAAM,gBAAA;AAAA,QAE1B,UAAA;AAAA,UAAA,gBAAAtE,EAAC,OAAA,EAAI,WAAWL,EAAO,UACnB,UAAA;AAAA,YAAA,gBAAAF,EAAC2b,IAAA,EAAW;AAAA,YACZ,gBAAA3b;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,iBAAc;AAAA,gBACd,iBAAegpB;AAAA,gBACf,qBAAkB;AAAA,gBAClB,WAAS;AAAA,gBACT,WAAW9oB,EAAO;AAAA,gBAClB,aAAAiI;AAAA,gBACA,OAAOc;AAAA,gBACP,UAAU,CAACpE,MAAU0E,EAAS1E,EAAM,OAAO,KAAK;AAAA,gBAChD,WAAW+D;AAAA,cAAA;AAAA,YAAA;AAAA,UACf,GACJ;AAAA,UACA,gBAAA5I,EAAC,MAAA,EAAG,IAAIgpB,GAAQ,MAAK,WAAU,WAAW9oB,EAAO,MAC5C,UAAA0J,EAAS,WAAW,IACjB,gBAAA5J,EAAC,MAAA,EAAG,WAAWE,EAAO,OAAQ,UAAAmJ,EAAA,CAAa,IAE3Csf,EAAO,IAAI,CAACvP,MACR,gBAAA7Y,EAAC,MAAA,EAAuC,WAAWL,EAAO,OACrD,UAAA;AAAA,YAAAkZ,EAAM,QACH,gBAAApZ,EAAC,OAAA,EAAI,WAAWE,EAAO,cAAe,YAAM,KAAA,CAAK;AAAA,YAErD,gBAAAF,EAAC,MAAA,EAAG,MAAK,gBAAe,WAAWE,EAAO,WACrC,UAAAkZ,EAAM,MAAM,IAAI,CAACjZ,MAAS;AACvB,cAAAipB,KAAe;AACf,oBAAM7J,IAAW6J,MAAgB5f,GAC3BrD,IAAQijB;AACd,qBACI,gBAAA7oB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,MAAK;AAAA,kBACL,iBAAegf;AAAA,kBACf,WAAWtf;AAAA,oBACPC,EAAO;AAAA,oBACPqf,KAAYrf,EAAO;AAAA,kBAAA;AAAA,kBAEvB,aAAa,MAAMuJ,EAAetD,CAAK;AAAA,kBACvC,SAAS,MAAMgjB,EAAWhpB,CAAI;AAAA,kBAE7B,UAAA;AAAA,oBAAAA,EAAK,QACF,gBAAAH,EAAC,QAAA,EAAK,WAAWE,EAAO,MAAO,YAAK,KAAA,CAAK;AAAA,sCAE5C,QAAA,EAAK,WAAWA,EAAO,OAAQ,YAAK,MAAA,CAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAbtCC,EAAK;AAAA,cAAA;AAAA,YAgBtB,CAAC,EAAA,CACL;AAAA,UAAA,EAAA,GA5BKiZ,EAAM,QAAQ,eA6BvB,CACH,EAAA,CAET;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,IACA,SAAS;AAAA,EAAA;AAEjB;AAEA,SAASuC,KAAa;AAClB,SACI,gBAAApb;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWL,EAAO;AAAA,MAClB,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAF,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,QAAO,gBAAe,aAAY,IAAA,CAAI;AAAA,QACpE,gBAAAA,EAAC,UAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,KAAI,eAAc,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGlG;;;GC7NaqpB,KAAa9hB,EAA4C,SAClE,EAAE,WAAA+hB,GAAW,aAAApe,IAAc,YAAY,WAAAhM,GAAW,OAAAyE,GAAO,UAAA1C,GAAU,GAAGC,EAAA,GACtEyG,GACF;AACE,QAAMsc,IAA6B;AAAA,IAC/B,WAAW/Y,MAAgB,aAAa,WAAW;AAAA,IACnD,WAAWA,MAAgB,eAAe,WAAW;AAAA,IACrD,GAAIoe,MAAc,SAAY,EAAE,WAAAA,EAAA,IAAc,CAAA;AAAA,IAC9C,GAAG3lB;AAAA,EAAA;AAGP,SACI,gBAAA3D,EAAC,OAAA,EAAI,KAAA2H,GAAU,WAAW1H,EAAGC,GAAO,MAAMhB,CAAS,GAAG,OAAO+kB,GAAc,GAAG/iB,GACzE,UAAAD,EAAA,CACL;AAER,CAAC;;;;;;;GChBKsoB,KAAW;AAUjB,SAAS9V,GAAM1U,GAAe8a,GAAaf,GAAqB;AAC5D,SAAO,KAAK,IAAIA,GAAK,KAAK,IAAIe,GAAK9a,CAAK,CAAC;AAC7C;AASO,SAASyqB,GAAU;AAAA,EACtB,WAAA1Z,IAAY;AAAA,EACZ,aAAA2Z,IAAc;AAAA,EACd,KAAA5P,IAAM;AAAA,EACN,KAAAf,IAAM;AAAA,EACN,UAAA7X;AAAA,EACA,WAAA/B;AAAA,EACA,GAAGgC;AACP,GAAmB;AACf,QAAM,CAACiD,GAAMulB,CAAO,IAAIlqB,EAAiB,MAAMiU,GAAMgW,GAAa5P,GAAKf,CAAG,CAAC,GACrEwI,IAAezZ,EAA8B,IAAI,GACjD,CAAC8hB,GAAOC,CAAK,IAAI3oB,GACjB4oB,IAAe/Z,MAAc,cAE7Bga,IAAoBnqB;AAAA,IACtB,CAACoqB,GAAiBC,MAA0B;AACxC,YAAM1F,IAAYhD,EAAa;AAC/B,UAAI,CAACgD,EAAW;AAChB,YAAM2F,IAAO3F,EAAU,sBAAA,GACjB4F,IAAQL,IAAeI,EAAK,QAAQA,EAAK;AAC/C,UAAIC,KAAS,EAAG;AAEhB,YAAMC,KADSN,IAAeE,IAAUE,EAAK,OAAOD,IAAUC,EAAK,OACzCC,IAAS;AACnC,MAAAR,EAAQjW,GAAM0W,GAAStQ,GAAKf,CAAG,CAAC;AAAA,IACpC;AAAA,IACA,CAAC+Q,GAAchQ,GAAKf,CAAG;AAAA,EAAA,GAGrBsR,IAAoBzqB;AAAA,IACtB,CAACkF,MAA8C;AAC3C,MAAAA,EAAM,eAAA,GACUA,EAAM,cACd,kBAAkBA,EAAM,SAAS;AAEzC,YAAMwlB,IAAa,CAACC,MAA6C;AAC7D,QAAAR,EAAkBQ,EAAU,SAASA,EAAU,OAAO;AAAA,MAC1D,GACMC,IAAW,MAAY;AACzB,eAAO,oBAAoB,eAAeF,CAAU,GACpD,OAAO,oBAAoB,aAAaE,CAAQ;AAAA,MACpD;AAEA,aAAO,iBAAiB,eAAeF,CAAU,GACjD,OAAO,iBAAiB,aAAaE,CAAQ;AAAA,IACjD;AAAA,IACA,CAACT,CAAiB;AAAA,EAAA,GAGhBlhB,IAAgBjJ;AAAA,IAClB,CAACkF,MAA+C;AAC5C,UAAI8X,IAAQ;AAQZ,UAPIkN,IACIhlB,EAAM,QAAQ,eAAc8X,IAAQ4M,KAC/B1kB,EAAM,QAAQ,gBAAa8X,IAAQ,CAAC4M,MAEzC1kB,EAAM,QAAQ,cAAa8X,IAAQ4M,KAC9B1kB,EAAM,QAAQ,cAAW8X,IAAQ,CAAC4M,KAE3C1kB,EAAM,QAAQ,QAAQ;AACtB,QAAAA,EAAM,eAAA,GACN6kB,EAAQ7P,CAAG;AACX;AAAA,MACJ;AACA,UAAIhV,EAAM,QAAQ,OAAO;AACrB,QAAAA,EAAM,eAAA,GACN6kB,EAAQ5Q,CAAG;AACX;AAAA,MACJ;AACA,MAAI6D,MAAU,MACd9X,EAAM,eAAA,GACN6kB,EAAQ,CAACjnB,MAAYgR,GAAMhR,IAAUka,GAAO9C,GAAKf,CAAG,CAAC;AAAA,IACzD;AAAA,IACA,CAAC+Q,GAAchQ,GAAKf,CAAG;AAAA,EAAA;AAG3B,SACI,gBAAAvY;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK+gB;AAAA,MACL,WAAWrhB;AAAA,QACPC,GAAO;AAAA,QACP2pB,IAAe3pB,GAAO,aAAaA,GAAO;AAAA,QAC1ChB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAlB,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAM,OAAO,EAAE,WAAW,GAAGiE,CAAI,IAAA,GACnD,UAAAwlB,EAAA,CACL;AAAA,QACA,gBAAA3pB;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,oBAAkB6pB,IAAe,aAAa;AAAA,YAC9C,iBAAe,KAAK,MAAM1lB,CAAI;AAAA,YAC9B,iBAAe0V;AAAA,YACf,iBAAef;AAAA,YACf,UAAU;AAAA,YACV,WAAW5Y,GAAO;AAAA,YAClB,eAAekqB;AAAA,YACf,WAAWxhB;AAAA,YAEX,4BAAC,QAAA,EAAK,WAAW1I,GAAO,QAAQ,eAAY,OAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEvD,gBAAAF,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAM,OAAO,EAAE,WAAW,GAAG,MAAMiE,CAAI,IAAA,GACzD,UAAAylB,EAAA,CACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;;;;;;;;;;;;;GCtHMY,KAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GACjEC,KAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAEMC,KAAe;AAUrB,SAASC,GAASC,GAAcC,GAAeC,GAAmB;AAC9D,SAAO,IAAI,KAAKF,GAAMC,GAAOC,CAAG;AACpC;AAQA,SAASC,GAAWtH,GAAkB;AAClC,SAAO,IAAI,KAAKA,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAYA,EAAK,SAAS;AACvE;AASA,SAASuH,GAAUC,GAASC,GAAkB;AAC1C,SACID,EAAE,YAAA,MAAkBC,EAAE,YAAA,KACtBD,EAAE,SAAA,MAAeC,EAAE,cACnBD,EAAE,QAAA,MAAcC,EAAE,QAAA;AAE1B;AAUA,SAASC,GAAa1H,GAAY2H,GAAgBC,GAAyB;AACvE,QAAMP,IAAMC,GAAWtH,CAAI,EAAE,QAAA;AAE7B,SADI,GAAA2H,KAAWN,IAAMC,GAAWK,CAAO,EAAE,QAAA,KACrCC,KAAWP,IAAMC,GAAWM,CAAO,EAAE,QAAA;AAE7C;AAUA,SAASC,GAAUT,GAAaU,GAAiC;AAC7D,QAAMX,IAAOC,EAAM,YAAA,GACbW,IAAaX,EAAM,SAAA,GAGnBxpB,KAFespB,GAASC,GAAMY,GAAY,CAAC,EACf,OAAA,IACFD,IAAe,KAAK,GAC9ChW,IAAQoV,GAASC,GAAMY,GAAY,IAAInqB,CAAO,GAE9CuW,IAAgB,CAAA;AACtB,WAAS7L,IAAI,GAAGA,IAAI2e,IAAc3e,KAAK;AACnC,IAAA6L,EAAM,KAAK+S,GAASpV,EAAM,YAAA,GAAeA,EAAM,SAAA,GAAYA,EAAM,QAAA,IAAYxJ,CAAC,CAAC;AAEnF,SAAO6L;AACX;AAWO,SAAS6T,GAAS;AAAA,EACrB,OAAA1sB;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAA4rB;AAAA,EACA,eAAAa;AAAA,EACA,SAAAN;AAAA,EACA,SAAAC;AAAA,EACA,cAAAE,IAAe;AAAA,EACf,WAAArsB;AAAA,EACA,GAAGgC;AACP,GAAkB;AACd,QAAMyqB,IAAwB5sB,MAAU,QAClC,CAAC6sB,GAAkBC,CAAmB,IAAIrsB,EAA2BR,CAAY,GACjF+c,IAAW4P,IAAwB5sB,IAAQ6sB,GAE3CE,IAAoBjB,MAAU,QAC9B,CAACkB,GAAeC,CAAgB,IAAIxsB,EAAe,MAAM;AAC3D,UAAM+d,IAAOsN,KAAS9rB,KAASC,yBAAoB,KAAA;AACnD,WAAO2rB,GAASpN,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAY,CAAC;AAAA,EAC1D,CAAC,GACK0O,IAAeH,IACfnB,GAASE,EAAM,eAAeA,EAAM,SAAA,GAAY,CAAC,IACjDkB,GAEA,CAACG,GAAYC,CAAa,IAAI3sB,EAAwB,IAAI,GAC1D4sB,IAAUvkB,EAA8B,IAAI,GAE5CwkB,IAAQ5nB,EAAQ,MAAMsmB,uBAAe,KAAA,CAAM,GAAG,EAAE,GAChDnT,IAAQnT;AAAA,IACV,MAAM6mB,GAAUW,GAAcV,CAAY;AAAA,IAC1C,CAACU,GAAcV,CAAY;AAAA,EAAA,GAGzBe,IAAgB7nB,EAAQ,MACnB,MAAM,KAAK,EAAE,QAAQ,EAAA,GAAK,CAAC6Q,GAAGvJ,MAAMye,IAAgBze,IAAIwf,KAAgB,CAAC,CAAC,GAClF,CAACA,CAAY,CAAC,GAEXgB,IAAc5sB;AAAA,IAChB,CAACoiB,MAAyB;AACtB,YAAMjiB,IAAO6qB,GAASsB,EAAa,YAAA,GAAeA,EAAa,SAAA,IAAalK,GAAQ,CAAC;AACrF,MAAI2J,OAA6B5rB,CAAI,GAChCgsB,KAAmBE,EAAiBlsB,CAAI;AAAA,IACjD;AAAA,IACA,CAACmsB,GAAcP,GAAeI,CAAiB;AAAA,EAAA,GAG7CU,IAAa7sB;AAAA,IACf,CAAC8jB,MAAqB;AAClB,MAAI0H,GAAa1H,GAAM2H,GAASC,CAAO,MACnCpsB,OAAmBwkB,CAAI,GACtBkI,KAAuBE,EAAoBpI,CAAI;AAAA,IACxD;AAAA,IACA,CAAC2H,GAASC,GAASpsB,GAAU0sB,CAAqB;AAAA,EAAA,GAGhD3T,IAAYrY,EAAY,CAACwG,MAAwB;AACnD,UAAMsmB,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI/B,KAAe,GAAGvkB,CAAK,CAAC;AAC7D,IAAAgmB,EAAcM,CAAO;AACrB,UAAMC,IAAON,EAAQ;AACrB,QAAI,CAACM,EAAM;AAEX,IADgBA,EAAK,iBAAoC,kBAAkB,EACnED,CAAO,GAAG,MAAA;AAAA,EACtB,GAAG,CAAA,CAAE,GAEC7jB,IAAgBjJ;AAAA,IAClB,CAACkF,GAAyCsB,MAAwB;AAC9D,cAAQtB,EAAM,KAAA;AAAA,QACV,KAAK;AACD,UAAAA,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC;AACnB;AAAA,QACJ,KAAK;AACD,UAAAtB,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC;AACnB;AAAA,QACJ,KAAK;AACD,UAAAtB,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC;AACnB;AAAA,QACJ,KAAK;AACD,UAAAtB,EAAM,eAAA,GACNmT,EAAU7R,IAAQ,CAAC;AACnB;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AACD,UAAAtB,EAAM,eAAA,GACN2nB,EAAW5U,EAAMzR,CAAK,CAAC;AACvB;AAAA,MAEA;AAAA,IAEZ;AAAA,IACA,CAAC6R,GAAWwU,GAAY5U,CAAK;AAAA,EAAA;AAGjC,SACI,gBAAArX,EAAC,SAAI,WAAWN,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC5C,UAAA;AAAA,IAAA,gBAAAX,EAAC,OAAA,EAAI,WAAWL,GAAO,QACnB,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,cAAW;AAAA,UACX,SAAS,MAAMqsB,EAAY,EAAE;AAAA,UAE5B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEJ,QAAA,EAAK,WAAWrsB,GAAO,OAAO,aAAU,UACpC,UAAA;AAAA,QAAAuqB,GAAawB,EAAa,UAAU;AAAA,QAAE;AAAA,QAAEA,EAAa,YAAA;AAAA,MAAY,GACtE;AAAA,MACA,gBAAAjsB;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,cAAW;AAAA,UACX,SAAS,MAAMqsB,EAAY,CAAC;AAAA,UAE3B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACL,GACJ;AAAA,IAEA,gBAAAvsB,EAAC,SAAI,WAAWE,GAAO,UAAU,MAAK,OACjC,YAAc,IAAI,CAACsH,MAChB,gBAAAxH,EAAC,QAAA,EAAiB,WAAWE,GAAO,SAAS,MAAK,gBAC7C,UAAAsH,EAAA,GADMA,CAEX,CACH,EAAA,CACL;AAAA,IAEA,gBAAAxH,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAM,MAAK,QAAO,KAAKksB,GACzC,UAAAxU,EAAM,IAAI,CAAC6L,GAAMtd,MAAU;AACxB,YAAMwmB,IAAUlJ,EAAK,SAAA,MAAewI,EAAa,SAAA,GAC3CjF,IAAajL,IAAWiP,GAAUvH,GAAM1H,CAAQ,IAAI,IACpD6Q,IAAU5B,GAAUvH,GAAM4I,CAAK,GAC/BxlB,IAAWskB,GAAa1H,GAAM2H,GAASC,CAAO,GAC9CwB,KACFX,MAAe,OACTS,KAAWlJ,EAAK,QAAA,MAAc,IAC9ByI,MAAe/lB;AACzB,aACI,gBAAAnG;AAAA,QAAC;AAAA,QAAA;AAAA,UAEG,MAAK;AAAA,UACL,YAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAWC;AAAA,YACPC,GAAO;AAAA,YACP,CAACysB,KAAWzsB,GAAO;AAAA,YACnB8mB,KAAc9mB,GAAO;AAAA,YACrB0sB,KAAW1sB,GAAO;AAAA,UAAA;AAAA,UAEtB,gBAAc8mB;AAAA,UACd,iBAAeA;AAAA,UACf,gBAAc4F,IAAU,SAAS;AAAA,UACjC,UAAA/lB;AAAA,UACA,UAAUgmB,KAAgB,IAAI;AAAA,UAC9B,SAAS,MAAML,EAAW/I,CAAI;AAAA,UAC9B,WAAW,CAAC5e,OAAU+D,EAAc/D,IAAOsB,CAAK;AAAA,UAE/C,YAAK,QAAA;AAAA,QAAQ;AAAA,QAlBTA;AAAA,MAAA;AAAA,IAqBjB,CAAC,EAAA,CACL;AAAA,EAAA,GACJ;AAER;;;;;;;;;;;AC/QO,SAAS2mB,GAAO;AAAA,EACnB,OAAA/tB;AAAA,EACA,UAAAE;AAAA,EACA,KAAA4a,IAAM;AAAA,EACN,KAAAf,IAAM;AAAA,EACN,MAAAvE,IAAO;AAAA,EACP,OAAA/M;AAAA,EACA,YAAAY;AAAA,EACA,UAAAvB,IAAW;AAAA,EACX,aAAAiT;AAAA,EACA,WAAA5a;AACJ,GAAgB;AACZ,QAAM8Z,IAAMvU,EAAQ,MAAM;AACtB,UAAMgR,IAAQqD,IAAMe;AACpB,WAAIpE,KAAS,IAAU,IAChB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK1W,IAAQ8a,KAAOpE,IAAS,GAAG,CAAC;AAAA,EACnE,GAAG,CAAC1W,GAAO8a,GAAKf,CAAG,CAAC,GAEdqB,IAAYL,IAAc/a,CAAK,KAAK,OAAOA,CAAK,GAEhDya,IAAe7Z;AAAA,IACjB,CAACkF,MAAqD;AAClD,MAAA5F,EAAS,OAAO4F,EAAM,OAAO,KAAK,CAAC;AAAA,IACvC;AAAA,IACA,CAAC5F,CAAQ;AAAA,EAAA;AAGb,2BACK,OAAA,EAAI,WAAWgB,EAAGC,GAAO,SAAShB,CAAS,GACvC,UAAA;AAAA,IAAAsI,KACG,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,GAAO,OACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,UAAM,UAAAwH,EAAA,CAAM;AAAA,MACb,gBAAAxH,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAia,EAAA,CAAU;AAAA,IAAA,GAC9C;AAAA,IAEJ,gBAAA5Z,EAAC,OAAA,EAAI,WAAWL,GAAO,OACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAA,CAAO;AAAA,MAC9B,gBAAAF,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAM,OAAO,EAAE,OAAO,GAAG8Y,CAAG,IAAA,EAAI,CAAG;AAAA,MAC1D,gBAAAhZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,KAAA2Z;AAAA,UACA,KAAAf;AAAA,UACA,MAAAvE;AAAA,UACA,OAAAxV;AAAA,UACA,UAAUya;AAAA,UACV,UAAA3S;AAAA,UACA,cAAYW,KAAS;AAAA,UACrB,kBAAgB2S;AAAA,QAAA;AAAA,MAAA;AAAA,IACpB,GACJ;AAAA,IACC/R,KAAc,gBAAApI,EAAC,QAAA,EAAK,WAAWE,GAAO,QAAS,UAAAkI,EAAA,CAAW;AAAA,EAAA,GAC/D;AAER;;;;;;;;;;;;;;;;;;;AClDA,SAASW,GAAcC,GAA2BC,GAAwB;AACtE,SAAKA,IACED,EAAO,MAAM,YAAA,EAAc,SAASC,EAAM,aAAa,IAD3C;AAEvB;AAUO,SAAS8jB,GAAY;AAAA,EACxB,SAAA5jB;AAAA,EACA,OAAApK;AAAA,EACA,UAAAE;AAAA,EACA,OAAAuI;AAAA,EACA,aAAAW,IAAc;AAAA,EACd,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAxB;AAAA,EACA,UAAAmmB;AAAA,EACA,QAAA5jB,IAASL;AAAA,EACT,cAAAM,IAAe;AAAA,EACf,WAAAnK;AACJ,GAAqB;AACjB,QAAMU,IAAKR,EAAA,GACLkK,IAAUzB,EAAuB,IAAI,GACrCa,IAAWb,EAAyB,IAAI,GACxC,CAACzH,GAAMiF,CAAO,IAAI7F,EAAS,EAAK,GAChC,CAACyJ,GAAOM,CAAQ,IAAI/J,EAAS,EAAE,GAC/B,CAACgK,GAAaC,CAAc,IAAIjK,EAAS,CAAC,GAE1CytB,IAAcxoB,EAAQ,MAAM,IAAI,IAAI1F,CAAK,GAAG,CAACA,CAAK,CAAC,GACnDmuB,IAAkBzoB;AAAA,IACpB,MACI1F,EACK,IAAI,CAAC+nB,MAAM3d,EAAQ,KAAK,CAACQ,MAAMA,EAAE,UAAUmd,CAAC,CAAC,EAC7C,OAAO,CAACnd,MAA8B,EAAQA,CAAE;AAAA,IACzD,CAAC5K,GAAOoK,CAAO;AAAA,EAAA,GAEbS,IAAWnF;AAAA,IACb,MAAM0E,EAAQ,OAAO,CAACQ,MAAMP,EAAOO,GAAGV,CAAK,CAAC;AAAA,IAC5C,CAACE,GAASC,GAAQH,CAAK;AAAA,EAAA,GAGrBkkB,IAAQH,MAAa,UAAajuB,EAAM,UAAUiuB,GAElDttB,IAASC;AAAA,IACX,CAACqJ,MAAoC;AACjC,UAAI,CAAAA,EAAO,UACX;AAAA,YAAIikB,EAAY,IAAIjkB,EAAO,KAAK;AAC5B,UAAA/J,EAASF,EAAM,OAAO,CAAC+nB,MAAMA,MAAM9d,EAAO,KAAK,CAAC;AAAA,aAC7C;AACH,cAAImkB,EAAO;AACX,UAAAluB,EAAS,CAAC,GAAGF,GAAOiK,EAAO,KAAK,CAAC;AAAA,QACrC;AACA,QAAAO,EAAS,EAAE,GACXb,EAAS,SAAS,MAAA;AAAA;AAAA,IACtB;AAAA,IACA,CAACukB,GAAahuB,GAAUF,GAAOouB,CAAK;AAAA,EAAA,GAGlCC,IAAWztB;AAAA,IACb,CAAC0tB,MAA8B;AAC3B,MAAApuB,EAASF,EAAM,OAAO,CAAC+nB,MAAMA,MAAMuG,CAAW,CAAC;AAAA,IACnD;AAAA,IACA,CAACpuB,GAAUF,CAAK;AAAA,EAAA;AAGpB,EAAA8D,EAAU,MAAM;AACZ,QAAI,CAACzC,EAAM;AACX,UAAM2J,IAAS,CAAClF,MAA4B;AACxC,MAAIyE,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,MACjEQ,EAAQ,EAAK,GACbkE,EAAS,EAAE;AAAA,IAEnB;AACA,kBAAO,iBAAiB,aAAaQ,CAAM,GACpC,MAAM,OAAO,oBAAoB,aAAaA,CAAM;AAAA,EAC/D,GAAG,CAAC3J,CAAI,CAAC;AAET,QAAMwI,IAAgB,CAAC/D,MAAuD;AAC1E,QAAIA,EAAM,QAAQ;AACd,MAAAA,EAAM,eAAA,GACNQ,EAAQ,EAAI,GACZoE,EAAe,CAAChH,MAAY,KAAK,IAAImH,EAAS,SAAS,GAAGnH,IAAU,CAAC,CAAC;AAAA,aAC/DoC,EAAM,QAAQ;AACrB,MAAAA,EAAM,eAAA,GACN4E,EAAe,CAAChH,MAAY,KAAK,IAAI,GAAGA,IAAU,CAAC,CAAC;AAAA,aAC7CoC,EAAM,QAAQ,SAAS;AAC9B,MAAAA,EAAM,eAAA;AACN,YAAMmE,IAASY,EAASJ,CAAW;AACnC,MAAIR,OAAeA,CAAM;AAAA,IAC7B,MAAA,CAAWnE,EAAM,QAAQ,YACrBQ,EAAQ,EAAK,GACbkE,EAAS,EAAE,KACJ1E,EAAM,QAAQ,eAAeoE,MAAU,MAAMlK,EAAM,SAAS,KACnEquB,EAASruB,EAAMA,EAAM,SAAS,CAAC,CAAC;AAAA,EAExC;AAEA,SACI,gBAAAwB,EAAC,OAAA,EAAI,KAAK+I,GAAS,WAAWrJ,EAAGC,EAAO,SAASmI,KAASnI,EAAO,OAAOhB,CAAS,GAC5E,UAAA;AAAA,IAAAsI,uBACI,SAAA,EAAM,SAAS5H,GAAI,WAAWM,EAAO,OACjC,UAAAsH,EAAA,CACL;AAAA,IAEJ,gBAAAjH;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAWN,EAAGC,EAAO,OAAO2G,KAAY3G,EAAO,QAAQ;AAAA,QACvD,aAAa,CAAC2E,MAAU;AACpB,UAAIgC,KAEAhC,EAAM,WAAWA,EAAM,kBACvBA,EAAM,eAAA,GACN6D,EAAS,SAAS,MAAA,GAClBrD,EAAQ,EAAI;AAAA,QAEpB;AAAA,QAEC,UAAA;AAAA,UAAA6nB,EAAgB,IAAI,CAAClkB,wBACjB,QAAA,EAAwB,WAAW9I,EAAO,MACtC,UAAA;AAAA,YAAA8I,EAAO;AAAA,YACR,gBAAAhJ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAWE,EAAO;AAAA,gBAClB,cAAY,WAAW8I,EAAO,KAAK;AAAA,gBACnC,UAAAnC;AAAA,gBACA,aAAa,CAAChC,MAAU;AACpB,kBAAAA,EAAM,eAAA,GACNuoB,EAASpkB,EAAO,KAAK;AAAA,gBACzB;AAAA,gBACH,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,KAbOA,EAAO,KAclB,CACH;AAAA,UACD,gBAAAhJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAAJ;AAAA,cACA,KAAK8I;AAAA,cACL,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAetI;AAAA,cACf,iBAAe,GAAGR,CAAE;AAAA,cACpB,qBAAkB;AAAA,cAClB,WAAWM,EAAO;AAAA,cAClB,aAAanB,EAAM,WAAW,IAAIoJ,IAAc;AAAA,cAChD,UAAAtB;AAAA,cACA,OAAOoC;AAAA,cACP,SAAS,MAAM5D,EAAQ,EAAI;AAAA,cAC3B,UAAU,CAACR,MAAU;AACjB,gBAAA0E,EAAS1E,EAAM,OAAO,KAAK,GAC3BQ,EAAQ,EAAI,GACZoE,EAAe,CAAC;AAAA,cACpB;AAAA,cACA,WAAWb;AAAA,YAAA;AAAA,UAAA;AAAA,QACf;AAAA,MAAA;AAAA,IAAA;AAAA,IAEHxI,KACG,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAI,GAAGJ,CAAE;AAAA,QACT,MAAK;AAAA,QACL,wBAAoB;AAAA,QACpB,WAAWM,EAAO;AAAA,QAEjB,UAAA0J,EAAS,WAAW,IACjB,gBAAA5J,EAAC,QAAG,WAAWE,EAAO,OAAQ,UAAAmJ,GAAa,IAE3CO,EAAS,IAAI,CAACZ,GAAQ7C,MAAU;AAC5B,gBAAM6gB,IAAaiG,EAAY,IAAIjkB,EAAO,KAAK;AAC/C,iBACI,gBAAAzI;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,MAAK;AAAA,cACL,iBAAeymB;AAAA,cACf,iBAAehe,EAAO,YAAa,CAACge,KAAcmG;AAAA,cAClD,WAAWltB;AAAA,gBACPC,EAAO;AAAA,gBACPiG,MAAUqD,KAAetJ,EAAO;AAAA,gBAChC8mB,KAAc9mB,EAAO;AAAA,cAAA;AAAA,cAEzB,cAAc,MAAMuJ,EAAetD,CAAK;AAAA,cACxC,aAAa,CAACtB,MAAU;AACpB,gBAAAA,EAAM,eAAA,GACNnF,EAAOsJ,CAAM;AAAA,cACjB;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAAhJ,EAAC,QAAA,EAAK,WAAWE,EAAO,OAAO,eAAW,IACrC,UAAA8mB,IAAa,MAAM,GAAA,CACxB;AAAA,gBACChe,EAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAlBHA,EAAO;AAAA,UAAA;AAAA,QAqBxB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIZX,IACG,gBAAArI,EAAC,QAAA,EAAK,WAAWE,EAAO,WAAY,UAAAmI,EAAA,CAAM,IAC1CD,sBACC,QAAA,EAAK,WAAWlI,EAAO,QAAS,aAAW,IAC5C;AAAA,EAAA,GACR;AAER;;;;;;;;;;;;;;;;;;;GC5MMsqB,KAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GACjEC,KAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GACMC,KAAe;AAErB,SAASC,GAASC,GAAcC,GAAeC,GAAmB;AAC9D,SAAO,IAAI,KAAKF,GAAMC,GAAOC,CAAG;AACpC;AAEA,SAASC,GAAWtH,GAAkB;AAClC,SAAO,IAAI,KAAKA,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAYA,EAAK,SAAS;AACvE;AAEA,SAAS6J,GAAU7J,GAAY1B,GAAsB;AACjD,SAAO4I,GAASlH,EAAK,YAAA,GAAeA,EAAK,SAAA,IAAa1B,GAAQ,CAAC;AACnE;AAEA,SAASiJ,GAAUC,GAASC,GAAkB;AAC1C,SACID,EAAE,YAAA,MAAkBC,EAAE,YAAA,KACtBD,EAAE,SAAA,MAAeC,EAAE,cACnBD,EAAE,QAAA,MAAcC,EAAE,QAAA;AAE1B;AAEA,SAASC,GAAa1H,GAAY2H,GAAgBC,GAAyB;AACvE,QAAMP,IAAMC,GAAWtH,CAAI,EAAE,QAAA;AAE7B,SADI,GAAA2H,KAAWN,IAAMC,GAAWK,CAAO,EAAE,QAAA,KACrCC,KAAWP,IAAMC,GAAWM,CAAO,EAAE,QAAA;AAE7C;AAGA,SAASkC,GAAU9J,GAAYwH,GAASC,GAAkB;AACtD,QAAMhd,IAAI6c,GAAWtH,CAAI,EAAE,QAAA,GACrB+J,IAAK,KAAK,IAAIzC,GAAWE,CAAC,EAAE,QAAA,GAAWF,GAAWG,CAAC,EAAE,QAAA,CAAS,GAC9DuC,IAAK,KAAK,IAAI1C,GAAWE,CAAC,EAAE,QAAA,GAAWF,GAAWG,CAAC,EAAE,QAAA,CAAS;AACpE,SAAOhd,IAAIsf,KAAMtf,IAAIuf;AACzB;AAEA,SAASnC,GAAUT,GAAaU,GAAiC;AAC7D,QAAMX,IAAOC,EAAM,YAAA,GACbW,IAAaX,EAAM,SAAA,GAEnBxpB,KADespB,GAASC,GAAMY,GAAY,CAAC,EAAE,OAAA,IACnBD,IAAe,KAAK,GAC9ChW,IAAQoV,GAASC,GAAMY,GAAY,IAAInqB,CAAO;AACpD,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQqpB,GAAA;AAAA,IAAgB,CAACpV,GAAGvJ,MAC5C4e,GAASpV,EAAM,YAAA,GAAeA,EAAM,SAAA,GAAYA,EAAM,QAAA,IAAYxJ,CAAC;AAAA,EAAA;AAE3E;AAUO,SAAS2hB,GAAgB;AAAA,EAC5B,OAAA3uB;AAAA,EACA,UAAAE;AAAA,EACA,gBAAA0uB,IAAiB;AAAA,EACjB,cAAAC;AAAA,EACA,SAAAxC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAE,IAAe;AAAA,EACf,WAAArsB;AAAA,EACA,GAAGgC;AACP,GAAyB;AACrB,QAAM,CAAC+qB,GAAc4B,CAAe,IAAIruB,EAAe,MAAM;AACzD,UAAM+d,IAAOqQ,KAAgB7uB,EAAM,6BAAa,KAAA;AAChD,WAAO4rB,GAASpN,EAAK,YAAA,GAAeA,EAAK,SAAA,GAAY,CAAC;AAAA,EAC1D,CAAC,GACK,CAACuQ,GAASC,CAAU,IAAIvuB,EAAsB,IAAI,GAElD6sB,IAAQ5nB,EAAQ,MAAMsmB,uBAAe,KAAA,CAAM,GAAG,EAAE,GAChDuB,IAAgB7nB;AAAA,IAClB,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAA,GAAK,CAAC6Q,GAAGvJ,MAAMye,IAAgBze,IAAIwf,KAAgB,CAAC,CAAC;AAAA,IAChF,CAACA,CAAY;AAAA,EAAA,GAGXiB,IAAa7sB;AAAA,IACf,CAAC8jB,MAAqB;AAClB,UAAI0H,GAAa1H,GAAM2H,GAASC,CAAO,EAAG;AAC1C,YAAM,EAAE,OAAA9V,GAAO,KAAAC,EAAA,IAAQzW;AACvB,MAAI,CAACwW,KAASC,IACVvW,EAAS,EAAE,OAAOwkB,GAAM,KAAK,MAAM,IAC5BsH,GAAWtH,CAAI,EAAE,QAAA,IAAYsH,GAAWxV,CAAK,EAAE,YACtDtW,EAAS,EAAE,OAAOwkB,GAAM,KAAKlO,GAAO,IAEpCtW,EAAS,EAAE,OAAAsW,GAAO,KAAKkO,EAAA,CAAM;AAAA,IAErC;AAAA,IACA,CAAC1kB,GAAOE,GAAUmsB,GAASC,CAAO;AAAA,EAAA,GAGhCkB,IAAc5sB,EAAY,CAACoiB,MAAyB;AACtD,IAAA8L,EAAgB,CAACprB,MAAY6qB,GAAU7qB,GAASsf,CAAM,CAAC;AAAA,EAC3D,GAAG,CAAA,CAAE,GAGCiM,IAAajvB,EAAM,SAAS,CAACA,EAAM,MAAM+uB,IAAU/uB,EAAM;AAE/D,WAASkvB,EAASxK,GAKhB;AACE,UAAM,EAAE,OAAAlO,MAAUxW,GACZyW,IAAMwY,GACNE,IAAU3Y,IAAQyV,GAAUvH,GAAMlO,CAAK,IAAI,IAC3C4Y,IAAQ3Y,IAAMwV,GAAUvH,GAAMjO,CAAG,IAAI,IACrC4Y,IAAU7Y,KAASC,IAAM+X,GAAU9J,GAAMlO,GAAOC,CAAG,IAAI;AAC7D,WAAO,EAAE,UAAU0Y,KAAWC,GAAO,SAAAC,GAAS,SAAAF,GAAS,OAAAC,EAAA;AAAA,EAC3D;AAEA,SACI,gBAAA5tB,EAAC,SAAI,WAAWN,EAAGC,EAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC5C,UAAA;AAAA,IAAA,gBAAAX,EAAC,OAAA,EAAI,WAAWL,EAAO,QACnB,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,EAAO;AAAA,UAClB,cAAW;AAAA,UACX,SAAS,MAAMqsB,EAAY,EAAE;AAAA,UAE5B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEJ,QAAA,EAAK,WAAWrsB,EAAO,cAAc,eAAW,IAAC;AAAA,MAClD,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWE,EAAO;AAAA,UAClB,cAAW;AAAA,UACX,SAAS,MAAMqsB,EAAY,CAAC;AAAA,UAE3B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACL,GACJ;AAAA,IAEA,gBAAAvsB,EAAC,SAAI,WAAWE,EAAO,QAAQ,cAAc,MAAM6tB,EAAW,IAAI,GAC7D,UAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAGJ,CAAc,EAAA,GAAK,CAACrY,GAAG+Y,MAAgB;AACrE,YAAMxD,IAAQyC,GAAUrB,GAAcoC,CAAW,GAC3CzW,IAAQ0T,GAAUT,GAAOU,CAAY;AAC3C,aACI,gBAAAhrB,EAAC,OAAA,EAAsB,WAAWL,EAAO,OACrC,UAAA;AAAA,QAAA,gBAAAK,EAAC,OAAA,EAAI,WAAWL,EAAO,OAAO,aAAU,UACnC,UAAA;AAAA,UAAAuqB,GAAaI,EAAM,UAAU;AAAA,UAAE;AAAA,UAAEA,EAAM,YAAA;AAAA,QAAY,GACxD;AAAA,QACA,gBAAA7qB,EAAC,OAAA,EAAI,WAAWE,EAAO,UAAU,MAAK,OACjC,UAAAosB,EAAc,IAAI,CAAC9kB,MAChB,gBAAAxH;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,WAAWE,EAAO;AAAA,YAClB,MAAK;AAAA,YAEJ,UAAAsH;AAAA,UAAA;AAAA,UAJIA;AAAA,QAAA,CAMZ,GACL;AAAA,QACA,gBAAAxH,EAAC,OAAA,EAAI,WAAWE,EAAO,MAAM,MAAK,QAC7B,UAAA0X,EAAM,IAAI,CAAC6L,GAAMtd,MAAU;AACxB,gBAAMwmB,IAAUlJ,EAAK,SAAA,MAAeoH,EAAM,SAAA,GACpChkB,IAAWskB,GAAa1H,GAAM2H,GAASC,CAAO,GAC9C,EAAE,UAAAtP,GAAU,SAAAqS,GAAS,SAAAF,GAAS,OAAAC,EAAA,IAAUF,EAASxK,CAAI,GACrDmJ,IAAU5B,GAAUvH,GAAM4I,CAAK;AACrC,iBACI,gBAAArsB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,MAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAWC;AAAA,gBACPC,EAAO;AAAA,gBACP,CAACysB,KAAWzsB,EAAO;AAAA,gBACnBkuB,KAAWluB,EAAO;AAAA,gBAClB6b,KAAY7b,EAAO;AAAA,gBACnBguB,KAAWhuB,EAAO;AAAA,gBAClBiuB,KAASjuB,EAAO;AAAA,gBAChB0sB,KAAW1sB,EAAO;AAAA,cAAA;AAAA,cAEtB,cAAY,GAAGuqB,GAAahH,EAAK,UAAU,CAAC,IAAIA,EAAK,QAAA,CAAS,KAAKA,EAAK,aAAa;AAAA,cACrF,iBAAe1H;AAAA,cACf,gBAAc6Q,IAAU,SAAS;AAAA,cACjC,UAAA/lB;AAAA,cACA,SAAS,MAAM2lB,EAAW/I,CAAI;AAAA,cAC9B,cAAc,MAAMsK,EAAWtK,CAAI;AAAA,cAElC,YAAK,QAAA;AAAA,YAAQ;AAAA,YAnBTtd;AAAA,UAAA;AAAA,QAsBjB,CAAC,EAAA,CACL;AAAA,MAAA,EAAA,GA9CMkoB,CA+CV;AAAA,IAER,CAAC,EAAA,CACL;AAAA,EAAA,GACJ;AAER;;;;;;;;;;ACtMO,SAASC,GAAe,EAAE,OAAAzvB,GAAO,WAAAK,GAAW,GAAGgC,KAA8B;AAChF,QAAM,CAACqtB,GAAcC,CAAe,IAAIhvB,EAAiB,EAAE,GACrD,CAACsuB,GAASC,CAAU,IAAIvuB,EAAiB,EAAE,GAC3CivB,IAASrvB,EAAA,GACTkK,IAAUzB,EAAoB,IAAI,GAElCmE,IAAQrM,EAAY,MAAY;AAClC,IAAA6uB,EAAgB,EAAE,GAClBT,EAAW,EAAE;AAAA,EACjB,GAAG,CAAA,CAAE,GAECW,IAAYH,MAAiB,KAAKA,IAAeT;AAEvD,EAAAjrB,EAAU,MAAM;AACZ,QAAI6rB,MAAc,GAAI;AACtB,UAAMziB,IAAQ,CAACpH,MAA+B;AAC1C,MAAIA,EAAM,QAAQ,YAAUmH,EAAA;AAAA,IAChC,GACMjC,IAAS,CAAClF,MAA4B;AACxC,MAAIyE,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,KAAGmH,EAAA;AAAA,IAC5E;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACxC,OAAO,iBAAiB,aAAalC,CAAM,GACpC,MAAM;AACT,aAAO,oBAAoB,WAAWkC,CAAK,GAC3C,OAAO,oBAAoB,aAAalC,CAAM;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC2kB,GAAW1iB,CAAK,CAAC;AAErB,QAAM2iB,IAAa,CAACxuB,GAA0BwE,MAAyC;AACnF,UAAMgW,IAAc,MAAY;AAC5B,MAAAxa,EAAK,WAAA,GACL6L,EAAA;AAAA,IACJ;AACA,WAAI7L,EAAK,OAED,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAMG,EAAK;AAAA,QACX,MAAMwE,MAAS,aAAa,aAAa;AAAA,QACzC,WAAWzE,GAAO;AAAA,QAClB,SAASya;AAAA,QAER,UAAAxa,EAAK;AAAA,MAAA;AAAA,IAAA,IAKd,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,MAAM2E,MAAS,aAAa,aAAa;AAAA,QACzC,WAAWzE,GAAO;AAAA,QAClB,SAASya;AAAA,QAER,UAAAxa,EAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGlB;AAEA,SACI,gBAAAH,EAAC,SAAI,KAAKsJ,GAAS,WAAWrJ,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GAC1D,UAAA,gBAAAlB,EAAC,QAAG,WAAWE,GAAO,MACjB,UAAArB,EAAM,IAAI,CAACsB,GAAMgG,MAAU;AAExB,QAAI,EADgB,CAAC,CAAChG,EAAK,YAAYA,EAAK,SAAS,SAAS;AAE1D,aACI,gBAAAH,EAAC,QAAe,WAAWE,GAAO,MAC7B,UAAAyuB,EAAWxuB,GAAM,MAAM,EAAA,GADnBgG,CAET;AAGR,UAAM/F,IAAOsuB,MAAcvoB,GACrB9F,IAAU,GAAGouB,CAAM,UAAUtoB,CAAK;AACxC,WACI,gBAAA5F;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,WAAWL,GAAO;AAAA,QAClB,cAAc,MAAM6tB,EAAW5nB,CAAK;AAAA,QACpC,cAAc,MAAM4nB,EAAW,CAAC7hB,MAAUA,MAAS/F,IAAQ,KAAK+F,CAAK;AAAA,QAErE,UAAA;AAAA,UAAA,gBAAAlM;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAWE,GAAO;AAAA,cAClB,iBAAc;AAAA,cACd,iBAAeE;AAAA,cACf,iBAAeC;AAAA,cACf,SAAS,MACLmuB,EAAgB,CAACtiB,MAAUA,MAAS/F,IAAQ,KAAKA,CAAM;AAAA,cAE3D,SAAS,MAAM4nB,EAAW5nB,CAAK;AAAA,cAE9B,UAAAhG,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAETC,KACG,gBAAAJ,EAAC,MAAA,EAAG,IAAIK,GAAS,MAAK,QAAO,WAAWH,GAAO,OAC1C,UAAAC,EAAK,SAAU,IAAI,CAACyuB,GAAOC,MACxB,gBAAA7uB,EAAC,MAAA,EAAoB,MAAK,QAAO,WAAWE,GAAO,SAC9C,UAAAyuB,EAAWC,GAAO,UAAU,EAAA,GADxBC,CAET,CACH,EAAA,CACL;AAAA,QAAA;AAAA,MAAA;AAAA,MAzBC1oB;AAAA,IAAA;AAAA,EA6BjB,CAAC,GACL,GACJ;AAER;;;;;;;;;;;;ACxHA,SAASkhB,GAAYlnB,GAAgD;AACjE,SAAO,eAAeA;AAC1B;AAwBO,SAAS2uB,GAAQ,EAAE,OAAAC,GAAO,WAAA7vB,GAAW,GAAGgC,KAAuB;AAClE,QAAM,CAACwtB,GAAWM,CAAY,IAAIxvB,EAAiB,EAAE,GAC/CivB,IAASrvB,EAAA,GACTkK,IAAUzB,EAAuB,IAAI,GACrConB,IAAcpnB,EAAwC,EAAE,GAExDmE,IAAQrM,EAAY,MAAY;AAClC,IAAAqvB,EAAa,EAAE;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,SAAAnsB,EAAU,MAAM;AACZ,QAAI6rB,MAAc,GAAI;AACtB,UAAMziB,IAAQ,CAACpH,MAA+B;AAC1C,UAAIA,EAAM,QAAQ,UAAU;AACxB,QAAAmH,EAAA,GACAijB,EAAY,QAAQP,CAAS,GAAG,MAAA;AAChC;AAAA,MACJ;AACA,UAAI7pB,EAAM,QAAQ,cAAc;AAC5B,QAAAA,EAAM,eAAA;AACN,cAAM/E,KAAQ4uB,IAAY,KAAKK,EAAM;AACrC,QAAAC,EAAalvB,CAAI,GACjBmvB,EAAY,QAAQnvB,CAAI,GAAG,MAAA;AAAA,MAC/B;AACA,UAAI+E,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA;AACN,cAAMqH,KAAQwiB,IAAY,IAAIK,EAAM,UAAUA,EAAM;AACpD,QAAAC,EAAa9iB,CAAI,GACjB+iB,EAAY,QAAQ/iB,CAAI,GAAG,MAAA;AAAA,MAC/B;AAAA,IACJ,GACMnC,IAAS,CAAClF,MAA4B;AACxC,MAAIyE,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAASzE,EAAM,MAAc,KAAGmH,EAAA;AAAA,IAC5E;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACxC,OAAO,iBAAiB,aAAalC,CAAM,GACpC,MAAM;AACT,aAAO,oBAAoB,WAAWkC,CAAK,GAC3C,OAAO,oBAAoB,aAAalC,CAAM;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC2kB,GAAWK,EAAM,QAAQ/iB,CAAK,CAAC,qBAG9B,OAAA,EAAI,KAAK1C,GAAS,MAAK,WAAU,WAAWrJ,EAAGC,GAAO,MAAMhB,CAAS,GAAI,GAAGgC,GACxE,YAAM,IAAI,CAACguB,GAAM/oB,MAAU;AACxB,UAAM/F,IAAOsuB,MAAcvoB,GACrB9F,IAAU,GAAGouB,CAAM,UAAUtoB,CAAK;AACxC,WACI,gBAAA5F,EAAC,OAAA,EAAgB,WAAWL,GAAO,MAC/B,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,KAAK,CAACqM,MAAO;AACT,YAAA4iB,EAAY,QAAQ9oB,CAAK,IAAIkG;AAAA,UACjC;AAAA,UACA,MAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAc;AAAA,UACd,iBAAejM;AAAA,UACf,iBAAeA,IAAOC,IAAU;AAAA,UAChC,WAAWJ,EAAGC,GAAO,SAASE,KAAQF,GAAO,WAAW;AAAA,UACxD,SAAS,MAAM8uB,EAAa,CAAC9iB,MAAUA,MAAS/F,IAAQ,KAAKA,CAAM;AAAA,UAElE,UAAA+oB,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAET9uB,KACG,gBAAAJ,EAAC,MAAA,EAAG,IAAIK,GAAS,MAAK,QAAO,WAAWH,GAAO,OAC1C,UAAAgvB,EAAK,MAAM,IAAI,CAAC/uB,GAAMgvB,MACf9H,GAAYlnB,CAAI,IAEZ,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UAEG,MAAK;AAAA,UACL,WAAWE,GAAO;AAAA,UAClB,eAAW;AAAA,QAAA;AAAA,QAHNivB;AAAA,MAAA,IAQb,gBAAAnvB,EAAC,MAAA,EAAmB,MAAK,QACrB,UAAA,gBAAAO;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAWL,GAAO;AAAA,UAClB,UAAUC,EAAK;AAAA,UACf,SAAS,MAAM;AACX,YAAAA,EAAK,WAAA,GACL6L,EAAA;AAAA,UACJ;AAAA,UAEA,UAAA;AAAA,YAAA,gBAAAhM,EAAC,QAAA,EAAK,WAAWE,GAAO,WACnB,YAAK,OACV;AAAA,YACCC,EAAK,YACF,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,UACnB,YAAK,SAAA,CACV;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,KAjBHivB,CAoBT,CAEP,EAAA,CACL;AAAA,IAAA,EAAA,GApDEhpB,CAsDV;AAAA,EAER,CAAC,EAAA,CACL;AAER;;;;;;;;;;;;;AC9HO,SAASipB,GAAS;AAAA,EACrB,UAAAnuB;AAAA,EACA,MAAAouB,IAAO;AAAA,EACP,YAAAC,IAAa;AAAA,EACb,UAAAC,IAAW;AAAA,EACX,OAAAppB;AAAA,EACA,cAAAqpB,IAAe;AAAA,EACf,eAAAC;AAAA,EACA,WAAAvwB;AAAA,EACA,GAAGgC;AACP,GAAkB;AACd,QAAMwuB,IAAQzuB,EAAS,QACjB5B,IAAe8G,MAAU,QACzB,CAACwpB,GAAeC,CAAgB,IAAIpwB,EAAiBgwB,CAAY,GACjE/sB,IAAUpD,IAAe8G,IAAQwpB,GAEjCE,IAAOlwB;AAAA,IACT,CAACG,MAAuB;AACpB,UAAIsjB,IAAStjB;AAGb,MAFIsjB,IAAS,IAAGA,IAASiM,IAAOK,IAAQ,IAAI,IACnCtM,KAAUsM,MAAOtM,IAASiM,IAAO,IAAIK,IAAQ,IAClDtM,MAAW3gB,MACVpD,KAAcuwB,EAAiBxM,CAAM,GAC1CqM,IAAgBrM,CAAM;AAAA,IAC1B;AAAA,IACA,CAACsM,GAAOL,GAAM5sB,GAASpD,GAAcowB,CAAa;AAAA,EAAA,GAGhDK,IAAUrtB,KAAW,GACrBstB,IAAQttB,KAAWitB,IAAQ,GAE3B9mB,IAAgB,CAAC/D,MAAqD;AACxE,IAAIA,EAAM,QAAQ,gBACdA,EAAM,eAAA,GACNgrB,EAAKptB,IAAU,CAAC,KACToC,EAAM,QAAQ,gBACrBA,EAAM,eAAA,GACNgrB,EAAKptB,IAAU,CAAC;AAAA,EAExB;AAEA,SACI,gBAAAlC;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,wBAAqB;AAAA,MACrB,UAAU;AAAA,MACV,WAAWN,EAAGC,GAAO,MAAMhB,CAAS;AAAA,MACpC,WAAW0J;AAAA,MACV,GAAG1H;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAlB,EAAC,OAAA,EAAI,WAAWE,GAAO,UACnB,UAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWE,GAAO;AAAA,YAClB,OAAO,EAAE,WAAW,eAAeuC,IAAU,GAAG,KAAA;AAAA,YAE/C,UAAAxB,EAAS,IAAI,CAAC+uB,GAAOC,MAClB,gBAAAjwB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEG,MAAK;AAAA,gBACL,wBAAqB;AAAA,gBACrB,cAAY,GAAGiwB,IAAa,CAAC,OAAOP,CAAK;AAAA,gBACzC,eAAaO,MAAextB;AAAA,gBAC5B,WAAWvC,GAAO;AAAA,gBAEjB,UAAA8vB;AAAA,cAAA;AAAA,cAPIC;AAAA,YAAA,CASZ;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAECX,KAAcI,IAAQ,KACnB,gBAAAnvB,EAAA4B,GAAA,EACI,UAAA;AAAA,UAAA,gBAAAnC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAWC,EAAGC,GAAO,OAAOA,GAAO,IAAI;AAAA,cACvC,cAAW;AAAA,cACX,UAAU,CAACmvB,KAAQS;AAAA,cACnB,SAAS,MAAMD,EAAKptB,IAAU,CAAC;AAAA,cAClC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAAzC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAWC,EAAGC,GAAO,OAAOA,GAAO,IAAI;AAAA,cACvC,cAAW;AAAA,cACX,UAAU,CAACmvB,KAAQU;AAAA,cACnB,SAAS,MAAMF,EAAKptB,IAAU,CAAC;AAAA,cAClC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACJ;AAAA,QAGH8sB,KAAYG,IAAQ,KACjB,gBAAA1vB,EAAC,OAAA,EAAI,WAAWE,GAAO,MAAM,MAAK,WAAU,cAAW,UAClD,UAAAe,EAAS,IAAI,CAACqU,GAAG4a,MACd,gBAAAlwB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAY,eAAekwB,IAAW,CAAC;AAAA,YACvC,iBAAeA,MAAaztB;AAAA,YAC5B,WAAWxC,EAAGC,GAAO,KAAKgwB,MAAaztB,KAAWvC,GAAO,SAAS;AAAA,YAClE,SAAS,MAAM2vB,EAAKK,CAAQ;AAAA,UAAA;AAAA,UANvBA;AAAA,QAAA,CAQZ,EAAA,CACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhB;ACjIO,SAASC,GAAcC,IAAc,GAAGC,IAAc,IAAyB;AAClF,QAAM,CAACnb,GAAMob,CAAO,IAAI9wB,EAAiB4wB,CAAW,GAC9C,CAACjsB,GAAMulB,CAAO,IAAIlqB,EAAiB6wB,CAAW,GAE9CE,IAAQ5wB,EAAY,MAAM2wB,EAAQ,CAAC,GAAG,CAAA,CAAE;AAE9C,SAAO,EAAE,MAAApb,GAAM,MAAA/Q,GAAM,SAAAmsB,GAAS,SAAA5G,GAAS,OAAA6G,EAAA;AAC3C;ACZO,SAASC,GACZ3xB,GACA4xB,GACAC,GACG;AACH,SAAOjsB,EAAQ,MAAM;AACjB,UAAMksB,IAAOF,EAAO,KAAA,EAAO,YAAA;AAC3B,WAAKE,IACD,OAAOD,KAAoB,aACpB7xB,EAAM,OAAO,CAACsB,MAASuwB,EAAgBvwB,GAAMwwB,CAAI,CAAC,IAEtD9xB,EAAM;AAAA,MAAO,CAACsB,MACjBuwB,EAAgB,KAAK,CAAChuB,MAAQ;AAC1B,cAAM3D,IAAQoB,EAAKuC,CAAG;AACtB,eAAO3D,KAAS,QAAQ,OAAOA,CAAK,EAAE,YAAA,EAAc,SAAS4xB,CAAI;AAAA,MACrE,CAAC;AAAA,IAAA,IARa9xB;AAAA,EAUtB,GAAG,CAACA,GAAO4xB,GAAQC,CAAe,CAAC;AACvC;ACvBO,SAASE,GAAc3nB,GAAwB;AAClD,QAAM,CAAC4nB,GAASC,CAAU,IAAItxB,EAAkB,MACxC,OAAO,SAAW,MAAoB,KACnC,OAAO,WAAWyJ,CAAK,EAAE,OACnC;AAED,SAAApG,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMkuB,IAAO,OAAO,WAAW9nB,CAAK,GAC9BpD,IAAU,CAAChB,MAAqCisB,EAAWjsB,EAAM,OAAO;AAC9E,WAAAisB,EAAWC,EAAK,OAAO,GACvBA,EAAK,iBAAiB,UAAUlrB,CAAO,GAChC,MAAMkrB,EAAK,oBAAoB,UAAUlrB,CAAO;AAAA,EAC3D,GAAG,CAACoD,CAAK,CAAC,GAEH4nB;AACX;ACOO,SAASG,GACZC,GACAprB,GACAud,GACAja,GACI;AACJ,QAAMwb,IAAa9c,EAAOhC,CAAO;AACjC,EAAA8e,EAAW,UAAU9e,GAErBhD,EAAU,MAAM;AACZ,UAAMquB,IACF9N,MAAW,SACL,OAAO,SAAW,MACd,OACA,SACJ,aAAcA,IACVA,EAA2C,WAAW,OACvDA;AAEb,QAAI,CAAC8N,GAAgB,iBAAkB;AAEvC,UAAMjd,IAA0B,CAACpP,MAAU8f,EAAW,QAAQ9f,CAAK;AACnE,WAAAqsB,EAAe,iBAAiBD,GAAWhd,GAAU9K,CAAO,GACrD,MAAM+nB,EAAe,oBAAoBD,GAAWhd,GAAU9K,CAAO;AAAA,EAChF,GAAG,CAAC8nB,GAAW7N,GAAQja,CAAO,CAAC;AACnC;ACjDA,MAAMgoB,KAAmB,KAAK,WACxBC,KAAqB,CAAIC,MAAmB,KAAK,MAAMA,CAAG;AAYzD,SAASC,GACZ5uB,GACA1D,GACAmK,IAAkC,CAAA,GACoB;AACtD,QAAMooB,IAAYpoB,EAAQ,aAAagoB,IACjCK,IAAcroB,EAAQ,eAAeioB,IAErCK,IAAO9xB,EAAY,MAAS;AAC9B,QAAI,OAAO,SAAW,IAAa,QAAOX;AAC1C,QAAI;AACA,YAAMqyB,IAAM,OAAO,aAAa,QAAQ3uB,CAAG;AAC3C,aAAI2uB,MAAQ,OAAaryB,IAClBwyB,EAAYH,CAAG;AAAA,IAC1B,QAAQ;AACJ,aAAOryB;AAAA,IACX;AAAA,EACJ,GAAG,CAAC0D,GAAK1D,GAAcwyB,CAAW,CAAC,GAE7B,CAACzyB,GAAO2yB,CAAS,IAAIlyB,EAAYiyB,CAAI;AAE3C,EAAA5uB,EAAU,MAAM;AACZ,IAAA6uB,EAAUD,GAAM;AAAA,EACpB,GAAG,CAACA,CAAI,CAAC;AAET,QAAME,IAAWhyB;AAAA,IACb,CAACG,MAAqC;AAClC,MAAA4xB,EAAU,CAACjvB,MAAY;AACnB,cAAMmvB,IACF,OAAO9xB,KAAS,aAAcA,EAAwB2C,CAAO,IAAI3C;AACrE,YAAI;AACA,UAAI,OAAO,SAAW,OAClB,OAAO,aAAa,QAAQ4C,GAAK6uB,EAAUK,CAAQ,CAAC;AAAA,QAE5D,QAAQ;AAAA,QAER;AACA,eAAOA;AAAA,MACX,CAAC;AAAA,IACL;AAAA,IACA,CAAClvB,GAAK6uB,CAAS;AAAA,EAAA,GAGb1oB,IAASlJ,EAAY,MAAY;AACnC,QAAI;AACA,MAAI,OAAO,SAAW,OAClB,OAAO,aAAa,WAAW+C,CAAG;AAAA,IAE1C,QAAQ;AAAA,IAER;AACA,IAAAgvB,EAAU1yB,CAAY;AAAA,EAC1B,GAAG,CAAC0D,GAAK1D,CAAY,CAAC;AAEtB,SAAA6D,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMgvB,IAAY,CAAChtB,MAA8B;AAC7C,UAAIA,EAAM,QAAQnC,GAClB;AAAA,YAAImC,EAAM,aAAa,MAAM;AACzB,UAAA6sB,EAAU1yB,CAAY;AACtB;AAAA,QACJ;AACA,YAAI;AACA,UAAA0yB,EAAUF,EAAY3sB,EAAM,QAAQ,CAAC;AAAA,QACzC,QAAQ;AAAA,QAER;AAAA;AAAA,IACJ;AACA,kBAAO,iBAAiB,WAAWgtB,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAChE,GAAG,CAACnvB,GAAK1D,GAAcwyB,CAAW,CAAC,GAE5B,CAACzyB,GAAO4yB,GAAU9oB,CAAM;AACnC;AC9EO,SAASipB,GAAUC,IAAU,IAAiC;AACjE,QAAM,CAAChzB,GAAO4yB,CAAQ,IAAInyB,EAAkBuyB,CAAO,GAE7CryB,IAASC,EAAY,MAAYgyB,EAAS,CAAClvB,MAAY,CAACA,CAAO,GAAG,EAAE,GACpEuvB,IAAUryB,EAAY,MAAYgyB,EAAS,EAAI,GAAG,CAAA,CAAE,GACpDM,IAAWtyB,EAAY,MAAYgyB,EAAS,EAAK,GAAG,CAAA,CAAE,GACtDO,IAAMvyB,EAAY,CAACG,MAAwB6xB,EAAS7xB,CAAI,GAAG,EAAE;AAEnE,SAAO,CAACf,GAAO,EAAE,QAAAW,GAAQ,SAAAsyB,GAAS,UAAAC,GAAU,KAAAC,GAAK;AACrD;ACIO,SAASC,GACZC,GACAC,IAA+B,CAAA,GAC/BlpB,IAAmC,CAAA,GAClB;AACjB,QAAM,EAAE,WAAAmpB,IAAY,GAAA,IAAUnpB,GACxB,CAACyK,GAAOgB,CAAQ,IAAIpV,EAIvB,EAAE,QAAQ,QAAQ,MAAM,QAAW,OAAO,OAAA,CAAW,GAElD+yB,IAAQ1qB,EAAOuqB,CAAO;AAC5B,EAAAG,EAAM,UAAUH;AAChB,QAAMI,IAAY3qB,EAAe,CAAC,GAC5B4qB,IAAa5qB,EAAgB,EAAI;AAEvC,EAAAhF,EAAU,OACN4vB,EAAW,UAAU,IACd,MAAM;AACT,IAAAA,EAAW,UAAU;AAAA,EACzB,IACD,CAAA,CAAE;AAEL,QAAMC,IAAM/yB,EAAY,YAAwB;AAC5C,UAAMgzB,IAAS,EAAEH,EAAU;AAC3B,IAAA5d,EAAS,CAACnS,OAAa,EAAE,GAAGA,GAAS,QAAQ,WAAW,OAAO,OAAA,EAAY;AAC3E,QAAI;AACA,YAAMkc,IAAO,MAAM4T,EAAM,QAAA;AACzB,aAAIE,EAAW,WAAWD,EAAU,YAAYG,KAC5C/d,EAAS,EAAE,QAAQ,WAAW,MAAA+J,GAAM,OAAO,QAAW,GAEnDA;AAAA,IACX,SAAStW,GAAO;AACZ,YAAIoqB,EAAW,WAAWD,EAAU,YAAYG,KAC5C/d,EAAS,EAAE,QAAQ,SAAS,MAAM,QAAW,OAAAvM,GAAO,GAElDA;AAAA,IACV;AAAA,EACJ,GAAG,CAAA,CAAE,GAECkoB,IAAQ5wB,EAAY,MAAY;AAClC,IAAA6yB,EAAU,WACV5d,EAAS,EAAE,QAAQ,QAAQ,MAAM,QAAW,OAAO,QAAW;AAAA,EAClE,GAAG,CAAA,CAAE;AAEL,SAAA/R,EAAU,MAAM;AACZ,IAAKyvB,KACLI,EAAA,EAAM,MAAM,MAAM;AAAA,IAElB,CAAC;AAAA,EAEL,GAAG,CAACJ,GAAW,GAAGD,CAAI,CAAC,GAEhB;AAAA,IACH,QAAQze,EAAM;AAAA,IACd,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM;AAAA,IACb,WAAWA,EAAM,WAAW;AAAA,IAC5B,WAAWA,EAAM,WAAW;AAAA,IAC5B,SAASA,EAAM,WAAW;AAAA,IAC1B,KAAA8e;AAAA,IACA,OAAAnC;AAAA,EAAA;AAER;ACtFO,SAASqC,KAAqB;AACjC,QAAM,CAACC,GAAQC,CAAS,IAAItzB;AAAA,IAAkB,MAC1C,OAAO,YAAc,MAAc,KAAO,UAAU;AAAA,EAAA;AAGxD,SAAAqD,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMkwB,IAAe,MAAYD,EAAU,EAAI,GACzCE,IAAgB,MAAYF,EAAU,EAAK;AACjD,kBAAO,iBAAiB,UAAUC,CAAY,GAC9C,OAAO,iBAAiB,WAAWC,CAAa,GACzC,MAAM;AACT,aAAO,oBAAoB,UAAUD,CAAY,GACjD,OAAO,oBAAoB,WAAWC,CAAa;AAAA,IACvD;AAAA,EACJ,GAAG,CAAA,CAAE,GAEEH;AACX;ACnBO,SAASI,KAA4C;AACxD,QAAM,CAACrf,GAAOgB,CAAQ,IAAIpV;AAAA,IAA6B,MACnD,OAAO,WAAa,MACd,YACC,SAAS;AAAA,EAAA;AAGpB,SAAAqD,EAAU,MAAM;AACZ,QAAI,OAAO,WAAa,IAAa;AACrC,UAAMgD,IAAU,MAAY+O,EAAS,SAAS,eAAqC;AACnF,oBAAS,iBAAiB,oBAAoB/O,CAAO,GAC9C,MAAM,SAAS,oBAAoB,oBAAoBA,CAAO;AAAA,EACzE,GAAG,CAAA,CAAE,GAEE+N;AACX;ACNO,SAASsf,GACZvrB,GACAwB,IAA0C,IACV;AAChC,QAAM,CAAC2C,GAAOqnB,CAAQ,IAAI3zB,EAA2C,IAAI,GACnE,EAAE,MAAA4zB,IAAO,IAAO,MAAAC,GAAM,YAAAC,GAAY,WAAAC,MAAcpqB;AAEtD,SAAAtG,EAAU,MAAM;AACZ,UAAMugB,IAASzb,EAAI;AACnB,QAAI,CAACyb,KAAU,OAAO,uBAAyB,IAAa;AAE5D,UAAMxB,IAAW,IAAI;AAAA,MACjB,CAAC,CAAC4R,CAAS,MAAM;AACb,QAAKA,MACLL,EAASK,CAAS,GACdJ,KAAQI,EAAU,kBAAgB5R,EAAS,UAAUwB,CAAM;AAAA,MACnE;AAAA,MACA,EAAE,MAAAiQ,GAAM,YAAAC,GAAY,WAAAC,EAAA;AAAA,IAAU;AAGlC,WAAA3R,EAAS,QAAQwB,CAAM,GAChB,MAAMxB,EAAS,WAAA;AAAA,EAC1B,GAAG,CAACja,GAAKyrB,GAAMC,GAAMC,GAAYC,CAAS,CAAC,GAEpCznB;AACX;AC3BO,SAAS2nB,GAAkB9rB,GAAoD;AAClF,QAAM,CAACxD,GAAMulB,CAAO,IAAIlqB,EAA6B,IAAI;AAEzD,SAAAqD,EAAU,MAAM;AACZ,UAAMugB,IAASzb,EAAI;AACnB,QAAI,CAACyb,KAAU,OAAO,iBAAmB,IAAa;AAEtD,UAAMxB,IAAW,IAAI,eAAe,CAAC8R,MAAY;AAC7C,YAAM5nB,IAAQ4nB,EAAQ,CAAC;AACvB,UAAI,CAAC5nB,EAAO;AACZ,YAAM6nB,IAAM7nB,EAAM;AAClB,MAAA4d,EAAQ,EAAE,OAAOiK,EAAI,OAAO,QAAQA,EAAI,QAAQ;AAAA,IACpD,CAAC;AAED,WAAA/R,EAAS,QAAQwB,CAAM,GAChB,MAAMxB,EAAS,WAAA;AAAA,EAC1B,GAAG,CAACja,CAAG,CAAC,GAEDxD;AACX;ACVO,SAASyvB,GAAazqB,IAA+B,IAAwB;AAChF,QAAM,EAAE,YAAA0qB,IAAa,KAAA,IAAS1qB,GACxB,CAACgZ,GAAQC,CAAS,IAAI5iB,EAAkB,EAAK,GAC7CygB,IAAQpY,EAA6C,IAAI,GAEzD0oB,IAAQ5wB,EAAY,MAAY;AAClC,IAAIsgB,EAAM,YACN,aAAaA,EAAM,OAAO,GAC1BA,EAAM,UAAU,OAEpBmC,EAAU,EAAK;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,EAAAvf,EAAU,MAAM,MAAM0tB,KAAS,CAACA,CAAK,CAAC;AAEtC,QAAMuD,IAAOn0B;AAAA,IACT,OAAO2Y,MAAmC;AACtC,UAAI;AACA,YAAI,OAAO,YAAc,OAAe,UAAU,WAAW;AACzD,gBAAM,UAAU,UAAU,UAAUA,CAAI;AAAA,iBACjC,OAAO,WAAa,KAAa;AACxC,gBAAMyb,IAAW,SAAS,cAAc,UAAU;AAClD,UAAAA,EAAS,QAAQzb,GACjByb,EAAS,MAAM,WAAW,SAC1BA,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAYA,CAAQ,GAClCA,EAAS,OAAA,GACT,SAAS,YAAY,MAAM,GAC3B,SAAS,KAAK,YAAYA,CAAQ;AAAA,QACtC;AACI,iBAAO;AAEX,eAAA3R,EAAU,EAAI,GACVnC,EAAM,WAAS,aAAaA,EAAM,OAAO,GAC7CA,EAAM,UAAU,WAAW,MAAMmC,EAAU,EAAK,GAAGyR,CAAU,GACtD;AAAA,MACX,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IACA,CAACA,CAAU;AAAA,EAAA;AAGf,SAAO,EAAE,QAAA1R,GAAQ,MAAA2R,GAAM,OAAAvD,EAAA;AAC3B;AC3CA,SAASM,GAAQhsB,GAAsBmvB,GAAqC;AACxE,MAAInvB,EAAM,IAAI,YAAA,MAAkBmvB,EAAS,IAAI,YAAA,EAAe,QAAO;AACnE,QAAMC,IAAO,CAAC,CAACD,EAAS,MAClBE,IAAO,CAAC,CAACF,EAAS,MAClBG,IAAQ,CAAC,CAACH,EAAS,OACnB9vB,IAAM,CAAC,CAAC8vB,EAAS;AACvB,MAAIA,EAAS;AACT,QAAI,CAACnvB,EAAM,WAAW,CAACA,EAAM,QAAS,QAAO;AAAA,aAEzCA,EAAM,YAAYovB,KAClBpvB,EAAM,YAAYqvB,EAAM,QAAO;AAGvC,SADI,EAAArvB,EAAM,aAAasvB,KACnBtvB,EAAM,WAAWX;AAEzB;AAEA,SAASkwB,GAAWhR,GAAqC;AACrD,MAAI,EAAEA,aAAkB,aAAc,QAAO;AAC7C,QAAMiR,IAAMjR,EAAO,QAAQ,YAAA;AAC3B,SAAIiR,MAAQ,WAAWA,MAAQ,cAAcA,MAAQ,WAAiB,KAC/DjR,EAAO;AAClB;AASO,SAASkR,GACZN,GACAnuB,GACAsD,IAAsC,CAAA,GAClC;AACJ,QAAM,EAAE,UAAAtC,IAAW,IAAO,aAAA0tB,IAAc,OAASprB;AAEjD,EAAAtG,EAAU,MAAM;AACZ,QAAIgE,KAAY,OAAO,SAAW,IAAa;AAC/C,UAAMoN,IAAW,CAACpP,MAA+B;AAC7C,MAAI0vB,KAAeH,GAAWvvB,EAAM,MAAM,KACtCgsB,GAAQhsB,GAAOmvB,CAAQ,OAAWnvB,CAAK;AAAA,IAC/C;AACA,kBAAO,iBAAiB,WAAWoP,CAAQ,GACpC,MAAM,OAAO,oBAAoB,WAAWA,CAAQ;AAAA,EAC/D,GAAG;AAAA,IACCpN;AAAA,IACA0tB;AAAA,IACAP,EAAS;AAAA,IACTA,EAAS;AAAA,IACTA,EAAS;AAAA,IACTA,EAAS;AAAA,IACTA,EAAS;AAAA,IACTA,EAAS;AAAA,IACTnuB;AAAA,EAAA,CACH;AACL;AC7EA,MAAM2uB,KAA2C;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAMO,SAASC,GAAQxS,IAAU,KAAiB;AAC/C,QAAM,CAACyS,GAAMC,CAAO,IAAIn1B,EAAkB,EAAK;AAE/C,SAAAqD,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,QAAIod,IAAQ,WAAW,MAAM0U,EAAQ,EAAI,GAAG1S,CAAO;AAEnD,aAASsO,IAAc;AACnB,MAAAoE,EAAQ,EAAK,GACb,aAAa1U,CAAK,GAClBA,IAAQ,WAAW,MAAM0U,EAAQ,EAAI,GAAG1S,CAAO;AAAA,IACnD;AAEA,eAAWpd,KAAS2vB;AAChB,aAAO,iBAAiB3vB,GAAO0rB,GAAO,EAAE,SAAS,IAAM;AAE3D,WAAO,MAAM;AACT,mBAAatQ,CAAK;AAClB,iBAAWpb,KAAS2vB;AAChB,eAAO,oBAAoB3vB,GAAO0rB,CAAK;AAAA,IAE/C;AAAA,EACJ,GAAG,CAACtO,CAAO,CAAC,GAELyS;AACX;ACvBO,SAASE,GAAezrB,IAAiC,IAAsB;AAClF,QAAM,EAAE,OAAA0rB,IAAQ,IAAO,UAAAhuB,IAAW,IAAO,GAAGiuB,MAAoB3rB,GAC1D,CAACyK,GAAOgB,CAAQ,IAAIpV,EAA2B;AAAA,IACjD,SAAS,CAACqH;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,EAAA,CACd;AAED,SAAAhE,EAAU,MAAM;AACZ,QAAIgE,KAAY,OAAO,YAAc,OAAe,CAAC,UAAU,aAAa;AACxE,MAAA+N,EAAS,CAAC1I,OAAU,EAAE,GAAGA,GAAM,SAAS,KAAQ;AAChD;AAAA,IACJ;AAEA,UAAM6oB,IAAY,CAACrU,MAAwC;AACvD,MAAA9L,EAAS;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ8L,EAAS;AAAA,QACjB,WAAWA,EAAS;AAAA,MAAA,CACvB;AAAA,IACL,GACM2E,IAAU,CAAChd,MAA0C;AACvD,MAAAuM,EAAS,CAAC1I,OAAU,EAAE,GAAGA,GAAM,SAAS,IAAO,OAAA7D,IAAQ;AAAA,IAC3D;AAEA,QAAIwsB,GAAO;AACP,YAAMG,IAAU,UAAU,YAAY;AAAA,QAClCD;AAAA,QACA1P;AAAA,QACAyP;AAAA,MAAA;AAEJ,aAAO,MAAM,UAAU,YAAY,WAAWE,CAAO;AAAA,IACzD;AAEA,cAAU,YAAY,mBAAmBD,GAAW1P,GAASyP,CAAe;AAAA,EAEhF,GAAG;AAAA,IACCjuB;AAAA,IACAguB;AAAA,IACAC,EAAgB;AAAA,IAChBA,EAAgB;AAAA,IAChBA,EAAgB;AAAA,EAAA,CACnB,GAEMlhB;AACX;AC1DO,SAASqhB,GAAczvB,GAAuB;AACjD,EAAA3C,EAAU,MAAM;AACZ,QAAI,CAAC2C,KAAU,OAAO,WAAa,IAAa;AAChD,UAAM0vB,IAAO,SAAS,MAChBnvB,IAAWmvB,EAAK,MAAM;AAC5B,WAAAA,EAAK,MAAM,WAAW,UACf,MAAM;AACT,MAAAA,EAAK,MAAM,WAAWnvB;AAAA,IAC1B;AAAA,EACJ,GAAG,CAACP,CAAM,CAAC;AACf;ACTO,SAAS2vB,GACZC,GAC2B;AAC3B,QAAMztB,IAAME,EAAOutB,CAAQ;AAC3B,SAAAztB,EAAI,UAAUytB,GACPz1B,EAAY,IAAI01B,MAAgB1tB,EAAI,QAAQ,GAAG0tB,CAAI,GAAG,EAAE;AACnE;ACXA,SAASC,GAAUrK,GAAYC,GAAqB;AAChD,MAAI,OAAO,GAAGD,GAAGC,CAAC,EAAG,QAAO;AAE5B,MADI,OAAOD,KAAM,YAAY,OAAOC,KAAM,YAAYD,MAAM,QAAQC,MAAM,QACtE,MAAM,QAAQD,CAAC,MAAM,MAAM,QAAQC,CAAC,EAAG,QAAO;AAClD,MAAI,MAAM,QAAQD,CAAC,KAAK,MAAM,QAAQC,CAAC;AACnC,WAAID,EAAE,WAAWC,EAAE,SAAe,KAC3BD,EAAE,MAAM,CAAClsB,GAAOoH,MAAUmvB,GAAUv2B,GAAOmsB,EAAE/kB,CAAK,CAAC,CAAC;AAE/D,QAAMovB,IAAQ,OAAO,KAAKtK,CAAW,GAC/BuK,IAAQ,OAAO,KAAKtK,CAAW;AACrC,SAAIqK,EAAM,WAAWC,EAAM,SAAe,KACnCD,EAAM;AAAA,IAAM,CAAC7yB,MAChB4yB,GAAWrK,EAA8BvoB,CAAG,GAAIwoB,EAA8BxoB,CAAG,CAAC;AAAA,EAAA;AAE1F;AAOO,SAAS+yB,GAAe12B,GAAa;AACxC,QAAM4I,IAAME,EAAU9I,CAAK;AAC3B,SAAKu2B,GAAU3tB,EAAI,SAAS5I,CAAK,MAC7B4I,EAAI,UAAU5I,IAEX4I,EAAI;AACf;AChBO,SAAS+tB,GAAe32B,GAAyB;AACpD,QAAM4I,IAAME,EAAsB,MAAS;AAC3C,SAAAhF,EAAU,MAAM;AACZ,IAAA8E,EAAI,UAAU5I;AAAA,EAClB,GAAG,CAACA,CAAK,CAAC,GACH4I,EAAI;AACf;ACVO,SAASguB,GAAYC,GAAgBC,GAA4B;AACpE,QAAMtD,IAAQ1qB,EAAO+tB,CAAE;AACvB,EAAArD,EAAM,UAAUqD,GAEhB/yB,EAAU,MAAM;AACZ,QAAIgzB,MAAU,KAAM;AACpB,UAAMj2B,IAAK,YAAY,MAAM2yB,EAAM,QAAA,GAAWsD,CAAK;AACnD,WAAO,MAAM,cAAcj2B,CAAE;AAAA,EACjC,GAAG,CAACi2B,CAAK,CAAC;AACd;ACTO,SAASC,GAAWF,GAAgBC,GAA4B;AACnE,QAAMtD,IAAQ1qB,EAAO+tB,CAAE;AACvB,EAAArD,EAAM,UAAUqD,GAEhB/yB,EAAU,MAAM;AACZ,QAAIgzB,MAAU,KAAM;AACpB,UAAMj2B,IAAK,WAAW,MAAM2yB,EAAM,QAAA,GAAWsD,CAAK;AAClD,WAAO,MAAM,aAAaj2B,CAAE;AAAA,EAChC,GAAG,CAACi2B,CAAK,CAAC;AACd;ACRO,SAASE,GAAeh3B,GAAU82B,GAAkB;AACvD,QAAM,CAACG,GAAWC,CAAY,IAAIz2B,EAAYT,CAAK,GAC7Cm3B,IAAcruB,EAAe,CAAC,GAC9BsuB,IAAatuB,EAA6C,IAAI;AAEpE,SAAAhF,EAAU,MAAM;AACZ,UAAMqgB,IAAM,KAAK,IAAA,GACXkT,IAAUlT,IAAMgT,EAAY;AAClC,WAAIE,KAAWP,KACXK,EAAY,UAAUhT,GACtB+S,EAAal3B,CAAK,MAEdo3B,EAAW,WAAS,aAAaA,EAAW,OAAO,GACvDA,EAAW,UAAU,WAAW,MAAM;AAClC,MAAAD,EAAY,UAAU,KAAK,IAAA,GAC3BD,EAAal3B,CAAK;AAAA,IACtB,GAAG82B,IAAQO,CAAO,IAEf,MAAM;AACT,MAAID,EAAW,WAAS,aAAaA,EAAW,OAAO;AAAA,IAC3D;AAAA,EACJ,GAAG,CAACp3B,GAAO82B,CAAK,CAAC,GAEVG;AACX;ACnBO,SAASK,KAA4B;AACxC,QAAM,CAAClyB,GAAMulB,CAAO,IAAIlqB;AAAA,IAAqB,MACzC,OAAO,SAAW,MACZ,EAAE,OAAO,GAAG,QAAQ,EAAA,IACpB,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA;AAAA,EAAY;AAGjE,SAAAqD,EAAU,MAAM;AACZ,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMC,IAAW,MACb4mB,EAAQ,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,aAAa;AACpE,WAAA5mB,EAAA,GACA,OAAO,iBAAiB,UAAUA,GAAU,EAAE,SAAS,IAAM,GACtD,MAAM,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,EAC9D,GAAG,CAAA,CAAE,GAEEqB;AACX;ACpBO,SAASmyB,GAAgC3uB,GAAmC;AAC/E,QAAM,CAACmmB,GAASC,CAAU,IAAIvuB,EAAkB,EAAK;AAErD,SAAAqD,EAAU,MAAM;AACZ,UAAMkF,IAAOJ,EAAI;AACjB,QAAI,CAACI,EAAM;AACX,UAAMwuB,IAAU,MAAYxI,EAAW,EAAI,GACrCyI,IAAU,MAAYzI,EAAW,EAAK;AAC5C,WAAAhmB,EAAK,iBAAiB,cAAcwuB,CAAO,GAC3CxuB,EAAK,iBAAiB,cAAcyuB,CAAO,GACpC,MAAM;AACT,MAAAzuB,EAAK,oBAAoB,cAAcwuB,CAAO,GAC9CxuB,EAAK,oBAAoB,cAAcyuB,CAAO;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC7uB,CAAG,CAAC,GAEDmmB;AACX;ACVO,SAAS2I,GACZ9uB,GACAiuB,GACAzsB,IAA+B,CAAA,GAC3B;AACJ,QAAM,EAAE,OAAA0sB,IAAQ,KAAK,eAAAa,IAAgB,OAAOvtB,GACtCopB,IAAQ1qB,EAAO+tB,CAAE;AACvB,EAAArD,EAAM,UAAUqD,GAEhB/yB,EAAU,MAAM;AACZ,UAAMkF,IAAOJ,EAAI;AACjB,QAAI,CAACI,EAAM;AACX,QAAIkY,IAA8C,MAC9C0W,IAAS,GACTC,IAAS;AAEb,UAAMC,IAAS,MAAY;AACvB,MAAI5W,MACA,aAAaA,CAAK,GAClBA,IAAQ;AAAA,IAEhB,GAEMlW,IAAS,CAAClF,MAA8B;AAC1C,MAAA8xB,IAAS9xB,EAAM,SACf+xB,IAAS/xB,EAAM,SACfgyB,EAAA,GACA5W,IAAQ,WAAW,MAAM;AACrB,QAAAA,IAAQ,MACRsS,EAAM,QAAA;AAAA,MACV,GAAGsD,CAAK;AAAA,IACZ,GAEMiB,IAAS,CAACjyB,MAA8B;AAC1C,UAAIob,MAAU,KAAM;AACpB,YAAM8W,IAAKlyB,EAAM,UAAU8xB,GACrBK,IAAKnyB,EAAM,UAAU+xB;AAC3B,MAAI,KAAK,MAAMG,GAAIC,CAAE,IAAIN,KAAeG,EAAA;AAAA,IAC5C;AAEA,WAAA9uB,EAAK,iBAAiB,eAAegC,CAAM,GAC3ChC,EAAK,iBAAiB,eAAe+uB,CAAM,GAC3C/uB,EAAK,iBAAiB,aAAa8uB,CAAM,GACzC9uB,EAAK,iBAAiB,iBAAiB8uB,CAAM,GAC7C9uB,EAAK,iBAAiB,gBAAgB8uB,CAAM,GACrC,MAAM;AACT,MAAAA,EAAA,GACA9uB,EAAK,oBAAoB,eAAegC,CAAM,GAC9ChC,EAAK,oBAAoB,eAAe+uB,CAAM,GAC9C/uB,EAAK,oBAAoB,aAAa8uB,CAAM,GAC5C9uB,EAAK,oBAAoB,iBAAiB8uB,CAAM,GAChD9uB,EAAK,oBAAoB,gBAAgB8uB,CAAM;AAAA,IACnD;AAAA,EACJ,GAAG,CAAClvB,GAAKkuB,GAAOa,CAAa,CAAC;AAClC;ACxDO,SAASO,GAAclF,IAAU,IAAsC;AAC1E,QAAM,CAACmF,GAAQC,CAAS,IAAI33B,EAAkBuyB,CAAO,GAE/C3xB,IAAOT,EAAY,MAAYw3B,EAAU,EAAI,GAAG,CAAA,CAAE,GAClDnrB,IAAQrM,EAAY,MAAYw3B,EAAU,EAAK,GAAG,CAAA,CAAE,GACpDz3B,IAASC,EAAY,MAAYw3B,EAAU,CAAC10B,MAAY,CAACA,CAAO,GAAG,EAAE,GAErE20B,IAAW3yB;AAAA,IACb,OAAO,EAAE,MAAArE,GAAM,OAAA4L,GAAO,QAAAtM;IACtB,CAACU,GAAM4L,GAAOtM,CAAM;AAAA,EAAA;AAGxB,SAAO,CAACw3B,GAAQE,CAAQ;AAC5B;ACJO,SAASC,GAAgBtF,IAAe,IAAiC;AAC5E,QAAM,CAAChB,GAAMuG,CAAO,IAAI93B,EAAcuyB,CAAO,GAEvCwF,IAAS53B,EAAY,IAAId,MAAqB;AAChD,IAAAy4B,EAAQ,CAAC70B,MAAY,CAAC,GAAGA,GAAS,GAAG5D,CAAK,CAAC;AAAA,EAC/C,GAAG,CAAA,CAAE,GAEC24B,IAAU73B,EAAY,IAAId,MAAqB;AACjD,IAAAy4B,EAAQ,CAAC70B,MAAY,CAAC,GAAG5D,GAAO,GAAG4D,CAAO,CAAC;AAAA,EAC/C,GAAG,CAAA,CAAE,GAECg1B,IAAS93B,EAAY,CAACwG,MAAkBtH,MAAqB;AAC/D,IAAAy4B,EAAQ,CAAC70B,MAAY,CAAC,GAAGA,EAAQ,MAAM,GAAG0D,CAAK,GAAG,GAAGtH,GAAO,GAAG4D,EAAQ,MAAM0D,CAAK,CAAC,CAAC;AAAA,EACxF,GAAG,CAAA,CAAE,GAEC0C,IAASlJ,EAAY,IAAI+3B,MAA4B;AACvD,UAAMC,IAAO,IAAI,IAAID,CAAO;AAC5B,IAAAJ,EAAQ,CAAC70B,MAAYA,EAAQ,OAAO,CAAC6S,GAAGnP,MAAU,CAACwxB,EAAK,IAAIxxB,CAAK,CAAC,CAAC;AAAA,EACvE,GAAG,CAAA,CAAE,GAECyxB,IAAUj4B,EAAY,CAAC,EAAE,MAAAk4B,GAAM,IAAAC,QAA+B;AAChE,IAAAR,EAAQ,CAAC70B,MAAY;AACjB,YAAM3C,IAAO,CAAC,GAAG2C,CAAO,GAClB,CAACs1B,CAAK,IAAIj4B,EAAK,OAAO+3B,GAAM,CAAC;AACnC,aAAA/3B,EAAK,OAAOg4B,GAAI,GAAGC,CAAK,GACjBj4B;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAECk4B,IAAUr4B,EAAY,CAACwG,GAAehG,MAAkB;AAC1D,IAAAm3B,EAAQ,CAAC70B,MAAYA,EAAQ,IAAI,CAAC1D,GAAOgN,MAAOA,MAAM5F,IAAQhG,IAAOpB,CAAM,CAAC;AAAA,EAChF,GAAG,CAAA,CAAE,GAEC6V,IAAWjV,EAAY,CAACd,MAAqBy4B,EAAQz4B,CAAK,GAAG,EAAE,GAE/Do5B,IAAQt4B,EAAY,CAACi2B,MAA4C;AACnE,IAAA0B,EAAQ,CAAC70B,MAAYA,EAAQ,IAAImzB,CAAE,CAAC;AAAA,EACxC,GAAG,CAAA,CAAE,GAECsC,IAAQv4B,EAAY,MAAY23B,EAAQ,CAAA,CAAE,GAAG,CAAA,CAAE,GAE/CF,IAAW3yB;AAAA,IACb,OAAO;AAAA,MACH,QAAA8yB;AAAA,MACA,SAAAC;AAAA,MACA,QAAAC;AAAA,MACA,QAAA5uB;AAAA,MACA,SAAA+uB;AAAA,MACA,SAAAI;AAAA,MACA,UAAApjB;AAAA,MACA,OAAAqjB;AAAA,MACA,OAAAC;AAAA,IAAA;AAAA,IAEJ,CAACX,GAAQC,GAASC,GAAQ5uB,GAAQ+uB,GAASI,GAASpjB,GAAUqjB,GAAOC,CAAK;AAAA,EAAA;AAG9E,SAAO,CAACnH,GAAMqG,CAAQ;AAC1B;ACrEA,MAAM3jB,KAAQ,CAAC1U,GAAe8a,GAAyBf,MAAoC;AACvF,MAAIhZ,IAAOf;AACX,SAAI,OAAO8a,KAAQ,iBAAiB,KAAK,IAAIA,GAAK/Z,CAAI,IAClD,OAAOgZ,KAAQ,iBAAiB,KAAK,IAAIA,GAAKhZ,CAAI,IAC/CA;AACX;AASO,SAASq4B,GACZpG,IAAU,GACV5oB,IAA6B,CAAA,GACJ;AACzB,QAAM,EAAE,KAAA0Q,GAAK,KAAAf,EAAA,IAAQ3P,GACf,CAACumB,GAAO0I,CAAQ,IAAI54B,EAAiB,MAAMiU,GAAMse,GAASlY,GAAKf,CAAG,CAAC,GAEnEkF,IAAYre,EAAY,MAAY;AACtC,IAAAy4B,EAAS,CAAC31B,MAAYgR,GAAMhR,IAAU,GAAGoX,GAAKf,CAAG,CAAC;AAAA,EACtD,GAAG,CAACe,GAAKf,CAAG,CAAC,GAEPiF,IAAYpe,EAAY,MAAY;AACtC,IAAAy4B,EAAS,CAAC31B,MAAYgR,GAAMhR,IAAU,GAAGoX,GAAKf,CAAG,CAAC;AAAA,EACtD,GAAG,CAACe,GAAKf,CAAG,CAAC,GAEPoZ,IAAMvyB;AAAA,IACR,CAACZ,MAAwB;AACrB,MAAAq5B,EAAS3kB,GAAM1U,GAAO8a,GAAKf,CAAG,CAAC;AAAA,IACnC;AAAA,IACA,CAACe,GAAKf,CAAG;AAAA,EAAA,GAGPyX,IAAQ5wB,EAAY,MAAY;AAClC,IAAAy4B,EAAS3kB,GAAMse,GAASlY,GAAKf,CAAG,CAAC;AAAA,EACrC,GAAG,CAACiZ,GAASlY,GAAKf,CAAG,CAAC,GAEhBse,IAAW3yB;AAAA,IACb,OAAO,EAAE,WAAAuZ,GAAW,WAAAD,GAAW,KAAAmU,GAAK,OAAA3B,EAAA;AAAA,IACpC,CAACvS,GAAWD,GAAWmU,GAAK3B,CAAK;AAAA,EAAA;AAGrC,SAAO,CAACb,GAAO0H,CAAQ;AAC3B;ACpDO,SAASiB,GAAiBz3B,GAAqB;AAClD,EAAAiC,EAAU,MAAM;AACZ,QAAI,OAAO,WAAa,IAAa;AACrC,UAAMkD,IAAW,SAAS;AAC1B,oBAAS,QAAQnF,GACV,MAAM;AACT,eAAS,QAAQmF;AAAA,IACrB;AAAA,EACJ,GAAG,CAACnF,CAAK,CAAC;AACd;ACRO,SAAS03B,GAAWC,GAAoB;AAC3C,EAAA11B,EAAU,MAAM;AACZ,QAAI,OAAO,WAAa,IAAa;AACrC,QAAI21B,IAAO,SAAS,cAA+B,kBAAkB;AACrE,IAAKA,MACDA,IAAO,SAAS,cAAc,MAAM,GACpCA,EAAK,MAAM,QACX,SAAS,KAAK,YAAYA,CAAI,IAElCA,EAAK,OAAOD;AAAA,EAChB,GAAG,CAACA,CAAI,CAAC;AACb;ACCO,SAASE,GAAa1G,GAAyD;AAClF,QAAM,CAAC2G,GAAKC,CAAM,IAAIn5B,EAAoB,MAAM,IAAI,IAAIuyB,CAAO,CAAC,GAE1DG,IAAMvyB,EAAY,CAAC+C,GAAQ3D,MAAmB;AAChD,IAAA45B,EAAO,CAACl2B,MAAY;AAChB,YAAM3C,IAAO,IAAI,IAAI2C,CAAO;AAC5B,aAAA3C,EAAK,IAAI4C,GAAK3D,CAAK,GACZe;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAEC+I,IAASlJ,EAAY,CAAC+C,MAAiB;AACzC,IAAAi2B,EAAO,CAACl2B,MAAY;AAChB,UAAI,CAACA,EAAQ,IAAIC,CAAG,EAAG,QAAOD;AAC9B,YAAM3C,IAAO,IAAI,IAAI2C,CAAO;AAC5B,aAAA3C,EAAK,OAAO4C,CAAG,GACR5C;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAECo4B,IAAQv4B,EAAY,MAAY;AAClC,IAAAg5B,EAAO,CAACl2B,MAAaA,EAAQ,SAAS,IAAIA,IAAU,oBAAI,KAAY;AAAA,EACxE,GAAG,CAAA,CAAE,GAECm2B,IAAMj5B,EAAY,CAAC+C,MAA0Bg2B,EAAI,IAAIh2B,CAAG,GAAG,CAACg2B,CAAG,CAAC,GAChEG,IAAMl5B,EAAY,CAAC+C,MAAoBg2B,EAAI,IAAIh2B,CAAG,GAAG,CAACg2B,CAAG,CAAC;AAEhE,SAAOj0B;AAAA,IACH,OAAO;AAAA,MACH,KAAAi0B;AAAA,MACA,KAAAxG;AAAA,MACA,QAAQrpB;AAAA,MACR,OAAAqvB;AAAA,MACA,KAAAU;AAAA,MACA,KAAAC;AAAA,MACA,MAAMH,EAAI;AAAA,IAAA;AAAA,IAEd,CAACA,GAAKxG,GAAKrpB,GAAQqvB,GAAOU,GAAKC,CAAG;AAAA,EAAA;AAE1C;ACxCO,SAASC,GAAU/G,GAAwC;AAC9D,QAAM,CAACG,GAAK6G,CAAM,IAAIv5B,EAAiB,MAAM,IAAI,IAAIuyB,CAAO,CAAC,GAEvDiH,IAAMr5B,EAAY,CAACZ,MAAmB;AACxC,IAAAg6B,EAAO,CAACt2B,MAAY;AAChB,UAAIA,EAAQ,IAAI1D,CAAK,EAAG,QAAO0D;AAC/B,YAAM3C,IAAO,IAAI,IAAI2C,CAAO;AAC5B,aAAA3C,EAAK,IAAIf,CAAK,GACPe;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAEC+I,IAASlJ,EAAY,CAACZ,MAAmB;AAC3C,IAAAg6B,EAAO,CAACt2B,MAAY;AAChB,UAAI,CAACA,EAAQ,IAAI1D,CAAK,EAAG,QAAO0D;AAChC,YAAM3C,IAAO,IAAI,IAAI2C,CAAO;AAC5B,aAAA3C,EAAK,OAAOf,CAAK,GACVe;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAECo4B,IAAQv4B,EAAY,MAAY;AAClC,IAAAo5B,EAAO,CAACt2B,MAAaA,EAAQ,SAAS,IAAIA,IAAU,oBAAI,KAAS;AAAA,EACrE,GAAG,CAAA,CAAE,GAECo2B,IAAMl5B,EAAY,CAACZ,MAAsBmzB,EAAI,IAAInzB,CAAK,GAAG,CAACmzB,CAAG,CAAC,GAE9DxyB,IAASC,EAAY,CAACZ,MAAmB;AAC3C,IAAAg6B,EAAO,CAACt2B,MAAY;AAChB,YAAM3C,IAAO,IAAI,IAAI2C,CAAO;AAC5B,aAAI3C,EAAK,IAAIf,CAAK,IAAGe,EAAK,OAAOf,CAAK,IACjCe,EAAK,IAAIf,CAAK,GACZe;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AAEL,SAAO2E;AAAA,IACH,OAAO;AAAA,MACH,KAAAytB;AAAA,MACA,KAAA8G;AAAA,MACA,QAAQnwB;AAAA,MACR,OAAAqvB;AAAA,MACA,KAAAW;AAAA,MACA,QAAAn5B;AAAA,MACA,MAAMwyB,EAAI;AAAA,IAAA;AAAA,IAEd,CAACA,GAAK8G,GAAKnwB,GAAQqvB,GAAOW,GAAKn5B,CAAM;AAAA,EAAA;AAE7C;ACtCO,SAASu5B,GAAY9vB,IAA8B,IAAuB;AAC7E,QAAM,EAAE,eAAA+vB,IAAgB,CAAA,GAAI,OAAAC,IAAQ,UAAahwB,GAE3C,CAACyK,GAAOgB,CAAQ,IAAIpV,EAAwC,OAAO;AAAA,IACrE,OAAO05B,EAAc,MAAM,GAAGC,CAAK;AAAA,IACnC,UAAUD,EAAc,MAAMC,CAAK;AAAA,EAAA,EACrC,GAEIH,IAAMr5B;AAAA,IACR,IAAId,MAAqB;AACrB,MAAA+V,EAAS,CAACnS,MAAY;AAClB,cAAMsK,IAAM,CAAC,GAAGtK,EAAQ,OAAO,GAAGA,EAAQ,UAAU,GAAG5D,CAAK;AAC5D,eAAO;AAAA,UACH,OAAOkO,EAAI,MAAM,GAAGosB,CAAK;AAAA,UACzB,UAAUpsB,EAAI,MAAMosB,CAAK;AAAA,QAAA;AAAA,MAEjC,CAAC;AAAA,IACL;AAAA,IACA,CAACA,CAAK;AAAA,EAAA,GAGJjlB,IAASvU;AAAA,IACX,CAACi2B,MAAuC;AACpC,MAAAhhB,EAAS,CAACnS,MAAY;AAClB,cAAMsK,IAAM,CAAC,GAAG6oB,EAAGnzB,EAAQ,KAAK,GAAG,GAAGA,EAAQ,QAAQ;AACtD,eAAO;AAAA,UACH,OAAOsK,EAAI,MAAM,GAAGosB,CAAK;AAAA,UACzB,UAAUpsB,EAAI,MAAMosB,CAAK;AAAA,QAAA;AAAA,MAEjC,CAAC;AAAA,IACL;AAAA,IACA,CAACA,CAAK;AAAA,EAAA,GAGJC,IAAaz5B,EAAY,MAAY;AACvC,IAAAiV,EAAS,CAACnS,OAAa;AAAA,MACnB,OAAOA,EAAQ,SAAS,MAAM,GAAG02B,CAAK;AAAA,MACtC,UAAU12B,EAAQ,SAAS,MAAM02B,CAAK;AAAA,IAAA,EACxC;AAAA,EACN,GAAG,CAACA,CAAK,CAAC;AAEV,SAAO10B;AAAA,IACH,OAAO;AAAA,MACH,OAAOmP,EAAM;AAAA,MACb,KAAAolB;AAAA,MACA,QAAA9kB;AAAA,MACA,YAAAklB;AAAA,MACA,MAAMxlB,EAAM,MAAM;AAAA,IAAA;AAAA,IAEtB,CAACA,EAAM,OAAOolB,GAAK9kB,GAAQklB,CAAU;AAAA,EAAA;AAE7C;ACtEO,SAASC,GACZxzB,GACmB;AACnB,QAAM8B,IAAME,EAAU,IAAI,GACpB8c,IAAa9c,EAAOhC,CAAO;AACjC,SAAA8e,EAAW,UAAU9e,GAErBhD,EAAU,MAAM;AACZ,QAAI,OAAO,WAAa,IAAa;AAErC,UAAMoR,IAAW,CAACpP,MAAyC;AACvD,YAAMue,IAASve,EAAM;AACrB,MAAI,CAAC8C,EAAI,WAAYyb,KAAUzb,EAAI,QAAQ,SAASyb,CAAM,KAC1DuB,EAAW,QAAA;AAAA,IACf;AAEA,oBAAS,iBAAiB,aAAa1Q,CAAQ,GAC/C,SAAS,iBAAiB,cAAcA,CAAQ,GACzC,MAAM;AACT,eAAS,oBAAoB,aAAaA,CAAQ,GAClD,SAAS,oBAAoB,cAAcA,CAAQ;AAAA,IACvD;AAAA,EACJ,GAAG,CAAA,CAAE,GAEEtM;AACX;AC7BO,SAAS2xB,KAA4B;AACxC,QAAMC,IAAU1xB,EAAgB,EAAI;AACpC,SAAI0xB,EAAQ,WACRA,EAAQ,UAAU,IACX,MAEJ;AACX;ACLO,SAASC,GAAaC,GAA8C;AACvE,QAAM,CAACC,GAAKC,CAAM,IAAIn6B,EAAwB,IAAI;AAElD,SAAAqD,EAAU,MAAM;AACZ,QAAI,CAAC42B,GAAM;AACP,MAAAE,EAAO,IAAI;AACX;AAAA,IACJ;AACA,UAAM75B,IAAO,IAAI,gBAAgB25B,CAAI;AACrC,WAAAE,EAAO75B,CAAI,GACJ,MAAM,IAAI,gBAAgBA,CAAI;AAAA,EACzC,GAAG,CAAC25B,CAAI,CAAC,GAEFC;AACX;;;;;;;AC6CA,SAASE,GAAc3O,GAAYC,GAAoB;AACnD,SAAID,KAAK,QAAQC,KAAK,OAAa,IAC/BD,KAAK,OAAa,KAClBC,KAAK,OAAa,IAClB,OAAOD,KAAM,YAAY,OAAOC,KAAM,WAAiBD,IAAIC,IAC3DD,aAAa,QAAQC,aAAa,OAAaD,EAAE,QAAA,IAAYC,EAAE,QAAA,IAC/D,OAAOD,KAAM,aAAa,OAAOC,KAAM,YAChC,OAAOD,CAAC,IAAI,OAAOC,CAAC,IAExB,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,GAAG,QAAW,EAAE,SAAS,IAAM;AAC1E;AAYO,SAAS2O,GAAa;AAAA,EACzB,MAAAlb;AAAA,EACA,SAAA3P;AAAA,EACA,UAAA4G,IAAW;AAAA,EACX,YAAAkkB,IAAa;AAAA,EACb,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAApb,IAAS,CAACqb,GAAM9zB,MAAUA;AAAA,EAC1B,cAAAkD;AAAA,EACA,WAAAnK;AAAA,EACA,GAAG0oB;AACP,GAAsB;AAClB,QAAM,CAAC6I,GAAQyJ,CAAS,IAAI16B,EAAiB,EAAE,GACzC,CAAC26B,GAAMC,CAAO,IAAI56B,EAAkCw6B,KAAe,IAAI,GACvE,EAAE,MAAA9kB,GAAM,SAAAob,EAAA,IAAYH,GAAc,GAAGva,CAAQ,GAE7CykB,IAAsB51B,EAAqB,MACzCs1B,KAAcA,EAAW,SAAS,IAAUA,IACzC/qB,EACF,OAAO,CAAC+P,MAAW;AAChB,UAAMub,IAAS3b,EAAK,KAAK,CAACK,MAAQA,EAAID,EAAO,GAAG,KAAK,IAAI,GACnDhgB,IAAQu7B,IAASA,EAAOvb,EAAO,GAAG,IAAI;AAC5C,WAAO,OAAOhgB,KAAU,YAAY,OAAOA,KAAU;AAAA,EACzD,CAAC,EACA,IAAI,CAACggB,MAAWA,EAAO,GAAG,GAChC,CAACgb,GAAY/qB,GAAS2P,CAAI,CAAC,GAExB/U,IAAWnF,EAAa,MAAM;AAChC,UAAMksB,IAAOF,EAAO,KAAA,EAAO,YAAA;AAC3B,WAAI,CAACE,KAAQ,CAACmJ,IAAmBnb,IAC1BA,EAAK;AAAA,MAAO,CAACK,MAChBqb,EAAoB,KAAK,CAAC33B,MAAQ;AAC9B,cAAM3D,IAAQigB,EAAItc,CAAG;AACrB,eAAO3D,KAAS,QAAQ,OAAOA,CAAK,EAAE,YAAA,EAAc,SAAS4xB,CAAI;AAAA,MACrE,CAAC;AAAA,IAAA;AAAA,EAET,GAAG,CAAChS,GAAM8R,GAAQqJ,GAAYO,CAAmB,CAAC,GAE5CE,IAAS91B,EAAa,MAAM;AAC9B,QAAI,CAAC01B,EAAM,QAAOvwB;AAClB,UAAM4wB,IAASL,EAAK,cAAc,QAAQ,IAAI;AAC9C,WAAO,CAAC,GAAGvwB,CAAQ,EAAE,KAAK,CAACqhB,GAAGC,MAAM0O,GAAc3O,EAAEkP,EAAK,GAAG,GAAGjP,EAAEiP,EAAK,GAAG,CAAC,IAAIK,CAAM;AAAA,EACxF,GAAG,CAAC5wB,GAAUuwB,CAAI,CAAC,GAEbhlB,IAAa,KAAK,IAAI,GAAG,KAAK,KAAKolB,EAAO,SAAS3kB,CAAQ,CAAC;AAGlE,EAAA/S,EAAU,MAAM;AACZ,IAAIqS,IAAOC,KAAYmb,EAAQnb,CAAU;AAAA,EAC7C,GAAG,CAACD,GAAMC,GAAYmb,CAAO,CAAC;AAE9B,QAAMmK,IAAW,KAAK,IAAIvlB,GAAMC,CAAU,GACpCulB,IAAWj2B,EAAa,MAAM;AAChC,UAAM8Q,KAASklB,IAAW,KAAK7kB;AAC/B,WAAO2kB,EAAO,MAAMhlB,GAAOA,IAAQK,CAAQ;AAAA,EAC/C,GAAG,CAAC2kB,GAAQE,GAAU7kB,CAAQ,CAAC;AAE/B,WAAS+kB,EAAWj4B,GAAoB;AACpC,IAAA03B,EAAQ,CAAC33B,MACD,CAACA,KAAWA,EAAQ,QAAQC,IAAY,EAAE,KAAAA,GAAK,WAAW,MAAA,IAC1DD,EAAQ,cAAc,QAAc,EAAE,KAAAC,GAAK,WAAW,OAAA,IACnD,IACV;AAAA,EACL;AAEA,QAAMk4B,IAAen2B;AAAA,IACjB,MACIuK,EAAQ,IAAI,CAAC+P,MAAW;AAEpB,YAAM8b,IADWV,GAAM,QAAQpb,EAAO,MACRob,GAAM,cAAc,QAAQ,OAAO,OAAQ,IACnEle,IAAS8C,EAAO,WAClB,gBAAAxe;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWL,GAAO;AAAA,UAClB,SAAS,MAAMy6B,EAAW5b,EAAO,GAAG;AAAA,UACpC,cAAY,eACR,OAAOA,EAAO,UAAW,WAAWA,EAAO,SAAS,OAAOA,EAAO,GAAG,CACzE;AAAA,UAEC,UAAA;AAAA,YAAAA,EAAO;AAAA,8BACP,QAAA,EAAK,WAAW7e,GAAO,eAAe,eAAW,IAC7C,UAAA26B,EAAA,CACL;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,IAGJ9b,EAAO;AAGX,aAAO;AAAA,QACH,KAAK,OAAOA,EAAO,GAAG;AAAA,QACtB,QAAA9C;AAAA,QACA,OAAO8C,EAAO;AAAA,QACd,UAAUA,EAAO;AAAA,QACjB,OAAOA,EAAO;AAAA,QACd,QAAQA,EAAO,SACT,CAACC,MAAWD,EAAO,OAAQC,CAAG,IAC9B,CAACA,MAAYA,EAAID,EAAO,GAAG,KAAmB;AAAA,MAAA;AAAA,IAE5D,CAAC;AAAA;AAAA,IAEL,CAAC/P,GAASmrB,CAAI;AAAA,EAAA;AAGlB,SACI,gBAAA55B,EAAC,SAAI,WAAWN,EAAGC,GAAO,SAAShB,CAAS,GAAI,GAAG0oB,GAC9C,UAAA;AAAA,IAAAkS,KACG,gBAAA95B;AAAA,MAACwb;AAAA,MAAA;AAAA,QACG,OAAOiV;AAAA,QACP,UAAU,CAAC1xB,MAAU;AACjB,UAAAm7B,EAAUn7B,CAAK,GACfuxB,EAAQ,CAAC;AAAA,QACb;AAAA,QACA,kBAAkBpwB,GAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAGjC,gBAAAF;AAAA,MAAC0e;AAAA,MAAA;AAAA,QACG,SAASkc;AAAA,QACT,MAAMF;AAAA,QACN,QAAQ,CAAC1b,GAAK7Y,MAAUyY,EAAOI,IAAMyb,IAAW,KAAK7kB,IAAWzP,CAAK;AAAA,QACrE,cAAAkD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH8L,IAAa,KACV,gBAAAnV;AAAA,MAAC0V;AAAA,MAAA;AAAA,QACG,MAAM+kB;AAAA,QACN,YAAAtlB;AAAA,QACA,cAAcmb;AAAA,QACd,YAAYiK,EAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACvB,GAER;AAER;;;;;;;;;;;;ACvLO,SAASO,GAAS;AAAA,EACrB,SAAAz5B;AAAA,EACA,OAAAT;AAAA,EACA,UAAA0N;AAAA,EACA,UAAAysB;AAAA,EACA,SAAA12B;AAAA,EACA,UAAAwC,IAAW;AAAA,EACX,UAAAkV,IAAW;AAAA,EACX,WAAA7c;AACJ,GAAkB;AACd,QAAM+f,IACF,gBAAA1e,EAAA4B,GAAA,EACK,UAAA;AAAA,IAAAd,MAAY,UAAa,gBAAArB,EAAC,QAAA,EAAK,WAAWE,GAAO,SAAU,UAAAmB,GAAQ;AAAA,IACpE,gBAAAd,EAAC,QAAA,EAAK,WAAWL,GAAO,MACpB,UAAA;AAAA,MAAA,gBAAAF,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAU,GAAM;AAAA,MACrC0N,MAAa,UAAa,gBAAAtO,EAAC,UAAK,WAAWE,GAAO,UAAW,UAAAoO,EAAA,CAAS;AAAA,IAAA,GAC3E;AAAA,IACCysB,MAAa,UAAa,gBAAA/6B,EAAC,UAAK,WAAWE,GAAO,UAAW,UAAA66B,EAAA,CAAS;AAAA,EAAA,GAC3E,GAGEC,IAAgB/6B;AAAA,IAClBC,GAAO;AAAA,IACP6b,KAAY7b,GAAO;AAAA,IACnB2G,KAAY3G,GAAO;AAAA,IACnBhB;AAAA,EAAA;AAGJ,SAAImF,IAEI,gBAAArE;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAWC,EAAG+6B,GAAe96B,GAAO,WAAW;AAAA,MAC/C,gBAAc6b,IAAW,KAAO;AAAA,MAChC,UAAAlV;AAAA,MACA,SAAAxC;AAAA,MAEC,UAAA4a;AAAA,IAAA;AAAA,EAAA,IAKN,gBAAAjf,EAAC,OAAA,EAAI,WAAWg7B,GAAgB,UAAA/b,GAAQ;AACnD;;;;;;;;;;;;;;;;ACzCO,SAASgc,GAAqB;AAAA,EACjC,MAAAn6B;AAAA,EACA,OAAA0G;AAAA,EACA,UAAAkZ,IAAW;AAAA,EACX,MAAAvc,IAAO;AAAA,EACP,SAAAzD,IAAU;AAAA,EACV,WAAAxB;AAAA,EACA,GAAGgC;AACP,GAA8B;AAC1B,QAAMg6B,IAAW1zB,MAAU;AAC3B,SACI,gBAAAjH;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAWN;AAAA,QACPC,GAAO;AAAA,QACPA,GAAOiE,CAAI;AAAA,QACXjE,GAAOQ,CAAO;AAAA,QACdw6B,IAAWh7B,GAAO,WAAWA,GAAO;AAAA,QACpCwgB,MAAa,UAAUxgB,GAAO;AAAA,QAC9BwgB,MAAa,kBAAkBxgB,GAAO;AAAA,QACtCwgB,MAAa,iBAAiBxgB,GAAO;AAAA,QACrChB;AAAA,MAAA;AAAA,MAEH,GAAGgC;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAlB,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,UAAAY,GAAK;AAAA,QACnCo6B,KAAY,gBAAAl7B,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,UAAAsH,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG/D;;;;;;;;;;;;;ACjBO,SAAS2zB,GAAe;AAAA,EAC3B,OAAAt8B;AAAA,EACA,OAAAE;AAAA,EACA,UAAAE;AAAA,EACA,QAAAgd;AAAA,EACA,QAAA3Y;AAAA,EACA,iBAAA83B,IAAkB;AAAA,EAClB,WAAAl8B;AAAA,EACA,GAAGgC;AACP,GAAwB;AACpB,SACI,gBAAAX,EAAC,OAAA,EAAI,WAAWN,EAAGC,GAAO,MAAMhB,CAAS,GAAG,cAAW,qBAAqB,GAAGgC,GAC1E,UAAA;AAAA,IAAA+a,MAAW,UAAa,gBAAAjc,EAAC,OAAA,EAAI,WAAWE,GAAO,QAAS,UAAA+b,GAAO;AAAA,IAChE,gBAAAjc,EAAC,QAAG,WAAWE,GAAO,MACjB,UAAArB,EAAM,IAAI,CAACsB,MAAS;AACjB,YAAMqF,IAASrF,EAAK,QAAQpB,GACtBga,IACFqiB,MAAoB,SAAUA,MAAoB,cAAc51B;AACpE,+BACK,MAAA,EACG,UAAA,gBAAAjF;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAWN,EAAGC,GAAO,MAAMsF,KAAUtF,GAAO,MAAM;AAAA,UAClD,gBAAcsF,IAAS,SAAS;AAAA,UAChC,UAAUrF,EAAK;AAAA,UACf,SAAS,MAAMlB,EAASkB,EAAK,GAAG;AAAA,UAEhC,UAAA;AAAA,YAAA,gBAAAI,EAAC,QAAA,EAAK,WAAWL,GAAO,UACnB,UAAA;AAAA,cAAAC,EAAK,QAAQ,gBAAAH,EAAC,QAAA,EAAK,WAAWE,GAAO,MAAO,YAAK,KAAA,CAAK;AAAA,cACtDC,EAAK,UAAU,UACZ,gBAAAH,EAAC,UAAK,WAAWE,GAAO,OAAQ,UAAAC,EAAK,MAAA,CAAM;AAAA,YAAA,GAEnD;AAAA,YACC4Y,KAAa,gBAAA/Y,EAAC,QAAA,EAAK,WAAWE,GAAO,OAAQ,YAAK,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAC7D,GAfKC,EAAK,GAgBd;AAAA,IAER,CAAC,EAAA,CACL;AAAA,IACCmD,MAAW,UAAa,gBAAAtD,EAAC,SAAI,WAAWE,GAAO,QAAS,UAAAoD,EAAA,CAAO;AAAA,EAAA,GACpE;AAER;;;;;;;;;;;;ACpEA,SAAS+3B,GAAKt8B,GAAuB;AACjC,SAAOA,EAAM,SAAA,EAAW,SAAS,GAAG,GAAG;AAC3C;AAGA,SAASu8B,GAAWv8B,GAA2B;AAC3C,QAAMw8B,IAAQ,wBAAwB,KAAKx8B,EAAM,MAAM;AACvD,MAAI,CAACw8B,EAAO,QAAO,EAAE,QAAQ,MAAM,QAAQ,KAAA;AAC3C,QAAMC,IAAS,OAAOD,EAAM,CAAC,CAAC,GACxBE,IAAS,OAAOF,EAAM,CAAC,CAAC;AAC9B,SAAIC,IAAS,KAAKA,IAAS,MAAMC,IAAS,KAAKA,IAAS,KAC7C,EAAE,QAAQ,MAAM,QAAQ,KAAA,IAE5B,EAAE,QAAAD,GAAQ,QAAAC,EAAA;AACrB;AAGA,SAASC,GAASF,GAAwB;AACtC,QAAMG,IAAMH,IAAS;AACrB,SAAOG,MAAQ,IAAI,KAAKA;AAC5B;AAGA,SAASC,GAASC,GAAgBC,GAAwB;AACtD,QAAMve,IAAOse,IAAS;AACtB,SAAOC,MAAW,OAAOve,IAAO,KAAKA;AACzC;AASO,SAASwe,GAAW;AAAA,EACvB,OAAAh9B;AAAA,EACA,UAAAE;AAAA,EACA,YAAA+8B,IAAa;AAAA,EACb,YAAAC,IAAa;AAAA,EACb,OAAAz0B;AAAA,EACA,YAAAY;AAAA,EACA,UAAAvB;AAAA,EACA,WAAA3H;AACJ,GAAoB;AAChB,QAAMU,IAAKR,EAAA,GACL,EAAE,QAAAo8B,GAAQ,QAAAC,EAAA,IAAWh3B,EAAQ,MAAM62B,GAAWv8B,CAAK,GAAG,CAACA,CAAK,CAAC,GAE7D+8B,IAAiBN,MAAW,QAAQA,KAAU,KAAK,OAAO,MAE1DU,IAAYz3B,EAAkB,MAC5Bw3B,IACO,MAAM,KAAK,EAAE,QAAQ,MAAM,CAAC3mB,GAAGnP,MAAUA,IAAQ,CAAC,IAEtD,MAAM,KAAK,EAAE,QAAQ,MAAM,CAACmP,GAAGnP,MAAUA,CAAK,GACtD,CAAC81B,CAAU,CAAC,GAETE,IAAc13B,EAAkB,MAAM;AACxC,UAAM8P,IAAOynB,IAAa,IAAIA,IAAa,GACrCpkB,IAAkB,CAAA;AACxB,aAASnV,IAAU,GAAGA,IAAU,IAAIA,KAAW8R;AAC3C,MAAAqD,EAAM,KAAKnV,CAAO;AAEtB,WAAOmV;AAAA,EACX,GAAG,CAACokB,CAAU,CAAC,GAETI,IAAsBZ,MAAW,OAAO,OAAOS,IAAaP,GAASF,CAAM,IAAIA,GAE/ExnB,IAAO,CAACqoB,GAAoBC,MAA6B;AAC3D,IAAAr9B,EAAS,GAAGo8B,GAAKgB,CAAU,CAAC,IAAIhB,GAAKiB,CAAU,CAAC,EAAE;AAAA,EACtD,GAEMC,IAAa,CAACC,MAA8B;AAC9C,QAAI31B,EAAU;AACd,UAAMy1B,IAAab,KAAU,GACvBY,IAAaJ,IAAaL,GAASY,GAAaV,CAAM,IAAIU;AAChE,IAAAxoB,EAAKqoB,GAAYC,CAAU;AAAA,EAC/B,GAEMG,IAAe,CAACH,MAA6B;AAC/C,QAAIz1B,EAAU;AACd,UAAM61B,IAAalB,MAAWS,IAAaL,GAAS,IAAI,IAAI,IAAI;AAChE,IAAA5nB,EAAK0oB,GAAYJ,CAAU;AAAA,EAC/B,GAEMK,IAAe,CAACC,MAA6B;AAC/C,QAAI/1B,EAAU;AACd,UAAM21B,IAAcJ,KAAuB,IACrCE,IAAab,KAAU;AAC7B,IAAAznB,EAAK4nB,GAASY,GAAaI,CAAU,GAAGN,CAAU;AAAA,EACtD;AAEA,SACI,gBAAA/7B,EAAC,OAAA,EAAI,WAAWN,EAAGC,EAAO,SAAS2G,KAAY3G,EAAO,UAAUhB,CAAS,GACpE,UAAA;AAAA,IAAAsI,KACG,gBAAAxH,EAAC,UAAK,IAAI,GAAGJ,CAAE,UAAU,WAAWM,EAAO,OACtC,UAAAsH,EAAA,CACL;AAAA,IAEJ,gBAAAjH,EAAC,OAAA,EAAI,WAAWL,EAAO,SACnB,UAAA;AAAA,MAAA,gBAAAF,EAAC,MAAA,EAAG,MAAK,WAAU,cAAW,SAAQ,WAAWE,EAAO,QACnD,UAAAg8B,EAAU,IAAI,CAAC1jB,MAAS;AACrB,cAAMhT,IAASgT,MAAS4jB;AACxB,eACI,gBAAAp8B,EAAC,MAAA,EAAc,WAAWE,EAAO,aAC7B,UAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAewF;AAAA,YACf,UAAAqB;AAAA,YACA,WAAW5G,EAAGC,EAAO,MAAMsF,KAAUtF,EAAO,MAAM;AAAA,YAClD,SAAS,MAAMq8B,EAAW/jB,CAAI;AAAA,YAE7B,UAAAyjB,IAAazjB,IAAO6iB,GAAK7iB,CAAI;AAAA,UAAA;AAAA,QAAA,KAT7BA,CAWT;AAAA,MAER,CAAC,EAAA,CACL;AAAA,MACA,gBAAAxY,EAAC,MAAA,EAAG,MAAK,WAAU,cAAW,WAAU,WAAWE,EAAO,QACrD,UAAAi8B,EAAY,IAAI,CAAC3jB,MAAS;AACvB,cAAMhT,IAASgT,MAASijB;AACxB,eACI,gBAAAz7B,EAAC,MAAA,EAAc,WAAWE,EAAO,aAC7B,UAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAewF;AAAA,YACf,UAAAqB;AAAA,YACA,WAAW5G,EAAGC,EAAO,MAAMsF,KAAUtF,EAAO,MAAM;AAAA,YAClD,SAAS,MAAMu8B,EAAajkB,CAAI;AAAA,YAE/B,aAAKA,CAAI;AAAA,UAAA;AAAA,QAAA,KATTA,CAWT;AAAA,MAER,CAAC,EAAA,CACL;AAAA,MACCyjB,KACG,gBAAAj8B,EAAC,MAAA,EAAG,MAAK,WAAU,cAAW,WAAU,WAAWE,EAAO,QACpD,WAAC,MAAM,IAAI,EAAe,IAAI,CAACsY,MAAS;AACtC,cAAMhT,IAAS42B,MAAwB,QAAQ5jB,MAASsjB;AACxD,eACI,gBAAA97B,EAAC,MAAA,EAAc,WAAWE,EAAO,aAC7B,UAAA,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAewF;AAAA,YACf,UAAAqB;AAAA,YACA,WAAW5G,EAAGC,EAAO,MAAMsF,KAAUtF,EAAO,MAAM;AAAA,YAClD,SAAS,MAAMy8B,EAAankB,CAAI;AAAA,YAE/B,UAAAA;AAAA,UAAA;AAAA,QAAA,KATAA,CAWT;AAAA,MAER,CAAC,EAAA,CACL;AAAA,IAAA,GAER;AAAA,IACCpQ,KAAc,gBAAApI,EAAC,QAAA,EAAK,WAAWE,EAAO,QAAS,UAAAkI,EAAA,CAAW;AAAA,EAAA,GAC/D;AAER;;;;;;;AC3KA,SAASy0B,GAAgBC,GAAkBvJ,GAA2B;AAClE,QAAMwJ,IAAMxJ,IAAY;AACxB,SAAO,KAAK,IAAIuJ,IAAW,GAAGC,CAAG;AACrC;AASO,SAASC,GAAiB;AAAA,EAC7B,WAAAC;AAAA,EACA,UAAAh8B;AAAA,EACA,WAAAsyB,IAAY;AAAA,EACZ,UAAA1sB;AAAA,EACA,WAAA3H;AACJ,GAA0B;AACtB,QAAMoiB,IAAezZ,EAAuB,IAAI,GAC1Cq1B,IAAYr1B,EAAsB,IAAI,GACtC,CAACs1B,GAAMC,CAAO,IAAI59B,EAAS,CAAC,GAC5B,CAAC69B,GAAYC,CAAa,IAAI99B,EAAS,EAAK,GAE5C+9B,IAAUL,EAAU,YAAY,MAEhCM,IAAmB,CAAC34B,MAA4C;AAClE,QAAIgC,KAAYw2B,EAAY;AAC5B,UAAM/Y,IAAYhD,EAAa;AAC/B,QAAI,CAACgD,KAAaA,EAAU,YAAY,EAAG;AAC3C,UAAMmZ,IAAQ54B,EAAM,QAAQ,CAAC;AAC7B,IAAK44B,MACLP,EAAU,UAAUO,EAAM;AAAA,EAC9B,GAEMC,IAAkB,CAAC74B,MAA4C;AACjE,QAAIgC,KAAYw2B,EAAY;AAC5B,UAAMzG,IAASsG,EAAU;AACzB,QAAItG,MAAW,KAAM;AACrB,UAAM6G,IAAQ54B,EAAM,QAAQ,CAAC;AAC7B,QAAI,CAAC44B,EAAO;AACZ,UAAM9gB,IAAQ8gB,EAAM,UAAU7G;AAC9B,QAAIja,KAAS,GAAG;AACZ,MAAAygB,EAAQ,CAAC;AACT;AAAA,IACJ;AACA,IAAAA,EAAQP,GAAgBlgB,GAAO4W,CAAS,CAAC;AAAA,EAC7C,GAEMhD,IAAQ,MAAY;AACtB,IAAA2M,EAAU,UAAU,MACpBE,EAAQ,CAAC;AAAA,EACb,GAEMO,IAAiB,YAA2B;AAC9C,QAAI92B,KAAYw2B,GAAY;AACxB,MAAA9M,EAAA;AACA;AAAA,IACJ;AAGA,QAAI,EAFW2M,EAAU,YACI,QAAQC,KAAQ5J,IAC7B;AACZ,MAAAhD,EAAA;AACA;AAAA,IACJ;AACA,IAAA2M,EAAU,UAAU,MACpBI,EAAc,EAAI,GAClBF,EAAQ7J,CAAS;AACjB,QAAI;AACA,YAAM0J,EAAA;AAAA,IACV,UAAA;AACI,MAAAK,EAAc,EAAK,GACnBF,EAAQ,CAAC;AAAA,IACb;AAAA,EACJ,GAEMQ,IAAgBP,KAAcF,IAAO,GACrCU,IAAW,KAAK,IAAI,GAAGV,IAAO5J,CAAS;AAE7C,SACI,gBAAAhzB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK+gB;AAAA,MACL,WAAWrhB,EAAGC,GAAO,SAAShB,CAAS;AAAA,MACvC,mBAAiBm+B;AAAA,MACjB,cAAcG;AAAA,MACd,aAAaE;AAAA,MACb,YAAYC;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAA39B;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWE,GAAO;AAAA,YAClB,eAAa,CAAC09B;AAAA,YACd,OAAO;AAAA,cACH,SAASP,IAAa,IAAIQ;AAAA,cAC1B,WAAW,+BAA+BD,IAAgBT,IAAO,CAAC,cAAcU,IAAW,GAAG;AAAA,YAAA;AAAA,YAGlG,UAAA,gBAAA79B,EAACuc,IAAA,EAAQ,MAAK,MAAK,OAAM,cAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,QAE3C,gBAAAvc;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWC,EAAGC,GAAO,UAAUq9B,KAAWF,MAAen9B,GAAO,QAAQ;AAAA,YACxE,OAAO,EAAE,WAAW,cAAc09B,IAAgBT,IAAO,CAAC,MAAA;AAAA,YAEzD,UAAAl8B;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAAA;AAGZ;ACtHO,SAAS68B,GAAe/+B,GAAuB;AAClD,SAAO,IAAI,KAAK,aAAa,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,UAAU;AAAA,EAAA,CACb,EAAE,OAAOA,CAAK;AACnB;AAQO,SAASg/B,GAAWh/B,GAA8B;AACrD,QAAM0kB,IAAO,OAAO1kB,KAAU,WAAW,IAAI,KAAKA,CAAK,IAAIA;AAC3D,SAAI,OAAO,MAAM0kB,EAAK,QAAA,CAAS,IAAU,KAClC,IAAI,KAAK,eAAe,OAAO,EAAE,OAAOA,CAAI;AACvD;AAQO,SAASua,GAAej/B,GAA8B;AACzD,QAAM0kB,IAAO,OAAO1kB,KAAU,WAAW,IAAI,KAAKA,CAAK,IAAIA;AAC3D,SAAI,OAAO,MAAM0kB,EAAK,QAAA,CAAS,IAAU,KAClC,IAAI,KAAK,eAAe,SAAS;AAAA,IACpC,WAAW;AAAA,IACX,WAAW;AAAA,EAAA,CACd,EAAE,OAAOA,CAAI;AAClB;AAQO,SAASwa,GAAYl/B,GAAuB;AAC/C,QAAM0e,IAAS1e,EAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AACnD,SAAI0e,EAAO,UAAU,KACVA,EAAO,QAAQ,eAAe,SAAS,EAAE,QAAQ,eAAe,OAAO,IAE3EA,EAAO,QAAQ,eAAe,SAAS,EAAE,QAAQ,eAAe,OAAO;AAClF;AAQO,SAASygB,GAAUn/B,GAAuB;AAC7C,SAAOA,EACF,QAAQ,OAAO,EAAE,EACjB,MAAM,GAAG,EAAE,EACX,QAAQ,eAAe,OAAO,EAC9B,QAAQ,eAAe,OAAO,EAC9B,QAAQ,qBAAqB,OAAO;AAC7C;AAQO,SAASo/B,GAAcp/B,GAAuB;AACjD,SAAO,IAAI,KAAK,aAAa,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EAAA,CAC1B,EAAE,OAAOA,CAAK;AACnB;AC7EO,MAAMq/B,KAAU;AAAA,EACnB,IAAO17B,GAAaoM,GAAgB;AAChC,QAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,QAAI;AACA,YAAMuiB,IAAM,OAAO,aAAa,QAAQ3uB,CAAG;AAC3C,aAAO2uB,MAAQ,OAAOviB,IAAY,KAAK,MAAMuiB,CAAG;AAAA,IACpD,QAAQ;AACJ,aAAOviB;AAAA,IACX;AAAA,EACJ;AAAA,EACA,IAAOpM,GAAa3D,GAAgB;AAChC,QAAI,SAAO,SAAW;AACtB,UAAI;AACA,eAAO,aAAa,QAAQ2D,GAAK,KAAK,UAAU3D,CAAK,CAAC;AAAA,MAC1D,QAAQ;AAAA,MAER;AAAA,EACJ;AAAA,EACA,OAAO2D,GAAmB;AACtB,QAAI,SAAO,SAAW;AACtB,UAAI;AACA,eAAO,aAAa,WAAWA,CAAG;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,EACJ;AACJ;ACnBO,SAAS27B,GAAQpb,GAAuB;AAC3C,SAAOA,EACF,UAAU,KAAK,EACf,QAAQ,UAAU,EAAE,EACpB,YAAA,EACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC/B;AAUO,SAASqb,GAASrb,GAAenK,GAAaylB,IAAiB,KAAa;AAC/E,MAAItb,EAAM,UAAUnK,EAAK,QAAOmK;AAChC,QAAMub,IAAM,KAAK,IAAI,GAAG1lB,IAAMylB,EAAO,MAAM;AAC3C,SAAOtb,EAAM,MAAM,GAAGub,CAAG,EAAE,YAAYD;AAC3C;AASO,SAASE,GAAW1/B,GAAuB;AAC9C,SAAIA,EAAM,WAAW,IAAUA,IACxBA,EAAM,OAAO,CAAC,EAAE,gBAAgBA,EAAM,MAAM,CAAC;AACxD;AAaO,SAAS2/B,GAAU3/B,GAAuB;AAC7C,QAAM4/B,IAAQ5/B,EACT,QAAQ,kBAAkB,GAAG,EAC7B,KAAA,EACA,MAAM,KAAK,EACX,OAAO,OAAO;AACnB,SAAI4/B,EAAM,WAAW,IAAU,KACxBA,EACF,IAAI,CAACC,GAAMz4B,MAAU;AAClB,UAAM04B,IAAQD,EAAK,YAAA;AACnB,WAAOz4B,MAAU,IAAI04B,IAAQA,EAAM,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAM,MAAM,CAAC;AAAA,EAC9E,CAAC,EACA,KAAK,EAAE;AAChB;AAaO,SAASC,GAAU//B,GAAuB;AAC7C,SAAOA,EACF,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,YAAY,EAAE,EACtB,YAAA;AACT;AAaO,SAASggC,GAAUrP,GAAesP,GAAkBC,GAAyB;AAChF,SAAOvP,MAAU,IAAIsP,IAAYC,KAAU,GAAGD,CAAQ;AAC1D;AC5FO,SAASE,GAAkCrgC,GAAY6D,GAAqC;AAC/F,QAAM0O,IAAS,CAAA;AACf,aAAWjR,KAAQtB,GAAO;AACtB,UAAMsgC,IAAIz8B,EAAIvC,CAAI;AAClB,KAACiR,EAAO+tB,CAAC,MAAM,CAAA,GAAI,KAAKh/B,CAAI;AAAA,EAChC;AACA,SAAOiR;AACX;AAiBO,SAASguB,GAAYvgC,GAAY6D,GAAgC;AACpE,QAAM28B,wBAAW,IAAA,GACXjuB,IAAc,CAAA;AACpB,aAAWjR,KAAQtB,GAAO;AACtB,UAAMsgC,IAAIz8B,EAAIvC,CAAI;AAClB,IAAKk/B,EAAK,IAAIF,CAAC,MACXE,EAAK,IAAIF,CAAC,GACV/tB,EAAO,KAAKjR,CAAI;AAAA,EAExB;AACA,SAAOiR;AACX;AAiBO,SAASkuB,GAASzgC,GAAYsF,GAAqB;AACtD,MAAIA,IAAO;AACP,UAAM,IAAI,WAAW,qCAAqCA,CAAI,EAAE;AAEpE,QAAMiN,IAAgB,CAAA;AACtB,WAASrF,IAAI,GAAGA,IAAIlN,EAAM,QAAQkN,KAAK5H;AACnC,IAAAiN,EAAO,KAAKvS,EAAM,MAAMkN,GAAGA,IAAI5H,CAAI,CAAC;AAExC,SAAOiN;AACX;AAoBO,SAASqE,GAAMF,GAAeC,GAAajB,IAAe,GAAa;AAC1E,QAAMnD,IAAmB,CAAA;AACzB,MAAImD,MAAS,EAAG,QAAOnD;AACvB,MAAImD,IAAO;AACP,aAASxI,IAAIwJ,GAAOxJ,IAAIyJ,GAAKzJ,KAAKwI,EAAM,CAAAnD,EAAO,KAAKrF,CAAC;AAAA;AAErD,aAASA,IAAIwJ,GAAOxJ,IAAIyJ,GAAKzJ,KAAKwI,EAAM,CAAAnD,EAAO,KAAKrF,CAAC;AAEzD,SAAOqF;AACX;AChGA,SAASmuB,GAAcxgC,GAAkD;AACrE,MAAI,OAAOA,KAAU,YAAYA,MAAU,KAAM,QAAO;AACxD,QAAMygC,IAAQ,OAAO,eAAezgC,CAAK;AACzC,SAAOygC,MAAU,OAAO,aAAaA,MAAU;AACnD;AAWO,SAASC,GAA0CC,GAAQC,GAAuB;AACrF,QAAMvuB,IAAS,CAAA;AACf,aAAW1O,KAAOi9B;AACd,IAAI,OAAO,UAAU,eAAe,KAAKD,GAAKh9B,CAAG,MAC7C0O,EAAO1O,CAAG,IAAIg9B,EAAIh9B,CAAG;AAG7B,SAAO0O;AACX;AAWO,SAASwuB,GAA0CF,GAAQC,GAAuB;AACrF,QAAME,IAAU,IAAI,IAAiBF,CAAI,GACnCvuB,IAAS,CAAA;AACf,aAAW1O,KAAO,OAAO,KAAKg9B,CAAG;AAC7B,IAAKG,EAAQ,IAAIn9B,CAAG,MAChB0O,EAAO1O,CAAG,IAAIg9B,EAAIh9B,CAAG;AAG7B,SAAO0O;AACX;AAqBO,SAAS0uB,GAAa1c,GAAW2c,GAAuB;AAC3D,MAAI,CAACR,GAAcnc,CAAM,KAAK,CAACmc,GAAcQ,CAAM;AAC/C,WAAQA,MAAW,SAAY3c,IAAU2c;AAE7C,QAAM3uB,IAAkC,EAAE,GAAGgS,EAAA;AAC7C,aAAW1gB,KAAO,OAAO,KAAKq9B,CAAM,GAAG;AACnC,UAAMC,IAAeD,EAAmCr9B,CAAG,GACrDu9B,IAAc7uB,EAAO1O,CAAG;AAC9B,IAAI68B,GAAcU,CAAW,KAAKV,GAAcS,CAAW,IACvD5uB,EAAO1O,CAAG,IAAIo9B,GAAUG,GAAaD,CAAW,IAEhD5uB,EAAO1O,CAAG,IAAIs9B;AAAA,EAEtB;AACA,SAAO5uB;AACX;AAmBO,SAAS8uB,GAAQnhC,GAAyB;AAC7C,SAAIA,KAAU,OAAoC,KAC9C,OAAOA,KAAU,YACjB,MAAM,QAAQA,CAAK,IAAUA,EAAM,WAAW,IAC9CA,aAAiB,OAAOA,aAAiB,MAAYA,EAAM,SAAS,IACpEwgC,GAAcxgC,CAAK,IAAU,OAAO,KAAKA,CAAK,EAAE,WAAW,IACxD;AACX;ACtGO,SAASohC,GAAaphC,GAAyC;AAClE,SAAOA,KAAU;AACrB;AASO,SAASqhC,GAASrhC,GAAiC;AACtD,SAAO,OAAOA,KAAU;AAC5B;AAUO,SAASshC,GAASthC,GAAiC;AACtD,SAAO,OAAOA,KAAU,YAAY,CAAC,OAAO,MAAMA,CAAK;AAC3D;AAcO,SAASuhC,GAAcvhC,GAAkD;AAC5E,MAAI,OAAOA,KAAU,YAAYA,MAAU,KAAM,QAAO;AACxD,QAAMygC,IAAQ,OAAO,eAAezgC,CAAK;AACzC,SAAOygC,MAAU,OAAO,aAAaA,MAAU;AACnD;AAuBO,SAASe,GAAYxhC,GAAcyhC,GAAyB;AAC/D,QAAM,IAAI,MAAMA,KAAW,qBAAqB,OAAOzhC,CAAK,CAAC,EAAE;AACnE;AClEO,SAAS0hC,GACZ7K,GACA8K,GAC+C;AAC/C,MAAIzgB;AAEJ,QAAM0gB,IAAY,IAAItL,MAAkB;AACpC,IAAIpV,MAAU,UAAW,aAAaA,CAAK,GAC3CA,IAAQ,WAAW,MAAM;AACrB,MAAAA,IAAQ,QACR2V,EAAG,GAAGP,CAAI;AAAA,IACd,GAAGqL,CAAI;AAAA,EACX;AAEA,SAAAC,EAAU,SAAS,MAAY;AAC3B,IAAI1gB,MAAU,WACV,aAAaA,CAAK,GAClBA,IAAQ;AAAA,EAEhB,GAEO0gB;AACX;AAeO,SAASC,GACZhL,GACA8K,GAC+C;AAC/C,MAAIzgB,GACA4gB,GACAC,IAAa;AAEjB,QAAMC,IAAS,CAAC1L,MAAkB;AAC9B,IAAAyL,IAAa,KAAK,IAAA,GAClBlL,EAAG,GAAGP,CAAI;AAAA,EACd,GAEMW,IAAY,IAAIX,MAAkB;AACpC,UAAMnS,IAAM,KAAK,IAAA,GACX8d,IAAYN,KAAQxd,IAAM4d;AAEhC,IAAIE,KAAa,KACT/gB,MAAU,WACV,aAAaA,CAAK,GAClBA,IAAQ,SAEZ8gB,EAAO1L,CAAI,MAEXwL,IAAWxL,GACPpV,MAAU,WACVA,IAAQ,WAAW,MAAM;AAErB,UADAA,IAAQ,QACJ4gB,MAAa,QAAW;AACxB,cAAMI,IAAUJ;AAChB,QAAAA,IAAW,QACXE,EAAOE,CAAO;AAAA,MAClB;AAAA,IACJ,GAAGD,CAAS;AAAA,EAGxB;AAEA,SAAAhL,EAAU,SAAS,MAAY;AAC3B,IAAI/V,MAAU,WACV,aAAaA,CAAK,GAClBA,IAAQ,SAEZ4gB,IAAW,QACXC,IAAa;AAAA,EACjB,GAEO9K;AACX;AAUO,SAAS5C,GAA6BwC,GAA0C;AACnF,MAAIsL,IAAS,IACT9vB;AAEJ,SAAO,IAAIikB,OACF6L,MACDA,IAAS,IACT9vB,IAASwkB,EAAG,GAAGP,CAAI,IAEhBjkB;AAEf;AAeO,SAAS+vB,GAAmCvL,GAA0C;AACzF,MAAIwL,IAAW,IACXP,GACAQ;AAEJ,QAAMC,IAAW,CAACxhC,MAAqB;AACnC,QAAI,CAACshC,KAAYthC,EAAK,WAAW+gC,EAAS,OAAQ,QAAO;AACzD,aAAS90B,IAAI,GAAGA,IAAIjM,EAAK,QAAQiM;AAC7B,UAAI,CAAC,OAAO,GAAGjM,EAAKiM,CAAC,GAAG80B,EAAS90B,CAAC,CAAC,EAAG,QAAO;AAEjD,WAAO;AAAA,EACX;AAEA,SAAO,IAAIspB,OACHiM,EAASjM,CAAI,MACjBwL,IAAWxL,GACXgM,IAAazL,EAAG,GAAGP,CAAI,GACvB+L,IAAW,KACJC;AAEf;ACnJO,SAASE,GAAMC,GAA2B;AAC7C,SAAO,IAAI,QAAc,CAACC,MAAY,WAAWA,GAASD,CAAE,CAAC;AACjE;AAaO,SAASE,GAAeC,GAAqBH,GAAYhB,GAA8B;AAC1F,SAAO,IAAI,QAAW,CAACiB,GAASG,MAAW;AACvC,UAAM3hB,IAAQ,WAAW,MAAM;AAC3B,YAAM5X,IAAQ,IAAI,MAAMm4B,KAAW,6BAA6BgB,CAAE,IAAI;AACtE,MAAAn5B,EAAM,OAAO,gBACbu5B,EAAOv5B,CAAK;AAAA,IAChB,GAAGm5B,CAAE;AAEL,IAAAG,EAAQ;AAAA,MACJ,CAAC5iC,MAAU;AACP,qBAAakhB,CAAK,GAClBwhB,EAAQ1iC,CAAK;AAAA,MACjB;AAAA,MACA,CAAC8iC,MAAW;AACR,qBAAa5hB,CAAK,GAClB2hB,EAAOC,CAAM;AAAA,MACjB;AAAA,IAAA;AAAA,EAER,CAAC;AACL;AC7BO,SAASC,GAASC,GAAyB;AAC9C,MAAIniC;AAEJ,MAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe;AAC9D,IAAAA,IAAK,OAAO,WAAA;AAAA,OACT;AACH,UAAMoiC,IAAO,KAAK,IAAA,EAAM,SAAS,EAAE,GAC7BC,IAAO,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AACnD,IAAAriC,IAAK,GAAGoiC,CAAI,IAAIC,CAAI;AAAA,EACxB;AAEA,SAAOF,IAAS,GAAGA,CAAM,IAAIniC,CAAE,KAAKA;AACxC;ACLO,MAAMsiC,WAAwB,MAA0B;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAYC,GAAgB;AACxB,UAAMA,EAAK,MAAM,GACjB,KAAK,OAAO,mBACZ,KAAK,SAASA,EAAK,QACnB,KAAK,SAASA,EAAK,QACnB,KAAK,OAAOA,EAAK,MACjB,KAAK,YAAYA,EAAK,WACtB,KAAK,OAAOA,EAAK;AAAA,EACrB;AACJ;AASO,SAASC,GAAW/5B,GAAmC;AAC1D,SACI,OAAOA,KAAU,YACjBA,MAAU,QACV,OAAQA,EAAmB,UAAW,YACtC,OAAQA,EAAmB,UAAW;AAE9C;AAeO,SAASg6B,GACZj+B,GACA8wB,GACAoN,GACAC,GACQ;AACR,QAAM7C,IACF,OAAOxK,KAAS,YAAYA,MAAS,OAAQA,IAAmC,MAC9EsN,IAAS9C,GAAK,UAAUA,GAAK,WAAW,QAAQt7B,CAAM,IACtDq+B,IAAO,OAAO/C,GAAK,QAAS,WAAWA,EAAI,OAAO,QAClDgD,IACF,OAAOhD,GAAK,WAAY,YAAYA,EAAI,YAAY,OAC7CA,EAAI,UACL,MACJiD,KACD,OAAOD,GAAS,cAAe,WAAWA,EAAQ,aAAa,WAChEJ,GAAS,IAAI,cAAc,KAC3BC,KACA;AAEJ,SAAO;AAAA,IACH,QAAAn+B;AAAA,IACA,QAAQ,OAAOo+B,CAAM;AAAA,IACrB,MAAAC;AAAA,IACA,WAAWE,KAAa;AAAA,IACxB,YAAYC,GAAgBN,GAAS,IAAI,aAAa,CAAC;AAAA,IACvD,MAAApN;AAAA,EAAA;AAER;AASO,SAAS0N,GAAgB7jC,GAAsD;AAClF,MAAI,CAACA,EAAO;AACZ,QAAMgZ,IAAUhZ,EAAM,KAAA;AACtB,MAAI,QAAQ,KAAKgZ,CAAO,EAAG,QAAO,OAAOA,CAAO;AAChD,QAAM8qB,IAAO,KAAK,MAAM9qB,CAAO;AAC/B,MAAI,QAAO,MAAM8qB,CAAI;AACrB,WAAO,KAAK,IAAI,GAAG,KAAK,OAAOA,IAAO,KAAK,IAAA,KAAS,GAAI,CAAC;AAC7D;ACzGA,SAASC,GAASC,GAAiBC,GAAcC,GAA2C;AACxF,QAAMvJ,IAAM,IAAI,IAAIsJ,GAAMD,EAAQ,SAAS,GAAG,IAAIA,IAAU,GAAGA,CAAO,GAAG;AACzE,MAAIE;AACA,eAAW,CAACvgC,GAAK3D,CAAK,KAAK,OAAO,QAAQkkC,CAAM;AAC5C,MAA2BlkC,KAAU,QACjC26B,EAAI,aAAa,IAAIh3B,GAAK,OAAO3D,CAAK,CAAC;AAInD,SAAO26B,EAAI,SAAA;AACf;AAEA,SAASwJ,GAAWhO,GAAiC;AACjD,SAAO,OAAO,WAAa,OAAeA,aAAgB;AAC9D;AAEA,eAAeiO,GAAWC,GAAoBb,GAAkD;AAC5F,MAAIrN,IAAgB;AACpB,MAAI;AACA,IAAAA,IAAO,MAAMkO,EAAS,MAAA,EAAQ,KAAA;AAAA,EAClC,QAAQ;AACJ,QAAI;AACA,MAAAlO,IAAO,MAAMkO,EAAS,KAAA;AAAA,IAC1B,QAAQ;AACJ,MAAAlO,IAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO,IAAIgN;AAAA,IACPG,GAAce,EAAS,QAAQlO,GAAMkO,EAAS,SAASb,CAAa;AAAA,EAAA;AAE5E;AASO,SAASc,GAAgBC,GAAoC;AAChE,QAAMC,IAAUD,EAAO,WAAW,WAAW,MAAM,KAAK,UAAU;AAElE,WAASE,IAAsC;AAC3C,UAAMp1B,IAAQk1B,EAAO,WAAA;AACrB,WAAOl1B,IAAQ,EAAE,eAAe,UAAUA,CAAK,GAAA,IAAO,CAAA;AAAA,EAC1D;AAEA,iBAAeq1B,EACXT,GACA75B,GACAw5B,GACiB;AACjB,UAAM,EAAE,MAAAzN,GAAM,QAAA+N,GAAQ,SAAAX,GAAS,GAAG1a,MAASze,GACrCu6B,IAASR,GAAWhO,CAAI,GAExByO,IAAuC;AAAA,MACzC,GAAID,IAAS,CAAA,IAAK,EAAE,gBAAgB,mBAAA;AAAA,MACpC,GAAIf,IAAY,EAAE,gBAAgBA,EAAA,IAAc,CAAA;AAAA,MAChD,GAAGW,EAAO;AAAA,MACV,GAAGE,EAAA;AAAA,MACH,GAAIlB;AAAA,IAAA,GAGFH,IAAoB;AAAA,MACtB,GAAGva;AAAA,MACH,SAAS+b;AAAA,MACT,aAAaL,EAAO,kBAAkB,YAAY1b,EAAK;AAAA,MACvD,MAC0BsN,KAAS,OACzB,SACAwO,IACGxO,IACD,KAAK,UAAUA,CAAI;AAAA,IAAA;AAGnC,WAAOqO,EAAQT,GAASQ,EAAO,SAASN,GAAMC,CAAM,GAAGd,CAAI;AAAA,EAC/D;AAEA,iBAAeyB,EAAWZ,GAAc75B,IAA0B,IAAgB;AAC9E,UAAMw5B,IAAYW,EAAO,YAAYA,EAAO,UAAA,IAAcxB,GAAA;AAC1D,QAAIsB,IAAW,MAAMK,EAAWT,GAAM75B,GAASw5B,CAAS;AAExD,QAAIS,EAAS,WAAW;AACpB,UAAIE,EAAO;AACP,YAAI;AACA,gBAAMA,EAAO,QAAA,GACbF,IAAW,MAAMK,EAAWT,GAAM75B,GAASw5B,CAAS;AAAA,QACxD,QAAQ;AACJ,sBAAMW,EAAO,iBAAiBF,CAAQ,GAChC,MAAMD,GAAWC,GAAUT,CAAS;AAAA,QAC9C;AAAA;AAEA,cAAMW,EAAO,iBAAiBF,CAAQ;AAI9C,QAAI,CAACA,EAAS;AACV,YAAM,MAAMD,GAAWC,GAAUT,CAAS;AAG9C,WAAIS,EAAS,WAAW,MACpB,UAGgBA,EAAS,QAAQ,IAAI,cAAc,KAAK,IAC5C,SAAS,kBAAkB,IAC/B,MAAMA,EAAS,KAAA,IAEnB,MAAMA,EAAS,KAAA;AAAA,EAC3B;AAEA,iBAAeS,EACXb,GACAc,GACAC,IAAmC,QACzB;AACV,WAAOH,EAAWZ,GAAM,EAAE,QAAAe,GAAQ,MAAMD,GAAU;AAAA,EACtD;AAEA,SAAO;AAAA,IACH,SAAAF;AAAA,IACA,KAAK,CAAIZ,GAAc75B,MACnBy6B,EAAWZ,GAAM,EAAE,GAAG75B,GAAS,QAAQ,OAAO;AAAA,IAClD,MAAM,CAAI65B,GAAc75B,MACpBy6B,EAAWZ,GAAM,EAAE,GAAG75B,GAAS,QAAQ,QAAQ;AAAA,IACnD,KAAK,CAAI65B,GAAc75B,MACnBy6B,EAAWZ,GAAM,EAAE,GAAG75B,GAAS,QAAQ,OAAO;AAAA,IAClD,OAAO,CAAI65B,GAAc75B,MACrBy6B,EAAWZ,GAAM,EAAE,GAAG75B,GAAS,QAAQ,SAAS;AAAA,IACpD,QAAQ,CAAI65B,GAAc75B,MACtBy6B,EAAWZ,GAAM,EAAE,GAAG75B,GAAS,QAAQ,UAAU;AAAA,IACrD,QAAA06B;AAAA,EAAA;AAER;AC5HO,SAASG,GACZC,GACA5S,GACA6S,GACgB;AAChB,QAAM9yB,IAAS6yB,EAAO,UAAU5S,CAAG;AACnC,MAAIjgB,EAAO;AACP,WAAOA,EAAO;AAOlB,MAHI,OAAO,UAAY,QAClB,QAAQ,KAAK,aAAa,iBAAiB,QAAQ,KAAK,aAAa,SAE/D;AACP,UAAM+yB,IAAS/yB,EAAO,MAAM,OACvB,IAAI,CAACrF,MAAM,OAAOA,EAAE,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAKA,EAAE,OAAO,EAAE,EAC9D,KAAK;AAAA,CAAI;AACd,UAAM,IAAI;AAAA,MACN,qCAAqCm4B,CAAO;AAAA,EAAMC,CAAM;AAAA;AAAA,eAAoB,KAAK,UAAU9S,GAAK,MAAM,CAAC,CAAC;AAAA,IAAA;AAAA,EAEhH;AACA,QAAM,IAAI,MAAM,kCAAkC6S,CAAO,IAAI;AACjE;ACDA,SAASE,GAAe/S,GAAsB;AAC1C,MAAI,CAACA,EAAK,QAAO;AACjB,MAAI;AACA,WAAO,KAAK,MAAMA,CAAG;AAAA,EACzB,QAAQ;AACJ,WAAOA;AAAA,EACX;AACJ;AAWO,SAASgT,GAAgCl7B,GAAgD;AAC5F,QAAM;AAAA,IACF,KAAAuwB;AAAA,IACA,MAAAxE;AAAA,IACA,QAAA6O,IAAS;AAAA,IACT,SAAAzB,IAAU,CAAA;AAAA,IACV,UAAAgC;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC,IAAS,KAAK;AAAA,IACd,WAAA/B;AAAA,EAAA,IACAx5B;AAEJ,SAAO,IAAI,QAAW,CAACs4B,GAASG,MAAW;AACvC,QAAI6C,GAAQ,SAAS;AACjB,MAAA7C,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAChD;AAAA,IACJ;AAEA,UAAM+C,IAAM,IAAI,eAAA;AAChB,IAAAA,EAAI,KAAKZ,GAAQrK,CAAG,GACpBiL,EAAI,kBAAkBJ;AAEtB,UAAMn2B,IAAQk2B,IAAA,GACR/B,IAAgBI,IAAYA,EAAA,IAAcb,GAAA,GAC1C6B,IAAuC,EAAE,GAAGrB,EAAA;AAClD,IAAIl0B,KAAS,EAAE,mBAAmBu1B,OAC9BA,EAAa,gBAAgB,UAAUv1B,CAAK,KAE5Cm0B,KAAiB,EAAE,kBAAkBoB,OACrCA,EAAa,cAAc,IAAIpB;AAEnC,eAAW,CAAC7/B,GAAK3D,CAAK,KAAK,OAAO,QAAQ4kC,CAAY;AAClD,MAAAgB,EAAI,iBAAiBjiC,GAAK3D,CAAK;AAGnC,IAAIylC,MACAG,EAAI,OAAO,aAAa,CAAC9/B,MAAU;AAC/B,MAAA2/B,EAAW;AAAA,QACP,QAAQ3/B,EAAM;AAAA,QACd,OAAOA,EAAM;AAAA,QACb,UAAUA,EAAM,mBAAmBA,EAAM,SAASA,EAAM,QAAQ;AAAA,QAChE,kBAAkBA,EAAM;AAAA,MAAA,CAC3B;AAAA,IACL;AAGJ,aAAS+/B,IAAoB;AACzB,MAAAD,EAAI,MAAA;AAAA,IACR;AACA,IAAAF,GAAQ,iBAAiB,SAASG,CAAW,GAE7CD,EAAI,SAAS,MAAM;AACf,MAAAF,GAAQ,oBAAoB,SAASG,CAAW;AAChD,YAAMC,IAAYF,EAAI,UAAU,OAAOA,EAAI,SAAS,KAC9CG,IAAcH,EAAI,kBAAkB,cAAc,KAAK;AAE7D,UAAI,CAACE,GAAW;AACZ,cAAME,IAAYX,GAAeO,EAAI,YAAY;AACjD,QAAA/C;AAAA,UACI,IAAIM;AAAA,YACAG;AAAA,cACIsC,EAAI;AAAA,cACJI;AAAA,cACA,EAAE,KAAK,CAACjhC,MAAS6gC,EAAI,kBAAkB7gC,CAAI,EAAA;AAAA,cAC3Cy+B;AAAA,YAAA;AAAA,UACJ;AAAA,QACJ;AAEJ;AAAA,MACJ;AAEA,UAAIoC,EAAI,WAAW,OAAO,CAACA,EAAI,cAAc;AACzC,QAAAlD,EAAQ,MAAc;AACtB;AAAA,MACJ;AAEA,UAAIqD,EAAY,SAAS,kBAAkB;AACvC,YAAI;AACA,UAAArD,EAAQiD,EAAOC,EAAI,YAAY,CAAM;AAAA,QACzC,SAASK,GAAK;AACV,UAAApD,EAAOoD,CAAG;AAAA,QACd;AAAA;AAEA,QAAAvD,EAAQkD,EAAI,YAA4B;AAAA,IAEhD,GAEAA,EAAI,UAAU,MAAM;AAChB,MAAAF,GAAQ,oBAAoB,SAASG,CAAW,GAChDhD;AAAA,QACI,IAAIM,GAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,WAAWK,KAAiB;AAAA,QAAA,CAC/B;AAAA,MAAA;AAAA,IAET,GAEAoC,EAAI,UAAU,MAAM;AAChB,MAAAF,GAAQ,oBAAoB,SAASG,CAAW,GAChDhD,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IACpD,GAEA+C,EAAI,KAAKzP,CAAI;AAAA,EACjB,CAAC;AACL;ACvIA,SAASwL,GAAKc,GAAYiD,GAAqC;AAC3D,SAAO,IAAI,QAAc,CAAChD,GAASG,MAAW;AAC1C,QAAI6C,GAAQ,SAAS;AACjB,MAAA7C,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAChD;AAAA,IACJ;AACA,UAAM3hB,IAAQ,WAAWwhB,GAASD,CAAE;AACpC,IAAAiD,GAAQ;AAAA,MACJ;AAAA,MACA,MAAM;AACF,qBAAaxkB,CAAK,GAClB2hB,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,MACpD;AAAA,MACA,EAAE,MAAM,GAAA;AAAA,IAAK;AAAA,EAErB,CAAC;AACL;AAUA,eAAsBqD,GAASC,GAA2B/7B,IAAwB,IAAgB;AAC9F,QAAM;AAAA,IACF,SAAAg8B,IAAU;AAAA,IACV,cAAAC,IAAe;AAAA,IACf,UAAAC,IAAW;AAAA,IACX,mBAAAC,IAAoB;AAAA,IACpB,aAAAC,IAAc,MAAM;AAAA,IACpB,SAAA53B;AAAA,IACA,QAAA82B;AAAA,EAAA,IACAt7B;AAEJ,MAAIq8B,IAAU,GACVC;AAEJ,SAAOD,IAAUL,KAAS;AACtB,QAAIV,GAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACnE,QAAI;AACA,aAAO,MAAMS,EAAA;AAAA,IACjB,SAAS78B,GAAO;AAGZ,UAFAo9B,IAAYp9B,GACZm9B,KAAW,GACPA,KAAWL,KAAW,CAACI,EAAYl9B,GAAOm9B,CAAO;AACjD,cAAMn9B;AAEV,YAAMq9B,IACFJ,KACA,OAAQj9B,GAAoC,cAAe,WACpDA,EAAiC,aAAa,MAC/C,MACJwtB,IAEI,KAAK,IADX6P,MAAe,OACAA,IACAN,IAAe,MAAMI,IAAU,IADnBH,CAAQ;AAEvC,MAAA13B,IAAU,EAAE,SAAA63B,GAAS,OAAA3P,GAAO,OAAAxtB,EAAA,CAAO,GACnC,MAAMq4B,GAAK7K,GAAO4O,CAAM;AAAA,IAC5B;AAAA,EACJ;AAEA,QAAMgB;AACV;ACtFO,SAASE,KAAiC;AAC7C,SAAI,OAAO,SAAW,OAAe,gBAAgB,SAC1C,OAAO,WAAA,IAEX,uCAAuC,QAAQ,SAAS,CAACptB,MAAM;AAClE,UAAMqtB,IAAI,KAAK,OAAA,IAAW;AAE1B,YADcrtB,MAAM,MAAM,KAAK,MAAMqtB,CAAC,IAAK,KAAK,MAAMA,CAAC,IAAI,IAAO,GACrD,SAAS,EAAE;AAAA,EAC5B,CAAC;AACL;ACYO,SAASC,GACZX,GACA/7B,GACgB;AAChB,QAAM,EAAE,UAAA28B,GAAU,UAAAj/B,IAAW,IAAO,UAAAk/B,GAAU,SAAA1gB,MAAYlc,GACpD,CAACwV,GAAMqnB,CAAO,IAAIxmC,EAAmB,IAAI,GACzC,CAAC6I,GAAO49B,CAAQ,IAAIzmC,EAAkB,IAAI,GAC1C,CAAC+G,GAASuM,CAAU,IAAItT,EAAkB,CAACqH,CAAQ,GACnDq/B,IAAUr+B,EAAgBhB,CAAQ,GAClCs/B,IAAWt+B,EAAgB,EAAK,GAChCoY,IAAQpY,EAA6C,IAAI;AAE/D,iBAAeu+B,IAAsB;AACjC,QAAI,EAAAF,EAAQ,WAAWC,EAAS,UAChC;AAAA,MAAAA,EAAS,UAAU;AACnB,UAAI;AACA,cAAMrmC,IAAO,MAAMolC,EAAA;AACnB,YAAIgB,EAAQ,QAAS;AACrB,QAAAF,EAAQlmC,CAAI,GACZmmC,EAAS,IAAI,GACTF,IAAWjmC,CAAI,MAAGomC,EAAQ,UAAU;AAAA,MAC5C,SAASlB,GAAK;AACV,QAAKkB,EAAQ,YACTD,EAASjB,CAAG,GACZ3f,IAAU2f,CAAG;AAAA,MAErB,UAAA;AACI,QAAAmB,EAAS,UAAU,IACnBrzB,EAAW,EAAK,GACXozB,EAAQ,YACTjmB,EAAM,UAAU,WAAWmmB,GAAMN,CAAQ;AAAA,MAEjD;AAAA;AAAA,EACJ;AAEA,SAAAjjC,EAAU,MAAM;AAEZ,QADAqjC,EAAQ,UAAUr/B,GACdA,GAAU;AACV,MAAIoZ,EAAM,WAAS,aAAaA,EAAM,OAAO;AAC7C;AAAA,IACJ;AACA,WAAAnN,EAAW,EAAI,GACVszB,EAAA,GACE,MAAM;AACT,MAAAF,EAAQ,UAAU,IACdjmB,EAAM,WAAS,aAAaA,EAAM,OAAO;AAAA,IACjD;AAAA,EAEJ,GAAG,CAAC6lB,GAAUj/B,CAAQ,CAAC,GAEhB;AAAA,IACH,MAAA8X;AAAA,IACA,OAAAtW;AAAA,IACA,SAAA9B;AAAA,IACA,MAAM,MAAM;AACR,MAAA2/B,EAAQ,UAAU,IACdjmB,EAAM,WAAS,aAAaA,EAAM,OAAO;AAAA,IACjD;AAAA,IACA,OAAO,MAAM;AACT,MAAKimB,EAAQ,YACbA,EAAQ,UAAU,IACbE,EAAA;AAAA,IACT;AAAA,EAAA;AAER;ACzDO,SAASC,GAAuBl9B,IAAyC,IAAI;AAChF,QAAMrF,IAAOqF,EAAQ,QAAQ,gBACvBm9B,IAAcn9B,EAAQ,YAAY,YAAY,MAAM,iBAAiB,MAAM;AAEjF,SAAOo9B,GAAA;AAAA,IACHC;AAAA,MACI,CAACtU,OAAS;AAAA,QACN,MAAM/oB,EAAQ,eAAe;AAAA,QAC7B,OAAOA,EAAQ,gBAAgB;AAAA,QAC/B,iBAAiB,CAAC,CAACA,EAAQ;AAAA,QAC3B,YAAY,CAAC,EAAE,MAAAs9B,GAAM,OAAAr4B,QAAY8jB,EAAI,EAAE,MAAAuU,GAAM,OAAAr4B,GAAO,iBAAiB,IAAM;AAAA,QAC3E,SAAS,CAACq4B,MAASvU,EAAI,EAAE,MAAAuU,GAAM;AAAA,QAC/B,UAAU,CAACr4B,MAAU8jB,EAAI,EAAE,OAAA9jB,GAAO,iBAAiB,CAAC,CAACA,GAAO;AAAA,QAC5D,QAAQ,MAAM8jB,EAAI,EAAE,MAAM,MAAM,OAAO,MAAM,iBAAiB,GAAA,CAAO;AAAA,MAAA;AAAA,MAEzE;AAAA,QACI,MAAApuB;AAAA,QACA,SAAS4iC,GAAkBJ,CAAW;AAAA,QACtC,YAAY,CAAC1yB,OAAW,EAAE,MAAMA,EAAM,MAAM,OAAOA,EAAM;QACzD,oBAAoB,MAAM,CAACA,MAAU;AACjC,UAAIA,MAAOA,EAAM,kBAAkB,CAAC,CAACA,EAAM;AAAA,QAC/C;AAAA,MAAA;AAAA,IACJ;AAAA,EACJ;AAER;ACjCO,SAAS+yB,GAAU,EAAE,iBAAAC,GAAiB,UAAA3lC,GAAU,UAAA6N,KAA4B;AAC/E,SAAO,gBAAA9O,EAAAmC,GAAA,EAAG,UAAAykC,IAAkB3lC,IAAW6N,GAAS;AACpD;ACpBA,SAAS+3B,GAAgB5jB,GAAuB;AAC5C,QAAMjO,IAASiO,EAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,GACnD6jB,IAAU9xB,EAAO,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,IAAKA,EAAO,SAAS,CAAE;AACjF,SAAI,OAAO,OAAS,MACT,KAAKA,IAAS8xB,CAAO,IAEzB,OAAO,KAAK9xB,IAAS8xB,GAAS,QAAQ,EAAE,SAAS,QAAQ;AACpE;AASO,SAASC,GAAU34B,GAA2B;AACjD,QAAMrK,IAAQqK,EAAM,MAAM,GAAG;AAC7B,MAAIrK,EAAM,WAAW,EAAG,OAAM,IAAI,MAAM,2CAA2C;AACnF,QAAM,CAACijC,GAAWC,GAAYC,CAAS,IAAInjC;AAC3C,MAAI;AACA,WAAO;AAAA,MACH,QAAQ,KAAK,MAAM8iC,GAAgBG,CAAS,CAAC;AAAA,MAC7C,SAAS,KAAK,MAAMH,GAAgBI,CAAU,CAAC;AAAA,MAC/C,WAAAC;AAAA,IAAA;AAAA,EAER,QAAQ;AACJ,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AACJ;AAQO,SAASC,GAAa/4B,GAAeg5B,IAAgB,GAAY;AACpE,MAAI;AACA,UAAM,EAAE,SAAAC,EAAA,IAAYN,GAAU34B,CAAK;AACnC,QAAI,OAAOi5B,EAAQ,OAAQ,SAAU,QAAO;AAC5C,UAAMC,IAAa,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAI;AAC/C,WAAOD,EAAQ,OAAOC,IAAaF;AAAA,EACvC,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AC3BO,SAASG,GACZrC,GACA/7B,IAAgC,IACN;AAC1B,QAAM,EAAE,SAAAg8B,IAAU,GAAG,cAAAC,IAAe,KAAK,sBAAAoC,IAAuB,OAASr+B;AAEzE,iBAAes+B,EAAKjC,IAAU,GAA4B;AACtD,QAAI;AACA,aAAO,MAAMN,EAAA;AAAA,IACjB,SAAS78B,GAAO;AACZ,UAAIm9B,KAAWL;AACX,cAAIqC,KAAwB,OAAO,SAAW,OAC1C,OAAO,SAAS,OAAA,GAEdn/B;AAEV,mBAAM,IAAI,QAAQ,CAACo5B,MAAY,WAAWA,GAAS2D,IAAe,MAAMI,IAAU,EAAE,CAAC,GAC9EiC,EAAKjC,IAAU,CAAC;AAAA,IAC3B;AAAA,EACJ;AAEA,SAAOpgB,GAAKqiB,CAAI;AACpB;ACnCO,SAASC,GAAmBC,GAAmD;AAClF,MAAIllC,IAAgC;AAEpC,SAAO,MACCA,MACJA,KAAW,YAAY;AACnB,QAAI;AACA,YAAMklC,EAAA;AAAA,IACV,UAAA;AACI,MAAAllC,IAAU;AAAA,IACd;AAAA,EACJ,GAAA,GACOA;AAEf;ACoCA,SAASmlC,GAAmBjpB,GAAyD;AACjF,QAAMkpB,IAAKlpB,KAAQ,CAAA;AACnB,SAAO,EAAE,OAAOkpB,EAAE,cAAc,cAAcA,EAAE,cAAA;AACpD;AAsBO,SAASC,GACZ3+B,GACgC;AAChC,QAAM;AAAA,IACF,SAAA45B;AAAA,IACA,WAAAgF,IAAY;AAAA,IACZ,aAAAC,IAAc;AAAA,IACd,QAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,SAAA9J,IAAU;AAAA,IACV,iBAAAmG,IAAkB;AAAA,IAClB,SAAAhB;AAAA,IACA,aAAA4E,IAAcP;AAAA,IACd,WAAAQ;AAAA,IACA,aAAAC,IAAc,CAACC,MAAQA,IAAK,EAAE,eAAeA,MAAO;AAAA,EAAA,IACpDn/B,GAEEo/B,IAAelC,GAAuB,EAAE,MAAM6B,GAAW,SAAA9J,GAAS,GAClEoK,IAAa,GAAGN,CAAS;AAE/B,WAAS5B,IAA8B;AACnC,WAAI,OAAO,SAAW,MAAoB,OACnClI,MAAY,YAAY,OAAO,iBAAiB,OAAO;AAAA,EAClE;AACA,WAASqK,IAAkC;AACvC,WAAOnC,EAAA,GAAe,QAAQkC,CAAU,KAAK;AAAA,EACjD;AACA,WAASE,EAAkBt6B,GAA4B;AACnD,UAAMu6B,IAAIrC,EAAA;AACV,IAAKqC,MACDv6B,IAAOu6B,EAAE,QAAQH,GAAYp6B,CAAK,IACjCu6B,EAAE,WAAWH,CAAU;AAAA,EAChC;AAEA,QAAM50B,IAAQ,MAAwB20B,EAAa,SAAA,GAC7CjE,IAAW,MAAqB1wB,EAAA,EAAQ,OAGxCg1B,IAAUvF,GAAgB,EAAE,SAAAN,GAAS,iBAAAwB,GAAiB,SAAAhB,GAAS;AAErE,iBAAesF,IAAmC;AAC9C,QAAI,CAACZ,EAAQ,QAAOr0B,EAAA,EAAQ;AAC5B,UAAMxF,IAAQk2B,EAAA,GACRmC,IAAO,MAAMpD,GAAgB;AAAA,MAC/B,SAAAN;AAAA,MACA,iBAAAwB;AAAA,MACA,SAAAhB;AAAA,MACA,UAAU,MAAMn1B;AAAA,IAAA,CACnB,EAAE,IAAW65B,CAAM;AACpB,WAAAr0B,EAAA,EAAQ,QAAQ6yB,CAAI,GACbA;AAAA,EACX;AAEA,iBAAeqC,EAAMC,GAAkD;AACnE,UAAMpqB,IAAO,MAAMiqB,EAAQ,KAAcb,GAAW,EAAE,MAAMgB,GAAa,GACnE,EAAE,OAAA36B,GAAO,cAAA46B,MAAiBb,EAAYxpB,CAAI;AAChD,IAAA/K,EAAA,EAAQ,SAASxF,CAAK,GACtBs6B,EAAkBM,KAAgB,IAAI;AACtC,UAAMC,IAAWb,IAAYzpB,CAAI;AACjC,WAAIsqB,KAAY,QACZr1B,EAAA,EAAQ,QAAQq1B,CAAQ,GACjBA,KAEJJ,EAAA;AAAA,EACX;AAEA,WAASK,IAAe;AACpB,IAAAt1B,EAAA,EAAQ,OAAA,GACR80B,EAAkB,IAAI;AAAA,EAC1B;AAEA,QAAMf,IAAUD,GAAmB,YAAY;AAC3C,UAAM/oB,IAAO,MAAMiqB,EAAQ,KAAcZ,GAAa;AAAA,MAClD,MAAMK,EAAYI,EAAA,CAAkB;AAAA,IAAA,CACvC,GACK,EAAE,OAAAr6B,GAAO,cAAA46B,MAAiBb,EAAYxpB,CAAI;AAChD,IAAA/K,EAAA,EAAQ,SAASxF,CAAK,GAClB46B,OAAgCA,CAAY;AAAA,EACpD,CAAC,GAEKr2B,IAAM0wB,GAAgB;AAAA,IACxB,SAAAN;AAAA,IACA,iBAAAwB;AAAA,IACA,SAAAhB;AAAA,IACA,UAAAe;AAAA,IACA,SAAAqD;AAAA,IACA,gBAAgB,MAAMuB,EAAA;AAAA,EAAO,CAChC;AAED,SAAO,EAAE,cAAAX,GAAc,KAAA51B,GAAK,OAAAm2B,GAAO,QAAAI,GAAQ,SAAAvB,GAAS,UAAArD,EAAA;AACxD;AC7KA,MAAM6E,KAAuBh3B,GAAoC,IAAI;AAmB9D,SAASi3B,GAAsB,EAAE,SAAAC,GAAS,UAAApoC,KAAwC;AACrF,2BACKkoC,GAAqB,UAArB,EAA8B,OAAOE,GAAU,UAAApoC,GAAS;AAEjE;AAUO,SAASqoC,KAAyC;AACrD,SAAOp2B,GAAWi2B,EAAoB;AAC1C;AC1BA,SAAS5gC,GAAU6I,GAAwC;AACvD,SAAO,OAAOA,KAAW,YAAY,EAAE,KAAKA,MAAWA;AAC3D;AAWO,SAASm4B,GAAOtG,GAAiC;AACpD,QAAMoG,IAAUC,GAAA,GACVE,IAAY,KAAK,UAAUvG,CAAM,GAEjC,CAACrvB,GAAOgB,CAAQ,IAAIpV;AAAA,IAAuB,MAC7C6pC,IAAU,EAAE,SAAS,IAAO,WAAW,GAAA,IAAS,EAAE,SAAS,IAAM,WAAW,GAAA;AAAA,EAAM;AAGtF,SAAAxmC,EAAU,MAAM;AACZ,QAAI,CAACwmC,GAAS;AACV,MAAAz0B,EAAS,EAAE,SAAS,IAAM,WAAW,IAAO;AAC5C;AAAA,IACJ;AAEA,QAAI60B,IAAY;AAChB,WAAA70B,EAAS,CAAC1I,OAAU,EAAE,GAAGA,GAAM,WAAW,KAAO,GAEjD,QAAQ,QAAQm9B,EAAQ,IAAIpG,CAAM,CAAC,EAC9B,KAAK,CAAC5R,MAAQ;AACX,UAAIoY,EAAW;AACf,YAAMr4B,IAAS7I,GAAU8oB,CAAG;AAC5B,MAAAzc,EAAS,EAAE,SAASxD,EAAO,KAAK,WAAW,IAAO,QAAQA,EAAO,QAAQ;AAAA,IAC7E,CAAC,EACA,MAAM,CAAC/I,MAAmB;AACvB,MAAIohC,KACJ70B,EAAS;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQvM,aAAiB,QAAQA,EAAM,UAAU;AAAA,MAAA,CACpD;AAAA,IACL,CAAC,GAEE,MAAM;AACT,MAAAohC,IAAY;AAAA,IAChB;AAAA,EAGJ,GAAG,CAACJ,GAASG,CAAS,CAAC,GAEhB51B;AACX;AC3CO,SAAS81B,GAAI,EAAE,QAAAxkC,GAAQ,UAAAykC,GAAU,QAAA1G,GAAQ,UAAAhiC,GAAU,UAAA6N,KAAsB;AAC5E,QAAM,EAAE,SAAA86B,GAAS,WAAAC,MAAcN,GAAO,EAAE,QAAArkC,GAAQ,UAAAykC,GAAU,QAAA1G,GAAQ;AAClE,SAAI4G,IAAkB,gBAAA7pC,EAAAmC,GAAA,EAAG,UAAA2M,KAAY,MAAK,IACnC,gBAAA9O,EAAAmC,GAAA,EAAG,UAAAynC,IAAU3oC,IAAY6N,KAAY,MAAM;AACtD;AChBA,SAASg7B,GAAmBxG,GAA8C;AACtE,QAAMpR,IAAM,IAAI,IAAYoR,EAAO,eAAe,CAAA,CAAE,GAC9CyG,IAAQzG,EAAO,OAAQ,MAAM,QAAQA,EAAO,IAAI,IAAIA,EAAO,OAAO,CAACA,EAAO,IAAI,IAAK,CAAA;AACzF,aAAW3+B,KAAQolC;AACf,eAAWC,KAAQ1G,EAAO,QAAQ3+B,CAAI,KAAK,CAAA;AACvC,MAAAutB,EAAI,IAAI8X,CAAI;AAGpB,SAAO9X;AACX;AAwBO,SAAS+X,GAAwB3G,GAAgD;AACpF,QAAM4G,IAAUJ,GAAmBxG,CAAM;AAEzC,SAAO;AAAA,IACH,IAAI,EAAE,QAAAp+B,GAAQ,UAAAykC,KAAkC;AAO5C,aALIO,EAAQ,IAAI,GAAG,KACdP,MAAa,WACTO,EAAQ,IAAI,GAAGP,CAAQ,IAAI,KAAKO,EAAQ,IAAI,GAAGP,CAAQ,IAAIzkC,CAAM,EAAE,MACvEykC,MAAa,UAAaO,EAAQ,IAAIhlC,CAAM,IAEhC,EAAE,KAAK,GAAA,IAAS,EAAE,KAAK,IAAO,QAAQ,qBAAA;AAAA,IAC3D;AAAA,EAAA;AAER;ACnDA,SAASilC,GAAiBprC,GAA0B;AAChD,SAAI,MAAM,QAAQA,CAAK,IACZA,EAAM,OAAO,CAACoB,MAAyB,OAAOA,KAAS,QAAQ,IAEtE,OAAOpB,KAAU,WAEVA,EAAM,MAAM,KAAK,EAAE,OAAO,OAAO,IAErC,CAAA;AACX;AAcO,SAASqrC,GACZh8B,GACAjF,GACQ;AACR,MAAI;AACA,UAAM,EAAE,SAAAk+B,EAAA,IAAYN,GAAU34B,CAAK,GAC7Bi8B,IAAQlhC,GAAS,SAAS,eAC1BmhC,IAAUH,GAAiB9C,EAAQgD,CAAK,CAAC;AAC/C,QAAIC,EAAQ,SAAS,EAAG,QAAOA;AAE/B,QAAInhC,GAAS,UAAU,QAAW;AAC9B,YAAMohC,IAASJ,GAAiB9C,EAAQ,MAAS;AACjD,aAAIkD,EAAO,SAAS,IAAUA,IACvBJ,GAAiB9C,EAAQ,KAAQ;AAAA,IAC5C;AACA,WAAOiD;AAAA,EACX,QAAQ;AACJ,WAAO,CAAA;AAAA,EACX;AACJ;ACcO,SAASE,GAAa;AAAA,EACzB,WAAWC;AAAA,EACX,WAAA1V;AAAA,EACA,SAAA1P;AAAA,EACA,QAAA1H;AAAA,EACA,OAAA+sB;AAAA,EACA,MAAApyB;AAAA,EACA,OAAAvT;AAAA,EACA,MAAAZ;AAAA,EACA,eAAAwmC;AAAA,EACA,OAAAnoC;AAAA,EACA,WAAAtD;AAAA,EACA,OAAAyE;AACJ,GAAsB;AAClB,SACI,gBAAA3D,EAAC,OAAA,EAAI,WAAAd,GAAsB,OAAAyE,GACtB,UAAA8mC,EAAU;AAAA,IACP,WAAW,CAACrH,MAAsC;AAC9C,UAAI,CAACA,EAAS,YAAY;AACtB,QAAA/d,IAAU;AAAA,UACN,UAAU;AAAA,UACV,SAAS;AAAA,UACT,KAAK+d;AAAA,QAAA,CACR;AACD;AAAA,MACJ;AACA,aAAOrO,EAAU;AAAA,QACb,SAASqO,EAAS;AAAA,QAClB,UAAU;AAAA,QACV,KAAKA;AAAA,MAAA,CACR;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACX,MAAA/d,IAAU;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAAA,IACA,QAAA1H;AAAA,IACA,OAAA+sB;AAAA,IACA,MAAApyB;AAAA,IACA,OAAAvT;AAAA,IACA,MAAAZ;AAAA,IACA,WAAW,CAACwmC;AAAA,IACZ,OAAAnoC;AAAA,EAAA,CACH,GACL;AAER;AC9DO,SAASooC,GACZzhC,GACyB;AACzB,QAAM,EAAE,UAAA0hC,GAAU,WAAA9V,GAAW,SAAA1P,EAAA,IAAYlc,GACnC,CAACwV,GAAMqnB,CAAO,IAAIxmC,EAAmB,IAAI,GACzC,CAAC6I,GAAO49B,CAAQ,IAAIzmC,EAAkB,IAAI,GAC1C,CAAC4E,GAAQ0mC,CAAS,IAAItrC,EAA0C,SAAS,GACzEurC,IAASljC,EAAgB,EAAK;AAEpC,SAAAhF,EAAU,MAAM;AACZ,QAAIkoC,EAAO,QAAS;AACpB,IAAAA,EAAO,UAAU;AACjB,QAAItB,IAAY;AAChB,WAAAoB,EAAA,EACK,KAAK,CAACz5B,MAAW;AACd,UAAI,CAAAq4B;AACJ,eAAAzD,EAAQ50B,CAAM,GACd05B,EAAU,SAAS,GACZ/V,IAAY3jB,CAAM;AAAA,IAC7B,CAAC,EACA,MAAM,CAAC4zB,MAAQ;AACZ,MAAIyE,MACJxD,EAASjB,CAAG,GACZ8F,EAAU,OAAO,GACjBzlB,IAAU2f,CAAG;AAAA,IACjB,CAAC,GACE,MAAM;AACT,MAAAyE,IAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAACoB,GAAU9V,GAAW1P,CAAO,CAAC,GAE1B,EAAE,SAASjhB,MAAW,WAAW,MAAAua,GAAM,OAAAtW,GAAO,QAAAjE,EAAA;AACzD;AChFO,MAAM4mC,KAAa;AAAA,EACtB,OAAO,KAAK;AAAA,EACZ,SAAS,MAAS;AAAA,EAClB,MAAM,OAAU;AAAA,EAChB,UAAU;AACd,GAGaC,KAAa;AAAA,EACtB,OAAO,MAAS;AAAA,EAChB,SAAS,OAAU;AAAA,EACnB,MAAM,OAAU;AACpB,GAGaC,KAAe;AAAA,EACxB,UAAU,IAAI;AAAA,EACd,MAAM,KAAK;AAAA,EACX,SAAS,KAAK;AAAA,EACd,MAAM,MAAS;AACnB;ACLO,SAASC,GAGdC,GAAa1X,GAAmB;AAC9B,QAAM2X,IAAS,EAAE,KAAK,CAACD,CAAK,EAAA;AAQ5B,aAAW,CAACtnC,GAAMgI,CAAK,KAAK,OAAO,QAAQ4nB,CAAO;AAI9C,IAAI,OAAO5nB,KAAU,aAChBu/B,EAAmCvnC,CAAc,IAAI,IAAIuxB,MACtD,CAAC+V,GAAO,GAAGt/B,EAAM,GAAGupB,CAAI,CAAC,IAE5BgW,EAAmCvnC,CAAc,IAAI,CAACsnC,GAAO,GAAGt/B,CAAK;AAI9E,SAAOu/B;AACX;ACvBO,SAASC,GAAc,EAAE,UAAArqC,GAAU,QAAAsqC,GAAQ,gBAAAC,KAAsC;AACpF,QAAM,CAACC,CAAc,IAAIjsC;AAAA,IACrB,MACI+rC,KACA,IAAIG,GAAY;AAAA,MACZ,gBAAgB;AAAA,QACZ,SAAS;AAAA,UACL,WAAWV,GAAW;AAAA,UACtB,QAAQC,GAAW;AAAA,UACnB,OAAO;AAAA,UACP,sBAAsB;AAAA,UACtB,GAAIO,GAAgB,WAAW,CAAA;AAAA,QAAC;AAAA,QAEpC,WAAW;AAAA,UACP,OAAO;AAAA,UACP,GAAIA,GAAgB,aAAa,CAAA;AAAA,QAAC;AAAA,MACtC;AAAA,IACJ,CACH;AAAA,EAAA;AAGT,SAAO,gBAAAxrC,EAAC2rC,IAAA,EAAoB,QAAQF,GAAiB,UAAAxqC,EAAA,CAAS;AAClE;ACqBO,SAAS2qC,GAA0B7sC,GAAwC;AAC9E,MAAI,OAAOA,KAAU,YAAYA,MAAU,KAAM,QAAO;AACxD,QAAM+nB,IAAI/nB;AACV,SAAO,MAAM,QAAQ+nB,EAAE,KAAK,KAAK,OAAOA,EAAE,SAAU,YAAY,OAAOA,EAAE,SAAU;AACvF;AAQO,SAAS+kB,GAA0B9sC,GAAwC;AAC9E,MAAI,OAAOA,KAAU,YAAYA,MAAU,KAAM,QAAO;AACxD,QAAM+nB,IAAI/nB;AACV,SAAO,MAAM,QAAQ+nB,EAAE,KAAK,KAAK,OAAOA,EAAE,YAAa,aAAa,iBAAiBA;AACzF;AAQO,SAASglB,GAAmBl2B,IAAW,IAAmB;AAC7D,SAAO,EAAE,OAAO,IAAI,OAAO,GAAG,MAAM,GAAG,MAAMA,GAAU,OAAO,EAAA;AAClE;ACfO,SAASm2B,GACZ5iC,GAC0B;AAC1B,QAAM;AAAA,IACF,UAAA6iC;AAAA,IACA,SAAAC;AAAA,IACA,aAAA7b,IAAc;AAAA,IACd,UAAAxa,IAAW;AAAA,IACX,WAAAs2B,IAAY;AAAA,IACZ,SAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,GAAGC;AAAA,EAAA,IACHljC,GAEE,CAACmjC,GAAYC,CAAa,IAAI/sC,EAAS4wB,CAAW,GAElDnnB,IAAQujC,GAA+B;AAAA,IACzC,GAAGH;AAAA,IACH,UAAU,CAAC,GAAGL,GAAU,EAAE,MAAMM,GAAY,UAAA12B,GAAU,WAAAs2B,GAAW,SAAAC,GAAS,WAAAC,GAAW;AAAA,IACrF,SAAS,MAAM;AACX,YAAMnJ,IAAuB,EAAE,MAAMqJ,GAAY,CAACJ,CAAS,GAAGt2B,EAAA;AAC9D,aAAIu2B,MACAlJ,EAAO,WAAWkJ,GAClBlJ,EAAO,YAAYmJ,IAEhBH,EAAQhJ,CAAM;AAAA,IACzB;AAAA,IACA,iBAAiBwJ;AAAA,EAAA,CACpB,GAEKv3B,IAAOjM,EAAM,MACbyjC,IAAYx3B,GAAM,SAAS,GAC3By3B,IAAUL,IAAaI,GACvBE,IAAUN,IAAa,GAEvBhc,IAAU3wB,EAAY,CAACG,MAAiBysC,EAAc,KAAK,IAAI,GAAGzsC,CAAI,CAAC,GAAG,CAAA,CAAE,GAC5EA,IAAOH,EAAY,MAAM4sC,EAAc,CAACM,MAAOA,IAAIH,IAAYG,IAAI,IAAIA,CAAE,GAAG,CAACH,CAAS,CAAC,GACvFxgC,IAAOvM,EAAY,MAAM4sC,EAAc,CAACM,MAAOA,IAAI,IAAIA,IAAI,IAAIA,CAAE,GAAG,CAAA,CAAE;AAE5E,SAAO;AAAA,IACH,MAAA33B;AAAA,IACA,OAAOA,GAAM,SAAS,CAAA;AAAA,IACtB,YAAAo3B;AAAA,IACA,WAAAI;AAAA,IACA,OAAOx3B,GAAM,SAAS;AAAA,IACtB,SAAAy3B;AAAA,IACA,SAAAC;AAAA,IACA,WAAW3jC,EAAM;AAAA,IACjB,YAAYA,EAAM;AAAA,IAClB,OAAOA,EAAM;AAAA,IACb,SAAAqnB;AAAA,IACA,MAAAxwB;AAAA,IACA,MAAAoM;AAAA,IACA,SAAS,MAAA;AAAM,MAAKjD,EAAM,QAAA;AAAA;AAAA,EAAQ;AAE1C;ACrEO,SAAS6jC,GAAkB3jC,GAA4D;AAC1F,QAAM,EAAE,UAAA6iC,GAAU,SAAAC,GAAS,OAAA9S,IAAQ,IAAI,SAAAgT,GAAS,WAAAC,IAAY,IAAO,GAAGC,EAAA,IAAiBljC,GAEjFF,IAAQ8jC,GAMZ;AAAA,IACE,GAAGV;AAAA,IACH,UAAU,CAAC,GAAGL,GAAU,EAAE,OAAA7S,GAAO,SAAAgT,GAAS,WAAAC,GAAW;AAAA,IACrD,kBAAkB;AAAA,IAClB,SAAS,CAAC,EAAE,WAAAY,EAAA,MACRf,EAAQ,EAAE,QAAQe,GAAW,OAAA7T,GAAO,UAAUgT,GAAS,WAAAC,GAAW;AAAA,IACtE,kBAAkB,CAAC7jB,MAAUA,EAAK,WAAWA,EAAK,cAAc;AAAA,EAAA,CACnE,GAEKtS,IAAQhN,EAAM,MAAM,SAAS,CAAA;AAEnC,SAAO;AAAA,IACH,OAAOgN,EAAM,QAAQ,CAAC42B,MAAMA,EAAE,KAAK;AAAA,IACnC,OAAA52B;AAAA,IACA,aAAahN,EAAM;AAAA,IACnB,WAAWA,EAAM;AAAA,IACjB,oBAAoBA,EAAM;AAAA,IAC1B,OAAOA,EAAM;AAAA,IACb,eAAe,MAAA;AAAM,MAAKA,EAAM,cAAA;AAAA;AAAA,IAChC,SAAS,MAAA;AAAM,MAAKA,EAAM,QAAA;AAAA;AAAA,EAAQ;AAE1C;ACWA,MAAMgkC,KAAmB,CAACtD,GAAkB/pC,MACxCA,KAAM,OAAO,IAAI+pC,CAAQ,KAAK,IAAIA,CAAQ,IAAI/pC,CAAE;AAuB7C,SAASstC,GACZ3B,GACApiC,IAA+B,IACnB;AACZ,QAAM;AAAA,IACF,WAAA6jC,IAAY;AAAA,IACZ,WAAAd,IAAY;AAAA,IACZ,gBAAAiB,IAAiB;AAAA,IACjB,gBAAAC,IAAiB;AAAA,IACjB,oBAAAC,IAAqB;AAAA,IACrB,cAAAC,IAAe;AAAA,IACf,WAAAC,IAAYN;AAAA,EAAA,IACZ9jC,GAEEqkC,IAAyB;AAAA,IAC3B,QAAW7D,GAAkB1G,IAAwB,IAA4B;AAC7E,YAAM,EAAE,YAAAwK,GAAY,MAAAtT,GAAM,SAAAuT,EAAA,IAAYzK,GAChCh6B,IAAoC,CAAA;AAK1C,UAHIwkC,GAAY,QAAQ,SAAMxkC,EAAM+jC,CAAS,IAAIS,EAAW,OACxDA,GAAY,YAAY,SAAMxkC,EAAMijC,CAAS,IAAIuB,EAAW,WAE5DtT,GAAM,OAAO;AACb,cAAMwT,IAAQxT,EAAK,SAAS;AAC5B,QAAAlxB,EAAMkkC,CAAc,IAAIhT,EAAK,OAC7BlxB,EAAMmkC,CAAc,IAAIC,IAAqBM,MAAU,QAAQA;AAAA,MACnE;AAEA,UAAID;AACA,mBAAW,CAAChrC,GAAK3D,CAAK,KAAK,OAAO,QAAQ2uC,CAAO;AAC7C,UAAAzkC,EAAMvG,CAAG,IAAI3D;AAIrB,YAAM6uC,IAAiC,EAAE,QAAQ3kC,EAAA;AACjD,aAAOsiC,EAAO,IAAmBgC,EAAU5D,CAAQ,GAAGiE,CAAc;AAAA,IACxE;AAAA,IAEA,OAAUjE,GAAkB/pC,GAAiC;AACzD,aAAO2rC,EAAO,IAAOgC,EAAU5D,GAAU/pC,CAAE,CAAC;AAAA,IAChD;AAAA,IAEA,QAAW+pC,GAAkBkE,GAAwC;AACjE,aAAO,QAAQ,IAAIA,EAAI,IAAI,CAACjuC,MAAO4tC,EAAS,OAAU7D,GAAU/pC,CAAE,CAAC,CAAC;AAAA,IACxE;AAAA,IAEA,OAAU+pC,GAAkBhrB,GAA2B;AACnD,aAAO4sB,EAAO,KAAQgC,EAAU5D,CAAQ,GAAG,EAAE,MAAMhrB,GAAM;AAAA,IAC7D;AAAA,IAEA,OAAUgrB,GAAkB/pC,GAAqB+e,GAA2B;AACxE,YAAMqkB,IAAOuK,EAAU5D,GAAU/pC,CAAE;AACnC,aAAO0tC,MAAiB,QAClB/B,EAAO,IAAOvI,GAAM,EAAE,MAAMrkB,EAAA,CAAM,IAClC4sB,EAAO,MAASvI,GAAM,EAAE,MAAMrkB,GAAM;AAAA,IAC9C;AAAA,IAEA,UAAagrB,GAAkB/pC,GAAiC;AAC5D,aAAO2rC,EAAO,OAAUgC,EAAU5D,GAAU/pC,CAAE,CAAC;AAAA,IACnD;AAAA,EAAA;AAGJ,SAAO4tC;AACX;ACrLA,MAAMM,KAAsB37B,GAAmC,IAAI;AAoB5D,SAAS47B,GAAoB,EAAE,UAAAP,GAAU,UAAAvsC,KAAsC;AAClF,2BAAQ6sC,GAAoB,UAApB,EAA6B,OAAON,GAAW,UAAAvsC,GAAS;AACpE;AAQO,SAAS+sC,KAAgC;AAC5C,QAAMR,IAAWt6B,GAAW46B,EAAmB;AAC/C,MAAI,CAACN;AACD,UAAM,IAAI,MAAM,6DAA6D;AAEjF,SAAOA;AACX;ACTO,SAASS,GAAatE,GAAkB1G,GAAmC;AAC9E,SAAO,CAAC,QAAQ0G,GAAU,QAAQ1G,CAAM;AAC5C;AASO,SAASiL,GAAYvE,GAAkB/pC,GAAmD;AAC7F,SAAO,CAAC,QAAQ+pC,GAAU,OAAO/pC,CAAE;AACvC;AAUO,SAASuuC,GACZxE,GACA1G,GACA95B,GACoC;AACpC,QAAMqkC,IAAWQ,GAAA;AACjB,SAAOxB,GAA+B;AAAA,IAClC,UAAUyB,GAAatE,GAAU1G,CAAM;AAAA,IACvC,SAAS,MAAMuK,EAAS,QAAW7D,GAAU1G,CAAM;AAAA,IACnD,GAAG95B;AAAA,EAAA,CACN;AACL;AAYO,SAASilC,GACZzE,GACA/pC,GACAuJ,GACwB;AACxB,QAAMqkC,IAAWQ,GAAA,GACX,EAAE,SAAAK,GAAS,GAAGzmB,EAAA,IAASze,KAAW,CAAA;AACxC,SAAOqjC,GAAmB;AAAA,IACtB,UAAU0B,GAAYvE,GAAU/pC,CAAE;AAAA,IAClC,SAAS,MAAM4tC,EAAS,OAAU7D,GAAU/pC,CAAqB;AAAA,IACjE,SAASA,KAAM,SAASyuC,KAAW;AAAA,IACnC,GAAGzmB;AAAA,EAAA,CACN;AACL;AAYO,SAAS0mB,GACZ3E,GACAxgC,GACoC;AACpC,QAAMqkC,IAAWQ,GAAA,GACXO,IAAcC,GAAA;AACpB,SAAOC,GAA+B;AAAA,IAClC,YAAY,CAAC9vB,MAAkB6uB,EAAS,OAAU7D,GAAUhrB,CAAI;AAAA,IAChE,WAAW,IAAI0W,MAAS;AACpB,MAAKkZ,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ5E,GAAU,MAAM,GAAG,GAC3ExgC,GAAS,YAAY,GAAGksB,CAAI;AAAA,IAChC;AAAA,IACA,GAAGlsB;AAAA,EAAA,CACN;AACL;AAoBO,SAASulC,GACZ/E,GACAxgC,GAC4C;AAC5C,QAAMqkC,IAAWQ,GAAA,GACXO,IAAcC,GAAA;AACpB,SAAOC,GAAuC;AAAA,IAC1C,YAAY,CAAC,EAAE,IAAA7uC,GAAI,MAAA+e,EAAA,MAA4B6uB,EAAS,OAAU7D,GAAU/pC,GAAI+e,CAAI;AAAA,IACpF,WAAW,IAAI0W,MAAS;AACpB,YAAM,CAAA,EAAGsZ,CAAS,IAAItZ;AACtB,MAAKkZ,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ5E,GAAU,MAAM,GAAG,GACtE4E,EAAY,kBAAkB,EAAE,UAAUL,GAAYvE,GAAUgF,EAAU,EAAE,GAAG,GACpFxlC,GAAS,YAAY,GAAGksB,CAAI;AAAA,IAChC;AAAA,IACA,GAAGlsB;AAAA,EAAA,CACN;AACL;AAYO,SAASylC,GACZjF,GACAxgC,GAC4C;AAC5C,QAAMqkC,IAAWQ,GAAA,GACXO,IAAcC,GAAA;AACpB,SAAOC,GAAuC;AAAA,IAC1C,YAAY,CAAC7uC,MAAwB4tC,EAAS,UAAa7D,GAAU/pC,CAAE;AAAA,IACvE,WAAW,IAAIy1B,MAAS;AACpB,MAAKkZ,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ5E,GAAU,MAAM,GAAG,GAC3ExgC,GAAS,YAAY,GAAGksB,CAAI;AAAA,IAChC;AAAA,IACA,GAAGlsB;AAAA,EAAA,CACN;AACL;ACxJO,SAAS0lC,GAAW,EAAE,MAAAhM,GAAM,YAAAiM,IAAa,KAAK,SAAAC,IAAU,IAAM,UAAA9tC,KAA6B;AAC9F,SAAO,gBAAAjB,EAAAmC,GAAA,EAAG,cAAOlB,IAAW,gBAAAjB,EAACgvC,MAAS,IAAIF,GAAY,SAAAC,GAAkB,EAAA,CAAG;AAC/E;ACTO,SAASE,GAAaC,GAAoD;AAC7E,SAAOA;AACX;AAEA,MAAMC,yBAAgB,QAAA;AAEtB,SAASC,GAAYC,GAAmD;AACpE,MAAIC,IAAOH,GAAU,IAAIE,CAAK;AAC9B,SAAKC,MACDA,IAAO/H,GAAc8H,EAAM,IAAK,GAChCF,GAAU,IAAIE,GAAOC,CAAI,IAEtBA;AACX;AAEA,SAASC,GAAe;AAAA,EACpB,OAAAC;AAAA,EACA,YAAAV;AAAA,EACA,UAAA7tC;AACJ,GAIG;AACC,QAAM2oC,IAAU,OAAO4F,KAAU,aAAaA,MAAUA;AACxD,SACI,gBAAAxvC,EAAC6uC,IAAA,EAAW,MAAMjF,GAAS,YAAAkF,GACtB,UAAA7tC,GACL;AAER;AAEA,SAASwuC,GAAgBP,GAAyC;AAC9D,SAAOA,EAAO,IAAI,CAACG,GAAOtjC,MAAM;AAC5B,QAAI4V,IAAqB0tB,EAAM;AAC/B,QAAIA,EAAM,MAAM;AACZ,YAAMK,IAAgBN,GAAYC,CAAK;AACvC,MAAA1tB,sBAAW+tB,GAAA,EAAc;AAAA,IAC7B;AASA,WARIL,EAAM,UAAU,WAChB1tB,IACI,gBAAA3hB,EAACuvC,MAAe,OAAOF,EAAM,OAAO,YAAYA,EAAM,YACjD,UAAA1tB,EAAA,CACL,IAIJ0tB,EAAM,0BACEM,IAAA,EAAyB,OAAK,IAAC,SAAAhuB,EAAA,GAApB,SAAS5V,CAAC,EAA4B,IAIzD,gBAAA/L;AAAA,MAAC2vC;AAAA,MAAA;AAAA,QAEG,MAAMN,EAAM;AAAA,QACZ,SAAA1tB;AAAA,QACA,eAAe0tB,EAAM;AAAA,QAEpB,UAAAA,EAAM,WAAWI,GAAgBJ,EAAM,QAAQ,IAAI;AAAA,MAAA;AAAA,MAL/CA,EAAM,QAAQ,SAAStjC,CAAC;AAAA,IAAA;AAAA,EAQzC,CAAC;AACL;AAEA,MAAM6jC,KAAoD;AAAA,EACtD,SAASC;AAAA,EACT,MAAMC;AAAA,EACN,QAAQC;AACZ;AAwBO,SAASC,GAAU;AAAA,EACtB,QAAAd;AAAA,EACA,QAAAe,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAArhC,IAAW;AACf,GAAmB;AACf,QAAMshC,IAAO3rC,EAAQ,MAAMgrC,GAAgBP,CAAM,GAAG,CAACA,CAAM,CAAC,GACtDmB,IAAST,GAAQK,CAAM;AAG7B,SACI,gBAAAjwC,EAACqwC,GAAA,EAAQ,GAHOJ,MAAW,WAAW,EAAE,UAAAC,GAAU,gBAAAC,EAAA,IAAmB,EAAE,UAAAD,EAAA,GAInE,UAAA,gBAAAlwC,EAACswC,IAAA,EAAS,UAAAxhC,GACN,UAAA,gBAAA9O,EAACuwC,IAAA,EAAQ,UAAAH,EAAA,CAAK,EAAA,CAClB,GACJ;AAER;ACtEO,SAASI,GACZC,GACAtnC,IAAiC,IACP;AAC1B,MAAI,CAACA,EAAQ;AACT,WAAOo9B,GAAA,EAAYkK,CAAW;AAGlC,QAAM,EAAE,MAAA3sC,GAAM,SAAAs6B,IAAU,SAAS,YAAAsS,GAAY,SAAAC,GAAS,SAAAC,MAAYznC,EAAQ,SACpEm9B,IAAclI,MAAY,YAAY,MAAM,iBAAiB,MAAM;AAEzE,SAAOmI,GAAA;AAAA,IACHC,GAAQiK,GAAa;AAAA,MACjB,MAAA3sC;AAAA,MACA,SAAS4iC,GAAkBJ,CAAW;AAAA,MACtC,GAAIoK,IAAa,EAAE,YAAAA,EAAA,IAAe,CAAA;AAAA,MAClC,GAAIC,MAAY,SAAY,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,MAC1C,GAAIC,IAAU,EAAE,SAAAA,MAAY,CAAA;AAAA,IAAC,CAChC;AAAA,EAAA;AAET;ACtDO,SAASC,GACZC,GACgB;AAChB,QAAMC,IAAQD;AACd,EAAAC,EAAM,MAAM,CAAA;AACZ,aAAWruC,KAAO,OAAO,KAAKouC,EAAM,SAAA,CAAU;AACzC,IAAAC,EAAM,IAAsCruC,CAAG,IAAI,MAChDouC,EAAM,CAACl9B,MAAWA,EAAkClR,CAAG,CAAC;AAEhE,SAAOquC;AACX;ACbA,MAAMC,KAAe7+B,GAAwC,IAAI;AAgCjE,SAASsvB,GAAQ12B,GAAgC;AAC7C,SAAIA,MAAS,UAAUA,MAAS,UAAgBA,IAC5C,OAAO,SAAW,MAAoB,UACnC,OAAO,WAAW,8BAA8B,EAAE,UAAU,SAAS;AAChF;AAMA,SAASkmC,GACLtvB,GACAiQ,GACAsf,GACAC,GACI;AACJ,QAAMC,IAAQ,MAAM,QAAQF,CAAS,IAAIA,IAAY,CAACA,CAAS;AAC/D,aAAWG,KAAQD,EAAO,CAAAzvB,EAAQ,aAAa0vB,GAAMzf,CAAQ;AAC7D,MAAIuf,KAAc,OAAO,WAAa,KAAa;AAC/C,UAAMjd,IAAO,SAAS,cAA+B,0BAA0B;AAC/E,IAAIA,MAAMA,EAAK,UAAUid,EAAWvf,CAAQ;AAAA,EAChD;AACJ;AAEA,SAAS0f,GAAWhgC,GAA6C;AAC7D,MAAI,CAACA,KAAc,OAAO,SAAW,IAAa,QAAO;AACzD,MAAI;AACA,UAAMvS,IAAQ,OAAO,aAAa,QAAQuS,CAAU;AACpD,WAAIvS,MAAU,WAAWA,MAAU,UAAUA,MAAU,WAAiBA,IACjE;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAUO,SAASwyC,GAAc;AAAA,EAC1B,UAAAtwC;AAAA,EACA,cAAAuwC,IAAe;AAAA,EACf,YAAAlgC,IAAa;AAAA,EACb,QAAA8R;AAAA,EACA,WAAA8tB,IAAY;AAAA,EACZ,YAAAC;AACJ,GAAuB;AACnB,QAAM,CAACzG,GAAO+G,CAAa,IAAIjyC;AAAA,IAC3B,MAAM8xC,GAAWhgC,CAAU,KAAKkgC;AAAA,EAAA,GAE9B,CAACE,GAAeC,CAAgB,IAAInyC,EAAwB,MAAMiiC,GAAQiJ,CAAK,CAAC,GAEhFkH,IAAY/pC,EAAsBub,CAAM;AAC9C,EAAAwuB,EAAU,UAAUxuB;AAEpB,QAAMyuB,IAAe,MAAM,QAAQX,CAAS,IAAIA,EAAU,KAAK,GAAG,IAAIA,GAChEY,IAAgBjqC,EAAOspC,CAAU;AACvC,EAAAW,EAAc,UAAUX,GAExBtuC,EAAU,MAAM;AACZ,UAAM8e,IAAUiwB,EAAU,UAAA,KAAe,SAAS;AAClD,QAAI,CAACjwB,EAAS;AACd,UAAM7hB,IAAO2hC,GAAQiJ,CAAK;AAC1B,IAAAuG,GAActvB,GAAS7hB,GAAMoxC,GAAWY,EAAc,OAAO,GAC7DH,EAAiB7xC,CAAI;AAAA,EAGzB,GAAG,CAAC4qC,GAAOmH,CAAY,CAAC,GAExBhvC,EAAU,MAAM;AACZ,QAAI6nC,MAAU,YAAY,OAAO,SAAW,IAAa;AACzD,UAAM3Z,IAAO,OAAO,WAAW,8BAA8B,GACvDlrB,IAAU,MAAY;AACxB,YAAM8b,IAAUiwB,EAAU,UAAA,KAAe,SAAS;AAClD,UAAI,CAACjwB,EAAS;AACd,YAAM7hB,IAAsBixB,EAAK,UAAU,SAAS;AACpD,MAAAkgB,GAActvB,GAAS7hB,GAAMoxC,GAAWY,EAAc,OAAO,GAC7DH,EAAiB7xC,CAAI;AAAA,IACzB;AACA,WAAAixB,EAAK,iBAAiB,UAAUlrB,CAAO,GAChC,MAAMkrB,EAAK,oBAAoB,UAAUlrB,CAAO;AAAA,EAE3D,GAAG,CAAC6kC,GAAOmH,CAAY,CAAC;AAExB,QAAME,IAAWpyC;AAAA,IACb,CAACG,MAAoB;AAEjB,UADA2xC,EAAc3xC,CAAI,GACdwR,KAAc,OAAO,SAAW;AAChC,YAAI;AACA,iBAAO,aAAa,QAAQA,GAAYxR,CAAI;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,IAER;AAAA,IACA,CAACwR,CAAU;AAAA,EAAA,GAGT5R,IAASC,EAAY,MAAM;AAC7B,IAAAoyC,EAASL,MAAkB,SAAS,UAAU,MAAM;AAAA,EACxD,GAAG,CAACA,GAAeK,CAAQ,CAAC,GAEtBhzC,IAAQ0F;AAAA,IACV,OAAO,EAAE,OAAAimC,GAAO,eAAAgH,GAAe,UAAAK,GAAU,QAAAryC,EAAA;AAAA,IACzC,CAACgrC,GAAOgH,GAAeK,GAAUryC,CAAM;AAAA,EAAA;AAG3C,SAAO,gBAAAM,EAACgxC,GAAa,UAAb,EAAsB,OAAAjyC,GAAe,UAAAkC,EAAA,CAAS;AAC1D;AAKO,SAAS+wC,KAA8B;AAC1C,QAAMzxB,IAAMrN,GAAW89B,EAAY;AACnC,MAAI,CAACzwB,EAAK,OAAM,IAAI,MAAM,gDAAgD;AAC1E,SAAOA;AACX;AC5IA,SAAS0xB,GAAYC,GAAkBjP,GAAsC;AACzE,SAAKA,IACEiP,EAAS,QAAQ,cAAc,CAACC,GAAQruC,MAAiB;AAC5D,UAAM/E,IAAQkkC,EAAOn/B,CAAI;AACzB,WAAO/E,MAAU,SAAY,IAAI+E,CAAI,MAAM,OAAO/E,CAAK;AAAA,EAC3D,CAAC,IAJmBmzC;AAKxB;AAEA,SAASE,GACLC,GACA10B,GACA7O,GACApM,GACa;AACb,QAAM4vC,IAASD,EAAQ10B,CAAM,IAAIjb,CAAG;AACpC,MAAI4vC,MAAW,OAAW,QAAOA;AACjC,MAAIxjC,GAAU;AACV,UAAMyjC,IAAgBF,EAAQvjC,CAAQ,IAAIpM,CAAG;AAC7C,QAAI6vC,MAAkB,OAAW,QAAOA;AAAA,EAC5C;AACA,SAAO;AACX;AAyBO,SAASC,GAAWrpC,GAAkC;AACzD,QAAM,EAAE,QAAAwU,GAAQ,gBAAA80B,IAAiB,MAAM,UAAAC,MAAavpC;AAEpD,WAAS+E,EAAExL,GAAaugC,GAAsC;AAC1D,UAAMiP,IAAWE,GAAOM,GAAU/0B,GAAQ80B,GAAgB/vC,CAAG;AAC7D,WAAIwvC,MAAa,OAAaxvC,IACvBuvC,GAAYC,GAAUjP,CAAM;AAAA,EACvC;AAEA,WAAShE,EAAOv8B,GAAagtB,GAAeuT,GAAsC;AAE9E,UAAMiP,IACFE,GAAOM,GAAU/0B,GAAQ80B,GAAgB,GAAG/vC,CAAG,GAFpCgtB,MAAU,IAAI,SAAS,QAEsB,EAAE,KAC1D0iB,GAAOM,GAAU/0B,GAAQ80B,GAAgB/vC,CAAG;AAChD,WAAIwvC,MAAa,OAAaxvC,IACvBuvC,GAAYC,GAAU,EAAE,OAAAxiB,GAAO,GAAIuT,KAAU,CAAA,GAAK;AAAA,EAC7D;AAEA,WAAS0P,EAAa5zC,GAAe6zC,GAAyC;AAC1E,WAAO,IAAI,KAAK,aAAaj1B,GAAQi1B,CAAI,EAAE,OAAO7zC,CAAK;AAAA,EAC3D;AAEA,WAASg/B,EAAWh/B,GAAsB6zC,GAA2C;AACjF,UAAMnvB,IAAO,OAAO1kB,KAAU,WAAW,IAAI,KAAKA,CAAK,IAAIA;AAC3D,WAAI,OAAO,MAAM0kB,EAAK,QAAA,CAAS,IAAU,KAClC,IAAI,KAAK,eAAe9F,GAAQi1B,CAAI,EAAE,OAAOnvB,CAAI;AAAA,EAC5D;AAEA,SAAO;AAAA,IACH,QAAA9F;AAAA,IACA,gBAAA80B;AAAA,IACA,GAAAvkC;AAAA,IACA,QAAA+wB;AAAA,IACA,cAAA0T;AAAA,IACA,YAAA5U;AAAA,IACA,YAAY,CAAC8U,MACTL,GAAW;AAAA,MACP,QAAQK;AAAA,MACR,gBAAgBJ,KAAkB;AAAA,MAClC,UAAAC;AAAA,IAAA,CACH;AAAA,EAAA;AAEb;ACjHA,MAAMI,KAAc3gC,GAAuC,IAAI;AAc/D,SAASm/B,GAAWhgC,GAA2ByhC,GAAoC;AAC/E,MAAI,CAACzhC,KAAc,OAAO,SAAW,IAAa,QAAO;AACzD,MAAI;AACA,UAAMvS,IAAQ,OAAO,aAAa,QAAQuS,CAAU;AACpD,WAAIvS,KAASg0C,EAAU,SAASh0C,CAAK,IAAUA,IACxC;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAMO,SAASi0C,GAAa;AAAA,EACzB,UAAA/xC;AAAA,EACA,QAAQgyC;AAAA,EACR,gBAAAR;AAAA,EACA,UAAAC;AAAA,EACA,YAAAphC,IAAa;AACjB,GAAsB;AAClB,QAAM4hC,IAAmBzuC,EAAQ,MAAM,OAAO,KAAKiuC,CAAQ,GAAG,CAACA,CAAQ,CAAC,GAClE,CAAC/0B,GAAQw1B,CAAc,IAAI3zC;AAAA,IAC7B,MAAM8xC,GAAWhgC,GAAY4hC,CAAgB,KAAKD;AAAA,EAAA;AAGtD,EAAApwC,EAAU,MAAM;AACZ,IAAI,OAAO,WAAa,OACpB,SAAS,gBAAgB,aAAa,QAAQ8a,CAAM;AAAA,EAE5D,GAAG,CAACA,CAAM,CAAC;AAEX,QAAMy1B,IAAYzzC;AAAA,IACd,CAACG,MAAiB;AAEd,UADAqzC,EAAerzC,CAAI,GACfwR,KAAc,OAAO,SAAW;AAChC,YAAI;AACA,iBAAO,aAAa,QAAQA,GAAYxR,CAAI;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,IAER;AAAA,IACA,CAACwR,CAAU;AAAA,EAAA,GAGTvS,IAAQ0F,EAA0B,OAE7B,EAAE,GADI+tC,GAAW,EAAE,QAAA70B,GAAQ,gBAAA80B,GAAgB,UAAAC,GAAU,GAC1C,WAAAU,GAAW,kBAAAF,EAAA,IAC9B,CAACv1B,GAAQ80B,GAAgBC,GAAUU,GAAWF,CAAgB,CAAC;AAElE,SAAO,gBAAAlzC,EAAC8yC,GAAY,UAAZ,EAAqB,OAAA/zC,GAAe,UAAAkC,EAAA,CAAS;AACzD;AAKO,SAASoyC,KAA4B;AACxC,QAAM9yB,IAAMrN,GAAW4/B,EAAW;AAClC,MAAI,CAACvyB,EAAK,OAAM,IAAI,MAAM,+CAA+C;AACzE,SAAOA;AACX;AAKO,SAAS+yB,KAAsC;AAClD,SAAOD,KAAU;AACrB;AClEA,SAASE,GAAYtoB,IAAwB,IAAIC,IAAwB,CAAA,GAAa;AAClF,MAAID,EAAE,WAAWC,EAAE,OAAQ,QAAO;AAClC,WAASnf,IAAI,GAAGA,IAAIkf,EAAE,QAAQlf;AAC1B,QAAI,CAAC,OAAO,GAAGkf,EAAElf,CAAC,GAAGmf,EAAEnf,CAAC,CAAC,EAAG,QAAO;AAEvC,SAAO;AACX;AAiBO,MAAMynC,WAAsB/I,GAAkD;AAAA,EACxE,QAA4B,EAAE,OAAO,KAAA;AAAA,EAE9C,OAAO,yBAAyBpiC,GAAkC;AAC9D,WAAO,EAAE,OAAAA,EAAA;AAAA,EACb;AAAA,EAES,kBAAkBA,GAAcorC,GAAuB;AAC5D,SAAK,MAAM,UAAUprC,GAAOorC,CAAI;AAAA,EACpC;AAAA,EAES,mBAAmBC,GAAyC;AACjE,IAAI,KAAK,MAAM,SAASH,GAAYG,EAAc,WAAW,KAAK,MAAM,SAAS,KAC7E,KAAK,MAAA;AAAA,EAEb;AAAA,EAEA,QAAQ,MAAY;AAChB,SAAK,SAAS,EAAE,OAAO,KAAA,CAAM;AAAA,EACjC;AAAA,EAES,SAAoB;AACzB,UAAM,EAAE,OAAArrC,MAAU,KAAK;AACvB,QAAI,CAACA,EAAO,QAAO,KAAK,MAAM;AAE9B,UAAM,EAAE,UAAAyG,MAAa,KAAK;AAC1B,WAAI,OAAOA,KAAa,aACbA,EAAS,EAAE,OAAAzG,GAAO,OAAO,KAAK,OAAO,IAEzCyG;AAAA,EACX;AACJ;ACpCO,SAAS6kC,GAAa,EAAE,UAAA1yC,GAAU,OAAAgI,GAAO,OAAAyhC,GAAO,MAAAkJ,GAAM,eAAAC,KAAoC;AAC7F,MAAIzD,IAAkBnvC;AAEtB,SAAI2yC,MACAxD,IAAO,gBAAApwC,EAACgzC,IAAA,EAAc,GAAGY,GAAO,UAAAxD,GAAK,IAGrC1F,MAAU,OACV0F,sBAAQmB,IAAA,EAAe,GAAI7G,KAAS,IAAM,UAAA0F,GAAK,IAG/CnnC,MAAU,OACVmnC,sBAAQ9E,IAAA,EAAe,GAAIriC,KAAS,IAAM,UAAAmnC,GAAK,IAG/CyD,MACAzD,IAAO,gBAAApwC,EAACwzC,IAAA,EAAe,GAAGK,GAAgB,UAAAzD,GAAK,2BAGzC,UAAAA,EAAA,CAAK;AACnB;ACxBA,SAAS0D,GAAiBziB,GAAgB;AACtC,MAAI;AACA,WAAO,KAAK,MAAMA,CAAG;AAAA,EACzB,QAAQ;AACJ,WAAOA;AAAA,EACX;AACJ;AAaO,SAAS0iB,GACZra,GACAvwB,IAAuC,IAClB;AACrB,QAAM;AAAA,IACF,iBAAAo7B,IAAkB;AAAA,IAClB,aAAAyP,IAAc,CAAA;AAAA,IACd,iBAAAC,IAAkB,CAAC,MAAM;AAAA,IACzB,YAAAC,IAAa;AAAA,IACb,gBAAAC,IAAiB;AAAA,IACjB,YAAAC,IAAa;AAAA,IACb,QAAA1P,IAASoP;AAAAA,IACT,QAAAO;AAAA,IACA,WAAAC;AAAA,IACA,SAAAjvB;AAAA,IACA,gBAAAkvB;AAAA,EAAA,IACAprC;AAEJ,MAAI42B,IAA6B,MAC7ByU,IAAmD,MACnDrP,IAAU,GACV/gC,IAA4B,QAC5BqwC,IAAS;AAEb,WAAS3J,EAAUhrC,GAA+B;AAC9C,IAAIsE,MAAWtE,MACfsE,IAAStE,GACTy0C,IAAiBz0C,CAAI;AAAA,EACzB;AAEA,WAASkU,EAAKid,GAAmBpsB,GAA2B;AACxD,IAAIovC,EAAgB,SAAShjB,CAAS,KACtCqjB,IAAY;AAAA,MACR,OAAOrjB;AAAA,MACP,MAAMyT,EAAO7/B,EAAM,IAAI;AAAA,MACvB,IAAIA,EAAM,eAAe;AAAA,MACzB,KAAKA;AAAA,IAAA,CACR;AAAA,EACL;AAEA,WAAS6vC,IAA0B;AAC/B,QAAID,EAAQ;AACZ,QAAItP,KAAW+O,GAAY;AACvB,MAAApJ,EAAU,OAAO;AACjB;AAAA,IACJ;AACA,UAAMjV,IAAQ,KAAK,IAAIse,IAAiB,KAAKhP,GAASiP,CAAU;AAChE,IAAAjP,KAAW,GACXqP,IAAa,WAAWG,GAAS9e,CAAK;AAAA,EAC1C;AAEA,WAAS8e,IAAgB;AACrB,QAAIF,EAAQ;AACZ,IAAI1U,OAAe,MAAA,GACnB+K,EAAU,YAAY;AAEtB,UAAM8J,IAAK,IAAI,YAAYlb,GAAK,EAAE,iBAAA6K,GAAiB;AACnD,IAAAxE,IAAS6U,GAETA,EAAG,SAAS,MAAM;AACd,MAAAzP,IAAU,GACV2F,EAAU,MAAM,GAChBuJ,IAAA;AAAA,IACJ,GAEAO,EAAG,YAAY,CAAC/vC,MAAUmP,EAAK,WAAWnP,CAAK;AAC/C,eAAWf,KAAQkwC;AACf,MAAAY,EAAG,iBAAiB9wC,GAAM,CAACe,MAAUmP,EAAKlQ,GAAMe,CAAqB,CAAC;AAE1E,eAAWf,KAAQmwC;AACf,MAAAW,EAAG,iBAAiB9wC,GAAM,MAAM;AAAA,MAEhC,CAAC;AAGL,IAAA8wC,EAAG,UAAU,CAAC/vC,MAAU;AACpB,MAAAwgB,IAAUxgB,CAAK,GACf+vC,EAAG,MAAA,GACH7U,IAAS,MACT+K,EAAU,QAAQ,GAClB4J,EAAA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS1oC,IAAc;AACnB,IAAAyoC,IAAS,IACLD,MACA,aAAaA,CAAU,GACvBA,IAAa,OAEjBrP,IAAU,GACNpF,MACAA,EAAO,MAAA,GACPA,IAAS,OAEb+K,EAAU,QAAQ;AAAA,EACtB;AAEA,WAAS+J,IAAkB;AACvB,IAAIL,MACA,aAAaA,CAAU,GACvBA,IAAa,OAEjBrP,IAAU,GACVsP,IAAS,IACTE,EAAA;AAAA,EACJ;AAEA,SAAAA,EAAA,GAEO;AAAA,IACH,OAAA3oC;AAAA,IACA,WAAA6oC;AAAA,IACA,IAAI,SAAS;AACT,aAAOzwC;AAAA,IACX;AAAA,EAAA;AAER;AC9IO,SAAS0wC,GACZpb,GACAvwB,IAAoC,IACb;AACvB,QAAM,EAAE,SAAAklC,IAAU,IAAM,WAAAiG,GAAW,GAAG1sB,MAASze,GACzC,CAAC/E,GAAQ0mC,CAAS,IAAItrC,EAA4B,MAAM,GACxD,CAACu1C,GAAaC,CAAc,IAAIx1C,EAAuC,IAAI,GAC3Ey1C,IAAeptC,EAA4B,IAAI,GAE/CqtC,IAAertC,EAAOysC,CAAS;AACrC,SAAAY,EAAa,UAAUZ,GAEvBzxC,EAAU,MAAM;AACZ,QAAI,CAACwrC,KAAW,CAAC3U,GAAK;AAClB,MAAAoR,EAAU,MAAM;AAChB;AAAA,IACJ;AAEA,UAAMqK,IAAapB,GAAqBra,GAAK;AAAA,MACzC,GAAG9R;AAAA,MACH,gBAAgBkjB;AAAA,MAChB,WAAW,CAACtK,MAAY;AACpB,QAAAwU,EAAexU,CAAO,GACtB0U,EAAa,UAAU1U,CAAO;AAAA,MAClC;AAAA,IAAA,CACH;AACD,WAAAyU,EAAa,UAAUE,EAAW,WAE3B,MAAM;AACT,MAAAA,EAAW,MAAA,GACXF,EAAa,UAAU;AAAA,IAC3B;AAAA,EAEJ,GAAG,CAACvb,GAAK2U,CAAO,CAAC,GAEV;AAAA,IACH,QAAAjqC;AAAA,IACA,aAAA2wC;AAAA,IACA,WAAW,MAAME,EAAa,UAAA;AAAA,EAAU;AAEhD;ACrEO,SAASG,GAAsBC,GAA+C;AACjF,QAAMvO,IAAU,IAAI,QAAQ,IAAKuO,EAAa,SAAS,KAAM,CAAC,GACxDC,KAAUD,IAAevO,GAAS,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,GACtEyO,IAAU,OAAO,KAAKD,CAAM,GAC5BE,IAAS,IAAI,YAAYD,EAAQ,MAAM,GACvClK,IAAS,IAAI,WAAWmK,CAAM;AACpC,WAASzpC,IAAI,GAAGA,IAAIwpC,EAAQ,QAAQxpC;AAChC,IAAAs/B,EAAOt/B,CAAC,IAAIwpC,EAAQ,WAAWxpC,CAAC;AAEpC,SAAOs/B;AACX;AAMO,SAASoK,KAA2B;AACvC,SACI,OAAO,SAAW,OAClB,mBAAmB,aACnB,iBAAiB,UACjB,kBAAkB;AAE1B;ACVO,MAAMC,WAAgC,MAAM;AAAA,EAC/C,cAAc;AACV,UAAM,yCAAyC,GAC/C,KAAK,OAAO;AAAA,EAChB;AACJ;AAEO,MAAMC,WAAqC,MAAM;AAAA,EACpD,cAAc;AACV,UAAM,+CAA+C,GACrD,KAAK,OAAO;AAAA,EAChB;AACJ;AAOO,MAAMC,GAAc;AAAA,EACN;AAAA,EAEjB,YAAYtS,GAA6B;AACrC,SAAK,SAASA;AAAA,EAClB;AAAA;AAAA,EAGA,OAAO,cAAuB;AAC1B,WAAOmS,GAAA;AAAA,EACX;AAAA,EAEA,MAAc,eAAmD;AAC7D,QAAI,CAACA,GAAA,EAAmB,OAAM,IAAIC,GAAA;AAClC,WAAO,KAAK,OAAO,kBACb,MAAM,KAAK,OAAO,oBAClB,MAAM,UAAU,cAAc;AAAA,EACxC;AAAA;AAAA,EAGA,aAAqD;AACjD,WAAI,OAAO,eAAiB,MAAoB,gBACzC,aAAa;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAqD;AACvD,QAAI,OAAO,eAAiB,IAAa,OAAM,IAAIA,GAAA;AACnD,WAAO,aAAa,kBAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,kBAAoD;AAEtD,YADqB,MAAM,KAAK,aAAA,GACZ,YAAY,gBAAA;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,eAAiC;AACnC,WAAKD,GAAA,IACY,MAAM,KAAK,gBAAA,MACR,OAFW;AAAA,EAGnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YAAuC;AAEzC,QADmB,MAAM,KAAK,kBAAA,MACX,UAAW,OAAM,IAAIE,GAAA;AAExC,UAAME,IAAe,MAAM,KAAK,aAAA,GAC1BhtB,IAAW,MAAMgtB,EAAa,YAAY,gBAAA;AAChD,QAAIhtB;AACA,mBAAM,KAAK,OAAO,YAAYA,EAAS,QAAQ,GACxCA;AAGX,UAAMitB,IAAe,MAAMD,EAAa,YAAY,UAAU;AAAA,MAC1D,iBAAiB;AAAA,MACjB,sBAAsBT,GAAsB,KAAK,OAAO,cAAc;AAAA,IAAA,CACzE;AACD,iBAAM,KAAK,OAAO,YAAYU,EAAa,QAAQ,GAC5CA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAgC;AAClC,UAAMA,IAAe,MAAM,KAAK,gBAAA;AAChC,WAAKA,KACD,KAAK,OAAO,iBACZ,MAAM,KAAK,OAAO,cAAcA,EAAa,QAAQ,GAElDA,EAAa,YAAA,KAJM;AAAA,EAK9B;AACJ;AC/FO,SAASC,GAAoBzS,GAAwD;AACxF,QAAM0S,IAAYnuC,EAAOy7B,CAAM;AAC/B,EAAA0S,EAAU,UAAU1S;AAEpB,QAAMiI,IAAS9mC;AAAA,IACX,MACI,IAAImxC,GAAc;AAAA,MACd,gBAAgBtS,EAAO;AAAA,MACvB,aAAa,CAAC2S,MAAQD,EAAU,QAAQ,YAAYC,CAAG;AAAA,MACvD,eAAe,CAACA,MAAQD,EAAU,QAAQ,gBAAgBC,CAAG;AAAA,MAC7D,iBAAiB3S,EAAO;AAAA,IAAA,CAC3B;AAAA,IACL,CAACA,EAAO,gBAAgBA,EAAO,eAAe;AAAA,EAAA,GAG5C,CAAC4S,CAAS,IAAI12C,EAAkB,MAAMi2C,IAAiB,GACvD,CAACU,GAAYC,CAAa,IAAI52C;AAAA,IAAiD,MACjF+rC,EAAO,WAAA;AAAA,EAAW,GAEhB,CAAC8K,GAAYC,CAAa,IAAI92C,EAAkB,EAAK,GACrD,CAAC+G,GAASuM,CAAU,IAAItT,EAAkB,EAAK,GAC/C,CAAC6I,GAAO49B,CAAQ,IAAIzmC,EAAuB,IAAI,GAE/CmoC,IAAUhoC,EAAY,YAAY;AACpC,QAAKu2C,GACL;AAAA,MAAAE,EAAc7K,EAAO,YAAY;AACjC,UAAI;AACA,cAAM/lC,IAAS,MAAM+lC,EAAO,aAAA;AAC5B,QAAA+K,EAAc9wC,CAAM;AAAA,MACxB,SAASw/B,GAAK;AACV,QAAAiB,EAASjB,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC;AAAA,MAChE;AAAA;AAAA,EACJ,GAAG,CAACuG,GAAQ2K,CAAS,CAAC;AAEtB,EAAArzC,EAAU,MAAM;AACZ,IAAK8kC,EAAA;AAAA,EACT,GAAG,CAACA,CAAO,CAAC;AAEZ,QAAM4O,IAAY52C,EAAY,YAAY;AACtC,QAAKu2C,GACL;AAAA,MAAApjC,EAAW,EAAI,GACfmzB,EAAS,IAAI;AACb,UAAI;AACA,cAAMsF,EAAO,UAAA,GACb+K,EAAc,EAAI,GAClBF,EAAc7K,EAAO,YAAY;AAAA,MACrC,SAASvG,GAAK;AACV,cAAAiB,EAASjB,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GACtDA;AAAA,MACV,UAAA;AACI,QAAAlyB,EAAW,EAAK;AAAA,MACpB;AAAA;AAAA,EACJ,GAAG,CAACy4B,GAAQ2K,CAAS,CAAC,GAEhBM,IAAc72C,EAAY,YAAY;AACxC,QAAKu2C,GACL;AAAA,MAAApjC,EAAW,EAAI,GACfmzB,EAAS,IAAI;AACb,UAAI;AACA,cAAMsF,EAAO,YAAA,GACb+K,EAAc,EAAK;AAAA,MACvB,SAAStR,GAAK;AACV,cAAAiB,EAASjB,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,GACtDA;AAAA,MACV,UAAA;AACI,QAAAlyB,EAAW,EAAK;AAAA,MACpB;AAAA;AAAA,EACJ,GAAG,CAACy4B,GAAQ2K,CAAS,CAAC;AAEtB,SAAO;AAAA,IACH,WAAAA;AAAA,IACA,YAAAC;AAAA,IACA,YAAAE;AAAA,IACA,SAAA9vC;AAAA,IACA,OAAA8B;AAAA,IACA,WAAAkuC;AAAA,IACA,aAAAC;AAAA,IACA,SAAA7O;AAAA,EAAA;AAER;ACrFO,SAAS8O,KAAiC;AAC7C,MAAIh0C,IAAmC;AAEvC,iBAAei0C,EACXzyC,GACA;AAAA,IACI,QAAA0yC,IAAS;AAAA,IACT,MAAAtnB,IAAO;AAAA,IACP,UAAAunB,IAAW;AAAA,IACX,cAAAC,IAAe;AAAA,IACf,SAAAC;AAAA,IACA,SAAAzxB;AAAA,EAAA,IACkB,IACU;AAChC,QAAI;AACA,MAAIwxB,KAAgBp0C,MAChBA,EAAQ,MAAA,GACRA,EAAQ,cAAc;AAE1B,YAAMs0C,IAAQ,IAAI,MAAM9yC,CAAG;AAC3B,aAAA8yC,EAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGJ,CAAM,CAAC,GAC9CI,EAAM,OAAO1nB,GACb0nB,EAAM,UAAU,QACZD,QAAe,UAAUA,IACzBzxB,MAAS0xB,EAAM,UAAU,CAAClyC,MAAUwgB,EAAQxgB,CAAK,IACrDpC,IAAUs0C,GACNH,KAAU,MAAMG,EAAM,KAAA,GACnBA;AAAA,IACX,SAAS1uC,GAAO;AACZ,aAAAgd,IAAUhd,CAAK,GACR;AAAA,IACX;AAAA,EACJ;AAEA,WAAS2uC,IAAa;AAClB,IAAKv0C,MACLA,EAAQ,MAAA,GACRA,EAAQ,cAAc;AAAA,EAC1B;AAEA,SAAO,EAAE,MAAAi0C,GAAM,MAAAM,GAAM,SAAS,MAAMv0C,EAAA;AACxC;AAEA,IAAIw0C,KAAoC;AAExC,SAASC,KAAgC;AACrC,SAAKD,OAAeA,KAAgBR,GAAA,IAC7BQ;AACX;AAOA,eAAsBE,GAClBlzC,GACAkF,GACgC;AAChC,SAAO+tC,GAAA,EAAmB,KAAKjzC,GAAKkF,CAAO;AAC/C;AAGO,SAASiuC,KAAkB;AAC9B,EAAAF,GAAA,EAAmB,KAAA;AACvB;AC1EO,SAASG,KAA2B;AACvC,QAAMC,IAAYzvC,EAA2B,IAAI,GAC3C,CAAC0vC,GAAUC,CAAW,IAAIh4C,EAAkB,EAAK;AAEvD,EAAK83C,EAAU,YACXA,EAAU,UAAUb,GAAA,IAGxB5zC,EAAU,MACC,MAAM;AACT,IAAAy0C,EAAU,SAAS,KAAA;AAAA,EACvB,GACD,CAAA,CAAE;AAEL,QAAMZ,IAAO/2C,EAAY,OAAOsE,GAAakF,MAA8C;AAEvF,IADe,MAAMmuC,EAAU,QAAS,KAAKrzC,GAAKkF,CAAO,OACjC,EAAI;AAAA,EAChC,GAAG,CAAA,CAAE,GAEC6tC,IAAOr3C,EAAY,MAAY;AACjC,IAAA23C,EAAU,SAAS,KAAA;AAAA,EACvB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,MAAAZ,GAAM,MAAAM,GAAM,UAAAO,EAAA;AACzB;ACmBA,MAAME,WAAuDC,GAAM;AAAA,EAC/D;AAAA,EAEA,YAAY5zC,GAAc6sC,GAAiBgH,GAAmBC,GAAiB;AAC3E,UAAM9zC,CAAI,GACV,KAAK,QAAQ6sC,CAAO,EAAE,OAAO,EAAE,CAACgH,CAAS,GAAGC,GAAS,GACrD,KAAK,QAAQ,KAAK,MAAmBD,CAAS;AAAA,EAClD;AACJ;AAsBO,SAASE,GACZvU,GACyB;AACzB,QAAM,EAAE,cAAAwU,GAAc,SAAAnH,GAAS,WAAAgH,GAAW,SAAAC,GAAS,SAAAG,IAAU,MAAM,YAAAC,MAAe1U,GAE5E2U,IAAK,IAAIR,GAAuBK,GAAcnH,GAASgH,GAAWC,CAAO,GACzEM,IAAQD,EAAG;AAEjB,WAASE,EAAUh4C,GAAai4C,GAAuB;AACnD,WAAI,CAACJ,KAAc,CAACI,IAAcj4C,IAC3B,EAAE,GAAGA,GAAM,CAAC63C,CAAU,GAAGI,EAAA;AAAA,EACpC;AAEA,iBAAernB,EAAKqnB,GAAgBjvC,IAA8B,IAAsB;AACpF,UAAM,EAAE,SAAAgjC,IAAU4L,GAAS,SAAAM,IAAU,IAAO,OAAAlf,GAAO,QAAApX,GAAQ,QAAA3Y,MAAWD;AAEtE,QAAImvC,IACAN,KAAcI,IAAQF,EAAM,MAAMF,CAAU,EAAE,OAAOI,CAAK,IAAIF,EAAM,aAAA;AAExE,IAAI9uC,MAAQkvC,IAAaA,EAAW,OAAOlvC,CAAM;AAEjD,QAAIvK,IACAstC,MAAY4L,IAAU,MAAMO,EAAW,YAAY,MAAMA,EAAW,OAAOnM,CAAO;AAEtF,WAAIkM,MAASx5C,IAAQA,EAAM,QAAA,IACvBkjB,MAAQljB,IAAQA,EAAM,MAAMkjB,CAAM,IAClC,OAAOoX,KAAU,iBAAkBt6B,EAAM,MAAM,GAAGs6B,CAAK,IACpDt6B;AAAA,EACX;AAEA,SAAO;AAAA,IACH,KAAK,CAACsB,GAAMi4C,MAAUF,EAAM,IAAIC,EAAUh4C,GAAMi4C,CAAK,CAAC;AAAA,IACtD,SAAS,CAACv5C,GAAOu5C,MACbF,EAAM,QAAQr5C,EAAM,IAAI,CAACsB,MAASg4C,EAAUh4C,GAAMi4C,CAAK,CAAC,CAAC;AAAA,IAC7D,KAAK,CAAC11C,MAAQw1C,EAAM,IAAIx1C,CAAG;AAAA,IAC3B,MAAAquB;AAAA,IACA,QAAQ,CAACruB,GAAK61C,MAAYL,EAAM,OAAOx1C,GAAK61C,CAA4B;AAAA,IACxE,YAAY,OAAOH,GAAOG,MAAY;AAClC,YAAMC,IAAOD;AACb,aAAIP,KAAcI,IACPF,EAAM,MAAMF,CAAU,EAAE,OAAOI,CAAK,EAAE,OAAOI,CAAI,IAErDN,EAAM,eAAe,OAAOM,CAAI;AAAA,IAC3C;AAAA,IACA,QAAQ,CAAC91C,MAAQw1C,EAAM,OAAOx1C,CAAG;AAAA,IACjC,OAAO,OAAO01C,MAAU;AACpB,UAAIJ,KAAcI,GAAO;AACrB,cAAMF,EAAM,MAAMF,CAAU,EAAE,OAAOI,CAAK,EAAE,OAAA;AAC5C;AAAA,MACJ;AACA,YAAMF,EAAM,MAAA;AAAA,IAChB;AAAA,IACA,OAAO,CAACE,MACAJ,KAAcI,IACPF,EAAM,MAAMF,CAAU,EAAE,OAAOI,CAAK,EAAE,MAAA,IAE1CF,EAAM,MAAA;AAAA,IAEjB,KAAKA;AAAA,IACL,IAAAD;AAAA,EAAA;AAER;AC3IO,SAASQ,KAA4C;AACxD,QAAM,GAAG7jC,CAAQ,IAAIpV,EAAuB,IAAI;AAChD,SAAOG,EAAY,CAAC0I,MAAmB;AACnC,IAAAuM,EAAS,MAAM;AACX,YAAMvM,aAAiB,QAAQA,IAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC;AAAA,IAClE,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AACT;AC+CO,SAASqwC,GAGd,EAAE,MAAA50C,GAAM,OAAA0D,GAAO,YAAAY,GAAY,UAAAqX,GAAU,SAAA4pB,GAAS,UAAApoC,KAA4C;AACxF,QAAMijC,IAAUyU,GAAA,GACVC,IAAkBvP,KAAWnF,GAAS;AAC5C,MAAI,CAAC0U;AACD,UAAM,IAAI;AAAA,MACN;AAAA,IAAA;AAIR,SACI,gBAAA54C;AAAA,IAAC64C;AAAA,IAAA;AAAA,MACG,MAAA/0C;AAAA,MACA,SAAS80C;AAAA,MACT,QAAQ,CAAC,EAAE,OAAAE,GAAO,YAAAC,QAAiB;AAC/B,YAAI,CAACC,GAAe/3C,CAAQ,EAAG,QAAOA;AACtC,cAAMg4C,IAAeF,EAAW,OAAO;AACvC,eAAO34B,GAAanf,GAA+C;AAAA,UAC/D,MAAM63C,EAAM;AAAA,UACZ,OAAOA,EAAM;AAAA,UACb,UAAUA,EAAM;AAAA,UAChB,QAAQA,EAAM;AAAA,UACd,KAAKA,EAAM;AAAA,UACX,OAAAtxC;AAAA,UACA,YAAYyxC,IAAe,SAAY7wC;AAAA,UACvC,OAAO6wC;AAAA,UACP,UAAAx5B;AAAA,UACA,gBAAgB,CAAC,CAACw5B;AAAA,QAAA,CACrB;AAAA,MACL;AAAA,IAAA;AAAA,EAAA;AAGZ;AC5EO,SAASC,GACZjV,GACAkV,GACoC;AACpC,QAAM/nC,IAAS6yB,EAAO,UAAUkV,CAAM;AACtC,MAAI/nC,EAAO;AACP,WAAO,EAAE,SAAS,IAAM,MAAMA,EAAO,MAAM,QAAQ,GAAC;AAExD,QAAMgoC,IAAiC,CAAA;AACvC,aAAWC,KAASjoC,EAAO,MAAM,QAAQ;AACrC,UAAM4xB,IAAOqW,EAAM,KAAK,WAAW,IAAI,UAAUA,EAAM,KAAK,KAAK,GAAG;AACpE,IAAMrW,KAAQoW,MAASA,EAAOpW,CAAI,IAAIqW,EAAM;AAAA,EAChD;AACA,SAAO,EAAE,SAAS,IAAO,QAAAD,EAAA;AAC7B;ACfO,SAASE,GACZrV,GAC0B;AAC1B,SAAO,OAAOkV,GAAQI,GAAUpwC,MAAY;AACxC,UAAMiI,IAAS6yB,EAAO,UAAUkV,CAAM;AACtC,QAAI/nC,EAAO;AACP,aAAO,EAAE,QAAQA,EAAO,MAAM,QAAQ,CAAA,EAAC;AAG3C,UAAMgoC,IAAiD,CAAA,GACjDI,IAAerwC,EAAQ,gBAAgB;AAE7C,eAAWkwC,KAASjoC,EAAO,MAAM,QAAQ;AACrC,YAAM4xB,IAAOqW,EAAM,KAAK,WAAW,IAAI,UAAUA,EAAM,KAAK,KAAK,GAAG;AACpE,MAAIG,MAAiB,gBAAgBJ,EAAOpW,CAAI,MAChDoW,EAAOpW,CAAI,IAAI,EAAE,MAAMqW,EAAM,MAAM,SAASA,EAAM,QAAA;AAAA,IACtD;AAEA,WAAO,EAAE,QAAQ,CAAA,GAAI,QAAAD,EAAA;AAAA,EACzB;AACJ;AC9BO,SAASK,GAGdxV,GAAiB96B,IAAmD,IAA4B;AAC9F,SAAOuwC,GAAiB;AAAA,IACpB,GAAGvwC;AAAA,IACH,UAAUmwC,GAAYrV,CAAM;AAAA,EAAA,CAC/B;AACL;ACxBA,SAAS0V,GAAW56C,GAAuB;AACvC,SAAOA,EAAM,QAAQ,OAAO,EAAE;AAClC;AAMO,SAAS66C,GAAY76C,GAAwB;AAChD,QAAM0e,IAASk8B,GAAW56C,CAAK;AAE/B,MADI0e,EAAO,WAAW,MAClB,YAAY,KAAKA,CAAM,EAAG,QAAO;AAErC,QAAMo8B,IAAUp8B,EAAO,MAAM,EAAE,EAAE,IAAI,MAAM;AAE3C,MAAIq8B,IAAM;AACV,WAAS/tC,IAAI,GAAGA,IAAI,GAAGA,IAAK,CAAA+tC,KAAOD,EAAQ9tC,CAAC,KAAM,KAAKA;AACvD,MAAIguC,IAASD,IAAM,KAAM;AAEzB,MADIC,MAAU,OAAIA,IAAQ,IACtBA,MAAUF,EAAQ,CAAC,EAAG,QAAO;AAEjC,EAAAC,IAAM;AACN,WAAS/tC,IAAI,GAAGA,IAAI,IAAIA,IAAK,CAAA+tC,KAAOD,EAAQ9tC,CAAC,KAAM,KAAKA;AACxD,SAAAguC,IAASD,IAAM,KAAM,IACjBC,MAAU,OAAIA,IAAQ,IACnBA,MAAUF,EAAQ,EAAE;AAC/B;AAMO,SAASG,GAAaj7C,GAAwB;AACjD,QAAM0e,IAASk8B,GAAW56C,CAAK;AAE/B,MADI0e,EAAO,WAAW,MAClB,YAAY,KAAKA,CAAM,EAAG,QAAO;AAErC,QAAMo8B,IAAUp8B,EAAO,MAAM,EAAE,EAAE,IAAI,MAAM,GAErCw8B,IAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAC9CC,IAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEvD,MAAIJ,IAAM;AACV,WAAS/tC,IAAI,GAAGA,IAAI,IAAIA,UAAY8tC,EAAQ9tC,CAAC,IAAKkuC,EAASluC,CAAC;AAC5D,MAAIguC,IAAQD,IAAM;AAElB,MADAC,IAAQA,IAAQ,IAAI,IAAI,KAAKA,GACzBA,MAAUF,EAAQ,EAAE,EAAG,QAAO;AAElC,EAAAC,IAAM;AACN,WAAS/tC,IAAI,GAAGA,IAAI,IAAIA,UAAY8tC,EAAQ9tC,CAAC,IAAKmuC,EAASnuC,CAAC;AAC5D,SAAAguC,IAAQD,IAAM,IACdC,IAAQA,IAAQ,IAAI,IAAI,KAAKA,GACtBA,MAAUF,EAAQ,EAAE;AAC/B;AAGO,SAASM,GAAUp7C,GAAuB;AAC7C,SAAO46C,GAAW56C,CAAK,EAClB,MAAM,GAAG,CAAC,EACV,QAAQ,eAAe,OAAO;AACvC;AAGO,SAASq7C,GAAWr7C,GAAuB;AAC9C,SAAO46C,GAAW56C,CAAK,EAClB,MAAM,GAAG,EAAE,EACX,QAAQ,eAAe,OAAO,EAC9B,QAAQ,eAAe,OAAO,EAC9B,QAAQ,eAAe,OAAO,EAC9B,QAAQ,eAAe,OAAO;AACvC;AAGO,SAASs7C,GAAOt7C,GAAuB;AAC1C,SAAO46C,GAAW56C,CAAK;AAC3B;AChEA,SAASu7C,GACLC,GACAC,IAAgE,WAClE;AACE,SAAOjzC,EAA+C,SAClD,EAAE,OAAAxI,GAAO,UAAAE,GAAU,GAAGiC,EAAA,GACtByG,GACF;AACE,WACI,gBAAA3H;AAAA,MAACgL;AAAA,MAAA;AAAA,QACI,GAAG9J;AAAA,QACJ,KAAAyG;AAAA,QACA,OAAO4yC,EAAKx7C,KAAS,EAAE;AAAA,QACvB,WAAAy7C;AAAA,QACA,UAAU,CAAC31C,MAAU5F,EAASs7C,EAAK11C,EAAM,OAAO,KAAK,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGlE,CAAC;AACL;AAEO,MAAM41C,KAAWH,GAAYpc,EAAS,GAChCwc,KAAYJ,GAAYF,EAAU,GAClCO,KAAaL,GAAYrc,IAAa,KAAK,GAC3C2c,KAAWN,GAAYH,EAAS;AAY7C,SAASU,GAAYj3B,GAAejG,GAAgBkG,GAA0B;AAC1E,SAAO,IAAI,KAAK,aAAalG,GAAQ,EAAE,OAAO,YAAY,UAAAkG,GAAU,EAAE,OAAOD,IAAQ,GAAG;AAC5F;AAEA,SAASk3B,GAAWxiC,GAAsB;AACtC,QAAMmF,IAASnF,EAAK,QAAQ,OAAO,EAAE;AACrC,SAAKmF,IACE,OAAO,SAASA,GAAQ,EAAE,IADb;AAExB;AAOO,MAAMs9B,KAAaxzC,EAA8C,SACpE,EAAE,OAAAxI,GAAO,UAAAE,GAAU,UAAA4kB,IAAW,OAAO,QAAAlG,IAAS,SAAS,GAAGzc,EAAA,GAC1DyG,GACF;AACE,SACI,gBAAA3H;AAAA,IAACgL;AAAA,IAAA;AAAA,MACI,GAAG9J;AAAA,MACJ,KAAAyG;AAAA,MACA,MAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAOkzC,GAAY97C,KAAS,GAAG4e,GAAQkG,CAAQ;AAAA,MAC/C,UAAU,CAAChf,MAAU5F,EAAS67C,GAAWj2C,EAAM,OAAO,KAAK,CAAC;AAAA,IAAA;AAAA,EAAA;AAGxE,CAAC;AC9CM,SAASm2C,KAA6B;AACzC,QAAM,CAACz0C,GAASuM,CAAU,IAAItT,EAAkB,EAAK,GAC/C,CAAC6I,GAAO49B,CAAQ,IAAIzmC,EAAwB,IAAI,GAChD,CAACmf,GAAMqnB,CAAO,IAAIxmC,EAA8B,IAAI,GAEpD4yC,IAASzyC,EAAY,OAAOs7C,MAA8C;AAC5E,UAAMx9B,IAASw9B,EAAI,QAAQ,OAAO,EAAE;AACpC,QAAIx9B,EAAO,WAAW;AAClB,aAAAwoB,EAAS,eAAe,GACjB;AAEX,IAAAnzB,EAAW,EAAI,GACfmzB,EAAS,IAAI;AACb,QAAI;AAEA,YAAMiV,IAAQ,OADG,MAAM,MAAM,4BAA4Bz9B,CAAM,QAAQ,GAC1C,KAAA;AAC7B,aAAI,UAAUy9B,KAAQA,EAAK,QACvBjV,EAAS,qBAAqB,GAC9BD,EAAQ,IAAI,GACL,SAEXA,EAAQkV,CAAI,GACLA;AAAA,IACX,SAASlW,GAAK;AACV,aAAAiB,EAASjB,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,GAClD;AAAA,IACX,UAAA;AACI,MAAAlyB,EAAW,EAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAAA,CAAE,GAECyd,IAAQ5wB,EAAY,MAAM;AAC5B,IAAAmT,EAAW,EAAK,GAChBmzB,EAAS,IAAI,GACbD,EAAQ,IAAI;AAAA,EAChB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,SAAAz/B,GAAS,OAAA8B,GAAO,MAAAsW,GAAM,QAAAyzB,GAAQ,OAAA7hB,EAAA;AAC3C;ACtBA,SAASujB,GAAiBziB,GAAgB;AACtC,MAAI;AACA,WAAO,KAAK,MAAMA,CAAG;AAAA,EACzB,QAAQ;AACJ,WAAOA;AAAA,EACX;AACJ;AAUO,SAAS8pB,GACZzhB,GACAvwB,IAAqC,IAClB;AACnB,QAAM;AAAA,IACF,WAAAiyC;AAAA,IACA,YAAAlH,IAAa;AAAA,IACb,gBAAAC,IAAiB;AAAA,IACjB,YAAAC,IAAa;AAAA,IACb,cAAAiH,IAAe;AAAA,IACf,aAAAC,IAAc,KAAK,UAAU,EAAE,MAAM,QAAQ;AAAA,IAC7C,QAAA5W,IAASoP;AAAA,IACT,QAAAO;AAAA,IACA,WAAAC;AAAA,IACA,SAAAvzC;AAAA,IACA,SAAAskB;AAAA,IACA,gBAAAkvB;AAAA,EAAA,IACAprC;AAEJ,MAAIoyC,IAA2B,MAC3B/G,IAAmD,MACnDgH,IAAmD,MACnDrW,IAAU,GACV/gC,IAA0B,QAC1BqwC,IAAS;AAEb,WAAS3J,EAAUhrC,GAA6B;AAC5C,IAAIsE,MAAWtE,MACfsE,IAAStE,GACTy0C,IAAiBz0C,CAAI;AAAA,EACzB;AAEA,WAAS27C,IAAkB;AACvB,IAAID,MACA,cAAcA,CAAS,GACvBA,IAAY;AAAA,EAEpB;AAEA,WAASE,IAAkB;AACvB,IAAI,CAACL,KAAgBA,KAAgB,MACrCI,EAAA,GACAD,IAAY,YAAY,MAAM;AAC1B,MAAID,GAAQ,eAAe,UAAU,QACjCA,EAAO,KAAKD,CAAW;AAAA,IAE/B,GAAGD,CAAY;AAAA,EACnB;AAEA,WAAS3G,IAA0B;AAC/B,QAAID,EAAQ;AACZ,QAAItP,KAAW+O,GAAY;AACvB,MAAApJ,EAAU,OAAO;AACjB;AAAA,IACJ;AACA,UAAMjV,IAAQ,KAAK,IAAIse,IAAiB,KAAKhP,GAASiP,CAAU;AAChE,IAAAjP,KAAW,GACXqP,IAAa,WAAWG,GAAS9e,CAAK;AAAA,EAC1C;AAEA,WAAS8e,IAAgB;AACrB,QAAIF,EAAQ;AACZ,IAAI8G,MACAA,EAAO,SAAS,MAChBA,EAAO,YAAY,MACnBA,EAAO,UAAU,MACjBA,EAAO,UAAU,MACjBA,EAAO,MAAA,IAEXzQ,EAAU,YAAY;AAEtB,UAAM6Q,IAAK,IAAI,UAAUjiB,GAAK0hB,CAAS;AACvC,IAAAG,IAASI,GAETA,EAAG,SAAS,CAAC92C,MAAU;AACnB,MAAAsgC,IAAU,GACV2F,EAAU,MAAM,GAChB4Q,EAAA,GACArH,IAASxvC,CAAK;AAAA,IAClB,GAEA82C,EAAG,YAAY,CAAC92C,MAAU;AACtB,YAAMwsB,IAAM,OAAOxsB,EAAM,QAAS,WAAWA,EAAM,OAAO;AAC1D,MAAAyvC,IAAY;AAAA,QACR,MAAM5P,EAAOrT,CAAG;AAAA,QAChB,KAAKxsB;AAAA,MAAA,CACR;AAAA,IACL,GAEA82C,EAAG,UAAU,CAAC92C,MAAU;AACpB,MAAAwgB,IAAUxgB,CAAK;AAAA,IACnB,GAEA82C,EAAG,UAAU,CAAC92C,MAAU;AACpB,MAAA42C,EAAA,GACA16C,IAAU8D,CAAK,GACf02C,IAAS,MACTzQ,EAAU,QAAQ,GACd,CAAC2J,KAAU,CAAC5vC,EAAM,YAClB6vC,EAAA;AAAA,IAER;AAAA,EACJ;AAEA,WAASkH,EAAKvU,GAAqE;AAC/E,WAAIkU,GAAQ,eAAe,UAAU,OAAa,MAClDA,EAAO,KAAKlU,CAAO,GACZ;AAAA,EACX;AAEA,WAASr7B,EAAMy2B,GAAeZ,GAAuB;AACjD,IAAA4S,IAAS,IACLD,MACA,aAAaA,CAAU,GACvBA,IAAa,OAEjBiH,EAAA,GACAtW,IAAU,GACNoW,MACAzQ,EAAU,SAAS,GACnByQ,EAAO,MAAM9Y,GAAMZ,CAAM,GACzB0Z,IAAS,OAEbzQ,EAAU,QAAQ;AAAA,EACtB;AAEA,WAAS+J,IAAkB;AACvB,IAAIL,MACA,aAAaA,CAAU,GACvBA,IAAa,OAEjBrP,IAAU,GACVsP,IAAS,IACTE,EAAA;AAAA,EACJ;AAEA,SAAAA,EAAA,GAEO;AAAA,IACH,MAAAiH;AAAA,IACA,OAAA5vC;AAAA,IACA,WAAA6oC;AAAA,IACA,IAAI,SAAS;AACT,aAAOzwC;AAAA,IACX;AAAA,EAAA;AAER;ACnLO,SAASy3C,GACZniB,GACAvwB,IAAkC,IACb;AACrB,QAAM,EAAE,SAAAklC,IAAU,IAAM,WAAAiG,GAAW,GAAG1sB,MAASze,GACzC,CAAC/E,GAAQ0mC,CAAS,IAAItrC,EAA0B,MAAM,GACtD,CAACu1C,GAAaC,CAAc,IAAIx1C,EAAqC,IAAI,GACzEs8C,IAAgBj0C,EAAmC,IAAI,GAEvDqtC,IAAertC,EAAOysC,CAAS;AACrC,EAAAY,EAAa,UAAUZ,GAEvBzxC,EAAU,MAAM;AACZ,QAAI,CAACwrC,KAAW,CAAC3U,GAAK;AAClB,MAAAoR,EAAU,MAAM;AAChB;AAAA,IACJ;AAEA,UAAMqK,IAAagG,GAAmBzhB,GAAK;AAAA,MACvC,GAAG9R;AAAA,MACH,gBAAgBkjB;AAAA,MAChB,WAAW,CAACtK,MAAY;AACpB,QAAAwU,EAAexU,CAAO,GACtB0U,EAAa,UAAU1U,CAAO;AAAA,MAClC;AAAA,IAAA,CACH;AACD,WAAAsb,EAAc,UAAU3G,GAEjB,MAAM;AACT,MAAAA,EAAW,MAAA,GACX2G,EAAc,UAAU;AAAA,IAC5B;AAAA,EAEJ,GAAG,CAACpiB,GAAK2U,CAAO,CAAC;AAEjB,QAAMuN,IAAOj8C;AAAA,IACT,CAAC0nC,MACUyU,EAAc,SAAS,KAAKzU,CAAO,KAAK;AAAA,IAEnD,CAAA;AAAA,EAAC,GAGCwN,IAAYl1C,EAAY,MAAY;AACtC,IAAAm8C,EAAc,SAAS,UAAA;AAAA,EAC3B,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,QAAA13C,GAAQ,aAAA2wC,GAAa,MAAA6G,GAAM,WAAA/G,EAAA;AACxC;ACpEO,MAAMkH,KAA0B,KAM1BC,KAAwB,IAOxBC,KAA4D;AAAA,EACrE,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,KAAK;AACT;AAUO,SAASC,GACZnxC,GACAoxC,GACM;AACN,SAAOA,IAAUpxC,CAAI,KAAKkxC,GAA8BlxC,CAAI,KAAK;AACrE;AA+BO,SAASqxC,GACZC,GACAC,GACAvxC,IAAmB,OACnB5B,IAAiC,IACnB;AACd,QAAM;AAAA,IACF,gBAAAozC,IAAiBR;AAAA,IACjB,aAAAS,IAAcR;AAAA,IACd,qBAAAS;AAAA,EAAA,IACAtzC;AAEJ,MAAIqzC,KAAe;AACf,UAAM,IAAI,WAAW,oCAAoC;AAE7D,MAAID,KAAkB;AAClB,UAAM,IAAI,WAAW,uCAAuC;AAGhE,QAAMG,IAAaC,GAAYN,GAAQC,CAAW,IAAIC,GAEhDK,IADcF,IAAaF,IAAe,KACXN,GAAenxC,GAAM0xC,CAAmB;AAE7E,SAAO;AAAA,IACH,MAAA1xC;AAAA,IACA,aAAa2xC;AAAA,IACb,kBAAkBE;AAAA,IAClB,QAAQ;AAAA,EAAA;AAEhB;AC1FO,SAASC,GAAYC,GAAiD;AACzE,MAAIA,EAAO,WAAW,EAAG,QAAO;AAEhC,MAAIC,IAAcD,EAAO,CAAC,EAAE,UACxBE,IAAcF,EAAO,CAAC,EAAE,UACxBG,IAAeH,EAAO,CAAC,EAAE,WACzBI,IAAeJ,EAAO,CAAC,EAAE;AAE7B,aAAWK,KAASL;AAChB,IAAIK,EAAM,WAAWJ,MAAaA,IAAcI,EAAM,WAClDA,EAAM,WAAWH,MAAaA,IAAcG,EAAM,WAClDA,EAAM,YAAYF,MAAcA,IAAeE,EAAM,YACrDA,EAAM,YAAYD,MAAcA,IAAeC,EAAM;AAG7D,SAAO,EAAE,aAAAJ,GAAa,aAAAC,GAAa,cAAAC,GAAc,cAAAC,EAAA;AACrD;AAGO,SAASE,GAAaC,GAA+B;AACxD,SAAO;AAAA,IACH,WAAWA,EAAO,cAAcA,EAAO,eAAe;AAAA,IACtD,YAAYA,EAAO,eAAeA,EAAO,gBAAgB;AAAA,EAAA;AAEjE;AAYO,SAASC,GAAaD,GAAmB35C,IAAQ,KAAgB;AACpE,QAAM65C,IAAUF,EAAO,cAAcA,EAAO,aACtCG,IAAUH,EAAO,eAAeA,EAAO,cACvCI,IAASF,IAAU75C,KAAS,MAC5Bg6C,IAASF,IAAU95C,KAAS;AAElC,SAAO;AAAA,IACH,aAAa25C,EAAO,cAAcI;AAAA,IAClC,aAAaJ,EAAO,cAAcI;AAAA,IAClC,cAAcJ,EAAO,eAAeK;AAAA,IACpC,cAAcL,EAAO,eAAeK;AAAA,EAAA;AAE5C;ACIO,SAASC,GAAkBx0C,GAA6C;AAC3E,QAAM,EAAE,SAAAy0C,GAAS,OAAAC,IAAQ,WAAW,OAAO,qBAAApB,MAAwBtzC,GAC7D20C,IAAiBF,EAAQ,QAAQ,QAAQ,EAAE;AAEjD,SAAO;AAAA,IACH,MAAM,MAAMvB,GAAQC,GAAayB,IAAe,CAAA,GAA6B;AACzE,YAAMhzC,IAAOgzC,EAAa,QAAQ,OAC5BC,IAAS,GAAG3B,EAAO,SAAS,IAAIA,EAAO,QAAQ,IAAIC,EAAY,SAAS,IAAIA,EAAY,QAAQ,IAChG5iB,IAAM,GAAGokB,CAAc,qBAAqBE,CAAM;AAExD,UAAI3W;AACJ,UAAI;AAEA,QAAAA,IAAW,OADM,MAAMwW,EAAMnkB,CAAG,GACN,KAAA;AAAA,MAC9B,SAASukB,GAAO;AACZ,cAAM,IAAI,MAAM,wBAAwB,OAAOA,CAAK,CAAC,IAAI,EAAE,OAAAA,GAAO;AAAA,MACtE;AAEA,YAAM5O,IAAQhI,EAAQ,SAAS,CAAC;AAChC,UAAIA,EAAQ,SAAS,QAAQ,CAACgI;AAC1B,cAAM,IAAI,MAAM,iCAAiChI,EAAQ,QAAQ,SAAS,GAAG;AAGjF,YAAMqV,IAAarN,EAAM,WAAW,KAE9BuN,IADavN,EAAM,WAAW,KACC6M,GAAenxC,GAAM0xC,CAAmB;AAE7E,aAAO;AAAA,QACH,MAAA1xC;AAAA,QACA,aAAa2xC;AAAA,QACb,kBAAkBE;AAAA,QAClB,QAAQ;AAAA,MAAA;AAAA,IAEhB;AAAA,EAAA;AAER;AC9BO,SAASsB,GAAsB/0C,IAAwC,IAAqB;AAC/F,QAAM;AAAA,IACF,eAAAg1C,IAAgB;AAAA,IAChB,WAAAC,IAAY;AAAA,IACZ,iBAAAtpB;AAAA,IACA,UAAAupB;AAAA,IACA,SAAAh5B;AAAA,IACA,gBAAAkvB;AAAA,EAAA,IACAprC;AAEJ,MAAI2zC,IAAuB,CAAA,GACvBJ,IAAa,GACb4B,IAA8B,MAC9BtpB,IAAyB,MACzB5wB,IAAwB;AAE5B,WAAS0mC,EAAUhrC,GAA2B;AAC1C,IAAIsE,MAAWtE,MACfsE,IAAStE,GACTy0C,IAAiBz0C,CAAI;AAAA,EACzB;AAEA,WAASy+C,EAAe79B,GAAqC;AACzD,UAAMy8B,IAAoB;AAAA,MACtB,UAAUz8B,EAAS,OAAO;AAAA,MAC1B,WAAWA,EAAS,OAAO;AAAA,MAC3B,WAAWA,EAAS;AAAA,MACpB,UAAUA,EAAS,OAAO;AAAA,IAAA;AAG9B,QAAI49B,GAAU;AACV,YAAM/pC,IAAOooC,GAAY2B,GAAUnB,CAAK;AACxC,UAAI5oC,IAAO4pC,EAAe;AAC1B,MAAAzB,KAAcnoC;AAAA,IAClB;AAEA,IAAA+pC,IAAWnB,GACXL,EAAO,KAAKK,CAAK,GACbL,EAAO,SAASsB,MAChBtB,IAASA,EAAO,MAAMA,EAAO,SAASsB,CAAS,IAEnDC,IAAWvB,CAAM;AAAA,EACrB;AAEA,WAAS0B,EAAYn2C,GAAuC;AACxD,IAAAyiC,EAAU,OAAO,GACjBzlB,IAAUhd,CAAK;AAAA,EACnB;AAEA,WAASkN,IAAc;AACnB,QAAIyf,MAAY,MAChB;AAAA,UAAI,OAAO,YAAc,OAAe,CAAC,UAAU,aAAa;AAC5D,QAAA8V,EAAU,OAAO;AACjB;AAAA,MACJ;AACA,MAAAA,EAAU,UAAU,GACpB9V,IAAU,UAAU,YAAY,cAAcupB,GAAgBC,GAAa1pB,CAAe;AAAA;AAAA,EAC9F;AAEA,WAASkiB,IAAa;AAClB,IAAIhiB,MAAY,QAAQ,OAAO,YAAc,OAAe,UAAU,eAClE,UAAU,YAAY,WAAWA,CAAO,GAE5CA,IAAU,MACV8V,EAAU,MAAM;AAAA,EACpB;AAEA,WAAS5S,IAAc;AACnB,IAAA8e,EAAA,GACA8F,IAAS,CAAA,GACTJ,IAAa,GACb4B,IAAW,MACXD,IAAWvB,CAAM;AAAA,EACrB;AAEA,SAAO;AAAA,IACH,OAAAvnC;AAAA,IACA,MAAAyhC;AAAA,IACA,OAAA9e;AAAA,IACA,IAAI,SAAS;AACT,aAAO4kB;AAAA,IACX;AAAA,IACA,IAAI,aAAa;AACb,aAAOJ;AAAA,IACX;AAAA,IACA,IAAI,SAAS;AACT,aAAOt4C;AAAA,IACX;AAAA,EAAA;AAER;ACtGO,SAASq6C,GACZt1C,IAAqC,IACb;AACxB,QAAM,EAAE,WAAAu1C,IAAY,IAAO,SAAAr5B,GAAS,GAAGs5B,MAAmBx1C,GAEpD,CAAC2zC,GAAQ8B,CAAS,IAAIp/C,EAAgC,CAAA,CAAE,GACxD,CAACk9C,GAAYmC,CAAa,IAAIr/C,EAAiB,CAAC,GAChD,CAAC4E,GAAQ0mC,CAAS,IAAItrC,EAAwB,MAAM,GAEpDs/C,IAAaj3C,EAA+B,IAAI,GAChDk3C,IAAal3C,EAAOwd,CAAO;AACjC,EAAA05B,EAAW,UAAU15B,GAErBxiB,EAAU,MAAM;AACZ,UAAMm8C,IAAUd,GAAsB;AAAA,MAClC,GAAGS;AAAA,MACH,UAAU,CAAC7+C,MAAS;AAChB,QAAA8+C,EAAU,CAAC,GAAG9+C,CAAI,CAAC,GACnB++C,EAAcG,EAAQ,UAAU;AAAA,MACpC;AAAA,MACA,gBAAgBlU;AAAA,MAChB,SAAS,CAACziC,MAAU02C,EAAW,UAAU12C,CAAK;AAAA,IAAA,CACjD;AACD,WAAAy2C,EAAW,UAAUE,GACjBN,OAAmB,MAAA,GAEhB,MAAM;AACT,MAAAM,EAAQ,KAAA,GACRF,EAAW,UAAU;AAAA,IACzB;AAAA,EAIJ,GAAG,CAAA,CAAE;AAEL,QAAMvpC,IAAQ5V,EAAY,MAAYm/C,EAAW,SAAS,MAAA,GAAS,EAAE,GAC/D9H,IAAOr3C,EAAY,MAAYm/C,EAAW,SAAS,KAAA,GAAQ,EAAE,GAC7D5mB,IAAQv4B,EAAY,MAAY;AAClC,IAAAm/C,EAAW,SAAS,MAAA,GACpBD,EAAc,CAAC;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACH,QAAA/B;AAAA,IACA,WAAWA,EAAO,SAAS,IAAIA,EAAOA,EAAO,SAAS,CAAC,IAAI;AAAA,IAC3D,YAAAJ;AAAA,IACA,QAAAt4C;AAAA,IACA,YAAYA,MAAW;AAAA,IACvB,OAAAmR;AAAA,IACA,MAAAyhC;AAAA,IACA,OAAA9e;AAAA,EAAA;AAER;;;;;;;;;;;;;;GC/FM+mB,KAAoB75B;AAAA,EAAK,MAC3B,OAAO,2BAAe,EAAE,KAAK,CAAC85B,OAAO,EAAE,SAASA,EAAE,oBAAoB;AAC1E,GAiCMC,KAAgB,CAAC,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI;AAGrF,SAASC,GAAYC,GAAoBC,GAAmD;AACxF,QAAMC,IAAQF,IAAaC;AAC3B,MAAIE,IAAiBL,GAAc,CAAC;AACpC,aAAW5qC,KAAQ4qC;AACf,IAAI5qC,KAAQgrC,MAAOC,IAASjrC;AAEhC,SAAO,EAAE,IAAIirC,GAAQ,QAAQA,IAASH,EAAA;AAC1C;AAGA,SAASI,GAAYC,GAAoB;AACrC,SAAOA,IAAK,IAAI,GAAG,KAAK,MAAMA,IAAK,GAAI,CAAC,OAAO,GAAGA,IAAK,MAAM,IAAIA,IAAKA,EAAG,QAAQ,CAAC,CAAC;AACvF;AAgBO,SAASC,GAAc;AAAA,EAC1B,QAAA7C;AAAA,EACA,SAAAr6C;AAAA,EACA,QAAAkS,IAAS;AAAA,EACT,SAAAmyB,IAAU;AAAA,EACV,UAAA8Y,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,OAAAx4C,IAAQ;AAAA,EACR,SAAAy4C;AAAA,EACA,eAAAC;AAAA,EACA,WAAAhhD;AAAA,EACA,OAAAyE;AAAA,EACA,GAAGikB;AACP,GAAuB;AACnB,QAAMtG,IAAezZ,EAAuB,IAAI,GAC1C,CAACrF,GAAOI,CAAQ,IAAIpD,EAAiB,GAAG;AAE9C,EAAAqD,EAAU,MAAM;AACZ,UAAMkF,IAAOuZ,EAAa;AAC1B,QAAI,CAACvZ,KAAQ,OAAO,iBAAmB,IAAa;AACpD,UAAM6Z,IAAW,IAAI,eAAe,CAAC8R,MAAY;AAC7C,YAAMysB,IAAWzsB,EAAQ,CAAC,GAAG,YAAY;AACzC,MAAIysB,KAAYA,IAAW,KAAGv9C,EAASu9C,CAAQ;AAAA,IACnD,CAAC;AACD,WAAAv+B,EAAS,QAAQ7Z,CAAI,GACd,MAAM6Z,EAAS,WAAA;AAAA,EAC1B,GAAG,CAAA,CAAE;AAEL,QAAMw+B,IAAY37C;AAAA,IACd,MAAM,CAAC,GAAGq4C,GAAQ,GAAIr6C,IAAU,CAACA,CAAO,IAAI,CAAA,GAAK,GAAIw9C,KAAW,EAAG;AAAA,IACnE,CAACnD,GAAQr6C,GAASw9C,CAAO;AAAA,EAAA,GAGvBI,IAAM57C,EAAQ,MAAM;AACtB,UAAMkvB,IAAMkpB,GAAYuD,CAAS;AACjC,QAAI,CAACzsB,EAAK,QAAO;AAEjB,UAAM2sB,IAAaC,GAAcjD,GAAa3pB,GAAK,IAAI,GAAGnxB,GAAOmS,GAAQ,EAAE,SAAAmyB,GAAS,GAC9E0Z,IAAuB1D,EAAO,IAAI,CAACjQ,OAAMyT,EAAW,QAAQzT,EAAC,CAAC,GAC9D4T,IAAWD,EAAO,IAAI,CAAC3T,OAAM,GAAGA,GAAE,EAAE,QAAQ,CAAC,CAAC,IAAIA,GAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,GAE5E6T,IAAaF,EAAO,CAAC,KAAK,MAC1BG,IAAWH,EAAO,SAAS,IAAIA,EAAOA,EAAO,SAAS,CAAC,IAAI,MAC3DI,IAAen+C,IAAU69C,EAAW,QAAQ79C,CAAO,IAAI,MAIvDo+C,IAAc;AAAA,MAChB,WAAWltB,EAAI,cAAcA,EAAI,eAAe;AAAA,MAChD,YAAYA,EAAI,eAAeA,EAAI,gBAAgB;AAAA,IAAA,GAEjDmtB,IAASR,EAAW,QAAQO,CAAW,GACvCE,IAAUT,EAAW,QAAQ,EAAE,GAAGO,GAAa,WAAWltB,EAAI,cAAc,GAC5EqtB,IAASrE,GAAYkE,GAAa,EAAE,GAAGA,GAAa,WAAWltB,EAAI,cAAc,GACjFstB,IAAa,KAAK,IAAIF,EAAQ,IAAID,EAAO,CAAC,KAAK,GAC/CzB,IAAa2B,IAASC,KAAc,GAEpCC,MAAgBjB,KAAW,CAAA,GAAI,IAAI,CAACf,QAAO,EAAE,QAAQA,IAAG,GAAGoB,EAAW,QAAQpB,EAAC,IAAI;AAEzF,WAAO,EAAE,UAAAuB,GAAU,YAAAC,GAAY,UAAAC,GAAU,cAAAC,GAAc,YAAAvB,GAAY,cAAA6B,GAAA;AAAA,EACvE,GAAG,CAACd,GAAWtD,GAAQr6C,GAASw9C,GAASz9C,GAAOmS,GAAQmyB,CAAO,CAAC;AAGhE,MAAIiZ;AACA,WACI,gBAAA//C;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKshB;AAAA,QACL,WAAWrhB,EAAGC,EAAO,KAAKhB,CAAS;AAAA,QACnC,OAAO,EAAE,QAAAyV,GAAQ,GAAGhR,EAAA;AAAA,QACpB,MAAK;AAAA,QACL,cAAY6D;AAAA,QACX,GAAGogB;AAAA,QAEJ,UAAA,gBAAA5nB,EAACswC,MAAS,UAAU,gBAAAtwC,EAAC,SAAI,WAAWE,EAAO,SAAS,UAAA,mBAAA,CAAgB,GAChE,UAAA,gBAAAF;AAAA,UAACi/C;AAAA,UAAA;AAAA,YACG,QAAAnC;AAAA,YACA,SAAAr6C;AAAA,YACA,SAAAs9C;AAAA,YACA,iBAAAC;AAAA,YACA,aAAAF;AAAA,UAAA;AAAA,QAAA,EACJ,CACJ;AAAA,MAAA;AAAA,IAAA;AAMZ,QAAMqB,IACFtB,KAAaQ,KAAOA,EAAI,aAAa,IAC/BjB,GAAYiB,EAAI,YAAY,KAAK,IAAI,KAAK79C,IAAQ,IAAI,CAAC,IACvD;AAEV,SACI,gBAAAxC;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAKshB;AAAA,MACL,WAAWrhB,EAAGC,EAAO,KAAKhB,CAAS;AAAA,MACnC,OAAO,EAAE,QAAAyV,GAAQ,GAAGhR,EAAA;AAAA,MACpB,MAAK;AAAA,MACL,cAAY6D;AAAA,MACX,GAAGogB;AAAA,MAEH,UAACy4B,IAGE,gBAAA9/C;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWL,EAAO;AAAA,UAClB,OAAM;AAAA,UACN,QAAAyU;AAAA,UACA,SAAS,OAAOnS,CAAK,IAAImS,CAAM;AAAA,UAC/B,qBAAoB;AAAA,UAEnB,UAAA;AAAA,YAAAirC,KACG,gBAAAr/C,EAAC,KAAA,EAAE,WAAWL,EAAO,MAChB,UAAA;AAAA,cAAA,CAAC,MAAM,KAAK,IAAI,EAAE,IAAI,CAACkhD,MACpB,gBAAAphD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAI;AAAA,kBACJ,IAAI2U,IAASysC;AAAA,kBACb,IAAI5+C;AAAA,kBACJ,IAAImS,IAASysC;AAAA,gBAAA;AAAA,gBAJR,IAAIA,CAAC;AAAA,cAAA,CAMjB;AAAA,cACA,CAAC,MAAM,KAAK,IAAI,EAAE,IAAI,CAACA,MACpB,gBAAAphD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAIwC,IAAQ4+C;AAAA,kBACZ,IAAI;AAAA,kBACJ,IAAI5+C,IAAQ4+C;AAAA,kBACZ,IAAIzsC;AAAA,gBAAA;AAAA,gBAJC,IAAIysC,CAAC;AAAA,cAAA,CAMjB;AAAA,YAAA,GACL;AAAA,YAGHf,EAAI,YACD,gBAAArgD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAWE,EAAO;AAAA,gBAClB,QAAQmgD,EAAI;AAAA,gBACZ,MAAK;AAAA,gBACL,QAAQP;AAAA,gBACR,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAInBO,EAAI,cACD,gBAAArgD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAWE,EAAO;AAAA,gBAClB,IAAImgD,EAAI,WAAW;AAAA,gBACnB,IAAIA,EAAI,WAAW;AAAA,gBACnB,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,YAGVA,EAAI,YAAY,CAAC59C,KACd,gBAAAzC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAWE,EAAO;AAAA,gBAClB,IAAImgD,EAAI,SAAS;AAAA,gBACjB,IAAIA,EAAI,SAAS;AAAA,gBACjB,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,YAGVA,EAAI,gBACD,gBAAA9/C,EAAA4B,GAAA,EACI,UAAA;AAAA,cAAA,gBAAAnC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,WAAWE,EAAO;AAAA,kBAClB,IAAImgD,EAAI,aAAa;AAAA,kBACrB,IAAIA,EAAI,aAAa;AAAA,kBACrB,GAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEP,gBAAArgD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,WAAWE,EAAO;AAAA,kBAClB,IAAImgD,EAAI,aAAa;AAAA,kBACrB,IAAIA,EAAI,aAAa;AAAA,kBACrB,GAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YACP,GACJ;AAAA,YAGHA,EAAI,aAAa,IAAI,CAAC,EAAE,QAAAgB,GAAQ,GAAAxU,EAAA,GAAK9gC,MAAM;AACxC,oBAAM1F,IAAc,EAAQ65C;AAC5B,qBACI,gBAAAlgD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,WAAWE,EAAO;AAAA,kBAClB,IAAI2sC,EAAE;AAAA,kBACN,IAAIA,EAAE;AAAA,kBACN,GAAGwU,EAAO,UAAU;AAAA,kBACpB,OAAOA,EAAO,QAAQ,EAAE,MAAMA,EAAO,UAAU;AAAA,kBAC/C,kBAAgBA,EAAO,MAAMt1C;AAAA,kBAC7B,UAAU1F,IAAc,IAAI;AAAA,kBAC5B,MAAMA,IAAc,WAAW;AAAA,kBAC/B,cAAYg7C,EAAO;AAAA,kBACnB,SAASh7C,IAAc,MAAM65C,IAAgBmB,GAAQt1C,CAAC,IAAI;AAAA,kBAC1D,WACI1F,IACM,CAACP,MAAM;AACH,qBAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SAC/BA,EAAE,eAAA,GACFo6C,IAAgBmB,GAAQt1C,CAAC;AAAA,kBAEjC,IACA;AAAA,kBAGT,YAAO,QAAQ,gBAAA/L,EAAC,SAAA,EAAO,UAAAqhD,EAAO,OAAM,IAAW;AAAA,gBAAA;AAAA,gBAtB3CA,EAAO,MAAMt1C;AAAA,cAAA;AAAA,YAyB9B,CAAC;AAAA,YAEAo1C,KACG,gBAAA5gD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAWL,EAAO;AAAA,gBAClB,WAAW,aAAa4mC,CAAO,KAAKnyB,IAASmyB,CAAO;AAAA,gBAEpD,UAAA;AAAA,kBAAA,gBAAA9mC,EAAC,QAAA,EAAK,IAAI,GAAG,IAAI,GAAG,IAAImhD,EAAM,QAAQ,IAAI,EAAA,CAAG;AAAA,kBAC7C,gBAAAnhD,EAAC,UAAK,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,EAAA,CAAG;AAAA,kBACnC,gBAAAA,EAAC,QAAA,EAAK,IAAImhD,EAAM,QAAQ,IAAI,IAAI,IAAIA,EAAM,QAAQ,IAAI,EAAA,CAAG;AAAA,kBACzD,gBAAAnhD,EAAC,QAAA,EAAK,GAAGmhD,EAAM,SAAS,GAAG,GAAG,IAAI,YAAW,UACxC,UAAA1B,GAAY0B,EAAM,EAAE,EAAA,CACzB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACJ;AAAA,QAAA;AAAA,MAAA,IArHR,gBAAAnhD,EAAC,OAAA,EAAI,WAAWE,EAAO,OAAO,6CAA+B;AAAA,IAuH7D;AAAA,EAAA;AAIhB;AClSO,SAASohD,GAAgBn4C,IAAkC,IAAmB;AACjF,QAAM,EAAE,YAAAmI,IAAa,iBAAiB,cAAAkgC,IAAe,aAAaroC;AAElE,MAAI,OAAO,SAAW;AAClB,WAAOqoC,MAAiB,SAAS,SAAS;AAG9C,MAAI+P,IAA2B;AAC/B,MAAI;AACA,IAAAA,IAAS,OAAO,aAAa,QAAQjwC,CAAU;AAAA,EACnD,QAAQ;AACJ,IAAAiwC,IAAS;AAAA,EACb;AAEA,QAAMx2C,IAAkBw2C,KAAU/P;AAClC,SAAIzmC,MAAS,UAAUA,MAAS,UAAgBA,IAEzC,OAAO,WAAW,8BAA8B,EAAE,UAAU,SAAS;AAChF;AAUO,SAASy2C,GAAgBr4C,IAAkC,IAAY;AAC1E,QAAMmI,IAAanI,EAAQ,cAAc,iBACnCqoC,IAAeroC,EAAQ,gBAAgB;AAC7C,SAAO;AAAA;AAAA,YAEC,KAAK,UAAUmI,CAAU,CAAC;AAAA,YAC1B,KAAK,UAAUkgC,CAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtC,KAAA;AACF;ACxBA,MAAMiQ,KAAqB,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAE5D,SAASC,GAAUnuB,GAAqBouB,GAA0B;AAC9D,SAAOF,GAAO,QAAQE,CAAK,KAAKF,GAAO,QAAQluB,CAAS;AAC5D;AAGO,MAAMquB,KAA0B,CAAC,EAAE,OAAAD,GAAO,SAAAnhB,GAAS,SAAA0D,QAAc;AACpE,QAAMH,IAAS4d,MAAU,UAAU,QAAQA;AAC3C,EAAIzd,IACA,QAAQH,CAAM,EAAEvD,GAAS0D,CAAO,IAEhC,QAAQH,CAAM,EAAEvD,CAAO;AAE/B;AAMO,SAASqhB,GAAa14C,IAA+B,IAAY;AACpE,QAAMoqB,IAAYpqB,EAAQ,SAAS,QAC7B24C,IAAQ34C,EAAQ,SAAS,CAACy4C,EAAW,GACrCG,IAAY54C,EAAQ,aAAa;AAEvC,WAAS6K,EAAK2tC,GAAiBnhB,GAAiB0D,GAAyC;AACrF,QAAI,CAACwd,GAAUnuB,GAAWouB,CAAK,EAAG;AAClC,UAAM71C,IAAkB;AAAA,MACpB,OAAA61C;AAAA,MACA,SAASI,IAAY,IAAIA,CAAS,KAAKvhB,CAAO,KAAKA;AAAA,MACnD,SAAA0D;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAExB,eAAW8d,KAAQF;AACf,UAAI;AACA,QAAAE,EAAKl2C,CAAK;AAAA,MACd,QAAQ;AAAA,MAER;AAAA,EAER;AAEA,SAAO;AAAA,IACH,OAAO,CAAC00B,GAAS0D,MAAYlwB,EAAK,SAASwsB,GAAS0D,CAAO;AAAA,IAC3D,MAAM,CAAC1D,GAAS0D,MAAYlwB,EAAK,QAAQwsB,GAAS0D,CAAO;AAAA,IACzD,MAAM,CAAC1D,GAAS0D,MAAYlwB,EAAK,QAAQwsB,GAAS0D,CAAO;AAAA,IACzD,OAAO,CAAC1D,GAAS0D,MAAYlwB,EAAK,SAASwsB,GAAS0D,CAAO;AAAA,IAC3D,OAAO,CAAC+d,MACJJ,GAAa;AAAA,MACT,OAAOtuB;AAAA,MACP,OAAAuuB;AAAA,MACA,WAAWC,IAAY,GAAGA,CAAS,IAAIE,CAAc,KAAKA;AAAA,IAAA,CAC7D;AAAA,EAAA;AAEb;ACjFA,MAAMC,KAAmB/vC,GAAuC,IAAI;AAW7D,SAASgwC,GAAkB,EAAE,SAAAC,GAAS,UAAAnhD,KAAoC;AAC7E,EAAA4B,EAAU,OACDu/C,EAAQ,OAAA,GACN,MAAM;AACT,IAAKA,EAAQ,QAAA;AAAA,EACjB,IACD,CAACA,CAAO,CAAC;AACZ,QAAMrjD,IAAQ0F,EAAQ,MAAM29C,GAAS,CAACA,CAAO,CAAC;AAC9C,SAAO,gBAAApiD,EAACkiD,GAAiB,UAAjB,EAA0B,OAAAnjD,GAAe,UAAAkC,EAAA,CAAS;AAC9D;AAMO,SAASohD,KAAwC;AACpD,SAAOnvC,GAAWgvC,EAAgB;AACtC;AC1BO,MAAMI,KAA4C;AAAA,EACrD,SAAS7b,GAAM;AACX,YAAQ,KAAK,wBAAwBA,CAAI;AAAA,EAC7C;AAAA,EACA,MAAM5hC,GAAO;AACT,YAAQ,KAAK,qBAAqBA,EAAM,MAAMA,EAAM,UAAU;AAAA,EAClE;AAAA,EACA,iBAAiBwD,GAAO67B,GAAS;AAC7B,YAAQ,MAAM,yBAAyB77B,GAAO67B,CAAO;AAAA,EACzD;AACJ;ACkBA,SAASqe,GAAa9b,GAA4D;AAC9E,MAAIA,MAAS,KAAM,QAAO;AAC1B,QAAM,EAAE,IAAA7mC,GAAI,OAAA4iD,GAAO,MAAA1+C,GAAM,QAAA2+C,MAAWhc;AACpC,SAAO;AAAA,IACH,GAAI7mC,MAAO,SAAY,EAAE,IAAAA,MAAO;AAAA,IAChC,GAAI4iD,MAAU,SAAY,EAAE,OAAAA,MAAU;AAAA,IACtC,GAAI1+C,MAAS,SAAY,EAAE,UAAUA,MAAS;AAAA,IAC9C,GAAI2+C,KAAU;AAAA,EAAA;AAEtB;AAyBO,SAASC,GACZv5C,GACgB;AAChB,QAAM,EAAE,QAAAw5C,GAAQ,aAAAC,GAAa,cAAAC,IAAe,KAAM,oBAAAC,IAAqB,UAAU35C;AAEjF,SAAO;AAAA,IACH,OAAO;AACH,MAAIy5C,KAAeD,EAAO,QACtBA,EAAO,KAAKC,CAAW;AAAA,IAE/B;AAAA,IACA,SAASnc,GAA4B;AACjC,MAAAkc,EAAO,QAAQJ,GAAa9b,CAAI,CAAC;AAAA,IACrC;AAAA,IACA,MAAM5hC,GAAuB;AACzB,MAAA89C,EAAO,cAAc;AAAA,QACjB,UAAUG;AAAA,QACV,SAASj+C,EAAM;AAAA,QACf,OAAO;AAAA,QACP,GAAIA,EAAM,aAAa,EAAE,MAAMA,EAAM,eAAe;AAAA,MAAA,CACvD;AAAA,IACL;AAAA,IACA,iBAAiBwD,GAAgB67B,GAAmC;AAChE,MAAAye,EAAO,iBAAiBt6C,GAAO67B,IAAU,EAAE,OAAOA,EAAA,IAAY,MAAS;AAAA,IAC3E;AAAA,IACA,MAAM,QAAQ;AACV,MAAIye,EAAO,SACP,MAAMA,EAAO,MAAME,CAAY;AAAA,IAEvC;AAAA,EAAA;AAER;AC7EA,SAASE,GAAiBtc,GAA8C;AACpE,QAAM,EAAE,OAAA+b,GAAO,MAAA1+C,GAAM,QAAA2+C,EAAA,IAAWhc;AAChC,SAAO;AAAA,IACH,GAAI+b,MAAU,SAAY,EAAE,OAAAA,MAAU;AAAA,IACtC,GAAI1+C,MAAS,SAAY,EAAE,MAAAA,MAAS;AAAA,IACpC,GAAI2+C,KAAU;AAAA,EAAA;AAEtB;AAuBO,SAASO,GACZ75C,GACgB;AAChB,QAAM,EAAE,SAAA85C,GAAS,MAAA9gB,EAAA,IAASh5B;AAE1B,SAAO;AAAA,IACH,OAAO;AACH,MAAIg5B,KAAQ8gB,EAAQ,QAChBA,EAAQ,KAAK9gB,EAAK,QAAQA,EAAK,OAAO;AAAA,IAE9C;AAAA,IACA,SAASsE,GAA4B;AACjC,UAAIA,MAAS,MAAM;AACf,QAAAwc,EAAQ,QAAA;AACR;AAAA,MACJ;AACA,MAAIxc,EAAK,OAAO,UAChBwc,EAAQ,SAASxc,EAAK,IAAIsc,GAAiBtc,CAAI,CAAC;AAAA,IACpD;AAAA,IACA,MAAM5hC,GAAuB;AACzB,MAAAo+C,EAAQ,QAAQp+C,EAAM,MAAMA,EAAM,UAAU;AAAA,IAChD;AAAA,IACA,iBAAiBwD,GAAgB67B,GAAmC;AAChE,UAAI+e,EAAQ,kBAAkB;AAC1B,QAAAA,EAAQ,iBAAiB56C,GAAO67B,CAAO;AACvC;AAAA,MACJ;AACA,YAAMc,IAAM38B,aAAiB,QAAQA,IAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC;AACpE,MAAA46C,EAAQ,QAAQ,cAAc;AAAA,QAC1B,oBAAoBje,EAAI;AAAA,QACxB,iBAAiBA,EAAI;AAAA,QACrB,4BAA4BA,EAAI;AAAA,QAChC,GAAGd;AAAA,MAAA,CACN;AAAA,IACL;AAAA,EAAA;AAER;ACpFA,MAAMgf,KAAsB/wC,GAA0C,IAAI;AAQnE,SAASgxC,GAAqB,EAAE,SAAAf,GAAS,UAAAnhD,KAAuC;AACnF,QAAMlC,IAAQ0F,EAAQ,MAAM29C,GAAS,CAACA,CAAO,CAAC;AAC9C,SAAAv/C,EAAU,MAAA;AAAA,KAAiB,CAAC9D,CAAK,CAAC,GAC3B,gBAAAiB,EAACkjD,GAAoB,UAApB,EAA6B,OAAAnkD,GAAe,UAAAkC,EAAA,CAAS;AACjE;AAEA,SAASmiD,KAAkC;AACvC,QAAM7iC,IAAMrN,GAAWgwC,EAAmB;AAC1C,MAAI,CAAC3iC,EAAK,OAAM,IAAI,MAAM,gDAAgD;AAC1E,SAAOA;AACX;AAQO,SAAS8iC,GAAe3gD,GAAa1D,IAAe,IAAgB;AACvE,QAAMojD,IAAUgB,GAAA,GACV7M,IAAY,CAACtiC,MACfmuC,EAAQ,WAAWA,EAAQ,SAASnuC,CAAQ,IAAI;KAC9C2kB,IAAM,MAAewpB,EAAQ,UAAU1/C,GAAK1D,CAAY;AAC9D,SAAOskD,GAAqB/M,GAAW3d,GAAKA,CAAG;AACnD;AAMO,SAAS2qB,GAA8C7gD,GAAa1D,GAAqB;AAC5F,QAAMojD,IAAUgB,GAAA,GACV7M,IAAY,CAACtiC,MACfmuC,EAAQ,WAAWA,EAAQ,SAASnuC,CAAQ,IAAI;KAC9C2kB,IAAM,MAASwpB,EAAQ,IAAO1/C,GAAK1D,CAAY;AACrD,SAAOskD,GAAqB/M,GAAW3d,GAAKA,CAAG;AACnD;ACtCO,SAAS4qB,GAAoBr6C,IAAgC,IAElE;AACE,QAAMs6C,IAAmC,EAAE,GAAIt6C,EAAQ,WAAW,CAAA,EAAC,GAC7D0K,wBAAgB,IAAA;AAEtB,WAAS6vC,IAAe;AACpB,eAAWzvC,KAAYJ,EAAW,CAAAI,EAAA;AAAA,EACtC;AAEA,SAAO;AAAA,IACH,UAAUvR,GAAK1D,IAAe,IAAO;AACjC,aAAO0D,KAAO+gD,IAAQ,EAAQA,EAAM/gD,CAAG,IAAK1D;AAAA,IAChD;AAAA,IACA,IAAqC0D,GAAa1D,GAAqB;AACnE,aAAQ0D,KAAO+gD,IAASA,EAAM/gD,CAAG,IAAW1D;AAAA,IAChD;AAAA,IACA,SAASiV,GAAU;AACf,aAAAJ,EAAU,IAAII,CAAQ,GACf,MAAMJ,EAAU,OAAOI,CAAQ;AAAA,IAC1C;AAAA,IACA,IAAIvR,GAAK3D,GAAO;AACZ,MAAA0kD,EAAM/gD,CAAG,IAAI3D,GACb2kD,EAAA;AAAA,IACJ;AAAA,EAAA;AAER;ACEO,SAASC,GACZx6C,GACmB;AACnB,QAAM,EAAE,YAAAy6C,MAAez6C,GACjB0K,wBAAgB,IAAA;AACtB,MAAIgwC,IAAoB;AAExB,WAASC,IAAuB;AAC5B,IAAID,KAAqB,CAACD,EAAW,gBACrCC,IAAoB,IACpBD,EAAW,YAAY,MAAM;AACzB,iBAAW3vC,KAAYJ,EAAW,CAAAI,EAAA;AAAA,IACtC,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACH,UAAUvR,GAAa1D,IAAe,IAAO;AACzC,YAAMD,IAAQ6kD,EAAW,KAAKlhD,CAAG;AACjC,aAAI,OAAO3D,KAAU,YAAkBA,IAChCC;AAAA,IACX;AAAA,IACA,IAAqC0D,GAAa1D,GAAqB;AACnE,aAAO4kD,EAAW,gBAAgBlhD,GAAK1D,CAAiB;AAAA,IAC5D;AAAA,IACA,SAASiV,GAAU;AACf,aAAA6vC,EAAA,GACAjwC,EAAU,IAAII,CAAQ,GACf,MAAM;AACT,QAAAJ,EAAU,OAAOI,CAAQ;AAAA,MAC7B;AAAA,IACJ;AAAA,EAAA;AAER;ACjCO,SAAS8vC,GACZ56C,GACmB;AACnB,QAAM,EAAE,QAAAoiC,MAAWpiC;AAEnB,SAAO;AAAA,IACH,UAAUzG,GAAa1D,IAAe,IAAO;AACzC,aAAOusC,EAAO,UAAmB7oC,GAAK1D,CAAY,MAAM;AAAA,IAC5D;AAAA,IACA,IAAqC0D,GAAa1D,GAAqB;AACnE,aAAOusC,EAAO,UAAa7oC,GAAK1D,CAAiB;AAAA,IACrD;AAAA,IACA,SAASiV,GAAU;AACf,aAAI,CAACs3B,EAAO,MAAM,CAACA,EAAO,MACf,MAAM;AAAA,MAAC,KAElBA,EAAO,GAAG,UAAUt3B,CAAQ,GACrB,MAAM;AACT,QAAAs3B,EAAO,IAAK,UAAUt3B,CAAQ;AAAA,MAClC;AAAA,IACJ;AAAA,EAAA;AAER;ACpCA,eAAsB+vC,GAAM3c,GAA6C;AACrE,MAAI,OAAO,YAAc,OAAe,EAAE,WAAW;AACjD,WAAO,EAAE,QAAQ,IAAO,aAAa,IAAM,WAAW,GAAA;AAE1D,MAAIA,EAAQ,SAAS,CAAC,UAAU,WAAW,EAAE,OAAOA,EAAQ,MAAA,CAAO;AAC/D,WAAO,EAAE,QAAQ,IAAO,aAAa,IAAM,WAAW,GAAA;AAE1D,MAAI;AACA,iBAAM,UAAU,MAAMA,CAAO,GACtB,EAAE,QAAQ,IAAM,aAAa,IAAO,WAAW,GAAA;AAAA,EAC1D,SAASh/B,GAAO;AACZ,WAAIA,aAAiB,gBAAgBA,EAAM,SAAS,eACzC,EAAE,QAAQ,IAAO,aAAa,IAAO,WAAW,GAAA,IAEpD,EAAE,QAAQ,IAAO,aAAa,IAAO,WAAW,IAAO,OAAAA,EAAA;AAAA,EAClE;AACJ;AAGO,SAAS47C,KAA4B;AACxC,SAAO,OAAO,YAAc,OAAe,WAAW;AAC1D;"}
|
|
1
|
+
{"version":3,"file":"tempest-react-sdk.js","sources":["../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.tsx","../src/components/AppBar/AppBar.tsx","../src/hooks/use-breakpoint.ts","../src/components/AppShell/AppShell.tsx","../src/components/AspectRatio/AspectRatio.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.tsx","../src/components/BottomNavigation/BottomNavigation.tsx","../src/components/BottomSheet/BottomSheet.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Center/Center.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/ChipInput/ChipInput.tsx","../src/components/Combobox/Combobox.tsx","../src/components/Modal/Modal.tsx","../src/components/ConfirmDialog/ConfirmDialog.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/Dropzone/Dropzone.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorState/ErrorState.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Form/Form.tsx","../src/components/Layout/Layout.tsx","../src/hooks/use-before-install-prompt.ts","../src/components/InstallBanner/InstallBanner.tsx","../src/components/InstallButton/InstallButton.tsx","../src/components/Kbd/Kbd.tsx","../src/components/ModalsManager/ModalsManager.tsx","../src/components/Navbar/Navbar.tsx","../src/components/NProgress/NProgress.tsx","../src/components/Page/Page.tsx","../src/components/Pagination/Pagination.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/PinInput/PinInput.tsx","../src/components/Popover/Popover.tsx","../src/components/Progress/Progress.tsx","../src/components/Radio/Radio.tsx","../src/components/RangeSlider/RangeSlider.tsx","../src/components/RatingStars/RatingStars.tsx","../src/components/Responsive/Responsive.tsx","../src/components/SafeArea/SafeArea.tsx","../src/components/SearchBar/SearchBar.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Spacer/Spacer.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Stat/Stat.tsx","../src/components/Stepper/Stepper.tsx","../src/utils/numbers.ts","../src/components/StepperInput/StepperInput.tsx","../src/components/Switch/Switch.tsx","../src/components/Tag/Tag.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Timeline/Timeline.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Toast/ToastProvider.tsx","../src/components/VirtualList/VirtualList.tsx","../src/components/CopyButton/CopyButton.tsx","../src/utils/relative-time.ts","../src/components/RelativeTime/RelativeTime.tsx","../src/components/Money/Money.tsx","../src/components/TruncateText/TruncateText.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Portal/Portal.tsx","../src/components/ClickOutside/ClickOutside.tsx","../src/components/ConditionalWrapper/ConditionalWrapper.tsx","../src/components/For/For.tsx","../src/components/ErrorText/ErrorText.tsx","../src/components/Image/Image.tsx","../src/components/DataList/DataList.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Toggle/Toggle.tsx","../src/components/ToggleGroup/ToggleGroup.tsx","../src/components/Label/Label.tsx","../src/components/Collapsible/Collapsible.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/HoverCard/HoverCard.tsx","../src/hooks/use-focus-trap.ts","../src/components/Command/Command.tsx","../src/components/ScrollArea/ScrollArea.tsx","../src/components/Resizable/Resizable.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Slider/Slider.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/components/Menubar/Menubar.tsx","../src/components/Carousel/Carousel.tsx","../src/hooks/use-pagination.ts","../src/hooks/use-client-filter.ts","../src/hooks/use-media-query.ts","../src/hooks/use-event-listener.ts","../src/hooks/use-local-storage.ts","../src/hooks/use-toggle.ts","../src/hooks/use-async.ts","../src/hooks/use-online.ts","../src/hooks/use-document-visibility.ts","../src/hooks/use-intersection-observer.ts","../src/hooks/use-resize-observer.ts","../src/hooks/use-clipboard.ts","../src/hooks/use-keyboard-shortcut.ts","../src/hooks/use-idle.ts","../src/hooks/use-geolocation.ts","../src/hooks/use-scroll-lock.ts","../src/hooks/use-stable-callback.ts","../src/hooks/use-deep-memo.ts","../src/hooks/use-previous.ts","../src/hooks/use-interval.ts","../src/hooks/use-timeout.ts","../src/hooks/use-throttle.ts","../src/hooks/use-window-size.ts","../src/hooks/use-hover.ts","../src/hooks/use-long-press.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-list-state.ts","../src/hooks/use-counter.ts","../src/hooks/use-document-title.ts","../src/hooks/use-favicon.ts","../src/hooks/use-map.ts","../src/hooks/use-set.ts","../src/hooks/use-queue.ts","../src/hooks/use-click-outside.ts","../src/hooks/use-is-first-render.ts","../src/hooks/use-object-url.ts","../src/hooks/use-long-press-handlers.ts","../src/hooks/pwa-env.ts","../src/hooks/use-install-prompt.ts","../src/components/DataTable/DataTable.tsx","../src/components/ListTile/ListTile.tsx","../src/components/FloatingActionButton/FloatingActionButton.tsx","../src/components/NavigationRail/NavigationRail.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/RefreshIndicator/RefreshIndicator.tsx","../src/utils/format.ts","../src/utils/storage.ts","../src/utils/strings.ts","../src/utils/arrays.ts","../src/utils/objects.ts","../src/utils/guards.ts","../src/utils/functions.ts","../src/utils/promises.ts","../src/utils/ids.ts","../src/utils/xlsx.ts","../src/http/errors.ts","../src/http/api-client.ts","../src/http/parse-response.ts","../src/http/upload-with-progress.ts","../src/http/retry.ts","../src/http/idempotency.ts","../src/http/use-poll.ts","../src/auth/create-auth-store.ts","../src/auth/AuthGuard.tsx","../src/auth/jwt.ts","../src/auth/lazy-with-retry.ts","../src/auth/refresh-queue.ts","../src/auth/create-tempest-auth.ts","../src/access/access-control-context.tsx","../src/access/use-can.ts","../src/access/Can.tsx","../src/access/create-role-access-control.ts","../src/access/permissions-from-token.ts","../src/oauth/GoogleSignIn.tsx","../src/oauth/use-oauth-callback.ts","../src/query/constants.ts","../src/query/create-query-keys.ts","../src/query/QueryProvider.tsx","../src/query/pagination.ts","../src/query/use-paginated-query.ts","../src/query/use-cursor-query.ts","../src/data/create-data-provider.ts","../src/data/data-provider-context.tsx","../src/data/use-resource.ts","../src/router/RouteGuard.tsx","../src/router/AppRouter.tsx","../src/store/create-store.ts","../src/store/create-selectors.ts","../src/theme/ThemeProvider.tsx","../src/i18n/create-i18n.ts","../src/i18n/I18nProvider.tsx","../src/error-boundary/ErrorBoundary.tsx","../src/app/AppProviders.tsx","../src/sse/create-event-stream.ts","../src/sse/use-event-stream.ts","../src/push/utils.ts","../src/push/web-push-client.ts","../src/push/use-push-subscription.ts","../src/audio/audio-player.ts","../src/audio/use-audio.ts","../src/offline/create-offline-store.ts","../src/offline/create-offline-sync.ts","../src/error-boundary/use-error-handler.ts","../src/forms/FormField.tsx","../src/forms/validate-form.ts","../src/forms/zod-resolver.ts","../src/forms/use-zod-form.ts","../src/forms/br-validators.ts","../src/forms/masked-inputs.tsx","../src/forms/use-viacep.ts","../src/ws/create-web-socket.ts","../src/ws/use-web-socket.ts","../src/geo/estimate.ts","../src/geo/bounds.ts","../src/geo/routing.ts","../src/geo/create-position-tracker.ts","../src/geo/use-position-tracker.ts","../src/geo/TrajectoryMap.tsx","../src/theme/initial-theme.ts","../src/logger/logger.ts","../src/telemetry/TelemetryProvider.tsx","../src/telemetry/console-adapter.ts","../src/telemetry/sentry-adapter.ts","../src/telemetry/posthog-adapter.ts","../src/feature-flags/FeatureFlagsProvider.tsx","../src/feature-flags/in-memory-adapter.ts","../src/feature-flags/growthbook-adapter.ts","../src/feature-flags/launchdarkly-adapter.ts","../src/share/share.ts","../src/share/share-or-download.ts"],"sourcesContent":["import { useCallback, useId, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Accordion.module.css\";\n\nexport interface AccordionItem {\n /** Stable identifier. */\n id: string;\n title: ReactNode;\n children: ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** When `true` multiple items can be open simultaneously. Default `false`. */\n multiple?: boolean;\n /** Controlled open ids. */\n value?: string[];\n /** Uncontrolled default open ids. */\n defaultValue?: string[];\n onChange?: (openIds: string[]) => void;\n className?: string;\n}\n\n/**\n * Accessible accordion. Each item collapses/expands its content. Single-mode by\n * default — pass `multiple` to allow more than one item open at a time. Can be\n * controlled via `value` + `onChange`, or uncontrolled via `defaultValue`.\n */\nexport function Accordion({\n items,\n multiple = false,\n value,\n defaultValue = [],\n onChange,\n className,\n}: AccordionProps) {\n const reactId = useId();\n const isControlled = value !== undefined;\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultValue);\n const openIds = isControlled ? value : internalOpen;\n\n const toggle = useCallback(\n (id: string): void => {\n const isOpen = openIds.includes(id);\n const next = multiple\n ? isOpen\n ? openIds.filter((x) => x !== id)\n : [...openIds, id]\n : isOpen\n ? []\n : [id];\n if (!isControlled) setInternalOpen(next);\n onChange?.(next);\n },\n [openIds, multiple, isControlled, onChange],\n );\n\n return (\n <div className={cn(styles.accordion, className)}>\n {items.map((item) => {\n const open = openIds.includes(item.id);\n const panelId = `${reactId}-${item.id}-panel`;\n const triggerId = `${reactId}-${item.id}-trigger`;\n return (\n <div key={item.id} className={cn(styles.item, open && styles.open)}>\n <h3 className={styles.header}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={open}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n >\n <span>{item.title}</span>\n <ChevronIcon className={styles.chevron} />\n </button>\n </h3>\n {open && (\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={styles.panel}\n >\n {item.children}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Alert.module.css\";\n\nexport type AlertVariant = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\nexport type AlertAppearance = \"soft\" | \"solid\" | \"outline\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n variant?: AlertVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: AlertAppearance;\n title?: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Show a close button and invoke this when clicked. */\n onClose?: () => void;\n /** Custom close button label for screen readers. */\n closeLabel?: string;\n}\n\n/**\n * Inline alert / notice with tone (info/success/warning/danger) and appearance\n * (soft/solid/outline). Accepts optional `icon`, `title`, `description` and\n * a dismiss button via `onClose`.\n */\nexport function Alert({\n variant = \"info\",\n appearance = \"soft\",\n title,\n description,\n icon,\n onClose,\n closeLabel = \"Dismiss\",\n className,\n children,\n ...props\n}: AlertProps) {\n return (\n <div\n role=\"alert\"\n className={cn(\n styles.alert,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n className,\n )}\n {...props}\n >\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.content}>\n {title && <p className={styles.title}>{title}</p>}\n {description && <p className={styles.description}>{description}</p>}\n {children}\n </div>\n {onClose && (\n <button\n type=\"button\"\n className={styles.close}\n onClick={onClose}\n aria-label={closeLabel}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <path\n d=\"M6 6l12 12M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./AppBar.module.css\";\n\nexport type AppBarTone = \"surface\" | \"primary\" | \"transparent\";\n\nexport interface AppBarProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title — string or any node. Rendered as the bar's `<h1>`. */\n title?: ReactNode;\n /**\n * Replace the whole left slot. When set, the auto back button and `brand`\n * are ignored — you own the leading content.\n */\n leading?: ReactNode;\n /** Show a back button in the left slot. Ignored when `leading` is set. */\n showBack?: boolean;\n /**\n * Back-button handler. Defaults to `window.history.back()`. With a router,\n * pass `onBack={() => navigate(-1)}`.\n */\n onBack?: () => void;\n /** Accessible label for the back button. Default `\"Go back\"`. */\n backLabel?: string;\n /** Custom back icon. Default a left arrow. */\n backIcon?: ReactNode;\n /** Brand / logo node shown in the left slot (after the back button). */\n brand?: ReactNode;\n /** Right slot — action buttons / menu. One node or many. */\n actions?: ReactNode;\n /** Center the title (three-column grid). Default `false` (left-aligned). */\n centered?: boolean;\n /** Stick to the top of the scroll container. Default `true`. */\n sticky?: boolean;\n /** Visual tone. Default `\"surface\"`. */\n tone?: AppBarTone;\n /** Thin bottom border. Default `true`. */\n bordered?: boolean;\n /** Add `env(safe-area-inset-top)` padding (iOS notch / PWA). Default `true`. */\n safeArea?: boolean;\n}\n\n/**\n * Mobile-first top app bar for PWAs — leading (back / brand) + title +\n * trailing actions, sticky with safe-area padding out of the box.\n *\n * Consumers customise via tokens (`--tempest-*`) and slots; the SDK ships the\n * layout, sticky/safe-area behaviour, and accessible back button so apps don't\n * hand-roll one per screen. For a desktop three-slot nav use [[Navbar]].\n *\n * @example\n * // Detail screen with back + a trailing action\n * <AppBar\n * title=\"Profile\"\n * showBack\n * onBack={() => navigate(-1)}\n * actions={<IconButton icon={<Settings />} onClick={openSettings} />}\n * />\n *\n * @example\n * // Home screen — brand left, centered title disabled\n * <AppBar brand={<Logo />} actions={<UserMenu />} />\n */\nexport function AppBar({\n title,\n leading,\n showBack = false,\n onBack,\n backLabel = \"Go back\",\n backIcon,\n brand,\n actions,\n centered = false,\n sticky = true,\n tone = \"surface\",\n bordered = true,\n safeArea = true,\n className,\n ...props\n}: AppBarProps) {\n const handleBack = onBack ?? (() => window.history.back());\n\n const leadingContent = leading ?? (\n <>\n {showBack && (\n <button\n type=\"button\"\n className={styles.iconBtn}\n onClick={handleBack}\n aria-label={backLabel}\n >\n {backIcon ?? <ArrowLeft size={22} aria-hidden=\"true\" />}\n </button>\n )}\n {brand && <span className={styles.brand}>{brand}</span>}\n </>\n );\n\n return (\n <header\n className={cn(\n styles.bar,\n styles[tone],\n centered && styles.centered,\n sticky && styles.sticky,\n bordered && styles.bordered,\n safeArea && styles.safeArea,\n className,\n )}\n {...props}\n >\n <div className={styles.leading}>{leadingContent}</div>\n {title != null && title !== \"\" && (\n <h1 className={styles.title} aria-live=\"polite\">\n {title}\n </h1>\n )}\n <div className={styles.actions}>{actions}</div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./AppShell.module.css\";\n\nexport interface AppShellProps extends HTMLAttributes<HTMLDivElement> {\n /** Top navigation bar (Navbar / custom). Renders on every breakpoint. */\n navbar?: ReactNode;\n /** Side navigation (Sidebar). Hidden below `md` — pair with `<Drawer>` for mobile. */\n sidebar?: ReactNode;\n /** Mobile-only bottom navigation (BottomNavigation). Hidden at `md+`. */\n bottomNav?: ReactNode;\n /** Footer rendered after the main content. */\n footer?: ReactNode;\n /** Breakpoint at which the sidebar appears. Default `\"md\"`. */\n sidebarBreakpoint?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n children?: ReactNode;\n}\n\n/**\n * Full app layout — composes [[Navbar]] + [[Sidebar]] + content +\n * [[BottomNavigation]] + footer with responsive behaviour:\n *\n * - **Desktop (`>= sidebarBreakpoint`)**: navbar + sidebar + main + footer.\n * - **Mobile (`< sidebarBreakpoint`)**: navbar + main + bottom nav + footer\n * (sidebar hidden — app should expose it via `<Drawer>` from a hamburger).\n *\n * @example\n * <AppShell\n * navbar={<Navbar logo={<Brand />} actions={<UserMenu />} />}\n * sidebar={<Sidebar items={...} value={tab} onChange={setTab} />}\n * bottomNav={<BottomNavigation items={...} value={tab} onChange={setTab} />}\n * footer={<Footer />}\n * >\n * <Page title=\"Dashboard\">{content}</Page>\n * </AppShell>\n */\nexport function AppShell({\n navbar,\n sidebar,\n bottomNav,\n footer,\n sidebarBreakpoint = \"md\",\n className,\n children,\n ...props\n}: AppShellProps) {\n const bp = useBreakpoint();\n const showSidebar = bp.above(sidebarBreakpoint);\n return (\n <div className={cn(styles.shell, className)} {...props}>\n {navbar && <div className={styles.navbar}>{navbar}</div>}\n <div className={styles.row}>\n {sidebar && showSidebar && <div className={styles.sidebar}>{sidebar}</div>}\n <main className={styles.main}>{children}</main>\n </div>\n {footer && <div className={styles.footer}>{footer}</div>}\n {bottomNav && !showSidebar && <div className={styles.bottomNav}>{bottomNav}</div>}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./AspectRatio.module.css\";\n\nexport interface AspectRatioProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Width-to-height ratio. Pass `16/9` for widescreen, `1` for square,\n * `4/3` for SD video, `3/4` for portrait, etc. Default `16/9`.\n */\n ratio?: number;\n children?: ReactNode;\n}\n\n/**\n * Preserve a constant aspect ratio for media (images, video, embeds). The\n * inner child stretches to fill the box. Uses the native `aspect-ratio`\n * CSS property — works on all modern browsers (Safari 15+, Chrome 88+).\n *\n * @example\n * <AspectRatio ratio={16 / 9}>\n * <img src=\"/cover.jpg\" alt=\"\" style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }} />\n * </AspectRatio>\n */\nexport function AspectRatio({\n ratio = 16 / 9,\n className,\n style,\n children,\n ...props\n}: AspectRatioProps) {\n const finalStyle: CSSProperties = { aspectRatio: String(ratio), ...style };\n return (\n <div className={cn(styles.aspect, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Avatar.module.css\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\";\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n status?: AvatarStatus;\n className?: string;\n onClick?: () => void;\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0]!.slice(0, 2);\n return `${parts[0]!.charAt(0)}${parts[parts.length - 1]!.charAt(0)}`;\n}\n\n/**\n * Round avatar. Falls back to colored initials when the image fails to load\n * or no `src` is provided. Optional status dot in the bottom-right corner.\n */\nexport function Avatar({\n src,\n alt,\n name = \"\",\n size = \"md\",\n status,\n className,\n onClick,\n}: AvatarProps) {\n const [errored, setErrored] = useState<boolean>(false);\n const initials = useMemo(() => getInitials(name), [name]);\n\n const showImage = src && !errored;\n const role = onClick ? \"button\" : undefined;\n const tabIndex = onClick ? 0 : undefined;\n\n return (\n <span\n className={cn(styles.avatar, styles[size], status && styles.status, className)}\n role={role}\n tabIndex={tabIndex}\n onClick={onClick}\n onKeyDown={\n onClick\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n {showImage ? (\n <img\n src={src}\n alt={alt ?? name}\n className={styles.image}\n onError={() => setErrored(true)}\n />\n ) : (\n <span aria-label={alt ?? name}>{initials}</span>\n )}\n {status && <span className={cn(styles.dot, styles[status])} aria-hidden />}\n </span>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n","import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n","import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n","import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"ghost\"\n | \"soft\"\n | \"outline\"\n | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Card.module.css\";\n\nexport type CardElevation = \"flat\" | \"default\" | \"raised\" | \"elevated\";\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n actions?: ReactNode;\n footer?: ReactNode;\n flush?: boolean;\n /** Hoverable card — adds elevation lift, cursor pointer and focus ring. */\n interactive?: boolean;\n /** Visual elevation level. Defaults to `default` (subtle shadow + border). */\n elevation?: CardElevation;\n}\n\n/**\n * Card container with optional header (title + actions) and footer slot.\n * Use `flush` when you need to host content (tables, lists) without inner padding.\n * Use `interactive` for clickable cards — adds hover lift and focus ring.\n */\nexport function Card({\n title,\n actions,\n footer,\n flush = false,\n interactive = false,\n elevation = \"default\",\n className,\n children,\n ...props\n}: CardProps) {\n const hasHeader = !!(title || actions);\n return (\n <div\n className={cn(\n styles.card,\n elevation === \"flat\" && styles.flat,\n elevation === \"raised\" && styles.raised,\n elevation === \"elevated\" && styles.elevated,\n interactive && styles.interactive,\n !hasHeader && !flush && styles.padded,\n flush && styles.flush,\n className,\n )}\n tabIndex={interactive ? (props.tabIndex ?? 0) : props.tabIndex}\n {...props}\n >\n {hasHeader && (\n <header className={styles.header}>\n {typeof title === \"string\" ? <h3 className={styles.title}>{title}</h3> : title}\n {actions}\n </header>\n )}\n {hasHeader ? <div className={styles.body}>{children}</div> : children}\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Center.module.css\";\n\nexport type CenterAxis = \"both\" | \"horizontal\" | \"vertical\";\n\nexport interface CenterProps extends HTMLAttributes<HTMLDivElement> {\n /** Which axis to center on. Default `\"both\"`. */\n axis?: CenterAxis;\n /** Fixed height for the container. Numbers map to `${n}px`; strings pass through. Useful when centering inside an unsized parent. */\n minHeight?: number | string;\n /** When `true` (default), takes up `100%` width of the parent. */\n fullWidth?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Center children horizontally, vertically, or both. Flex-based; works with\n * any child size. Pair with `minHeight` (or set parent height) when\n * centering vertically.\n *\n * @example\n * <Center axis=\"both\" minHeight=\"100vh\">\n * <Spinner />\n * </Center>\n */\nexport function Center({\n axis = \"both\",\n minHeight,\n fullWidth = true,\n className,\n style,\n children,\n ...props\n}: CenterProps) {\n const finalStyle: CSSProperties = {\n ...(minHeight !== undefined\n ? { minHeight: typeof minHeight === \"number\" ? `${minHeight}px` : minHeight }\n : null),\n ...(fullWidth ? { width: \"100%\" } : null),\n ...style,\n };\n return (\n <div className={cn(styles.center, styles[axis], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import { forwardRef, useEffect, useRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n description?: ReactNode;\n /** Render the box in the indeterminate state regardless of `checked`. */\n indeterminate?: boolean;\n wrapperClassName?: string;\n}\n\n/**\n * Accessible checkbox. Supports a tri-state via `indeterminate` and pairs the\n * input with a label/description column for forms.\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n { label, description, indeterminate, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n const innerRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = Boolean(indeterminate);\n }, [indeterminate]);\n\n function setRef(node: HTMLInputElement | null): void {\n innerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={setRef}\n type=\"checkbox\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.box} aria-hidden>\n {indeterminate ? <DashIcon /> : <CheckIcon />}\n </span>\n {(label || description) && (\n <span className={styles.labelWrap}>\n {label && <span className={styles.label}>{label}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </span>\n )}\n </label>\n );\n});\n\nfunction CheckIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 12l5 5L20 7\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DashIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12h14\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ChipInput.module.css\";\n\nexport interface ChipInputProps {\n value: string[];\n onChange: (next: string[]) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n /** Keys that commit the current draft as a chip. Default: Enter, comma, Tab. */\n commitKeys?: string[];\n /** Lowercase + trim each chip + dedupe. Default: true. */\n normalize?: boolean;\n className?: string;\n}\n\n/**\n * Multi-value input. Type a value and press Enter (or comma / Tab) to push a\n * chip. Backspace on empty input removes the last chip.\n */\nexport function ChipInput({\n value,\n onChange,\n label,\n placeholder = \"Adicionar e pressionar Enter…\",\n helperText,\n error,\n commitKeys = [\"Enter\", \",\", \"Tab\"],\n normalize = true,\n className,\n}: ChipInputProps) {\n const [draft, setDraft] = useState<string>(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n function commit(): void {\n const next = normalize ? draft.trim().toLowerCase() : draft.trim();\n if (!next) return;\n if (value.includes(next)) {\n setDraft(\"\");\n return;\n }\n onChange([...value, next]);\n setDraft(\"\");\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>): void {\n if (commitKeys.includes(event.key)) {\n event.preventDefault();\n commit();\n return;\n }\n if (event.key === \"Backspace\" && !draft && value.length > 0) {\n onChange(value.slice(0, -1));\n }\n }\n\n function remove(index: number): void {\n const next = value.slice();\n next.splice(index, 1);\n onChange(next);\n }\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={styles.field} onClick={() => inputRef.current?.focus()}>\n {value.map((chip, index) => (\n <span key={`${chip}-${index}`} className={styles.chip}>\n {chip}\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={`Remover ${chip}`}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n className={styles.input}\n value={draft}\n placeholder={value.length === 0 ? placeholder : \"\"}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commit}\n />\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Combobox.module.css\";\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n disabled?: boolean;\n /** Custom filter — return true to keep the option. Default is case-insensitive substring match on label. */\n filter?: (option: ComboboxOption, query: string) => boolean;\n /** Message shown when no option matches. */\n emptyMessage?: string;\n className?: string;\n}\n\nfunction defaultFilter(option: ComboboxOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * Combobox — text input with a filterable dropdown of options.\n *\n * Selecting an option fires `onChange(value)`. Typing filters the list.\n * Keyboard: ArrowUp/ArrowDown to navigate, Enter to select, Esc to close.\n */\nexport function Combobox({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione\",\n helperText,\n error,\n disabled,\n filter = defaultFilter,\n emptyMessage = \"Nenhuma opção encontrada\",\n className,\n}: ComboboxProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const selectedLabel = useMemo(\n () => options.find((o) => o.value === value)?.label ?? \"\",\n [options, value],\n );\n\n const filtered = useMemo(\n () => options.filter((o) => filter(o, query)),\n [options, filter, query],\n );\n\n const closeAndReset = useCallback((): void => {\n setOpen(false);\n setQuery(\"\");\n setActiveIndex(0);\n }, []);\n\n const handleSelect = useCallback(\n (option: ComboboxOption): void => {\n if (option.disabled) return;\n onChange(option.value);\n closeAndReset();\n },\n [onChange, closeAndReset],\n );\n\n useEffect(() => {\n if (!open) return;\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n closeAndReset();\n }\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => window.removeEventListener(\"mousedown\", onDown);\n }, [open, closeAndReset]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => Math.min(filtered.length - 1, current + 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((current) => Math.max(0, current - 1));\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const option = filtered[activeIndex];\n if (option) handleSelect(option);\n } else if (event.key === \"Escape\") {\n closeAndReset();\n }\n };\n\n return (\n <div ref={rootRef} className={cn(styles.wrapper, error && styles.error, className)}>\n {label && (\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n id={id}\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={`${id}-listbox`}\n aria-autocomplete=\"list\"\n className={styles.input}\n placeholder={placeholder}\n disabled={disabled}\n value={open ? query : selectedLabel}\n onFocus={() => setOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n <span className={styles.caret} aria-hidden>\n ▾\n </span>\n </div>\n {open && (\n <ul id={`${id}-listbox`} role=\"listbox\" className={styles.menu}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n filtered.map((option, index) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={option.value === value}\n className={cn(\n styles.option,\n index === activeIndex && styles.active,\n option.value === value && styles.selected,\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n handleSelect(option);\n }}\n >\n {option.label}\n </li>\n ))\n )}\n </ul>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Modal.module.css\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n size?: ModalSize;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n className?: string;\n hideCloseButton?: boolean;\n /** Force fullscreen at all breakpoints. */\n fullscreen?: boolean;\n /** Auto-fullscreen on mobile viewports (< 640px). Default `false`. */\n fullscreenOnMobile?: boolean;\n}\n\n/**\n * Portal-rendered modal dialog with backdrop, Esc handler, and slots for\n * header/body/footer. Locks body scroll while open.\n */\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n size = \"md\",\n closeOnBackdrop = true,\n closeOnEsc = true,\n className,\n hideCloseButton = false,\n fullscreen = false,\n fullscreenOnMobile = false,\n}: ModalProps) {\n useEffect(() => {\n if (!open) return;\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n const handleKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handleKey);\n\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className={styles.overlay}\n role=\"presentation\"\n onClick={() => {\n if (closeOnBackdrop) onClose();\n }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(\n styles.dialog,\n sizeClassName(size),\n fullscreen && styles.fullscreen,\n fullscreenOnMobile && styles.fullscreenOnMobile,\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n {(title || !hideCloseButton) && (\n <header className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {!hideCloseButton && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n )}\n </header>\n )}\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction sizeClassName(size: ModalSize): string | undefined {\n if (size === \"2xl\") return styles.size2xl;\n if (size === \"3xl\") return styles.size3xl;\n return styles[size];\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { Input } from \"@/components/Input\";\n\nexport interface DatePickerProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"value\" | \"onChange\" | \"size\"\n> {\n /** ISO date string (`YYYY-MM-DD`) or empty. */\n value: string;\n onChange: (value: string) => void;\n label?: string;\n helperText?: string;\n error?: string;\n /** Lower bound (`YYYY-MM-DD`). */\n min?: string;\n /** Upper bound (`YYYY-MM-DD`). */\n max?: string;\n /** Mode. `date` (default), `datetime-local`, `time`, or `month`. */\n mode?: \"date\" | \"datetime-local\" | \"time\" | \"month\";\n wrapperClassName?: string;\n}\n\n/**\n * Thin wrapper around the native `<input type=\"date\">` (or `datetime-local`,\n * `time`, `month`). For richer pickers, pair with `react-datepicker` directly\n * — this primitive keeps the SDK dep-free.\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(function DatePicker(\n { value, onChange, mode = \"date\", ...props },\n ref,\n) {\n return (\n <Input\n {...props}\n ref={ref}\n type={mode}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Divider.module.css\";\n\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerVariant = \"solid\" | \"dashed\";\nexport type DividerAlign = \"start\" | \"center\" | \"end\";\n\nexport interface DividerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n orientation?: DividerOrientation;\n variant?: DividerVariant;\n /** Optional label rendered inside the divider (horizontal only). */\n label?: ReactNode;\n /** Label horizontal position (only when `label` provided). Defaults to `center`. */\n align?: DividerAlign;\n}\n\n/**\n * Horizontal or vertical visual separator. When `label` is provided in\n * horizontal mode the divider splits and centers the label between two lines.\n */\nexport function Divider({\n orientation = \"horizontal\",\n variant = \"solid\",\n label,\n align = \"center\",\n className,\n ...props\n}: DividerProps) {\n if (orientation === \"vertical\") {\n return (\n <span\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n styles.divider,\n styles.vertical,\n variant === \"dashed\" && styles.dashed,\n className,\n )}\n {...props}\n />\n );\n }\n\n if (!label) {\n return (\n <hr\n className={cn(\n styles.divider,\n styles.horizontal,\n styles.bare,\n variant === \"dashed\" && styles.dashed,\n className,\n )}\n />\n );\n }\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className={cn(\n styles.divider,\n styles.horizontal,\n variant === \"dashed\" && styles.dashed,\n align === \"start\" && styles.alignStart,\n align === \"end\" && styles.alignEnd,\n className,\n )}\n {...props}\n >\n {label}\n </div>\n );\n}\n","import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Drawer.module.css\";\n\nexport type DrawerPlacement = \"right\" | \"left\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n placement?: DrawerPlacement;\n title?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n closeOnBackdrop?: boolean;\n closeOnEsc?: boolean;\n hideCloseButton?: boolean;\n className?: string;\n /**\n * Auto-switch to bottom-sheet placement on mobile viewports (< md).\n * Modern mobile apps default to bottom drawers; on desktop the original\n * `placement` is preserved.\n */\n mobilePlacement?: DrawerPlacement;\n /** Render a drag handle indicator at the leading edge (bottom-sheet style). */\n showHandle?: boolean;\n}\n\n/**\n * Sliding side panel. Same building blocks as {@link Modal} but anchored to\n * an edge. Locks body scroll while open.\n */\nexport function Drawer({\n open,\n onClose,\n placement = \"right\",\n title,\n children,\n footer,\n closeOnBackdrop = true,\n closeOnEsc = true,\n hideCloseButton = false,\n className,\n mobilePlacement,\n showHandle = false,\n}: DrawerProps) {\n const { isMobile } = useBreakpoint();\n const effectivePlacement: DrawerPlacement =\n isMobile && mobilePlacement ? mobilePlacement : placement;\n\n useEffect(() => {\n if (!open) return;\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n const handleKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n document.body.style.overflow = previousOverflow;\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [open, closeOnEsc, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <>\n <div\n className={styles.overlay}\n onClick={() => {\n if (closeOnBackdrop) onClose();\n }}\n />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(styles.panel, styles[effectivePlacement], className)}\n >\n {showHandle &&\n (effectivePlacement === \"bottom\" || effectivePlacement === \"top\") && (\n <div\n className={cn(\n styles.handle,\n effectivePlacement === \"top\" && styles.handleTop,\n )}\n aria-hidden\n />\n )}\n {(title || !hideCloseButton) && (\n <header className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {!hideCloseButton && (\n <button\n type=\"button\"\n aria-label=\"Fechar\"\n className={styles.close}\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n )}\n </header>\n )}\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </aside>\n </>,\n document.body,\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DropdownMenu.module.css\";\n\nexport type DropdownMenuPlacement = \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n\nexport type DropdownMenuEntry =\n | {\n type: \"item\";\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n onSelect: () => void;\n }\n | { type: \"separator\"; id: string }\n | { type: \"label\"; id: string; label: ReactNode };\n\nexport interface DropdownMenuProps {\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n \"aria-haspopup\"?: boolean | \"menu\";\n }>;\n items: DropdownMenuEntry[];\n placement?: DropdownMenuPlacement;\n className?: string;\n}\n\nfunction placementClass(placement: DropdownMenuPlacement): string {\n switch (placement) {\n case \"bottom-end\":\n return styles.bottomEnd;\n case \"top-start\":\n return styles.topStart;\n case \"top-end\":\n return styles.topEnd;\n case \"bottom-start\":\n default:\n return styles.bottomStart;\n }\n}\n\n/**\n * Dropdown menu — list of selectable actions anchored to a trigger.\n *\n * - Toggle on trigger click.\n * - Close on outside click / Escape / item selection.\n * - Arrow keys navigate, Enter activates focused item.\n */\nexport function DropdownMenu({\n trigger,\n items,\n placement = \"bottom-start\",\n className,\n}: DropdownMenuProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const selectableIndexes = items\n .map((entry, index) => (entry.type === \"item\" && !entry.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const next = selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1;\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const prev =\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1;\n setActiveIndex(prev);\n itemRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [open, activeIndex, selectableIndexes, close]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen((prev) => !prev);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": open,\n \"aria-controls\": id,\n \"aria-haspopup\": \"menu\" as const,\n },\n } as ReactElement;\n\n const handleSelect = (entry: Extract<DropdownMenuEntry, { type: \"item\" }>): void => {\n entry.onSelect();\n close();\n };\n\n return (\n <span ref={rootRef} className={styles.root}>\n {triggerClone}\n {open && (\n <ul\n id={id}\n role=\"menu\"\n className={cn(styles.menu, placementClass(placement), className)}\n >\n {items.map((entry, index) => {\n if (entry.type === \"separator\") {\n return (\n <li\n key={entry.id}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n if (entry.type === \"label\") {\n return (\n <li key={entry.id} role=\"presentation\" className={styles.label}>\n {entry.label}\n </li>\n );\n }\n return (\n <li key={entry.id} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n entry.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={entry.disabled}\n onClick={() => handleSelect(entry)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {entry.icon && <span aria-hidden>{entry.icon}</span>}\n {entry.label}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </span>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Dropzone.module.css\";\n\n/** Props for {@link Dropzone}. */\nexport interface DropzoneProps {\n /** Called with the accepted files after a drop or file-dialog selection. */\n onDrop: (files: File[]) => void;\n /** `accept` attribute forwarded to the hidden file input. */\n accept?: string;\n /** Allow selecting/dropping multiple files. Default `true`. */\n multiple?: boolean;\n /** Disable interaction. */\n disabled?: boolean;\n /** Maximum file size in bytes; larger files are filtered out. */\n maxSize?: number;\n /** Called with files rejected by `maxSize`. */\n onReject?: (files: File[]) => void;\n /** Custom inner content. Falls back to a default prompt. */\n children?: ReactNode;\n /** Extra class applied to the drop area. */\n className?: string;\n}\n\n/**\n * Drag-and-drop file area with a hidden file input. Clickable and keyboard\n * focusable; filters by `maxSize` before calling `onDrop`.\n *\n * @example\n * <Dropzone accept=\"image/*\" maxSize={5 * 1024 * 1024} onDrop={setFiles}>\n * Solte imagens aqui ou clique para selecionar\n * </Dropzone>\n */\nexport function Dropzone({\n onDrop,\n accept,\n multiple = true,\n disabled = false,\n maxSize,\n onReject,\n children,\n className,\n}: DropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleFiles = (fileList: FileList | null): void => {\n if (!fileList || fileList.length === 0) return;\n const all = Array.from(fileList);\n const limited = multiple ? all : all.slice(0, 1);\n\n if (maxSize === undefined) {\n onDrop(limited);\n return;\n }\n\n const accepted: File[] = [];\n const rejected: File[] = [];\n for (const file of limited) {\n if (file.size > maxSize) rejected.push(file);\n else accepted.push(file);\n }\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length > 0) onDrop(accepted);\n };\n\n const openDialog = (): void => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n if (disabled) return;\n setIsDragging(true);\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openDialog();\n }\n };\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={cn(\n styles.zone,\n isDragging && styles.dragging,\n disabled && styles.disabled,\n className,\n )}\n onClick={openDialog}\n onKeyDown={handleKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className={styles.input}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n {children ?? (\n <span className={styles.prompt}>\n Arraste arquivos aqui ou clique para selecionar\n </span>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./EmptyState.module.css\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\n/** Centered \"nothing here yet\" placeholder with optional icon and CTA. */\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={cn(styles.wrapper, className)}>\n {icon && <div className={styles.icon}>{icon}</div>}\n <h4 className={styles.title}>{title}</h4>\n {description && <p className={styles.description}>{description}</p>}\n {action && <div className={styles.action}>{action}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ErrorState.module.css\";\n\nexport interface ErrorStateProps {\n title?: ReactNode;\n description?: ReactNode;\n onRetry?: () => void;\n retryLabel?: string;\n icon?: ReactNode;\n className?: string;\n}\n\n/** Error placeholder with optional retry CTA. Use when a request fails. */\nexport function ErrorState({\n title = \"Algo deu errado\",\n description = \"Não foi possível carregar essas informações.\",\n onRetry,\n retryLabel = \"Tentar novamente\",\n icon,\n className,\n}: ErrorStateProps) {\n return (\n <div className={cn(styles.wrapper, className)}>\n <div className={styles.icon}>{icon ?? <AlertIcon />}</div>\n <h4 className={styles.title}>{title}</h4>\n {description && <p className={styles.description}>{description}</p>}\n {onRetry && (\n <div className={styles.action}>\n <Button variant=\"secondary\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction AlertIcon() {\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./FileUpload.module.css\";\n\nexport interface FileUploadProps {\n /** Files currently in the dropzone (controlled). */\n value: File[];\n /** Called with the new list when the user adds or removes a file. */\n onChange: (files: File[]) => void;\n label?: string;\n /** Accept attribute forwarded to `<input>`. */\n accept?: string;\n /** Allow multiple files. Default: false. */\n multiple?: boolean;\n /** Max file size in bytes. Files above are rejected via `onReject`. */\n maxSize?: number;\n /** Called with rejected files when they exceed `maxSize` or fail the `accept` filter. */\n onReject?: (rejected: { file: File; reason: \"size\" | \"type\" }[]) => void;\n disabled?: boolean;\n /** Title shown on the empty dropzone. */\n title?: string;\n /** Helper line below the title. */\n subtitle?: string;\n className?: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true;\n const tokens = accept.split(\",\").map((t) => t.trim().toLowerCase());\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith(\".\")) return name.endsWith(token);\n if (token.endsWith(\"/*\")) return type.startsWith(token.replace(\"/*\", \"/\"));\n return type === token;\n });\n}\n\n/**\n * Drag-and-drop file dropzone. Pair with `uploadWithProgress` from the SDK\n * to wire actual uploads with byte-level progress.\n */\nexport function FileUpload({\n value,\n onChange,\n label,\n accept,\n multiple = false,\n maxSize,\n onReject,\n disabled,\n title = \"Arraste arquivos aqui ou clique para selecionar\",\n subtitle,\n className,\n}: FileUploadProps) {\n const [dragging, setDragging] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n function addFiles(incoming: FileList | File[]): void {\n const accepted: File[] = [];\n const rejected: { file: File; reason: \"size\" | \"type\" }[] = [];\n\n for (const file of Array.from(incoming)) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: \"type\" });\n continue;\n }\n if (maxSize && file.size > maxSize) {\n rejected.push({ file, reason: \"size\" });\n continue;\n }\n accepted.push(file);\n }\n\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length === 0) return;\n\n const next = multiple ? [...value, ...accepted] : accepted.slice(0, 1);\n onChange(next);\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n event.preventDefault();\n setDragging(false);\n if (disabled) return;\n if (event.dataTransfer?.files) addFiles(event.dataTransfer.files);\n }\n\n function remove(index: number): void {\n const next = value.slice();\n next.splice(index, 1);\n onChange(next);\n }\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div\n className={cn(\n styles.dropzone,\n dragging && styles.active,\n disabled && styles.disabled,\n )}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && inputRef.current?.click()}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragEnter={(event) => {\n event.preventDefault();\n if (!disabled) setDragging(true);\n }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n >\n <div className={styles.icon} aria-hidden>\n <UploadIcon />\n </div>\n <p className={styles.title}>{title}</p>\n {subtitle && <p className={styles.subtitle}>{subtitle}</p>}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className={styles.hidden}\n onChange={(event) => {\n if (event.target.files) addFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n </div>\n\n {value.length > 0 && (\n <ul className={styles.files}>\n {value.map((file, index) => (\n <li key={`${file.name}-${index}`} className={styles.file}>\n <div>\n <div>{file.name}</div>\n <div className={styles.fileMeta}>{formatSize(file.size)}</div>\n </div>\n <button\n type=\"button\"\n aria-label={`Remover ${file.name}`}\n className={styles.remove}\n onClick={() => remove(index)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction UploadIcon() {\n return (\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 16V4m0 0l-4 4m4-4l4 4M4 20h16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"@/components/Button\";\nimport { useBeforeInstallPrompt } from \"@/hooks/use-before-install-prompt\";\nimport type { InstallOutcome } from \"@/components/InstallButton\";\nimport styles from \"./InstallBanner.module.css\";\n\nexport interface InstallBannerProps {\n /** Headline. Default `\"Instale o app\"`. */\n title?: ReactNode;\n /** Supporting copy under the title. */\n description?: ReactNode;\n /** Install button label. Default `\"Instalar\"`. */\n installLabel?: string;\n /** Accessible label for the dismiss button. Default `\"Dispensar\"`. */\n dismissLabel?: string;\n /** Optional leading icon. */\n icon?: ReactNode;\n /**\n * `localStorage` key used to remember dismissal across reloads. Omit to\n * make dismissal last only for the current session (component state).\n */\n storageKey?: string;\n /** Called with the user's choice after the install prompt resolves. */\n onResult?: (outcome: InstallOutcome) => void;\n className?: string;\n}\n\nfunction readDismissed(storageKey?: string): boolean {\n if (!storageKey || typeof window === \"undefined\") return false;\n try {\n return window.localStorage.getItem(storageKey) === \"1\";\n } catch {\n return false;\n }\n}\n\n/**\n * Dismissible bottom banner that invites the user to install the PWA. Wired to\n * {@link useBeforeInstallPrompt}: it renders only when the browser captured an\n * install prompt and the app is not already running standalone — so on\n * platforms that never fire `beforeinstallprompt` (e.g. iOS Safari) it stays\n * hidden and you can surface manual instructions elsewhere.\n *\n * @example\n * <InstallBanner\n * title=\"Instale o FAMACHApp\"\n * description=\"Acesso offline e atalho na tela inicial.\"\n * storageKey=\"famacha:install-dismissed\"\n * />\n */\nexport function InstallBanner({\n title = \"Instale o app\",\n description,\n installLabel = \"Instalar\",\n dismissLabel = \"Dispensar\",\n icon,\n storageKey,\n onResult,\n className,\n}: InstallBannerProps) {\n const { installable, installed, isStandalone, prompt } = useBeforeInstallPrompt();\n const [dismissed, setDismissed] = useState<boolean>(() => readDismissed(storageKey));\n\n if (!installable || installed || isStandalone || dismissed) return null;\n\n const dismiss = (): void => {\n setDismissed(true);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, \"1\");\n } catch {\n /* ignore quota errors */\n }\n }\n };\n\n return (\n <div className={cn(styles.banner, className)} role=\"region\" aria-label={String(title)}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n <p className={styles.title}>{title}</p>\n {description && <p className={styles.description}>{description}</p>}\n </div>\n <Button\n size=\"sm\"\n onClick={async () => {\n onResult?.(await prompt());\n }}\n >\n {installLabel}\n </Button>\n <button\n type=\"button\"\n className={styles.close}\n aria-label={dismissLabel}\n onClick={dismiss}\n >\n <X size={18} aria-hidden />\n </button>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button, type ButtonProps } from \"@/components/Button\";\nimport { useBeforeInstallPrompt } from \"@/hooks/use-before-install-prompt\";\n\nexport type InstallOutcome = \"accepted\" | \"dismissed\" | \"unsupported\";\n\nexport interface InstallButtonProps extends Omit<ButtonProps, \"onClick\" | \"children\"> {\n /** Button label. Default `\"Instalar app\"`. */\n label?: ReactNode;\n /** Called with the user's choice after the install prompt resolves. */\n onResult?: (outcome: InstallOutcome) => void;\n}\n\n/**\n * Button wired to the PWA install prompt ({@link useBeforeInstallPrompt}).\n * Renders nothing when the app can't be installed — no prompt captured yet,\n * already installed, or running standalone — so you can drop it anywhere\n * without guarding visibility yourself.\n *\n * Inherits every {@link Button} prop (`variant`, `size`, `leftIcon`, …).\n *\n * @example\n * <InstallButton variant=\"primary\" leftIcon={<Download />} />\n */\nexport function InstallButton({ label = \"Instalar app\", onResult, ...props }: InstallButtonProps) {\n const { installable, installed, isStandalone, prompt } = useBeforeInstallPrompt();\n if (!installable || installed || isStandalone) return null;\n return (\n <Button\n onClick={async () => {\n onResult?.(await prompt());\n }}\n {...props}\n >\n {label}\n </Button>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n","import { createContext, useCallback, useContext, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { ConfirmDialog } from \"@/components/ConfirmDialog\";\nimport { Modal } from \"@/components/Modal\";\nimport type { ModalSize } from \"@/components/Modal\";\nimport styles from \"./ModalsManager.module.css\";\n\n/** Options accepted by {@link ModalsApi.open}. */\nexport interface OpenModalOptions {\n /** Header title. */\n title?: ReactNode;\n /** Modal body content. */\n children: ReactNode;\n /** Dialog size. Default `md`. */\n size?: ModalSize;\n /** Allow closing by clicking the backdrop. Default `true`. */\n closeOnBackdrop?: boolean;\n /** Allow closing with the Esc key. Default `true`. */\n closeOnEsc?: boolean;\n /** Hide the header close button. */\n hideCloseButton?: boolean;\n /** Called after the modal is removed from the stack. */\n onClose?: () => void;\n}\n\n/** Options accepted by {@link ModalsApi.confirm}. */\nexport interface ConfirmModalOptions {\n /** Header title. */\n title?: ReactNode;\n /** Prompt message rendered in the dialog body. */\n message: ReactNode;\n /** Confirm button label. Default `Confirmar`. */\n confirmLabel?: string;\n /** Cancel button label. Default `Cancelar`. */\n cancelLabel?: string;\n /** Render the confirm button in the danger variant. */\n danger?: boolean;\n /** Called when the user confirms. */\n onConfirm?: () => void | Promise<void>;\n /** Called when the user cancels or dismisses. */\n onCancel?: () => void;\n}\n\n/** Imperative API returned by {@link useModals}. */\nexport interface ModalsApi {\n /** Push a content modal. Returns its stack id. */\n open: (options: OpenModalOptions) => string;\n /** Push a confirmation dialog. Returns its stack id. */\n confirm: (options: ConfirmModalOptions) => string;\n /** Remove the modal with the given id. */\n close: (id: string) => void;\n /** Remove every modal from the stack. */\n closeAll: () => void;\n}\n\ninterface ContentEntry {\n kind: \"content\";\n id: string;\n options: OpenModalOptions;\n}\n\ninterface ConfirmEntry {\n kind: \"confirm\";\n id: string;\n options: ConfirmModalOptions;\n}\n\ntype StackEntry = ContentEntry | ConfirmEntry;\n\nconst ModalsContext = createContext<ModalsApi | null>(null);\n\n/** Props for {@link ModalsProvider}. */\nexport interface ModalsProviderProps {\n children: ReactNode;\n}\n\n/**\n * Provides imperative modal control via {@link useModals} and renders the open\n * modal stack. Mount once near the app root.\n *\n * @example\n * <ModalsProvider>\n * <App />\n * </ModalsProvider>\n */\nexport function ModalsProvider({ children }: ModalsProviderProps) {\n const [stack, setStack] = useState<StackEntry[]>([]);\n const counter = useRef(0);\n\n const nextId = useCallback((): string => {\n counter.current += 1;\n return `modal-${counter.current}`;\n }, []);\n\n const close = useCallback((id: string): void => {\n setStack((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const closeAll = useCallback((): void => {\n setStack([]);\n }, []);\n\n const open = useCallback(\n (options: OpenModalOptions): string => {\n const id = nextId();\n setStack((current) => [...current, { kind: \"content\", id, options }]);\n return id;\n },\n [nextId],\n );\n\n const confirm = useCallback(\n (options: ConfirmModalOptions): string => {\n const id = nextId();\n setStack((current) => [...current, { kind: \"confirm\", id, options }]);\n return id;\n },\n [nextId],\n );\n\n const api = useMemo<ModalsApi>(\n () => ({ open, confirm, close, closeAll }),\n [open, confirm, close, closeAll],\n );\n\n return (\n <ModalsContext.Provider value={api}>\n {children}\n <div className={styles.stack}>\n {stack.map((entry) =>\n entry.kind === \"content\" ? (\n <ContentModal key={entry.id} entry={entry} close={close} />\n ) : (\n <ConfirmModal key={entry.id} entry={entry} close={close} />\n ),\n )}\n </div>\n </ModalsContext.Provider>\n );\n}\n\ninterface ContentModalProps {\n entry: ContentEntry;\n close: (id: string) => void;\n}\n\nfunction ContentModal({ entry, close }: ContentModalProps) {\n const { options, id } = entry;\n const handleClose = (): void => {\n options.onClose?.();\n close(id);\n };\n return (\n <Modal\n open\n onClose={handleClose}\n title={options.title}\n size={options.size}\n closeOnBackdrop={options.closeOnBackdrop}\n closeOnEsc={options.closeOnEsc}\n hideCloseButton={options.hideCloseButton}\n >\n {options.children}\n </Modal>\n );\n}\n\ninterface ConfirmModalProps {\n entry: ConfirmEntry;\n close: (id: string) => void;\n}\n\nfunction ConfirmModal({ entry, close }: ConfirmModalProps) {\n const { options, id } = entry;\n const [loading, setLoading] = useState(false);\n\n const handleConfirm = async (): Promise<void> => {\n try {\n setLoading(true);\n await options.onConfirm?.();\n } finally {\n setLoading(false);\n close(id);\n }\n };\n\n const handleCancel = (): void => {\n options.onCancel?.();\n close(id);\n };\n\n return (\n <ConfirmDialog\n open\n title={options.title ?? \"\"}\n description={options.message}\n confirmLabel={options.confirmLabel}\n cancelLabel={options.cancelLabel}\n variant={options.danger ? \"danger\" : \"primary\"}\n loading={loading}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n );\n}\n\n/**\n * Access the imperative modals API. Must be used within a {@link ModalsProvider}.\n *\n * @example\n * const modals = useModals();\n * modals.confirm({ message: \"Excluir item?\", danger: true, onConfirm: del });\n *\n * @throws Error when called outside a {@link ModalsProvider}.\n */\nexport function useModals(): ModalsApi {\n const api = useContext(ModalsContext);\n if (api === null) {\n throw new Error(\"useModals must be used within a <ModalsProvider>\");\n }\n return api;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Navbar.module.css\";\n\nexport type NavbarTone = \"surface\" | \"primary\" | \"transparent\";\n\nexport interface NavbarProps extends HTMLAttributes<HTMLElement> {\n /** Left slot — typically logo + brand name. */\n logo?: ReactNode;\n /** Center slot — typically nav links. */\n nav?: ReactNode;\n /** Right slot — typically user menu / actions. */\n actions?: ReactNode;\n /** Make the bar sticky at the top of the scroll container. Default `true`. */\n sticky?: boolean;\n /** Visual tone. Default `\"surface\"`. */\n tone?: NavbarTone;\n /** When set, renders a thin bottom border. Default `true`. */\n bordered?: boolean;\n}\n\n/**\n * Top app bar. Three-slot layout (logo / nav / actions) that collapses\n * gracefully on mobile (nav slot wraps below).\n *\n * @example\n * <Navbar\n * logo={<img src=\"/logo.svg\" alt=\"App\" />}\n * nav={<NavLinks />}\n * actions={<UserMenu />}\n * />\n */\nexport function Navbar({\n logo,\n nav,\n actions,\n sticky = true,\n tone = \"surface\",\n bordered = true,\n className,\n ...props\n}: NavbarProps) {\n return (\n <header\n className={cn(\n styles.navbar,\n styles[tone],\n sticky && styles.sticky,\n bordered && styles.bordered,\n className,\n )}\n {...props}\n >\n {logo && <div className={styles.logo}>{logo}</div>}\n {nav && <nav className={styles.nav}>{nav}</nav>}\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NProgress.module.css\";\n\n/** Snapshot of the progress controller state delivered to subscribers. */\nexport interface NProgressState {\n /** Current progress, `0` (empty) to `1` (complete). */\n value: number;\n /** Whether the bar should be visible. */\n active: boolean;\n}\n\n/** Listener invoked whenever the progress state changes. */\nexport type NProgressListener = (state: NProgressState) => void;\n\n/** Imperative top-loading-bar controller. */\nexport interface NProgressController {\n /** Show the bar and start trickling toward ~0.9. */\n start: () => void;\n /** Complete to `1`, then hide the bar shortly after. */\n done: () => void;\n /** Set the progress explicitly. Values are clamped to `0..1`. */\n set: (n: number) => void;\n /** Increment progress by `amount` (default a small trickle step). */\n inc: (amount?: number) => void;\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe: (listener: NProgressListener) => () => void;\n}\n\nconst TRICKLE_INTERVAL_MS = 300;\nconst TRICKLE_CEILING = 0.9;\nconst DONE_HIDE_DELAY_MS = 300;\n\nfunction clamp(n: number): number {\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n\nfunction createNProgress(): NProgressController {\n let state: NProgressState = { value: 0, active: false };\n const listeners = new Set<NProgressListener>();\n let trickleTimer: ReturnType<typeof setInterval> | null = null;\n let hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n const emit = (): void => {\n for (const listener of listeners) listener(state);\n };\n\n const update = (next: Partial<NProgressState>): void => {\n state = { ...state, ...next };\n emit();\n };\n\n const stopTrickle = (): void => {\n if (trickleTimer !== null) {\n clearInterval(trickleTimer);\n trickleTimer = null;\n }\n };\n\n const clearHide = (): void => {\n if (hideTimer !== null) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n const inc = (amount?: number): void => {\n const current = state.value;\n if (current >= TRICKLE_CEILING) return;\n const step = amount ?? (1 - current) * 0.1 + 0.01;\n update({ value: Math.min(clamp(current + step), TRICKLE_CEILING) });\n };\n\n const start = (): void => {\n clearHide();\n if (state.active) return;\n update({ active: true, value: state.value > 0 ? state.value : 0.08 });\n stopTrickle();\n trickleTimer = setInterval(() => inc(), TRICKLE_INTERVAL_MS);\n };\n\n const done = (): void => {\n stopTrickle();\n clearHide();\n update({ value: 1, active: true });\n hideTimer = setTimeout(() => {\n update({ active: false, value: 0 });\n hideTimer = null;\n }, DONE_HIDE_DELAY_MS);\n };\n\n const set = (n: number): void => {\n clearHide();\n const value = clamp(n);\n update({ value, active: value < 1 ? true : state.active });\n };\n\n const subscribe = (listener: NProgressListener): (() => void) => {\n listeners.add(listener);\n listener(state);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return { start, done, set, inc, subscribe };\n}\n\n/**\n * Module-level singleton progress controller. Drive it imperatively from\n * anywhere (router transitions, fetch interceptors) and render the visual bar\n * with {@link NProgressBar}.\n *\n * @example\n * nprogress.start();\n * await loadData();\n * nprogress.done();\n */\nexport const nprogress: NProgressController = createNProgress();\n\n/** Props for {@link NProgressBar}. */\nexport interface NProgressBarProps {\n /** Bar color. Defaults to `var(--tempest-primary)`. */\n color?: string;\n /** Bar height in pixels. Default `3`. */\n height?: number;\n /** Extra class applied to the bar element. */\n className?: string;\n}\n\n/**\n * Fixed top loading bar bound to the {@link nprogress} singleton. Mount once\n * near the app root; it renders nothing while inactive.\n *\n * @example\n * <NProgressBar />\n */\nexport function NProgressBar({ color, height = 3, className }: NProgressBarProps) {\n const [state, setState] = useState<NProgressState>({ value: 0, active: false });\n\n useEffect(() => nprogress.subscribe(setState), []);\n\n if (!state.active) return null;\n\n const style: CSSProperties = {\n width: `${Math.round(state.value * 100)}%`,\n height: `${height}px`,\n background: color ?? \"var(--tempest-primary)\",\n };\n\n return (\n <div\n className={cn(styles.bar, className)}\n style={style}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(state.value * 100)}\n />\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Page.module.css\";\n\nexport interface PageProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /** Page title rendered as `<h1>`. */\n title?: ReactNode;\n /** Optional subtitle / breadcrumbs slot rendered above the title. */\n eyebrow?: ReactNode;\n /** Optional description rendered below the title. */\n description?: ReactNode;\n /** Right-side actions slot in the header (buttons, menus). */\n actions?: ReactNode;\n /** Sticky tab bar / filter row rendered just below the header. */\n toolbar?: ReactNode;\n /** Footer slot rendered at the bottom of the content area. */\n footer?: ReactNode;\n /** Page-level padding. Default `true`. */\n padded?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Page wrapper with header + (optional) toolbar + content + footer. Pairs\n * with `Container` when you want a max-width content well.\n *\n * @example\n * <Page title=\"Pedidos\" description=\"Acompanhe seus pedidos\" actions={<Button>Novo</Button>}>\n * <Table {...} />\n * </Page>\n */\nexport function Page({\n title,\n eyebrow,\n description,\n actions,\n toolbar,\n footer,\n padded = true,\n className,\n children,\n ...props\n}: PageProps) {\n const hasHeader = title || eyebrow || description || actions;\n return (\n <main className={cn(styles.page, padded && styles.padded, className)} {...props}>\n {hasHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {eyebrow && <div className={styles.eyebrow}>{eyebrow}</div>}\n {title && <h1 className={styles.title}>{title}</h1>}\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n {toolbar && <div className={styles.toolbar}>{toolbar}</div>}\n <div className={styles.content}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </main>\n );\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Pagination.module.css\";\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n pageSize?: number;\n onPageSizeChange?: (size: number) => void;\n pageSizeOptions?: number[];\n /** Total items count; if provided, renders the summary text. */\n totalItems?: number;\n /** Max number of numbered page buttons to show. Default 7. */\n siblingCount?: number;\n className?: string;\n}\n\nfunction buildRange(page: number, totalPages: number, siblings: number): (number | \"...\")[] {\n const totalSlots = siblings + 4;\n if (totalPages <= totalSlots) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n const start = Math.max(2, page - Math.floor(siblings / 2));\n const end = Math.min(totalPages - 1, start + siblings - 1);\n const range: (number | \"...\")[] = [1];\n if (start > 2) range.push(\"...\");\n for (let i = start; i <= end; i++) range.push(i);\n if (end < totalPages - 1) range.push(\"...\");\n range.push(totalPages);\n return range;\n}\n\n/**\n * Numeric pagination controls. Pair with {@link usePagination} for state.\n */\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n pageSize,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n totalItems,\n siblingCount = 3,\n className,\n}: PaginationProps) {\n const pages = useMemo(\n () => buildRange(page, totalPages, siblingCount),\n [page, totalPages, siblingCount],\n );\n\n if (totalPages <= 1 && !onPageSizeChange) return null;\n\n return (\n <div className={cn(styles.wrapper, className)}>\n <div className={styles.summary}>\n {typeof totalItems === \"number\"\n ? `${totalItems} resultado${totalItems === 1 ? \"\" : \"s\"}`\n : `Página ${page} de ${totalPages}`}\n </div>\n <div className={styles.controls}>\n <button\n type=\"button\"\n className={styles.page}\n onClick={() => onPageChange(Math.max(1, page - 1))}\n disabled={page <= 1}\n aria-label=\"Página anterior\"\n >\n ‹\n </button>\n {pages.map((entry, index) =>\n entry === \"...\" ? (\n <span\n key={`ellipsis-${index}`}\n className={cn(styles.ellipsis, styles.numeric)}\n >\n …\n </span>\n ) : (\n <button\n type=\"button\"\n key={entry}\n className={cn(\n styles.page,\n styles.numeric,\n entry === page && styles.active,\n )}\n onClick={() => onPageChange(entry)}\n aria-current={entry === page ? \"page\" : undefined}\n >\n {entry}\n </button>\n ),\n )}\n <button\n type=\"button\"\n className={styles.page}\n onClick={() => onPageChange(Math.min(totalPages, page + 1))}\n disabled={page >= totalPages}\n aria-label=\"Próxima página\"\n >\n ›\n </button>\n {onPageSizeChange && (\n <select\n className={styles.sizeSelect}\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n aria-label=\"Itens por página\"\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt} / página\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n );\n}\n","import { forwardRef, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n ...inputProps\n },\n ref,\n ) {\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n },\n);\n","import { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/**\n * Lightweight popover. Renders a positioned panel anchored to a trigger,\n * dismissed on outside click / Escape. Does NOT include collision detection\n * or smart positioning — pair with Floating UI if you need that.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const rootRef = useRef<HTMLSpanElement>(null);\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (event: KeyboardEvent): void => {\n if (closeOnEsc && event.key === \"Escape\") setOpen(false);\n };\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnEsc, closeOnOutsideClick, setOpen]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n return (\n <span ref={rootRef} className={styles.root}>\n {triggerClone}\n {isOpen && (\n <div\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, styles[placement], className)}\n >\n {children}\n </div>\n )}\n </span>\n );\n}\n","import { cn } from \"@/utils/cn\";\nimport styles from \"./Progress.module.css\";\n\nexport type ProgressVariant = \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface ProgressProps {\n /** Value between 0 and `max` (or 0-100 by default). Ignored when `indeterminate`. */\n value?: number;\n max?: number;\n variant?: ProgressVariant;\n /** Show an animated indeterminate bar. Default: false. */\n indeterminate?: boolean;\n /** Render a numeric label \"x% / max\" above the bar. Default: false. */\n showLabel?: boolean;\n /** Optional left-aligned descriptor (e.g. \"Enviando arquivo…\"). */\n label?: string;\n className?: string;\n}\n\n/** Linear progress bar with determinate / indeterminate modes. */\nexport function Progress({\n value = 0,\n max = 100,\n variant = \"primary\",\n indeterminate = false,\n showLabel = false,\n label,\n className,\n}: ProgressProps) {\n const pct = indeterminate ? 0 : Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {(showLabel || label) && (\n <div className={styles.label}>\n {label && <span>{label}</span>}\n {showLabel && !indeterminate && <span>{Math.round(pct)}%</span>}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n className={cn(styles.bar, indeterminate && styles.indeterminate)}\n >\n <div\n className={cn(styles.fill, variant !== \"primary\" && styles[variant])}\n style={{ width: indeterminate ? undefined : `${pct}%` }}\n />\n </div>\n </div>\n );\n}\n","import { createContext, forwardRef, useContext, useId, useState } from \"react\";\nimport type { ChangeEvent, InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Radio.module.css\";\n\ninterface RadioGroupContextValue {\n name: string;\n value?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n description?: ReactNode;\n value: string;\n wrapperClassName?: string;\n}\n\n/**\n * Single radio button. Inside a {@link RadioGroup}, name/checked/onChange are\n * managed by the group; outside, behaves as a regular radio input.\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n label,\n description,\n value,\n disabled,\n name,\n checked,\n onChange,\n wrapperClassName,\n className,\n ...props\n },\n ref,\n) {\n const group = useContext(RadioGroupContext);\n const resolvedName = group?.name ?? name;\n const resolvedDisabled = group?.disabled ?? disabled;\n const isChecked = group ? group.value === value : checked;\n\n function handleChange(event: ChangeEvent<HTMLInputElement>): void {\n if (group) group.onChange?.(value);\n onChange?.(event);\n }\n\n return (\n <label\n className={cn(styles.wrapper, resolvedDisabled && styles.disabled, wrapperClassName)}\n >\n <input\n ref={ref}\n type=\"radio\"\n name={resolvedName}\n value={value}\n checked={isChecked}\n disabled={resolvedDisabled}\n onChange={handleChange}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.dot} aria-hidden />\n {(label || description) && (\n <span className={styles.labelWrap}>\n {label && <span className={styles.label}>{label}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </span>\n )}\n </label>\n );\n});\n\nexport interface RadioGroupProps {\n /** Selected value (controlled). */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Called when the selection changes. */\n onChange?: (value: string) => void;\n /** `name` attribute applied to every Radio inside. Auto-generated if omitted. */\n name?: string;\n /** Disable every Radio inside. */\n disabled?: boolean;\n /** Lay out radios horizontally. Default: false (column). */\n horizontal?: boolean;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Wraps multiple {@link Radio} children and coordinates selection via context.\n * Pass `value` for controlled mode or `defaultValue` for uncontrolled.\n */\nexport function RadioGroup({\n value,\n defaultValue,\n onChange,\n name,\n disabled,\n horizontal = false,\n className,\n children,\n}: RadioGroupProps) {\n const generatedName = useId();\n const resolvedName = name ?? generatedName;\n\n const [internal, setInternal] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n\n function handleChange(next: string): void {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n }\n\n return (\n <RadioGroupContext.Provider\n value={{ name: resolvedName, value: current, onChange: handleChange, disabled }}\n >\n <div\n role=\"radiogroup\"\n className={cn(styles.group, horizontal && styles.horizontal, className)}\n >\n {children}\n </div>\n </RadioGroupContext.Provider>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RangeSlider.module.css\";\n\nexport type RangeValue = [number, number];\n\nexport interface RangeSliderProps {\n value: RangeValue;\n onChange: (value: RangeValue) => void;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n /** Formatter for the value badge next to the label. Defaults to `min – max`. */\n formatValue?: (value: RangeValue) => string;\n className?: string;\n}\n\n/**\n * Dual-thumb range slider. Built on two native `<input type=\"range\">` so it\n * stays accessible and works with keyboards/screen readers without\n * heavyweight positioning libs. The active fill is positioned via percentages.\n */\nexport function RangeSlider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n helperText,\n disabled = false,\n formatValue,\n className,\n}: RangeSliderProps) {\n const [low, high] = value;\n const range = max - min;\n\n const fillLeft = useMemo(() => ((low - min) / range) * 100, [low, min, range]);\n const fillRight = useMemo(() => ((high - min) / range) * 100, [high, min, range]);\n\n const valueText = formatValue?.(value) ?? `${low} – ${high}`;\n\n const handleLow = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n const next = Math.min(Number(event.target.value), high);\n onChange([next, high]);\n },\n [high, onChange],\n );\n\n const handleHigh = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n const next = Math.max(Number(event.target.value), low);\n onChange([low, next]);\n },\n [low, onChange],\n );\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && (\n <div className={styles.label}>\n <span>{label}</span>\n <span className={styles.value}>{valueText}</span>\n </div>\n )}\n <div className={styles.field}>\n <div className={styles.track} />\n <div\n className={styles.fill}\n style={{ left: `${fillLeft}%`, right: `${100 - fillRight}%` }}\n />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={low}\n onChange={handleLow}\n disabled={disabled}\n aria-label={label ? `${label} (mínimo)` : \"Mínimo\"}\n />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={high}\n onChange={handleHigh}\n disabled={disabled}\n aria-label={label ? `${label} (máximo)` : \"Máximo\"}\n />\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RatingStars.module.css\";\n\nexport type RatingSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RatingStarsProps {\n /** Current selected value (1..max). 0 means none. */\n value: number;\n /** Total number of stars. Default 5. */\n max?: number;\n onChange?: (value: number) => void;\n size?: RatingSize;\n readonly?: boolean;\n disabled?: boolean;\n /** Accessible label for the rating group. */\n label?: string;\n className?: string;\n}\n\n/**\n * Star rating control. Renders `max` stars, fills the first `value`. Click a\n * star to set rating (when not readonly). Hovering previews the value.\n */\nexport function RatingStars({\n value,\n max = 5,\n onChange,\n size = \"md\",\n readonly = false,\n disabled = false,\n label = \"Avaliação\",\n className,\n}: RatingStarsProps) {\n const [hover, setHover] = useState<number>(0);\n const displayed = hover > 0 ? hover : value;\n\n const handleClick = (next: number): void => {\n if (readonly || disabled) return;\n onChange?.(next);\n };\n\n return (\n <span\n role=\"radiogroup\"\n aria-label={label}\n className={cn(\n styles.wrapper,\n styles[size],\n disabled && styles.disabled,\n readonly && styles.readonly,\n className,\n )}\n onMouseLeave={() => setHover(0)}\n >\n {Array.from({ length: max }, (_, i) => {\n const starIndex = i + 1;\n const filled = starIndex <= displayed;\n return (\n <button\n key={starIndex}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === starIndex}\n aria-label={`${starIndex} ${starIndex === 1 ? \"estrela\" : \"estrelas\"}`}\n className={cn(styles.star, filled && styles.filled)}\n disabled={disabled}\n onMouseEnter={() => !readonly && !disabled && setHover(starIndex)}\n onClick={() => handleClick(starIndex)}\n >\n <StarIcon filled={filled} />\n </button>\n );\n })}\n </span>\n );\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill={filled ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87L18.18 22 12 18.56 5.82 22 7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useBreakpoint, type Breakpoint } from \"@/hooks/use-breakpoint\";\n\nexport interface ShowProps {\n /** Render children only when viewport width is `>=` this breakpoint. */\n above?: Breakpoint;\n /** Render children only when viewport width is `<` this breakpoint. */\n below?: Breakpoint;\n /** Render only on specific breakpoints. Wins over `above`/`below` when set. */\n only?: Breakpoint | Breakpoint[];\n children: ReactNode;\n}\n\nfunction shouldRender(\n current: Breakpoint,\n above: Breakpoint | undefined,\n below: Breakpoint | undefined,\n only: Breakpoint | Breakpoint[] | undefined,\n helpers: { above: (bp: Breakpoint) => boolean; below: (bp: Breakpoint) => boolean },\n): boolean {\n if (only) {\n const list = Array.isArray(only) ? only : [only];\n return list.includes(current);\n }\n if (above && !helpers.above(above)) return false;\n if (below && !helpers.below(below)) return false;\n return true;\n}\n\n/**\n * Conditionally render children based on the viewport breakpoint.\n *\n * - `above` — render when viewport width is `>=` the given breakpoint.\n * - `below` — render when viewport width is `<` the given breakpoint.\n * - `only` — render only on the listed breakpoint(s).\n *\n * SSR-safe: first render uses `xs` (renders mobile content first); the\n * component re-renders once `useBreakpoint` has the real viewport width.\n */\nexport function Show({ above, below, only, children }: ShowProps): ReactNode {\n const bp = useBreakpoint();\n if (!shouldRender(bp.current, above, below, only, bp)) return null;\n return children;\n}\n\nexport interface HideProps {\n /** Hide children when viewport width is `>=` this breakpoint. */\n above?: Breakpoint;\n /** Hide children when viewport width is `<` this breakpoint. */\n below?: Breakpoint;\n /** Hide on specific breakpoints. */\n only?: Breakpoint | Breakpoint[];\n children: ReactNode;\n}\n\n/** Inverse of `<Show>` — hides children when the condition matches. */\nexport function Hide({ above, below, only, children }: HideProps): ReactNode {\n const bp = useBreakpoint();\n if (shouldRender(bp.current, above, below, only, bp)) return null;\n return children;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SafeArea.module.css\";\n\nexport type SafeAreaEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface SafeAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** Edges to pad. Default `[\"top\",\"right\",\"bottom\",\"left\"]` (all). */\n edges?: SafeAreaEdge[];\n /** Render as inline (use `display: contents`). */\n inline?: boolean;\n children?: ReactNode;\n}\n\nconst ALL_EDGES: SafeAreaEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Apply `env(safe-area-inset-*)` padding so content avoids iOS notch /\n * Android navbar / device chrome. Wrap the outermost container of pages\n * with sticky headers/footers.\n *\n * @example\n * <SafeArea edges={[\"top\"]}>\n * <Navbar />\n * </SafeArea>\n */\nexport function SafeArea({\n edges = ALL_EDGES,\n inline = false,\n className,\n children,\n ...props\n}: SafeAreaProps) {\n return (\n <div\n className={cn(\n styles.safe,\n inline && styles.inline,\n edges.includes(\"top\") && styles.top,\n edges.includes(\"right\") && styles.right,\n edges.includes(\"bottom\") && styles.bottom,\n edges.includes(\"left\") && styles.left,\n className,\n )}\n data-edges={edges.join(\" \")}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SearchBar.module.css\";\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\"> {\n value: string;\n onChange: (value: string) => void;\n onClear?: () => void;\n wrapperClassName?: string;\n}\n\n/**\n * Search input with magnifier icon and a clear button. Controlled component:\n * pass `value` and `onChange`.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { value, onChange, onClear, wrapperClassName, placeholder = \"Buscar...\", className, ...props },\n ref,\n) {\n function handleClear(): void {\n onChange(\"\");\n onClear?.();\n }\n\n return (\n <div className={cn(styles.wrapper, wrapperClassName)}>\n <span className={styles.iconLeft} aria-hidden>\n <SearchIcon />\n </span>\n <input\n ref={ref}\n type=\"search\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n className={cn(styles.input, className)}\n {...props}\n />\n {value && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label=\"Limpar busca\"\n onClick={handleClear}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n );\n});\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./SegmentedControl.module.css\";\n\nexport interface SegmentedControlOption<TValue extends string = string> {\n value: TValue;\n label: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SegmentedControlProps<TValue extends string = string> extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\"\n> {\n /** Available segments. */\n options: SegmentedControlOption<TValue>[];\n /** Selected value. */\n value: TValue;\n /** Fires with the new value when a segment is selected. */\n onChange: (value: TValue) => void;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Stretch to full width of container. Default `false`. */\n fullWidth?: boolean;\n /** Group label for screen readers. */\n \"aria-label\"?: string;\n}\n\n/**\n * iOS-style segmented control. Two-to-five mutually-exclusive options\n * rendered as a single connected pill bar.\n *\n * @example\n * <SegmentedControl\n * value={view}\n * onChange={setView}\n * options={[\n * { value: \"list\", label: \"Lista\" },\n * { value: \"grid\", label: \"Grade\" },\n * ]}\n * />\n */\nexport function SegmentedControl<TValue extends string = string>({\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = false,\n className,\n \"aria-label\": ariaLabel,\n ...props\n}: SegmentedControlProps<TValue>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(styles.group, styles[size], fullWidth && styles.fullWidth, className)}\n {...props}\n >\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={option.disabled}\n className={cn(styles.segment, selected && styles.active)}\n onClick={() => onChange(option.value)}\n >\n {option.icon && <span className={styles.icon}>{option.icon}</span>}\n <span className={styles.label}>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Sidebar.module.css\";\n\nexport interface SidebarItem {\n key: string;\n label: ReactNode;\n icon?: ReactNode;\n badge?: ReactNode;\n disabled?: boolean;\n href?: string;\n}\n\nexport interface SidebarProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n /** Top slot — typically the logo + brand. */\n header?: ReactNode;\n /** Navigation items. */\n items: SidebarItem[];\n /** Active item key. */\n value?: string;\n /** Fires when an item is clicked. Receives the item's `key`. */\n onChange?: (key: string) => void;\n /** Bottom slot — typically settings/profile/logout. */\n footer?: ReactNode;\n /** Collapsed mode — only icons visible. Default `false`. */\n collapsed?: boolean;\n /** Width when expanded, in pixels or any CSS length. Default `240px`. */\n width?: number | string;\n /** Width when collapsed, in pixels or any CSS length. Default `64px`. */\n collapsedWidth?: number | string;\n}\n\n/**\n * Desktop sidebar navigation. Pair with `<Show above=\"md\">` and a `Drawer`\n * for mobile.\n *\n * @example\n * const [tab, setTab] = useState(\"home\");\n * <Show above=\"md\">\n * <Sidebar\n * header={<Brand />}\n * items={[{ key: \"home\", label: \"Home\", icon: <Home /> }]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function Sidebar({\n header,\n items,\n value,\n onChange,\n footer,\n collapsed = false,\n width = 240,\n collapsedWidth = 64,\n className,\n style,\n ...props\n}: SidebarProps) {\n const finalWidth =\n typeof (collapsed ? collapsedWidth : width) === \"number\"\n ? `${collapsed ? collapsedWidth : width}px`\n : collapsed\n ? collapsedWidth\n : width;\n return (\n <aside\n className={cn(styles.sidebar, collapsed && styles.collapsed, className)}\n style={{ width: finalWidth, ...style }}\n {...props}\n >\n {header && <div className={styles.header}>{header}</div>}\n <nav className={styles.nav} aria-label=\"Navegação lateral\">\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange?.(item.key)}\n title={\n collapsed && typeof item.label === \"string\" ? item.label : undefined\n }\n >\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {!collapsed && <span className={styles.label}>{item.label}</span>}\n {!collapsed && item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </button>\n );\n })}\n </nav>\n {footer && <div className={styles.footer}>{footer}</div>}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Skeleton.module.css\";\n\nexport interface SkeletonProps {\n variant?: \"rect\" | \"text\" | \"circle\";\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Loading placeholder block. Use `variant=\"text\"` for inline lines, `circle` for avatars. */\nexport function Skeleton({ variant = \"rect\", width, height, className, style }: SkeletonProps) {\n return (\n <span\n aria-hidden\n className={cn(\n styles.skeleton,\n variant === \"text\" && styles.text,\n variant === \"circle\" && styles.circle,\n className,\n )}\n style={{ width, height, ...style }}\n />\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spacer.module.css\";\n\nexport type SpacerAxis = \"both\" | \"x\" | \"y\";\n\nexport interface SpacerProps extends HTMLAttributes<HTMLDivElement> {\n /** Axis to flex along. Default `\"both\"` (`flex: 1`). */\n axis?: SpacerAxis;\n}\n\n/**\n * Flex spacer — pushes siblings apart inside a flex container. Equivalent\n * to `<div style={{ flex: 1 }}>` but typed and intent-revealing.\n *\n * @example\n * <Stack direction=\"horizontal\">\n * <Button>Cancelar</Button>\n * <Spacer />\n * <Button variant=\"primary\">Salvar</Button>\n * </Stack>\n */\nexport function Spacer({ axis = \"both\", className, ...props }: SpacerProps) {\n return <div className={cn(styles.spacer, styles[axis], className)} {...props} />;\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n","import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({ steps, current, orientation = \"horizontal\", className }: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n <span className={styles.dot}>{completed ? \"✓\" : index + 1}</span>\n <span className={styles.label}>{step.label}</span>\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n","/**\n * Clamp `value` between `min` and `max` (inclusive).\n *\n * @example\n * clamp(120, 0, 100); // 100\n * clamp(-5, 0, 100); // 0\n * clamp(42, 0, 100); // 42\n */\nexport function clamp(value: number, min: number, max: number): number {\n if (Number.isNaN(value)) return value;\n if (min > max) {\n const swap = min;\n min = max;\n max = swap;\n }\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n\n/**\n * Format a byte count as a human-readable size string.\n *\n * Scales through B, KB, MB, GB and TB using 1024 as the base. `decimals`\n * controls the fractional digits for scaled units (default 1); `0` bytes\n * always renders as `\"0 B\"`.\n *\n * @example\n * formatBytes(0); // \"0 B\"\n * formatBytes(1536); // \"1.5 KB\"\n * formatBytes(1048576); // \"1 MB\"\n * formatBytes(1536, 2); // \"1.50 KB\"\n */\nexport function formatBytes(bytes: number, decimals: number = 1): string {\n if (bytes === 0) return \"0 B\";\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const base = 1024;\n const exponent = Math.min(\n Math.floor(Math.log(Math.abs(bytes)) / Math.log(base)),\n units.length - 1,\n );\n const value = bytes / base ** exponent;\n const digits = exponent === 0 ? 0 : Math.max(0, decimals);\n const formatted = parseFloat(value.toFixed(digits)).toString();\n\n return `${formatted} ${units[exponent]}`;\n}\n\n/**\n * Format a number using compact notation (e.g. `1.2K`, `3.4M`).\n *\n * Wraps `Intl.NumberFormat` with `notation: \"compact\"`. The `locale` defaults\n * to `\"en-US\"`.\n *\n * @example\n * formatCompactNumber(1234); // \"1.2K\"\n * formatCompactNumber(5600000); // \"5.6M\"\n * formatCompactNumber(1234, \"pt-BR\"); // \"1,2 mil\"\n */\nexport function formatCompactNumber(value: number, locale: string = \"en-US\"): string {\n return new Intl.NumberFormat(locale, { notation: \"compact\", maximumFractionDigits: 1 }).format(\n value,\n );\n}\n","import { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n}: TableProps<T>) {\n return (\n <div className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}>\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Timeline.module.css\";\n\nexport type TimelineMarker = \"primary\" | \"success\" | \"warning\" | \"danger\" | \"neutral\";\n\nexport interface TimelineItem {\n /** Stable identifier (used as React key). */\n id: string;\n /** Title rendered as the entry headline. */\n title: ReactNode;\n /** Optional subtitle / description below the title. */\n description?: ReactNode;\n /** Right-aligned meta column (timestamps, durations). */\n meta?: ReactNode;\n /** Optional custom icon rendered inside the marker. */\n icon?: ReactNode;\n /** Marker color. Default `\"primary\"`. */\n marker?: TimelineMarker;\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n items: TimelineItem[];\n /** Show the connecting line between markers. Default `true`. */\n connector?: boolean;\n}\n\n/**\n * Vertical event timeline — activity feeds, order trackers, audit logs.\n * Each entry has a marker (color or custom icon), title, optional\n * description and right-aligned meta column.\n *\n * @example\n * <Timeline items={[\n * { id: \"1\", title: \"Pedido criado\", meta: \"10:24\", marker: \"primary\" },\n * { id: \"2\", title: \"Aprovação\", meta: \"10:25\", marker: \"success\" },\n * { id: \"3\", title: \"Saiu pra entrega\", meta: \"11:00\", marker: \"warning\" },\n * ]} />\n */\nexport function Timeline({ items, connector = true, className, ...props }: TimelineProps) {\n return (\n <ol className={cn(styles.timeline, connector && styles.connector, className)} {...props}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={item.id} className={styles.item}>\n <div className={styles.markerColumn}>\n <span\n className={cn(\n styles.marker,\n styles[`marker-${item.marker ?? \"primary\"}`],\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n {connector && !isLast && (\n <span className={styles.line} aria-hidden=\"true\" />\n )}\n </div>\n <div className={styles.body}>\n <div className={styles.row}>\n <span className={styles.title}>{item.title}</span>\n {item.meta && <span className={styles.meta}>{item.meta}</span>}\n </div>\n {item.description && (\n <p className={styles.description}>{item.description}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n","import { cloneElement, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tooltip.module.css\";\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n /** Tooltip content. Plain text recommended; rich content also works. */\n content: ReactNode;\n /** Placement relative to the trigger. Default: `\"top\"`. */\n placement?: TooltipPlacement;\n /** Single React element to attach hover/focus listeners to. */\n children: ReactElement;\n /** Disable the tooltip without changing the trigger. */\n disabled?: boolean;\n /** Delay (ms) before showing the tooltip. Default: 150. */\n openDelay?: number;\n}\n\n/**\n * Lightweight tooltip. Shows on hover and on focus (keyboard-friendly). Wraps\n * a single child element via `cloneElement`, so the trigger keeps its own ref\n * and props.\n */\nexport function Tooltip({\n content,\n placement = \"top\",\n children,\n disabled = false,\n openDelay = 150,\n}: TooltipProps) {\n const [open, setOpen] = useState<boolean>(false);\n const tooltipId = useId();\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function show(): void {\n if (disabled) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => setOpen(true), openDelay);\n }\n\n function hide(): void {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n setOpen(false);\n }\n\n const trigger = cloneElement(children, {\n onMouseEnter: show,\n onMouseLeave: hide,\n onFocus: show,\n onBlur: hide,\n \"aria-describedby\": open ? tooltipId : undefined,\n } as Record<string, unknown>);\n\n return (\n <span className={styles.trigger}>\n {trigger}\n {open && (\n <span\n id={tooltipId}\n role=\"tooltip\"\n className={cn(styles.bubble, styles[placement])}\n >\n {content}\n </span>\n )}\n </span>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Toast.module.css\";\n\nexport type ToastVariant = \"success\" | \"warning\" | \"error\" | \"info\";\n\nexport interface ToastOptions {\n id?: string;\n title?: string;\n description?: string;\n variant?: ToastVariant;\n /** Auto-dismiss timeout in ms. Pass `0` to keep the toast until dismissed manually. */\n duration?: number;\n}\n\ninterface ToastEntry extends Required<Omit<ToastOptions, \"id\" | \"title\" | \"description\">> {\n id: string;\n title?: string;\n description?: string;\n}\n\nexport interface ToastApi {\n show: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n success: (\n description: string,\n options?: Omit<ToastOptions, \"variant\" | \"description\">,\n ) => string;\n error: (description: string, options?: Omit<ToastOptions, \"variant\" | \"description\">) => string;\n warning: (\n description: string,\n options?: Omit<ToastOptions, \"variant\" | \"description\">,\n ) => string;\n info: (description: string, options?: Omit<ToastOptions, \"variant\" | \"description\">) => string;\n}\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\n/**\n * Access the toast API. Must be used inside a {@link ToastProvider}.\n *\n * @returns Methods to show and dismiss toasts.\n */\nexport function useToast(): ToastApi {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used inside a <ToastProvider>\");\n return ctx;\n}\n\nexport type ToastPosition =\n | \"top-right\"\n | \"top-left\"\n | \"top-center\"\n | \"bottom-right\"\n | \"bottom-left\"\n | \"bottom-center\";\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Default auto-dismiss duration (ms). Default 4000. */\n defaultDuration?: number;\n /** Stack position on screen. Default `\"top-right\"`. */\n position?: ToastPosition;\n}\n\n/**\n * Renders a portalled toast container and exposes the imperative {@link useToast} API.\n */\nexport function ToastProvider({\n children,\n defaultDuration = 4000,\n position = \"top-right\",\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n const counter = useRef<number>(0);\n\n const dismiss = useCallback((id: string): void => {\n setToasts((current) => current.filter((toast) => toast.id !== id));\n }, []);\n\n const show = useCallback(\n (options: ToastOptions): string => {\n const id = options.id ?? `toast-${++counter.current}`;\n const entry: ToastEntry = {\n id,\n title: options.title,\n description: options.description,\n variant: options.variant ?? \"info\",\n duration: options.duration ?? defaultDuration,\n };\n setToasts((current) => [...current, entry]);\n return id;\n },\n [defaultDuration],\n );\n\n const api = useMemo<ToastApi>(\n () => ({\n show,\n dismiss,\n success: (description, options) =>\n show({ ...options, description, variant: \"success\" }),\n error: (description, options) => show({ ...options, description, variant: \"error\" }),\n warning: (description, options) =>\n show({ ...options, description, variant: \"warning\" }),\n info: (description, options) => show({ ...options, description, variant: \"info\" }),\n }),\n [show, dismiss],\n );\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismiss} position={position} />\n </ToastContext.Provider>\n );\n}\n\ninterface ContainerProps {\n toasts: ToastEntry[];\n onDismiss: (id: string) => void;\n position: ToastPosition;\n}\n\nfunction positionClass(position: ToastPosition): string {\n switch (position) {\n case \"top-left\":\n return styles.positionTopLeft;\n case \"top-center\":\n return styles.positionTopCenter;\n case \"bottom-right\":\n return styles.positionBottomRight;\n case \"bottom-left\":\n return styles.positionBottomLeft;\n case \"bottom-center\":\n return styles.positionBottomCenter;\n case \"top-right\":\n default:\n return styles.positionTopRight;\n }\n}\n\nfunction ToastContainer({ toasts, onDismiss, position }: ContainerProps) {\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div\n className={cn(styles.container, positionClass(position))}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>,\n document.body,\n );\n}\n\ninterface ItemProps {\n toast: ToastEntry;\n onDismiss: (id: string) => void;\n}\n\nfunction ToastItem({ toast, onDismiss }: ItemProps) {\n useEffect(() => {\n if (!toast.duration) return;\n const timer = setTimeout(() => onDismiss(toast.id), toast.duration);\n return () => clearTimeout(timer);\n }, [toast.id, toast.duration, onDismiss]);\n\n return (\n <div className={cn(styles.toast, styles[toast.variant])} role=\"status\">\n <div>\n {toast.title && <p className={styles.title}>{toast.title}</p>}\n {toast.description && <p className={styles.description}>{toast.description}</p>}\n </div>\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar notificação\"\n onClick={() => onDismiss(toast.id)}\n >\n <CloseIcon />\n </button>\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./VirtualList.module.css\";\n\nexport interface VirtualListProps<T> {\n items: T[];\n /** Fixed pixel height for each row. */\n itemHeight: number;\n /** Render a single row. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Container height (px) or any CSS length. */\n height: number | string;\n /** Number of items rendered above/below the viewport. Default: 4. */\n overscan?: number;\n /** Stable key derivation; defaults to the index. */\n getKey?: (item: T, index: number) => string | number;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Fixed-height virtual list. Renders only the visible window plus a small\n * overscan buffer. Suitable for lists of thousands of identical rows.\n *\n * For variable heights, use `react-window`/`@tanstack/react-virtual` — those\n * solve a more general problem at the cost of extra setup.\n */\nexport function VirtualList<T>({\n items,\n itemHeight,\n renderItem,\n height,\n overscan = 4,\n getKey,\n className,\n style,\n}: VirtualListProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState<number>(0);\n const [viewport, setViewport] = useState<number>(0);\n\n useEffect(() => {\n const element = containerRef.current;\n if (!element) return;\n setViewport(element.clientHeight);\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => setViewport(element.clientHeight));\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const totalHeight = items.length * itemHeight;\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const visibleCount = Math.ceil(viewport / itemHeight) + overscan * 2;\n const end = Math.min(items.length, start + visibleCount);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.scroll, className)}\n style={{ height, ...style }}\n onScroll={(event) => setScrollTop((event.target as HTMLDivElement).scrollTop)}\n role=\"list\"\n >\n <div className={styles.spacer} style={{ height: totalHeight }}>\n {items.slice(start, end).map((item, offset) => {\n const index = start + offset;\n const key = getKey ? getKey(item, index) : index;\n return (\n <div\n key={key}\n role=\"listitem\"\n className={styles.row}\n style={{ top: index * itemHeight, height: itemHeight }}\n >\n {renderItem(item, index)}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* clipboard unavailable — silently ignore */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n","export type RelativeTimeLocale = \"pt-BR\" | \"en\";\n\ninterface Strings {\n justNow: string;\n secondsAgo: (n: number) => string;\n minutesAgo: (n: number) => string;\n hoursAgo: (n: number) => string;\n daysAgo: (n: number) => string;\n weeksAgo: (n: number) => string;\n monthsAgo: (n: number) => string;\n yearsAgo: (n: number) => string;\n inSeconds: (n: number) => string;\n inMinutes: (n: number) => string;\n inHours: (n: number) => string;\n inDays: (n: number) => string;\n inWeeks: (n: number) => string;\n inMonths: (n: number) => string;\n inYears: (n: number) => string;\n}\n\nconst PT_BR: Strings = {\n justNow: \"agora há pouco\",\n secondsAgo: (n) => `${n} s atrás`,\n minutesAgo: (n) => `${n} min atrás`,\n hoursAgo: (n) => (n === 1 ? \"1 hora atrás\" : `${n} horas atrás`),\n daysAgo: (n) => (n === 1 ? \"ontem\" : `${n} dias atrás`),\n weeksAgo: (n) => (n === 1 ? \"semana passada\" : `${n} semanas atrás`),\n monthsAgo: (n) => (n === 1 ? \"mês passado\" : `${n} meses atrás`),\n yearsAgo: (n) => (n === 1 ? \"ano passado\" : `${n} anos atrás`),\n inSeconds: (n) => `em ${n} s`,\n inMinutes: (n) => `em ${n} min`,\n inHours: (n) => `em ${n} h`,\n inDays: (n) => `em ${n} ${n === 1 ? \"dia\" : \"dias\"}`,\n inWeeks: (n) => `em ${n} ${n === 1 ? \"semana\" : \"semanas\"}`,\n inMonths: (n) => `em ${n} ${n === 1 ? \"mês\" : \"meses\"}`,\n inYears: (n) => `em ${n} ${n === 1 ? \"ano\" : \"anos\"}`,\n};\n\nconst EN: Strings = {\n justNow: \"just now\",\n secondsAgo: (n) => `${n}s ago`,\n minutesAgo: (n) => `${n}m ago`,\n hoursAgo: (n) => `${n}h ago`,\n daysAgo: (n) => (n === 1 ? \"yesterday\" : `${n} days ago`),\n weeksAgo: (n) => `${n}w ago`,\n monthsAgo: (n) => `${n}mo ago`,\n yearsAgo: (n) => `${n}y ago`,\n inSeconds: (n) => `in ${n}s`,\n inMinutes: (n) => `in ${n}m`,\n inHours: (n) => `in ${n}h`,\n inDays: (n) => `in ${n}d`,\n inWeeks: (n) => `in ${n}w`,\n inMonths: (n) => `in ${n}mo`,\n inYears: (n) => `in ${n}y`,\n};\n\nconst LOCALES: Record<RelativeTimeLocale, Strings> = { \"pt-BR\": PT_BR, en: EN };\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\n/**\n * Render a `Date` / ISO string as a relative-time string. Supports past and\n * future, PT-BR (default) and English.\n *\n * @example\n * relativeTime(new Date(Date.now() - 90_000)); // \"1 min atrás\"\n * relativeTime(\"2026-05-17T10:00:00Z\", { locale: \"en\" }); // \"5h ago\"\n */\nexport function relativeTime(\n input: Date | string | number,\n options: { locale?: RelativeTimeLocale; now?: Date | number } = {},\n): string {\n const { locale = \"pt-BR\", now = Date.now() } = options;\n const strings = LOCALES[locale];\n const target = input instanceof Date ? input.getTime() : new Date(input).getTime();\n const nowMs = typeof now === \"number\" ? now : now.getTime();\n const diff = nowMs - target;\n const past = diff >= 0;\n const abs = Math.abs(diff);\n\n if (abs < 30 * SECOND) return strings.justNow;\n if (abs < MINUTE) {\n const n = Math.round(abs / SECOND);\n return past ? strings.secondsAgo(n) : strings.inSeconds(n);\n }\n if (abs < HOUR) {\n const n = Math.round(abs / MINUTE);\n return past ? strings.minutesAgo(n) : strings.inMinutes(n);\n }\n if (abs < DAY) {\n const n = Math.round(abs / HOUR);\n return past ? strings.hoursAgo(n) : strings.inHours(n);\n }\n if (abs < WEEK) {\n const n = Math.round(abs / DAY);\n return past ? strings.daysAgo(n) : strings.inDays(n);\n }\n if (abs < MONTH) {\n const n = Math.round(abs / WEEK);\n return past ? strings.weeksAgo(n) : strings.inWeeks(n);\n }\n if (abs < YEAR) {\n const n = Math.round(abs / MONTH);\n return past ? strings.monthsAgo(n) : strings.inMonths(n);\n }\n const n = Math.round(abs / YEAR);\n return past ? strings.yearsAgo(n) : strings.inYears(n);\n}\n","import type { HTMLAttributes } from \"react\";\nimport { relativeTime } from \"@/utils/relative-time\";\n\nexport interface RelativeTimeProps extends HTMLAttributes<HTMLTimeElement> {\n /** The instant to render relative to now. */\n date: Date | string | number;\n /** Output language. Defaults to \"pt\". */\n locale?: \"pt\" | \"en\";\n}\n\n/**\n * Render a date as a human-friendly relative-time string (e.g. \"5 min atrás\")\n * inside a semantic `<time>` element with a machine-readable `dateTime`.\n *\n * Delegates the wording to the `relativeTime` util; \"pt\" maps to its \"pt-BR\"\n * locale.\n *\n * @example\n * <RelativeTime date={post.createdAt} locale=\"en\" />\n */\nexport function RelativeTime({ date, locale = \"pt\", ...props }: RelativeTimeProps) {\n const target = date instanceof Date ? date : new Date(date);\n const iso = Number.isNaN(target.getTime()) ? undefined : target.toISOString();\n const label = relativeTime(date, { locale: locale === \"pt\" ? \"pt-BR\" : \"en\" });\n\n return (\n <time dateTime={iso} {...props}>\n {label}\n </time>\n );\n}\n","import type { HTMLAttributes } from \"react\";\n\nexport interface MoneyProps extends HTMLAttributes<HTMLSpanElement> {\n /** Amount in the smallest currency unit (e.g. cents). */\n cents: number;\n /** ISO 4217 currency code. Defaults to \"BRL\". */\n currency?: string;\n /** BCP 47 locale used for formatting. Defaults to \"pt-BR\". */\n locale?: string;\n}\n\n/**\n * Render a monetary amount given in cents as a localized currency string\n * inside a `<span>`.\n *\n * The integer cents are divided by 100 and formatted with `Intl.NumberFormat`.\n *\n * @example\n * <Money cents={1990} /> // \"R$ 19,90\"\n * <Money cents={500} currency=\"USD\" locale=\"en-US\" /> // \"$5.00\"\n */\nexport function Money({ cents, currency = \"BRL\", locale = \"pt-BR\", ...props }: MoneyProps) {\n const formatted = new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n\n return <span {...props}>{formatted}</span>;\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TruncateText.module.css\";\n\nexport interface TruncateTextProps extends HTMLAttributes<HTMLDivElement> {\n /** Maximum number of lines to show before clamping. Defaults to 1. */\n lines?: number;\n /** Content to clamp. */\n children: ReactNode;\n}\n\n/**\n * Clamp text to a fixed number of lines using a CSS line-clamp, adding an\n * ellipsis on overflow. The line count is driven by the\n * `--tempest-clamp-lines` custom property.\n *\n * @example\n * <TruncateText lines={2}>{longDescription}</TruncateText>\n */\nexport function TruncateText({\n lines = 1,\n className,\n style,\n children,\n ...props\n}: TruncateTextProps) {\n const mergedStyle = {\n ...style,\n \"--tempest-clamp-lines\": lines,\n } as CSSProperties;\n\n return (\n <div className={cn(styles.clamp, className)} style={mergedStyle} {...props}>\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, JSX } from \"react\";\nimport { createElement } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./VisuallyHidden.module.css\";\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {\n /** Intrinsic element to render. Defaults to \"span\". */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * Render content that is hidden visually but remains available to screen\n * readers — the standard \"sr-only\" pattern. Useful for accessible labels on\n * icon-only controls.\n *\n * @example\n * <button><Icon /><VisuallyHidden>Close</VisuallyHidden></button>\n */\nexport function VisuallyHidden({\n as = \"span\",\n className,\n children,\n ...props\n}: VisuallyHiddenProps) {\n return createElement(as, { className: cn(styles.hidden, className), ...props }, children);\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /** Target DOM node to render into. Defaults to `document.body`. */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts. Defaults to `document.body` when no `container`\n * is provided.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted || typeof document === \"undefined\") {\n return null;\n }\n\n return createPortal(children, container ?? document.body);\n}\n","import { useEffect, useRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface ClickOutsideProps extends HTMLAttributes<HTMLDivElement> {\n /** Called when a pointer event lands outside the wrapped subtree. */\n onOutside: (event: MouseEvent | TouchEvent) => void;\n /** Content wrapped by the outside-click boundary. */\n children: ReactNode;\n}\n\n/**\n * Wraps its children in a `<div>` and invokes `onOutside` whenever a\n * `mousedown` or `touchstart` event occurs outside that subtree.\n *\n * Useful for dismissing popovers, dropdowns and menus on outside interaction.\n * Listeners are attached to `document` on mount and removed on unmount.\n *\n * @param props - The click-outside props, plus any `<div>` attributes.\n * @returns The wrapper element containing the children.\n */\nexport function ClickOutside({ onOutside, children, ...props }: ClickOutsideProps): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n const handlerRef = useRef(onOutside);\n handlerRef.current = onOutside;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n function handle(event: MouseEvent | TouchEvent): void {\n const node = ref.current;\n const target = event.target as Node | null;\n if (node && target && !node.contains(target)) {\n handlerRef.current(event);\n }\n }\n\n document.addEventListener(\"mousedown\", handle);\n document.addEventListener(\"touchstart\", handle);\n return () => {\n document.removeEventListener(\"mousedown\", handle);\n document.removeEventListener(\"touchstart\", handle);\n };\n }, []);\n\n return (\n <div ref={ref} {...props}>\n {children}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n","import { Fragment, type ReactNode } from \"react\";\n\nexport interface ForProps<T> {\n /** The collection to iterate over. */\n each: readonly T[];\n /** Render function called for each item with its index. */\n children: (item: T, index: number) => ReactNode;\n /** Rendered when `each` is empty. Defaults to `null`. */\n fallback?: ReactNode;\n}\n\n/**\n * Typed, JSX-friendly list renderer.\n *\n * Maps over `each`, calling `children(item, index)` for every entry. When\n * `each` is empty, it renders `fallback` (or nothing). The generic parameter is\n * inferred from `each`, so the render callback's `item` is fully typed:\n * `<For each={users}>{(user) => <li>{user.name}</li>}</For>`.\n *\n * @typeParam T - The element type of the `each` collection.\n * @param props - The list-rendering props.\n * @returns The mapped children, or the fallback when `each` is empty.\n */\nexport function For<T>({ each, children, fallback = null }: ForProps<T>): ReactNode {\n if (each.length === 0) {\n return <>{fallback}</>;\n }\n return (\n <>\n {each.map((item, index) => (\n <Fragment key={index}>{children(item, index)}</Fragment>\n ))}\n </>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ErrorText.module.css\";\n\nexport interface ErrorTextProps extends HTMLAttributes<HTMLParagraphElement> {\n /** The error message. When empty, the component renders nothing. */\n children?: ReactNode;\n}\n\n/**\n * Renders a form-field error message as a `<p role=\"alert\">`.\n *\n * Renders `null` when there are no children, so it can be placed\n * unconditionally below a field and only appears when an error is present.\n * Styled with the `--tempest-danger` token (falling back to a red default).\n *\n * @param props - The error-text props, plus any `<p>` attributes.\n * @returns The alert paragraph, or `null` when there is no message.\n */\nexport function ErrorText({ children, className, ...props }: ErrorTextProps): ReactNode {\n if (children === null || children === undefined || children === false || children === \"\") {\n return null;\n }\n return (\n <p role=\"alert\" className={cn(styles.errorText, className)} {...props}>\n {children}\n </p>\n );\n}\n","import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { Fragment } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DescriptionList.module.css\";\n\nexport interface DescriptionListItem {\n /** The key/label rendered inside a `<dt>`. */\n term: ReactNode;\n /** The value rendered inside a `<dd>`. */\n description: ReactNode;\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** Term/description pairs rendered as `<dt>`/`<dd>` rows. */\n items: DescriptionListItem[];\n}\n\n/**\n * Renders a semantic `<dl>` of term/description pairs with minimal\n * token-based key/value styling.\n *\n * @param items - The term/description pairs to render.\n * @returns The rendered description list.\n */\nexport function DescriptionList({ items, className, ...props }: DescriptionListProps) {\n return (\n <dl className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <Fragment key={index}>\n <dt className={styles.term}>{item.term}</dt>\n <dd className={styles.description}>{item.description}</dd>\n </Fragment>\n ))}\n </dl>\n );\n}\n","import { forwardRef, useCallback, useState } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Toggle.module.css\";\n\nexport type ToggleSize = \"sm\" | \"md\" | \"lg\";\nexport type ToggleVariant = \"default\" | \"outline\";\n\nexport interface ToggleProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n /** Controlled pressed state. When provided the component is controlled. */\n pressed?: boolean;\n /** Initial pressed state for the uncontrolled variant. Default `false`. */\n defaultPressed?: boolean;\n /** Fired with the next pressed state whenever the toggle is activated. */\n onPressedChange?: (pressed: boolean) => void;\n /** Visual size. Default `\"md\"`. */\n size?: ToggleSize;\n /** Visual style. Default `\"default\"`. */\n variant?: ToggleVariant;\n}\n\n/**\n * A pressable two-state button — like a checkbox styled as a button.\n *\n * Works controlled (pass `pressed` + `onPressedChange`) or uncontrolled\n * (pass `defaultPressed`). Renders a native `<button type=\"button\">` exposing\n * its state through `aria-pressed`.\n *\n * @param props - {@link ToggleProps}.\n * @returns The toggle button element.\n */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(function Toggle(\n {\n pressed,\n defaultPressed = false,\n onPressedChange,\n size = \"md\",\n variant = \"default\",\n className,\n disabled,\n onClick,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = pressed !== undefined;\n const [internalPressed, setInternalPressed] = useState<boolean>(defaultPressed);\n const isPressed = isControlled ? pressed : internalPressed;\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>): void => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n const next = !isPressed;\n if (!isControlled) setInternalPressed(next);\n onPressedChange?.(next);\n },\n [isPressed, isControlled, onClick, onPressedChange],\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={isPressed}\n disabled={disabled}\n data-state={isPressed ? \"on\" : \"off\"}\n className={cn(\n styles.toggle,\n styles[size],\n styles[variant],\n isPressed && styles.pressed,\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n});\n","import { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ToggleGroup.module.css\";\n\nexport type ToggleGroupType = \"single\" | \"multiple\";\n\ninterface ToggleGroupContextValue {\n type: ToggleGroupType;\n isSelected: (value: string) => boolean;\n toggle: (value: string) => void;\n}\n\nconst ToggleGroupContext = createContext<ToggleGroupContextValue | null>(null);\n\nfunction useToggleGroupContext(): ToggleGroupContextValue {\n const ctx = useContext(ToggleGroupContext);\n if (!ctx) {\n throw new Error(\"ToggleGroupItem must be used within a ToggleGroup\");\n }\n return ctx;\n}\n\nexport interface ToggleGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Selection mode. `\"single\"` keeps one value; `\"multiple\"` keeps a set. Default `\"single\"`. */\n type?: ToggleGroupType;\n /** Controlled value — `string` for `single`, `string[]` for `multiple`. */\n value?: string | string[];\n /** Uncontrolled initial value. */\n defaultValue?: string | string[];\n /** Fired with the next value whenever the selection changes. */\n onValueChange?: (value: string | string[]) => void;\n children: ReactNode;\n}\n\nfunction normalizeArray(value: string | string[] | undefined): string[] {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * A set of {@link ToggleGroupItem}s that share selection state via context.\n *\n * In `single` mode the value is a `string` (empty string when nothing is\n * selected); in `multiple` mode it is a `string[]`. Works controlled (pass\n * `value` + `onValueChange`) or uncontrolled (pass `defaultValue`).\n *\n * @param props - {@link ToggleGroupProps}.\n * @returns A `role=\"group\"` container wrapping the items.\n */\nexport function ToggleGroup({\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n className,\n children,\n ...props\n}: ToggleGroupProps) {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string[]>(() =>\n normalizeArray(defaultValue),\n );\n const selected = isControlled ? normalizeArray(value) : internalValue;\n\n const commit = useCallback(\n (next: string[]): void => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(type === \"single\" ? (next[0] ?? \"\") : next);\n },\n [isControlled, onValueChange, type],\n );\n\n const toggle = useCallback(\n (itemValue: string): void => {\n const isOn = selected.includes(itemValue);\n if (type === \"single\") {\n commit(isOn ? [] : [itemValue]);\n } else {\n commit(isOn ? selected.filter((v) => v !== itemValue) : [...selected, itemValue]);\n }\n },\n [selected, type, commit],\n );\n\n const ctx = useMemo<ToggleGroupContextValue>(\n () => ({\n type,\n isSelected: (itemValue: string) => selected.includes(itemValue),\n toggle,\n }),\n [type, selected, toggle],\n );\n\n return (\n <ToggleGroupContext.Provider value={ctx}>\n <div role=\"group\" className={cn(styles.group, className)} {...props}>\n {children}\n </div>\n </ToggleGroupContext.Provider>\n );\n}\n\nexport interface ToggleGroupItemProps extends Omit<HTMLAttributes<HTMLButtonElement>, \"onClick\"> {\n /** Stable value identifying this item within the group. */\n value: string;\n /** Disables the item. */\n disabled?: boolean;\n children: ReactNode;\n}\n\n/**\n * A single selectable item inside a {@link ToggleGroup}. Reads and updates the\n * group's shared state through context.\n *\n * @param props - {@link ToggleGroupItemProps}.\n * @returns A `role=\"button\"` element exposing its state via `aria-pressed`.\n */\nexport function ToggleGroupItem({\n value,\n disabled,\n className,\n children,\n ...props\n}: ToggleGroupItemProps) {\n const { isSelected, toggle } = useToggleGroupContext();\n const selected = isSelected(value);\n\n return (\n <button\n type=\"button\"\n role=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n data-state={selected ? \"on\" : \"off\"}\n className={cn(styles.item, selected && styles.selected, className)}\n onClick={() => toggle(value)}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n","import { useCallback, useId, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Collapsible.module.css\";\n\nexport interface CollapsibleProps extends HTMLAttributes<HTMLDivElement> {\n /** Controlled open state. When provided the component is controlled. */\n open?: boolean;\n /** Initial open state for the uncontrolled variant. Default `false`. */\n defaultOpen?: boolean;\n /** Fired with the next open state whenever the trigger is activated. */\n onOpenChange?: (open: boolean) => void;\n /** Content rendered inside the trigger button. */\n trigger: ReactNode;\n /** Collapsible content, hidden while closed. */\n children: ReactNode;\n}\n\n/**\n * A single expand/collapse region — a lighter alternative to `Accordion` for\n * one toggleable block. The trigger is a `<button aria-expanded aria-controls>`\n * wired to a content region sharing the same id; the region is `hidden` while\n * closed. Works controlled (`open` + `onOpenChange`) or uncontrolled\n * (`defaultOpen`).\n *\n * @param props - {@link CollapsibleProps}.\n * @returns The collapsible container.\n */\nexport function Collapsible({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n className,\n children,\n ...props\n}: CollapsibleProps) {\n const reactId = useId();\n const contentId = `${reactId}-content`;\n const triggerId = `${reactId}-trigger`;\n\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = useCallback((): void => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n }, [isOpen, isControlled, onOpenChange]);\n\n return (\n <div className={cn(styles.collapsible, isOpen && styles.open, className)} {...props}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={handleToggle}\n >\n {trigger}\n </button>\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n hidden={!isOpen}\n className={styles.content}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Right-click context menu.\n *\n * - Opens at the cursor position on `onContextMenu` (default browser menu suppressed).\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking contexts.\n * - Closes on outside click, Escape, or item selection.\n * - Arrow Up/Down move focus across selectable items; Enter activates the focused item.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({ items, children, className }: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const menuRef = useRef<HTMLUListElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n event.preventDefault();\n setPosition({ x: event.clientX, y: event.clientY });\n setActiveIndex(-1);\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const next = selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1;\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = selectableIndexes.indexOf(activeIndex);\n const prev =\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1;\n setActiveIndex(prev);\n itemRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [open, activeIndex, selectableIndexes, close]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span className={styles.root} onContextMenu={handleContextMenu}>\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={menuRef}\n id={id}\n role=\"menu\"\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n}\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n className,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n return (\n <span\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (\n <div\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], className)}\n {...rest}\n >\n {children}\n </div>\n )}\n </span>\n );\n}\n","import { useEffect } from \"react\";\nimport type { RefObject } from \"react\";\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\n/**\n * Trap keyboard focus inside `containerRef` while `active` is true. Cycles\n * Tab and Shift+Tab between the first and last focusable descendants. Pair\n * with Modal/Drawer for fully-accessible overlays.\n */\nexport function useFocusTrap(containerRef: RefObject<HTMLElement | null>, active: boolean): void {\n useEffect(() => {\n if (!active) return;\n const container = containerRef.current;\n if (!container) return;\n\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n function getFocusable(): HTMLElement[] {\n return Array.from(\n container?.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR) ?? [],\n ).filter((el) => {\n if (el.hasAttribute(\"aria-hidden\")) return false;\n const style = typeof window !== \"undefined\" ? window.getComputedStyle(el) : null;\n if (style && (style.display === \"none\" || style.visibility === \"hidden\")) {\n return false;\n }\n return true;\n });\n }\n\n function handleKeydown(event: KeyboardEvent): void {\n if (event.key !== \"Tab\") return;\n const elements = getFocusable();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0]!;\n const last = elements[elements.length - 1]!;\n const current = document.activeElement as HTMLElement | null;\n if (event.shiftKey) {\n if (current === first || !current || !container?.contains(current)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n if (current === last) {\n event.preventDefault();\n first.focus();\n }\n }\n }\n\n const focusable = getFocusable();\n focusable[0]?.focus();\n document.addEventListener(\"keydown\", handleKeydown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeydown);\n previouslyFocused?.focus?.();\n };\n }, [containerRef, active]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport styles from \"./Command.module.css\";\n\nexport interface CommandItem {\n /** Stable unique identifier for the item. */\n id: string;\n /** Human-readable label shown in the list and matched against the query. */\n label: string;\n /** Optional group heading; items sharing a group are rendered together. */\n group?: string;\n /** Extra terms matched against the query in addition to `label`. */\n keywords?: string[];\n /** Invoked when the item is chosen (click or Enter on the active row). */\n onSelect: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nexport interface CommandProps {\n /** Whether the palette is visible. */\n open: boolean;\n /** Called with the next open state (Escape, selection, backdrop click). */\n onOpenChange: (open: boolean) => void;\n /** Candidate items to filter and display. */\n items: CommandItem[];\n /** Placeholder for the search input. */\n placeholder?: string;\n /** Rendered when no item matches the current query. */\n emptyMessage?: ReactNode;\n /** Forwarded to the dialog element. */\n className?: string;\n}\n\ninterface CommandGroup {\n name: string | undefined;\n items: CommandItem[];\n}\n\n/**\n * Case-insensitively test whether `item` matches `query` by substring against\n * its label and any keywords. An empty query matches everything.\n *\n * @param item - The candidate command item.\n * @param query - The lowercased search query.\n * @returns `true` when the item should be shown.\n */\nfunction matchesQuery(item: CommandItem, query: string): boolean {\n if (query === \"\") return true;\n if (item.label.toLowerCase().includes(query)) return true;\n return (item.keywords ?? []).some((keyword) => keyword.toLowerCase().includes(query));\n}\n\n/**\n * Partition a flat item list into ordered groups, preserving first-seen order\n * for both groups and the items within them.\n *\n * @param items - The (already filtered) items to group.\n * @returns An ordered list of groups.\n */\nfunction groupItems(items: CommandItem[]): CommandGroup[] {\n const groups: CommandGroup[] = [];\n const indexByName = new Map<string | undefined, number>();\n for (const item of items) {\n const existing = indexByName.get(item.group);\n if (existing === undefined) {\n indexByName.set(item.group, groups.length);\n groups.push({ name: item.group, items: [item] });\n } else {\n groups[existing]!.items.push(item);\n }\n }\n return groups;\n}\n\n/**\n * A ⌘K-style command palette: an overlay dialog with a search input that\n * substring-filters items by label and keywords, groups results, and supports\n * full keyboard navigation (Arrow up/down, Enter, Escape). Traps focus while\n * open.\n */\nexport function Command({\n open,\n onOpenChange,\n items,\n placeholder = \"Type a command…\",\n emptyMessage = \"No results\",\n className,\n}: CommandProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const [query, setQuery] = useState<string>(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(0);\n const listId = \"tempest-command-list\";\n\n useFocusTrap(dialogRef, open);\n\n const filtered = useMemo<CommandItem[]>(() => {\n const normalized = query.trim().toLowerCase();\n const visible = items.filter((item) => matchesQuery(item, normalized));\n return groupItems(visible).flatMap((group) => group.items);\n }, [items, query]);\n\n const groups = useMemo<CommandGroup[]>(() => groupItems(filtered), [filtered]);\n\n // Reset transient state whenever the palette opens.\n useEffect(() => {\n if (open) {\n setQuery(\"\");\n setActiveIndex(0);\n }\n }, [open]);\n\n // Keep the active index within bounds as the filtered list shrinks/grows.\n useEffect(() => {\n setActiveIndex((index) => {\n if (filtered.length === 0) return 0;\n return Math.min(index, filtered.length - 1);\n });\n }, [filtered.length]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n function selectItem(item: CommandItem): void {\n item.onSelect();\n onOpenChange(false);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange(false);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index + 1) % filtered.length);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n const item = filtered[activeIndex];\n if (item) selectItem(item);\n }\n }\n\n let renderIndex = -1;\n\n return createPortal(\n <div className={styles.overlay} role=\"presentation\" onClick={() => onOpenChange(false)}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n className={cn(styles.dialog, className)}\n onClick={(event) => event.stopPropagation()}\n >\n <div className={styles.inputRow}>\n <SearchIcon />\n <input\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n autoFocus\n className={styles.input}\n placeholder={placeholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ul id={listId} role=\"listbox\" className={styles.list}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n groups.map((group) => (\n <li key={group.name ?? \"__ungrouped__\"} className={styles.group}>\n {group.name && (\n <div className={styles.groupHeading}>{group.name}</div>\n )}\n <ul role=\"presentation\" className={styles.groupList}>\n {group.items.map((item) => {\n renderIndex += 1;\n const isActive = renderIndex === activeIndex;\n const index = renderIndex;\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\n styles.option,\n isActive && styles.active,\n )}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => selectItem(item)}\n >\n {item.icon && (\n <span className={styles.icon}>{item.icon}</span>\n )}\n <span className={styles.label}>{item.label}</span>\n </li>\n );\n })}\n </ul>\n </li>\n ))\n )}\n </ul>\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n className={styles.searchIcon}\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { CSSProperties, HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ScrollArea.module.css\";\n\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** Caps the container height; numbers are treated as pixels. */\n maxHeight?: number | string;\n /** Which axis scrolls. Default `\"vertical\"`. */\n orientation?: ScrollAreaOrientation;\n}\n\n/**\n * A styled scroll container that overflows on the chosen axis and renders a\n * thin custom scrollbar (WebKit) while staying fully functional in browsers\n * without scrollbar styling. Forwards `className`, `style` and the ref to the\n * underlying `<div>`.\n */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(\n { maxHeight, orientation = \"vertical\", className, style, children, ...props },\n ref,\n) {\n const mergedStyle: CSSProperties = {\n overflowX: orientation === \"vertical\" ? \"hidden\" : \"auto\",\n overflowY: orientation === \"horizontal\" ? \"hidden\" : \"auto\",\n ...(maxHeight !== undefined ? { maxHeight } : {}),\n ...style,\n };\n\n return (\n <div ref={ref} className={cn(styles.root, className)} style={mergedStyle} {...props}>\n {children}\n </div>\n );\n});\n","import { useCallback, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, PointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Resizable.module.css\";\n\nexport type ResizableDirection = \"horizontal\" | \"vertical\";\n\nexport interface ResizableProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Split orientation. `horizontal` (default) places panes side by side. */\n direction?: ResizableDirection;\n /** Initial size of the first pane, as a percentage. Defaults to `50`. */\n defaultSize?: number;\n /** Lower clamp for the first pane size, in percent. Defaults to `10`. */\n min?: number;\n /** Upper clamp for the first pane size, in percent. Defaults to `90`. */\n max?: number;\n /** Exactly two panes — `[paneA, paneB]`. */\n children: [ReactNode, ReactNode];\n}\n\nconst KEY_STEP = 2;\n\n/**\n * Clamp a number into the inclusive `[min, max]` range.\n *\n * @param value - The value to clamp.\n * @param min - Lower bound.\n * @param max - Upper bound.\n * @returns The clamped value.\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * A two-pane split layout with a draggable divider. The first pane is sized via\n * `flex-basis` as a percentage; the second pane fills the rest. Drag the divider\n * with a pointer, or focus it and use the arrow keys to adjust by 2% steps.\n *\n * The size is clamped to `[min, max]` at all times.\n */\nexport function Resizable({\n direction = \"horizontal\",\n defaultSize = 50,\n min = 10,\n max = 90,\n children,\n className,\n ...props\n}: ResizableProps) {\n const [size, setSize] = useState<number>(() => clamp(defaultSize, min, max));\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [paneA, paneB] = children;\n const isHorizontal = direction === \"horizontal\";\n\n const updateFromPointer = useCallback(\n (clientX: number, clientY: number): void => {\n const container = containerRef.current;\n if (!container) return;\n const rect = container.getBoundingClientRect();\n const total = isHorizontal ? rect.width : rect.height;\n if (total <= 0) return;\n const offset = isHorizontal ? clientX - rect.left : clientY - rect.top;\n const percent = (offset / total) * 100;\n setSize(clamp(percent, min, max));\n },\n [isHorizontal, min, max],\n );\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>): void => {\n event.preventDefault();\n const divider = event.currentTarget;\n divider.setPointerCapture(event.pointerId);\n\n const handleMove = (moveEvent: globalThis.PointerEvent): void => {\n updateFromPointer(moveEvent.clientX, moveEvent.clientY);\n };\n const handleUp = (): void => {\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n },\n [updateFromPointer],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>): void => {\n let delta = 0;\n if (isHorizontal) {\n if (event.key === \"ArrowRight\") delta = KEY_STEP;\n else if (event.key === \"ArrowLeft\") delta = -KEY_STEP;\n } else {\n if (event.key === \"ArrowDown\") delta = KEY_STEP;\n else if (event.key === \"ArrowUp\") delta = -KEY_STEP;\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n setSize(min);\n return;\n }\n if (event.key === \"End\") {\n event.preventDefault();\n setSize(max);\n return;\n }\n if (delta === 0) return;\n event.preventDefault();\n setSize((current) => clamp(current + delta, min, max));\n },\n [isHorizontal, min, max],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn(\n styles.root,\n isHorizontal ? styles.horizontal : styles.vertical,\n className,\n )}\n {...props}\n >\n <div className={styles.pane} style={{ flexBasis: `${size}%` }}>\n {paneA}\n </div>\n <div\n role=\"separator\"\n aria-orientation={isHorizontal ? \"vertical\" : \"horizontal\"}\n aria-valuenow={Math.round(size)}\n aria-valuemin={min}\n aria-valuemax={max}\n tabIndex={0}\n className={styles.divider}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n >\n <span className={styles.handle} aria-hidden=\"true\" />\n </div>\n <div className={styles.pane} style={{ flexBasis: `${100 - size}%` }}>\n {paneB}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Calendar.module.css\";\n\nexport type WeekStart = 0 | 1;\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected date. */\n value?: Date;\n /** Initial selected date for the uncontrolled case. */\n defaultValue?: Date;\n /** Called with the newly selected date. */\n onChange?: (date: Date) => void;\n /** Controlled visible month (any day within it). */\n month?: Date;\n /** Called when the visible month changes (prev/next). */\n onMonthChange?: (month: Date) => void;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst DAYS_IN_GRID = 42;\n\n/**\n * Build a `Date` at midnight local time for the given year/month/day.\n *\n * @param year - Full year.\n * @param month - Zero-based month index.\n * @param day - Day of the month.\n * @returns A normalized `Date`.\n */\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\n/**\n * Strip the time portion so two dates can be compared by calendar day.\n *\n * @param date - The date to normalize.\n * @returns A new `Date` at local midnight.\n */\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/**\n * Whether two dates fall on the same calendar day.\n *\n * @param a - First date.\n * @param b - Second date.\n * @returns `true` when year, month and day match.\n */\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/**\n * Whether a date is outside the inclusive `[minDate, maxDate]` window.\n *\n * @param date - The candidate day.\n * @param minDate - Optional lower bound.\n * @param maxDate - Optional upper bound.\n * @returns `true` when the date is disabled.\n */\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/**\n * Compute the 42-cell (6x7) grid of dates covering the given month, padded with\n * leading/trailing days from the adjacent months.\n *\n * @param month - Any date within the target month.\n * @param weekStartsOn - First column of the week.\n * @returns An array of 42 `Date` objects.\n */\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstOfMonth = makeDate(year, monthIndex, 1);\n const firstWeekday = firstOfMonth.getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n\n const cells: Date[] = [];\n for (let i = 0; i < DAYS_IN_GRID; i += 1) {\n cells.push(makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i));\n }\n return cells;\n}\n\n/**\n * Standalone month-grid date picker. Renders a header with the month/year and\n * prev/next buttons, a weekday row, and a 6x7 grid of day buttons. Selection and\n * the visible month can each be controlled or uncontrolled. Grid arithmetic uses\n * plain `Date` math — no external date libraries.\n *\n * Keyboard: arrow keys move focus by day (left/right) or week (up/down), and\n * Enter/Space selects the focused day.\n */\nexport function Calendar({\n value,\n defaultValue,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: CalendarProps) {\n const isSelectionControlled = value !== undefined;\n const [internalSelected, setInternalSelected] = useState<Date | undefined>(defaultValue);\n const selected = isSelectionControlled ? value : internalSelected;\n\n const isMonthControlled = month !== undefined;\n const [internalMonth, setInternalMonth] = useState<Date>(() => {\n const base = month ?? value ?? defaultValue ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const visibleMonth = isMonthControlled\n ? makeDate(month.getFullYear(), month.getMonth(), 1)\n : internalMonth;\n\n const [focusedDay, setFocusedDay] = useState<number | null>(null);\n const gridRef = useRef<HTMLDivElement | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const cells = useMemo(\n () => buildGrid(visibleMonth, weekStartsOn),\n [visibleMonth, weekStartsOn],\n );\n\n const weekdayLabels = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]);\n }, [weekStartsOn]);\n\n const changeMonth = useCallback(\n (offset: number): void => {\n const next = makeDate(visibleMonth.getFullYear(), visibleMonth.getMonth() + offset, 1);\n if (onMonthChange) onMonthChange(next);\n if (!isMonthControlled) setInternalMonth(next);\n },\n [visibleMonth, onMonthChange, isMonthControlled],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n if (onChange) onChange(date);\n if (!isSelectionControlled) setInternalSelected(date);\n },\n [minDate, maxDate, onChange, isSelectionControlled],\n );\n\n const focusCell = useCallback((index: number): void => {\n const clamped = Math.max(0, Math.min(DAYS_IN_GRID - 1, index));\n setFocusedDay(clamped);\n const grid = gridRef.current;\n if (!grid) return;\n const buttons = grid.querySelectorAll<HTMLButtonElement>(\"button[data-day]\");\n buttons[clamped]?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number): void => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell(index - 1);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell(index + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell(index - 7);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n focusCell(index + 7);\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n selectDate(cells[index]);\n break;\n default:\n break;\n }\n },\n [focusCell, selectDate, cells],\n );\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </span>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span key={label} className={styles.weekday} role=\"columnheader\">\n {label}\n </span>\n ))}\n </div>\n\n <div className={styles.grid} role=\"grid\" ref={gridRef}>\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === visibleMonth.getMonth();\n const isSelected = selected ? isSameDay(date, selected) : false;\n const isToday = isSameDay(date, today);\n const disabled = isOutOfRange(date, minDate, maxDate);\n const isFocusTarget =\n focusedDay === null\n ? inMonth && date.getDate() === 1\n : focusedDay === index;\n return (\n <button\n key={index}\n type=\"button\"\n data-day\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n isSelected && styles.selected,\n isToday && styles.today,\n )}\n aria-pressed={isSelected}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n tabIndex={isFocusTarget ? 0 : -1}\n onClick={() => selectDate(date)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Slider.module.css\";\n\nexport interface SliderProps {\n /** Current value. */\n value: number;\n /** Called with the new value on every change. */\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n /** Formatter for the value badge next to the label. Defaults to the raw number. */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\n/**\n * Single-thumb slider built on a native `<input type=\"range\">`, so it stays\n * accessible (keyboard + screen reader) with no positioning libs. The active\n * fill is a percentage-width bar. For a two-thumb range, use `RangeSlider`.\n */\nexport function Slider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n helperText,\n disabled = false,\n formatValue,\n className,\n}: SliderProps) {\n const pct = useMemo(() => {\n const range = max - min;\n if (range <= 0) return 0;\n return Math.min(100, Math.max(0, ((value - min) / range) * 100));\n }, [value, min, max]);\n\n const valueText = formatValue?.(value) ?? String(value);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>): void => {\n onChange(Number(event.target.value));\n },\n [onChange],\n );\n\n return (\n <div className={cn(styles.wrapper, className)}>\n {label && (\n <div className={styles.label}>\n <span>{label}</span>\n <span className={styles.value}>{valueText}</span>\n </div>\n )}\n <div className={styles.field}>\n <div className={styles.track} />\n <div className={styles.fill} style={{ width: `${pct}%` }} />\n <input\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n aria-label={label ?? \"Slider\"}\n aria-valuetext={valueText}\n />\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./MultiSelect.module.css\";\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n options: MultiSelectOption[];\n /** Currently selected values. */\n value: string[];\n onChange: (value: string[]) => void;\n label?: string;\n placeholder?: string;\n helperText?: string;\n error?: string;\n disabled?: boolean;\n /** Cap the number of selectable items. */\n maxItems?: number;\n /** Custom filter — return true to keep the option. Default: case-insensitive substring on label. */\n filter?: (option: MultiSelectOption, query: string) => boolean;\n /** Message shown when no option matches. */\n emptyMessage?: string;\n className?: string;\n}\n\nfunction defaultFilter(option: MultiSelectOption, query: string): boolean {\n if (!query) return true;\n return option.label.toLowerCase().includes(query.toLowerCase());\n}\n\n/**\n * MultiSelect — a filterable dropdown that selects many options, shown as\n * removable chips inside the field. Selecting toggles a value; Backspace on an\n * empty query removes the last chip.\n *\n * Keyboard: ArrowUp/ArrowDown navigate, Enter toggles the active option, Esc\n * closes, Backspace (empty input) pops the last chip.\n */\nexport function MultiSelect({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione\",\n helperText,\n error,\n disabled,\n maxItems,\n filter = defaultFilter,\n emptyMessage = \"Nenhuma opção encontrada\",\n className,\n}: MultiSelectProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const selectedSet = useMemo(() => new Set(value), [value]);\n const selectedOptions = useMemo(\n () =>\n value\n .map((v) => options.find((o) => o.value === v))\n .filter((o): o is MultiSelectOption => Boolean(o)),\n [value, options],\n );\n const filtered = useMemo(\n () => options.filter((o) => filter(o, query)),\n [options, filter, query],\n );\n\n const atMax = maxItems !== undefined && value.length >= maxItems;\n\n const toggle = useCallback(\n (option: MultiSelectOption): void => {\n if (option.disabled) return;\n if (selectedSet.has(option.value)) {\n onChange(value.filter((v) => v !== option.value));\n } else {\n if (atMax) return;\n onChange([...value, option.value]);\n }\n setQuery(\"\");\n inputRef.current?.focus();\n },\n [selectedSet, onChange, value, atMax],\n );\n\n const removeAt = useCallback(\n (optionValue: string): void => {\n onChange(value.filter((v) => v !== optionValue));\n },\n [onChange, value],\n );\n\n useEffect(() => {\n if (!open) return;\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) {\n setOpen(false);\n setQuery(\"\");\n }\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => window.removeEventListener(\"mousedown\", onDown);\n }, [open]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>): void => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => Math.min(filtered.length - 1, current + 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((current) => Math.max(0, current - 1));\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n const option = filtered[activeIndex];\n if (option) toggle(option);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n setQuery(\"\");\n } else if (event.key === \"Backspace\" && query === \"\" && value.length > 0) {\n removeAt(value[value.length - 1]);\n }\n };\n\n return (\n <div ref={rootRef} className={cn(styles.wrapper, error && styles.error, className)}>\n {label && (\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n )}\n <div\n className={cn(styles.field, disabled && styles.disabled)}\n onMouseDown={(event) => {\n if (disabled) return;\n // Keep focus on the input when clicking empty field space.\n if (event.target === event.currentTarget) {\n event.preventDefault();\n inputRef.current?.focus();\n setOpen(true);\n }\n }}\n >\n {selectedOptions.map((option) => (\n <span key={option.value} className={styles.chip}>\n {option.label}\n <button\n type=\"button\"\n className={styles.chipRemove}\n aria-label={`Remover ${option.label}`}\n disabled={disabled}\n onMouseDown={(event) => {\n event.preventDefault();\n removeAt(option.value);\n }}\n >\n ×\n </button>\n </span>\n ))}\n <input\n id={id}\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={`${id}-listbox`}\n aria-autocomplete=\"list\"\n className={styles.input}\n placeholder={value.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n value={query}\n onFocus={() => setOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n {open && (\n <ul\n id={`${id}-listbox`}\n role=\"listbox\"\n aria-multiselectable\n className={styles.menu}\n >\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n filtered.map((option, index) => {\n const isSelected = selectedSet.has(option.value);\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || (!isSelected && atMax)}\n className={cn(\n styles.option,\n index === activeIndex && styles.active,\n isSelected && styles.selected,\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => {\n event.preventDefault();\n toggle(option);\n }}\n >\n <span className={styles.check} aria-hidden>\n {isSelected ? \"✓\" : \"\"}\n </span>\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n )}\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DateRangePicker.module.css\";\n\nexport type WeekStart = 0 | 1;\n\n/** A selected range. Either bound may be `null` while picking. */\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\nexport interface DateRangePickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected range. */\n value: DateRange;\n /** Called with the new range as the user picks start then end. */\n onChange: (range: DateRange) => void;\n /** How many month grids to show side by side. Default `2`. */\n numberOfMonths?: number;\n /** Initial visible month (uncontrolled). Defaults to the range start or today. */\n defaultMonth?: Date;\n minDate?: Date;\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst DAYS_IN_GRID = 42;\n\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction addMonths(date: Date, offset: number): Date {\n return makeDate(date.getFullYear(), date.getMonth() + offset, 1);\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/** Inclusive-exclusive-agnostic \"strictly between a and b\" (a/b order-independent). */\nfunction isBetween(date: Date, a: Date, b: Date): boolean {\n const t = startOfDay(date).getTime();\n const lo = Math.min(startOfDay(a).getTime(), startOfDay(b).getTime());\n const hi = Math.max(startOfDay(a).getTime(), startOfDay(b).getTime());\n return t > lo && t < hi;\n}\n\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstWeekday = makeDate(year, monthIndex, 1).getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n return Array.from({ length: DAYS_IN_GRID }, (_, i) =>\n makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i),\n );\n}\n\n/**\n * Date-range picker: pick a start day, then an end day, across one or more\n * month grids. The hovered day previews the range before the end is committed.\n * Pure `Date` math — no date libraries. For a single date, use `Calendar`.\n *\n * Selection: first click sets `start` (clears `end`); the next click sets `end`\n * (auto-ordered if you click earlier than the start); a third click starts over.\n */\nexport function DateRangePicker({\n value,\n onChange,\n numberOfMonths = 2,\n defaultMonth,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: DateRangePickerProps) {\n const [visibleMonth, setVisibleMonth] = useState<Date>(() => {\n const base = defaultMonth ?? value.start ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const [hovered, setHovered] = useState<Date | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const weekdayLabels = useMemo(\n () => Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]),\n [weekStartsOn],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n const { start, end } = value;\n if (!start || end) {\n onChange({ start: date, end: null });\n } else if (startOfDay(date).getTime() < startOfDay(start).getTime()) {\n onChange({ start: date, end: start });\n } else {\n onChange({ start, end: date });\n }\n },\n [value, onChange, minDate, maxDate],\n );\n\n const changeMonth = useCallback((offset: number): void => {\n setVisibleMonth((current) => addMonths(current, offset));\n }, []);\n\n // Effective end used for preview highlighting (hovered day while picking).\n const previewEnd = value.start && !value.end ? hovered : value.end;\n\n function dayState(date: Date): {\n selected: boolean;\n inRange: boolean;\n isStart: boolean;\n isEnd: boolean;\n } {\n const { start } = value;\n const end = previewEnd;\n const isStart = start ? isSameDay(date, start) : false;\n const isEnd = end ? isSameDay(date, end) : false;\n const inRange = start && end ? isBetween(date, start, end) : false;\n return { selected: isStart || isEnd, inRange, isStart, isEnd };\n }\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.headerSpacer} aria-hidden />\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.months} onMouseLeave={() => setHovered(null)}>\n {Array.from({ length: Math.max(1, numberOfMonths) }, (_, monthOffset) => {\n const month = addMonths(visibleMonth, monthOffset);\n const cells = buildGrid(month, weekStartsOn);\n return (\n <div key={monthOffset} className={styles.month}>\n <div className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[month.getMonth()]} {month.getFullYear()}\n </div>\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span\n key={label}\n className={styles.weekday}\n role=\"columnheader\"\n >\n {label}\n </span>\n ))}\n </div>\n <div className={styles.grid} role=\"grid\">\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === month.getMonth();\n const disabled = isOutOfRange(date, minDate, maxDate);\n const { selected, inRange, isStart, isEnd } = dayState(date);\n const isToday = isSameDay(date, today);\n return (\n <button\n key={index}\n type=\"button\"\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n inRange && styles.inRange,\n selected && styles.selected,\n isStart && styles.rangeStart,\n isEnd && styles.rangeEnd,\n isToday && styles.today,\n )}\n aria-label={`${MONTH_LABELS[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`}\n aria-selected={selected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n onClick={() => selectDate(date)}\n onMouseEnter={() => setHovered(date)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NavigationMenu.module.css\";\n\nexport interface NavigationMenuItem {\n /** Visible label for the entry. */\n label: ReactNode;\n /** When set, the entry renders as an anchor. */\n href?: string;\n /** Invoked when the entry is activated (click / Enter). */\n onSelect?: () => void;\n /** Nested entries — presence turns the item into a submenu trigger. */\n children?: NavigationMenuItem[];\n}\n\nexport interface NavigationMenuProps extends HTMLAttributes<HTMLElement> {\n /** Top-level navigation entries. */\n items: NavigationMenuItem[];\n}\n\n/**\n * Horizontal navigation menu with hover/click/focus dropdown submenus.\n *\n * - Top-level items render in a `<nav><ul>`.\n * - Items with `children` open a submenu panel (`role=\"menu\"`) on hover, focus,\n * or click. Only one panel is open at a time.\n * - Closes on outside click, Escape, or selecting a leaf entry.\n *\n * @example\n * <NavigationMenu\n * items={[\n * { label: \"Home\", href: \"/\" },\n * {\n * label: \"Products\",\n * children: [\n * { label: \"Analytics\", href: \"/analytics\" },\n * { label: \"Billing\", onSelect: () => openBilling() },\n * ],\n * },\n * ]}\n * />\n */\nexport function NavigationMenu({ items, className, ...props }: NavigationMenuProps) {\n const [clickedIndex, setClickedIndex] = useState<number>(-1);\n const [hovered, setHovered] = useState<number>(-1);\n const baseId = useId();\n const rootRef = useRef<HTMLElement>(null);\n\n const close = useCallback((): void => {\n setClickedIndex(-1);\n setHovered(-1);\n }, []);\n\n const openIndex = clickedIndex !== -1 ? clickedIndex : hovered;\n\n useEffect(() => {\n if (openIndex === -1) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") close();\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [openIndex, close]);\n\n const renderLeaf = (item: NavigationMenuItem, role: \"none\" | \"menuitem\"): ReactNode => {\n const handleClick = (): void => {\n item.onSelect?.();\n close();\n };\n if (item.href) {\n return (\n <a\n href={item.href}\n role={role === \"menuitem\" ? \"menuitem\" : undefined}\n className={styles.link}\n onClick={handleClick}\n >\n {item.label}\n </a>\n );\n }\n return (\n <button\n type=\"button\"\n role={role === \"menuitem\" ? \"menuitem\" : undefined}\n className={styles.link}\n onClick={handleClick}\n >\n {item.label}\n </button>\n );\n };\n\n return (\n <nav ref={rootRef} className={cn(styles.root, className)} {...props}>\n <ul className={styles.list}>\n {items.map((item, index) => {\n const hasChildren = !!item.children && item.children.length > 0;\n if (!hasChildren) {\n return (\n <li key={index} className={styles.item}>\n {renderLeaf(item, \"none\")}\n </li>\n );\n }\n const open = openIndex === index;\n const panelId = `${baseId}-panel-${index}`;\n return (\n <li\n key={index}\n className={styles.item}\n onMouseEnter={() => setHovered(index)}\n onMouseLeave={() => setHovered((prev) => (prev === index ? -1 : prev))}\n >\n <button\n type=\"button\"\n className={styles.trigger}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() =>\n setClickedIndex((prev) => (prev === index ? -1 : index))\n }\n onFocus={() => setHovered(index)}\n >\n {item.label}\n </button>\n {open && (\n <ul id={panelId} role=\"menu\" className={styles.panel}>\n {item.children!.map((child, childIndex) => (\n <li key={childIndex} role=\"none\" className={styles.subItem}>\n {renderLeaf(child, \"menuitem\")}\n </li>\n ))}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Menubar.module.css\";\n\nexport type MenubarItem =\n | {\n /** Visible label for the action. */\n label: ReactNode;\n /** Invoked when the action is selected. */\n onSelect?: () => void;\n /** Disable the action. */\n disabled?: boolean;\n /** Optional shortcut hint rendered right-aligned (e.g. `\"⌘S\"`). */\n shortcut?: string;\n }\n | { separator: true };\n\nexport interface MenubarMenu {\n /** Top-level menu label (e.g. `\"File\"`). */\n label: ReactNode;\n /** Items shown in the menu's dropdown. */\n items: MenubarItem[];\n}\n\nexport interface MenubarProps extends HTMLAttributes<HTMLDivElement> {\n /** Top-level menus rendered left-to-right. */\n menus: MenubarMenu[];\n}\n\nfunction isSeparator(item: MenubarItem): item is { separator: true } {\n return \"separator\" in item;\n}\n\n/**\n * Application menubar (File / Edit-style).\n *\n * - `role=\"menubar\"`; each menu is a button that opens a dropdown.\n * - Arrow Left/Right moves between menus (wrapping); opening one closes others.\n * - Closes on outside click, Escape, or selecting an item.\n * - Items may carry a `shortcut` (right-aligned) or be a `{ separator: true }`.\n *\n * @example\n * <Menubar\n * menus={[\n * {\n * label: \"File\",\n * items: [\n * { label: \"New\", shortcut: \"⌘N\", onSelect: () => create() },\n * { separator: true },\n * { label: \"Quit\", onSelect: () => quit() },\n * ],\n * },\n * ]}\n * />\n */\nexport function Menubar({ menus, className, ...props }: MenubarProps) {\n const [openIndex, setOpenIndex] = useState<number>(-1);\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const close = useCallback((): void => {\n setOpenIndex(-1);\n }, []);\n\n useEffect(() => {\n if (openIndex === -1) return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n close();\n triggerRefs.current[openIndex]?.focus();\n return;\n }\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n const next = (openIndex + 1) % menus.length;\n setOpenIndex(next);\n triggerRefs.current[next]?.focus();\n }\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n const prev = (openIndex - 1 + menus.length) % menus.length;\n setOpenIndex(prev);\n triggerRefs.current[prev]?.focus();\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [openIndex, menus.length, close]);\n\n return (\n <div ref={rootRef} role=\"menubar\" className={cn(styles.root, className)} {...props}>\n {menus.map((menu, index) => {\n const open = openIndex === index;\n const panelId = `${baseId}-panel-${index}`;\n return (\n <div key={index} className={styles.menu}>\n <button\n ref={(el) => {\n triggerRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? panelId : undefined}\n className={cn(styles.trigger, open && styles.triggerOpen)}\n onClick={() => setOpenIndex((prev) => (prev === index ? -1 : index))}\n >\n {menu.label}\n </button>\n {open && (\n <ul id={panelId} role=\"menu\" className={styles.panel}>\n {menu.items.map((item, itemIndex) => {\n if (isSeparator(item)) {\n return (\n <li\n key={itemIndex}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={itemIndex} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles.item}\n disabled={item.disabled}\n onClick={() => {\n item.onSelect?.();\n close();\n }}\n >\n <span className={styles.itemLabel}>\n {item.label}\n </span>\n {item.shortcut && (\n <span className={styles.shortcut}>\n {item.shortcut}\n </span>\n )}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Carousel.module.css\";\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Slides — one rendered at a time. */\n children: ReactNode[];\n /** Wrap around at the ends instead of stopping. Default `false`. */\n loop?: boolean;\n /** Show prev/next arrow buttons. Default `true`. */\n showArrows?: boolean;\n /** Show dot indicators. Default `true`. */\n showDots?: boolean;\n /** Controlled active index. */\n index?: number;\n /** Initial index for uncontrolled use. Default `0`. */\n defaultIndex?: number;\n /** Called whenever the active index changes. */\n onIndexChange?: (index: number) => void;\n}\n\n/**\n * Horizontal content slider showing one slide at a time.\n *\n * - Track translates by the active index (`translateX(-index * 100%)`).\n * - Prev/next arrows (disabled at the ends unless `loop`); dot indicators jump.\n * - Controlled (`index`) or uncontrolled (`defaultIndex`).\n * - Arrow Left/Right on the focused region navigates.\n *\n * @example\n * <Carousel loop>\n * <img src=\"/1.jpg\" alt=\"\" />\n * <img src=\"/2.jpg\" alt=\"\" />\n * <img src=\"/3.jpg\" alt=\"\" />\n * </Carousel>\n */\nexport function Carousel({\n children,\n loop = false,\n showArrows = true,\n showDots = true,\n index,\n defaultIndex = 0,\n onIndexChange,\n className,\n ...props\n}: CarouselProps) {\n const count = children.length;\n const isControlled = index !== undefined;\n const [internalIndex, setInternalIndex] = useState<number>(defaultIndex);\n const current = isControlled ? index : internalIndex;\n\n const goTo = useCallback(\n (next: number): void => {\n let target = next;\n if (target < 0) target = loop ? count - 1 : 0;\n else if (target >= count) target = loop ? 0 : count - 1;\n if (target === current) return;\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [count, loop, current, isControlled, onIndexChange],\n );\n\n const atStart = current <= 0;\n const atEnd = current >= count - 1;\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n goTo(current + 1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n goTo(current - 1);\n }\n };\n\n return (\n <div\n role=\"region\"\n aria-roledescription=\"carousel\"\n tabIndex={0}\n className={cn(styles.root, className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <div className={styles.viewport}>\n <div\n className={styles.track}\n style={{ transform: `translateX(-${current * 100}%)` }}\n >\n {children.map((slide, slideIndex) => (\n <div\n key={slideIndex}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${slideIndex + 1} of ${count}`}\n aria-hidden={slideIndex !== current}\n className={styles.slide}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {showArrows && count > 1 && (\n <>\n <button\n type=\"button\"\n className={cn(styles.arrow, styles.prev)}\n aria-label=\"Previous slide\"\n disabled={!loop && atStart}\n onClick={() => goTo(current - 1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className={cn(styles.arrow, styles.next)}\n aria-label=\"Next slide\"\n disabled={!loop && atEnd}\n onClick={() => goTo(current + 1)}\n >\n ›\n </button>\n </>\n )}\n\n {showDots && count > 1 && (\n <div className={styles.dots} role=\"tablist\" aria-label=\"Slides\">\n {children.map((_, dotIndex) => (\n <button\n key={dotIndex}\n type=\"button\"\n role=\"tab\"\n aria-label={`Go to slide ${dotIndex + 1}`}\n aria-selected={dotIndex === current}\n className={cn(styles.dot, dotIndex === current && styles.dotActive)}\n onClick={() => goTo(dotIndex)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\n\nexport interface UsePaginationResult {\n page: number;\n size: number;\n setPage: (page: number) => void;\n setSize: (size: number) => void;\n reset: () => void;\n}\n\n/**\n * Manage page/size state for paginated lists. Reset goes back to page 1\n * without touching the page size.\n *\n * @param initialPage - Starting page (default 1).\n * @param initialSize - Starting page size (default 50).\n * @returns Pagination state and setters.\n */\nexport function usePagination(initialPage = 1, initialSize = 50): UsePaginationResult {\n const [page, setPage] = useState<number>(initialPage);\n const [size, setSize] = useState<number>(initialSize);\n\n const reset = useCallback(() => setPage(1), []);\n\n return { page, size, setPage, setSize, reset };\n}\n","import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Subscribe to a CSS media query and re-render on match changes.\n *\n * @param query - A standard CSS media query string, e.g. \"(max-width: 768px)\".\n * @returns True when the query matches.\n */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const list = window.matchMedia(query);\n const handler = (event: MediaQueryListEvent): void => setMatches(event.matches);\n setMatches(list.matches);\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n }, [query]);\n\n return matches;\n}\n","import { useEffect, useRef } from \"react\";\n\ntype AnyEventTarget = EventTarget | { current: EventTarget | null } | null | undefined;\n\n/**\n * Subscribe to a DOM event with React-friendly semantics.\n *\n * - Handler is stored in a ref so callers can pass inline functions without\n * resubscribing on every render.\n * - `target` defaults to `window`. Accepts a raw `EventTarget` (window, document,\n * element) OR a ref pointing at one.\n * - Returns nothing — cleanup is automatic on unmount or when `eventName`/`target` change.\n */\nexport function useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener<K extends keyof HTMLElementEventMap>(\n eventName: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void;\nexport function useEventListener(\n eventName: string,\n handler: (event: Event) => void,\n target?: AnyEventTarget,\n options?: AddEventListenerOptions | boolean,\n): void {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const resolvedTarget: EventTarget | null =\n target === undefined\n ? typeof window === \"undefined\"\n ? null\n : window\n : \"current\" in (target as { current: unknown })\n ? ((target as { current: EventTarget | null }).current ?? null)\n : (target as EventTarget | null);\n\n if (!resolvedTarget?.addEventListener) return;\n\n const listener: EventListener = (event) => handlerRef.current(event);\n resolvedTarget.addEventListener(eventName, listener, options);\n return () => resolvedTarget.removeEventListener(eventName, listener, options);\n }, [eventName, target, options]);\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* swallow quota/exceptions */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* ignore */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* ignore malformed remote value */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n","import { useCallback, useState } from \"react\";\n\nexport interface ToggleHelpers {\n toggle: () => void;\n setTrue: () => void;\n setFalse: () => void;\n set: (next: boolean) => void;\n}\n\n/**\n * Boolean state with `toggle`/`setTrue`/`setFalse` helpers.\n *\n * @param initial - initial value (default `false`).\n * @returns Tuple `[value, helpers]`.\n */\nexport function useToggle(initial = false): [boolean, ToggleHelpers] {\n const [value, setValue] = useState<boolean>(initial);\n\n const toggle = useCallback((): void => setValue((current) => !current), []);\n const setTrue = useCallback((): void => setValue(true), []);\n const setFalse = useCallback((): void => setValue(false), []);\n const set = useCallback((next: boolean): void => setValue(next), []);\n\n return [value, { toggle, setTrue, setFalse, set }];\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useRef(asyncFn);\n fnRef.current = asyncFn;\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, []);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Track the browser's `navigator.onLine` value and re-render on changes.\n * Returns `true` during SSR (assumption: server is online).\n */\nexport function useOnline(): boolean {\n const [online, setOnline] = useState<boolean>(() =>\n typeof navigator === \"undefined\" ? true : navigator.onLine,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handleOnline = (): void => setOnline(true);\n const handleOffline = (): void => setOnline(false);\n window.addEventListener(\"online\", handleOnline);\n window.addEventListener(\"offline\", handleOffline);\n return () => {\n window.removeEventListener(\"online\", handleOnline);\n window.removeEventListener(\"offline\", handleOffline);\n };\n }, []);\n\n return online;\n}\n","import { useEffect, useState } from \"react\";\n\nexport type DocumentVisibility = \"visible\" | \"hidden\";\n\n/** Subscribe to `document.visibilityState`. Returns `\"visible\"` during SSR. */\nexport function useDocumentVisibility(): DocumentVisibility {\n const [state, setState] = useState<DocumentVisibility>(() =>\n typeof document === \"undefined\"\n ? \"visible\"\n : (document.visibilityState as DocumentVisibility),\n );\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const handler = (): void => setState(document.visibilityState as DocumentVisibility);\n document.addEventListener(\"visibilitychange\", handler);\n return () => document.removeEventListener(\"visibilitychange\", handler);\n }, []);\n\n return state;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface ElementSize {\n width: number;\n height: number;\n}\n\n/**\n * Track size changes of a DOM element via `ResizeObserver`.\n * Returns `null` until the first measurement.\n */\nexport function useResizeObserver(ref: RefObject<Element | null>): ElementSize | null {\n const [size, setSize] = useState<ElementSize | null>(null);\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const box = entry.contentRect;\n setSize({ width: box.width, height: box.height });\n });\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref]);\n\n return size;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n","import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n","import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n","import { useEffect, useState } from \"react\";\n\nexport interface GeolocationState {\n loading: boolean;\n error: GeolocationPositionError | null;\n coords: GeolocationCoordinates | null;\n timestamp: number | null;\n}\n\nexport interface UseGeolocationOptions extends PositionOptions {\n /** Use `watchPosition` instead of one-shot `getCurrentPosition`. Default: false. */\n watch?: boolean;\n /** Disable the hook without unmounting. Default: false. */\n disabled?: boolean;\n}\n\n/** React hook around the Geolocation API. */\nexport function useGeolocation(options: UseGeolocationOptions = {}): GeolocationState {\n const { watch = false, disabled = false, ...positionOptions } = options;\n const [state, setState] = useState<GeolocationState>({\n loading: !disabled,\n error: null,\n coords: null,\n timestamp: null,\n });\n\n useEffect(() => {\n if (disabled || typeof navigator === \"undefined\" || !navigator.geolocation) {\n setState((prev) => ({ ...prev, loading: false }));\n return;\n }\n\n const onSuccess = (position: GeolocationPosition): void => {\n setState({\n loading: false,\n error: null,\n coords: position.coords,\n timestamp: position.timestamp,\n });\n };\n const onError = (error: GeolocationPositionError): void => {\n setState((prev) => ({ ...prev, loading: false, error }));\n };\n\n if (watch) {\n const watchId = navigator.geolocation.watchPosition(\n onSuccess,\n onError,\n positionOptions,\n );\n return () => navigator.geolocation.clearWatch(watchId);\n }\n\n navigator.geolocation.getCurrentPosition(onSuccess, onError, positionOptions);\n return undefined;\n }, [\n disabled,\n watch,\n positionOptions.enableHighAccuracy,\n positionOptions.maximumAge,\n positionOptions.timeout,\n ]);\n\n return state;\n}\n","import { useEffect } from \"react\";\n\n/**\n * Lock `<body>` scroll while `active` is true. Restores the previous overflow\n * value on unmount. Safe to nest: stacks the restoration via a counter.\n */\nexport function useScrollLock(active: boolean): void {\n useEffect(() => {\n if (!active || typeof document === \"undefined\") return;\n const body = document.body;\n const previous = body.style.overflow;\n body.style.overflow = \"hidden\";\n return () => {\n body.style.overflow = previous;\n };\n }, [active]);\n}\n","import { useCallback, useRef } from \"react\";\n\n/**\n * Returns a stable function reference that always invokes the latest\n * `callback` argument. Use to break dependency cycles in effects without\n * triggering re-runs when the callback identity changes.\n */\nexport function useStableCallback<TArgs extends unknown[], TReturn>(\n callback: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const ref = useRef(callback);\n ref.current = callback;\n return useCallback((...args: TArgs) => ref.current(...args), []);\n}\n","import { useRef } from \"react\";\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Return the value from the previous render. `undefined` on the first render.\n *\n * @example\n * const previousCount = usePrevious(count);\n * useEffect(() => {\n * if (previousCount !== undefined && previousCount !== count) {\n * analytics.track(\"count.changed\", { from: previousCount, to: count });\n * }\n * }, [count, previousCount]);\n */\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Run a callback after `delay` ms. Pass `null` to disable. Resets when\n * `delay` changes; the callback ref always points at the latest closure.\n *\n * @example\n * useTimeout(() => setShow(false), show ? 3000 : null);\n */\nexport function useTimeout(fn: () => void, delay: number | null): void {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n if (delay === null) return;\n const id = setTimeout(() => fnRef.current(), delay);\n return () => clearTimeout(id);\n }, [delay]);\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Return a value that updates at most once every `delay` ms. Complements\n * `useDebounce` — throttle emits on the leading edge and again after the\n * interval; debounce only emits after a period of stillness.\n *\n * @example\n * const throttledScroll = useThrottle(scrollY, 100);\n */\nexport function useThrottle<T>(value: T, delay: number): T {\n const [throttled, setThrottled] = useState<T>(value);\n const lastEmitRef = useRef<number>(0);\n const pendingRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const now = Date.now();\n const elapsed = now - lastEmitRef.current;\n if (elapsed >= delay) {\n lastEmitRef.current = now;\n setThrottled(value);\n } else {\n if (pendingRef.current) clearTimeout(pendingRef.current);\n pendingRef.current = setTimeout(() => {\n lastEmitRef.current = Date.now();\n setThrottled(value);\n }, delay - elapsed);\n }\n return () => {\n if (pendingRef.current) clearTimeout(pendingRef.current);\n };\n }, [value, delay]);\n\n return throttled;\n}\n","import { useEffect, useState } from \"react\";\n\nexport interface WindowSize {\n width: number;\n height: number;\n}\n\n/**\n * Reactive window dimensions. SSR-safe — returns `{ width: 0, height: 0 }`\n * until the first client render.\n *\n * @example\n * const { width, height } = useWindowSize();\n * const columns = width < 640 ? 1 : width < 1024 ? 2 : 3;\n */\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>(() =>\n typeof window === \"undefined\"\n ? { width: 0, height: 0 }\n : { width: window.innerWidth, height: window.innerHeight },\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void =>\n setSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n return size;\n}\n","import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\n/**\n * Track whether the pointer is hovering over the referenced element.\n * Returns `false` on touch-only devices (no pointer hover).\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const hovered = useHover(ref);\n * return <div ref={ref}>{hovered ? \"✨\" : \"\"}</div>;\n */\nexport function useHover<T extends HTMLElement>(ref: RefObject<T | null>): boolean {\n const [hovered, setHovered] = useState<boolean>(false);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n const onEnter = (): void => setHovered(true);\n const onLeave = (): void => setHovered(false);\n node.addEventListener(\"mouseenter\", onEnter);\n node.addEventListener(\"mouseleave\", onLeave);\n return () => {\n node.removeEventListener(\"mouseenter\", onEnter);\n node.removeEventListener(\"mouseleave\", onLeave);\n };\n }, [ref]);\n\n return hovered;\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseLongPressOptions {\n /** Press duration in ms. Default `500`. */\n delay?: number;\n /** Pixel threshold — finger/mouse movement beyond this cancels the press. Default `10`. */\n moveThreshold?: number;\n}\n\n/**\n * Detect long-press / long-tap gestures. Fires `fn` after `delay` ms\n * while the element is held. Cancels on move beyond `moveThreshold` or\n * pointer up before `delay`.\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * useLongPress(ref, () => openContextMenu(), { delay: 600 });\n */\nexport function useLongPress<T extends HTMLElement>(\n ref: RefObject<T | null>,\n fn: () => void,\n options: UseLongPressOptions = {},\n): void {\n const { delay = 500, moveThreshold = 10 } = options;\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let startX = 0;\n let startY = 0;\n\n const cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const onDown = (event: PointerEvent): void => {\n startX = event.clientX;\n startY = event.clientY;\n cancel();\n timer = setTimeout(() => {\n timer = null;\n fnRef.current();\n }, delay);\n };\n\n const onMove = (event: PointerEvent): void => {\n if (timer === null) return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (Math.hypot(dx, dy) > moveThreshold) cancel();\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n node.addEventListener(\"pointermove\", onMove);\n node.addEventListener(\"pointerup\", cancel);\n node.addEventListener(\"pointercancel\", cancel);\n node.addEventListener(\"pointerleave\", cancel);\n return () => {\n cancel();\n node.removeEventListener(\"pointerdown\", onDown);\n node.removeEventListener(\"pointermove\", onMove);\n node.removeEventListener(\"pointerup\", cancel);\n node.removeEventListener(\"pointercancel\", cancel);\n node.removeEventListener(\"pointerleave\", cancel);\n };\n }, [ref, delay, moveThreshold]);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface DisclosureHandlers {\n open: () => void;\n close: () => void;\n toggle: () => void;\n}\n\n/**\n * Manage open/closed boolean state with stable `open`/`close`/`toggle` handlers.\n *\n * Richer than {@link useToggle} for UI elements like modals, drawers and\n * popovers: the handlers are referentially stable across renders.\n *\n * @param initial - initial opened state (default `false`).\n * @returns Tuple `[opened, { open, close, toggle }]`.\n */\nexport function useDisclosure(initial = false): [boolean, DisclosureHandlers] {\n const [opened, setOpened] = useState<boolean>(initial);\n\n const open = useCallback((): void => setOpened(true), []);\n const close = useCallback((): void => setOpened(false), []);\n const toggle = useCallback((): void => setOpened((current) => !current), []);\n\n const handlers = useMemo<DisclosureHandlers>(\n () => ({ open, close, toggle }),\n [open, close, toggle],\n );\n\n return [opened, handlers];\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n","import { useEffect } from \"react\";\n\n/**\n * Set `document.title` while the component is mounted, restoring the previous\n * title on unmount. SSR-safe — no-op when `document` is unavailable.\n *\n * @param title - the title to apply.\n */\nexport function useDocumentTitle(title: string): void {\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const previous = document.title;\n document.title = title;\n return () => {\n document.title = previous;\n };\n }, [title]);\n}\n","import { useEffect } from \"react\";\n\n/**\n * Swap the document favicon by updating the `<link rel=\"icon\">` href.\n * Creates the link element when it is missing. SSR-safe — no-op when\n * `document` is unavailable.\n *\n * @param href - the favicon URL to apply.\n */\nexport function useFavicon(href: string): void {\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = href;\n }, [href]);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseMapResult<K, V> {\n map: ReadonlyMap<K, V>;\n set: (key: K, value: V) => void;\n delete: (key: K) => void;\n clear: () => void;\n get: (key: K) => V | undefined;\n has: (key: K) => boolean;\n size: number;\n}\n\n/**\n * Reactive `Map` wrapper. Mutating via `set` / `delete` / `clear` triggers a\n * re-render and yields a fresh `map` reference each time.\n *\n * @typeParam K - key type.\n * @typeParam V - value type.\n * @param initial - initial entries.\n * @returns `{ map, set, delete, clear, get, has, size }`.\n */\nexport function useMap<K, V>(initial?: Iterable<readonly [K, V]>): UseMapResult<K, V> {\n const [map, setMap] = useState<Map<K, V>>(() => new Map(initial));\n\n const set = useCallback((key: K, value: V): void => {\n setMap((current) => {\n const next = new Map(current);\n next.set(key, value);\n return next;\n });\n }, []);\n\n const remove = useCallback((key: K): void => {\n setMap((current) => {\n if (!current.has(key)) return current;\n const next = new Map(current);\n next.delete(key);\n return next;\n });\n }, []);\n\n const clear = useCallback((): void => {\n setMap((current) => (current.size === 0 ? current : new Map<K, V>()));\n }, []);\n\n const get = useCallback((key: K): V | undefined => map.get(key), [map]);\n const has = useCallback((key: K): boolean => map.has(key), [map]);\n\n return useMemo<UseMapResult<K, V>>(\n () => ({\n map,\n set,\n delete: remove,\n clear,\n get,\n has,\n size: map.size,\n }),\n [map, set, remove, clear, get, has],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseSetResult<T> {\n set: ReadonlySet<T>;\n add: (value: T) => void;\n delete: (value: T) => void;\n clear: () => void;\n has: (value: T) => boolean;\n toggle: (value: T) => void;\n size: number;\n}\n\n/**\n * Reactive `Set` wrapper. Mutating via `add` / `delete` / `clear` / `toggle`\n * triggers a re-render and yields a fresh `set` reference each time.\n *\n * @typeParam T - element type.\n * @param initial - initial values.\n * @returns `{ set, add, delete, clear, has, toggle, size }`.\n */\nexport function useSet<T>(initial?: Iterable<T>): UseSetResult<T> {\n const [set, setSet] = useState<Set<T>>(() => new Set(initial));\n\n const add = useCallback((value: T): void => {\n setSet((current) => {\n if (current.has(value)) return current;\n const next = new Set(current);\n next.add(value);\n return next;\n });\n }, []);\n\n const remove = useCallback((value: T): void => {\n setSet((current) => {\n if (!current.has(value)) return current;\n const next = new Set(current);\n next.delete(value);\n return next;\n });\n }, []);\n\n const clear = useCallback((): void => {\n setSet((current) => (current.size === 0 ? current : new Set<T>()));\n }, []);\n\n const has = useCallback((value: T): boolean => set.has(value), [set]);\n\n const toggle = useCallback((value: T): void => {\n setSet((current) => {\n const next = new Set(current);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n });\n }, []);\n\n return useMemo<UseSetResult<T>>(\n () => ({\n set,\n add,\n delete: remove,\n clear,\n has,\n toggle,\n size: set.size,\n }),\n [set, add, remove, clear, has, toggle],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseQueueOptions<T> {\n initialValues?: T[];\n limit?: number;\n}\n\nexport interface UseQueueResult<T> {\n /** Items currently held within the queue (up to `limit`). */\n queue: T[];\n /** Append items; overflow beyond `limit` is held back, not dropped. */\n add: (...items: T[]) => void;\n /** Replace the held queue via a mapper over the current held items. */\n update: (fn: (state: T[]) => T[]) => void;\n /** Drop all currently held (visible) items, keeping any overflow. */\n cleanQueue: () => void;\n /** Number of visible items in the queue. */\n size: number;\n}\n\n/**\n * FIFO queue with an optional `limit`. When more items are added than `limit`\n * allows, the surplus is kept in an internal overflow buffer and surfaces into\n * `queue` as room frees up (e.g. after `cleanQueue`). Loosely mirrors Mantine's\n * `useQueue` shape.\n *\n * @typeParam T - element type.\n * @param options - `initialValues` and `limit` (default limit `Infinity`).\n * @returns `{ queue, add, update, cleanQueue, size }`.\n */\nexport function useQueue<T>(options: UseQueueOptions<T> = {}): UseQueueResult<T> {\n const { initialValues = [], limit = Infinity } = options;\n\n const [state, setState] = useState<{ queue: T[]; overflow: T[] }>(() => ({\n queue: initialValues.slice(0, limit),\n overflow: initialValues.slice(limit),\n }));\n\n const add = useCallback(\n (...items: T[]): void => {\n setState((current) => {\n const all = [...current.queue, ...current.overflow, ...items];\n return {\n queue: all.slice(0, limit),\n overflow: all.slice(limit),\n };\n });\n },\n [limit],\n );\n\n const update = useCallback(\n (fn: (queueState: T[]) => T[]): void => {\n setState((current) => {\n const all = [...fn(current.queue), ...current.overflow];\n return {\n queue: all.slice(0, limit),\n overflow: all.slice(limit),\n };\n });\n },\n [limit],\n );\n\n const cleanQueue = useCallback((): void => {\n setState((current) => ({\n queue: current.overflow.slice(0, limit),\n overflow: current.overflow.slice(limit),\n }));\n }, [limit]);\n\n return useMemo<UseQueueResult<T>>(\n () => ({\n queue: state.queue,\n add,\n update,\n cleanQueue,\n size: state.queue.length,\n }),\n [state.queue, add, update, cleanQueue],\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, []);\n\n return ref;\n}\n","import { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Create an object URL for a `Blob` (or `File`) and revoke it automatically on\n * unmount or whenever the blob changes. Returns `null` for nullish input.\n *\n * @param blob - the blob to expose as an object URL, or `null`/`undefined`.\n * @returns The object URL string, or `null` when there is no blob.\n */\nexport function useObjectUrl(blob: Blob | null | undefined): string | null {\n const [url, setUrl] = useState<string | null>(null);\n\n useEffect(() => {\n if (!blob) {\n setUrl(null);\n return;\n }\n const next = URL.createObjectURL(blob);\n setUrl(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n return url;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from \"react\";\n\n/**\n * DOM event handlers produced by {@link useLongPressHandlers}, ready to spread\n * onto a JSX element (`<div {...handlers}>`).\n */\nexport interface LongPressHandlers {\n /** Starts the hold timer on mouse press. */\n onMouseDown: (event: ReactMouseEvent) => void;\n /** Cancels the pending hold when the mouse is released. */\n onMouseUp: () => void;\n /** Cancels the pending hold when the pointer leaves the element. */\n onMouseLeave: () => void;\n /** Starts the hold timer on touch start. */\n onTouchStart: (event: ReactTouchEvent) => void;\n /** Cancels the pending hold when the touch ends. */\n onTouchEnd: () => void;\n /** Cancels the pending hold when the finger moves. */\n onTouchMove: () => void;\n /** Fires the long-press immediately (desktop right-click parity). */\n onContextMenu: (event: ReactMouseEvent) => void;\n}\n\n/** Options accepted by {@link useLongPressHandlers}. */\nexport interface UseLongPressHandlersOptions {\n /** Hold duration in ms before `onLongPress` fires. Defaults to `500`. */\n delayMs?: number;\n /** When `true`, the hook is inert and every handler is a no-op. */\n disabled?: boolean;\n}\n\n/** Return shape of {@link useLongPressHandlers}. */\nexport type UseLongPressHandlersResult = LongPressHandlers & {\n /**\n * Reads whether the most recent interaction fired a long-press. Use it in\n * the element's `onClick` to suppress the click that follows a long-press.\n */\n wasLongPress: () => boolean;\n};\n\n/**\n * Returns DOM event handlers that detect a long press (touch or mouse hold)\n * and invoke `onLongPress` once after `delayMs`.\n *\n * Cancels on touch movement or pointer release. Also wires `contextmenu` to\n * fire `onLongPress` immediately so a right-click on desktop opens selection\n * mode the same way an Android long-press does on mobile.\n *\n * The hook does not `preventDefault` on the underlying click — the consumer\n * decides whether the subsequent click should still fire. Track that with the\n * returned `wasLongPress()` guard to tell \"long-press fired\" apart from a\n * \"regular click\".\n *\n * Unlike {@link useLongPress}, which attaches pointer listeners to a `ref`,\n * this variant returns handler props you spread directly onto an element and\n * exposes a `wasLongPress()` guard.\n *\n * @param onLongPress - Callback invoked once the hold threshold is reached.\n * @param options - Optional `delayMs` and `disabled` flags.\n * @returns The spreadable handlers plus a `wasLongPress()` guard.\n *\n * @example\n * const longPress = useLongPressHandlers(() => enterSelectionMode(), { delayMs: 600 });\n * <button {...longPress} onClick={() => { if (!longPress.wasLongPress()) navigate(); }}>\n * Item\n * </button>\n */\nexport function useLongPressHandlers(\n onLongPress: () => void,\n options: UseLongPressHandlersOptions = {},\n): UseLongPressHandlersResult {\n const { delayMs = 500, disabled = false } = options;\n const timerRef = useRef<number | null>(null);\n const firedRef = useRef<boolean>(false);\n const callbackRef = useRef<() => void>(onLongPress);\n callbackRef.current = onLongPress;\n\n const clear = useCallback((): void => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const start = useCallback((): void => {\n if (disabled) return;\n firedRef.current = false;\n clear();\n timerRef.current = window.setTimeout(() => {\n firedRef.current = true;\n callbackRef.current();\n }, delayMs);\n }, [disabled, clear, delayMs]);\n\n const onContextMenu = useCallback(\n (event: ReactMouseEvent): void => {\n if (disabled) return;\n event.preventDefault();\n firedRef.current = true;\n callbackRef.current();\n },\n [disabled],\n );\n\n return {\n onMouseDown: start,\n onMouseUp: clear,\n onMouseLeave: clear,\n onTouchStart: start,\n onTouchEnd: clear,\n onTouchMove: clear,\n onContextMenu,\n wasLongPress: () => firedRef.current,\n };\n}\n","/**\n * The Chromium-only `beforeinstallprompt` event. iOS Safari never fires it —\n * for those users the app falls back to manual \"Add to Home Screen\"\n * instructions. Ported into the SDK so consumers get the type without a global\n * augmentation.\n */\nexport interface BeforeInstallPromptEvent extends Event {\n /** Platforms the prompt can target (e.g. `[\"web\", \"android\"]`). */\n readonly platforms: readonly string[];\n /** Resolves once the user accepts or dismisses the prompt. */\n readonly userChoice: Promise<{\n outcome: \"accepted\" | \"dismissed\";\n platform: string;\n }>;\n /** Shows the native install prompt. */\n prompt: () => Promise<void>;\n}\n\n/**\n * Detects iOS / iPadOS Safari, including modern iPads that report `MacIntel`\n * plus multi-touch instead of an `iPad` user agent.\n *\n * @returns `true` when running on iOS/iPadOS.\n */\nexport function isIOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (/iPad|iPhone|iPod/.test(ua)) return true;\n return ua.includes(\"Mac\") && navigator.maxTouchPoints > 1;\n}\n\n/**\n * Detects Android browsers that ship a Chromium fork with the\n * `beforeinstallprompt` event stripped or unreliable. Those users must install\n * via the browser menu manually, identical to iOS Safari.\n *\n * @returns `true` when running on such an Android browser.\n */\nexport function isAndroidWithoutPromptApi(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (!/Android/i.test(ua)) return false;\n return /MiuiBrowser|XiaoMi|UCBrowser|Opera Mini|KAIOS|HuaweiBrowser/i.test(ua);\n}\n\n/**\n * Detects any Android browser.\n *\n * @returns `true` when the user agent reports Android.\n */\nexport function isAndroid(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android/i.test(navigator.userAgent);\n}\n\n/**\n * Builds an `intent://` URL that re-opens the current page inside Chrome on\n * Android. When Chrome is missing, the fallback URL points to the Play Store so\n * the user can still recover. Returns `null` outside Android.\n *\n * @returns The `intent://` URL, or `null` when not on Android or without a DOM.\n * @see https://developer.chrome.com/docs/multidevice/android/intents\n */\nexport function buildOpenInChromeIntent(): string | null {\n if (typeof window === \"undefined\") return null;\n if (!isAndroid()) return null;\n const host = window.location.host;\n const path = window.location.pathname + window.location.search;\n const fallback = encodeURIComponent(\n \"https://play.google.com/store/apps/details?id=com.android.chrome\",\n );\n return `intent://${host}${path}#Intent;scheme=https;package=com.android.chrome;S.browser_fallback_url=${fallback};end`;\n}\n\n/**\n * Reports whether the app is running as an installed PWA (Android Chrome, iOS,\n * or desktop). Use it to suppress install CTAs once the user is already in the\n * standalone shell.\n *\n * @returns `true` when the display mode is standalone or iOS reports standalone.\n */\nexport function isStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n if (window.matchMedia?.(\"(display-mode: standalone)\")?.matches) return true;\n return (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n}\n","import { useEffect, useState } from \"react\";\nimport {\n buildOpenInChromeIntent,\n isAndroidWithoutPromptApi,\n isIOS,\n isStandalone,\n type BeforeInstallPromptEvent,\n} from \"./pwa-env\";\n\nconst DEFAULT_DECLINE_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MANUAL_FALLBACK_DELAY_MS = 3000;\nconst DEFAULT_DECLINE_STORAGE_KEY = \"tempest:install-declined-at\";\n\nlet cachedEvent: BeforeInstallPromptEvent | null = null;\nconst eventSubscribers = new Set<(event: BeforeInstallPromptEvent | null) => void>();\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeinstallprompt\", (event: Event) => {\n event.preventDefault();\n cachedEvent = event as BeforeInstallPromptEvent;\n eventSubscribers.forEach((fn) => fn(cachedEvent));\n });\n window.addEventListener(\"appinstalled\", () => {\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n });\n}\n\n/**\n * Strategy the UI should use to install the app:\n *\n * - `\"native\"`: trigger `BeforeInstallPromptEvent.prompt()`.\n * - `\"ios\"`: show iOS Safari Share → Add to Home Screen instructions.\n * - `\"manual\"`: show generic browser-menu instructions (Chromium forks that\n * strip the prompt API, plus the timeout fallback when no event arrives).\n * - `\"none\"`: nothing to offer (already installed or unsupported runtime).\n */\nexport type InstallMethod = \"native\" | \"ios\" | \"manual\" | \"none\";\n\n/** Options for {@link useInstallPrompt}. */\nexport interface UseInstallPromptOptions {\n /**\n * `localStorage` key used to persist the decline timestamp. Defaults to\n * `\"tempest:install-declined-at\"`.\n */\n declineStorageKey?: string;\n /**\n * How long, in ms, the install CTA stays hidden after the user declines.\n * Defaults to 7 days.\n */\n declineCooldownMs?: number;\n /**\n * How long, in ms, to wait for a `beforeinstallprompt` event before\n * resolving to the `\"manual\"` method. Defaults to `3000`.\n */\n manualFallbackDelayMs?: number;\n}\n\n/** State returned by {@link useInstallPrompt}. */\nexport interface UseInstallPromptResult {\n /** The cached `beforeinstallprompt` event, or `null` when unavailable. */\n deferredPrompt: BeforeInstallPromptEvent | null;\n /** True when the app can be installed through any supported method. */\n canInstall: boolean;\n /** True when running on iOS/iPadOS Safari. */\n isIOS: boolean;\n /** True when already running as an installed PWA. */\n isStandalone: boolean;\n /** True when the browser is an Android Chromium fork with no prompt API. */\n isManualAndroid: boolean;\n /** True when no `beforeinstallprompt` arrived within the timeout window. */\n promptTimedOut: boolean;\n /** The resolved install strategy the UI should follow. */\n method: InstallMethod;\n /** An `intent://` URL to re-open the page in Chrome on Android, else `null`. */\n openInChromeIntent: string | null;\n /**\n * Triggers the native prompt.\n *\n * @returns `true` when the user accepted the install, `false` otherwise.\n */\n install: () => Promise<boolean>;\n /** Records that the user declined the CTA, starting the cooldown window. */\n recordDecline: () => void;\n}\n\nfunction readDecline(key: string, cooldownMs: number): boolean {\n if (typeof window === \"undefined\") return false;\n const raw = window.localStorage.getItem(key);\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts)) return false;\n return Date.now() - ts < cooldownMs;\n}\n\n/**\n * React hook that resolves how (and whether) to offer PWA installation.\n *\n * It caches the `beforeinstallprompt` event, detects iOS/iPadOS, detects\n * Android Chromium forks that lack the prompt API, detects standalone display\n * mode, and applies a decline cooldown persisted in `localStorage`. The\n * resulting `method` tells the UI which install affordance to render.\n *\n * The decline persistence is pluggable through\n * {@link UseInstallPromptOptions.declineStorageKey} and\n * {@link UseInstallPromptOptions.declineCooldownMs} — no app-specific storage\n * layer is required, and it is SSR-guarded.\n *\n * @param options - Optional storage key, cooldown, and fallback-delay tuning.\n * @returns The install state plus `install()` and `recordDecline()` actions.\n *\n * @example\n * const { method, install } = useInstallPrompt();\n * if (method === \"native\") return <button onClick={install}>Install</button>;\n */\nexport function useInstallPrompt(options: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const {\n declineStorageKey = DEFAULT_DECLINE_STORAGE_KEY,\n declineCooldownMs = DEFAULT_DECLINE_COOLDOWN_MS,\n manualFallbackDelayMs = DEFAULT_MANUAL_FALLBACK_DELAY_MS,\n } = options;\n\n const [event, setEvent] = useState<BeforeInstallPromptEvent | null>(cachedEvent);\n const [standalone, setStandalone] = useState<boolean>(isStandalone());\n const [promptTimedOut, setPromptTimedOut] = useState<boolean>(false);\n\n useEffect(() => {\n eventSubscribers.add(setEvent);\n return () => {\n eventSubscribers.delete(setEvent);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(display-mode: standalone)\");\n const handler = (): void => setStandalone(isStandalone());\n mq?.addEventListener?.(\"change\", handler);\n window.addEventListener(\"appinstalled\", handler);\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n window.removeEventListener(\"appinstalled\", handler);\n };\n }, []);\n\n useEffect(() => {\n if (event) {\n setPromptTimedOut(false);\n return;\n }\n const timer = window.setTimeout(() => {\n if (!cachedEvent) setPromptTimedOut(true);\n }, manualFallbackDelayMs);\n return () => window.clearTimeout(timer);\n }, [event, manualFallbackDelayMs]);\n\n const ios = isIOS();\n const manualAndroid = isAndroidWithoutPromptApi();\n\n const declineActive = readDecline(declineStorageKey, declineCooldownMs);\n\n let method: InstallMethod = \"none\";\n if (!standalone && !declineActive) {\n if (event) method = \"native\";\n else if (ios) method = \"ios\";\n else if (manualAndroid || promptTimedOut) method = \"manual\";\n }\n\n const recordDecline = (): void => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(declineStorageKey, String(Date.now()));\n };\n\n const install = async (): Promise<boolean> => {\n if (!event) return false;\n await event.prompt();\n const choice = await event.userChoice;\n if (choice.outcome === \"dismissed\") recordDecline();\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n return choice.outcome === \"accepted\";\n };\n\n return {\n deferredPrompt: event,\n canInstall: method !== \"none\",\n isIOS: ios,\n isStandalone: standalone,\n isManualAndroid: manualAndroid,\n promptTimedOut,\n method,\n openInChromeIntent: buildOpenInChromeIntent(),\n install,\n recordDecline,\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { usePagination } from \"@/hooks\";\nimport { Table, type TableAlign, type TableColumn, type TablePriority } from \"../Table\";\nimport { Pagination } from \"../Pagination\";\nimport { SearchBar } from \"../SearchBar\";\nimport styles from \"./DataTable.module.css\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface DataTableSort<T> {\n key: keyof T;\n direction: SortDirection;\n}\n\n/**\n * Column definition for {@link DataTable}. Extends the headless {@link Table}\n * column shape with a typed `key`, opt-in sorting, and the visual options that\n * are forwarded to the underlying Table cell.\n */\nexport interface DataTableColumn<T> {\n /** Property of the row this column reads from. Doubles as the cell key. */\n key: keyof T;\n /** Column heading. */\n header: ReactNode;\n /** Custom cell renderer. Defaults to `String(row[key])`. */\n render?: (row: T) => ReactNode;\n /** Enable click-to-sort on this column's header. */\n sortable?: boolean;\n /** Text alignment forwarded to the Table cell. */\n align?: TableAlign;\n /** Responsive visibility priority forwarded to the Table cell. */\n priority?: TablePriority;\n /** Fixed column width forwarded to the Table cell. */\n width?: string | number;\n}\n\nexport interface DataTableProps<T> extends HTMLAttributes<HTMLDivElement> {\n /** Full, unfiltered dataset. Sorting/filtering/pagination happen client-side. */\n data: T[];\n /** Column definitions. */\n columns: DataTableColumn<T>[];\n /** Rows per page. Default 10. */\n pageSize?: number;\n /** Render a search input above the table. Default false. */\n searchable?: boolean;\n /**\n * Keys to match the search term against. When omitted, every column whose\n * value is a string or number is searched.\n */\n searchKeys?: (keyof T)[];\n /** Initial sort applied before any header interaction. */\n initialSort?: DataTableSort<T>;\n /** Stable key extractor for rows. Defaults to the row index. */\n rowKey?: (row: T, index: number) => string | number;\n /** Content shown when no rows match. */\n emptyMessage?: ReactNode;\n}\n\n/**\n * Compare two arbitrary cell values with stable, type-aware ordering:\n * numbers numerically, dates by timestamp, everything else by `localeCompare`.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Negative when `a < b`, positive when `a > b`, zero when equal.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return String(a).localeCompare(String(b), undefined, { numeric: true });\n}\n\n/**\n * Stateful, headless data table built on top of {@link Table}. Adds\n * client-side searching, click-to-sort columns, and pagination while\n * delegating all table markup to the underlying Table component.\n *\n * - Clicking a sortable header cycles asc → desc → unsorted.\n * - Search matches a case-insensitive substring across `searchKeys`\n * (or every string/number column when not provided).\n * - Pagination is hidden when the result fits on a single page.\n */\nexport function DataTable<T>({\n data,\n columns,\n pageSize = 10,\n searchable = false,\n searchKeys,\n initialSort,\n rowKey = (_row, index) => index,\n emptyMessage,\n className,\n ...rest\n}: DataTableProps<T>) {\n const [search, setSearch] = useState<string>(\"\");\n const [sort, setSort] = useState<DataTableSort<T> | null>(initialSort ?? null);\n const { page, setPage } = usePagination(1, pageSize);\n\n const effectiveSearchKeys = useMemo<(keyof T)[]>(() => {\n if (searchKeys && searchKeys.length > 0) return searchKeys;\n return columns\n .filter((column) => {\n const sample = data.find((row) => row[column.key] != null);\n const value = sample ? sample[column.key] : undefined;\n return typeof value === \"string\" || typeof value === \"number\";\n })\n .map((column) => column.key);\n }, [searchKeys, columns, data]);\n\n const filtered = useMemo<T[]>(() => {\n const term = search.trim().toLowerCase();\n if (!term || !searchable) return data;\n return data.filter((row) =>\n effectiveSearchKeys.some((key) => {\n const value = row[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [data, search, searchable, effectiveSearchKeys]);\n\n const sorted = useMemo<T[]>(() => {\n if (!sort) return filtered;\n const factor = sort.direction === \"asc\" ? 1 : -1;\n return [...filtered].sort((a, b) => compareValues(a[sort.key], b[sort.key]) * factor);\n }, [filtered, sort]);\n\n const totalPages = Math.max(1, Math.ceil(sorted.length / pageSize));\n\n // Clamp the current page when the dataset shrinks (e.g. after filtering).\n useEffect(() => {\n if (page > totalPages) setPage(totalPages);\n }, [page, totalPages, setPage]);\n\n const safePage = Math.min(page, totalPages);\n const pageRows = useMemo<T[]>(() => {\n const start = (safePage - 1) * pageSize;\n return sorted.slice(start, start + pageSize);\n }, [sorted, safePage, pageSize]);\n\n function toggleSort(key: keyof T): void {\n setSort((current) => {\n if (!current || current.key !== key) return { key, direction: \"asc\" };\n if (current.direction === \"asc\") return { key, direction: \"desc\" };\n return null;\n });\n }\n\n const tableColumns = useMemo<TableColumn<T>[]>(\n () =>\n columns.map((column) => {\n const isSorted = sort?.key === column.key;\n const indicator = isSorted ? (sort?.direction === \"asc\" ? \" ▲\" : \" ▼\") : \"\";\n const header = column.sortable ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={() => toggleSort(column.key)}\n aria-label={`Ordenar por ${\n typeof column.header === \"string\" ? column.header : String(column.key)\n }`}\n >\n {column.header}\n <span className={styles.sortIndicator} aria-hidden>\n {indicator}\n </span>\n </button>\n ) : (\n column.header\n );\n\n return {\n key: String(column.key),\n header,\n align: column.align,\n priority: column.priority,\n width: column.width,\n render: column.render\n ? (row: T) => column.render!(row)\n : (row: T) => (row[column.key] as ReactNode) ?? null,\n };\n }),\n // toggleSort is stable enough for this memo; sort drives header re-render.\n [columns, sort],\n );\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n {searchable && (\n <SearchBar\n value={search}\n onChange={(value) => {\n setSearch(value);\n setPage(1);\n }}\n wrapperClassName={styles.search}\n />\n )}\n <Table\n columns={tableColumns}\n data={pageRows}\n rowKey={(row, index) => rowKey(row, (safePage - 1) * pageSize + index)}\n emptyMessage={emptyMessage}\n />\n {totalPages > 1 && (\n <Pagination\n page={safePage}\n totalPages={totalPages}\n onPageChange={setPage}\n totalItems={sorted.length}\n />\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./ListTile.module.css\";\n\nexport interface ListTileProps {\n /** Left slot — typically an icon or avatar. */\n leading?: ReactNode;\n /** Primary line. Required. */\n title: ReactNode;\n /** Secondary line rendered under the title. */\n subtitle?: ReactNode;\n /** Right slot — typically an icon, switch or meta text. */\n trailing?: ReactNode;\n /** When provided, the tile becomes an interactive button. */\n onClick?: () => void;\n /** When true, the tile is dimmed and non-interactive. */\n disabled?: boolean;\n /** When true, the tile is highlighted as the active row. */\n selected?: boolean;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * The canonical Material list row: an optional leading slot, a title with an\n * optional subtitle, and an optional trailing slot. When `onClick` is supplied\n * the tile renders as a full-width, keyboard-accessible `<button>`; otherwise it\n * renders as a static `<div>`.\n *\n * @example\n * <ListTile\n * leading={<User />}\n * title=\"Maria Silva\"\n * subtitle=\"maria@example.com\"\n * trailing={<ChevronRight />}\n * onClick={() => open(user)}\n * />\n */\nexport function ListTile({\n leading,\n title,\n subtitle,\n trailing,\n onClick,\n disabled = false,\n selected = false,\n className,\n}: ListTileProps) {\n const content = (\n <>\n {leading !== undefined && <span className={styles.leading}>{leading}</span>}\n <span className={styles.body}>\n <span className={styles.title}>{title}</span>\n {subtitle !== undefined && <span className={styles.subtitle}>{subtitle}</span>}\n </span>\n {trailing !== undefined && <span className={styles.trailing}>{trailing}</span>}\n </>\n );\n\n const rootClassName = cn(\n styles.tile,\n selected && styles.selected,\n disabled && styles.disabled,\n className,\n );\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n className={cn(rootClassName, styles.interactive)}\n aria-pressed={selected ? true : undefined}\n disabled={disabled}\n onClick={onClick}\n >\n {content}\n </button>\n );\n }\n\n return <div className={rootClassName}>{content}</div>;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./FloatingActionButton.module.css\";\n\nexport type FloatingActionButtonPosition = \"bottom-right\" | \"bottom-left\" | \"none\";\nexport type FloatingActionButtonSize = \"sm\" | \"md\" | \"lg\";\nexport type FloatingActionButtonVariant = \"primary\" | \"surface\";\n\nexport interface FloatingActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Icon rendered inside the FAB. Required. */\n icon: ReactNode;\n /** When present, renders an extended (pill) FAB with icon + label. */\n label?: ReactNode;\n /** Corner placement, or `\"none\"` for static/inline. Default `\"bottom-right\"`. */\n position?: FloatingActionButtonPosition;\n /** Size token. Default `\"md\"`. */\n size?: FloatingActionButtonSize;\n /** Visual style. Default `\"primary\"`. */\n variant?: FloatingActionButtonVariant;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * Material Floating Action Button. Renders a round FAB when only an `icon` is\n * given, or an extended pill FAB when a `label` is also provided. By default it\n * is fixed to the bottom-right corner; set `position=\"none\"` to place it inline.\n *\n * Spreads all native `<button>` props (`onClick`, `disabled`, etc.).\n *\n * @remarks\n * Always pass an `aria-label` when there is no `label`, since an icon-only FAB\n * has no accessible name otherwise.\n *\n * @example\n * <FloatingActionButton icon={<Plus />} aria-label=\"Adicionar\" onClick={create} />\n *\n * @example\n * <FloatingActionButton icon={<Plus />} label=\"Novo\" onClick={create} />\n */\nexport function FloatingActionButton({\n icon,\n label,\n position = \"bottom-right\",\n size = \"md\",\n variant = \"primary\",\n className,\n ...props\n}: FloatingActionButtonProps) {\n const extended = label !== undefined;\n return (\n <button\n type=\"button\"\n className={cn(\n styles.fab,\n styles[size],\n styles[variant],\n extended ? styles.extended : styles.round,\n position !== \"none\" && styles.fixed,\n position === \"bottom-right\" && styles.bottomRight,\n position === \"bottom-left\" && styles.bottomLeft,\n className,\n )}\n {...props}\n >\n <span className={styles.icon}>{icon}</span>\n {extended && <span className={styles.label}>{label}</span>}\n </button>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./NavigationRail.module.css\";\n\nexport interface NavigationRailItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered over the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport type NavigationRailLabelVisibility = \"all\" | \"selected\" | \"none\";\n\nexport interface NavigationRailProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: NavigationRailItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Top slot — e.g. a FAB or logo. */\n header?: ReactNode;\n /** Bottom slot — pushed to the bottom of the rail. */\n footer?: ReactNode;\n /** Which item labels to show. Default `\"all\"`. */\n labelVisibility?: NavigationRailLabelVisibility;\n /** Extra class names merged onto the root. */\n className?: string;\n}\n\n/**\n * Vertical, compact navigation column for desktop and tablet layouts. Each item\n * stacks an icon over its label, with the active item flagged via\n * `aria-current=\"page\"`. Use `labelVisibility=\"selected\"` to show only the\n * active item's label, or `\"none\"` for an icon-only rail.\n *\n * @example\n * <NavigationRail\n * header={<FloatingActionButton icon={<Plus />} position=\"none\" />}\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"inbox\", label: \"Caixa\", icon: <Inbox />, badge: 3 },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n */\nexport function NavigationRail({\n items,\n value,\n onChange,\n header,\n footer,\n labelVisibility = \"all\",\n className,\n ...props\n}: NavigationRailProps) {\n return (\n <nav className={cn(styles.rail, className)} aria-label=\"Navegação lateral\" {...props}>\n {header !== undefined && <div className={styles.header}>{header}</div>}\n <ul className={styles.list}>\n {items.map((item) => {\n const active = item.key === value;\n const showLabel =\n labelVisibility === \"all\" || (labelVisibility === \"selected\" && active);\n return (\n <li key={item.key}>\n <button\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabel && <span className={styles.label}>{item.label}</span>}\n </button>\n </li>\n );\n })}\n </ul>\n {footer !== undefined && <div className={styles.footer}>{footer}</div>}\n </nav>\n );\n}\n","import { useId, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n /** Selected time as a 24h `\"HH:MM\"` string (e.g. `\"14:30\"`). May be `\"\"` for none. */\n value: string;\n /** Fired with the new 24h `\"HH:MM\"` string whenever a cell is picked. */\n onChange: (value: string) => void;\n /** Granularity of the minute column. Defaults to `5`. */\n minuteStep?: number;\n /** When true, show a 1–12 hour column plus an AM/PM column (still emits 24h). */\n use12Hours?: boolean;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\ntype Period = \"AM\" | \"PM\";\n\ninterface ParsedTime {\n hour24: number | null;\n minute: number | null;\n}\n\nfunction pad2(value: number): string {\n return value.toString().padStart(2, \"0\");\n}\n\n/** Parse a 24h `\"HH:MM\"` string into hour/minute numbers, or nulls when empty/invalid. */\nfunction parseValue(value: string): ParsedTime {\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(value.trim());\n if (!match) return { hour24: null, minute: null };\n const hour24 = Number(match[1]);\n const minute = Number(match[2]);\n if (hour24 < 0 || hour24 > 23 || minute < 0 || minute > 59) {\n return { hour24: null, minute: null };\n }\n return { hour24, minute };\n}\n\n/** Convert a 24h hour into its 12h display hour (1–12). */\nfunction to12Hour(hour24: number): number {\n const mod = hour24 % 12;\n return mod === 0 ? 12 : mod;\n}\n\n/** Convert a 12h display hour + period into a 24h hour (0–23). */\nfunction to24Hour(hour12: number, period: Period): number {\n const base = hour12 % 12;\n return period === \"PM\" ? base + 12 : base;\n}\n\n/**\n * TimePicker — inline, dependency-free time picker with Material \"spinner column\" styling.\n *\n * Renders scrollable columns of selectable cells (hours, minutes, and AM/PM when\n * `use12Hours`). Always emits a 24h `\"HH:MM\"` string via `onChange`, regardless of\n * whether the 12h display is enabled.\n */\nexport function TimePicker({\n value,\n onChange,\n minuteStep = 5,\n use12Hours = false,\n label,\n helperText,\n disabled,\n className,\n}: TimePickerProps) {\n const id = useId();\n const { hour24, minute } = useMemo(() => parseValue(value), [value]);\n\n const period: Period = hour24 !== null && hour24 >= 12 ? \"PM\" : \"AM\";\n\n const hourCells = useMemo<number[]>(() => {\n if (use12Hours) {\n return Array.from({ length: 12 }, (_, index) => index + 1);\n }\n return Array.from({ length: 24 }, (_, index) => index);\n }, [use12Hours]);\n\n const minuteCells = useMemo<number[]>(() => {\n const step = minuteStep > 0 ? minuteStep : 1;\n const cells: number[] = [];\n for (let current = 0; current < 60; current += step) {\n cells.push(current);\n }\n return cells;\n }, [minuteStep]);\n\n const selectedHourDisplay = hour24 === null ? null : use12Hours ? to12Hour(hour24) : hour24;\n\n const emit = (nextHour24: number, nextMinute: number): void => {\n onChange(`${pad2(nextHour24)}:${pad2(nextMinute)}`);\n };\n\n const handleHour = (displayHour: number): void => {\n if (disabled) return;\n const nextMinute = minute ?? 0;\n const nextHour24 = use12Hours ? to24Hour(displayHour, period) : displayHour;\n emit(nextHour24, nextMinute);\n };\n\n const handleMinute = (nextMinute: number): void => {\n if (disabled) return;\n const baseHour24 = hour24 ?? (use12Hours ? to24Hour(12, \"AM\") : 0);\n emit(baseHour24, nextMinute);\n };\n\n const handlePeriod = (nextPeriod: Period): void => {\n if (disabled) return;\n const displayHour = selectedHourDisplay ?? 12;\n const nextMinute = minute ?? 0;\n emit(to24Hour(displayHour, nextPeriod), nextMinute);\n };\n\n return (\n <div className={cn(styles.wrapper, disabled && styles.disabled, className)}>\n {label && (\n <span id={`${id}-label`} className={styles.label}>\n {label}\n </span>\n )}\n <div className={styles.columns}>\n <ul role=\"listbox\" aria-label=\"Horas\" className={styles.column}>\n {hourCells.map((cell) => {\n const active = cell === selectedHourDisplay;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleHour(cell)}\n >\n {use12Hours ? cell : pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n <ul role=\"listbox\" aria-label=\"Minutos\" className={styles.column}>\n {minuteCells.map((cell) => {\n const active = cell === minute;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleMinute(cell)}\n >\n {pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n {use12Hours && (\n <ul role=\"listbox\" aria-label=\"Período\" className={styles.column}>\n {([\"AM\", \"PM\"] as Period[]).map((cell) => {\n const active = selectedHourDisplay !== null && cell === period;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handlePeriod(cell)}\n >\n {cell}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n","import { useRef, useState, type ReactNode, type TouchEvent } from \"react\";\nimport { Spinner } from \"@/components/Spinner\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RefreshIndicator.module.css\";\n\nexport interface RefreshIndicatorProps {\n /** Invoked when the user pulls past `threshold` and releases. May be async. */\n onRefresh: () => void | Promise<void>;\n /** Scrollable content to wrap. */\n children: ReactNode;\n /** Pixels the user must pull past to trigger a refresh. Defaults to `80`. */\n threshold?: number;\n /** When true, pull-to-refresh is inert. */\n disabled?: boolean;\n className?: string;\n}\n\n/** Apply resistance so the content lags behind the finger and the pull never runs away. */\nfunction applyResistance(distance: number, threshold: number): number {\n const cap = threshold * 1.5;\n return Math.min(distance / 2, cap);\n}\n\n/**\n * RefreshIndicator — pull-to-refresh wrapper for touch devices.\n *\n * Wraps scrollable `children` and listens for a downward drag that starts while the\n * container is scrolled to the top. Pulling past `threshold` and releasing triggers\n * `onRefresh`; the SDK {@link Spinner} is shown while pulling and during the refresh.\n */\nexport function RefreshIndicator({\n onRefresh,\n children,\n threshold = 80,\n disabled,\n className,\n}: RefreshIndicatorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const startYRef = useRef<number | null>(null);\n const [pull, setPull] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n\n const engaged = startYRef.current !== null;\n\n const handleTouchStart = (event: TouchEvent<HTMLDivElement>): void => {\n if (disabled || refreshing) return;\n const container = containerRef.current;\n if (!container || container.scrollTop > 0) return;\n const touch = event.touches[0];\n if (!touch) return;\n startYRef.current = touch.clientY;\n };\n\n const handleTouchMove = (event: TouchEvent<HTMLDivElement>): void => {\n if (disabled || refreshing) return;\n const startY = startYRef.current;\n if (startY === null) return;\n const touch = event.touches[0];\n if (!touch) return;\n const delta = touch.clientY - startY;\n if (delta <= 0) {\n setPull(0);\n return;\n }\n setPull(applyResistance(delta, threshold));\n };\n\n const reset = (): void => {\n startYRef.current = null;\n setPull(0);\n };\n\n const handleTouchEnd = async (): Promise<void> => {\n if (disabled || refreshing) {\n reset();\n return;\n }\n const startY = startYRef.current;\n const triggered = startY !== null && pull >= threshold;\n if (!triggered) {\n reset();\n return;\n }\n startYRef.current = null;\n setRefreshing(true);\n setPull(threshold);\n try {\n await onRefresh();\n } finally {\n setRefreshing(false);\n setPull(0);\n }\n };\n\n const showIndicator = refreshing || pull > 0;\n const progress = Math.min(1, pull / threshold);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.wrapper, className)}\n data-refreshing={refreshing}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <div\n className={styles.indicator}\n aria-hidden={!showIndicator}\n style={{\n opacity: refreshing ? 1 : progress,\n transform: `translateX(-50%) translateY(${showIndicator ? pull : 0}px) rotate(${progress * 360}deg)`,\n }}\n >\n <Spinner size=\"sm\" label=\"Atualizando\" />\n </div>\n <div\n className={cn(styles.content, (engaged || refreshing) && styles.dragging)}\n style={{ transform: `translateY(${showIndicator ? pull : 0}px)` }}\n >\n {children}\n </div>\n </div>\n );\n}\n","/**\n * Format a number as Brazilian Real currency.\n *\n * @param value - The amount in BRL.\n * @returns A locale-formatted string, e.g. \"R$ 1.234,56\".\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n}\n\n/**\n * Format an ISO date or Date instance as `dd/MM/yyyy`.\n *\n * @param value - ISO string or Date.\n * @returns Formatted date string, or empty string when input is invalid.\n */\nexport function formatDate(value: string | Date): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"pt-BR\").format(date);\n}\n\n/**\n * Format an ISO date or Date instance as `dd/MM/yyyy HH:mm`.\n *\n * @param value - ISO string or Date.\n * @returns Formatted datetime string, or empty string when input is invalid.\n */\nexport function formatDateTime(value: string | Date): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(\"pt-BR\", {\n dateStyle: \"short\",\n timeStyle: \"short\",\n }).format(date);\n}\n\n/**\n * Apply the Brazilian phone mask `(XX) XXXXX-XXXX` or `(XX) XXXX-XXXX`.\n *\n * @param value - Raw digits or partially masked string.\n * @returns Masked phone string.\n */\nexport function formatPhone(value: string): string {\n const digits = value.replace(/\\D/g, \"\").slice(0, 11);\n if (digits.length <= 10) {\n return digits.replace(/(\\d{2})(\\d)/, \"($1) $2\").replace(/(\\d{4})(\\d)/, \"$1-$2\");\n }\n return digits.replace(/(\\d{2})(\\d)/, \"($1) $2\").replace(/(\\d{5})(\\d)/, \"$1-$2\");\n}\n\n/**\n * Apply the Brazilian CPF mask `XXX.XXX.XXX-XX`.\n *\n * @param value - Raw digits or partially masked string.\n * @returns Masked CPF string.\n */\nexport function formatCPF(value: string): string {\n return value\n .replace(/\\D/g, \"\")\n .slice(0, 11)\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d{1,2})$/, \"$1-$2\");\n}\n\n/**\n * Format a fraction (0-1) as a percentage with one decimal.\n *\n * @param value - Fraction between 0 and 1.\n * @returns Formatted percent string, e.g. \"12,5%\".\n */\nexport function formatPercent(value: number): string {\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }).format(value);\n}\n","/**\n * Typed wrapper around `localStorage` that JSON-encodes values and\n * silently handles environments where storage is unavailable (SSR, private mode).\n */\nexport const storage = {\n get<T>(key: string, fallback: T): T {\n if (typeof window === \"undefined\") return fallback;\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set<T>(key: string, value: T): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n /* ignore quota errors */\n }\n },\n remove(key: string): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* ignore */\n }\n },\n};\n","/**\n * Convert a string into a URL-safe slug.\n *\n * - Strips accents/diacritics.\n * - Lowercases.\n * - Replaces non-alphanumeric runs with `-`.\n * - Trims leading/trailing separators.\n *\n * @example\n * slugify(\"São Paulo / Centro\"); // \"sao-paulo-centro\"\n */\nexport function slugify(input: string): string {\n return input\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n/**\n * Truncate a string to `max` characters, appending `suffix` when cut.\n * Returns the original when shorter than (or equal to) `max`.\n *\n * @example\n * truncate(\"The quick brown fox\", 12); // \"The quick…\"\n * truncate(\"The quick brown fox\", 12, \" (more)\"); // \"The qu (more)\"\n */\nexport function truncate(input: string, max: number, suffix: string = \"…\"): string {\n if (input.length <= max) return input;\n const cut = Math.max(0, max - suffix.length);\n return input.slice(0, cut).trimEnd() + suffix;\n}\n\n/**\n * Uppercase the first character of `value`, leaving the rest untouched.\n *\n * @example\n * capitalize(\"hello world\"); // \"Hello world\"\n * capitalize(\"\"); // \"\"\n */\nexport function capitalize(value: string): string {\n if (value.length === 0) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\n/**\n * Convert `value` to `camelCase`.\n *\n * Splits on spaces, hyphens, underscores and other non-alphanumeric runs,\n * lowercases the first word, and capitalizes each subsequent word.\n *\n * @example\n * camelCase(\"hello world\"); // \"helloWorld\"\n * camelCase(\"foo-bar_baz\"); // \"fooBarBaz\"\n * camelCase(\"API response\"); // \"apiResponse\"\n */\nexport function camelCase(value: string): string {\n const words = value\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (words.length === 0) return \"\";\n return words\n .map((word, index) => {\n const lower = word.toLowerCase();\n return index === 0 ? lower : lower.charAt(0).toUpperCase() + lower.slice(1);\n })\n .join(\"\");\n}\n\n/**\n * Convert `value` to `kebab-case`.\n *\n * Splits camelCase boundaries and non-alphanumeric runs, then joins with `-`\n * and lowercases.\n *\n * @example\n * kebabCase(\"helloWorld\"); // \"hello-world\"\n * kebabCase(\"foo_bar baz\"); // \"foo-bar-baz\"\n * kebabCase(\"APIResponse\"); // \"api-response\"\n */\nexport function kebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n}\n\n/**\n * Pick the singular or plural form of a word based on `count`.\n *\n * Returns only the word (never the count). When `plural` is omitted it defaults\n * to `singular + \"s\"`.\n *\n * @example\n * pluralize(1, \"item\"); // \"item\"\n * pluralize(3, \"item\"); // \"items\"\n * pluralize(2, \"person\", \"people\"); // \"people\"\n */\nexport function pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : (plural ?? `${singular}s`);\n}\n","/**\n * Group items of a list into buckets keyed by the result of `key`.\n *\n * Items preserve their original order within each bucket.\n *\n * @example\n * groupBy([1, 2, 3, 4], (n) => (n % 2 === 0 ? \"even\" : \"odd\"));\n * // { odd: [1, 3], even: [2, 4] }\n *\n * @example\n * groupBy([{ city: \"SP\" }, { city: \"RJ\" }, { city: \"SP\" }], (u) => u.city);\n * // { SP: [{ city: \"SP\" }, { city: \"SP\" }], RJ: [{ city: \"RJ\" }] }\n */\nexport function groupBy<T, K extends PropertyKey>(items: T[], key: (item: T) => K): Record<K, T[]> {\n const result = {} as Record<K, T[]>;\n for (const item of items) {\n const k = key(item);\n (result[k] ??= []).push(item);\n }\n return result;\n}\n\n/**\n * Remove duplicate items, keeping the first occurrence of each distinct key.\n *\n * Equality is determined by the value returned from `key` (compared with `===`).\n *\n * @example\n * uniqueBy([1, 2, 2, 3, 1], (n) => n); // [1, 2, 3]\n *\n * @example\n * uniqueBy(\n * [{ id: 1, v: \"a\" }, { id: 1, v: \"b\" }, { id: 2, v: \"c\" }],\n * (u) => u.id,\n * );\n * // [{ id: 1, v: \"a\" }, { id: 2, v: \"c\" }]\n */\nexport function uniqueBy<T>(items: T[], key: (item: T) => unknown): T[] {\n const seen = new Set<unknown>();\n const result: T[] = [];\n for (const item of items) {\n const k = key(item);\n if (!seen.has(k)) {\n seen.add(k);\n result.push(item);\n }\n }\n return result;\n}\n\n/**\n * Split a list into consecutive chunks of at most `size` items.\n *\n * The final chunk may be smaller than `size`. An empty input yields `[]`.\n *\n * @param items - The list to split.\n * @param size - Maximum chunk length; must be `>= 1`.\n * @throws {RangeError} When `size` is less than `1`.\n *\n * @example\n * chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]\n *\n * @example\n * chunk([], 3); // []\n */\nexport function chunk<T>(items: T[], size: number): T[][] {\n if (size < 1) {\n throw new RangeError(`chunk size must be >= 1, received ${size}`);\n }\n const result: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n result.push(items.slice(i, i + size));\n }\n return result;\n}\n\n/**\n * Build a numeric range from `start` (inclusive) to `end` (exclusive).\n *\n * - `step` defaults to `1` and may be negative for descending ranges.\n * - Returns an empty array when no progress can be made toward `end`\n * (wrong-direction step, zero step, or `start === end`).\n *\n * @param start - First value of the range.\n * @param end - Exclusive upper (or lower, for negative step) bound.\n * @param step - Increment between values; defaults to `1`.\n *\n * @example\n * range(0, 5); // [0, 1, 2, 3, 4]\n * range(0, 10, 2); // [0, 2, 4, 6, 8]\n * range(5, 0, -1); // [5, 4, 3, 2, 1]\n * range(0, 5, -1); // [] (wrong direction)\n * range(3, 3); // []\n */\nexport function range(start: number, end: number, step: number = 1): number[] {\n const result: number[] = [];\n if (step === 0) return result;\n if (step > 0) {\n for (let i = start; i < end; i += step) result.push(i);\n } else {\n for (let i = start; i > end; i += step) result.push(i);\n }\n return result;\n}\n","/**\n * Determine whether a value is a plain object literal.\n *\n * Returns `false` for arrays, `null`, dates, maps, sets, and class instances.\n *\n * @internal\n */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Create a new object containing only the given `keys` from `obj`.\n *\n * Missing keys are skipped. The input is never mutated.\n *\n * @example\n * pick({ id: 1, name: \"Ana\", age: 30 }, [\"id\", \"name\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Create a new object with the given `keys` removed from `obj`.\n *\n * The input is never mutated.\n *\n * @example\n * omit({ id: 1, name: \"Ana\", age: 30 }, [\"age\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const exclude = new Set<PropertyKey>(keys);\n const result = {} as Record<PropertyKey, unknown>;\n for (const key of Object.keys(obj) as (keyof T)[]) {\n if (!exclude.has(key)) {\n result[key] = obj[key];\n }\n }\n return result as Omit<T, K>;\n}\n\n/**\n * Recursively merge `source` into `target`, returning a new object.\n *\n * - Plain objects are merged key by key, recursing into nested plain objects.\n * - Arrays and non-plain values (dates, class instances, primitives) replace\n * the target value entirely — they are not merged element by element.\n * - Neither `target` nor `source` is mutated.\n *\n * @example\n * deepMerge(\n * { a: 1, nested: { x: 1, y: 2 } },\n * { nested: { y: 20, z: 30 } },\n * );\n * // { a: 1, nested: { x: 1, y: 20, z: 30 } }\n *\n * @example\n * deepMerge({ tags: [\"a\", \"b\"] }, { tags: [\"c\"] });\n * // { tags: [\"c\"] } (arrays replaced, not merged)\n */\nexport function deepMerge<T>(target: T, source: Partial<T>): T {\n if (!isPlainRecord(target) || !isPlainRecord(source)) {\n return (source === undefined ? target : (source as unknown as T)) as T;\n }\n const result: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const sourceValue = (source as Record<string, unknown>)[key];\n const targetValue = result[key];\n if (isPlainRecord(targetValue) && isPlainRecord(sourceValue)) {\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n result[key] = sourceValue;\n }\n }\n return result as T;\n}\n\n/**\n * Check whether a value is considered \"empty\".\n *\n * Returns `true` for `null`, `undefined`, empty strings, empty arrays, empty\n * plain objects, and empty `Map`/`Set` instances. Returns `false` for numbers\n * (including `0` and `NaN`), booleans, and dates, which are never empty.\n *\n * @example\n * isEmpty(null); // true\n * isEmpty(\"\"); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(new Map()); // true\n * isEmpty(0); // false\n * isEmpty(false); // false\n * isEmpty(new Date()); // false\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (value instanceof Map || value instanceof Set) return value.size === 0;\n if (isPlainRecord(value)) return Object.keys(value).length === 0;\n return false;\n}\n","/**\n * Type guard asserting a value is neither `null` nor `undefined`.\n *\n * Useful for narrowing in `Array.prototype.filter` to drop nullish entries\n * while preserving the element type.\n *\n * @example\n * const xs: (number | null)[] = [1, null, 2];\n * const clean: number[] = xs.filter(isDefined); // [1, 2]\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * Type guard asserting a value is a string primitive.\n *\n * @example\n * isString(\"hi\"); // true\n * isString(42); // false\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Type guard asserting a value is a number, excluding `NaN`.\n *\n * @example\n * isNumber(42); // true\n * isNumber(NaN); // false\n * isNumber(\"42\"); // false\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !Number.isNaN(value);\n}\n\n/**\n * Type guard asserting a value is a plain object literal.\n *\n * Returns `false` for arrays, `null`, dates, maps, sets, and class instances —\n * only objects created from `{}` / `Object.create(null)` / object literals pass.\n *\n * @example\n * isPlainObject({ a: 1 }); // true\n * isPlainObject([]); // false\n * isPlainObject(null); // false\n * isPlainObject(new Date()); // false\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Assert that a code path is unreachable, throwing at runtime if reached.\n *\n * Use in the `default` branch of an exhaustive `switch` so TypeScript flags any\n * unhandled union member at compile time and the runtime fails loudly if an\n * unexpected value slips through.\n *\n * @param value - The value that should be of type `never`.\n * @param message - Optional custom error message.\n * @throws {Error} Always.\n *\n * @example\n * type Shape = \"circle\" | \"square\";\n * function area(shape: Shape): number {\n * switch (shape) {\n * case \"circle\": return 1;\n * case \"square\": return 2;\n * default: return assertNever(shape);\n * }\n * }\n */\nexport function assertNever(value: never, message?: string): never {\n throw new Error(message ?? `Unexpected value: ${String(value)}`);\n}\n","/**\n * Create a trailing-edge debounced version of `fn`.\n *\n * The wrapped function delays invoking `fn` until `wait` milliseconds have\n * elapsed since the last time it was called. Only the latest arguments are\n * used. Call `.cancel()` to clear any pending invocation.\n *\n * @example\n * const save = debounce((q: string) => search(q), 300);\n * save(\"a\"); save(\"ab\"); save(\"abc\"); // only \"abc\" runs after 300ms\n * save.cancel(); // nothing runs\n */\nexport function debounce<A extends unknown[]>(\n fn: (...args: A) => void,\n wait: number,\n): ((...args: A) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = (...args: A): void => {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n fn(...args);\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n return debounced;\n}\n\n/**\n * Create a throttled version of `fn` with leading and trailing edges.\n *\n * `fn` runs immediately on the first call (leading edge), then at most once\n * per `wait` milliseconds. If calls happen during the wait window, the last\n * one fires on the trailing edge. Call `.cancel()` to drop any pending\n * trailing call and reset the window.\n *\n * @example\n * const onScroll = throttle(() => render(), 200);\n * window.addEventListener(\"scroll\", onScroll);\n * onScroll.cancel();\n */\nexport function throttle<A extends unknown[]>(\n fn: (...args: A) => void,\n wait: number,\n): ((...args: A) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: A | undefined;\n let lastInvoke = 0;\n\n const invoke = (args: A): void => {\n lastInvoke = Date.now();\n fn(...args);\n };\n\n const throttled = (...args: A): void => {\n const now = Date.now();\n const remaining = wait - (now - lastInvoke);\n\n if (remaining <= 0) {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n invoke(args);\n } else {\n lastArgs = args;\n if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n if (lastArgs !== undefined) {\n const pending = lastArgs;\n lastArgs = undefined;\n invoke(pending);\n }\n }, remaining);\n }\n }\n };\n\n throttled.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastArgs = undefined;\n lastInvoke = 0;\n };\n\n return throttled;\n}\n\n/**\n * Wrap `fn` so it runs at most once; subsequent calls return the cached result.\n *\n * @example\n * const init = once(() => expensiveSetup());\n * init(); // runs expensiveSetup()\n * init(); // returns the same cached result, no re-run\n */\nexport function once<A extends unknown[], R>(fn: (...args: A) => R): (...args: A) => R {\n let called = false;\n let result: R;\n\n return (...args: A): R => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n };\n}\n\n/**\n * Memoize only the most recent call of `fn`, keyed by shallow-equal arguments.\n *\n * If the next call has the same arguments (compared with `Object.is` per\n * position and equal length), the cached result is returned without re-running\n * `fn`. Any different argument list recomputes and replaces the cache.\n *\n * @example\n * const select = memoizeOne((a: number, b: number) => a + b);\n * select(1, 2); // computes 3\n * select(1, 2); // cached 3\n * select(2, 2); // recomputes 4\n */\nexport function memoizeOne<A extends unknown[], R>(fn: (...args: A) => R): (...args: A) => R {\n let hasCache = false;\n let lastArgs: A;\n let lastResult: R;\n\n const sameArgs = (next: A): boolean => {\n if (!hasCache || next.length !== lastArgs.length) return false;\n for (let i = 0; i < next.length; i++) {\n if (!Object.is(next[i], lastArgs[i])) return false;\n }\n return true;\n };\n\n return (...args: A): R => {\n if (sameArgs(args)) return lastResult;\n lastArgs = args;\n lastResult = fn(...args);\n hasCache = true;\n return lastResult;\n };\n}\n","/**\n * Resolve after `ms` milliseconds.\n *\n * @example\n * await sleep(500); // pauses for half a second\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Race `promise` against a timeout.\n *\n * Resolves/rejects with `promise` when it settles first. If `ms` elapses\n * before that, the returned promise rejects with an `Error` whose `name` is\n * `\"TimeoutError\"`.\n *\n * @example\n * await withTimeout(fetch(\"/slow\"), 3000);\n * await withTimeout(fetch(\"/slow\"), 3000, \"request too slow\");\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message?: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n const error = new Error(message ?? `Operation timed out after ${ms}ms`);\n error.name = \"TimeoutError\";\n reject(error);\n }, ms);\n\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (reason) => {\n clearTimeout(timer);\n reject(reason);\n },\n );\n });\n}\n","/**\n * Generate a collision-resistant id suitable for client-side UI keys.\n *\n * Uses `crypto.randomUUID()` when available, falling back to a\n * timestamp + `Math.random()` combination otherwise. When `prefix` is given,\n * the result is formatted as `${prefix}-${id}`.\n *\n * @example\n * randomId(); // \"9f1c2b3a-...\" (uuid) or \"lq3f8k-4a9z1\" (fallback)\n * randomId(\"user\"); // \"user-9f1c2b3a-...\"\n */\nexport function randomId(prefix?: string): string {\n let id: string;\n\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n id = crypto.randomUUID();\n } else {\n const time = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 10);\n id = `${time}-${rand}`;\n }\n\n return prefix ? `${prefix}-${id}` : id;\n}\n","import { zipSync, type Zippable } from \"fflate\";\n\n/** A single spreadsheet cell — a number, a string, or an empty cell. */\ntype Cell = { v: string; t: \"s\" } | { v: number; t: \"n\" } | { v: \"\"; t: \"s\" };\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction colLetter(index0: number): string {\n let n = index0 + 1;\n let result = \"\";\n while (n > 0) {\n const rem = (n - 1) % 26;\n result = String.fromCharCode(65 + rem) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\nfunction toCell(value: string | number | null): Cell {\n if (typeof value === \"number\") return { v: value, t: \"n\" };\n if (value === null || value === \"\") return { v: \"\", t: \"s\" };\n return { v: value, t: \"s\" };\n}\n\nfunction cellXml(cell: Cell, ref: string): string {\n if (cell.t === \"n\") return `<c r=\"${ref}\" t=\"n\"><v>${cell.v}</v></c>`;\n if (cell.v === \"\") return `<c r=\"${ref}\" t=\"inlineStr\"><is><t></t></is></c>`;\n return `<c r=\"${ref}\" t=\"inlineStr\"><is><t xml:space=\"preserve\">${escapeXml(cell.v)}</t></is></c>`;\n}\n\nfunction rowXml(cells: readonly Cell[], rowIndex1: number): string {\n const inner = cells.map((c, i) => cellXml(c, `${colLetter(i)}${rowIndex1}`)).join(\"\");\n return `<row r=\"${rowIndex1}\">${inner}</row>`;\n}\n\nfunction buildSheetXml(rows: readonly (readonly Cell[])[], columnCount: number): string {\n const dimension = `A1:${colLetter(Math.max(columnCount - 1, 0))}${rows.length}`;\n const body = rows.map((row, i) => rowXml(row, i + 1)).join(\"\");\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">` +\n `<dimension ref=\"${dimension}\"/>` +\n `<sheetData>${body}</sheetData>` +\n `</worksheet>`\n );\n}\n\nconst CONTENT_TYPES_XML =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n `<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>` +\n `<Default Extension=\"xml\" ContentType=\"application/xml\"/>` +\n `<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>` +\n `<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>` +\n `</Types>`;\n\nconst ROOT_RELS_XML =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>` +\n `</Relationships>`;\n\nconst WORKBOOK_XML =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"` +\n ` xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">` +\n `<sheets><sheet name=\"Sheet1\" sheetId=\"1\" r:id=\"rId1\"/></sheets>` +\n `</workbook>`;\n\nconst WORKBOOK_RELS_XML =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>` +\n `</Relationships>`;\n\n/**\n * Write a minimal single-sheet Office Open XML (`.xlsx`) workbook and return\n * its bytes. No extra dependency beyond `fflate` — the archive is assembled and\n * deflated in-process.\n *\n * The output is UTF-8 throughout, so accents round-trip in\n * Excel/LibreOffice/Google Sheets without the BOM-detection fragility that\n * plagues CSV exports. The XML stays compact: inline strings (no shared-string\n * table), no styles, no merged cells. Numeric cells use the native `\"n\"` type\n * so spreadsheets recognise them as numbers; `null` renders as an empty cell.\n *\n * @param headers - Column headers written as the first row.\n * @param rows - Data rows; each value is a string, a number, or `null` (empty).\n * @returns The `.xlsx` file contents as a `Uint8Array`.\n *\n * @example\n * const bytes = writeXlsx(\n * [\"Name\", \"Score\"],\n * [[\"Ada\", 99], [\"Alan\", null]],\n * );\n * const blob = new Blob([bytes], {\n * type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n * });\n */\nexport function writeXlsx(\n headers: readonly string[],\n rows: readonly (readonly (string | number | null)[])[],\n): Uint8Array {\n const headerRow: Cell[] = headers.map((h) => ({ v: h, t: \"s\" }));\n const dataRows: Cell[][] = rows.map((row) => row.map(toCell));\n const allRows: Cell[][] = [headerRow, ...dataRows];\n const columnCount = Math.max(headers.length, ...dataRows.map((row) => row.length), 0);\n const sheetXml = buildSheetXml(allRows, columnCount);\n\n const encoder = new TextEncoder();\n const archive: Zippable = {\n \"[Content_Types].xml\": encoder.encode(CONTENT_TYPES_XML),\n \"_rels/.rels\": encoder.encode(ROOT_RELS_XML),\n \"xl/workbook.xml\": encoder.encode(WORKBOOK_XML),\n \"xl/_rels/workbook.xml.rels\": encoder.encode(WORKBOOK_RELS_XML),\n \"xl/worksheets/sheet1.xml\": encoder.encode(sheetXml),\n };\n return zipSync(archive);\n}\n","import type { ApiError } from \"./types\";\n\n/**\n * Error thrown by {@link createApiClient} / {@link uploadWithProgress} on a\n * non-2xx response. Mirrors the Tempest FastAPI SDK error envelope\n * (`{ detail, code, details.request_id }`) so callers get a typed `code` and a\n * `requestId` for log correlation, while still being a real `Error` (stack\n * trace, `instanceof Error`).\n *\n * @example\n * try {\n * await api.post(\"/users\", { body });\n * } catch (err) {\n * if (isApiError(err) && err.code === \"EMAIL_TAKEN\") {\n * showFieldError(\"email\", err.detail);\n * }\n * }\n */\nexport class TempestApiError extends Error implements ApiError {\n readonly status: number;\n readonly detail: string;\n readonly code?: string;\n readonly requestId?: string;\n readonly body?: unknown;\n\n constructor(init: ApiError) {\n super(init.detail);\n this.name = \"TempestApiError\";\n this.status = init.status;\n this.detail = init.detail;\n this.code = init.code;\n this.requestId = init.requestId;\n this.body = init.body;\n }\n}\n\n/**\n * Type guard for the {@link ApiError} shape. Matches both {@link TempestApiError}\n * instances and plain objects carrying `status` + `detail`.\n *\n * @param error - The unknown value (typically a caught error).\n * @returns Whether `error` conforms to the `ApiError` contract.\n */\nexport function isApiError(error: unknown): error is ApiError {\n return (\n typeof error === \"object\" &&\n error !== null &&\n typeof (error as ApiError).status === \"number\" &&\n typeof (error as ApiError).detail === \"string\"\n );\n}\n\n/**\n * Parse an error body + response into the Tempest {@link ApiError} envelope.\n *\n * Reads `detail`/`message`, the programmatic `code`, and the correlation id\n * from `details.request_id` (falling back to the `X-Request-ID` header, then\n * the id the client sent).\n *\n * @param status - HTTP status code.\n * @param body - The parsed error body (object, string, or null).\n * @param headers - The response headers (for the `X-Request-ID` fallback).\n * @param sentRequestId - The id the client sent on the request, if any.\n * @returns A fully-populated `ApiError`.\n */\nexport function buildApiError(\n status: number,\n body: unknown,\n headers?: Headers | { get(name: string): string | null },\n sentRequestId?: string,\n): ApiError {\n const obj =\n typeof body === \"object\" && body !== null ? (body as Record<string, unknown>) : null;\n const detail = obj?.detail ?? obj?.message ?? `Erro ${status}`;\n const code = typeof obj?.code === \"string\" ? obj.code : undefined;\n const details =\n typeof obj?.details === \"object\" && obj.details !== null\n ? (obj.details as Record<string, unknown>)\n : null;\n const requestId =\n (typeof details?.request_id === \"string\" ? details.request_id : undefined) ??\n headers?.get(\"X-Request-ID\") ??\n sentRequestId ??\n undefined;\n\n return {\n status,\n detail: String(detail),\n code,\n requestId: requestId ?? undefined,\n retryAfter: parseRetryAfter(headers?.get(\"Retry-After\")),\n body,\n };\n}\n\n/**\n * Parse a `Retry-After` header into seconds. Accepts a delta-seconds integer\n * (`\"120\"`) or an HTTP-date (`\"Wed, 21 Oct 2015 07:28:00 GMT\"`).\n *\n * @param value - The raw header value, or null.\n * @returns The delay in seconds (>= 0), or undefined when absent/unparseable.\n */\nexport function parseRetryAfter(value: string | null | undefined): number | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) return Number(trimmed);\n const when = Date.parse(trimmed);\n if (Number.isNaN(when)) return undefined;\n return Math.max(0, Math.round((when - Date.now()) / 1000));\n}\n","import { randomId } from \"../utils\";\nimport { buildApiError, TempestApiError } from \"./errors\";\nimport type { ApiClient, ApiClientConfig, RequestOptions } from \"./types\";\n\nfunction buildUrl(baseURL: string, path: string, params?: RequestOptions[\"params\"]): string {\n const url = new URL(path, baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n}\n\nfunction isFormData(body: unknown): body is FormData {\n return typeof FormData !== \"undefined\" && body instanceof FormData;\n}\n\nasync function parseError(response: Response, sentRequestId?: string): Promise<TempestApiError> {\n let body: unknown = null;\n try {\n body = await response.clone().json();\n } catch {\n try {\n body = await response.text();\n } catch {\n body = null;\n }\n }\n return new TempestApiError(\n buildApiError(response.status, body, response.headers, sentRequestId),\n );\n}\n\n/**\n * Create a typed HTTP client backed by `fetch`.\n *\n * Handles JSON serialization, query params, bearer auth via `getToken`,\n * automatic refresh + retry on 401 when `refresh` is supplied, and uploads\n * via `FormData`. Throws an `ApiError` on non-2xx responses.\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n const fetcher = config.fetcher ?? globalThis.fetch.bind(globalThis);\n\n function authHeaders(): Record<string, string> {\n const token = config.getToken?.();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n async function rawRequest(\n path: string,\n options: RequestOptions,\n requestId?: string,\n ): Promise<Response> {\n const { body, params, headers, ...rest } = options;\n const isForm = isFormData(body);\n\n const finalHeaders: Record<string, string> = {\n ...(isForm ? {} : { \"Content-Type\": \"application/json\" }),\n ...(requestId ? { \"X-Request-ID\": requestId } : {}),\n ...config.headers,\n ...authHeaders(),\n ...(headers as Record<string, string> | undefined),\n };\n\n const init: RequestInit = {\n ...rest,\n headers: finalHeaders,\n credentials: config.withCredentials ? \"include\" : rest.credentials,\n body:\n body === undefined || body === null\n ? undefined\n : isForm\n ? (body as FormData)\n : JSON.stringify(body),\n };\n\n return fetcher(buildUrl(config.baseURL, path, params), init);\n }\n\n async function request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const requestId = config.requestId ? config.requestId() : randomId();\n let response = await rawRequest(path, options, requestId);\n\n if (response.status === 401) {\n if (config.refresh) {\n try {\n await config.refresh();\n response = await rawRequest(path, options, requestId);\n } catch {\n await config.onUnauthorized?.(response);\n throw await parseError(response, requestId);\n }\n } else {\n await config.onUnauthorized?.(response);\n }\n }\n\n if (!response.ok) {\n throw await parseError(response, requestId);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return (await response.json()) as T;\n }\n return (await response.text()) as unknown as T;\n }\n\n async function upload<T>(\n path: string,\n formData: FormData,\n method: \"POST\" | \"PUT\" | \"PATCH\" = \"POST\",\n ): Promise<T> {\n return request<T>(path, { method, body: formData });\n }\n\n return {\n request,\n get: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"GET\" }),\n post: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"POST\" }),\n put: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"PUT\" }),\n patch: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"PATCH\" }),\n delete: <T>(path: string, options?: RequestOptions) =>\n request<T>(path, { ...options, method: \"DELETE\" }),\n upload,\n };\n}\n","import type { z } from \"zod\";\n\n/**\n * Validate an unknown response payload against a zod schema.\n *\n * In development, throws a detailed error pointing at the divergent field.\n * In production, throws a generic error so internals do not leak to users.\n *\n * @param schema - The zod schema to parse against.\n * @param raw - The raw response payload.\n * @param context - A label used in error messages, e.g. \"POST /auth/login\".\n * @returns The parsed, typed payload.\n */\nexport function parseResponse<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n raw: unknown,\n context: string,\n): z.infer<TSchema> {\n const result = schema.safeParse(raw);\n if (result.success) {\n return result.data;\n }\n\n const isDev =\n typeof process !== \"undefined\" &&\n (process.env?.NODE_ENV === \"development\" || process.env?.NODE_ENV === \"test\");\n\n if (isDev) {\n const issues = result.error.issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(\n `[parseResponse] Contract drift on ${context}:\\n${issues}\\n\\nRaw payload: ${JSON.stringify(raw, null, 2)}`,\n );\n }\n throw new Error(`Resposta inválida do servidor (${context}).`);\n}\n","import { randomId } from \"../utils\";\nimport { buildApiError, TempestApiError } from \"./errors\";\n\nexport interface UploadProgressEvent {\n /** Bytes already uploaded. */\n loaded: number;\n /** Total payload size in bytes — only meaningful when `lengthComputable` is true. */\n total: number;\n /** Fraction between 0 and 1, or null when total is unknown. */\n fraction: number | null;\n lengthComputable: boolean;\n}\n\nexport interface UploadWithProgressOptions {\n url: string;\n body: FormData | Blob | File;\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n headers?: Record<string, string>;\n /** Returns the current bearer token. */\n getToken?: () => string | null | undefined;\n /** Send cookies. Defaults to false. */\n withCredentials?: boolean;\n /** Called on every `progress` event from the XHR upload channel. */\n onProgress?: (event: UploadProgressEvent) => void;\n /** Abort the request. */\n signal?: AbortSignal;\n /** Override the JSON parser. Defaults to `JSON.parse`. */\n parser?: (raw: string) => unknown;\n /**\n * Per-request correlation id sent as `X-Request-ID` (Tempest convention).\n * Defaults to a generated id. Return an empty string to disable.\n */\n requestId?: () => string;\n}\n\nfunction parseErrorBody(raw: string): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Upload a file (or any payload) with byte-level progress reporting.\n *\n * `fetch` cannot report upload progress in browsers, so this helper falls\n * back to `XMLHttpRequest`. It mirrors the error contract used by\n * {@link createApiClient}: non-2xx responses reject with a `TempestApiError`.\n *\n * @returns The parsed JSON response, or the raw text when the response is not JSON.\n */\nexport function uploadWithProgress<T = unknown>(options: UploadWithProgressOptions): Promise<T> {\n const {\n url,\n body,\n method = \"POST\",\n headers = {},\n getToken,\n withCredentials = false,\n onProgress,\n signal,\n parser = JSON.parse,\n requestId,\n } = options;\n\n return new Promise<T>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open(method, url);\n xhr.withCredentials = withCredentials;\n\n const token = getToken?.();\n const sentRequestId = requestId ? requestId() : randomId();\n const finalHeaders: Record<string, string> = { ...headers };\n if (token && !(\"Authorization\" in finalHeaders)) {\n finalHeaders.Authorization = `Bearer ${token}`;\n }\n if (sentRequestId && !(\"X-Request-ID\" in finalHeaders)) {\n finalHeaders[\"X-Request-ID\"] = sentRequestId;\n }\n for (const [key, value] of Object.entries(finalHeaders)) {\n xhr.setRequestHeader(key, value);\n }\n\n if (onProgress) {\n xhr.upload.onprogress = (event) => {\n onProgress({\n loaded: event.loaded,\n total: event.total,\n fraction: event.lengthComputable ? event.loaded / event.total : null,\n lengthComputable: event.lengthComputable,\n });\n };\n }\n\n function handleAbort(): void {\n xhr.abort();\n }\n signal?.addEventListener(\"abort\", handleAbort);\n\n xhr.onload = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n const isSuccess = xhr.status >= 200 && xhr.status < 300;\n const contentType = xhr.getResponseHeader(\"content-type\") ?? \"\";\n\n if (!isSuccess) {\n const errorBody = parseErrorBody(xhr.responseText);\n reject(\n new TempestApiError(\n buildApiError(\n xhr.status,\n errorBody,\n { get: (name) => xhr.getResponseHeader(name) },\n sentRequestId,\n ),\n ),\n );\n return;\n }\n\n if (xhr.status === 204 || !xhr.responseText) {\n resolve(undefined as T);\n return;\n }\n\n if (contentType.includes(\"application/json\")) {\n try {\n resolve(parser(xhr.responseText) as T);\n } catch (err) {\n reject(err);\n }\n } else {\n resolve(xhr.responseText as unknown as T);\n }\n };\n\n xhr.onerror = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(\n new TempestApiError({\n status: 0,\n detail: \"Falha de rede no upload.\",\n requestId: sentRequestId || undefined,\n }),\n );\n };\n\n xhr.onabort = () => {\n signal?.removeEventListener(\"abort\", handleAbort);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n\n xhr.send(body);\n });\n}\n","export interface RetryOptions {\n /** Max attempts (including the first). Default: 3. */\n retries?: number;\n /** Initial backoff in ms. Doubles each attempt, capped at `maxDelay`. Default: 300. */\n initialDelay?: number;\n /** Maximum delay between attempts. Default: 10_000. */\n maxDelay?: number;\n /**\n * Honor a `Retry-After` hint on the thrown error (`error.retryAfter`, in\n * seconds — populated by {@link createApiClient} on `429`/`503`). When\n * present it overrides the exponential backoff for that attempt. The value\n * is capped at `maxDelay`. Default: true.\n */\n respectRetryAfter?: boolean;\n /**\n * Return false to stop retrying for a specific error.\n * Default: retry on any thrown error.\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /** Called before each retry with the upcoming delay. */\n onRetry?: (info: { attempt: number; delay: number; error: unknown }) => void;\n /** Cancel pending retries. */\n signal?: AbortSignal;\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n\n/**\n * Run `factory()` with exponential backoff. Each attempt awaits an\n * increasing delay capped at `maxDelay`. Throws the last error if every\n * attempt fails.\n *\n * @example\n * const data = await retry(() => api.get(\"/flaky\"), { retries: 5 });\n */\nexport async function retry<T>(factory: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const {\n retries = 3,\n initialDelay = 300,\n maxDelay = 10_000,\n respectRetryAfter = true,\n shouldRetry = () => true,\n onRetry,\n signal,\n } = options;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt < retries) {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n try {\n return await factory();\n } catch (error) {\n lastError = error;\n attempt += 1;\n if (attempt >= retries || !shouldRetry(error, attempt)) {\n throw error;\n }\n const retryAfter =\n respectRetryAfter &&\n typeof (error as { retryAfter?: unknown })?.retryAfter === \"number\"\n ? (error as { retryAfter: number }).retryAfter * 1000\n : null;\n const delay =\n retryAfter !== null\n ? Math.min(retryAfter, maxDelay)\n : Math.min(initialDelay * 2 ** (attempt - 1), maxDelay);\n onRetry?.({ attempt, delay, error });\n await wait(delay, signal);\n }\n }\n\n throw lastError;\n}\n","/**\n * Generate an RFC4122 v4 idempotency key (UUID). Use as the value for an\n * `Idempotency-Key` header on POST/PATCH requests that must not run twice.\n */\nexport function generateIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16;\n const value = c === \"x\" ? Math.floor(r) : (Math.floor(r) & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface UsePollOptions<T> {\n /** Polling interval in ms. */\n interval: number;\n /** Disable polling without unmounting. Default: false. */\n disabled?: boolean;\n /** Stop polling once the predicate returns true. */\n stopWhen?: (data: T) => boolean;\n /** Called on each error. */\n onError?: (error: unknown) => void;\n}\n\nexport interface UsePollResult<T> {\n data: T | null;\n error: unknown;\n loading: boolean;\n stop: () => void;\n start: () => void;\n}\n\n/**\n * Poll an async factory on a fixed interval. Skips overlapping requests if a\n * prior call has not finished. Pause via `disabled` or `stopWhen`.\n */\nexport function usePoll<T>(\n factory: () => Promise<T>,\n options: UsePollOptions<T>,\n): UsePollResult<T> {\n const { interval, disabled = false, stopWhen, onError } = options;\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState<boolean>(!disabled);\n const stopped = useRef<boolean>(disabled);\n const inFlight = useRef<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n async function tick(): Promise<void> {\n if (stopped.current || inFlight.current) return;\n inFlight.current = true;\n try {\n const next = await factory();\n if (stopped.current) return;\n setData(next);\n setError(null);\n if (stopWhen?.(next)) stopped.current = true;\n } catch (err) {\n if (!stopped.current) {\n setError(err);\n onError?.(err);\n }\n } finally {\n inFlight.current = false;\n setLoading(false);\n if (!stopped.current) {\n timer.current = setTimeout(tick, interval);\n }\n }\n }\n\n useEffect(() => {\n stopped.current = disabled;\n if (disabled) {\n if (timer.current) clearTimeout(timer.current);\n return;\n }\n setLoading(true);\n void tick();\n return () => {\n stopped.current = true;\n if (timer.current) clearTimeout(timer.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [interval, disabled]);\n\n return {\n data,\n error,\n loading,\n stop: () => {\n stopped.current = true;\n if (timer.current) clearTimeout(timer.current);\n },\n start: () => {\n if (!stopped.current) return;\n stopped.current = false;\n void tick();\n },\n };\n}\n","import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\n\nexport interface AuthState<TUser> {\n user: TUser | null;\n token: string | null;\n isAuthenticated: boolean;\n setSession: (session: { user: TUser; token: string }) => void;\n setUser: (user: TUser | null) => void;\n setToken: (token: string | null) => void;\n logout: () => void;\n}\n\nexport interface CreateAuthStoreOptions<TUser> {\n /** Persist key used in storage (default: \"tempest-auth\"). */\n name?: string;\n /** Which storage to persist into (default: localStorage). */\n storage?: \"local\" | \"session\";\n /** Initial user (useful for SSR hydration). */\n initialUser?: TUser | null;\n /** Initial token. */\n initialToken?: string | null;\n}\n\n/**\n * Build a typed Zustand auth store with `persist` middleware. Each app passes\n * its own `TUser` shape so the SDK does not own the user model.\n *\n * @example\n * const useAuthStore = createAuthStore<UserResponse>();\n * const { user, token, logout } = useAuthStore();\n */\nexport function createAuthStore<TUser>(options: CreateAuthStoreOptions<TUser> = {}) {\n const name = options.name ?? \"tempest-auth\";\n const storageImpl = options.storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<AuthState<TUser>>()(\n persist(\n (set) => ({\n user: options.initialUser ?? null,\n token: options.initialToken ?? null,\n isAuthenticated: !!options.initialToken,\n setSession: ({ user, token }) => set({ user, token, isAuthenticated: true }),\n setUser: (user) => set({ user }),\n setToken: (token) => set({ token, isAuthenticated: !!token }),\n logout: () => set({ user: null, token: null, isAuthenticated: false }),\n }),\n {\n name,\n storage: createJSONStorage(storageImpl),\n partialize: (state) => ({ user: state.user, token: state.token }),\n onRehydrateStorage: () => (state) => {\n if (state) state.isAuthenticated = !!state.token;\n },\n },\n ),\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport interface AuthGuardProps {\n /** Whether the current user is authenticated. */\n isAuthenticated: boolean;\n /** Element to render when authenticated. */\n children: ReactNode;\n /** Element to render when not authenticated. Use this to redirect (e.g. `<Navigate to=\"/login\" />`). */\n fallback: ReactNode;\n}\n\n/**\n * Router-agnostic auth gate. The caller decides what to render in either\n * branch — typically `<Outlet />` for protected layouts and `<Navigate />` for\n * the redirect. Pair with {@link createAuthStore} or any custom auth source.\n *\n * @example\n * <AuthGuard\n * isAuthenticated={useAuthStore((s) => s.isAuthenticated)}\n * fallback={<Navigate to=\"/login\" replace />}\n * >\n * <Outlet />\n * </AuthGuard>\n */\nexport function AuthGuard({ isAuthenticated, children, fallback }: AuthGuardProps) {\n return <>{isAuthenticated ? children : fallback}</>;\n}\n","export interface DecodedJWT {\n header: Record<string, unknown>;\n payload: Record<string, unknown> & { exp?: number; iat?: number; sub?: string };\n signature: string;\n}\n\nfunction base64UrlDecode(input: string): string {\n const padded = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = padded.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (padded.length % 4));\n if (typeof atob !== \"undefined\") {\n return atob(padded + padding);\n }\n return Buffer.from(padded + padding, \"base64\").toString(\"binary\");\n}\n\n/**\n * Decode a JWT into header/payload/signature. Does **not** verify the\n * signature — for that, do it server-side or use a JOSE library on the\n * client.\n *\n * @throws If the token shape is invalid (missing parts, bad JSON).\n */\nexport function decodeJWT(token: string): DecodedJWT {\n const parts = token.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT: must contain three segments.\");\n const [headerSeg, payloadSeg, signature] = parts as [string, string, string];\n try {\n return {\n header: JSON.parse(base64UrlDecode(headerSeg)),\n payload: JSON.parse(base64UrlDecode(payloadSeg)),\n signature,\n };\n } catch {\n throw new Error(\"Invalid JWT: header or payload is not valid JSON.\");\n }\n}\n\n/**\n * Return true when the JWT's `exp` claim is in the past (or missing).\n *\n * @param token - JWT to inspect.\n * @param leewaySeconds - Treat tokens expiring within this window as expired.\n */\nexport function isJWTExpired(token: string, leewaySeconds = 0): boolean {\n try {\n const { payload } = decodeJWT(token);\n if (typeof payload.exp !== \"number\") return true;\n const nowSeconds = Math.floor(Date.now() / 1000);\n return payload.exp <= nowSeconds + leewaySeconds;\n } catch {\n return true;\n }\n}\n","import { lazy } from \"react\";\nimport type { ComponentType } from \"react\";\n\nexport interface LazyWithRetryOptions {\n /** Max attempts. Default: 3. */\n retries?: number;\n /** Initial delay (ms) before retrying. Default: 400. */\n initialDelay?: number;\n /**\n * Reload the page after every retry fails. Helps when the stale chunk\n * error is caused by an old `index.html` referencing deleted bundles.\n * Default: true.\n */\n reloadOnFinalFailure?: boolean;\n}\n\n/**\n * Wrap `React.lazy` with automatic retry. Common cause of failure:\n * deployed-then-cached `index.html` references chunk filenames that no\n * longer exist. Retrying after a short delay typically picks up the new\n * bundle; a final `location.reload()` recovers from stale `index.html`.\n *\n * @example\n * const Settings = lazyWithRetry(() => import(\"./Settings\"));\n */\nexport function lazyWithRetry<T extends ComponentType<unknown>>(\n factory: () => Promise<{ default: T }>,\n options: LazyWithRetryOptions = {},\n): ReturnType<typeof lazy<T>> {\n const { retries = 3, initialDelay = 400, reloadOnFinalFailure = true } = options;\n\n async function load(attempt = 1): Promise<{ default: T }> {\n try {\n return await factory();\n } catch (error) {\n if (attempt >= retries) {\n if (reloadOnFinalFailure && typeof window !== \"undefined\") {\n window.location.reload();\n }\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, initialDelay * 2 ** (attempt - 1)));\n return load(attempt + 1);\n }\n }\n\n return lazy(load) as ReturnType<typeof lazy<T>>;\n}\n","/**\n * Deduplicate concurrent refresh calls. When multiple 401 responses arrive\n * at once, all of them share the same in-flight `refresh()` promise instead\n * of triggering N parallel refreshes.\n *\n * @example\n * const refresh = createRefreshQueue(() => AuthService.refresh());\n *\n * // In every request that hits 401:\n * await refresh();\n * // ...retry the original request\n */\nexport function createRefreshQueue(refresh: () => Promise<void>): () => Promise<void> {\n let current: Promise<void> | null = null;\n\n return () => {\n if (current) return current;\n current = (async () => {\n try {\n await refresh();\n } finally {\n current = null;\n }\n })();\n return current;\n };\n}\n","import { createApiClient } from \"../http\";\nimport type { ApiClient } from \"../http\";\nimport { createAuthStore } from \"./create-auth-store\";\nimport type { AuthState } from \"./create-auth-store\";\nimport { createRefreshQueue } from \"./refresh-queue\";\n\n/** The token envelope returned by a Tempest FastAPI SDK login/refresh route. */\nexport interface TempestTokenResponse {\n /** The bearer access token. */\n access_token: string;\n /** Token type — always `\"bearer\"` for the SDK. */\n token_type?: string;\n /** Optional refresh token (when the API returns it in the body, not a cookie). */\n refresh_token?: string;\n}\n\nexport interface CreateTempestAuthOptions<TUser> {\n /** Base URL of the API. Required. */\n baseURL: string;\n /** Login route (`POST`). Default: `\"/api/auth/login\"`. */\n loginPath?: string;\n /** Refresh route (`POST`). Default: `\"/api/auth/refresh\"`. */\n refreshPath?: string;\n /** Optional current-user route (`GET`) called after login/refresh. */\n mePath?: string;\n /** Persist key for the store. Default: `\"tempest-auth\"`. */\n storeName?: string;\n /** Storage backend. Default: `\"local\"`. */\n storage?: \"local\" | \"session\";\n /** Send cookies (needed when the refresh token lives in an httpOnly cookie). */\n withCredentials?: boolean;\n /** Custom fetch implementation (testing / SSR). Defaults to `globalThis.fetch`. */\n fetcher?: typeof fetch;\n /**\n * Extract tokens from a login/refresh response. Default reads\n * `access_token` + `refresh_token`.\n */\n parseTokens?: (data: unknown) => { token: string; refreshToken?: string };\n /** Pull the user out of the login response, when the API embeds it. */\n parseUser?: (data: unknown) => TUser | null;\n /**\n * Build the refresh request body. Default sends `{ refresh_token }` when a\n * refresh token is stored, else `undefined` (cookie-based refresh).\n */\n refreshBody?: (refreshToken: string | null) => unknown;\n}\n\nexport interface TempestAuth<TUser, TCredentials> {\n /** The persisted Zustand auth store hook (compatible with `<AuthGuard>`). */\n useAuthStore: ReturnType<typeof createAuthStore<TUser>>;\n /** A `createApiClient` wired with bearer auth + 401 → refresh → retry. */\n api: ApiClient;\n /** Authenticate, store the session, and resolve the user (or null). */\n login: (credentials: TCredentials) => Promise<TUser | null>;\n /** Clear the session (and the stored refresh token). */\n logout: () => void;\n /** Refresh the access token (deduplicated across concurrent callers). */\n refresh: () => Promise<void>;\n /** The current access token, or null. */\n getToken: () => string | null;\n}\n\nfunction defaultParseTokens(data: unknown): { token: string; refreshToken?: string } {\n const d = (data ?? {}) as TempestTokenResponse;\n return { token: d.access_token, refreshToken: d.refresh_token };\n}\n\n/**\n * Turn-key auth preset wiring `createAuthStore` + `createRefreshQueue` +\n * `createApiClient` to the Tempest FastAPI SDK auth contract: login returns\n * `{ access_token, token_type }`, requests carry `Authorization: Bearer`, and a\n * `401` triggers a single deduplicated refresh + retry. Logout (or a failed\n * refresh) clears the session.\n *\n * @example\n * const auth = createTempestAuth<User, { email: string; password: string }>({\n * baseURL: import.meta.env.VITE_API_URL,\n * mePath: \"/api/auth/me\",\n * });\n *\n * await auth.login({ email, password }); // stores session, returns the user\n * const orders = await auth.api.get(\"/api/orders\"); // sends the bearer token\n * auth.logout();\n *\n * @param options - The auth configuration.\n * @returns The store hook, a wired API client, and login/logout/refresh helpers.\n */\nexport function createTempestAuth<TUser, TCredentials = { email: string; password: string }>(\n options: CreateTempestAuthOptions<TUser>,\n): TempestAuth<TUser, TCredentials> {\n const {\n baseURL,\n loginPath = \"/api/auth/login\",\n refreshPath = \"/api/auth/refresh\",\n mePath,\n storeName = \"tempest-auth\",\n storage = \"local\",\n withCredentials = false,\n fetcher,\n parseTokens = defaultParseTokens,\n parseUser,\n refreshBody = (rt) => (rt ? { refresh_token: rt } : undefined),\n } = options;\n\n const useAuthStore = createAuthStore<TUser>({ name: storeName, storage });\n const refreshKey = `${storeName}-refresh`;\n\n function storageImpl(): Storage | null {\n if (typeof window === \"undefined\") return null;\n return storage === \"session\" ? window.sessionStorage : window.localStorage;\n }\n function readRefreshToken(): string | null {\n return storageImpl()?.getItem(refreshKey) ?? null;\n }\n function writeRefreshToken(token: string | null): void {\n const s = storageImpl();\n if (!s) return;\n if (token) s.setItem(refreshKey, token);\n else s.removeItem(refreshKey);\n }\n\n const state = (): AuthState<TUser> => useAuthStore.getState();\n const getToken = (): string | null => state().token;\n\n // Bare client (no auth/refresh) used for the login + refresh calls themselves.\n const bareApi = createApiClient({ baseURL, withCredentials, fetcher });\n\n async function fetchUser(): Promise<TUser | null> {\n if (!mePath) return state().user;\n const token = getToken();\n const user = await createApiClient({\n baseURL,\n withCredentials,\n fetcher,\n getToken: () => token,\n }).get<TUser>(mePath);\n state().setUser(user);\n return user;\n }\n\n async function login(credentials: TCredentials): Promise<TUser | null> {\n const data = await bareApi.post<unknown>(loginPath, { body: credentials });\n const { token, refreshToken } = parseTokens(data);\n state().setToken(token);\n writeRefreshToken(refreshToken ?? null);\n const embedded = parseUser?.(data);\n if (embedded != null) {\n state().setUser(embedded);\n return embedded;\n }\n return fetchUser();\n }\n\n function logout(): void {\n state().logout();\n writeRefreshToken(null);\n }\n\n const refresh = createRefreshQueue(async () => {\n const data = await bareApi.post<unknown>(refreshPath, {\n body: refreshBody(readRefreshToken()),\n });\n const { token, refreshToken } = parseTokens(data);\n state().setToken(token);\n if (refreshToken) writeRefreshToken(refreshToken);\n });\n\n const api = createApiClient({\n baseURL,\n withCredentials,\n fetcher,\n getToken,\n refresh,\n onUnauthorized: () => logout(),\n });\n\n return { useAuthStore, api, login, logout, refresh, getToken };\n}\n","import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { AccessControl } from \"./types\";\n\nconst AccessControlContext = createContext<AccessControl | null>(null);\n\nexport interface AccessControlProviderProps {\n /** The access-control strategy made available to descendants. */\n control: AccessControl;\n children: ReactNode;\n}\n\n/**\n * Provide an {@link AccessControl} strategy to the React tree. Components such\n * as `<Can>` and the `useCan` hook read it from context.\n *\n * @example\n * ```tsx\n * <AccessControlProvider control={createRoleAccessControl({ role: \"admin\", roles: { admin: [\"*\"] } })}>\n * <App />\n * </AccessControlProvider>\n * ```\n */\nexport function AccessControlProvider({ control, children }: AccessControlProviderProps) {\n return (\n <AccessControlContext.Provider value={control}>{children}</AccessControlContext.Provider>\n );\n}\n\n/**\n * Read the current {@link AccessControl} from context.\n *\n * Returns `null` when no {@link AccessControlProvider} is present. Callers MUST\n * treat the absence of a provider as **\"allow all\"** — i.e. when this returns\n * `null`, access checks should default to permitted. This keeps the SDK\n * opt-in: dropping in a provider adds enforcement, removing it disables it.\n */\nexport function useAccessControl(): AccessControl | null {\n return useContext(AccessControlContext);\n}\n","import { useEffect, useState } from \"react\";\nimport { useAccessControl } from \"./access-control-context\";\nimport type { CanParams, CanResult } from \"./types\";\n\nexport interface UseCanResult {\n /** Whether the action is permitted. Defaults to `true` while loading is not the concern of the caller. */\n allowed: boolean;\n /** `true` while an async `can` check is pending. */\n isLoading: boolean;\n /** Optional explanation, typically present when `allowed` is `false`. */\n reason?: string;\n}\n\nfunction normalize(result: boolean | CanResult): CanResult {\n return typeof result === \"boolean\" ? { can: result } : result;\n}\n\n/**\n * Resolve an access check against the {@link AccessControl} in context.\n *\n * Handles sync booleans, sync {@link CanResult}, and promises of either. When\n * no provider is present, access is allowed (see `useAccessControl`). The check\n * re-runs whenever the params change.\n *\n * @param params - The action/resource being checked.\n */\nexport function useCan(params: CanParams): UseCanResult {\n const control = useAccessControl();\n const paramsKey = JSON.stringify(params);\n\n const [state, setState] = useState<UseCanResult>(() =>\n control ? { allowed: false, isLoading: true } : { allowed: true, isLoading: false },\n );\n\n useEffect(() => {\n if (!control) {\n setState({ allowed: true, isLoading: false });\n return;\n }\n\n let cancelled = false;\n setState((prev) => ({ ...prev, isLoading: true }));\n\n Promise.resolve(control.can(params))\n .then((raw) => {\n if (cancelled) return;\n const result = normalize(raw);\n setState({ allowed: result.can, isLoading: false, reason: result.reason });\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n setState({\n allowed: false,\n isLoading: false,\n reason: error instanceof Error ? error.message : \"access check failed\",\n });\n });\n\n return () => {\n cancelled = true;\n };\n // `paramsKey` is the stable stringified form of `params`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [control, paramsKey]);\n\n return state;\n}\n","import type { ReactNode } from \"react\";\nimport { useCan } from \"./use-can\";\nimport type { CanParams } from \"./types\";\n\nexport interface CanProps extends CanParams {\n /** Rendered when the action is allowed. */\n children: ReactNode;\n /** Rendered when the action is denied. Defaults to nothing. */\n fallback?: ReactNode;\n}\n\n/**\n * Conditionally render based on an access check. Renders `children` when the\n * action is allowed, otherwise `fallback` (or nothing). While an async check is\n * pending, nothing is rendered.\n *\n * @example\n * ```tsx\n * <Can action=\"create\" resource=\"posts\" fallback={<p>No access</p>}>\n * <NewPostButton />\n * </Can>\n * ```\n */\nexport function Can({ action, resource, params, children, fallback }: CanProps) {\n const { allowed, isLoading } = useCan({ action, resource, params });\n if (isLoading) return <>{fallback ?? null}</>;\n return <>{allowed ? children : (fallback ?? null)}</>;\n}\n","import type { AccessControl, CanParams, CanResult } from \"./types\";\n\nexport interface RoleAccessControlConfig {\n /** Permission strings granted directly, regardless of role. */\n permissions?: string[];\n /** Map of role name → permission strings granted by that role. */\n roles?: Record<string, string[]>;\n /** The active role(s). Their permissions (from `roles`) are merged in. */\n role?: string | string[];\n}\n\nfunction resolvePermissions(config: RoleAccessControlConfig): Set<string> {\n const set = new Set<string>(config.permissions ?? []);\n const roles = config.role ? (Array.isArray(config.role) ? config.role : [config.role]) : [];\n for (const role of roles) {\n for (const perm of config.roles?.[role] ?? []) {\n set.add(perm);\n }\n }\n return set;\n}\n\n/**\n * Build a simple RBAC {@link AccessControl} from a static permission set.\n *\n * Permission strings are `\"<resource>:<action>\"` (e.g. `\"posts:create\"`) or a\n * bare `\"<action>\"`. Wildcards are supported: `\"*\"` grants everything and\n * `\"<resource>:*\"` grants every action on a resource.\n *\n * The effective set is `config.permissions` plus, for each active role in\n * `config.role`, the permissions listed in `config.roles[role]`.\n *\n * @param config - Permissions, role map, and active role(s).\n * @returns An access-control strategy backed by the resolved permission set.\n *\n * @example\n * ```ts\n * const ac = createRoleAccessControl({\n * role: \"editor\",\n * roles: { editor: [\"posts:*\", \"comments:read\"] },\n * });\n * ac.can({ action: \"create\", resource: \"posts\" }); // true\n * ```\n */\nexport function createRoleAccessControl(config: RoleAccessControlConfig): AccessControl {\n const granted = resolvePermissions(config);\n\n return {\n can({ action, resource }: CanParams): CanResult {\n const allowed =\n granted.has(\"*\") ||\n (resource !== undefined &&\n (granted.has(`${resource}:*`) || granted.has(`${resource}:${action}`))) ||\n (resource === undefined && granted.has(action));\n\n return allowed ? { can: true } : { can: false, reason: \"missing permission\" };\n },\n };\n}\n","import { decodeJWT } from \"@/auth/jwt\";\n\nexport interface PermissionsFromTokenOptions {\n /** JWT claim to read permissions from. Default: `\"permissions\"`. */\n claim?: string;\n}\n\nfunction toPermissionList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\") {\n // Space-delimited scope strings (OAuth convention).\n return value.split(/\\s+/).filter(Boolean);\n }\n return [];\n}\n\n/**\n * Extract a permission list from a JWT.\n *\n * Reads the configured claim (default `\"permissions\"`); if absent, falls back to\n * the OAuth `\"scopes\"`/`\"scope\"` claims. Array claims are used as-is; string\n * claims are split on whitespace. Returns `[]` on any decode failure or when no\n * recognizable claim is present.\n *\n * @param token - The JWT to inspect (signature is **not** verified).\n * @param options - Optional claim override.\n * @returns The list of permission strings, or `[]` on failure.\n */\nexport function permissionsFromToken(\n token: string,\n options?: PermissionsFromTokenOptions,\n): string[] {\n try {\n const { payload } = decodeJWT(token);\n const claim = options?.claim ?? \"permissions\";\n const primary = toPermissionList(payload[claim]);\n if (primary.length > 0) return primary;\n\n if (options?.claim === undefined) {\n const scopes = toPermissionList(payload[\"scopes\"]);\n if (scopes.length > 0) return scopes;\n return toPermissionList(payload[\"scope\"]);\n }\n return primary;\n } catch {\n return [];\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { OAuthCredential, OAuthError } from \"./types\";\n\nexport type GoogleSignInTheme = \"filled_blue\" | \"filled_black\" | \"outline\";\nexport type GoogleSignInText = \"signin_with\" | \"signup_with\" | \"continue_with\" | \"signin\";\nexport type GoogleSignInShape = \"rectangular\" | \"pill\" | \"circle\" | \"square\";\nexport type GoogleSignInSize = \"large\" | \"medium\" | \"small\";\n\nexport interface GoogleSignInProps {\n /**\n * `GoogleLogin` component from `@react-oauth/google`. The caller imports\n * it and passes it through so the SDK doesn't take `@react-oauth/google`\n * as a peer dep.\n */\n component: (props: Record<string, unknown>) => ReactNode;\n /** Fired with the validated credential on success. */\n onSuccess: (credential: OAuthCredential) => void | Promise<void>;\n /** Fired with a normalised error on failure. */\n onError?: (error: OAuthError) => void;\n /** Optional locale override (e.g. `\"pt-BR\"`). Falls back to browser locale. */\n locale?: string;\n /** Visual theme — passed through to `<GoogleLogin>`. */\n theme?: GoogleSignInTheme;\n /** Button text variant. */\n text?: GoogleSignInText;\n /** Button shape. */\n shape?: GoogleSignInShape;\n /** Button size. */\n size?: GoogleSignInSize;\n /** Disable Google's \"One Tap\" auto-prompt. Default `false`. */\n disableOneTap?: boolean;\n /** Optional `width` override (px) — Google's button is fixed-width. */\n width?: number;\n /** Optional className applied to the wrapper. */\n className?: string;\n /** Optional inline style applied to the wrapper. */\n style?: CSSProperties;\n}\n\n/**\n * Thin wrapper over `@react-oauth/google`'s `<GoogleLogin>` that:\n *\n * 1. Normalises the success payload into [[OAuthCredential]] (`idToken`,\n * `provider: \"google\"`, `raw`).\n * 2. Normalises errors into [[OAuthError]].\n * 3. Lets you pass `GoogleLogin` via the `component` prop, so the SDK does\n * not declare `@react-oauth/google` as a peer dep — apps that don't use\n * Google never pay for it.\n *\n * @example\n * import { GoogleLogin, GoogleOAuthProvider } from \"@react-oauth/google\";\n * import { GoogleSignIn } from \"tempest-react-sdk\";\n *\n * <GoogleOAuthProvider clientId={import.meta.env.VITE_GOOGLE_CLIENT_ID}>\n * <GoogleSignIn\n * component={GoogleLogin}\n * onSuccess={async ({ idToken }) => {\n * await api.post(\"/auth/google\", { body: { id_token: idToken } });\n * }}\n * onError={(err) => toast.error(err.message)}\n * />\n * </GoogleOAuthProvider>\n */\nexport function GoogleSignIn({\n component: Component,\n onSuccess,\n onError,\n locale,\n theme,\n text,\n shape,\n size,\n disableOneTap,\n width,\n className,\n style,\n}: GoogleSignInProps) {\n return (\n <div className={className} style={style}>\n {Component({\n onSuccess: (response: { credential?: string }) => {\n if (!response.credential) {\n onError?.({\n provider: \"google\",\n message: \"Google returned no credential\",\n raw: response,\n });\n return;\n }\n return onSuccess({\n idToken: response.credential,\n provider: \"google\",\n raw: response,\n });\n },\n onError: () => {\n onError?.({\n provider: \"google\",\n message: \"Google login failed\",\n });\n },\n locale,\n theme,\n text,\n shape,\n size,\n useOneTap: !disableOneTap,\n width,\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface UseOAuthCallbackOptions<T> {\n /** Function that exchanges the provider response for an app session. Called once on mount. */\n exchange: () => Promise<T>;\n /** Fired with the result on success. Receives the value resolved by `exchange`. */\n onSuccess?: (result: T) => void | Promise<void>;\n /** Fired when `exchange` throws or rejects. */\n onError?: (error: unknown) => void;\n}\n\nexport interface UseOAuthCallbackResult<T> {\n /** `true` while the exchange promise is pending. */\n loading: boolean;\n /** Last resolved value, when `status === \"success\"`. */\n data: T | null;\n /** Last rejection reason, when `status === \"error\"`. */\n error: unknown;\n /** Aggregated state — `\"pending\"`, `\"success\"`, or `\"error\"`. */\n status: \"pending\" | \"success\" | \"error\";\n}\n\n/**\n * Run an OAuth-callback \"exchange\" exactly once on mount. Designed for\n * `/callback` routes that receive provider redirects and need to swap a\n * code/token for an app session via the backend.\n *\n * Survives React StrictMode double-mounting in dev — uses a ref guard to\n * ensure `exchange` runs once.\n *\n * @example\n * function OAuthCallback() {\n * const { loading, error } = useOAuthCallback({\n * exchange: async () => {\n * const code = new URLSearchParams(location.search).get(\"code\")!;\n * return api.post(\"/auth/google/exchange\", { body: { code } });\n * },\n * onSuccess: ({ token, user }) => {\n * useAuthStore.getState().setSession({ user, token });\n * navigate(\"/dashboard\", { replace: true });\n * },\n * onError: () => navigate(\"/login?error=oauth\", { replace: true }),\n * });\n *\n * if (loading) return <Spinner />;\n * if (error) return <ErrorState description=\"OAuth falhou\" />;\n * return null;\n * }\n */\nexport function useOAuthCallback<T>(\n options: UseOAuthCallbackOptions<T>,\n): UseOAuthCallbackResult<T> {\n const { exchange, onSuccess, onError } = options;\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [status, setStatus] = useState<\"pending\" | \"success\" | \"error\">(\"pending\");\n const ranRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (ranRef.current) return;\n ranRef.current = true;\n let cancelled = false;\n exchange()\n .then((result) => {\n if (cancelled) return;\n setData(result);\n setStatus(\"success\");\n return onSuccess?.(result);\n })\n .catch((err) => {\n if (cancelled) return;\n setError(err);\n setStatus(\"error\");\n onError?.(err);\n });\n return () => {\n cancelled = true;\n };\n }, [exchange, onSuccess, onError]);\n\n return { loading: status === \"pending\", data, error, status };\n}\n","/** Recommended `staleTime` presets (milliseconds). */\nexport const STALE_TIME = {\n SHORT: 30 * 1000,\n DEFAULT: 5 * 60 * 1000,\n LONG: 30 * 60 * 1000,\n INFINITE: Infinity,\n} as const;\n\n/** Recommended `gcTime` presets (milliseconds). */\nexport const CACHE_TIME = {\n SHORT: 5 * 60 * 1000,\n DEFAULT: 30 * 60 * 1000,\n LONG: 60 * 60 * 1000,\n} as const;\n\n/** Recommended refetch intervals (milliseconds). */\nexport const REFETCH_TIME = {\n REALTIME: 5 * 1000,\n FAST: 30 * 1000,\n DEFAULT: 60 * 1000,\n SLOW: 5 * 60 * 1000,\n} as const;\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KeyBuilder = (...args: any[]) => readonly unknown[];\n\n/**\n * Build a typed query-key factory for a domain. Each entry can be a static\n * tuple or a function returning a tuple. The returned object is `as const`\n * so TanStack Query infers literal keys.\n *\n * @example\n * const userKeys = createQueryKeys(\"user\", {\n * me: () => [\"me\"] as const,\n * byId: (id: string) => [id] as const,\n * list: (filters: { page: number }) => [\"list\", filters] as const,\n * });\n * // userKeys.byId(\"42\") === [\"user\", \"42\"]\n */\nexport function createQueryKeys<\n TKey extends string,\n TEntries extends Record<string, KeyBuilder | readonly unknown[]>,\n>(scope: TKey, entries: TEntries) {\n const output = { all: [scope] as const } as { all: readonly [TKey] } & {\n [K in keyof TEntries]: TEntries[K] extends KeyBuilder\n ? (...args: Parameters<TEntries[K]>) => readonly [TKey, ...ReturnType<TEntries[K]>]\n : TEntries[K] extends readonly unknown[]\n ? readonly [TKey, ...TEntries[K]]\n : never;\n };\n\n for (const [name, entry] of Object.entries(entries) as [\n keyof TEntries,\n KeyBuilder | readonly unknown[],\n ][]) {\n if (typeof entry === \"function\") {\n (output as Record<string, unknown>)[name as string] = (...args: unknown[]) =>\n [scope, ...entry(...args)] as const;\n } else {\n (output as Record<string, unknown>)[name as string] = [scope, ...entry] as const;\n }\n }\n\n return output;\n}\n","import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { DefaultOptions } from \"@tanstack/react-query\";\nimport { STALE_TIME, CACHE_TIME } from \"./constants\";\n\nexport interface QueryProviderProps {\n children: ReactNode;\n /** Pass an existing client to share it across roots. */\n client?: QueryClient;\n /** Overrides for the default options applied when no `client` is provided. */\n defaultOptions?: DefaultOptions;\n}\n\n/**\n * Wrapper around `QueryClientProvider` that bootstraps a `QueryClient` with\n * sane SDK defaults (5-minute stale time, 30-minute gc time, 1 retry).\n */\nexport function QueryProvider({ children, client, defaultOptions }: QueryProviderProps) {\n const [internalClient] = useState<QueryClient>(\n () =>\n client ??\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: STALE_TIME.DEFAULT,\n gcTime: CACHE_TIME.DEFAULT,\n retry: 1,\n refetchOnWindowFocus: false,\n ...(defaultOptions?.queries ?? {}),\n },\n mutations: {\n retry: 0,\n ...(defaultOptions?.mutations ?? {}),\n },\n },\n }),\n );\n\n return <QueryClientProvider client={internalClient}>{children}</QueryClientProvider>;\n}\n","// Contracts mirroring the Tempest FastAPI SDK pagination envelopes, so a\n// React frontend consumes them with no manual mapping.\n//\n// Offset (fastapi-pagination `Page` / BasePaginationSchema):\n// { items, total, page, size, pages } (some configs name the size `page_size`)\n// Cursor (CursorPaginationSchema):\n// { items, next_cursor, has_more, limit }\n\n/** Offset-paginated response envelope (fastapi-pagination `Page[T]`). */\nexport interface OffsetPage<T> {\n /** The rows for the current page. */\n items: T[];\n /** Total number of matching rows across all pages. */\n total: number;\n /** Current 1-based page number. */\n page: number;\n /** Total number of pages. */\n pages: number;\n /** Page size — fastapi-pagination emits `size`. */\n size?: number;\n /** Page size — some backends name it `page_size` instead. */\n page_size?: number;\n}\n\n/** Cursor-paginated response envelope (`CursorPaginationSchema[T]`). */\nexport interface CursorPage<T> {\n /** The rows for this batch. */\n items: T[];\n /** Opaque cursor for the next batch, or null when exhausted. Pass it back verbatim. */\n next_cursor: string | null;\n /** Whether another batch exists. */\n has_more: boolean;\n /** Batch size used for this query. */\n limit: number;\n}\n\n/** Offset filter query params (fastapi-pagination / `BasePaginationFilterSchema`). */\nexport interface OffsetParams {\n page?: number;\n /** Page size — fastapi-pagination convention. */\n size?: number;\n /** Page size — `page_size` convention. */\n page_size?: number;\n order_by?: string;\n ascending?: boolean;\n}\n\n/** Cursor filter query params (`CursorPaginationFilterSchema`). */\nexport interface CursorParams {\n cursor?: string | null;\n limit?: number;\n order_by?: string;\n ascending?: boolean;\n}\n\n/**\n * Type guard for an {@link OffsetPage} envelope.\n *\n * @param value - The unknown value to test.\n * @returns Whether it carries `items` + `total` + `page` + `pages`.\n */\nexport function isOffsetPage<T = unknown>(value: unknown): value is OffsetPage<T> {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.items) && typeof v.total === \"number\" && typeof v.pages === \"number\";\n}\n\n/**\n * Type guard for a {@link CursorPage} envelope.\n *\n * @param value - The unknown value to test.\n * @returns Whether it carries `items` + `has_more` + a `next_cursor` key.\n */\nexport function isCursorPage<T = unknown>(value: unknown): value is CursorPage<T> {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.items) && typeof v.has_more === \"boolean\" && \"next_cursor\" in v;\n}\n\n/**\n * Build an empty {@link OffsetPage} — handy as `placeholderData`/`initialData`.\n *\n * @param pageSize - The page size to report (default 20).\n * @returns An empty offset page on page 1.\n */\nexport function emptyOffsetPage<T>(pageSize = 20): OffsetPage<T> {\n return { items: [], total: 0, page: 1, size: pageSize, pages: 0 };\n}\n","import { useCallback, useState } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { QueryKey, UseQueryOptions } from \"@tanstack/react-query\";\n\nimport type { OffsetPage, OffsetParams } from \"./pagination\";\n\nexport interface UsePaginatedQueryOptions<T> extends Omit<\n UseQueryOptions<OffsetPage<T>, Error, OffsetPage<T>, QueryKey>,\n \"queryKey\" | \"queryFn\"\n> {\n /** Base query key — the current page/sort is appended for cache isolation. */\n queryKey: QueryKey;\n /** Fetcher receiving the offset params; return the backend envelope. */\n queryFn: (params: OffsetParams) => Promise<OffsetPage<T>> | OffsetPage<T>;\n /** Initial 1-based page. Default: 1. */\n initialPage?: number;\n /** Page size. Default: 20. */\n pageSize?: number;\n /**\n * Query-param name for the page size. fastapi-pagination uses `\"size\"`\n * (default); SDK `BasePaginationFilterSchema` configs may use `\"page_size\"`.\n */\n sizeParam?: \"size\" | \"page_size\";\n /** Initial `order_by` (only sent when set). */\n orderBy?: string;\n /** Initial `ascending` (only sent when `orderBy` is set). Default: false. */\n ascending?: boolean;\n}\n\nexport interface UsePaginatedQueryResult<T> {\n /** The current page envelope, or undefined while the first load is pending. */\n page: OffsetPage<T> | undefined;\n /** The rows of the current page (empty array while pending). */\n items: T[];\n /** Current 1-based page number (controlled by the hook). */\n pageNumber: number;\n /** Total page count from the last successful response. */\n pageCount: number;\n /** Total row count from the last successful response. */\n total: number;\n hasNext: boolean;\n hasPrev: boolean;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n /** Jump to a specific 1-based page (clamped to >= 1). */\n setPage: (page: number) => void;\n /** Go to the next page when available. */\n next: () => void;\n /** Go to the previous page when available. */\n prev: () => void;\n /** Refetch the current page. */\n refetch: () => void;\n}\n\n/**\n * Offset-pagination hook over TanStack Query for the fastapi-pagination /\n * Tempest envelope (`{ items, total, page, size, pages }`).\n *\n * It owns the page state, sends `page` + the size param (`size` by default,\n * or `page_size` via `sizeParam`) plus optional `order_by`/`ascending` to your\n * fetcher, keeps the previous page visible while the next loads, and derives\n * `hasNext`/`hasPrev`/`pageCount`.\n *\n * @example\n * const users = usePaginatedQuery<User>({\n * queryKey: [\"users\"],\n * pageSize: 25,\n * queryFn: (params) => usersService.listUsers(params),\n * });\n * // users.items, users.next(), users.hasNext, users.pageCount\n */\nexport function usePaginatedQuery<T>(\n options: UsePaginatedQueryOptions<T>,\n): UsePaginatedQueryResult<T> {\n const {\n queryKey,\n queryFn,\n initialPage = 1,\n pageSize = 20,\n sizeParam = \"size\",\n orderBy,\n ascending = false,\n ...queryOptions\n } = options;\n\n const [pageNumber, setPageNumber] = useState(initialPage);\n\n const query = useQuery<OffsetPage<T>, Error>({\n ...queryOptions,\n queryKey: [...queryKey, { page: pageNumber, pageSize, sizeParam, orderBy, ascending }],\n queryFn: () => {\n const params: OffsetParams = { page: pageNumber, [sizeParam]: pageSize };\n if (orderBy) {\n params.order_by = orderBy;\n params.ascending = ascending;\n }\n return queryFn(params);\n },\n placeholderData: keepPreviousData,\n });\n\n const page = query.data;\n const pageCount = page?.pages ?? 0;\n const hasNext = pageNumber < pageCount;\n const hasPrev = pageNumber > 1;\n\n const setPage = useCallback((next: number) => setPageNumber(Math.max(1, next)), []);\n const next = useCallback(() => setPageNumber((p) => (p < pageCount ? p + 1 : p)), [pageCount]);\n const prev = useCallback(() => setPageNumber((p) => (p > 1 ? p - 1 : p)), []);\n\n return {\n page,\n items: page?.items ?? [],\n pageNumber,\n pageCount,\n total: page?.total ?? 0,\n hasNext,\n hasPrev,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n setPage,\n next,\n prev,\n refetch: () => void query.refetch(),\n };\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { InfiniteData, QueryKey, UseInfiniteQueryOptions } from \"@tanstack/react-query\";\n\nimport type { CursorPage, CursorParams } from \"./pagination\";\n\nexport interface UseCursorQueryOptions<T> extends Omit<\n UseInfiniteQueryOptions<\n CursorPage<T>,\n Error,\n InfiniteData<CursorPage<T>, string | null>,\n QueryKey,\n string | null\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n> {\n /** Base query key — `limit`/sort is appended for cache isolation. */\n queryKey: QueryKey;\n /** Fetcher receiving the cursor params; return the backend envelope. */\n queryFn: (params: CursorParams) => Promise<CursorPage<T>> | CursorPage<T>;\n /** Batch size sent as `limit`. Default: 20. */\n limit?: number;\n /** Initial `order_by`. */\n orderBy?: string;\n /** Initial `ascending`. Default: false. */\n ascending?: boolean;\n}\n\nexport interface UseCursorQueryResult<T> {\n /** All rows fetched so far, flattened across batches. */\n items: T[];\n /** The raw batches, in fetch order. */\n pages: CursorPage<T>[];\n hasNextPage: boolean;\n isLoading: boolean;\n isFetchingNextPage: boolean;\n error: Error | null;\n /** Fetch the next batch (no-op when exhausted). */\n fetchNextPage: () => void;\n /** Refetch from the first batch. */\n refetch: () => void;\n}\n\n/**\n * Cursor-pagination hook over TanStack Query's `useInfiniteQuery` for the\n * Tempest `CursorPaginationSchema` envelope\n * (`{ items, next_cursor, has_more, limit }`).\n *\n * The opaque `next_cursor` is fed straight back as the next page param; the\n * loop stops when `has_more` is false (or `next_cursor` is null).\n *\n * @example\n * const feed = useCursorQuery<Post>({\n * queryKey: [\"feed\"],\n * limit: 30,\n * queryFn: (params) => postsService.listPosts(params),\n * });\n * // feed.items, feed.fetchNextPage(), feed.hasNextPage\n */\nexport function useCursorQuery<T>(options: UseCursorQueryOptions<T>): UseCursorQueryResult<T> {\n const { queryKey, queryFn, limit = 20, orderBy, ascending = false, ...queryOptions } = options;\n\n const query = useInfiniteQuery<\n CursorPage<T>,\n Error,\n InfiniteData<CursorPage<T>, string | null>,\n QueryKey,\n string | null\n >({\n ...queryOptions,\n queryKey: [...queryKey, { limit, orderBy, ascending }],\n initialPageParam: null,\n queryFn: ({ pageParam }) =>\n queryFn({ cursor: pageParam, limit, order_by: orderBy, ascending }),\n getNextPageParam: (last) => (last.has_more ? last.next_cursor : undefined),\n });\n\n const pages = query.data?.pages ?? [];\n\n return {\n items: pages.flatMap((p) => p.items),\n pages,\n hasNextPage: query.hasNextPage,\n isLoading: query.isLoading,\n isFetchingNextPage: query.isFetchingNextPage,\n error: query.error,\n fetchNextPage: () => void query.fetchNextPage(),\n refetch: () => void query.refetch(),\n };\n}\n","import type { ApiClient, RequestOptions } from \"@/http/types\";\nimport type { OffsetPage } from \"@/query/pagination\";\n\n/** Query-param values accepted by the API client for a list request. */\ntype ParamValue = string | number | boolean | undefined | null;\n\n/** Filters passed to {@link DataProvider.getList}, spread verbatim into the query string. */\nexport type DataFilters = Record<string, ParamValue>;\n\n/** Parameters for a paginated, sorted, filtered list request. */\nexport interface GetListParams {\n /** Offset pagination — 1-based `page` and `pageSize`. */\n pagination?: { page?: number; pageSize?: number };\n /** Single-field sort. `order` defaults to `\"asc\"`. */\n sort?: { field: string; order?: \"asc\" | \"desc\" };\n /** Arbitrary filter query params, spread onto the request. */\n filters?: DataFilters;\n}\n\n/**\n * Refine-style data provider over the Tempest FastAPI SDK CRUD/pagination\n * conventions. Implementations are stateless wrappers around an {@link ApiClient}.\n */\nexport interface DataProvider {\n /**\n * Fetch a paginated list of a resource.\n *\n * @param resource - The resource name (e.g. `\"users\"`).\n * @param params - Pagination, sort and filter parameters.\n * @returns The offset-paginated envelope.\n */\n getList<T>(resource: string, params?: GetListParams): Promise<OffsetPage<T>>;\n /**\n * Fetch a single record by id.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns The record.\n */\n getOne<T>(resource: string, id: string | number): Promise<T>;\n /**\n * Fetch many records by id (default: parallel {@link DataProvider.getOne}).\n *\n * @param resource - The resource name.\n * @param ids - The record ids.\n * @returns The records, in the same order as `ids`.\n */\n getMany<T>(resource: string, ids: (string | number)[]): Promise<T[]>;\n /**\n * Create a record.\n *\n * @param resource - The resource name.\n * @param data - The creation payload.\n * @returns The created record.\n */\n create<T>(resource: string, data: unknown): Promise<T>;\n /**\n * Update a record (PATCH by default, PUT when configured).\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @param data - The update payload.\n * @returns The updated record.\n */\n update<T>(resource: string, id: string | number, data: unknown): Promise<T>;\n /**\n * Delete a record by id.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns The delete response (often the deleted record).\n */\n deleteOne<T>(resource: string, id: string | number): Promise<T>;\n}\n\n/** Options to tailor {@link createDataProvider} to a backend's conventions. */\nexport interface DataProviderOptions {\n /** Query-param name for the page number. Default: `\"page\"`. */\n pageParam?: string;\n /** Query-param name for the page size. Default: `\"size\"`. */\n sizeParam?: string;\n /** Query-param name for the sort field. Default: `\"order_by\"`. */\n sortFieldParam?: string;\n /** Query-param name for the sort order. Default: `\"ascending\"`. */\n sortOrderParam?: string;\n /**\n * When `true` (default), emit the sort order as a boolean\n * (`order:\"asc\"` → `true`). When `false`, emit the literal `\"asc\"`/`\"desc\"`.\n */\n sortOrderAsBoolean?: boolean;\n /** HTTP method used by {@link DataProvider.update}. Default: `\"patch\"`. */\n updateMethod?: \"patch\" | \"put\";\n /**\n * Build the request path for a resource (and optional id).\n * Default: `id == null ? \"/\" + resource : \"/\" + resource + \"/\" + id`.\n */\n buildPath?: (resource: string, id?: string | number) => string;\n}\n\nconst defaultBuildPath = (resource: string, id?: string | number): string =>\n id == null ? `/${resource}` : `/${resource}/${id}`;\n\n/**\n * Create a {@link DataProvider} bound to an {@link ApiClient}.\n *\n * Maps Refine-style calls to the Tempest FastAPI SDK conventions: list →\n * `GET /{resource}?page=&size=&order_by=&ascending=&...filters`, one →\n * `GET /{resource}/{id}`, create → `POST`, update → `PATCH`/`PUT`,\n * delete → `DELETE`.\n *\n * @param client - The HTTP client created by `createApiClient`.\n * @param options - Optional overrides for param names, sort encoding,\n * update method and path building.\n * @returns A stateless data provider.\n *\n * @example\n * const dataProvider = createDataProvider(apiClient);\n * const page = await dataProvider.getList<User>(\"users\", {\n * pagination: { page: 1, pageSize: 20 },\n * sort: { field: \"created_at\", order: \"desc\" },\n * filters: { active: true },\n * });\n */\nexport function createDataProvider(\n client: ApiClient,\n options: DataProviderOptions = {},\n): DataProvider {\n const {\n pageParam = \"page\",\n sizeParam = \"size\",\n sortFieldParam = \"order_by\",\n sortOrderParam = \"ascending\",\n sortOrderAsBoolean = true,\n updateMethod = \"patch\",\n buildPath = defaultBuildPath,\n } = options;\n\n const provider: DataProvider = {\n getList<T>(resource: string, params: GetListParams = {}): Promise<OffsetPage<T>> {\n const { pagination, sort, filters } = params;\n const query: Record<string, ParamValue> = {};\n\n if (pagination?.page != null) query[pageParam] = pagination.page;\n if (pagination?.pageSize != null) query[sizeParam] = pagination.pageSize;\n\n if (sort?.field) {\n const order = sort.order ?? \"asc\";\n query[sortFieldParam] = sort.field;\n query[sortOrderParam] = sortOrderAsBoolean ? order === \"asc\" : order;\n }\n\n if (filters) {\n for (const [key, value] of Object.entries(filters)) {\n query[key] = value;\n }\n }\n\n const requestOptions: RequestOptions = { params: query };\n return client.get<OffsetPage<T>>(buildPath(resource), requestOptions);\n },\n\n getOne<T>(resource: string, id: string | number): Promise<T> {\n return client.get<T>(buildPath(resource, id));\n },\n\n getMany<T>(resource: string, ids: (string | number)[]): Promise<T[]> {\n return Promise.all(ids.map((id) => provider.getOne<T>(resource, id)));\n },\n\n create<T>(resource: string, data: unknown): Promise<T> {\n return client.post<T>(buildPath(resource), { body: data });\n },\n\n update<T>(resource: string, id: string | number, data: unknown): Promise<T> {\n const path = buildPath(resource, id);\n return updateMethod === \"put\"\n ? client.put<T>(path, { body: data })\n : client.patch<T>(path, { body: data });\n },\n\n deleteOne<T>(resource: string, id: string | number): Promise<T> {\n return client.delete<T>(buildPath(resource, id));\n },\n };\n\n return provider;\n}\n","import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport type { DataProvider } from \"./create-data-provider\";\n\nconst DataProviderContext = createContext<DataProvider | null>(null);\n\n/** Props for {@link TempestDataProvider}. */\nexport interface TempestDataProviderProps {\n /** The data provider to expose to descendant resource hooks. */\n provider: DataProvider;\n /** The subtree that consumes the provider. */\n children: ReactNode;\n}\n\n/**\n * Inject a {@link DataProvider} into the React tree so the resource hooks\n * (`useList`, `useOne`, `useCreate`, …) can resolve it via {@link useDataProvider}.\n *\n * @example\n * const dataProvider = createDataProvider(apiClient);\n * <TempestDataProvider provider={dataProvider}>\n * <App />\n * </TempestDataProvider>\n */\nexport function TempestDataProvider({ provider, children }: TempestDataProviderProps) {\n return <DataProviderContext.Provider value={provider}>{children}</DataProviderContext.Provider>;\n}\n\n/**\n * Read the {@link DataProvider} from context.\n *\n * @returns The data provider supplied to the nearest {@link TempestDataProvider}.\n * @throws {Error} When used outside a {@link TempestDataProvider}.\n */\nexport function useDataProvider(): DataProvider {\n const provider = useContext(DataProviderContext);\n if (!provider) {\n throw new Error(\"useDataProvider must be used within a <TempestDataProvider>\");\n }\n return provider;\n}\n","import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n UseMutationOptions,\n UseMutationResult,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\n\nimport type { OffsetPage } from \"@/query/pagination\";\n\nimport type { GetListParams } from \"./create-data-provider\";\nimport { useDataProvider } from \"./data-provider-context\";\n\n/** Extra TanStack Query options for {@link useList} (key + fn are provided). */\nexport type UseListOptions<T> = Omit<\n UseQueryOptions<OffsetPage<T>, Error, OffsetPage<T>>,\n \"queryKey\" | \"queryFn\"\n>;\n\n/** Extra TanStack Query options for {@link useOne} (key + fn + enabled are provided). */\nexport type UseOneOptions<T> = Omit<\n UseQueryOptions<T, Error, T>,\n \"queryKey\" | \"queryFn\" | \"enabled\"\n> & { enabled?: boolean };\n\n/**\n * Build the cache key for a resource list query.\n *\n * @param resource - The resource name.\n * @param params - The list params (page/sort/filters).\n * @returns A stable TanStack Query key.\n */\nexport function listQueryKey(resource: string, params?: GetListParams): unknown[] {\n return [\"data\", resource, \"list\", params];\n}\n\n/**\n * Build the cache key for a single-record query.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @returns A stable TanStack Query key.\n */\nexport function oneQueryKey(resource: string, id: string | number | null | undefined): unknown[] {\n return [\"data\", resource, \"one\", id];\n}\n\n/**\n * Query a paginated list of a resource through the active {@link useDataProvider}.\n *\n * @param resource - The resource name.\n * @param params - Pagination, sort and filter parameters.\n * @param options - Extra TanStack Query options.\n * @returns The TanStack Query result for the offset page.\n */\nexport function useList<T>(\n resource: string,\n params?: GetListParams,\n options?: UseListOptions<T>,\n): UseQueryResult<OffsetPage<T>, Error> {\n const provider = useDataProvider();\n return useQuery<OffsetPage<T>, Error>({\n queryKey: listQueryKey(resource, params),\n queryFn: () => provider.getList<T>(resource, params),\n ...options,\n });\n}\n\n/**\n * Query a single record by id through the active {@link useDataProvider}.\n *\n * The query is disabled while `id` is `null`/`undefined`.\n *\n * @param resource - The resource name.\n * @param id - The record id.\n * @param options - Extra TanStack Query options.\n * @returns The TanStack Query result for the record.\n */\nexport function useOne<T>(\n resource: string,\n id: string | number | null | undefined,\n options?: UseOneOptions<T>,\n): UseQueryResult<T, Error> {\n const provider = useDataProvider();\n const { enabled, ...rest } = options ?? {};\n return useQuery<T, Error>({\n queryKey: oneQueryKey(resource, id),\n queryFn: () => provider.getOne<T>(resource, id as string | number),\n enabled: id != null && (enabled ?? true),\n ...rest,\n });\n}\n\n/** Options for the create mutation (mutationFn + onSuccess are provided). */\nexport type UseCreateOptions<T> = Omit<UseMutationOptions<T, Error, unknown>, \"mutationFn\">;\n\n/**\n * Create a record and invalidate the resource list cache on success.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate(data)` creates the record.\n */\nexport function useCreate<T>(\n resource: string,\n options?: UseCreateOptions<T>,\n): UseMutationResult<T, Error, unknown> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, unknown>({\n mutationFn: (data: unknown) => provider.create<T>(resource, data),\n onSuccess: (...args) => {\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n\n/** Variables accepted by the update mutation. */\nexport interface UpdateVariables {\n /** The record id to update. */\n id: string | number;\n /** The update payload. */\n data: unknown;\n}\n\n/** Options for the update mutation (mutationFn + onSuccess are provided). */\nexport type UseUpdateOptions<T> = Omit<UseMutationOptions<T, Error, UpdateVariables>, \"mutationFn\">;\n\n/**\n * Update a record and invalidate both the list and the single-record caches.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate({ id, data })` updates the record.\n */\nexport function useUpdate<T>(\n resource: string,\n options?: UseUpdateOptions<T>,\n): UseMutationResult<T, Error, UpdateVariables> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, UpdateVariables>({\n mutationFn: ({ id, data }: UpdateVariables) => provider.update<T>(resource, id, data),\n onSuccess: (...args) => {\n const [, variables] = args;\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n void queryClient.invalidateQueries({ queryKey: oneQueryKey(resource, variables.id) });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n\n/** Options for the delete mutation (mutationFn + onSuccess are provided). */\nexport type UseDeleteOptions<T> = Omit<UseMutationOptions<T, Error, string | number>, \"mutationFn\">;\n\n/**\n * Delete a record by id and invalidate the resource list cache on success.\n *\n * @param resource - The resource name.\n * @param options - Extra TanStack Mutation options.\n * @returns The mutation; `mutate(id)` deletes the record.\n */\nexport function useDelete<T>(\n resource: string,\n options?: UseDeleteOptions<T>,\n): UseMutationResult<T, Error, string | number> {\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n return useMutation<T, Error, string | number>({\n mutationFn: (id: string | number) => provider.deleteOne<T>(resource, id),\n onSuccess: (...args) => {\n void queryClient.invalidateQueries({ queryKey: [\"data\", resource, \"list\"] });\n options?.onSuccess?.(...args);\n },\n ...options,\n });\n}\n","import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router-dom\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed. Pass a boolean or anything truthy/falsy —\n * typically `useAuthStore((s) => s.isAuthenticated)`.\n */\n when: boolean;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is truthy, otherwise redirects. Pairs naturally with\n * `createAuthStore` for protected areas.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({ when, redirectTo = \"/\", replace = true, children }: RouteGuardProps) {\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n","import { Suspense, useMemo } from \"react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { BrowserRouter, HashRouter, MemoryRouter, Routes, Route } from \"react-router-dom\";\nimport { lazyWithRetry } from \"../auth/lazy-with-retry\";\nimport { RouteGuard } from \"./RouteGuard\";\nimport type { RouterKind, TempestRouteObject } from \"./types\";\n\n/**\n * Identity helper that types a declarative route tree. Use it so editors give\n * autocomplete and type-checking on every node; the array is returned as-is.\n *\n * @example\n * export const routes = defineRoutes([\n * { path: \"/\", element: <Layout />, children: [\n * { index: true, lazy: () => import(\"./pages/Home\") },\n * { path: \"settings\", lazy: () => import(\"./pages/Settings\"),\n * guard: () => useAuth.getState().isAuthenticated, redirectTo: \"/login\" },\n * ] },\n * ]);\n */\nexport function defineRoutes(routes: TempestRouteObject[]): TempestRouteObject[] {\n return routes;\n}\n\nconst lazyCache = new WeakMap<TempestRouteObject, ComponentType<unknown>>();\n\nfunction resolveLazy(route: TempestRouteObject): ComponentType<unknown> {\n let comp = lazyCache.get(route);\n if (!comp) {\n comp = lazyWithRetry(route.lazy!);\n lazyCache.set(route, comp);\n }\n return comp;\n}\n\nfunction GuardedElement({\n guard,\n redirectTo,\n children,\n}: {\n guard: boolean | (() => boolean);\n redirectTo?: string;\n children: ReactNode;\n}) {\n const allowed = typeof guard === \"function\" ? guard() : guard;\n return (\n <RouteGuard when={allowed} redirectTo={redirectTo}>\n {children}\n </RouteGuard>\n );\n}\n\nfunction toRouteElements(routes: TempestRouteObject[]): ReactNode {\n return routes.map((route, i) => {\n let element: ReactNode = route.element;\n if (route.lazy) {\n const LazyComponent = resolveLazy(route);\n element = <LazyComponent />;\n }\n if (route.guard !== undefined) {\n element = (\n <GuardedElement guard={route.guard} redirectTo={route.redirectTo}>\n {element}\n </GuardedElement>\n );\n }\n\n if (route.index) {\n return <Route key={`index-${i}`} index element={element} />;\n }\n\n return (\n <Route\n key={route.path ?? `route-${i}`}\n path={route.path}\n element={element}\n caseSensitive={route.caseSensitive}\n >\n {route.children ? toRouteElements(route.children) : null}\n </Route>\n );\n });\n}\n\nconst ROUTERS: Record<RouterKind, typeof BrowserRouter> = {\n browser: BrowserRouter,\n hash: HashRouter,\n memory: MemoryRouter,\n};\n\nexport interface AppRouterProps {\n /** Declarative route tree, ideally built with {@link defineRoutes}. */\n routes: TempestRouteObject[];\n /** History strategy (default: `\"browser\"`). */\n router?: RouterKind;\n /** App-wide base path forwarded to the underlying router. */\n basename?: string;\n /** Initial URLs for the `\"memory\"` router (tests / non-DOM hosts). */\n initialEntries?: string[];\n /** Suspense fallback shown while a `lazy` route chunk loads. */\n fallback?: ReactNode;\n}\n\n/**\n * Render a full React Router (v7, declarative mode) from a {@link defineRoutes}\n * tree: picks the history strategy, wraps everything in a `<Suspense>` boundary\n * for `lazy` routes, and applies per-route `guard` redirects. This is the\n * single entry point apps mount at their root.\n *\n * @example\n * <AppRouter routes={routes} fallback={<Spinner />} />\n */\nexport function AppRouter({\n routes,\n router = \"browser\",\n basename,\n initialEntries,\n fallback = null,\n}: AppRouterProps) {\n const tree = useMemo(() => toRouteElements(routes), [routes]);\n const Router = ROUTERS[router];\n const routerProps = router === \"memory\" ? { basename, initialEntries } : { basename };\n\n return (\n <Router {...routerProps}>\n <Suspense fallback={fallback}>\n <Routes>{tree}</Routes>\n </Suspense>\n </Router>\n );\n}\n","import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n","import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { ResolvedTheme, ThemeMode } from \"./types\";\n\nexport interface ThemeContextValue {\n /** Raw user preference (light / dark / system). */\n theme: ThemeMode;\n /** Effective theme actually applied to the DOM (light or dark). */\n resolvedTheme: ResolvedTheme;\n /** Update the preference. Persisted to localStorage when `storageKey` is set. */\n setTheme: (next: ThemeMode) => void;\n /** Convenience: flip light ↔ dark. When in `system` mode, switches to the opposite of the current resolved theme. */\n toggle: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n /** Initial preference when nothing is stored. Default: `\"system\"`. */\n defaultTheme?: ThemeMode;\n /** localStorage key used to persist the preference. Pass `null` to disable persistence. Default: `\"tempest-theme\"`. */\n storageKey?: string | null;\n /**\n * Element that receives the theme attribute(s). Defaults to\n * `document.documentElement`. Override when scoping the theme to a subtree.\n */\n target?: () => HTMLElement | null;\n /**\n * Attribute name(s) written on the target with the resolved theme\n * (`\"light\"` / `\"dark\"`). Default: `\"data-tempest-theme\"`.\n *\n * Pass an array to mirror the theme onto more than one attribute — handy\n * when the SDK components read `data-tempest-theme` but the host app's own\n * CSS keys off a different attribute (e.g. `[\"data-tempest-theme\",\n * \"data-theme\"]`). Avoids a separate sync effect in the consumer.\n */\n attribute?: string | string[];\n /**\n * When set, keeps `<meta name=\"theme-color\">` in sync with the resolved\n * theme — `content` becomes `themeColor.dark` in dark mode and\n * `themeColor.light` in light mode. The meta tag must already exist in the\n * document `<head>`. No-op when omitted.\n */\n themeColor?: { light: string; dark: string };\n}\n\nfunction resolve(mode: ThemeMode): ResolvedTheme {\n if (mode === \"dark\" || mode === \"light\") return mode;\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/**\n * Write the resolved theme onto every configured attribute and, when a\n * `themeColor` map is provided, sync the `<meta name=\"theme-color\">` tag.\n */\nfunction applyResolved(\n element: HTMLElement,\n resolved: ResolvedTheme,\n attribute: string | string[],\n themeColor?: { light: string; dark: string },\n): void {\n const attrs = Array.isArray(attribute) ? attribute : [attribute];\n for (const attr of attrs) element.setAttribute(attr, resolved);\n if (themeColor && typeof document !== \"undefined\") {\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"theme-color\"]');\n if (meta) meta.content = themeColor[resolved];\n }\n}\n\nfunction readStored(storageKey: string | null): ThemeMode | null {\n if (!storageKey || typeof window === \"undefined\") return null;\n try {\n const value = window.localStorage.getItem(storageKey);\n if (value === \"light\" || value === \"dark\" || value === \"system\") return value;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Wire dark/light theming. Writes a data attribute on a target element (the\n * `<html>` element by default) and exposes the current preference via\n * {@link useTheme}.\n *\n * Pair with `themeInitScript()` in the HTML head to prevent the flash of\n * incorrect theme on first paint.\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"tempest-theme\",\n target,\n attribute = \"data-tempest-theme\",\n themeColor,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<ThemeMode>(\n () => readStored(storageKey) ?? defaultTheme,\n );\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => resolve(theme));\n\n const targetRef = useRef<typeof target>(target);\n targetRef.current = target;\n\n const attributeKey = Array.isArray(attribute) ? attribute.join(\",\") : attribute;\n const themeColorRef = useRef(themeColor);\n themeColorRef.current = themeColor;\n\n useEffect(() => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next = resolve(theme);\n applyResolved(element, next, attribute, themeColorRef.current);\n setResolvedTheme(next);\n // attributeKey is the stable string form of `attribute`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, attributeKey]);\n\n useEffect(() => {\n if (theme !== \"system\" || typeof window === \"undefined\") return;\n const list = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handler = (): void => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next: ResolvedTheme = list.matches ? \"dark\" : \"light\";\n applyResolved(element, next, attribute, themeColorRef.current);\n setResolvedTheme(next);\n };\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, attributeKey]);\n\n const setTheme = useCallback(\n (next: ThemeMode) => {\n setThemeState(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, next);\n } catch {\n /* ignore quota errors */\n }\n }\n },\n [storageKey],\n );\n\n const toggle = useCallback(() => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, resolvedTheme, setTheme, toggle }),\n [theme, resolvedTheme, setTheme, toggle],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Read and mutate the current theme. Must be used inside a {@link ThemeProvider}.\n */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useTheme must be used inside a <ThemeProvider>\");\n return ctx;\n}\n","export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to the key itself.\n */\n t: (key: string, params?: InterpolationValues) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n */\n plural: (key: string, count: number, params?: InterpolationValues) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues): string {\n const template = lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, params);\n }\n\n function plural(key: string, count: number, params?: InterpolationValues): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createI18n, type Catalog, type I18n } from \"./create-i18n\";\n\nexport interface I18nContextValue extends I18n {\n /** Switch the active locale. Persisted when `storageKey` is set. */\n setLocale: (locale: string) => void;\n /** Locales available in the catalog. */\n availableLocales: string[];\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\nexport interface I18nProviderProps {\n children: ReactNode;\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing. */\n fallbackLocale?: string;\n /** Translation catalog. */\n messages: Catalog;\n /** localStorage key for persisting the user choice. Pass `null` to disable. Default: `\"tempest-locale\"`. */\n storageKey?: string | null;\n}\n\nfunction readStored(storageKey: string | null, available: string[]): string | null {\n if (!storageKey || typeof window === \"undefined\") return null;\n try {\n const value = window.localStorage.getItem(storageKey);\n if (value && available.includes(value)) return value;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * React provider for the SDK's lightweight i18n. Exposes the translation\n * helpers and a `setLocale` setter to children.\n */\nexport function I18nProvider({\n children,\n locale: initialLocale,\n fallbackLocale,\n messages,\n storageKey = \"tempest-locale\",\n}: I18nProviderProps) {\n const availableLocales = useMemo(() => Object.keys(messages), [messages]);\n const [locale, setLocaleState] = useState<string>(\n () => readStored(storageKey, availableLocales) ?? initialLocale,\n );\n\n useEffect(() => {\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"lang\", locale);\n }\n }, [locale]);\n\n const setLocale = useCallback(\n (next: string) => {\n setLocaleState(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, next);\n } catch {\n /* ignore quota errors */\n }\n }\n },\n [storageKey],\n );\n\n const value = useMemo<I18nContextValue>(() => {\n const i18n = createI18n({ locale, fallbackLocale, messages });\n return { ...i18n, setLocale, availableLocales };\n }, [locale, fallbackLocale, messages, setLocale, availableLocales]);\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\n/**\n * Access translation helpers. Must be used inside an {@link I18nProvider}.\n */\nexport function useI18n(): I18nContextValue {\n const ctx = useContext(I18nContext);\n if (!ctx) throw new Error(\"useI18n must be used inside an <I18nProvider>\");\n return ctx;\n}\n\n/**\n * Shortcut for components that only need the `t` function — avoids destructuring.\n */\nexport function useTranslate(): I18nContextValue[\"t\"] {\n return useI18n().t;\n}\n","import { Component } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\n\nexport interface ErrorBoundaryRenderProps {\n error: Error;\n reset: () => void;\n}\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n /**\n * Element shown when a descendant throws. Receives the captured error and\n * a `reset` callback that clears the boundary state.\n */\n fallback: ReactNode | ((props: ErrorBoundaryRenderProps) => ReactNode);\n /** Forwarded to your error tracker (Sentry, Datadog, console, etc.). */\n onError?: (error: Error, info: ErrorInfo) => void;\n /**\n * When any value in this array changes, the boundary automatically resets.\n * Useful for clearing the error after a navigation.\n */\n resetKeys?: readonly unknown[];\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nfunction keysChanged(a: readonly unknown[] = [], b: readonly unknown[] = []): boolean {\n if (a.length !== b.length) return true;\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return true;\n }\n return false;\n}\n\n/**\n * Class-based React error boundary with a render-prop or static fallback.\n * Auto-resets when any value in `resetKeys` changes.\n *\n * @example\n * <ErrorBoundary\n * resetKeys={[location.pathname]}\n * onError={(err) => reportError(err)}\n * fallback={({ error, reset }) => (\n * <ErrorState description={error.message} onRetry={reset} />\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n override componentDidUpdate(previousProps: ErrorBoundaryProps): void {\n if (this.state.error && keysChanged(previousProps.resetKeys, this.props.resetKeys)) {\n this.reset();\n }\n }\n\n reset = (): void => {\n this.setState({ error: null });\n };\n\n override render(): ReactNode {\n const { error } = this.state;\n if (!error) return this.props.children;\n\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback({ error, reset: this.reset });\n }\n return fallback;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { QueryProvider } from \"../query/QueryProvider\";\nimport type { QueryProviderProps } from \"../query/QueryProvider\";\nimport { ThemeProvider } from \"../theme/ThemeProvider\";\nimport type { ThemeProviderProps } from \"../theme/ThemeProvider\";\nimport { I18nProvider } from \"../i18n/I18nProvider\";\nimport type { I18nProviderProps } from \"../i18n/I18nProvider\";\nimport { ErrorBoundary } from \"../error-boundary/ErrorBoundary\";\nimport type { ErrorBoundaryProps } from \"../error-boundary/ErrorBoundary\";\n\nexport interface AppProvidersProps {\n children: ReactNode;\n /**\n * TanStack Query config. Enabled by default with SDK defaults; pass `false`\n * to opt out (e.g. the app already mounts its own `QueryProvider`).\n */\n query?: Omit<QueryProviderProps, \"children\"> | false;\n /**\n * Theme config. Enabled by default; pass `false` to opt out.\n */\n theme?: Omit<ThemeProviderProps, \"children\"> | false;\n /**\n * i18n config. Opt-in: provide `locale` + `messages` to mount the provider.\n */\n i18n?: Omit<I18nProviderProps, \"children\">;\n /**\n * Top-level error boundary. Opt-in: provide a `fallback` to wrap the tree.\n */\n errorBoundary?: Omit<ErrorBoundaryProps, \"children\">;\n}\n\n/**\n * Compose the Tempest app-wide providers in one place: error boundary →\n * TanStack Query → theme → i18n. Query and theme are on by default; i18n and\n * the error boundary mount only when configured. Each provider can be disabled\n * or tuned independently, so an app's `main.tsx` stays a single declarative\n * block instead of a hand-nested provider pyramid.\n *\n * @example\n * <AppProviders\n * errorBoundary={{ fallback: <Crash /> }}\n * i18n={{ locale: \"pt-BR\", messages }}\n * >\n * <AppRouter routes={routes} />\n * </AppProviders>\n */\nexport function AppProviders({ children, query, theme, i18n, errorBoundary }: AppProvidersProps) {\n let tree: ReactNode = children;\n\n if (i18n) {\n tree = <I18nProvider {...i18n}>{tree}</I18nProvider>;\n }\n\n if (theme !== false) {\n tree = <ThemeProvider {...(theme || {})}>{tree}</ThemeProvider>;\n }\n\n if (query !== false) {\n tree = <QueryProvider {...(query || {})}>{tree}</QueryProvider>;\n }\n\n if (errorBoundary) {\n tree = <ErrorBoundary {...errorBoundary}>{tree}</ErrorBoundary>;\n }\n\n return <>{tree}</>;\n}\n","export type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n onMessage?.({\n event: eventName,\n data: parser(event.data),\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useRef(onMessage);\n onMessageRef.current = onMessage;\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n","/**\n * Convert a base64url-encoded VAPID public key into the `Uint8Array` format\n * required by `PushManager.subscribe({ applicationServerKey })`.\n *\n * @param base64String - VAPID public key (URL-safe base64).\n * @returns The decoded key as bytes.\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const rawData = window.atob(base64);\n const buffer = new ArrayBuffer(rawData.length);\n const output = new Uint8Array(buffer);\n for (let i = 0; i < rawData.length; i++) {\n output[i] = rawData.charCodeAt(i);\n }\n return output;\n}\n\n/**\n * Convenience check for environments where the Push API is unavailable\n * (Safari iOS without PWA install, older browsers, SSR, etc.).\n */\nexport function isPushSupported(): boolean {\n return (\n typeof window !== \"undefined\" &&\n \"serviceWorker\" in navigator &&\n \"PushManager\" in window &&\n \"Notification\" in window\n );\n}\n","import { isPushSupported, urlBase64ToUint8Array } from \"./utils\";\n\nexport interface WebPushClientConfig {\n /** VAPID public key (URL-safe base64). */\n vapidPublicKey: string;\n /**\n * Persist the subscription on the backend. The SDK does not own this call —\n * the host app decides the endpoint and how the payload is serialized.\n */\n onSubscribe: (subscription: PushSubscriptionJSON) => Promise<void> | void;\n /** Remove the subscription from the backend. Called before `subscription.unsubscribe()`. */\n onUnsubscribe?: (subscription: PushSubscriptionJSON) => Promise<void> | void;\n /**\n * Override how the service worker registration is obtained.\n * Defaults to `navigator.serviceWorker.ready` — provide this only when you\n * register the SW yourself and want to reuse the registration.\n */\n getRegistration?: () => Promise<ServiceWorkerRegistration>;\n}\n\nexport class WebPushUnsupportedError extends Error {\n constructor() {\n super(\"Web Push não suportado neste navegador.\");\n this.name = \"WebPushUnsupportedError\";\n }\n}\n\nexport class WebPushPermissionDeniedError extends Error {\n constructor() {\n super(\"Permissão de notificação negada pelo usuário.\");\n this.name = \"WebPushPermissionDeniedError\";\n }\n}\n\n/**\n * Browser-side Web Push helper. Wraps `Notification.requestPermission`,\n * `pushManager.subscribe`, and the corresponding teardown. Transport is up to\n * the caller via `onSubscribe` / `onUnsubscribe` callbacks.\n */\nexport class WebPushClient {\n private readonly config: WebPushClientConfig;\n\n constructor(config: WebPushClientConfig) {\n this.config = config;\n }\n\n /** Whether the runtime supports the Push API. */\n static isSupported(): boolean {\n return isPushSupported();\n }\n\n private async registration(): Promise<ServiceWorkerRegistration> {\n if (!isPushSupported()) throw new WebPushUnsupportedError();\n return this.config.getRegistration\n ? await this.config.getRegistration()\n : await navigator.serviceWorker.ready;\n }\n\n /** Current `Notification.permission` value, or `\"unsupported\"`. */\n permission(): NotificationPermission | \"unsupported\" {\n if (typeof Notification === \"undefined\") return \"unsupported\";\n return Notification.permission;\n }\n\n /**\n * Ask the user for notification permission.\n *\n * @throws {WebPushUnsupportedError} If the runtime lacks the Notification API.\n * @returns The resulting `NotificationPermission` value.\n */\n async requestPermission(): Promise<NotificationPermission> {\n if (typeof Notification === \"undefined\") throw new WebPushUnsupportedError();\n return Notification.requestPermission();\n }\n\n /** Return the active push subscription, if any. */\n async getSubscription(): Promise<PushSubscription | null> {\n const registration = await this.registration();\n return registration.pushManager.getSubscription();\n }\n\n /** True when a subscription already exists for this browser. */\n async isSubscribed(): Promise<boolean> {\n if (!isPushSupported()) return false;\n const existing = await this.getSubscription();\n return existing !== null;\n }\n\n /**\n * Subscribe the current device. Requests permission, creates a push\n * subscription if none exists, and forwards the JSON payload to\n * `onSubscribe` for backend persistence.\n *\n * @returns The active `PushSubscription`.\n * @throws {WebPushUnsupportedError} If Web Push is unavailable.\n * @throws {WebPushPermissionDeniedError} If the user denies the prompt.\n */\n async subscribe(): Promise<PushSubscription> {\n const permission = await this.requestPermission();\n if (permission !== \"granted\") throw new WebPushPermissionDeniedError();\n\n const registration = await this.registration();\n const existing = await registration.pushManager.getSubscription();\n if (existing) {\n await this.config.onSubscribe(existing.toJSON());\n return existing;\n }\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(this.config.vapidPublicKey),\n });\n await this.config.onSubscribe(subscription.toJSON());\n return subscription;\n }\n\n /**\n * Cancel the current subscription. Calls `onUnsubscribe` first (so the\n * backend can purge the record) and then `subscription.unsubscribe()`.\n *\n * @returns True when an active subscription was removed, false otherwise.\n */\n async unsubscribe(): Promise<boolean> {\n const subscription = await this.getSubscription();\n if (!subscription) return false;\n if (this.config.onUnsubscribe) {\n await this.config.onUnsubscribe(subscription.toJSON());\n }\n return subscription.unsubscribe();\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { WebPushClient, type WebPushClientConfig } from \"./web-push-client\";\nimport { isPushSupported } from \"./utils\";\n\nexport interface UsePushSubscriptionResult {\n /** True when the browser exposes the Push + Notification APIs. */\n supported: boolean;\n /** Current `Notification.permission` value, or `\"unsupported\"`. */\n permission: NotificationPermission | \"unsupported\";\n /** True when a subscription is active on this device. */\n subscribed: boolean;\n /** True while a subscribe/unsubscribe call is in-flight. */\n loading: boolean;\n /** Last error thrown by subscribe/unsubscribe, if any. */\n error: Error | null;\n subscribe: () => Promise<void>;\n unsubscribe: () => Promise<void>;\n /** Re-read the current subscription/permission state from the browser. */\n refresh: () => Promise<void>;\n}\n\n/**\n * React hook around {@link WebPushClient}. Tracks subscription, permission and\n * loading state; exposes imperative `subscribe`/`unsubscribe` actions.\n *\n * The hook does NOT register the service worker — the host app must do that\n * (e.g. via `vite-plugin-pwa` or a manual `navigator.serviceWorker.register`).\n *\n * @example\n * const push = usePushSubscription({\n * vapidPublicKey: import.meta.env.VITE_VAPID_PUBLIC_KEY,\n * onSubscribe: (sub) => api.post(\"/webpush/subscribe\", { body: sub }),\n * onUnsubscribe: () => api.delete(\"/webpush/my\"),\n * });\n */\nexport function usePushSubscription(config: WebPushClientConfig): UsePushSubscriptionResult {\n const configRef = useRef(config);\n configRef.current = config;\n\n const client = useMemo(\n () =>\n new WebPushClient({\n vapidPublicKey: config.vapidPublicKey,\n onSubscribe: (sub) => configRef.current.onSubscribe(sub),\n onUnsubscribe: (sub) => configRef.current.onUnsubscribe?.(sub),\n getRegistration: config.getRegistration,\n }),\n [config.vapidPublicKey, config.getRegistration],\n );\n\n const [supported] = useState<boolean>(() => isPushSupported());\n const [permission, setPermission] = useState<NotificationPermission | \"unsupported\">(() =>\n client.permission(),\n );\n const [subscribed, setSubscribed] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!supported) return;\n setPermission(client.permission());\n try {\n const active = await client.isSubscribed();\n setSubscribed(active);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, [client, supported]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const subscribe = useCallback(async () => {\n if (!supported) return;\n setLoading(true);\n setError(null);\n try {\n await client.subscribe();\n setSubscribed(true);\n setPermission(client.permission());\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n throw err;\n } finally {\n setLoading(false);\n }\n }, [client, supported]);\n\n const unsubscribe = useCallback(async () => {\n if (!supported) return;\n setLoading(true);\n setError(null);\n try {\n await client.unsubscribe();\n setSubscribed(false);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n throw err;\n } finally {\n setLoading(false);\n }\n }, [client, supported]);\n\n return {\n supported,\n permission,\n subscribed,\n loading,\n error,\n subscribe,\n unsubscribe,\n refresh,\n };\n}\n","export interface PlayAudioOptions {\n /** Volume between 0 and 1. Default: 1. */\n volume?: number;\n /** Loop the clip. Default: false. */\n loop?: boolean;\n /** Begin playback immediately. Default: true. */\n autoplay?: boolean;\n /** Stop the previous clip managed by this player. Default: false. */\n stopPrevious?: boolean;\n /** Fired when playback ends naturally. */\n onEnded?: () => void;\n /** Fired on playback error. */\n onError?: (error: unknown) => void;\n}\n\nexport interface AudioPlayer {\n /** Play `src`. Returns the underlying element, or `null` when the browser blocked autoplay. */\n play: (src: string, options?: PlayAudioOptions) => Promise<HTMLAudioElement | null>;\n /** Stop the currently-playing clip and rewind it. */\n stop: () => void;\n /** Currently playing audio element, or `null`. */\n current: () => HTMLAudioElement | null;\n}\n\n/**\n * Create an isolated audio player that tracks a single \"current\" clip.\n * Multiple players coexist independently; use this when several layers of UI\n * need their own playback state.\n */\nexport function createAudioPlayer(): AudioPlayer {\n let current: HTMLAudioElement | null = null;\n\n async function play(\n src: string,\n {\n volume = 1,\n loop = false,\n autoplay = true,\n stopPrevious = false,\n onEnded,\n onError,\n }: PlayAudioOptions = {},\n ): Promise<HTMLAudioElement | null> {\n try {\n if (stopPrevious && current) {\n current.pause();\n current.currentTime = 0;\n }\n const audio = new Audio(src);\n audio.volume = Math.max(0, Math.min(1, volume));\n audio.loop = loop;\n audio.preload = \"auto\";\n if (onEnded) audio.onended = onEnded;\n if (onError) audio.onerror = (event) => onError(event);\n current = audio;\n if (autoplay) await audio.play();\n return audio;\n } catch (error) {\n onError?.(error);\n return null;\n }\n }\n\n function stop(): void {\n if (!current) return;\n current.pause();\n current.currentTime = 0;\n }\n\n return { play, stop, current: () => current };\n}\n\nlet defaultPlayer: AudioPlayer | null = null;\n\nfunction getDefaultPlayer(): AudioPlayer {\n if (!defaultPlayer) defaultPlayer = createAudioPlayer();\n return defaultPlayer;\n}\n\n/**\n * Convenience wrapper around a shared {@link AudioPlayer}. Use this for\n * one-off notification sounds. For more complex flows (e.g. several\n * simultaneous channels), build a dedicated player with {@link createAudioPlayer}.\n */\nexport async function playAudio(\n src: string,\n options?: PlayAudioOptions,\n): Promise<HTMLAudioElement | null> {\n return getDefaultPlayer().play(src, options);\n}\n\n/** Stop the clip currently playing on the shared default player. */\nexport function stopAudio(): void {\n getDefaultPlayer().stop();\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createAudioPlayer, type AudioPlayer, type PlayAudioOptions } from \"./audio-player\";\n\nexport interface UseAudioResult {\n /** Play `src` on the hook's private player. */\n play: (src: string, options?: PlayAudioOptions) => Promise<void>;\n /** Stop the current clip. */\n stop: () => void;\n /**\n * Whether the browser's autoplay policy has been satisfied. Becomes\n * `true` after the first successful `play()`.\n */\n unlocked: boolean;\n}\n\n/**\n * Hook-managed audio player. Each component instance gets its own\n * {@link AudioPlayer}, so unmounting cleanly stops playback. Useful for\n * notification chimes, UI feedback sounds, and per-component soundtracks.\n */\nexport function useAudio(): UseAudioResult {\n const playerRef = useRef<AudioPlayer | null>(null);\n const [unlocked, setUnlocked] = useState<boolean>(false);\n\n if (!playerRef.current) {\n playerRef.current = createAudioPlayer();\n }\n\n useEffect(() => {\n return () => {\n playerRef.current?.stop();\n };\n }, []);\n\n const play = useCallback(async (src: string, options?: PlayAudioOptions): Promise<void> => {\n const result = await playerRef.current!.play(src, options);\n if (result) setUnlocked(true);\n }, []);\n\n const stop = useCallback((): void => {\n playerRef.current?.stop();\n }, []);\n\n return { play, stop, unlocked };\n}\n","import Dexie, { type Table, type UpdateSpec } from \"dexie\";\n\nexport interface OfflineStoreConfig<TItem> {\n /** IndexedDB database name. */\n databaseName: string;\n /** Schema version. Bump when changing indexes; pair with a migration if needed. */\n version: number;\n /** Object-store name. */\n tableName: string;\n /**\n * Dexie index definition for the table. Use `&` for the primary key\n * (unique), e.g. `\"&id, owner_id, created_at\"`. See Dexie docs for the\n * full syntax.\n */\n indexes: string;\n /** Property used as the primary key (default: `\"id\"`). */\n keyPath?: keyof TItem & string;\n /**\n * Optional owner scoping. When set, every read/write method honors the\n * `owner` argument and persists it on each record (e.g. multi-tenant\n * notifications keyed by `user_id`).\n */\n ownerField?: keyof TItem & string;\n}\n\nexport interface ListOptions<TItem> {\n /** Property to order by. Default: `keyPath`. */\n orderBy?: keyof TItem & string;\n /** Reverse the ordering. Default: false. */\n reverse?: boolean;\n /** Maximum number of items to return. */\n limit?: number;\n /** Skip this many items from the start of the result set. */\n offset?: number;\n /** Custom predicate applied after the index query. */\n filter?: (item: TItem) => boolean;\n}\n\nexport interface OfflineStore<TItem, TKey extends string | number> {\n /** Insert or replace a record. */\n put: (item: TItem, owner?: string) => Promise<TKey>;\n /** Insert or replace multiple records in a single transaction. */\n bulkPut: (items: TItem[], owner?: string) => Promise<TKey>;\n /** Fetch one record by its primary key. */\n get: (key: TKey) => Promise<TItem | undefined>;\n /** List records, optionally scoped to `owner` when `ownerField` is configured. */\n list: (owner?: string, options?: ListOptions<TItem>) => Promise<TItem[]>;\n /** Partial update by primary key. Returns the number of records changed. */\n update: (key: TKey, changes: Partial<TItem>) => Promise<number>;\n /** Apply a modification to every record matching `owner`. */\n updateMany: (owner: string | undefined, changes: Partial<TItem>) => Promise<number>;\n /** Delete one record by primary key. */\n delete: (key: TKey) => Promise<void>;\n /** Delete every record matching `owner` (or the entire table when no scope is set). */\n clear: (owner?: string) => Promise<void>;\n /** Count records, optionally scoped to `owner`. */\n count: (owner?: string) => Promise<number>;\n /** Raw Dexie table for advanced queries. */\n raw: Table<TItem, TKey>;\n /** Underlying Dexie instance. */\n db: Dexie;\n}\n\nclass GenericDb<TItem, TKey extends string | number> extends Dexie {\n store!: Table<TItem, TKey>;\n\n constructor(name: string, version: number, tableName: string, indexes: string) {\n super(name);\n this.version(version).stores({ [tableName]: indexes });\n this.store = this.table<TItem, TKey>(tableName);\n }\n}\n\n/**\n * Build a typed IndexedDB-backed store using Dexie. Optionally scope every\n * operation by an `ownerField` (useful for multi-user SSE history, drafts,\n * cache per workspace, etc.).\n *\n * Dexie is an **optional peer dependency** — install it (`npm i dexie`) only\n * when your app needs offline storage.\n *\n * @example\n * type Note = { id: string; owner_id: string; text: string; created_at: string };\n * const notes = createOfflineStore<Note, string>({\n * databaseName: \"TempestNotes\",\n * version: 1,\n * tableName: \"notes\",\n * indexes: \"&id, owner_id, created_at\",\n * ownerField: \"owner_id\",\n * });\n * await notes.put({ id: \"n1\", owner_id: \"u1\", text: \"hi\", created_at: ... }, \"u1\");\n * const mine = await notes.list(\"u1\", { orderBy: \"created_at\", reverse: true });\n */\nexport function createOfflineStore<TItem, TKey extends string | number = string>(\n config: OfflineStoreConfig<TItem>,\n): OfflineStore<TItem, TKey> {\n const { databaseName, version, tableName, indexes, keyPath = \"id\", ownerField } = config;\n\n const db = new GenericDb<TItem, TKey>(databaseName, version, tableName, indexes);\n const table = db.store;\n\n function withOwner(item: TItem, owner?: string): TItem {\n if (!ownerField || !owner) return item;\n return { ...item, [ownerField]: owner } as TItem;\n }\n\n async function list(owner?: string, options: ListOptions<TItem> = {}): Promise<TItem[]> {\n const { orderBy = keyPath, reverse = false, limit, offset, filter } = options;\n\n let collection =\n ownerField && owner ? table.where(ownerField).equals(owner) : table.toCollection();\n\n if (filter) collection = collection.filter(filter);\n\n let items =\n orderBy === keyPath ? await collection.toArray() : await collection.sortBy(orderBy);\n\n if (reverse) items = items.reverse();\n if (offset) items = items.slice(offset);\n if (typeof limit === \"number\") items = items.slice(0, limit);\n return items;\n }\n\n return {\n put: (item, owner) => table.put(withOwner(item, owner)) as Promise<TKey>,\n bulkPut: (items, owner) =>\n table.bulkPut(items.map((item) => withOwner(item, owner))) as Promise<TKey>,\n get: (key) => table.get(key),\n list,\n update: (key, changes) => table.update(key, changes as UpdateSpec<TItem>),\n updateMany: async (owner, changes) => {\n const spec = changes as UpdateSpec<TItem>;\n if (ownerField && owner) {\n return table.where(ownerField).equals(owner).modify(spec);\n }\n return table.toCollection().modify(spec);\n },\n delete: (key) => table.delete(key),\n clear: async (owner) => {\n if (ownerField && owner) {\n await table.where(ownerField).equals(owner).delete();\n return;\n }\n await table.clear();\n },\n count: (owner) => {\n if (ownerField && owner) {\n return table.where(ownerField).equals(owner).count();\n }\n return table.count();\n },\n raw: table,\n db,\n };\n}\n","import { randomId } from \"../utils/ids\";\nimport { createOfflineStore } from \"./create-offline-store\";\n\n/**\n * Mutation kinds queued in the outbox.\n *\n * `create`/`update` carry a snapshot of the record; `delete` needs only the\n * record id. The distinction between `create` and `update` is advisory — the\n * engine treats both as \"deliver this record\" and leaves the create-vs-update\n * decision to the app's `deliver` callback (a `PUT` upsert usually ignores it).\n */\nexport type OutboxOp = \"create\" | \"update\" | \"delete\";\n\n/**\n * A single queued mutation.\n *\n * @typeParam TPayload - The record snapshot shape carried by\n * `create`/`update` entries (omitted for `delete`).\n */\nexport interface OutboxEntry<TPayload = unknown> {\n /** Stable per-entry id (generated with {@link randomId}). */\n id: string;\n /** The mutation kind. */\n op: OutboxOp;\n /** Primary key of the record the mutation targets. */\n recordId: string;\n /** Epoch milliseconds when the mutation was queued. */\n enqueuedAt: number;\n /** How many delivery attempts have been made so far. */\n attempts: number;\n /** Last delivery error message, kept for UI/debug. */\n lastError?: string;\n /** Record snapshot for `create`/`update`. Omitted for `delete`. */\n payload?: TPayload;\n}\n\n/**\n * Why a sync run was triggered. The listed values are the common ones; any\n * string is accepted so apps can add their own telemetry labels.\n */\nexport type SyncTrigger =\n | \"boot\"\n | \"online-event\"\n | \"after-mutation\"\n | \"manual\"\n | \"interval\"\n | (string & {});\n\n/**\n * One page of the server delta pull.\n *\n * @typeParam TRemote - The server-side item shape.\n */\nexport interface PullPage<TRemote> {\n /** Items changed since the watermark, in this page. */\n items: TRemote[];\n /** Cursor for the next page, or `null` when this is the last page. */\n nextCursor: string | null;\n /**\n * Server clock to persist as the next watermark once the whole delta is\n * applied. `null` leaves the watermark unchanged.\n */\n serverTime: string | null;\n}\n\n/** Outcome of a single {@link OfflineSync.flush} run. */\nexport interface SyncRunSummary {\n /** The trigger passed to `flush`. */\n trigger: SyncTrigger;\n /** Entries delivered to the server this run. */\n succeeded: number;\n /** Entries that failed and stay queued for the next run. */\n failed: number;\n /** Total wall-clock milliseconds the run took. */\n durationMs: number;\n /** `true` when the run was skipped because the device was offline. */\n skipped: boolean;\n}\n\n/**\n * Pluggable persistence for the pull watermark (the \"changed since\" cursor).\n * Pass an object with a `storageKey` to use a `localStorage`-backed default.\n */\nexport interface WatermarkStore {\n /** Read the current watermark, or `null` when none is stored. */\n get: () => string | null;\n /** Persist a new watermark. */\n set: (value: string) => void;\n /** Drop the watermark (e.g. on logout / account switch). */\n clear: () => void;\n}\n\n/**\n * Configuration for {@link createOfflineSync}.\n *\n * The engine owns the outbox, the single-flight flush, the offline guard, the\n * paginated pull loop and the watermark; the three transport callbacks\n * (`deliver`, `pullPage`, `applyRemote`) are where the app plugs in its own\n * endpoints, record shape and conflict resolution.\n *\n * @typeParam TPayload - Record snapshot carried by outbox entries.\n * @typeParam TRemote - Server item shape returned by `pullPage`.\n */\nexport interface OfflineSyncConfig<TPayload, TRemote> {\n /** IndexedDB database name for the outbox (kept separate per queue). */\n databaseName: string;\n /** Outbox object-store name. Default `\"outbox\"`. */\n tableName?: string;\n /** Outbox schema version. Default `1`. */\n version?: number;\n /** Prefix for generated entry ids. Default `\"outbox\"`. */\n idPrefix?: string;\n /**\n * Deliver one queued mutation to the server. Throwing keeps the entry\n * queued (its `attempts`/`lastError` are bumped) for the next run.\n */\n deliver: (entry: OutboxEntry<TPayload>) => Promise<void>;\n /** Fetch one page of the server delta since `since`, from `cursor`. */\n pullPage: (since: string | null, cursor: string | null) => Promise<PullPage<TRemote>>;\n /**\n * Merge one pulled item into the local store. The app owns conflict\n * resolution here (e.g. last-write-wins, keeping newer local pending\n * edits, resolving tombstones and downloading blobs).\n */\n applyRemote: (item: TRemote) => Promise<void>;\n /** Watermark persistence, or `{ storageKey }` for a `localStorage` default. */\n watermark: WatermarkStore | { storageKey: string };\n /** Called after an entry is delivered and acked. */\n onEntryDelivered?: (entry: OutboxEntry<TPayload>) => void | Promise<void>;\n /** Called after an entry fails delivery (it stays queued). */\n onEntryFailed?: (entry: OutboxEntry<TPayload>, error: unknown) => void | Promise<void>;\n /**\n * Connectivity check. Default reads `navigator.onLine` (always online in\n * non-browser environments). When it returns `false`, `flush` is skipped.\n */\n isOnline?: () => boolean;\n}\n\n/**\n * Offline-first sync engine: a durable outbox plus a paginated delta pull.\n *\n * @typeParam TPayload - Record snapshot carried by outbox entries.\n */\nexport interface OfflineSync<TPayload> {\n /**\n * Queue a mutation. Returns the generated entry id.\n *\n * @param op - The mutation kind.\n * @param recordId - Primary key of the affected record.\n * @param payload - Record snapshot (for `create`/`update`).\n */\n enqueue: (op: OutboxOp, recordId: string, payload?: TPayload) => Promise<string>;\n /**\n * Run a full sync (drain the outbox, then pull the delta). Concurrent\n * calls share one in-flight promise, so triggers never overlap.\n *\n * @param trigger - Label for why the run happened. Default `\"manual\"`.\n */\n flush: (trigger?: SyncTrigger) => Promise<SyncRunSummary>;\n /** Number of mutations still queued. */\n pendingCount: () => Promise<number>;\n /** The queued mutations in FIFO order. */\n listPending: () => Promise<OutboxEntry<TPayload>[]>;\n /** Drop every queued mutation (e.g. on logout). */\n clearOutbox: () => Promise<void>;\n /** Reset the pull watermark (e.g. on logout / account switch). */\n resetWatermark: () => void;\n}\n\n/**\n * Build a `localStorage`-backed {@link WatermarkStore}. Reads/writes are no-ops\n * when `localStorage` is unavailable (SSR / non-browser).\n *\n * @param key - The `localStorage` key.\n * @returns A watermark store persisting to `localStorage`.\n */\nfunction localStorageWatermark(key: string): WatermarkStore {\n const available = typeof localStorage !== \"undefined\";\n return {\n get: () => (available ? localStorage.getItem(key) : null),\n set: (value: string) => {\n if (available) localStorage.setItem(key, value);\n },\n clear: () => {\n if (available) localStorage.removeItem(key);\n },\n };\n}\n\n/**\n * Create an offline-first sync engine over an IndexedDB outbox.\n *\n * The engine drains queued mutations to the server (`deliver`) and pulls the\n * server delta back (`pullPage` + `applyRemote`), advancing a watermark so each\n * run only fetches what changed. `flush` is single-flight and skips cleanly\n * while offline; failed deliveries stay queued with their attempt count bumped.\n *\n * Dexie is an **optional peer dependency** (via {@link createOfflineStore}) —\n * install it (`npm i dexie`) when you use this engine.\n *\n * @typeParam TPayload - Record snapshot carried by outbox entries.\n * @typeParam TRemote - Server item shape returned by `pullPage`.\n * @param config - Transport callbacks + outbox/watermark configuration.\n * @returns The sync handle (`enqueue`, `flush`, `pendingCount`, …).\n *\n * @example\n * const sync = createOfflineSync<Note, NoteDto>({\n * databaseName: \"NotesOutbox\",\n * watermark: { storageKey: \"notes.watermark\" },\n * deliver: async (entry) => {\n * if (entry.op === \"delete\") return api.remove(entry.recordId);\n * await api.upsert(entry.recordId, entry.payload!);\n * },\n * pullPage: async (since, cursor) => {\n * const page = await api.changes(since, cursor);\n * return { items: page.items, nextCursor: page.next, serverTime: page.now };\n * },\n * applyRemote: async (dto) => {\n * if (dto.deleted) return localStore.remove(dto.id);\n * await localStore.save(fromDto(dto));\n * },\n * });\n * await sync.enqueue(\"create\", note.id, note);\n * await sync.flush(\"after-mutation\");\n */\nexport function createOfflineSync<TPayload = unknown, TRemote = unknown>(\n config: OfflineSyncConfig<TPayload, TRemote>,\n): OfflineSync<TPayload> {\n const outbox = createOfflineStore<OutboxEntry<TPayload>, string>({\n databaseName: config.databaseName,\n version: config.version ?? 1,\n tableName: config.tableName ?? \"outbox\",\n indexes: \"&id, recordId, enqueuedAt\",\n keyPath: \"id\",\n });\n\n const watermark: WatermarkStore =\n \"get\" in config.watermark\n ? config.watermark\n : localStorageWatermark(config.watermark.storageKey);\n\n const idPrefix = config.idPrefix ?? \"outbox\";\n const isOnline =\n config.isOnline ?? (() => (typeof navigator !== \"undefined\" ? navigator.onLine : true));\n\n let inflight: Promise<SyncRunSummary> | null = null;\n\n async function push(summary: SyncRunSummary): Promise<void> {\n const entries = await outbox.list(undefined, { orderBy: \"enqueuedAt\" });\n for (const entry of entries) {\n try {\n await config.deliver(entry);\n await outbox.delete(entry.id);\n await config.onEntryDelivered?.(entry);\n summary.succeeded += 1;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : \"delivery failed\";\n await outbox.update(entry.id, {\n attempts: entry.attempts + 1,\n lastError: message,\n } as Partial<OutboxEntry<TPayload>>);\n await config.onEntryFailed?.(entry, cause);\n summary.failed += 1;\n }\n }\n }\n\n async function pull(): Promise<void> {\n const since = watermark.get();\n let cursor: string | null = null;\n let serverTime: string | null = since;\n do {\n const page = await config.pullPage(since, cursor);\n for (const item of page.items) {\n await config.applyRemote(item);\n }\n cursor = page.nextCursor;\n serverTime = page.serverTime;\n } while (cursor);\n if (serverTime) watermark.set(serverTime);\n }\n\n async function runOnce(trigger: SyncTrigger): Promise<SyncRunSummary> {\n const startedAt = Date.now();\n const summary: SyncRunSummary = {\n trigger,\n succeeded: 0,\n failed: 0,\n durationMs: 0,\n skipped: false,\n };\n if (!isOnline()) {\n summary.skipped = true;\n summary.durationMs = Date.now() - startedAt;\n return summary;\n }\n await push(summary);\n await pull();\n summary.durationMs = Date.now() - startedAt;\n return summary;\n }\n\n return {\n async enqueue(op, recordId, payload) {\n const entry: OutboxEntry<TPayload> = {\n id: randomId(idPrefix),\n op,\n recordId,\n enqueuedAt: Date.now(),\n attempts: 0,\n payload,\n };\n await outbox.put(entry);\n return entry.id;\n },\n flush(trigger: SyncTrigger = \"manual\") {\n if (!inflight) {\n inflight = runOnce(trigger).finally(() => {\n inflight = null;\n });\n }\n return inflight;\n },\n pendingCount() {\n return outbox.count();\n },\n listPending() {\n return outbox.list(undefined, { orderBy: \"enqueuedAt\" });\n },\n clearOutbox() {\n return outbox.clear();\n },\n resetWatermark() {\n watermark.clear();\n },\n };\n}\n","import { useCallback, useState } from \"react\";\n\n/**\n * Hook that propagates errors to the nearest {@link ErrorBoundary}.\n *\n * React error boundaries only catch errors thrown during render. Async errors\n * (failed mutations, websocket failures, etc.) need to be re-thrown in a\n * render pass — that is what `throwError` does.\n *\n * @example\n * const throwError = useErrorHandler();\n * useEffect(() => {\n * stream.on(\"error\", throwError);\n * }, []);\n */\nexport function useErrorHandler(): (error: unknown) => void {\n const [, setState] = useState<Error | null>(null);\n return useCallback((error: unknown) => {\n setState(() => {\n throw error instanceof Error ? error : new Error(String(error));\n });\n }, []);\n}\n","import { cloneElement, isValidElement } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n Controller,\n useFormContext,\n type Control,\n type ControllerRenderProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\n\nexport interface FormFieldChildProps {\n name: string;\n value: unknown;\n onChange: (...args: unknown[]) => void;\n onBlur: () => void;\n ref: ControllerRenderProps[\"ref\"];\n error?: string;\n \"aria-invalid\"?: boolean;\n \"aria-describedby\"?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n required?: boolean;\n id?: string;\n}\n\nexport interface FormFieldProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> {\n /** Field name (dot path supported, e.g. `\"address.city\"`). */\n name: TName;\n /** Field label rendered by the wrapped control. */\n label?: ReactNode;\n /** Helper text rendered by the wrapped control when there is no error. */\n helperText?: ReactNode;\n /** When `true`, marks the control as required (visual hint + native attribute). */\n required?: boolean;\n /**\n * Explicit `control` from `useForm()` / `useZodForm()`. Optional when a\n * `FormProvider` is in the tree.\n */\n control?: Control<TValues>;\n /**\n * The control to render. Receives `{ value, onChange, onBlur, ref, error, ... }`\n * via `cloneElement`. Pass `<Input />`, `<Select />`, masked inputs, etc.\n */\n children: ReactElement;\n}\n\n/**\n * Glue between `react-hook-form` `Controller` and the SDK's controlled\n * components. Wraps any control that accepts `{ value, onChange, label,\n * error }` and routes RHF state into it — eliminating the per-field\n * `<Controller render={...} />` boilerplate.\n *\n * @example\n * const form = useZodForm(schema);\n * <FormProvider {...form}>\n * <Form>\n * <FormField name=\"email\" label=\"Email\" required>\n * <Input type=\"email\" />\n * </FormField>\n * <FormField name=\"cep\" label=\"CEP\">\n * <CEPInput />\n * </FormField>\n * </Form>\n * </FormProvider>;\n */\nexport function FormField<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n>({ name, label, helperText, required, control, children }: FormFieldProps<TValues, TName>) {\n const context = useFormContext<TValues>();\n const resolvedControl = control ?? context?.control;\n if (!resolvedControl) {\n throw new Error(\n \"FormField requires either a `control` prop or a <FormProvider> in the tree.\",\n );\n }\n\n return (\n <Controller\n name={name}\n control={resolvedControl}\n render={({ field, fieldState }) => {\n if (!isValidElement(children)) return children;\n const errorMessage = fieldState.error?.message;\n return cloneElement(children as ReactElement<FormFieldChildProps>, {\n name: field.name,\n value: field.value,\n onChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n label,\n helperText: errorMessage ? undefined : helperText,\n error: errorMessage,\n required,\n \"aria-invalid\": !!errorMessage,\n });\n }}\n />\n );\n}\n","import type { z } from \"zod\";\n\nexport interface ValidateFormSuccess<T> {\n success: true;\n data: T;\n errors: Record<string, string>;\n}\n\nexport interface ValidateFormFailure {\n success: false;\n errors: Record<string, string>;\n}\n\nexport type ValidateFormResult<T> = ValidateFormSuccess<T> | ValidateFormFailure;\n\n/**\n * Validate `values` against a zod schema and return a per-field error map\n * compatible with most form libraries.\n *\n * Field paths follow zod's `issue.path.join(\".\")` convention — nested fields\n * become `\"address.city\"`, array entries `\"items.0.name\"`. The first issue\n * per path wins (subsequent ones are dropped to keep error UIs tidy).\n *\n * @param schema - zod schema describing the form shape.\n * @param values - Raw form values (typed as `unknown`).\n * @returns Either `{ success: true, data, errors: {} }` or `{ success: false, errors }`.\n */\nexport function validateForm<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n values: unknown,\n): ValidateFormResult<z.infer<TSchema>> {\n const result = schema.safeParse(values);\n if (result.success) {\n return { success: true, data: result.data, errors: {} };\n }\n const errors: Record<string, string> = {};\n for (const issue of result.error.issues) {\n const path = issue.path.length === 0 ? \"_root\" : issue.path.join(\".\");\n if (!(path in errors)) errors[path] = issue.message;\n }\n return { success: false, errors };\n}\n","import type { z } from \"zod\";\n\ninterface ResolverError {\n type: string;\n message: string;\n}\n\ninterface ResolverOutput<T> {\n values: T | object;\n errors: Record<string, ResolverError | object>;\n}\n\ntype Resolver<T> = (\n values: unknown,\n context: unknown,\n options: { criteriaMode?: \"firstError\" | \"all\" },\n) => Promise<ResolverOutput<T>>;\n\n/**\n * Minimal `react-hook-form` resolver built on top of zod. Mirrors the shape\n * produced by `@hookform/resolvers/zod` so it can be passed straight to\n * `useForm({ resolver })`.\n *\n * @example\n * const form = useForm<LoginForm>({ resolver: zodResolver(loginSchema) });\n */\nexport function zodResolver<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n): Resolver<z.infer<TSchema>> {\n return async (values, _context, options) => {\n const result = schema.safeParse(values);\n if (result.success) {\n return { values: result.data, errors: {} };\n }\n\n const errors: Record<string, ResolverError | object> = {};\n const criteriaMode = options.criteriaMode ?? \"firstError\";\n\n for (const issue of result.error.issues) {\n const path = issue.path.length === 0 ? \"_root\" : issue.path.join(\".\");\n if (criteriaMode === \"firstError\" && errors[path]) continue;\n errors[path] = { type: issue.code, message: issue.message };\n }\n\n return { values: {}, errors };\n };\n}\n","import { useForm } from \"react-hook-form\";\nimport type { FieldValues, UseFormProps, UseFormReturn } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { zodResolver } from \"./zod-resolver\";\n\n/**\n * Convenience wrapper around `react-hook-form`'s `useForm` that wires a zod\n * resolver and infers the form's value type from the schema.\n *\n * Both `react-hook-form` and `zod` are optional peer dependencies — install\n * them when your app uses forms.\n *\n * @example\n * const form = useZodForm(loginSchema, { defaultValues: { email: \"\" } });\n * form.register(\"email\");\n */\nexport function useZodForm<\n TSchema extends z.ZodTypeAny,\n TValues extends FieldValues = z.infer<TSchema> & FieldValues,\n>(schema: TSchema, options: Omit<UseFormProps<TValues>, \"resolver\"> = {}): UseFormReturn<TValues> {\n return useForm<TValues>({\n ...options,\n resolver: zodResolver(schema) as unknown as UseFormProps<TValues>[\"resolver\"],\n });\n}\n","function digitsOnly(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Validate a Brazilian CPF using the standard check-digit algorithm.\n * Accepts masked or raw input; rejects all-equal digits (\"111.111.111-11\").\n */\nexport function validateCPF(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 11) return false;\n if (/^(\\d)\\1+$/.test(digits)) return false;\n\n const numbers = digits.split(\"\").map(Number);\n\n let sum = 0;\n for (let i = 0; i < 9; i++) sum += numbers[i]! * (10 - i);\n let check = (sum * 10) % 11;\n if (check === 10) check = 0;\n if (check !== numbers[9]) return false;\n\n sum = 0;\n for (let i = 0; i < 10; i++) sum += numbers[i]! * (11 - i);\n check = (sum * 10) % 11;\n if (check === 10) check = 0;\n return check === numbers[10];\n}\n\n/**\n * Validate a Brazilian CNPJ using the standard check-digit algorithm.\n * Accepts masked or raw input; rejects all-equal digits.\n */\nexport function validateCNPJ(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 14) return false;\n if (/^(\\d)\\1+$/.test(digits)) return false;\n\n const numbers = digits.split(\"\").map(Number);\n\n const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n\n let sum = 0;\n for (let i = 0; i < 12; i++) sum += numbers[i]! * weights1[i]!;\n let check = sum % 11;\n check = check < 2 ? 0 : 11 - check;\n if (check !== numbers[12]) return false;\n\n sum = 0;\n for (let i = 0; i < 13; i++) sum += numbers[i]! * weights2[i]!;\n check = sum % 11;\n check = check < 2 ? 0 : 11 - check;\n return check === numbers[13];\n}\n\n/** Format an 11-digit Brazilian CEP-like value as `00000-000`. */\nexport function formatCEP(value: string): string {\n return digitsOnly(value)\n .slice(0, 8)\n .replace(/(\\d{5})(\\d)/, \"$1-$2\");\n}\n\n/** Format an unmasked CNPJ-shaped value as `00.000.000/0000-00`. */\nexport function formatCNPJ(value: string): string {\n return digitsOnly(value)\n .slice(0, 14)\n .replace(/(\\d{2})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1.$2\")\n .replace(/(\\d{3})(\\d)/, \"$1/$2\")\n .replace(/(\\d{4})(\\d)/, \"$1-$2\");\n}\n\n/** Strip any masking and return only digits. */\nexport function unmask(value: string): string {\n return digitsOnly(value);\n}\n","import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { Input, type InputProps } from \"@/components/Input\";\nimport { formatCEP, formatCNPJ } from \"./br-validators\";\nimport { formatCPF, formatPhone } from \"@/utils/format\";\n\ntype MaskedFieldProps = Omit<InputProps, \"value\" | \"onChange\"> & {\n value: string;\n onChange: (value: string) => void;\n};\n\nfunction maskedInput(\n mask: (input: string) => string,\n inputMode: InputHTMLAttributes<HTMLInputElement>[\"inputMode\"] = \"numeric\",\n) {\n return forwardRef<HTMLInputElement, MaskedFieldProps>(function MaskedInput(\n { value, onChange, ...props },\n ref,\n ) {\n return (\n <Input\n {...props}\n ref={ref}\n value={mask(value ?? \"\")}\n inputMode={inputMode}\n onChange={(event) => onChange(mask(event.target.value))}\n />\n );\n });\n}\n\nexport const CPFInput = maskedInput(formatCPF);\nexport const CNPJInput = maskedInput(formatCNPJ);\nexport const PhoneInput = maskedInput(formatPhone, \"tel\");\nexport const CEPInput = maskedInput(formatCEP);\n\nexport interface MoneyInputProps extends Omit<InputProps, \"value\" | \"onChange\" | \"type\"> {\n /** Cents (integer). Internally treated as 1/100 of the currency unit. */\n value: number;\n onChange: (cents: number) => void;\n /** Currency code for `Intl.NumberFormat`. Default: `\"BRL\"`. */\n currency?: string;\n /** Locale for `Intl.NumberFormat`. Default: `\"pt-BR\"`. */\n locale?: string;\n}\n\nfunction formatCents(cents: number, locale: string, currency: string): string {\n return new Intl.NumberFormat(locale, { style: \"currency\", currency }).format(cents / 100);\n}\n\nfunction parseCents(text: string): number {\n const digits = text.replace(/\\D/g, \"\");\n if (!digits) return 0;\n return Number.parseInt(digits, 10);\n}\n\n/**\n * Currency-masked input. Stores the value as an integer number of cents to\n * avoid floating-point error. Suitable for `react-hook-form` once you adapt\n * the field to expose cents.\n */\nexport const MoneyInput = forwardRef<HTMLInputElement, MoneyInputProps>(function MoneyInput(\n { value, onChange, currency = \"BRL\", locale = \"pt-BR\", ...props },\n ref,\n) {\n return (\n <Input\n {...props}\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n value={formatCents(value || 0, locale, currency)}\n onChange={(event) => onChange(parseCents(event.target.value))}\n />\n );\n});\n","import { useCallback, useState } from \"react\";\n\nexport interface ViaCEPResult {\n cep: string;\n logradouro: string;\n complemento: string;\n bairro: string;\n localidade: string;\n uf: string;\n ibge?: string;\n gia?: string;\n ddd?: string;\n siafi?: string;\n}\n\nexport interface UseViaCEPResult {\n loading: boolean;\n error: string | null;\n data: ViaCEPResult | null;\n /** Fetch the given CEP (8 digits or masked). Sets `data`/`error`. Returns the result. */\n lookup: (cep: string) => Promise<ViaCEPResult | null>;\n reset: () => void;\n}\n\n/**\n * React hook for the public ViaCEP service (`viacep.com.br`). No backend\n * required. Returns address fields when the CEP exists, or sets `error` for\n * invalid CEPs.\n */\nexport function useViaCEP(): UseViaCEPResult {\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [data, setData] = useState<ViaCEPResult | null>(null);\n\n const lookup = useCallback(async (cep: string): Promise<ViaCEPResult | null> => {\n const digits = cep.replace(/\\D/g, \"\");\n if (digits.length !== 8) {\n setError(\"CEP inválido.\");\n return null;\n }\n setLoading(true);\n setError(null);\n try {\n const response = await fetch(`https://viacep.com.br/ws/${digits}/json/`);\n const json = (await response.json()) as ViaCEPResult & { erro?: boolean };\n if (\"erro\" in json && json.erro) {\n setError(\"CEP não encontrado.\");\n setData(null);\n return null;\n }\n setData(json);\n return json;\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n setData(null);\n }, []);\n\n return { loading, error, data, lookup, reset };\n}\n","export type WebSocketStatus = \"idle\" | \"connecting\" | \"open\" | \"closing\" | \"closed\" | \"error\";\n\nexport interface WebSocketMessage<T> {\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** The original `MessageEvent`. */\n raw: MessageEvent;\n}\n\nexport interface CreateWebSocketOptions<T> {\n /** Subprotocol(s) forwarded to the `WebSocket` constructor. */\n protocols?: string | string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable. */\n maxRetries?: number;\n /** Initial backoff (ms). Doubles each attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff (ms). Default: 30000. */\n maxBackoff?: number;\n /**\n * Ping interval (ms). When set, the client sends `pingPayload` periodically\n * to keep the socket alive. Default: 0 (disabled).\n */\n pingInterval?: number;\n /** Payload sent on each ping. Default: `JSON.stringify({ type: \"ping\" })`. */\n pingPayload?: string | ArrayBufferLike | Blob | ArrayBufferView;\n /** Parse incoming frames. Default: JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: (event: Event) => void;\n onMessage?: (message: WebSocketMessage<T>) => void;\n onClose?: (event: CloseEvent) => void;\n onError?: (event: Event) => void;\n onStatusChange?: (status: WebSocketStatus) => void;\n}\n\nexport interface WebSocketController {\n /** Send a payload over the current connection. No-op when not open. */\n send: (payload: string | ArrayBufferLike | Blob | ArrayBufferView) => boolean;\n /** Close the connection and stop reconnecting. */\n close: (code?: number, reason?: string) => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: WebSocketStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a WebSocket with automatic exponential-backoff reconnect, optional\n * heartbeat pings, and typed JSON parsing.\n *\n * @param url - Full ws:// or wss:// URL.\n * @param options - Connection configuration and callbacks.\n * @returns Controller exposing `send`, `close`, `reconnect`, and `status`.\n */\nexport function createWebSocket<T = unknown>(\n url: string,\n options: CreateWebSocketOptions<T> = {},\n): WebSocketController {\n const {\n protocols,\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n pingInterval = 0,\n pingPayload = JSON.stringify({ type: \"ping\" }),\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onClose,\n onError,\n onStatusChange,\n } = options;\n\n let socket: WebSocket | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let pingTimer: ReturnType<typeof setInterval> | null = null;\n let retries = 0;\n let status: WebSocketStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: WebSocketStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function clearPing(): void {\n if (pingTimer) {\n clearInterval(pingTimer);\n pingTimer = null;\n }\n }\n\n function startPing(): void {\n if (!pingInterval || pingInterval <= 0) return;\n clearPing();\n pingTimer = setInterval(() => {\n if (socket?.readyState === WebSocket.OPEN) {\n socket.send(pingPayload);\n }\n }, pingInterval);\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (socket) {\n socket.onopen = null;\n socket.onmessage = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.close();\n }\n setStatus(\"connecting\");\n\n const ws = new WebSocket(url, protocols);\n socket = ws;\n\n ws.onopen = (event) => {\n retries = 0;\n setStatus(\"open\");\n startPing();\n onOpen?.(event);\n };\n\n ws.onmessage = (event) => {\n const raw = typeof event.data === \"string\" ? event.data : \"\";\n onMessage?.({\n data: parser(raw),\n raw: event,\n });\n };\n\n ws.onerror = (event) => {\n onError?.(event);\n };\n\n ws.onclose = (event) => {\n clearPing();\n onClose?.(event);\n socket = null;\n setStatus(\"closed\");\n if (!closed && !event.wasClean) {\n scheduleReconnect();\n }\n };\n }\n\n function send(payload: string | ArrayBufferLike | Blob | ArrayBufferView): boolean {\n if (socket?.readyState !== WebSocket.OPEN) return false;\n socket.send(payload);\n return true;\n }\n\n function close(code?: number, reason?: string): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n clearPing();\n retries = 0;\n if (socket) {\n setStatus(\"closing\");\n socket.close(code, reason);\n socket = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n send,\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n createWebSocket,\n type CreateWebSocketOptions,\n type WebSocketController,\n type WebSocketMessage,\n type WebSocketStatus,\n} from \"./create-web-socket\";\n\nexport interface UseWebSocketOptions<T> extends Omit<CreateWebSocketOptions<T>, \"onStatusChange\"> {\n /** When false, the socket is not opened. Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseWebSocketResult<T> {\n status: WebSocketStatus;\n /** Last decoded frame received. */\n lastMessage: WebSocketMessage<T> | null;\n /** Send a payload through the active connection. Returns false when not open. */\n send: (payload: string | ArrayBufferLike | Blob | ArrayBufferView) => boolean;\n /** Force a reconnect, resetting the retry counter. */\n reconnect: () => void;\n}\n\n/**\n * React hook around {@link createWebSocket}. Manages the connection lifecycle\n * for the host component and tears it down on unmount.\n */\nexport function useWebSocket<T = unknown>(\n url: string,\n options: UseWebSocketOptions<T> = {},\n): UseWebSocketResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<WebSocketStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<WebSocketMessage<T> | null>(null);\n const controllerRef = useRef<WebSocketController | null>(null);\n\n const onMessageRef = useRef(onMessage);\n onMessageRef.current = onMessage;\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createWebSocket<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n controllerRef.current = controller;\n\n return () => {\n controller.close();\n controllerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n const send = useCallback(\n (payload: string | ArrayBufferLike | Blob | ArrayBufferView): boolean => {\n return controllerRef.current?.send(payload) ?? false;\n },\n [],\n );\n\n const reconnect = useCallback((): void => {\n controllerRef.current?.reconnect();\n }, []);\n\n return { status, lastMessage, send, reconnect };\n}\n","import { haversineKm } from \"./distance\";\nimport type { Coordinate, TravelEstimate, TravelMode } from \"./types\";\n\n/**\n * Multiplier applied to the great-circle distance to approximate real road\n * distance. Mirrors `DEFAULT_CIRCUITY_FACTOR` from `tempest-fastapi-sdk`.\n */\nexport const DEFAULT_CIRCUITY_FACTOR = 1.3;\n\n/**\n * Default average car speed in km/h used to derive duration from distance.\n * Mirrors `DEFAULT_CAR_SPEED_KMH` from `tempest-fastapi-sdk`.\n */\nexport const DEFAULT_CAR_SPEED_KMH = 50.0;\n\n/**\n * Per-mode multipliers applied to the car duration. Mirrors\n * `DEFAULT_MODE_DURATION_FACTORS` from `tempest-fastapi-sdk` — motorcycles are\n * a touch faster, buses considerably slower (stops + dedicated lanes).\n */\nexport const DEFAULT_MODE_DURATION_FACTORS: Record<TravelMode, number> = {\n car: 1.0,\n motorcycle: 0.95,\n bus: 1.6,\n};\n\n/**\n * Look up the duration multiplier for a travel mode, falling back to `1.0`\n * for unknown modes. Mirrors `duration_factor` from `tempest-fastapi-sdk`.\n *\n * @param mode - Travel mode.\n * @param factors - Optional override map (partial merges over the defaults).\n * @returns The multiplier for `mode`.\n */\nexport function durationFactor(\n mode: TravelMode,\n factors?: Partial<Record<TravelMode, number>>,\n): number {\n return factors?.[mode] ?? DEFAULT_MODE_DURATION_FACTORS[mode] ?? 1.0;\n}\n\n/** Options for {@link estimateTravel}. */\nexport interface EstimateTravelOptions {\n /** Distance multiplier over the great-circle line. Default: `1.3`. */\n circuityFactor?: number;\n /** Average car speed in km/h. Default: `50`. */\n carSpeedKmh?: number;\n /** Per-mode duration multipliers (merged over the defaults). */\n modeDurationFactors?: Partial<Record<TravelMode, number>>;\n}\n\n/**\n * Offline travel estimate between two coordinates. No network — distance comes\n * from {@link haversineKm} scaled by circuity, duration from a mode-adjusted\n * average speed. Mirrors `estimate_travel` from `tempest-fastapi-sdk`.\n *\n * @param origin - Start coordinate.\n * @param destination - End coordinate.\n * @param mode - Travel mode. Default: `\"car\"`.\n * @param options - Tuning knobs (circuity, speed, per-mode factors).\n * @returns A `\"heuristic\"` {@link TravelEstimate}.\n * @throws {RangeError} If `carSpeedKmh <= 0` or `circuityFactor <= 0`.\n *\n * @example\n * estimateTravel(\n * { latitude: -23.5505, longitude: -46.6333 },\n * { latitude: -23.5629, longitude: -46.6544 },\n * \"car\",\n * ); // { mode: \"car\", distance_km: …, duration_minutes: …, source: \"heuristic\" }\n */\nexport function estimateTravel(\n origin: Coordinate,\n destination: Coordinate,\n mode: TravelMode = \"car\",\n options: EstimateTravelOptions = {},\n): TravelEstimate {\n const {\n circuityFactor = DEFAULT_CIRCUITY_FACTOR,\n carSpeedKmh = DEFAULT_CAR_SPEED_KMH,\n modeDurationFactors,\n } = options;\n\n if (carSpeedKmh <= 0) {\n throw new RangeError(\"carSpeedKmh must be greater than 0\");\n }\n if (circuityFactor <= 0) {\n throw new RangeError(\"circuityFactor must be greater than 0\");\n }\n\n const distanceKm = haversineKm(origin, destination) * circuityFactor;\n const carMinutes = (distanceKm / carSpeedKmh) * 60.0;\n const durationMinutes = carMinutes * durationFactor(mode, modeDurationFactors);\n\n return {\n mode,\n distance_km: distanceKm,\n duration_minutes: durationMinutes,\n source: \"heuristic\",\n };\n}\n","import type { Coordinate, GeoBounds } from \"./types\";\n\n/**\n * Compute the axis-aligned bounding box that contains every point. Returns\n * `null` for an empty list (there is nothing to bound).\n *\n * @param points - Coordinates to enclose.\n * @returns The bounds, or `null` when `points` is empty.\n */\nexport function boundingBox(points: readonly Coordinate[]): GeoBounds | null {\n if (points.length === 0) return null;\n\n let minLatitude = points[0].latitude;\n let maxLatitude = points[0].latitude;\n let minLongitude = points[0].longitude;\n let maxLongitude = points[0].longitude;\n\n for (const point of points) {\n if (point.latitude < minLatitude) minLatitude = point.latitude;\n if (point.latitude > maxLatitude) maxLatitude = point.latitude;\n if (point.longitude < minLongitude) minLongitude = point.longitude;\n if (point.longitude > maxLongitude) maxLongitude = point.longitude;\n }\n\n return { minLatitude, maxLatitude, minLongitude, maxLongitude };\n}\n\n/** Geometric center of a bounding box. */\nexport function boundsCenter(bounds: GeoBounds): Coordinate {\n return {\n latitude: (bounds.minLatitude + bounds.maxLatitude) / 2,\n longitude: (bounds.minLongitude + bounds.maxLongitude) / 2,\n };\n}\n\n/**\n * Grow a bounding box outward by `ratio` of its own span on every side, with a\n * small absolute floor so a single-point (zero-span) box still gets padding.\n * A `ratio` of `0.1` adds 10% margin — handy so a plotted trajectory does not\n * hug the edge of the viewport.\n *\n * @param bounds - The box to expand.\n * @param ratio - Fraction of the span to add per side. Default: `0.1`.\n * @returns A new, larger {@link GeoBounds}.\n */\nexport function expandBounds(bounds: GeoBounds, ratio = 0.1): GeoBounds {\n const latSpan = bounds.maxLatitude - bounds.minLatitude;\n const lonSpan = bounds.maxLongitude - bounds.minLongitude;\n const latPad = latSpan * ratio || 0.001;\n const lonPad = lonSpan * ratio || 0.001;\n\n return {\n minLatitude: bounds.minLatitude - latPad,\n maxLatitude: bounds.maxLatitude + latPad,\n minLongitude: bounds.minLongitude - lonPad,\n maxLongitude: bounds.maxLongitude + lonPad,\n };\n}\n","import { durationFactor } from \"./estimate\";\nimport type { Coordinate, TravelEstimate, TravelMode } from \"./types\";\n\n/**\n * Pluggable routing backend. A backend turns two coordinates into a\n * {@link TravelEstimate}. Mirrors the `RoutingBackend` protocol from\n * `tempest-fastapi-sdk` so client and server share the same contract.\n *\n * Implement this to route against your own self-hosted engine (OSRM, Valhalla,\n * GraphHopper). The offline {@link estimateTravel} heuristic satisfies the same\n * shape without any network.\n */\nexport interface RoutingBackend {\n route: (\n origin: Coordinate,\n destination: Coordinate,\n options?: { mode?: TravelMode },\n ) => Promise<TravelEstimate>;\n}\n\n/** Options for {@link createOSRMBackend}. */\nexport interface OSRMBackendOptions {\n /**\n * Base URL of an **OSRM** HTTP server. There is no default on purpose — this\n * SDK ships no external endpoint. Point it at a routing engine **you host**.\n */\n baseUrl: string;\n /** `fetch` implementation. Default: the global `fetch`. */\n fetch?: typeof globalThis.fetch;\n /** Per-mode duration multipliers applied over the car profile. */\n modeDurationFactors?: Partial<Record<TravelMode, number>>;\n}\n\ninterface OSRMRoute {\n distance: number;\n duration: number;\n}\n\ninterface OSRMResponse {\n code?: string;\n routes?: OSRMRoute[];\n}\n\n/**\n * Build a {@link RoutingBackend} backed by an OSRM server **you host**. OSRM\n * only serves a driving profile, so motorcycle/bus durations are derived by\n * scaling the car duration through {@link durationFactor} — same approach as\n * the FastAPI SDK's `OSRMBackend`.\n *\n * !!! warning\n * This makes a network request to `baseUrl`. It is opt-in: nothing in the\n * SDK calls it unless you construct it and pass your own server URL. For a\n * zero-network estimate, use {@link estimateTravel} instead.\n *\n * @param options - Server URL, optional `fetch`, per-mode factors.\n * @returns A backend whose `route()` queries OSRM.\n *\n * @example\n * const backend = createOSRMBackend({ baseUrl: \"https://osrm.internal\" });\n * const estimate = await backend.route(origin, destination, { mode: \"car\" });\n */\nexport function createOSRMBackend(options: OSRMBackendOptions): RoutingBackend {\n const { baseUrl, fetch = globalThis.fetch, modeDurationFactors } = options;\n const trimmedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n\n return {\n async route(origin, destination, routeOptions = {}): Promise<TravelEstimate> {\n const mode = routeOptions.mode ?? \"car\";\n const coords = `${origin.longitude},${origin.latitude};${destination.longitude},${destination.latitude}`;\n const url = `${trimmedBaseUrl}/route/v1/driving/${coords}?overview=false`;\n\n let payload: OSRMResponse;\n try {\n const response = await fetch(url);\n payload = (await response.json()) as OSRMResponse;\n } catch (cause) {\n throw new Error(`OSRM request failed: ${String(cause)}`, { cause });\n }\n\n const route = payload.routes?.[0];\n if (payload.code !== \"Ok\" || !route) {\n throw new Error(`OSRM returned no route (code: ${payload.code ?? \"unknown\"})`);\n }\n\n const distanceKm = route.distance / 1000.0;\n const carMinutes = route.duration / 60.0;\n const durationMinutes = carMinutes * durationFactor(mode, modeDurationFactors);\n\n return {\n mode,\n distance_km: distanceKm,\n duration_minutes: durationMinutes,\n source: \"osrm\",\n };\n },\n };\n}\n","import { haversineKm } from \"./distance\";\nimport type { TrackPoint } from \"./types\";\n\n/** Lifecycle status of a {@link PositionTracker}. */\nexport type TrackerStatus = \"idle\" | \"tracking\" | \"error\";\n\n/** Options for {@link createPositionTracker}. */\nexport interface CreatePositionTrackerOptions {\n /**\n * Discard a new sample when it is closer than this (in km) to the last\n * kept point — filters GPS jitter while standing still. Default: `0.005`\n * (5 meters). Pass `0` to keep every sample.\n */\n minDistanceKm?: number;\n /**\n * Cap the retained trajectory to the most recent N points (older points are\n * dropped, but their distance stays counted). Default: `Infinity`.\n */\n maxPoints?: number;\n /** Forwarded to `navigator.geolocation.watchPosition`. */\n positionOptions?: PositionOptions;\n /** Called with the full trajectory each time a point is added. */\n onUpdate?: (points: readonly TrackPoint[]) => void;\n /** Called on a `GeolocationPositionError`. */\n onError?: (error: GeolocationPositionError) => void;\n /** Called whenever the status changes. */\n onStatusChange?: (status: TrackerStatus) => void;\n}\n\n/** Imperative controller returned by {@link createPositionTracker}. */\nexport interface PositionTracker {\n /** Begin watching position. No-op if already tracking. */\n start: () => void;\n /** Stop watching. Retains the recorded trajectory. */\n stop: () => void;\n /** Stop and discard the recorded trajectory. */\n clear: () => void;\n /** Snapshot of the recorded trajectory (newest last). */\n readonly points: readonly TrackPoint[];\n /** Total distance of the recorded trajectory in kilometers. */\n readonly distanceKm: number;\n /** Current tracker status. */\n readonly status: TrackerStatus;\n}\n\n/**\n * Record a live GPS trajectory from `navigator.geolocation.watchPosition`.\n * Framework-free — the {@link usePositionTracker} hook wraps this for React.\n *\n * Jitter while stationary is filtered by `minDistanceKm`; distance is\n * accumulated across the *full* run even when `maxPoints` trims the retained\n * array. 100% browser-side: no network, no external service.\n *\n * @param options - Filtering, retention and callbacks.\n * @returns A controller with `start`/`stop`/`clear` and live getters.\n *\n * @example\n * const tracker = createPositionTracker({\n * minDistanceKm: 0.01,\n * onUpdate: (pts) => console.log(pts.length, \"points\"),\n * });\n * tracker.start();\n * // …later\n * tracker.stop();\n * console.log(tracker.distanceKm);\n */\nexport function createPositionTracker(options: CreatePositionTrackerOptions = {}): PositionTracker {\n const {\n minDistanceKm = 0.005,\n maxPoints = Infinity,\n positionOptions,\n onUpdate,\n onError,\n onStatusChange,\n } = options;\n\n let points: TrackPoint[] = [];\n let distanceKm = 0;\n let lastKept: TrackPoint | null = null;\n let watchId: number | null = null;\n let status: TrackerStatus = \"idle\";\n\n function setStatus(next: TrackerStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function handlePosition(position: GeolocationPosition): void {\n const point: TrackPoint = {\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n timestamp: position.timestamp,\n accuracy: position.coords.accuracy,\n };\n\n if (lastKept) {\n const step = haversineKm(lastKept, point);\n if (step < minDistanceKm) return;\n distanceKm += step;\n }\n\n lastKept = point;\n points.push(point);\n if (points.length > maxPoints) {\n points = points.slice(points.length - maxPoints);\n }\n onUpdate?.(points);\n }\n\n function handleError(error: GeolocationPositionError): void {\n setStatus(\"error\");\n onError?.(error);\n }\n\n function start(): void {\n if (watchId !== null) return;\n if (typeof navigator === \"undefined\" || !navigator.geolocation) {\n setStatus(\"error\");\n return;\n }\n setStatus(\"tracking\");\n watchId = navigator.geolocation.watchPosition(handlePosition, handleError, positionOptions);\n }\n\n function stop(): void {\n if (watchId !== null && typeof navigator !== \"undefined\" && navigator.geolocation) {\n navigator.geolocation.clearWatch(watchId);\n }\n watchId = null;\n setStatus(\"idle\");\n }\n\n function clear(): void {\n stop();\n points = [];\n distanceKm = 0;\n lastKept = null;\n onUpdate?.(points);\n }\n\n return {\n start,\n stop,\n clear,\n get points() {\n return points;\n },\n get distanceKm() {\n return distanceKm;\n },\n get status() {\n return status;\n },\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { boundingBox, expandBounds } from \"./bounds\";\nimport { haversineKm } from \"./distance\";\nimport { fitProjection, type PixelPoint } from \"./projection\";\nimport type { Coordinate, GeoMarker } from \"./types\";\nimport styles from \"./TrajectoryMap.module.css\";\n\n// Leaflet layer is loaded on demand — only when a `tileUrl` is supplied, so\n// apps that stick to the tile-free SVG never pull leaflet into their bundle.\nconst LeafletTrajectory = lazy(() =>\n import(\"./leaflet-map\").then((m) => ({ default: m.LeafletTrajectory })),\n);\n\nexport interface TrajectoryMapProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Ordered coordinates forming the trajectory. */\n points: readonly Coordinate[];\n /** Optional \"current position\" marker, drawn on top of the path. */\n current?: Coordinate | null;\n /** Viewport height in pixels. Default: `320`. */\n height?: number;\n /** Inner padding in pixels kept clear on every edge. Default: `24`. */\n padding?: number;\n /** Draw a light reference grid behind the path (SVG mode). Default: `true`. */\n showGrid?: boolean;\n /** Draw a distance scale bar (SVG mode). Default: `true`. */\n showScale?: boolean;\n /** Path stroke color. Default: the primary token. */\n strokeColor?: string;\n /**\n * Tile URL template (`{z}/{x}/{y}`) of a map server **you host**. When set,\n * the map upgrades to a real Leaflet tile layer (requires `leaflet` to be\n * installed). Omit for the zero-dependency, zero-network SVG plot.\n */\n tileUrl?: string;\n /** Attribution text shown over the tile layer. */\n tileAttribution?: string;\n /** Accessible label for the map region. Default: `\"Trajetória\"`. */\n label?: string;\n /** Point markers to overlay (e.g. stops, POIs). Included in the auto-fit. */\n markers?: readonly GeoMarker[];\n /** Fired when a marker is clicked. */\n onMarkerClick?: (marker: GeoMarker, index: number) => void;\n}\n\nconst NICE_KM_STEPS = [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000] as const;\n\n/** Pick the largest \"nice\" distance whose bar fits within `maxPixels`. */\nfunction pickScaleKm(kmPerPixel: number, maxPixels: number): { km: number; pixels: number } {\n const maxKm = kmPerPixel * maxPixels;\n let chosen: number = NICE_KM_STEPS[0];\n for (const step of NICE_KM_STEPS) {\n if (step <= maxKm) chosen = step;\n }\n return { km: chosen, pixels: chosen / kmPerPixel };\n}\n\n/** Format a distance in km for the scale bar (meters below 1 km). */\nfunction formatScale(km: number): string {\n return km < 1 ? `${Math.round(km * 1000)} m` : `${km % 1 === 0 ? km : km.toFixed(1)} km`;\n}\n\n/**\n * Plot a GPS trajectory. By default it renders a **tile-free SVG** map (Web\n * Mercator projection, auto-fit to the points, optional grid + scale bar) —\n * 100% self-contained, no external tiles or paid API. Pass `tileUrl` pointing\n * at a map server **you host** to upgrade to a real Leaflet tile layer.\n *\n * @example\n * // Zero-dependency SVG plot\n * <TrajectoryMap points={points} current={lastPoint} height={360} />\n *\n * @example\n * // Real tiles from your own server (requires `leaflet` installed)\n * <TrajectoryMap points={points} tileUrl=\"https://tiles.internal/{z}/{x}/{y}.png\" />\n */\nexport function TrajectoryMap({\n points,\n current,\n height = 320,\n padding = 24,\n showGrid = true,\n showScale = true,\n strokeColor,\n tileUrl,\n tileAttribution,\n label = \"Trajetória\",\n markers,\n onMarkerClick,\n className,\n style,\n ...rest\n}: TrajectoryMapProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>(600);\n\n useEffect(() => {\n const node = containerRef.current;\n if (!node || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const measured = entries[0]?.contentRect.width;\n if (measured && measured > 0) setWidth(measured);\n });\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n const allPoints = useMemo<Coordinate[]>(\n () => [...points, ...(current ? [current] : []), ...(markers ?? [])],\n [points, current, markers],\n );\n\n const svg = useMemo(() => {\n const box = boundingBox(allPoints);\n if (!box) return null;\n\n const projection = fitProjection(expandBounds(box, 0.12), width, height, { padding });\n const pixels: PixelPoint[] = points.map((p) => projection.project(p));\n const polyline = pixels.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\" \");\n\n const startPixel = pixels[0] ?? null;\n const endPixel = pixels.length > 0 ? pixels[pixels.length - 1] : null;\n const currentPixel = current ? projection.project(current) : null;\n\n // Distance-per-pixel at the map center, for the scale bar: measure the\n // center → east-edge span in both km (haversine) and pixels (projected).\n const centerCoord = {\n latitude: (box.minLatitude + box.maxLatitude) / 2,\n longitude: (box.minLongitude + box.maxLongitude) / 2,\n };\n const center = projection.project(centerCoord);\n const eastRef = projection.project({ ...centerCoord, longitude: box.maxLongitude });\n const edgeKm = haversineKm(centerCoord, { ...centerCoord, longitude: box.maxLongitude });\n const edgePixels = Math.abs(eastRef.x - center.x) || 1;\n const kmPerPixel = edgeKm / edgePixels || 0;\n\n const markerPixels = (markers ?? []).map((m) => ({ marker: m, p: projection.project(m) }));\n\n return { polyline, startPixel, endPixel, currentPixel, kmPerPixel, markerPixels };\n }, [allPoints, points, current, markers, width, height, padding]);\n\n // ── Leaflet tile mode ────────────────────────────────────────────────────\n if (tileUrl) {\n return (\n <div\n ref={containerRef}\n className={cn(styles.map, className)}\n style={{ height, ...style }}\n role=\"img\"\n aria-label={label}\n {...rest}\n >\n <Suspense fallback={<div className={styles.loading}>Carregando mapa…</div>}>\n <LeafletTrajectory\n points={points}\n current={current}\n tileUrl={tileUrl}\n tileAttribution={tileAttribution}\n strokeColor={strokeColor}\n />\n </Suspense>\n </div>\n );\n }\n\n // ── Tile-free SVG mode ─────────────────────────────────────────────────────\n const scale =\n showScale && svg && svg.kmPerPixel > 0\n ? pickScaleKm(svg.kmPerPixel, Math.min(120, width * 0.35))\n : null;\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.map, className)}\n style={{ height, ...style }}\n role=\"img\"\n aria-label={label}\n {...rest}\n >\n {!svg ? (\n <div className={styles.empty}>Sem pontos de trajetória ainda.</div>\n ) : (\n <svg\n className={styles.svg}\n width=\"100%\"\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {showGrid && (\n <g className={styles.grid}>\n {[0.25, 0.5, 0.75].map((f) => (\n <line\n key={`h${f}`}\n x1={0}\n y1={height * f}\n x2={width}\n y2={height * f}\n />\n ))}\n {[0.25, 0.5, 0.75].map((f) => (\n <line\n key={`v${f}`}\n x1={width * f}\n y1={0}\n x2={width * f}\n y2={height}\n />\n ))}\n </g>\n )}\n\n {svg.polyline && (\n <polyline\n className={styles.path}\n points={svg.polyline}\n fill=\"none\"\n stroke={strokeColor}\n data-testid=\"trajectory-path\"\n />\n )}\n\n {svg.startPixel && (\n <circle\n className={styles.start}\n cx={svg.startPixel.x}\n cy={svg.startPixel.y}\n r={5}\n />\n )}\n {svg.endPixel && !current && (\n <circle\n className={styles.end}\n cx={svg.endPixel.x}\n cy={svg.endPixel.y}\n r={5}\n />\n )}\n {svg.currentPixel && (\n <>\n <circle\n className={styles.pulse}\n cx={svg.currentPixel.x}\n cy={svg.currentPixel.y}\n r={10}\n />\n <circle\n className={styles.current}\n cx={svg.currentPixel.x}\n cy={svg.currentPixel.y}\n r={5}\n />\n </>\n )}\n\n {svg.markerPixels.map(({ marker, p }, i) => {\n const interactive = Boolean(onMarkerClick);\n return (\n <circle\n key={marker.id ?? i}\n className={styles.marker}\n cx={p.x}\n cy={p.y}\n r={marker.radius ?? 6}\n style={marker.color ? { fill: marker.color } : undefined}\n data-marker-id={marker.id ?? i}\n tabIndex={interactive ? 0 : undefined}\n role={interactive ? \"button\" : undefined}\n aria-label={marker.label}\n onClick={interactive ? () => onMarkerClick?.(marker, i) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onMarkerClick?.(marker, i);\n }\n }\n : undefined\n }\n >\n {marker.label ? <title>{marker.label}</title> : null}\n </circle>\n );\n })}\n\n {scale && (\n <g\n className={styles.scale}\n transform={`translate(${padding}, ${height - padding})`}\n >\n <line x1={0} y1={0} x2={scale.pixels} y2={0} />\n <line x1={0} y1={-4} x2={0} y2={4} />\n <line x1={scale.pixels} y1={-4} x2={scale.pixels} y2={4} />\n <text x={scale.pixels / 2} y={-8} textAnchor=\"middle\">\n {formatScale(scale.km)}\n </text>\n </g>\n )}\n </svg>\n )}\n </div>\n );\n}\n","import type { ResolvedTheme, ThemeMode } from \"./types\";\n\nexport interface GetInitialThemeOptions {\n /** localStorage key. Default: `\"tempest-theme\"`. */\n storageKey?: string;\n /** Theme used when nothing is stored and the user has no system preference. */\n defaultTheme?: ThemeMode;\n}\n\n/**\n * Inline-safe theme resolution intended for early bootstrap (e.g. inside the\n * `<head>` script that prevents the flash of incorrect theme). Reads from\n * localStorage and falls back to `prefers-color-scheme`.\n */\nexport function getInitialTheme(options: GetInitialThemeOptions = {}): ResolvedTheme {\n const { storageKey = \"tempest-theme\", defaultTheme = \"system\" } = options;\n\n if (typeof window === \"undefined\") {\n return defaultTheme === \"dark\" ? \"dark\" : \"light\";\n }\n\n let stored: ThemeMode | null = null;\n try {\n stored = window.localStorage.getItem(storageKey) as ThemeMode | null;\n } catch {\n stored = null;\n }\n\n const mode: ThemeMode = stored ?? defaultTheme;\n if (mode === \"dark\" || mode === \"light\") return mode;\n\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\n/**\n * Plain HTML snippet that sets `data-tempest-theme` on `<html>` before React\n * hydrates. Inline this in `<head>` to avoid a flash of the wrong theme on\n * first paint.\n *\n * @example\n * <script dangerouslySetInnerHTML={{ __html: themeInitScript() }} />\n */\nexport function themeInitScript(options: GetInitialThemeOptions = {}): string {\n const storageKey = options.storageKey ?? \"tempest-theme\";\n const defaultTheme = options.defaultTheme ?? \"system\";\n return `\n(function(){try{\n var key=${JSON.stringify(storageKey)};\n var def=${JSON.stringify(defaultTheme)};\n var stored=localStorage.getItem(key);\n var mode=stored||def;\n var resolved=mode===\"dark\"||mode===\"light\"?mode:(matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\");\n document.documentElement.setAttribute(\"data-tempest-theme\",resolved);\n}catch(e){}})();\n`.trim();\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface LoggerSink {\n (entry: LogEntry): void;\n}\n\nexport interface Logger {\n debug: (message: string, context?: Record<string, unknown>) => void;\n info: (message: string, context?: Record<string, unknown>) => void;\n warn: (message: string, context?: Record<string, unknown>) => void;\n error: (message: string, context?: Record<string, unknown>) => void;\n /** Build a child logger that prefixes the namespace to each message. */\n child: (namespace: string) => Logger;\n}\n\nexport interface CreateLoggerOptions {\n /** Lowest level recorded. Default: `\"info\"`. */\n level?: LogLevel;\n /** Output adapters. Default: a `console.*` sink. */\n sinks?: LoggerSink[];\n /** Initial namespace (prepended to every message). */\n namespace?: string;\n}\n\nconst LEVELS: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\nfunction shouldLog(threshold: LogLevel, level: LogLevel): boolean {\n return LEVELS.indexOf(level) >= LEVELS.indexOf(threshold);\n}\n\n/** Default sink that writes to the browser console. */\nexport const consoleSink: LoggerSink = ({ level, message, context }) => {\n const method = level === \"debug\" ? \"log\" : level;\n if (context) {\n console[method](message, context);\n } else {\n console[method](message);\n }\n};\n\n/**\n * Create a structured leveled logger. Plug arbitrary sinks (Sentry, Datadog,\n * remote ingestion) by implementing the `LoggerSink` interface.\n */\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const threshold = options.level ?? \"info\";\n const sinks = options.sinks ?? [consoleSink];\n const namespace = options.namespace ?? \"\";\n\n function emit(level: LogLevel, message: string, context?: Record<string, unknown>): void {\n if (!shouldLog(threshold, level)) return;\n const entry: LogEntry = {\n level,\n message: namespace ? `[${namespace}] ${message}` : message,\n context,\n timestamp: Date.now(),\n };\n for (const sink of sinks) {\n try {\n sink(entry);\n } catch {\n /* never let a sink break the app */\n }\n }\n }\n\n return {\n debug: (message, context) => emit(\"debug\", message, context),\n info: (message, context) => emit(\"info\", message, context),\n warn: (message, context) => emit(\"warn\", message, context),\n error: (message, context) => emit(\"error\", message, context),\n child: (childNamespace: string) =>\n createLogger({\n level: threshold,\n sinks,\n namespace: namespace ? `${namespace}:${childNamespace}` : childNamespace,\n }),\n };\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n","import type { TelemetryAdapter } from \"./types\";\n\n/**\n * Dev-friendly adapter that logs every call to `console`. Use as a default\n * before plugging the real provider (Sentry / Datadog / PostHog).\n */\nexport const consoleTelemetryAdapter: TelemetryAdapter = {\n identify(user) {\n console.info(\"[telemetry] identify\", user);\n },\n track(event) {\n console.info(\"[telemetry] track\", event.name, event.properties);\n },\n captureException(error, context) {\n console.error(\"[telemetry] exception\", error, context);\n },\n};\n","import type { TelemetryAdapter, TelemetryEvent, TelemetryUser } from \"./types\";\n\n/**\n * Minimal subset of `@sentry/browser` used by the adapter. Lets you pass\n * either the real SDK module (`import * as Sentry from \"@sentry/browser\"`)\n * or a stubbed object in tests.\n */\nexport interface SentryLike {\n init?: (options: Record<string, unknown>) => void;\n setUser: (user: Record<string, unknown> | null) => void;\n addBreadcrumb: (breadcrumb: {\n category?: string;\n message?: string;\n level?: string;\n data?: Record<string, unknown>;\n }) => void;\n captureException: (\n error: unknown,\n hint?: { extra?: Record<string, unknown>; contexts?: Record<string, unknown> },\n ) => void;\n flush?: (timeout?: number) => Promise<boolean>;\n}\n\nexport interface CreateSentryTelemetryAdapterOptions {\n /** The Sentry browser SDK namespace. Required. */\n sentry: SentryLike;\n /** Optional init payload — passed verbatim to `Sentry.init` when the provider mounts. */\n initOptions?: Record<string, unknown>;\n /** Flush timeout in ms (default `2000`). */\n flushTimeout?: number;\n /** Breadcrumb category for `track` events (default `\"app\"`). */\n breadcrumbCategory?: string;\n}\n\nfunction userToSentry(user: TelemetryUser | null): Record<string, unknown> | null {\n if (user === null) return null;\n const { id, email, name, traits } = user;\n return {\n ...(id !== undefined ? { id } : null),\n ...(email !== undefined ? { email } : null),\n ...(name !== undefined ? { username: name } : null),\n ...(traits ?? null),\n };\n}\n\n/**\n * Build a [[TelemetryAdapter]] backed by `@sentry/browser`. The Sentry SDK\n * is supplied by the caller (not bundled) so apps that already initialise\n * Sentry at startup can share that instance — and apps that don't use\n * Sentry never pay for it.\n *\n * Mapping:\n * - `identify(user)` → `Sentry.setUser`\n * - `track(event)` → `Sentry.addBreadcrumb({ category, message: event.name, data })`\n * - `captureException(err, ctx)` → `Sentry.captureException(err, { extra: ctx })`\n * - `flush()` → `Sentry.flush(flushTimeout)`\n *\n * @example\n * import * as Sentry from \"@sentry/browser\";\n * import { createSentryTelemetryAdapter, TelemetryProvider } from \"tempest-react-sdk\";\n *\n * const adapter = createSentryTelemetryAdapter({\n * sentry: Sentry,\n * initOptions: { dsn: import.meta.env.VITE_SENTRY_DSN, tracesSampleRate: 0.1 },\n * });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n */\nexport function createSentryTelemetryAdapter(\n options: CreateSentryTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { sentry, initOptions, flushTimeout = 2000, breadcrumbCategory = \"app\" } = options;\n\n return {\n init() {\n if (initOptions && sentry.init) {\n sentry.init(initOptions);\n }\n },\n identify(user: TelemetryUser | null) {\n sentry.setUser(userToSentry(user));\n },\n track(event: TelemetryEvent) {\n sentry.addBreadcrumb({\n category: breadcrumbCategory,\n message: event.name,\n level: \"info\",\n ...(event.properties ? { data: event.properties } : null),\n });\n },\n captureException(error: unknown, context?: Record<string, unknown>) {\n sentry.captureException(error, context ? { extra: context } : undefined);\n },\n async flush() {\n if (sentry.flush) {\n await sentry.flush(flushTimeout);\n }\n },\n };\n}\n","import type { TelemetryAdapter, TelemetryEvent, TelemetryUser } from \"./types\";\n\n/**\n * Minimal subset of `posthog-js` used by the adapter. Pass either the real\n * default export (`import posthog from \"posthog-js\"`) or a stubbed object\n * in tests.\n */\nexport interface PostHogLike {\n init?: (apiKey: string, options?: Record<string, unknown>) => void;\n identify: (distinctId: string, properties?: Record<string, unknown>) => void;\n capture: (eventName: string, properties?: Record<string, unknown>) => void;\n captureException?: (error: unknown, properties?: Record<string, unknown>) => void;\n reset?: () => void;\n}\n\nexport interface CreatePostHogTelemetryAdapterOptions {\n /** The PostHog JS client (the default export of `posthog-js`). Required. */\n posthog: PostHogLike;\n /** Project API key + options. When provided, `Provider.init` calls `posthog.init(apiKey, options)`. */\n init?: { apiKey: string; options?: Record<string, unknown> };\n}\n\nfunction userToProperties(user: TelemetryUser): Record<string, unknown> {\n const { email, name, traits } = user;\n return {\n ...(email !== undefined ? { email } : null),\n ...(name !== undefined ? { name } : null),\n ...(traits ?? null),\n };\n}\n\n/**\n * Build a [[TelemetryAdapter]] backed by [`posthog-js`](https://posthog.com/docs/libraries/js).\n * The PostHog client is supplied by the caller (not bundled).\n *\n * Mapping:\n * - `identify(user)` → `posthog.identify(user.id, { email, name, ...traits })` (or `posthog.reset()` when `null`)\n * - `track({ name, properties })` → `posthog.capture(name, properties)`\n * - `captureException(err, ctx)` → `posthog.captureException(err, ctx)` when available, otherwise `posthog.capture(\"$exception\", { …err, …ctx })`\n * - `flush()` → no-op (PostHog batches automatically)\n *\n * @example\n * import posthog from \"posthog-js\";\n * import { createPostHogTelemetryAdapter, TelemetryProvider } from \"tempest-react-sdk\";\n *\n * const adapter = createPostHogTelemetryAdapter({\n * posthog,\n * init: { apiKey: import.meta.env.VITE_POSTHOG_KEY, options: { api_host: \"https://us.i.posthog.com\" } },\n * });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n */\nexport function createPostHogTelemetryAdapter(\n options: CreatePostHogTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { posthog, init } = options;\n\n return {\n init() {\n if (init && posthog.init) {\n posthog.init(init.apiKey, init.options);\n }\n },\n identify(user: TelemetryUser | null) {\n if (user === null) {\n posthog.reset?.();\n return;\n }\n if (user.id === undefined) return;\n posthog.identify(user.id, userToProperties(user));\n },\n track(event: TelemetryEvent) {\n posthog.capture(event.name, event.properties);\n },\n captureException(error: unknown, context?: Record<string, unknown>) {\n if (posthog.captureException) {\n posthog.captureException(error, context);\n return;\n }\n const err = error instanceof Error ? error : new Error(String(error));\n posthog.capture(\"$exception\", {\n $exception_message: err.message,\n $exception_type: err.name,\n $exception_stack_trace_raw: err.stack,\n ...context,\n });\n },\n };\n}\n","import { createContext, useContext, useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\nconst FeatureFlagsContext = createContext<FeatureFlagsAdapter | null>(null);\n\nexport interface FeatureFlagsProviderProps {\n adapter: FeatureFlagsAdapter;\n children: ReactNode;\n}\n\n/** Inject a feature flags adapter into the tree. */\nexport function FeatureFlagsProvider({ adapter, children }: FeatureFlagsProviderProps) {\n const value = useMemo(() => adapter, [adapter]);\n useEffect(() => undefined, [value]);\n return <FeatureFlagsContext.Provider value={value}>{children}</FeatureFlagsContext.Provider>;\n}\n\nfunction useAdapter(): FeatureFlagsAdapter {\n const ctx = useContext(FeatureFlagsContext);\n if (!ctx) throw new Error(\"useFeatureFlag requires <FeatureFlagsProvider>\");\n return ctx;\n}\n\n/**\n * Read a boolean flag and re-render when the adapter fires `onChange`.\n *\n * @example\n * const showNewFeed = useFeatureFlag(\"new-feed\", false);\n */\nexport function useFeatureFlag(key: string, defaultValue = false): boolean {\n const adapter = useAdapter();\n const subscribe = (listener: () => void): (() => void) =>\n adapter.onChange ? adapter.onChange(listener) : () => undefined;\n const get = (): boolean => adapter.isEnabled(key, defaultValue);\n return useSyncExternalStore(subscribe, get, get);\n}\n\n/**\n * Read a typed flag value (string / number / boolean / null) and re-render\n * on change.\n */\nexport function useFlagValue<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n const adapter = useAdapter();\n const subscribe = (listener: () => void): (() => void) =>\n adapter.onChange ? adapter.onChange(listener) : () => undefined;\n const get = (): T => adapter.get<T>(key, defaultValue);\n return useSyncExternalStore(subscribe, get, get);\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\nexport interface InMemoryFlagsOptions {\n initial?: Record<string, FlagValue>;\n}\n\n/**\n * Trivial in-memory adapter. Suitable for tests, local development, or as a\n * fallback wrapping the real provider while it loads.\n */\nexport function createInMemoryFlags(options: InMemoryFlagsOptions = {}): FeatureFlagsAdapter & {\n set: (key: string, value: FlagValue) => void;\n} {\n const flags: Record<string, FlagValue> = { ...(options.initial ?? {}) };\n const listeners = new Set<() => void>();\n\n function notify(): void {\n for (const listener of listeners) listener();\n }\n\n return {\n isEnabled(key, defaultValue = false) {\n return key in flags ? Boolean(flags[key]) : defaultValue;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return (key in flags ? (flags[key] as T) : (defaultValue as T)) as T;\n },\n onChange(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n set(key, value) {\n flags[key] = value;\n notify();\n },\n };\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\n/**\n * Minimal subset of [`@growthbook/growthbook`](https://docs.growthbook.io/lib/js)\n * used by the adapter. Pass a `GrowthBook` instance directly.\n */\nexport interface GrowthBookLike {\n isOn: (key: string) => boolean;\n getFeatureValue: <T>(key: string, defaultValue: T) => T;\n /** Registers a renderer fired whenever GrowthBook re-evaluates features. */\n setRenderer?: (renderer: () => void) => void;\n}\n\nexport interface CreateGrowthBookFeatureFlagsAdapterOptions {\n /** The GrowthBook instance. Required. */\n growthbook: GrowthBookLike;\n}\n\n/**\n * Build a [[FeatureFlagsAdapter]] backed by a GrowthBook instance. Apps\n * initialise GrowthBook themselves (so they can load features over the\n * network, set attributes, etc.) — the adapter just routes lookups.\n *\n * Mapping:\n * - `isEnabled(key, default)` → `growthbook.isOn(key)` (falls back to `default` if no value)\n * - `get(key, default)` → `growthbook.getFeatureValue(key, default)`\n * - `onChange(listener)` → `growthbook.setRenderer(listener)` (single-renderer SDK constraint)\n *\n * @example\n * import { GrowthBook } from \"@growthbook/growthbook\";\n * import { FeatureFlagsProvider, createGrowthBookFeatureFlagsAdapter } from \"tempest-react-sdk\";\n *\n * const gb = new GrowthBook({ apiHost: \"...\", clientKey: \"...\" });\n * await gb.loadFeatures();\n * const adapter = createGrowthBookFeatureFlagsAdapter({ growthbook: gb });\n *\n * <FeatureFlagsProvider adapter={adapter}><App /></FeatureFlagsProvider>;\n */\nexport function createGrowthBookFeatureFlagsAdapter(\n options: CreateGrowthBookFeatureFlagsAdapterOptions,\n): FeatureFlagsAdapter {\n const { growthbook } = options;\n const listeners = new Set<() => void>();\n let rendererInstalled = false;\n\n function ensureRenderer(): void {\n if (rendererInstalled || !growthbook.setRenderer) return;\n rendererInstalled = true;\n growthbook.setRenderer(() => {\n for (const listener of listeners) listener();\n });\n }\n\n return {\n isEnabled(key: string, defaultValue = false) {\n const value = growthbook.isOn(key);\n if (typeof value === \"boolean\") return value;\n return defaultValue;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return growthbook.getFeatureValue(key, defaultValue as T);\n },\n onChange(listener) {\n ensureRenderer();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","import type { FeatureFlagsAdapter, FlagValue } from \"./types\";\n\n/**\n * Minimal subset of [`launchdarkly-js-client-sdk`](https://docs.launchdarkly.com/sdk/client-side/javascript)\n * used by the adapter. Pass an existing `LDClient`.\n */\nexport interface LDClientLike {\n variation: <T = unknown>(key: string, defaultValue: T) => T;\n on?: (event: string, handler: () => void) => void;\n off?: (event: string, handler: () => void) => void;\n}\n\nexport interface CreateLaunchDarklyFeatureFlagsAdapterOptions {\n /** The LaunchDarkly JS client. Required. */\n client: LDClientLike;\n}\n\n/**\n * Build a [[FeatureFlagsAdapter]] backed by a LaunchDarkly JS client. Apps\n * initialise the client themselves (`LDClient.initialize(envKey, ctx)`) and\n * pass it in.\n *\n * Mapping:\n * - `isEnabled(key, default)` → `client.variation(key, default) === true`\n * - `get(key, default)` → `client.variation(key, default)`\n * - `onChange(listener)` → `client.on(\"change\", listener)` / `client.off(\"change\", listener)`\n *\n * @example\n * import * as LDClient from \"launchdarkly-js-client-sdk\";\n * import { FeatureFlagsProvider, createLaunchDarklyFeatureFlagsAdapter } from \"tempest-react-sdk\";\n *\n * const client = LDClient.initialize(import.meta.env.VITE_LD_CLIENT_ID, { kind: \"user\", key: userId });\n * await client.waitUntilReady();\n * const adapter = createLaunchDarklyFeatureFlagsAdapter({ client });\n *\n * <FeatureFlagsProvider adapter={adapter}><App /></FeatureFlagsProvider>;\n */\nexport function createLaunchDarklyFeatureFlagsAdapter(\n options: CreateLaunchDarklyFeatureFlagsAdapterOptions,\n): FeatureFlagsAdapter {\n const { client } = options;\n\n return {\n isEnabled(key: string, defaultValue = false) {\n return client.variation<boolean>(key, defaultValue) === true;\n },\n get<T extends FlagValue = FlagValue>(key: string, defaultValue?: T): T {\n return client.variation<T>(key, defaultValue as T);\n },\n onChange(listener) {\n if (!client.on || !client.off) {\n return () => {};\n }\n client.on(\"change\", listener);\n return () => {\n client.off!(\"change\", listener);\n };\n },\n };\n}\n","export interface SharePayload {\n title?: string;\n text?: string;\n url?: string;\n /** Files to share (supported only on a subset of browsers). */\n files?: File[];\n}\n\nexport interface ShareResult {\n /** True when `navigator.share` resolved successfully. */\n shared: boolean;\n /** True when the platform did not support the requested payload. */\n unsupported: boolean;\n /** True when the user cancelled the share dialog. */\n cancelled: boolean;\n error?: unknown;\n}\n\n/**\n * Wrap the Web Share API with a uniform result object. Falls through to\n * `unsupported: true` when the browser lacks `navigator.share`, leaving the\n * caller free to render a custom fallback (copy-link, social buttons).\n */\nexport async function share(payload: SharePayload): Promise<ShareResult> {\n if (typeof navigator === \"undefined\" || !(\"share\" in navigator)) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n if (payload.files && !navigator.canShare?.({ files: payload.files })) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n try {\n await navigator.share(payload);\n return { shared: true, unsupported: false, cancelled: false };\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return { shared: false, unsupported: false, cancelled: true };\n }\n return { shared: false, unsupported: false, cancelled: false, error };\n }\n}\n\n/** True when the Web Share API is available in this environment. */\nexport function isShareSupported(): boolean {\n return typeof navigator !== \"undefined\" && \"share\" in navigator;\n}\n","import { share } from \"./share\";\n\n/** Options for {@link shareOrDownloadBlob}. */\nexport interface ShareOrDownloadOptions {\n /** Title passed to the Web Share dialog. Defaults to the file name. */\n title?: string;\n}\n\n/**\n * Try the Web Share API with the given `Blob` as a file; fall back to a\n * download anchor when the browser cannot share files (desktop Firefox, older\n * iOS Safari, etc.).\n *\n * A companion to {@link share} for the common \"export a generated artifact\"\n * flow: on mobile it opens the native share sheet, and everywhere else it\n * triggers a plain download. Returns early when the user shares or cancels the\n * dialog; otherwise it downloads.\n *\n * @param blob - The binary payload to share or download.\n * @param fileName - The file name presented to the user.\n * @param options - Optional `title` for the share dialog.\n * @returns A promise that resolves once the share or download completes.\n *\n * @example\n * const zip = new Blob([bytes], { type: \"application/zip\" });\n * await shareOrDownloadBlob(zip, \"export.zip\");\n */\nexport async function shareOrDownloadBlob(\n blob: Blob,\n fileName: string,\n options: ShareOrDownloadOptions = {},\n): Promise<void> {\n const file = new File([blob], fileName, { type: blob.type });\n const result = await share({ title: options.title ?? fileName, files: [file] });\n if (result.shared || result.cancelled) return;\n\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n}\n"],"names":["Accordion","items","multiple","value","defaultValue","onChange","className","reactId","useId","isControlled","internalOpen","setInternalOpen","useState","openIds","toggle","useCallback","id","isOpen","next","x","jsx","cn","styles","item","open","panelId","triggerId","jsxs","ChevronIcon","Alert","variant","appearance","title","description","icon","onClose","closeLabel","children","props","CloseIcon","AppBar","leading","showBack","onBack","backLabel","backIcon","brand","actions","centered","sticky","tone","bordered","safeArea","handleBack","leadingContent","Fragment","ArrowLeft","BREAKPOINTS","ORDER","resolveCurrent","width","current","key","useBreakpoint","setWidth","useEffect","onResize","above","bp","below","AppShell","navbar","sidebar","bottomNav","footer","sidebarBreakpoint","showSidebar","AspectRatio","ratio","style","finalStyle","getInitials","name","parts","Avatar","src","alt","size","status","onClick","errored","setErrored","initials","useMemo","showImage","role","tabIndex","event","Badge","shape","dot","Banner","action","dismissible","onDismiss","setOpen","BottomNavigation","showLabels","active","BottomSheet","showHandle","dismissOnBackdrop","dismissOnEsc","handler","e","previous","createPortal","Breadcrumbs","separator","index","isLast","interactive","Button","loading","fullWidth","iconOnly","pill","leftIcon","rightIcon","disabled","SpinnerIcon","Card","flush","elevation","hasHeader","Center","axis","minHeight","Checkbox","forwardRef","label","indeterminate","wrapperClassName","ref","innerRef","useRef","setRef","node","DashIcon","CheckIcon","ChipInput","placeholder","helperText","error","commitKeys","normalize","draft","setDraft","inputRef","commit","handleKeyDown","remove","chip","defaultFilter","option","query","Combobox","options","filter","emptyMessage","rootRef","setQuery","activeIndex","setActiveIndex","selectedLabel","o","filtered","closeAndReset","handleSelect","onDown","Modal","closeOnBackdrop","closeOnEsc","hideCloseButton","fullscreen","fullscreenOnMobile","previousOverflow","handleKey","sizeClassName","ConfirmDialog","confirmLabel","cancelLabel","onConfirm","onCancel","DatePicker","mode","Input","Divider","orientation","align","Drawer","placement","mobilePlacement","isMobile","effectivePlacement","placementClass","DropdownMenu","trigger","itemRefs","selectableIndexes","entry","i","close","onKey","prev","handleTriggerClick","triggerClone","el","Dropzone","onDrop","accept","maxSize","onReject","isDragging","setIsDragging","handleFiles","fileList","all","limited","accepted","rejected","file","openDialog","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","EmptyState","ErrorState","onRetry","retryLabel","AlertIcon","formatSize","bytes","matchesAccept","tokens","t","type","token","FileUpload","subtitle","dragging","setDragging","addFiles","incoming","UploadIcon","resolveGap","gap","fallback","resolveColumns","columns","Form","layout","FormSection","bodyStyle","FormRow","FormActions","Container","isResponsiveObject","pickResponsive","device","deviceFromBreakpoint","isTablet","Stack","direction","justify","wrap","finalDirection","justifyClass","Grid","templateColumns","finalGap","detectStandalone","matchesDisplayMode","iosStandalone","useBeforeInstallPrompt","deferred","setDeferred","installed","setInstalled","isStandalone","setIsStandalone","installedHandler","displayModeQuery","displayModeHandler","prompt","result","readDismissed","storageKey","InstallBanner","installLabel","dismissLabel","onResult","installable","dismissed","setDismissed","dismiss","X","InstallButton","Kbd","ModalsContext","createContext","ModalsProvider","stack","setStack","counter","nextId","closeAll","confirm","api","ContentModal","ConfirmModal","setLoading","handleConfirm","handleCancel","useModals","useContext","Navbar","logo","nav","TRICKLE_INTERVAL_MS","TRICKLE_CEILING","DONE_HIDE_DELAY_MS","clamp","n","createNProgress","state","listeners","trickleTimer","hideTimer","emit","listener","update","stopTrickle","clearHide","inc","amount","step","nprogress","NProgressBar","color","height","setState","Page","eyebrow","toolbar","padded","buildRange","page","totalPages","siblings","totalSlots","_","start","end","range","Pagination","onPageChange","pageSize","onPageSizeChange","pageSizeOptions","totalItems","siblingCount","pages","opt","DEFAULT_STRENGTH_LABELS","estimatePasswordStrength","score","PasswordInput","showStrength","strength","strengthLabels","toggleLabels","inputProps","revealed","setRevealed","stringValue","computedStrength","on","NUMERIC","ALNUM","PinInput","length","onComplete","masked","autoFocus","internalId","wrapperId","internal","setInternal","cells","inputsRef","pattern","trimmed","focusCell","safe","onCellChange","char","onCellKeyDown","onPaste","text","c","cell","Popover","onOpenChange","defaultOpen","closeOnOutsideClick","Progress","max","showLabel","pct","RadioGroupContext","Radio","checked","group","resolvedName","resolvedDisabled","isChecked","handleChange","RadioGroup","horizontal","generatedName","RangeSlider","min","formatValue","low","high","fillLeft","fillRight","valueText","handleLow","handleHigh","RatingStars","readonly","hover","setHover","displayed","handleClick","starIndex","filled","StarIcon","shouldRender","only","helpers","Show","Hide","ALL_EDGES","SafeArea","edges","inline","SearchBar","onClear","handleClear","SearchIcon","ClearIcon","SegmentedControl","ariaLabel","selected","Sidebar","header","collapsed","collapsedWidth","finalWidth","Skeleton","Spacer","Spinner","caption","overlay","inferTrend","delta","Stat","trend","hint","resolvedTrend","Stepper","steps","completed","swap","formatBytes","decimals","units","base","exponent","digits","formatCompactNumber","locale","StepperInput","format","labels","decrement","increment","display","canDecrement","canIncrement","Switch","Tag","onRemove","removeLabel","priorityClass","priority","Table","data","rowKey","onRowClick","stackOnMobile","column","row","content","Tabs","defaultId","activeId","firstEnabled","activate","isActive","Textarea","required","generatedId","textareaId","Timeline","connector","Tooltip","openDelay","tooltipId","timer","show","hide","cloneElement","ToastContext","useToast","ctx","ToastProvider","defaultDuration","position","toasts","setToasts","toast","ToastContainer","positionClass","ToastItem","VirtualList","itemHeight","renderItem","overscan","getKey","containerRef","scrollTop","setScrollTop","viewport","setViewport","element","observer","totalHeight","visibleCount","offset","CopyButton","timeout","onCopied","copied","setCopied","timerRef","PT_BR","EN","LOCALES","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","relativeTime","input","now","strings","target","diff","past","abs","RelativeTime","date","iso","Money","cents","currency","formatted","TruncateText","lines","mergedStyle","VisuallyHidden","as","createElement","Portal","container","mounted","setMounted","ClickOutside","onOutside","handlerRef","handle","ConditionalWrapper","condition","wrapper","For","each","ErrorText","Image","lazy","onError","currentSrc","setCurrentSrc","usedFallback","setUsedFallback","DataList","keyExtractor","empty","DescriptionList","Toggle","pressed","defaultPressed","onPressedChange","internalPressed","setInternalPressed","isPressed","ToggleGroupContext","useToggleGroupContext","normalizeArray","ToggleGroup","onValueChange","internalValue","setInternalValue","itemValue","isOn","v","ToggleGroupItem","isSelected","Label","Collapsible","contentId","handleToggle","isSeparator","ContextMenu","setPosition","menuRef","handleContextMenu","HoverCard","closeDelay","rest","clearTimer","scheduleOpen","scheduleClose","FOCUSABLE_SELECTOR","useFocusTrap","previouslyFocused","getFocusable","handleKeydown","elements","first","last","matchesQuery","keyword","groupItems","groups","indexByName","existing","Command","dialogRef","listId","normalized","visible","selectItem","renderIndex","ScrollArea","maxHeight","KEY_STEP","Resizable","defaultSize","setSize","paneA","paneB","isHorizontal","updateFromPointer","clientX","clientY","rect","total","percent","handlePointerDown","handleMove","moveEvent","handleUp","WEEKDAY_LABELS","MONTH_LABELS","DAYS_IN_GRID","makeDate","year","month","day","startOfDay","isSameDay","a","b","isOutOfRange","minDate","maxDate","buildGrid","weekStartsOn","monthIndex","Calendar","onMonthChange","isSelectionControlled","internalSelected","setInternalSelected","isMonthControlled","internalMonth","setInternalMonth","visibleMonth","focusedDay","setFocusedDay","gridRef","today","weekdayLabels","changeMonth","selectDate","clamped","grid","inMonth","isToday","isFocusTarget","Slider","MultiSelect","maxItems","selectedSet","selectedOptions","atMax","removeAt","optionValue","addMonths","isBetween","lo","hi","DateRangePicker","numberOfMonths","defaultMonth","setVisibleMonth","hovered","setHovered","previewEnd","dayState","isStart","isEnd","inRange","monthOffset","NavigationMenu","clickedIndex","setClickedIndex","baseId","openIndex","renderLeaf","child","childIndex","Menubar","menus","setOpenIndex","triggerRefs","menu","itemIndex","Carousel","loop","showArrows","showDots","defaultIndex","onIndexChange","count","internalIndex","setInternalIndex","goTo","atStart","atEnd","slide","slideIndex","dotIndex","usePagination","initialPage","initialSize","setPage","reset","useClientFilter","search","keysOrPredicate","term","useMediaQuery","matches","setMatches","list","useEventListener","eventName","resolvedTarget","defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","deserialize","read","setStored","setValue","resolved","onStorage","useToggle","initial","setTrue","setFalse","set","useAsync","asyncFn","deps","immediate","fnRef","callIdRef","mountedRef","run","callId","useOnline","online","setOnline","handleOnline","handleOffline","useDocumentVisibility","useIntersectionObserver","setEntry","once","root","rootMargin","threshold","nextEntry","useResizeObserver","entries","box","useClipboard","resetAfter","copy","textarea","shortcut","ctrl","meta","shift","isEditable","tag","useKeyboardShortcut","ignoreInput","DEFAULT_EVENTS","useIdle","idle","setIdle","useGeolocation","watch","positionOptions","onSuccess","watchId","useScrollLock","body","useStableCallback","callback","args","deepEqual","aKeys","bKeys","useDeepMemo","usePrevious","useInterval","fn","delay","useTimeout","useThrottle","throttled","setThrottled","lastEmitRef","pendingRef","elapsed","useWindowSize","useHover","onEnter","onLeave","useLongPress","moveThreshold","startX","startY","cancel","onMove","dx","dy","useDisclosure","opened","setOpened","handlers","useListState","setList","append","prepend","insert","indices","drop","reorder","from","to","moved","setItem","apply","clear","useCounter","setCount","useDocumentTitle","useFavicon","href","link","useMap","map","setMap","get","has","useSet","setSet","add","useQueue","initialValues","limit","cleanQueue","useClickOutside","useIsFirstRender","isFirst","useObjectUrl","blob","url","setUrl","useLongPressHandlers","onLongPress","delayMs","firedRef","callbackRef","onContextMenu","isIOS","ua","isAndroidWithoutPromptApi","isAndroid","buildOpenInChromeIntent","host","path","DEFAULT_DECLINE_COOLDOWN_MS","DEFAULT_MANUAL_FALLBACK_DELAY_MS","DEFAULT_DECLINE_STORAGE_KEY","cachedEvent","eventSubscribers","readDecline","cooldownMs","ts","useInstallPrompt","declineStorageKey","declineCooldownMs","manualFallbackDelayMs","setEvent","standalone","setStandalone","promptTimedOut","setPromptTimedOut","mq","ios","manualAndroid","declineActive","method","recordDecline","install","choice","compareValues","DataTable","searchable","searchKeys","initialSort","_row","setSearch","sort","setSort","effectiveSearchKeys","sample","sorted","factor","safePage","pageRows","toggleSort","tableColumns","indicator","ListTile","trailing","rootClassName","FloatingActionButton","extended","NavigationRail","labelVisibility","pad2","parseValue","match","hour24","minute","to12Hour","mod","to24Hour","hour12","period","TimePicker","minuteStep","use12Hours","hourCells","minuteCells","selectedHourDisplay","nextHour24","nextMinute","handleHour","displayHour","handleMinute","baseHour24","handlePeriod","nextPeriod","applyResistance","distance","cap","RefreshIndicator","onRefresh","startYRef","pull","setPull","refreshing","setRefreshing","engaged","handleTouchStart","touch","handleTouchMove","handleTouchEnd","showIndicator","progress","formatCurrency","formatDate","formatDateTime","formatPhone","formatCPF","formatPercent","storage","slugify","truncate","suffix","cut","capitalize","camelCase","words","word","lower","kebabCase","pluralize","singular","plural","groupBy","k","uniqueBy","seen","chunk","isPlainRecord","proto","pick","obj","keys","omit","exclude","deepMerge","source","sourceValue","targetValue","isEmpty","isDefined","isString","isNumber","isPlainObject","assertNever","message","debounce","wait","debounced","throttle","lastArgs","lastInvoke","invoke","remaining","pending","called","memoizeOne","hasCache","lastResult","sameArgs","sleep","ms","resolve","withTimeout","promise","reject","reason","randomId","prefix","time","rand","escapeXml","colLetter","index0","rem","toCell","cellXml","rowXml","rowIndex1","inner","buildSheetXml","rows","columnCount","dimension","CONTENT_TYPES_XML","ROOT_RELS_XML","WORKBOOK_XML","WORKBOOK_RELS_XML","writeXlsx","headers","headerRow","h","dataRows","allRows","sheetXml","encoder","archive","zipSync","TempestApiError","init","isApiError","buildApiError","sentRequestId","detail","code","details","requestId","parseRetryAfter","when","buildUrl","baseURL","params","isFormData","parseError","response","createApiClient","config","fetcher","authHeaders","rawRequest","isForm","finalHeaders","request","upload","formData","parseResponse","schema","context","issues","parseErrorBody","uploadWithProgress","getToken","withCredentials","onProgress","signal","parser","xhr","handleAbort","isSuccess","contentType","errorBody","err","retry","factory","retries","initialDelay","maxDelay","respectRetryAfter","shouldRetry","attempt","lastError","retryAfter","generateIdempotencyKey","r","usePoll","interval","stopWhen","setData","setError","stopped","inFlight","tick","createAuthStore","storageImpl","create","persist","user","createJSONStorage","AuthGuard","isAuthenticated","base64UrlDecode","padding","decodeJWT","headerSeg","payloadSeg","signature","isJWTExpired","leewaySeconds","payload","nowSeconds","lazyWithRetry","reloadOnFinalFailure","load","createRefreshQueue","refresh","defaultParseTokens","d","createTempestAuth","loginPath","refreshPath","mePath","storeName","parseTokens","parseUser","refreshBody","rt","useAuthStore","refreshKey","readRefreshToken","writeRefreshToken","s","bareApi","fetchUser","login","credentials","refreshToken","embedded","logout","AccessControlContext","AccessControlProvider","control","useAccessControl","useCan","paramsKey","cancelled","Can","resource","allowed","isLoading","resolvePermissions","roles","perm","createRoleAccessControl","granted","toPermissionList","permissionsFromToken","claim","primary","scopes","GoogleSignIn","Component","theme","disableOneTap","useOAuthCallback","exchange","setStatus","ranRef","STALE_TIME","CACHE_TIME","REFETCH_TIME","createQueryKeys","scope","output","QueryProvider","client","defaultOptions","internalClient","QueryClient","QueryClientProvider","isOffsetPage","isCursorPage","emptyOffsetPage","usePaginatedQuery","queryKey","queryFn","sizeParam","orderBy","ascending","queryOptions","pageNumber","setPageNumber","useQuery","keepPreviousData","pageCount","hasNext","hasPrev","p","useCursorQuery","useInfiniteQuery","pageParam","defaultBuildPath","createDataProvider","sortFieldParam","sortOrderParam","sortOrderAsBoolean","updateMethod","buildPath","provider","pagination","filters","order","requestOptions","ids","DataProviderContext","TempestDataProvider","useDataProvider","listQueryKey","oneQueryKey","useList","useOne","enabled","useCreate","queryClient","useQueryClient","useMutation","useUpdate","variables","useDelete","RouteGuard","redirectTo","replace","Navigate","defineRoutes","routes","lazyCache","resolveLazy","route","comp","GuardedElement","guard","toRouteElements","LazyComponent","Route","ROUTERS","BrowserRouter","HashRouter","MemoryRouter","AppRouter","router","basename","initialEntries","tree","Router","Suspense","Routes","createStore","initializer","partialize","version","migrate","createSelectors","store","bound","ThemeContext","applyResolved","attribute","themeColor","attrs","attr","readStored","ThemeProvider","defaultTheme","setThemeState","resolvedTheme","setResolvedTheme","targetRef","attributeKey","themeColorRef","setTheme","useTheme","interpolate","template","_match","lookup","catalog","direct","fallbackValue","createI18n","fallbackLocale","messages","formatNumber","opts","nextLocale","I18nContext","available","I18nProvider","initialLocale","availableLocales","setLocaleState","setLocale","useI18n","useTranslate","keysChanged","ErrorBoundary","info","previousProps","AppProviders","i18n","errorBoundary","defaultParser","createEventStream","namedEvents","heartbeatEvents","maxRetries","initialBackoff","maxBackoff","onOpen","onMessage","onStatusChange","retryTimer","closed","scheduleReconnect","connect","es","reconnect","useEventStream","lastMessage","setLastMessage","reconnectRef","onMessageRef","controller","urlBase64ToUint8Array","base64String","base64","rawData","buffer","isPushSupported","WebPushUnsupportedError","WebPushPermissionDeniedError","WebPushClient","registration","subscription","usePushSubscription","configRef","sub","supported","permission","setPermission","subscribed","setSubscribed","subscribe","unsubscribe","createAudioPlayer","play","volume","autoplay","stopPrevious","onEnded","audio","stop","defaultPlayer","getDefaultPlayer","playAudio","stopAudio","useAudio","playerRef","unlocked","setUnlocked","GenericDb","Dexie","tableName","indexes","createOfflineStore","databaseName","keyPath","ownerField","db","table","withOwner","owner","reverse","collection","changes","spec","localStorageWatermark","createOfflineSync","outbox","watermark","idPrefix","isOnline","inflight","push","summary","cause","since","cursor","serverTime","runOnce","startedAt","op","recordId","useErrorHandler","FormField","useFormContext","resolvedControl","Controller","field","fieldState","isValidElement","errorMessage","validateForm","values","errors","issue","zodResolver","_context","criteriaMode","useZodForm","useForm","digitsOnly","validateCPF","numbers","sum","check","validateCNPJ","weights1","weights2","formatCEP","formatCNPJ","unmask","maskedInput","mask","inputMode","CPFInput","CNPJInput","PhoneInput","CEPInput","formatCents","parseCents","MoneyInput","useViaCEP","cep","json","createWebSocket","protocols","pingInterval","pingPayload","socket","pingTimer","clearPing","startPing","ws","send","useWebSocket","controllerRef","DEFAULT_CIRCUITY_FACTOR","DEFAULT_CAR_SPEED_KMH","DEFAULT_MODE_DURATION_FACTORS","durationFactor","factors","estimateTravel","origin","destination","circuityFactor","carSpeedKmh","modeDurationFactors","distanceKm","haversineKm","durationMinutes","boundingBox","points","minLatitude","maxLatitude","minLongitude","maxLongitude","point","boundsCenter","bounds","expandBounds","latSpan","lonSpan","latPad","lonPad","createOSRMBackend","baseUrl","fetch","trimmedBaseUrl","routeOptions","coords","createPositionTracker","minDistanceKm","maxPoints","onUpdate","lastKept","handlePosition","handleError","usePositionTracker","autoStart","trackerOptions","setPoints","setDistanceKm","trackerRef","onErrorRef","tracker","LeafletTrajectory","m","NICE_KM_STEPS","pickScaleKm","kmPerPixel","maxPixels","maxKm","chosen","formatScale","km","TrajectoryMap","showGrid","showScale","strokeColor","tileUrl","tileAttribution","markers","onMarkerClick","measured","allPoints","svg","projection","fitProjection","pixels","polyline","startPixel","endPixel","currentPixel","centerCoord","center","eastRef","edgeKm","edgePixels","markerPixels","scale","f","marker","getInitialTheme","stored","themeInitScript","LEVELS","shouldLog","level","consoleSink","createLogger","sinks","namespace","sink","childNamespace","TelemetryContext","TelemetryProvider","adapter","useTelemetry","consoleTelemetryAdapter","userToSentry","email","traits","createSentryTelemetryAdapter","sentry","initOptions","flushTimeout","breadcrumbCategory","userToProperties","createPostHogTelemetryAdapter","posthog","FeatureFlagsContext","FeatureFlagsProvider","useAdapter","useFeatureFlag","useSyncExternalStore","useFlagValue","createInMemoryFlags","flags","notify","createGrowthBookFeatureFlagsAdapter","growthbook","rendererInstalled","ensureRenderer","createLaunchDarklyFeatureFlagsAdapter","share","isShareSupported","shareOrDownloadBlob","fileName","anchor"],"mappings":"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"}
|