tempest-react-sdk 0.4.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"tempest-react-sdk.js","sources":["../src/utils/cn.ts","../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.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/Input/Input.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.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/components/Kbd/Kbd.tsx","../src/components/Navbar/Navbar.tsx","../src/components/Page/Page.tsx","../src/components/Pagination/Pagination.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/Select/Select.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/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/Tooltip/Tooltip.tsx","../src/components/Toast/ToastProvider.tsx","../src/components/VirtualList/VirtualList.tsx","../src/hooks/use-debounce.ts","../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-before-install-prompt.ts","../src/hooks/use-idle.ts","../src/hooks/use-geolocation.ts","../src/hooks/use-scroll-lock.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-stable-callback.ts","../src/hooks/use-deep-memo.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/oauth/GoogleSignIn.tsx","../src/oauth/use-oauth-callback.ts","../src/query/constants.ts","../src/query/create-query-keys.ts","../src/query/QueryProvider.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/sw/register-service-worker.ts","../src/sw/create-push-handler.ts","../src/audio/audio-player.ts","../src/audio/use-audio.ts","../src/offline/create-offline-store.ts","../src/error-boundary/ErrorBoundary.tsx","../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/utils/format.ts","../src/forms/masked-inputs.tsx","../src/forms/use-viacep.ts","../src/ws/create-web-socket.ts","../src/ws/use-web-socket.ts","../src/theme/ThemeProvider.tsx","../src/theme/initial-theme.ts","../src/i18n/create-i18n.ts","../src/i18n/I18nProvider.tsx","../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/utils/storage.ts"],"sourcesContent":["type ClassValue = string | number | bigint | boolean | null | undefined | ClassValue[];\n\n/**\n * Tiny classnames helper. Accepts strings, falsy values and nested arrays.\n *\n * @param values - Class entries, conditionally truthy.\n * @returns A single space-joined class string.\n */\nexport function cn(...values: ClassValue[]): string {\n const out: string[] = [];\n for (const value of values) {\n if (value === null || value === undefined || value === false || value === true) {\n continue;\n }\n if (typeof value === \"string\") {\n if (value) out.push(value);\n } else if (typeof value === \"number\" || typeof value === \"bigint\") {\n out.push(String(value));\n } else if (Array.isArray(value)) {\n const nested = cn(...value);\n if (nested) out.push(nested);\n }\n }\n return out.join(\" \");\n}\n","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 { 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(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, useId } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Input.module.css\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n helperText?: string;\n error?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n wrapperClassName?: string;\n /** Visual size — drives height, padding and font via density-aware tokens. */\n size?: InputSize;\n}\n\n/**\n * Labelled text input with helper/error slots and optional adornment icons.\n * Forwards refs to the underlying `<input>` for integration with form libraries.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n label,\n helperText,\n error,\n leftIcon,\n rightIcon,\n wrapperClassName,\n className,\n id,\n required,\n size = \"md\",\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined;\n const sizeClass = size === \"sm\" ? styles.sizeSm : size === \"lg\" ? styles.sizeLg : styles.sizeMd;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={styles.field}>\n {leftIcon && <span className={styles.iconLeft}>{leftIcon}</span>}\n <input\n ref={ref}\n id={inputId}\n aria-invalid={!!error}\n aria-describedby={describedById}\n required={required}\n className={cn(\n styles.input,\n sizeClass,\n leftIcon && styles.hasLeftIcon,\n rightIcon && styles.hasRightIcon,\n className,\n )}\n {...props}\n />\n {rightIcon && <span className={styles.iconRight}>{rightIcon}</span>}\n </div>\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\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 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 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 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 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 { 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 { forwardRef, useId } from \"react\";\nimport type { SelectHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n helperText?: string;\n error?: string;\n options?: SelectOption[];\n placeholder?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Native `<select>` wrapper with label/helper/error slots. Either provide\n * `options` for a quick render, or pass `<option>` children directly.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n {\n label,\n helperText,\n error,\n options,\n placeholder,\n wrapperClassName,\n className,\n children,\n id,\n required,\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const selectId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={selectId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={styles.field}>\n <select\n ref={ref}\n id={selectId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.select, className)}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled hidden>\n {placeholder}\n </option>\n )}\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n {children}\n </select>\n <span className={styles.caret} aria-hidden>\n <CaretIcon />\n </span>\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\nfunction CaretIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\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 \"./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 { 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 label?: string;\n}\n\n/** Loading spinner with preset sizes (xs..xl). Provide `label` for screen readers. */\nexport function Spinner({ size = \"md\", className, label = \"Carregando\" }: SpinnerProps) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\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","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 { 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 { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\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 { 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 /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\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\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 };\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\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 prompt,\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 { 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 { 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 type { ApiClient, ApiClientConfig, ApiError, 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): Promise<ApiError> {\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 const detail =\n (typeof body === \"object\" && body !== null\n ? ((body as Record<string, unknown>).detail ??\n (body as Record<string, unknown>).message)\n : undefined) ?? `Erro ${response.status}`;\n return {\n status: response.status,\n detail: String(detail),\n body,\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(path: string, options: RequestOptions): 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 ...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 let response = await rawRequest(path, options);\n\n if (response.status === 401) {\n if (config.refresh) {\n try {\n await config.refresh();\n response = await rawRequest(path, options);\n } catch {\n await config.onUnauthorized?.(response);\n throw await parseError(response);\n }\n } else {\n await config.onUnauthorized?.(response);\n }\n }\n\n if (!response.ok) {\n throw await parseError(response);\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 type { ApiError } from \"./types\";\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\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 throw an {@link ApiError}.\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 } = 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 finalHeaders: Record<string, string> = { ...headers };\n if (token && !(\"Authorization\" in finalHeaders)) {\n finalHeaders.Authorization = `Bearer ${token}`;\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 const detail =\n (typeof errorBody === \"object\" && errorBody !== null\n ? ((errorBody as Record<string, unknown>).detail ??\n (errorBody as Record<string, unknown>).message)\n : undefined) ?? `Erro ${xhr.status}`;\n const error: ApiError = {\n status: xhr.status,\n detail: String(detail),\n body: errorBody,\n };\n reject(error);\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({ status: 0, detail: \"Falha de rede no upload.\" } as ApiError);\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 * 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 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 delay = 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 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","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 RegisterServiceWorkerOptions {\n /** Public URL of the compiled service worker file (e.g. `/sw.js`). */\n url: string;\n /** SW scope (default: SW directory). */\n scope?: string;\n /** Called once the registration is active. */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /**\n * Called when a new worker has finished installing while another worker\n * still controls the page. The host app typically prompts the user to\n * reload and then calls {@link skipWaiting} on the returned worker.\n */\n onUpdate?: (waiting: ServiceWorker, registration: ServiceWorkerRegistration) => void;\n /** Called on registration failure. */\n onError?: (error: unknown) => void;\n}\n\n/**\n * Register a service worker with consistent update-detection wiring.\n *\n * Skips silently when the runtime has no `serviceWorker` support. The host\n * app keeps full control over the SW file — this helper only handles the\n * boilerplate around `register()` and `updatefound`.\n *\n * @returns The registration when it succeeds, or `null` when unsupported.\n */\nexport async function registerServiceWorker(\n options: RegisterServiceWorkerOptions,\n): Promise<ServiceWorkerRegistration | null> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return null;\n }\n\n try {\n const registration = await navigator.serviceWorker.register(options.url, {\n scope: options.scope,\n });\n\n if (registration.active) options.onReady?.(registration);\n\n registration.addEventListener(\"updatefound\", () => {\n const installing = registration.installing;\n if (!installing) return;\n installing.addEventListener(\"statechange\", () => {\n if (installing.state === \"installed\" && navigator.serviceWorker.controller) {\n options.onUpdate?.(installing, registration);\n }\n });\n });\n\n return registration;\n } catch (error) {\n options.onError?.(error);\n return null;\n }\n}\n\n/**\n * Tell a waiting worker to activate immediately. Pair with `onUpdate` to roll\n * out updates after the user confirms a reload prompt.\n */\nexport function skipWaiting(worker: ServiceWorker): void {\n worker.postMessage({ type: \"SKIP_WAITING\" });\n}\n\n/**\n * Unregister all registered service workers for this origin.\n *\n * @returns Number of workers that were unregistered.\n */\nexport async function unregisterAllServiceWorkers(): Promise<number> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) return 0;\n const registrations = await navigator.serviceWorker.getRegistrations();\n let count = 0;\n for (const registration of registrations) {\n const result = await registration.unregister();\n if (result) count += 1;\n }\n return count;\n}\n","/**\n * Service-worker context helpers for handling `push` and `notificationclick`\n * events. Import these inside your own `sw.ts` — they expect to run in the\n * service-worker global scope, not in the main thread.\n *\n * @example\n * /// <reference lib=\"webworker\" />\n * import { installPushHandler, installNotificationClickHandler } from \"tempest-react-sdk\";\n *\n * installPushHandler({ defaultIcon: \"/icons/Logo.png\" });\n * installNotificationClickHandler();\n */\n\ninterface SwGlobal {\n registration: {\n showNotification(title: string, options?: NotificationOptions): Promise<void>;\n };\n clients: {\n matchAll(options: { type: \"window\"; includeUncontrolled?: boolean }): Promise<\n {\n url: string;\n focused: boolean;\n focus(): Promise<unknown>;\n navigate(url: string): Promise<unknown>;\n }[]\n >;\n openWindow(url: string): Promise<unknown>;\n };\n addEventListener(\n type: \"push\",\n listener: (event: {\n data: { json(): unknown; text(): string } | null;\n waitUntil(promise: Promise<unknown>): void;\n }) => void,\n ): void;\n addEventListener(\n type: \"notificationclick\",\n listener: (event: {\n notification: { close(): void; data?: unknown };\n waitUntil(promise: Promise<unknown>): void;\n }) => void,\n ): void;\n skipWaiting(): Promise<void>;\n}\n\nfunction getSwScope(): SwGlobal {\n return globalThis as unknown as SwGlobal;\n}\n\nexport interface PushPayload {\n title?: string;\n body?: string;\n icon?: string;\n badge?: string;\n image?: string;\n tag?: string;\n url?: string;\n /** Arbitrary extra data forwarded to `event.notification.data`. */\n data?: Record<string, unknown>;\n}\n\nexport interface InstallPushHandlerOptions {\n /** Title used when the payload omits one. */\n defaultTitle?: string;\n /** Icon used when the payload omits one. */\n defaultIcon?: string;\n /** Badge image (mobile). */\n defaultBadge?: string;\n /**\n * Transform the raw payload before showing the notification. Return `null`\n * to suppress the notification entirely (e.g. silent pings).\n */\n transform?: (payload: PushPayload) => PushPayload | null;\n}\n\n/**\n * Install a `push` event listener that parses the payload as JSON (with a\n * plain-text fallback) and shows a notification.\n */\nexport function installPushHandler(options: InstallPushHandlerOptions = {}): void {\n const sw = getSwScope();\n const { defaultTitle = \"Notificação\", defaultIcon, defaultBadge, transform } = options;\n\n sw.addEventListener(\"push\", (event) => {\n if (!event.data) return;\n\n let raw: PushPayload;\n try {\n raw = event.data.json() as PushPayload;\n } catch {\n raw = { title: defaultTitle, body: event.data.text() };\n }\n\n const payload = transform ? transform(raw) : raw;\n if (!payload) return;\n\n const title = payload.title ?? defaultTitle;\n const notification: NotificationOptions & { image?: string } = {\n body: payload.body,\n icon: payload.icon ?? defaultIcon,\n badge: payload.badge ?? defaultBadge,\n image: payload.image,\n tag: payload.tag,\n data: { url: payload.url ?? \"/\", ...(payload.data ?? {}) },\n };\n\n event.waitUntil(sw.registration.showNotification(title, notification));\n });\n}\n\nexport interface InstallNotificationClickHandlerOptions {\n /** Resolve the destination URL from the notification data. Default: `data.url`. */\n resolveUrl?: (data: unknown) => string;\n}\n\n/**\n * Install a `notificationclick` handler that focuses an existing client when\n * possible and falls back to opening a new window.\n */\nexport function installNotificationClickHandler(\n options: InstallNotificationClickHandlerOptions = {},\n): void {\n const sw = getSwScope();\n const resolveUrl =\n options.resolveUrl ??\n ((data: unknown) => {\n if (typeof data === \"string\") return data;\n if (data && typeof data === \"object\" && \"url\" in data) {\n const url = (data as Record<string, unknown>).url;\n return typeof url === \"string\" ? url : \"/\";\n }\n return \"/\";\n });\n\n sw.addEventListener(\"notificationclick\", (event) => {\n event.notification.close();\n const target = resolveUrl(event.notification.data);\n\n event.waitUntil(\n (async () => {\n const clients = await sw.clients.matchAll({\n type: \"window\",\n includeUncontrolled: true,\n });\n for (const client of clients) {\n if (client.url.includes(target)) {\n return client.focus();\n }\n }\n return sw.clients.openWindow(target);\n })(),\n );\n });\n}\n\n/**\n * Install a `message` listener that activates a waiting worker when the host\n * app sends `{ type: \"SKIP_WAITING\" }`.\n */\nexport function installSkipWaitingListener(): void {\n const sw = getSwScope() as SwGlobal & {\n addEventListener(\n type: \"message\",\n listener: (event: { data?: { type?: string } }) => void,\n ): void;\n };\n sw.addEventListener(\"message\", (event) => {\n if (event.data?.type === \"SKIP_WAITING\") {\n void sw.skipWaiting();\n }\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 { 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 { 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","/**\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","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 {\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 `data-tempest-theme` attribute. Defaults to\n * `document.documentElement`. Override when scoping the theme to a subtree.\n */\n target?: () => HTMLElement | null;\n /** Attribute name written on the target. Default: `\"data-tempest-theme\"`. */\n attribute?: 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\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}: 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 useEffect(() => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next = resolve(theme);\n element.setAttribute(attribute, next);\n setResolvedTheme(next);\n }, [theme, attribute]);\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 const next: ResolvedTheme = list.matches ? \"dark\" : \"light\";\n element?.setAttribute(attribute, next);\n setResolvedTheme(next);\n };\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n }, [theme, attribute]);\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","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 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","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","/**\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"],"names":["cn","values","out","value","nested","Accordion","items","multiple","defaultValue","onChange","className","reactId","useId","isControlled","internalOpen","setInternalOpen","useState","openIds","toggle","useCallback","id","isOpen","next","x","jsx","styles","item","open","panelId","triggerId","jsxs","ChevronIcon","Alert","variant","appearance","title","description","icon","onClose","closeLabel","children","props","CloseIcon","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","Fragment","Button","loading","fullWidth","iconOnly","pill","leftIcon","rightIcon","disabled","SpinnerIcon","Card","actions","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","Input","required","generatedId","inputId","describedById","sizeClass","DatePicker","mode","Divider","orientation","align","Drawer","placement","mobilePlacement","isMobile","effectivePlacement","placementClass","DropdownMenu","trigger","itemRefs","selectableIndexes","entry","i","close","onKey","prev","handleTriggerClick","triggerClone","el","EmptyState","ErrorState","onRetry","retryLabel","AlertIcon","formatSize","bytes","matchesAccept","file","accept","tokens","t","type","token","FileUpload","maxSize","onReject","subtitle","dragging","setDragging","addFiles","incoming","accepted","rejected","handleDrop","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","Kbd","Navbar","logo","nav","sticky","tone","bordered","Page","eyebrow","toolbar","padded","buildRange","page","totalPages","siblings","totalSlots","_","start","end","range","Pagination","onPageChange","pageSize","onPageSizeChange","pageSizeOptions","totalItems","siblingCount","pages","opt","Popover","onOpenChange","defaultOpen","closeOnOutsideClick","Progress","max","showLabel","pct","RadioGroupContext","createContext","Radio","checked","group","useContext","resolvedName","resolvedDisabled","isChecked","handleChange","RadioGroup","horizontal","generatedName","internal","setInternal","RangeSlider","min","step","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","Select","selectId","CaretIcon","Sidebar","header","collapsed","collapsedWidth","finalWidth","Skeleton","height","Spacer","Spinner","inferTrend","delta","trimmed","Stat","trend","hint","resolvedTrend","Stepper","steps","completed","Switch","Tag","onRemove","removeLabel","priorityClass","priority","Table","data","rowKey","onRowClick","stackOnMobile","column","row","content","Tabs","defaultId","activeId","firstEnabled","activate","isActive","Textarea","textareaId","Tooltip","openDelay","tooltipId","timer","show","hide","cloneElement","ToastContext","useToast","ctx","ToastProvider","defaultDuration","position","toasts","setToasts","counter","dismiss","toast","api","ToastContainer","positionClass","ToastItem","VirtualList","itemHeight","renderItem","overscan","getKey","containerRef","scrollTop","setScrollTop","viewport","setViewport","element","observer","totalHeight","visibleCount","offset","useDebounce","delay","debouncedValue","setDebouncedValue","usePagination","initialPage","initialSize","setPage","setSize","reset","useClientFilter","search","keysOrPredicate","term","useMediaQuery","matches","setMatches","list","useEventListener","eventName","target","handlerRef","resolvedTarget","listener","defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","deserialize","read","setStored","setValue","resolved","onStorage","useToggle","initial","setTrue","setFalse","set","useAsync","asyncFn","deps","immediate","state","setState","fnRef","callIdRef","mountedRef","run","callId","useOnline","online","setOnline","handleOnline","handleOffline","useDocumentVisibility","useIntersectionObserver","setEntry","once","root","rootMargin","threshold","nextEntry","useResizeObserver","entries","box","useClipboard","resetAfter","copied","setCopied","copy","text","textarea","shortcut","ctrl","meta","shift","isEditable","tag","useKeyboardShortcut","ignoreInput","useBeforeInstallPrompt","deferred","setDeferred","installed","setInstalled","installedHandler","prompt","result","DEFAULT_EVENTS","useIdle","timeout","idle","setIdle","useGeolocation","watch","positionOptions","onSuccess","onError","watchId","useScrollLock","body","FOCUSABLE_SELECTOR","useFocusTrap","container","previouslyFocused","getFocusable","handleKeydown","elements","first","last","useStableCallback","callback","args","deepEqual","a","b","aKeys","bKeys","useDeepMemo","buildUrl","baseURL","path","params","url","isFormData","parseError","response","detail","createApiClient","config","fetcher","authHeaders","rawRequest","headers","rest","isForm","finalHeaders","init","request","upload","formData","method","parseResponse","schema","context","issues","parseErrorBody","uploadWithProgress","getToken","withCredentials","onProgress","signal","parser","resolve","reject","xhr","handleAbort","isSuccess","contentType","errorBody","err","wait","ms","retry","factory","retries","initialDelay","maxDelay","shouldRetry","attempt","lastError","generateIdempotencyKey","c","r","usePoll","interval","stopWhen","setData","setError","setLoading","stopped","inFlight","tick","createAuthStore","storageImpl","create","persist","user","createJSONStorage","AuthGuard","isAuthenticated","base64UrlDecode","input","padding","decodeJWT","headerSeg","payloadSeg","signature","isJWTExpired","leewaySeconds","payload","nowSeconds","lazyWithRetry","reloadOnFinalFailure","load","lazy","createRefreshQueue","refresh","GoogleSignIn","Component","locale","theme","disableOneTap","useOAuthCallback","exchange","setStatus","ranRef","cancelled","STALE_TIME","CACHE_TIME","REFETCH_TIME","createQueryKeys","scope","output","QueryProvider","client","defaultOptions","internalClient","QueryClient","QueryClientProvider","defaultParser","createEventStream","namedEvents","heartbeatEvents","maxRetries","initialBackoff","maxBackoff","onOpen","onMessage","onStatusChange","source","retryTimer","closed","emit","scheduleReconnect","connect","es","reconnect","useEventStream","enabled","lastMessage","setLastMessage","reconnectRef","onMessageRef","controller","message","urlBase64ToUint8Array","base64String","base64","rawData","buffer","isPushSupported","WebPushUnsupportedError","WebPushPermissionDeniedError","WebPushClient","registration","existing","subscription","usePushSubscription","configRef","sub","supported","permission","setPermission","subscribed","setSubscribed","subscribe","unsubscribe","registerServiceWorker","installing","skipWaiting","worker","unregisterAllServiceWorkers","registrations","count","getSwScope","installPushHandler","sw","defaultTitle","defaultIcon","defaultBadge","transform","notification","installNotificationClickHandler","resolveUrl","clients","installSkipWaitingListener","createAudioPlayer","play","volume","loop","autoplay","stopPrevious","onEnded","audio","stop","defaultPlayer","getDefaultPlayer","playAudio","stopAudio","useAudio","playerRef","unlocked","setUnlocked","GenericDb","Dexie","version","tableName","indexes","createOfflineStore","databaseName","keyPath","ownerField","db","table","withOwner","owner","orderBy","reverse","limit","collection","changes","spec","keysChanged","ErrorBoundary","info","previousProps","useErrorHandler","FormField","control","useFormContext","resolvedControl","Controller","field","fieldState","isValidElement","errorMessage","validateForm","errors","issue","zodResolver","_context","criteriaMode","useZodForm","useForm","digitsOnly","validateCPF","digits","numbers","sum","check","validateCNPJ","weights1","weights2","formatCEP","formatCNPJ","unmask","formatCurrency","formatDate","date","formatDateTime","formatPhone","formatCPF","formatPercent","maskedInput","mask","inputMode","CPFInput","CNPJInput","PhoneInput","CEPInput","formatCents","cents","currency","parseCents","MoneyInput","useViaCEP","lookup","cep","json","createWebSocket","protocols","pingInterval","pingPayload","socket","pingTimer","clearPing","startPing","ws","send","code","reason","useWebSocket","controllerRef","ThemeContext","readStored","storageKey","ThemeProvider","defaultTheme","attribute","setThemeState","resolvedTheme","setResolvedTheme","targetRef","setTheme","useTheme","getInitialTheme","stored","themeInitScript","interpolate","template","_match","catalog","direct","fallbackValue","createI18n","fallbackLocale","messages","plural","formatNumber","opts","nextLocale","I18nContext","available","I18nProvider","initialLocale","availableLocales","setLocaleState","setLocale","useI18n","useTranslate","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","get","useSyncExternalStore","useFlagValue","createInMemoryFlags","flags","listeners","notify","createGrowthBookFeatureFlagsAdapter","growthbook","rendererInstalled","ensureRenderer","createLaunchDarklyFeatureFlagsAdapter","share","isShareSupported","storage"],"mappings":"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"}
1
+ {"version":3,"file":"tempest-react-sdk.js","sources":["../src/utils/cn.ts","../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.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/Input/Input.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.tsx","../src/components/DropdownMenu/DropdownMenu.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/components/Kbd/Kbd.tsx","../src/components/Navbar/Navbar.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/Select/Select.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/hooks/use-debounce.ts","../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-before-install-prompt.ts","../src/hooks/use-idle.ts","../src/hooks/use-geolocation.ts","../src/hooks/use-scroll-lock.ts","../src/hooks/use-focus-trap.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/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/oauth/GoogleSignIn.tsx","../src/oauth/use-oauth-callback.ts","../src/query/constants.ts","../src/query/create-query-keys.ts","../src/query/QueryProvider.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/sw/register-service-worker.ts","../src/sw/create-push-handler.ts","../src/audio/audio-player.ts","../src/audio/use-audio.ts","../src/offline/create-offline-store.ts","../src/error-boundary/ErrorBoundary.tsx","../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/utils/format.ts","../src/forms/masked-inputs.tsx","../src/forms/use-viacep.ts","../src/ws/create-web-socket.ts","../src/ws/use-web-socket.ts","../src/theme/ThemeProvider.tsx","../src/theme/initial-theme.ts","../src/i18n/create-i18n.ts","../src/i18n/I18nProvider.tsx","../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/utils/storage.ts","../src/utils/strings.ts","../src/utils/relative-time.ts"],"sourcesContent":["type ClassValue = string | number | bigint | boolean | null | undefined | ClassValue[];\n\n/**\n * Tiny classnames helper. Accepts strings, falsy values and nested arrays.\n *\n * @param values - Class entries, conditionally truthy.\n * @returns A single space-joined class string.\n */\nexport function cn(...values: ClassValue[]): string {\n const out: string[] = [];\n for (const value of values) {\n if (value === null || value === undefined || value === false || value === true) {\n continue;\n }\n if (typeof value === \"string\") {\n if (value) out.push(value);\n } else if (typeof value === \"number\" || typeof value === \"bigint\") {\n out.push(String(value));\n } else if (Array.isArray(value)) {\n const nested = cn(...value);\n if (nested) out.push(nested);\n }\n }\n return out.join(\" \");\n}\n","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 { 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(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, useId } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Input.module.css\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n helperText?: string;\n error?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n wrapperClassName?: string;\n /** Visual size — drives height, padding and font via density-aware tokens. */\n size?: InputSize;\n}\n\n/**\n * Labelled text input with helper/error slots and optional adornment icons.\n * Forwards refs to the underlying `<input>` for integration with form libraries.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n label,\n helperText,\n error,\n leftIcon,\n rightIcon,\n wrapperClassName,\n className,\n id,\n required,\n size = \"md\",\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined;\n const sizeClass = size === \"sm\" ? styles.sizeSm : size === \"lg\" ? styles.sizeLg : styles.sizeMd;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={styles.field}>\n {leftIcon && <span className={styles.iconLeft}>{leftIcon}</span>}\n <input\n ref={ref}\n id={inputId}\n aria-invalid={!!error}\n aria-describedby={describedById}\n required={required}\n className={cn(\n styles.input,\n sizeClass,\n leftIcon && styles.hasLeftIcon,\n rightIcon && styles.hasRightIcon,\n className,\n )}\n {...props}\n />\n {rightIcon && <span className={styles.iconRight}>{rightIcon}</span>}\n </div>\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\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 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 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 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 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 { forwardRef, useId } from \"react\";\nimport type { SelectHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n helperText?: string;\n error?: string;\n options?: SelectOption[];\n placeholder?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Native `<select>` wrapper with label/helper/error slots. Either provide\n * `options` for a quick render, or pass `<option>` children directly.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n {\n label,\n helperText,\n error,\n options,\n placeholder,\n wrapperClassName,\n className,\n children,\n id,\n required,\n ...props\n },\n ref,\n) {\n const generatedId = useId();\n const selectId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={selectId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <div className={styles.field}>\n <select\n ref={ref}\n id={selectId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.select, className)}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled hidden>\n {placeholder}\n </option>\n )}\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n {children}\n </select>\n <span className={styles.caret} aria-hidden>\n <CaretIcon />\n </span>\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\nfunction CaretIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\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 \"./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 { 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 label?: string;\n}\n\n/** Loading spinner with preset sizes (xs..xl). Provide `label` for screen readers. */\nexport function Spinner({ size = \"md\", className, label = \"Carregando\" }: SpinnerProps) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\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","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 { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\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 { 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 /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\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\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 };\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\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 prompt,\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 { 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 { 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 type { ApiClient, ApiClientConfig, ApiError, 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): Promise<ApiError> {\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 const detail =\n (typeof body === \"object\" && body !== null\n ? ((body as Record<string, unknown>).detail ??\n (body as Record<string, unknown>).message)\n : undefined) ?? `Erro ${response.status}`;\n return {\n status: response.status,\n detail: String(detail),\n body,\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(path: string, options: RequestOptions): 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 ...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 let response = await rawRequest(path, options);\n\n if (response.status === 401) {\n if (config.refresh) {\n try {\n await config.refresh();\n response = await rawRequest(path, options);\n } catch {\n await config.onUnauthorized?.(response);\n throw await parseError(response);\n }\n } else {\n await config.onUnauthorized?.(response);\n }\n }\n\n if (!response.ok) {\n throw await parseError(response);\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 type { ApiError } from \"./types\";\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\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 throw an {@link ApiError}.\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 } = 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 finalHeaders: Record<string, string> = { ...headers };\n if (token && !(\"Authorization\" in finalHeaders)) {\n finalHeaders.Authorization = `Bearer ${token}`;\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 const detail =\n (typeof errorBody === \"object\" && errorBody !== null\n ? ((errorBody as Record<string, unknown>).detail ??\n (errorBody as Record<string, unknown>).message)\n : undefined) ?? `Erro ${xhr.status}`;\n const error: ApiError = {\n status: xhr.status,\n detail: String(detail),\n body: errorBody,\n };\n reject(error);\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({ status: 0, detail: \"Falha de rede no upload.\" } as ApiError);\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 * 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 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 delay = 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 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","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 RegisterServiceWorkerOptions {\n /** Public URL of the compiled service worker file (e.g. `/sw.js`). */\n url: string;\n /** SW scope (default: SW directory). */\n scope?: string;\n /** Called once the registration is active. */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /**\n * Called when a new worker has finished installing while another worker\n * still controls the page. The host app typically prompts the user to\n * reload and then calls {@link skipWaiting} on the returned worker.\n */\n onUpdate?: (waiting: ServiceWorker, registration: ServiceWorkerRegistration) => void;\n /** Called on registration failure. */\n onError?: (error: unknown) => void;\n}\n\n/**\n * Register a service worker with consistent update-detection wiring.\n *\n * Skips silently when the runtime has no `serviceWorker` support. The host\n * app keeps full control over the SW file — this helper only handles the\n * boilerplate around `register()` and `updatefound`.\n *\n * @returns The registration when it succeeds, or `null` when unsupported.\n */\nexport async function registerServiceWorker(\n options: RegisterServiceWorkerOptions,\n): Promise<ServiceWorkerRegistration | null> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) {\n return null;\n }\n\n try {\n const registration = await navigator.serviceWorker.register(options.url, {\n scope: options.scope,\n });\n\n if (registration.active) options.onReady?.(registration);\n\n registration.addEventListener(\"updatefound\", () => {\n const installing = registration.installing;\n if (!installing) return;\n installing.addEventListener(\"statechange\", () => {\n if (installing.state === \"installed\" && navigator.serviceWorker.controller) {\n options.onUpdate?.(installing, registration);\n }\n });\n });\n\n return registration;\n } catch (error) {\n options.onError?.(error);\n return null;\n }\n}\n\n/**\n * Tell a waiting worker to activate immediately. Pair with `onUpdate` to roll\n * out updates after the user confirms a reload prompt.\n */\nexport function skipWaiting(worker: ServiceWorker): void {\n worker.postMessage({ type: \"SKIP_WAITING\" });\n}\n\n/**\n * Unregister all registered service workers for this origin.\n *\n * @returns Number of workers that were unregistered.\n */\nexport async function unregisterAllServiceWorkers(): Promise<number> {\n if (typeof navigator === \"undefined\" || !(\"serviceWorker\" in navigator)) return 0;\n const registrations = await navigator.serviceWorker.getRegistrations();\n let count = 0;\n for (const registration of registrations) {\n const result = await registration.unregister();\n if (result) count += 1;\n }\n return count;\n}\n","/**\n * Service-worker context helpers for handling `push` and `notificationclick`\n * events. Import these inside your own `sw.ts` — they expect to run in the\n * service-worker global scope, not in the main thread.\n *\n * @example\n * /// <reference lib=\"webworker\" />\n * import { installPushHandler, installNotificationClickHandler } from \"tempest-react-sdk\";\n *\n * installPushHandler({ defaultIcon: \"/icons/Logo.png\" });\n * installNotificationClickHandler();\n */\n\ninterface SwGlobal {\n registration: {\n showNotification(title: string, options?: NotificationOptions): Promise<void>;\n };\n clients: {\n matchAll(options: { type: \"window\"; includeUncontrolled?: boolean }): Promise<\n {\n url: string;\n focused: boolean;\n focus(): Promise<unknown>;\n navigate(url: string): Promise<unknown>;\n }[]\n >;\n openWindow(url: string): Promise<unknown>;\n };\n addEventListener(\n type: \"push\",\n listener: (event: {\n data: { json(): unknown; text(): string } | null;\n waitUntil(promise: Promise<unknown>): void;\n }) => void,\n ): void;\n addEventListener(\n type: \"notificationclick\",\n listener: (event: {\n notification: { close(): void; data?: unknown };\n waitUntil(promise: Promise<unknown>): void;\n }) => void,\n ): void;\n skipWaiting(): Promise<void>;\n}\n\nfunction getSwScope(): SwGlobal {\n return globalThis as unknown as SwGlobal;\n}\n\nexport interface PushPayload {\n title?: string;\n body?: string;\n icon?: string;\n badge?: string;\n image?: string;\n tag?: string;\n url?: string;\n /** Arbitrary extra data forwarded to `event.notification.data`. */\n data?: Record<string, unknown>;\n}\n\nexport interface InstallPushHandlerOptions {\n /** Title used when the payload omits one. */\n defaultTitle?: string;\n /** Icon used when the payload omits one. */\n defaultIcon?: string;\n /** Badge image (mobile). */\n defaultBadge?: string;\n /**\n * Transform the raw payload before showing the notification. Return `null`\n * to suppress the notification entirely (e.g. silent pings).\n */\n transform?: (payload: PushPayload) => PushPayload | null;\n}\n\n/**\n * Install a `push` event listener that parses the payload as JSON (with a\n * plain-text fallback) and shows a notification.\n */\nexport function installPushHandler(options: InstallPushHandlerOptions = {}): void {\n const sw = getSwScope();\n const { defaultTitle = \"Notificação\", defaultIcon, defaultBadge, transform } = options;\n\n sw.addEventListener(\"push\", (event) => {\n if (!event.data) return;\n\n let raw: PushPayload;\n try {\n raw = event.data.json() as PushPayload;\n } catch {\n raw = { title: defaultTitle, body: event.data.text() };\n }\n\n const payload = transform ? transform(raw) : raw;\n if (!payload) return;\n\n const title = payload.title ?? defaultTitle;\n const notification: NotificationOptions & { image?: string } = {\n body: payload.body,\n icon: payload.icon ?? defaultIcon,\n badge: payload.badge ?? defaultBadge,\n image: payload.image,\n tag: payload.tag,\n data: { url: payload.url ?? \"/\", ...(payload.data ?? {}) },\n };\n\n event.waitUntil(sw.registration.showNotification(title, notification));\n });\n}\n\nexport interface InstallNotificationClickHandlerOptions {\n /** Resolve the destination URL from the notification data. Default: `data.url`. */\n resolveUrl?: (data: unknown) => string;\n}\n\n/**\n * Install a `notificationclick` handler that focuses an existing client when\n * possible and falls back to opening a new window.\n */\nexport function installNotificationClickHandler(\n options: InstallNotificationClickHandlerOptions = {},\n): void {\n const sw = getSwScope();\n const resolveUrl =\n options.resolveUrl ??\n ((data: unknown) => {\n if (typeof data === \"string\") return data;\n if (data && typeof data === \"object\" && \"url\" in data) {\n const url = (data as Record<string, unknown>).url;\n return typeof url === \"string\" ? url : \"/\";\n }\n return \"/\";\n });\n\n sw.addEventListener(\"notificationclick\", (event) => {\n event.notification.close();\n const target = resolveUrl(event.notification.data);\n\n event.waitUntil(\n (async () => {\n const clients = await sw.clients.matchAll({\n type: \"window\",\n includeUncontrolled: true,\n });\n for (const client of clients) {\n if (client.url.includes(target)) {\n return client.focus();\n }\n }\n return sw.clients.openWindow(target);\n })(),\n );\n });\n}\n\n/**\n * Install a `message` listener that activates a waiting worker when the host\n * app sends `{ type: \"SKIP_WAITING\" }`.\n */\nexport function installSkipWaitingListener(): void {\n const sw = getSwScope() as SwGlobal & {\n addEventListener(\n type: \"message\",\n listener: (event: { data?: { type?: string } }) => void,\n ): void;\n };\n sw.addEventListener(\"message\", (event) => {\n if (event.data?.type === \"SKIP_WAITING\") {\n void sw.skipWaiting();\n }\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 { 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 { 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","/**\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","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 {\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 `data-tempest-theme` attribute. Defaults to\n * `document.documentElement`. Override when scoping the theme to a subtree.\n */\n target?: () => HTMLElement | null;\n /** Attribute name written on the target. Default: `\"data-tempest-theme\"`. */\n attribute?: 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\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}: 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 useEffect(() => {\n const element = targetRef.current?.() ?? document.documentElement;\n if (!element) return;\n const next = resolve(theme);\n element.setAttribute(attribute, next);\n setResolvedTheme(next);\n }, [theme, attribute]);\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 const next: ResolvedTheme = list.matches ? \"dark\" : \"light\";\n element?.setAttribute(attribute, next);\n setResolvedTheme(next);\n };\n list.addEventListener(\"change\", handler);\n return () => list.removeEventListener(\"change\", handler);\n }, [theme, attribute]);\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","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 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","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","/**\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","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"],"names":["cn","values","out","value","nested","Accordion","items","multiple","defaultValue","onChange","className","reactId","useId","isControlled","internalOpen","setInternalOpen","useState","openIds","toggle","useCallback","id","isOpen","next","x","jsx","styles","item","open","panelId","triggerId","jsxs","ChevronIcon","Alert","variant","appearance","title","description","icon","onClose","closeLabel","children","props","CloseIcon","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","Fragment","Button","loading","fullWidth","iconOnly","pill","leftIcon","rightIcon","disabled","SpinnerIcon","Card","actions","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","Input","required","generatedId","inputId","describedById","sizeClass","DatePicker","mode","Divider","orientation","align","Drawer","placement","mobilePlacement","isMobile","effectivePlacement","placementClass","DropdownMenu","trigger","itemRefs","selectableIndexes","entry","i","close","onKey","prev","handleTriggerClick","triggerClone","el","EmptyState","ErrorState","onRetry","retryLabel","AlertIcon","formatSize","bytes","matchesAccept","file","accept","tokens","t","type","token","FileUpload","maxSize","onReject","subtitle","dragging","setDragging","addFiles","incoming","accepted","rejected","handleDrop","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","Kbd","Navbar","logo","nav","sticky","tone","bordered","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","update","trimmed","focusCell","safe","onCellChange","char","onCellKeyDown","onPaste","text","c","cell","Popover","onOpenChange","defaultOpen","closeOnOutsideClick","Progress","max","showLabel","pct","RadioGroupContext","createContext","Radio","checked","group","useContext","resolvedName","resolvedDisabled","isChecked","handleChange","RadioGroup","horizontal","generatedName","RangeSlider","min","step","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","Select","selectId","CaretIcon","Sidebar","header","collapsed","collapsedWidth","finalWidth","Skeleton","height","Spacer","Spinner","inferTrend","delta","Stat","trend","hint","resolvedTrend","Stepper","steps","completed","clamp","swap","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","textareaId","Timeline","connector","Tooltip","openDelay","tooltipId","timer","show","hide","cloneElement","ToastContext","useToast","ctx","ToastProvider","defaultDuration","position","toasts","setToasts","counter","dismiss","toast","api","ToastContainer","positionClass","ToastItem","VirtualList","itemHeight","renderItem","overscan","getKey","containerRef","scrollTop","setScrollTop","viewport","setViewport","element","observer","totalHeight","visibleCount","offset","useDebounce","delay","debouncedValue","setDebouncedValue","usePagination","initialPage","initialSize","setPage","setSize","reset","useClientFilter","search","keysOrPredicate","term","useMediaQuery","matches","setMatches","list","useEventListener","eventName","target","handlerRef","resolvedTarget","listener","defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","deserialize","read","setStored","setValue","resolved","onStorage","useToggle","initial","setTrue","setFalse","set","useAsync","asyncFn","deps","immediate","state","setState","fnRef","callIdRef","mountedRef","run","callId","useOnline","online","setOnline","handleOnline","handleOffline","useDocumentVisibility","useIntersectionObserver","setEntry","once","root","rootMargin","threshold","nextEntry","useResizeObserver","entries","box","useClipboard","resetAfter","copied","setCopied","copy","textarea","shortcut","ctrl","meta","shift","isEditable","tag","useKeyboardShortcut","ignoreInput","useBeforeInstallPrompt","deferred","setDeferred","installed","setInstalled","installedHandler","prompt","result","DEFAULT_EVENTS","useIdle","timeout","idle","setIdle","useGeolocation","watch","positionOptions","onSuccess","onError","watchId","useScrollLock","body","FOCUSABLE_SELECTOR","useFocusTrap","container","previouslyFocused","getFocusable","handleKeydown","elements","first","last","useStableCallback","callback","args","deepEqual","a","b","aKeys","bKeys","useDeepMemo","usePrevious","useInterval","fn","useTimeout","useThrottle","throttled","setThrottled","lastEmitRef","pendingRef","now","elapsed","useWindowSize","useHover","hovered","setHovered","onEnter","onLeave","useLongPress","moveThreshold","startX","startY","cancel","onMove","dx","dy","buildUrl","baseURL","path","params","url","isFormData","parseError","response","detail","createApiClient","config","fetcher","authHeaders","rawRequest","headers","rest","isForm","finalHeaders","init","request","upload","formData","method","parseResponse","schema","context","issues","parseErrorBody","uploadWithProgress","getToken","withCredentials","onProgress","signal","parser","resolve","reject","xhr","handleAbort","isSuccess","contentType","errorBody","err","wait","ms","retry","factory","retries","initialDelay","maxDelay","shouldRetry","attempt","lastError","generateIdempotencyKey","r","usePoll","interval","stopWhen","setData","setError","setLoading","stopped","inFlight","tick","createAuthStore","storageImpl","create","persist","user","createJSONStorage","AuthGuard","isAuthenticated","base64UrlDecode","input","padding","decodeJWT","headerSeg","payloadSeg","signature","isJWTExpired","leewaySeconds","payload","nowSeconds","lazyWithRetry","reloadOnFinalFailure","load","lazy","createRefreshQueue","refresh","GoogleSignIn","Component","locale","theme","disableOneTap","useOAuthCallback","exchange","setStatus","ranRef","cancelled","STALE_TIME","CACHE_TIME","REFETCH_TIME","createQueryKeys","scope","output","QueryProvider","client","defaultOptions","internalClient","QueryClient","QueryClientProvider","defaultParser","createEventStream","namedEvents","heartbeatEvents","maxRetries","initialBackoff","maxBackoff","onOpen","onMessage","onStatusChange","source","retryTimer","closed","emit","scheduleReconnect","connect","es","reconnect","useEventStream","enabled","lastMessage","setLastMessage","reconnectRef","onMessageRef","controller","message","urlBase64ToUint8Array","base64String","base64","rawData","buffer","isPushSupported","WebPushUnsupportedError","WebPushPermissionDeniedError","WebPushClient","registration","existing","subscription","usePushSubscription","configRef","sub","supported","permission","setPermission","subscribed","setSubscribed","subscribe","unsubscribe","registerServiceWorker","installing","skipWaiting","worker","unregisterAllServiceWorkers","registrations","count","getSwScope","installPushHandler","sw","defaultTitle","defaultIcon","defaultBadge","transform","notification","installNotificationClickHandler","resolveUrl","clients","installSkipWaitingListener","createAudioPlayer","play","volume","loop","autoplay","stopPrevious","onEnded","audio","stop","defaultPlayer","getDefaultPlayer","playAudio","stopAudio","useAudio","playerRef","unlocked","setUnlocked","GenericDb","Dexie","version","tableName","indexes","createOfflineStore","databaseName","keyPath","ownerField","db","table","withOwner","owner","orderBy","reverse","limit","collection","changes","spec","keysChanged","ErrorBoundary","info","previousProps","useErrorHandler","FormField","control","useFormContext","resolvedControl","Controller","field","fieldState","isValidElement","errorMessage","validateForm","errors","issue","zodResolver","_context","criteriaMode","useZodForm","useForm","digitsOnly","validateCPF","digits","numbers","sum","check","validateCNPJ","weights1","weights2","formatCEP","formatCNPJ","unmask","formatCurrency","formatDate","date","formatDateTime","formatPhone","formatCPF","formatPercent","maskedInput","mask","inputMode","CPFInput","CNPJInput","PhoneInput","CEPInput","formatCents","cents","currency","parseCents","MoneyInput","useViaCEP","lookup","cep","json","createWebSocket","protocols","pingInterval","pingPayload","socket","pingTimer","clearPing","startPing","ws","send","code","reason","useWebSocket","controllerRef","ThemeContext","readStored","storageKey","ThemeProvider","defaultTheme","attribute","setThemeState","resolvedTheme","setResolvedTheme","targetRef","setTheme","useTheme","getInitialTheme","stored","themeInitScript","interpolate","template","_match","catalog","direct","fallbackValue","createI18n","fallbackLocale","messages","plural","formatNumber","opts","nextLocale","I18nContext","available","I18nProvider","initialLocale","availableLocales","setLocaleState","setLocale","useI18n","useTranslate","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","get","useSyncExternalStore","useFlagValue","createInMemoryFlags","flags","listeners","notify","createGrowthBookFeatureFlagsAdapter","growthbook","rendererInstalled","ensureRenderer","createLaunchDarklyFeatureFlagsAdapter","share","isShareSupported","storage","slugify","truncate","suffix","cut","PT_BR","n","EN","LOCALES","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","relativeTime","strings","diff","past","abs"],"mappings":"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"}