cortena-ui 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["BaseButton","Element","ResponsiveContainer","RechartsTooltip","RechartsLegend","BarChart","CartesianGrid","XAxis","YAxis","Bar","LineChart","Line","AreaChart","Area","PieChart","Pie","Cell","ScatterChart","series","Scatter","RadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","Radar","FunnelChart","Funnel","BaseCheckbox","MenuPrimitive","itemClassName","SelectPrimitive","createTanstackColumnHelper","PopoverPrimitive","FieldPrimitive","FieldsetPrimitive","BaseProgress","BaseRadioGroup","BaseSeparator","BaseSwitch","TabsPrimitive","DataTableView","views.ColumnView","views.RowView","views.CardView","views.SectionCardView","views.DividerView","views.SpacerView","views.TextView","views.MarkdownView","views.TextFieldView","views.TextAreaView","views.SelectView","views.CheckboxView","views.SwitchView","views.RadioGroupView","views.DateFieldView","views.ButtonView","views.ButtonLinkView","views.BadgeView","views.AlertView","views.ProgressViewComponent","views.StatusDotView","views.EmptyStateView","views.DataTableView","views.ChartView","views.TabsView","views.ImageView","views.LinkView","AccordionPrimitive","AvatarPrimitive","ComboboxPrimitive","DialogPrimitive","CommandPrimitive","ScrollAreaPrimitive","SheetPrimitive","ToastPrimitive","TooltipPrimitive"],"sources":["../src/lib/cn.ts","../src/components/alert.tsx","../src/components/badge.tsx","../src/components/button.tsx","../src/lib/render.tsx","../src/components/button-link.tsx","../src/components/card.tsx","../src/components/skeleton.tsx","../src/components/chart/tokens.ts","../src/components/chart/container.tsx","../src/components/chart/data.ts","../src/components/chart/nivo-theme.ts","../src/components/chart/nivo-charts.tsx","../src/components/chart/recharts-charts.tsx","../src/components/chart/types.ts","../src/components/chart/chart.tsx","../src/components/checkbox.tsx","../src/components/error-banner.tsx","../src/components/input.tsx","../src/components/spinner.tsx","../src/components/dropdown-menu.tsx","../src/components/select.tsx","../src/components/data-table/export.ts","../src/components/data-table/parts.tsx","../src/components/data-table/features.ts","../src/components/data-table/system-columns.tsx","../src/components/data-table/use-server-source.ts","../src/components/data-table/use-data-table.ts","../src/components/data-table/data-table.tsx","../src/components/calendar.tsx","../src/components/popover.tsx","../src/components/date-field.tsx","../src/components/empty-state.tsx","../src/components/label.tsx","../src/components/field.tsx","../src/components/markdown.tsx","../src/components/progress.tsx","../src/components/radio-group.tsx","../src/components/section-card.tsx","../src/components/separator.tsx","../src/components/status-dot.tsx","../src/components/switch.tsx","../src/components/tabs.tsx","../src/components/textarea.tsx","../src/a2ui/views.tsx","../src/a2ui/catalogue.ts","../src/a2ui/message.ts","../src/a2ui/catalogue-doc.ts","../src/a2ui/renderer.tsx","../src/components/accordion.tsx","../src/components/avatar.tsx","../src/components/breadcrumb.tsx","../src/components/chip.tsx","../src/components/combobox.tsx","../src/components/dialog.tsx","../src/components/command.tsx","../src/components/date-picker.tsx","../src/components/dropzone.tsx","../src/components/form.tsx","../src/components/kbd.tsx","../src/components/loading-skeleton.tsx","../src/components/page-header.tsx","../src/components/scroll-area.tsx","../src/components/segmented.tsx","../src/components/sheet.tsx","../src/components/sortable-list.tsx","../src/components/toast.tsx","../src/components/toolbar.tsx","../src/components/tooltip.tsx","../src/hooks/use-cortena-theme.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names the shadcn way: clsx for conditionals, tailwind-merge so a\n * consumer's `className` wins over a component's default for the same utility.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Alert — an inline callout. Tinted variants use the `-soft` fill for the\n * background and the tone colour for the border and icon; the body text stays\n * on the foreground token so it reads in both themes.\n *\n * The error tone is `destructive`, the same spelling Button uses; `danger` is\n * a deprecated alias of it and paints identically.\n */\nconst DESTRUCTIVE_ALERT =\n \"bg-[var(--ds-destructive-soft)] border-[var(--ds-destructive)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-destructive)]\";\n\nconst alertVariants = cva(\n [\n \"flex gap-3 rounded-[var(--ds-radius-md)] border px-3.5 py-3\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)]\",\n \"text-[color:var(--ds-foreground)]\",\n ],\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--ds-card)] border-[var(--ds-border-subtle)] [&_[data-slot=alert-icon]]:text-[color:var(--ds-muted-foreground)]\",\n success:\n \"bg-[var(--ds-success-soft)] border-[var(--ds-success)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-success)]\",\n warn: \"bg-[var(--ds-warning-soft)] border-[var(--ds-warning)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-warning)]\",\n destructive: DESTRUCTIVE_ALERT,\n /** @deprecated Use `destructive`, the name Button and Badge use; this alias paints the same. */\n danger: DESTRUCTIVE_ALERT,\n info: \"bg-[var(--ds-info-soft)] border-[var(--ds-info)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-info)]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface AlertProps\n extends React.ComponentProps<\"div\">, VariantProps<typeof alertVariants> {}\n\nfunction Alert({ className, variant, ...props }: AlertProps) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-icon\"\n className={cn(\"shrink-0 self-start [&_svg]:size-4.5 [&_svg]:shrink-0\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\"self-start font-semibold text-[color:var(--ds-foreground)]\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"mt-0.5 self-start text-[color:var(--ds-muted-foreground)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertIcon, AlertTitle, AlertDescription, alertVariants };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Badge — the mono, uppercase status label. Each tone pairs a `-soft` fill\n * with its foreground token. The error tone is `destructive`, the same\n * spelling Button and Alert use; `warn`, `danger` and `secondary` are\n * deprecated aliases kept for cortenaweb call sites and paint identically.\n */\nconst DESTRUCTIVE_BADGE = \"bg-[var(--ds-destructive-soft)] text-[color:var(--ds-destructive)]\";\n\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1.5 px-1.5 py-0.5 whitespace-nowrap\",\n \"rounded-[var(--ds-radius-sm)]\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-sm)] font-medium uppercase\",\n \"tracking-[var(--ds-text-eyebrow--letter-spacing)] leading-[var(--ds-text-caption-sm--line-height)]\",\n \"[&_svg]:size-3 [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n default: \"bg-[var(--ds-primary-soft)] text-[color:var(--ds-primary-soft-foreground)]\",\n success: \"bg-[var(--ds-success-soft)] text-[color:var(--ds-success)]\",\n warning: \"bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n /** @deprecated Use `warning`; this alias paints the same. */\n warn: \"bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n destructive: DESTRUCTIVE_BADGE,\n /** @deprecated Use `destructive`, the name Button and Alert use; this alias paints the same. */\n danger: DESTRUCTIVE_BADGE,\n info: \"bg-[var(--ds-info-soft)] text-[color:var(--ds-info)]\",\n neutral: \"bg-[var(--ds-hover)] text-[color:var(--ds-muted-foreground)]\",\n secondary: \"bg-[var(--ds-hover)] text-[color:var(--ds-muted-foreground)]\",\n outline:\n \"bg-transparent border border-[var(--ds-border)] text-[color:var(--ds-muted-foreground)]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.ComponentProps<\"span\">, VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <span data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport { Button as BaseButton } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Button.\n *\n * Base UI supplies the behaviour (native button semantics, `focusableWhenDisabled`,\n * keyboard activation on non-button elements through `render`). Every visual\n * value is a cortena-design token; nothing here is a literal the lint would flag.\n *\n * Radix users: `asChild` is gone. Pass `render={<a href=... />}` to change the\n * rendered element, which is Base UI's equivalent.\n */\nconst buttonVariants = cva(\n [\n \"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap\",\n \"font-medium\",\n \"rounded-[var(--ds-radius-md)]\",\n \"border\",\n \"transition-[background-color,border-color,color,box-shadow,filter]\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ds-primary)] bg-[var(--ds-primary)] text-[color:var(--ds-primary-foreground)] hover:border-[var(--ds-primary-hover)] hover:bg-[var(--ds-primary-hover)]\",\n secondary:\n \"border-[var(--ds-border)] bg-[var(--ds-secondary)] text-[color:var(--ds-secondary-foreground)] hover:border-[var(--ds-border-strong)] hover:bg-[var(--ds-hover)]\",\n outline:\n \"border-[var(--ds-border-strong)] bg-transparent text-[color:var(--ds-foreground)] hover:bg-[var(--ds-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n soft:\n \"border-transparent bg-[var(--ds-primary-soft)] text-[color:var(--ds-primary-soft-foreground)] hover:bg-[var(--ds-primary-soft)] hover:brightness-95\",\n destructive:\n \"border-[var(--ds-destructive)] bg-[var(--ds-destructive)] text-[color:var(--ds-destructive-foreground)] hover:brightness-110\",\n link: \"border-transparent bg-transparent text-[color:var(--ds-primary)] underline-offset-4 hover:underline\",\n },\n size: {\n sm: \"h-8 px-3 text-[length:var(--ds-text-caption)] rounded-[var(--ds-radius-sm)] [&_svg]:size-3.5\",\n md: \"h-9 px-4 text-[length:var(--ds-text-caption-lg)] [&_svg]:size-4\",\n lg: \"h-10 px-5 text-[length:var(--ds-text-body-sm)] [&_svg]:size-4\",\n icon: \"size-9 [&_svg]:size-4\",\n \"icon-sm\": \"size-8 rounded-[var(--ds-radius-sm)] [&_svg]:size-3.5\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ComponentProps<typeof BaseButton>, VariantProps<typeof buttonVariants> {}\n\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\n return (\n <BaseButton\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import type * as React from \"react\";\n\n/**\n * The `render` prop for the components that are plain markup rather than Base\n * UI primitives (Card, SectionCard, ButtonLink, BreadcrumbLink).\n *\n * Base UI parts take their own `render` and need nothing from here. The rest\n * are a `<div>` or an `<a>` this package writes itself, and a consumer\n * sometimes needs a different element under the same styling: a Card that is\n * the page's `<aside>` landmark, or a link that is the router's `<Link>`.\n * Passing an element rather than a component keeps the call site readable and\n * lets the caller set props on it (`render={<Link to=\"/x\" />}`).\n *\n * `props` wins over the passed element's own props, so the `className` and\n * handlers a component computed are not silently dropped, while the element's\n * own props (`href`, `to`, `aria-labelledby`) come through untouched. What a\n * component lets a *caller* override is decided by the order it builds `props`\n * in, not here. Children are `children`, falling back to the element's.\n */\nexport type RenderProp = React.ReactElement<Record<string, unknown>>;\n\nexport function renderWith(\n render: RenderProp | undefined,\n props: Record<string, unknown>,\n children: React.ReactNode,\n Fallback: React.ElementType,\n): React.ReactElement {\n if (!render) {\n const Element = Fallback;\n return <Element {...props}>{children}</Element>;\n }\n const Element = render.type as React.ElementType;\n const given = render.props as { children?: React.ReactNode };\n return (\n <Element {...(render.props as Record<string, unknown>)} {...props}>\n {children ?? given.children}\n </Element>\n );\n}\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\nimport { buttonVariants, type ButtonProps } from \"@/components/button\";\n\n/**\n * An anchor that looks like a Button and keeps link semantics.\n *\n * `Button render={<a />}` makes Base UI treat the anchor as a button (role,\n * tabindex, its `nativeButton` warning), which demotes real navigation for\n * assistive technology and breaks `getByRole(\"link\")`. Navigation should stay\n * an anchor. This is the migration target for every Radix-era\n * `<Button asChild><Link /></Button>`.\n *\n * Framework routers: pass `render` with the router's link so the styling and\n * `href` land on it, e.g. `render={<NextLink href=\"/x\" />}`; otherwise it\n * renders a plain `<a>`.\n */\nexport interface ButtonLinkProps\n extends Omit<React.ComponentProps<\"a\">, \"children\">,\n Pick<ButtonProps, \"variant\" | \"size\"> {\n children?: React.ReactNode;\n /** Replace the rendered `<a>` with a router link; props are merged onto it. */\n render?: RenderProp;\n disabled?: boolean;\n}\n\nfunction ButtonLink({ className, variant, size, render, disabled, children, ...props }: ButtonLinkProps) {\n const classes = cn(buttonVariants({ variant, size }), disabled && \"pointer-events-none opacity-50\", className);\n const merged = {\n ...props,\n \"data-slot\": \"button-link\",\n className: classes,\n \"aria-disabled\": disabled || undefined,\n tabIndex: disabled ? -1 : props.tabIndex,\n };\n return renderWith(render, merged, children, \"a\");\n}\n\nexport { ButtonLink };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\n\nexport interface CardProps extends React.ComponentProps<\"div\"> {\n /** Lift the border and surface on hover, for clickable cards. */\n hover?: boolean;\n /** Draw the border in the ring colour, for a selected or highlighted card. */\n accent?: boolean;\n /**\n * Replace the rendered `<div>` with another element, so a card can *be* the\n * landmark rather than sit inside a wrapper that is one:\n * `render={<aside />}` for a sidebar panel, `render={<section />}` (with an\n * `aria-labelledby` pointing at its title) for a labelled region,\n * `render={<article />}` for a self-contained item in a feed. Props set on\n * the passed element come through; the card's own styling wins.\n */\n render?: RenderProp;\n}\n\n/**\n * Card — the bordered surface everything else sits on. `render` changes the\n * element without changing the look, which is how a card becomes a landmark.\n */\nfunction Card({ className, hover, accent, render, children, ...props }: CardProps) {\n return renderWith(\n render,\n {\n // data-slot first: SectionCard (and any other composer) overrides it.\n \"data-slot\": \"card\",\n \"data-accent\": accent ? \"\" : undefined,\n ...props,\n className: cn(\n \"flex flex-col rounded-[var(--ds-radius-lg)] border bg-[var(--ds-card)] text-[color:var(--ds-foreground)]\",\n \"transition-[border-color,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n accent ? \"border-[var(--ds-ring)]\" : \"border-[var(--ds-border-subtle)]\",\n hover && \"hover:border-[var(--ds-border)] hover:bg-[var(--ds-popover)]\",\n className,\n ),\n },\n children,\n \"div\",\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\"flex flex-col gap-1.5 p-5 pb-3\", className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold\",\n \"leading-[var(--ds-text-h1--line-height)] tracking-[var(--ds-text-h1--letter-spacing)]\",\n \"text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-content\" className={cn(\"p-5 pt-0\", className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center gap-2 border-t border-[var(--ds-border-subtle)] p-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Skeleton — a pulsing placeholder block. Sized by the consumer (`h-4 w-40`);\n * the fill is the border token, which reads on the canvas, a card and a\n * popover in both themes.\n */\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n aria-hidden\n className={cn(\"animate-pulse rounded-[var(--ds-radius-sm)] bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { vizSeries } from \"cortena-design/tokens\";\n\n/**\n * Token plumbing for the chart engines.\n *\n * Recharts draws SVG, so it can take `var(--ds-viz-1)` verbatim and the\n * browser resolves it. Nivo cannot: its canvas renderer hands colours to a\n * 2D context, and its SVG renderer runs colours through d3-color for label and\n * border derivation, and neither understands `var()`. So every Nivo value is\n * read from the `--ds-*` custom property at runtime and handed over as a\n * concrete hex. Nothing in this file is a literal; on the server (no DOM) the\n * `var()` form is returned so SSR markup still resolves in the browser.\n */\n\n/** Number of categorical series colours the design system defines (`--ds-viz-1..n`). */\nexport const VIZ_SERIES_COUNT = vizSeries.length;\n\n/** `var(--ds-viz-N)` for a zero-based series index, wrapping past the palette. */\nexport function vizVar(index: number): string {\n const n = VIZ_SERIES_COUNT;\n return `var(--ds-viz-${(((index % n) + n) % n) + 1})`;\n}\n\n/** The categorical palette as `var()` references, in series order. */\nexport const vizSeriesVars: readonly string[] = Array.from({ length: VIZ_SERIES_COUNT }, (_, i) =>\n vizVar(i),\n);\n\nfunction hasDom(): boolean {\n return typeof document !== \"undefined\" && typeof getComputedStyle === \"function\";\n}\n\n/** Read a custom property as the browser computes it on `el` (default: `<html>`). */\nexport function readToken(name: string, el?: Element | null): string {\n if (!hasDom()) return \"\";\n return getComputedStyle(el ?? document.documentElement).getPropertyValue(name).trim();\n}\n\n/** A `--ds-text-*` size (rem or px) as a pixel number, for engines that want numbers. */\nexport function tokenPx(name: string, el?: Element | null): number | undefined {\n const raw = readToken(name, el);\n if (!raw) return undefined;\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) return undefined;\n if (raw.endsWith(\"rem\")) {\n const root = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return n * root;\n }\n return n;\n}\n\nlet probe: CanvasRenderingContext2D | null | undefined;\n\nfunction hex2(n: number): string {\n return n.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Convert any CSS colour the browser understands (oklch, color-mix, rgba…) to\n * `#rrggbb`, by painting it into an offscreen 2D context. Alpha is composited\n * against transparent, so translucent tokens come back opaque; chart fills\n * never use those.\n */\nexport function toHex(css: string): string | undefined {\n if (!hasDom() || !css) return undefined;\n if (probe === undefined) {\n probe = document.createElement(\"canvas\").getContext(\"2d\", { willReadFrequently: true });\n }\n if (!probe) return undefined;\n probe.clearRect(0, 0, 1, 1);\n probe.fillStyle = css;\n probe.fillRect(0, 0, 1, 1);\n const d = probe.getImageData(0, 0, 1, 1).data;\n return `#${hex2(d[0] ?? 0)}${hex2(d[1] ?? 0)}${hex2(d[2] ?? 0)}`;\n}\n\n/**\n * A token as a concrete colour. Returns hex in the browser; on the server the\n * `var()` form, which is fine for SVG markup and irrelevant for canvas.\n */\nexport function resolveColor(token: string, el?: Element | null): string {\n return toHex(readToken(token, el)) ?? `var(${token})`;\n}\n\n/** The categorical palette resolved to concrete colours, in series order. */\nexport function resolveVizSeries(el?: Element | null): string[] {\n return vizSeriesVars.map((_, i) => resolveColor(`--ds-viz-${i + 1}`, el));\n}\n\n/** Relative luminance of a `#rrggbb`, for choosing a scale direction. */\nfunction luminance(hex: string): number {\n const c = (i: number) => {\n const v = Number.parseInt(hex.slice(i, i + 2), 16) / 255;\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * c(1) + 0.7152 * c(3) + 0.0722 * c(5);\n}\n\n/**\n * A label colour that reads on a given fill: the design system's ink on light\n * fills, its white on dark ones. Nivo cells and arcs paint their labels with\n * this so a value on a deep sequential cell stays legible.\n */\nexport function contrastLabel(el?: Element | null): (fill: string) => string {\n const ink = resolveColor(\"--ds-base-text-ink\", el);\n const white = resolveColor(\"--ds-base-white\", el);\n return (fill: string) => {\n const hex = fill.startsWith(\"#\") && fill.length === 7 ? fill : toHex(fill);\n return hex && luminance(hex) < 0.3 ? white : ink;\n };\n}\n\n/** True when the resolved `--ds-background` is dark, whatever set the theme (attribute or OS). */\nexport function isDarkSurface(el?: Element | null): boolean {\n const bg = toHex(readToken(\"--ds-background\", el));\n return bg ? luminance(bg) < 0.4 : false;\n}\n\n/** Linear interpolation through a list of hex stops; `t` in [0, 1]. */\nexport function piecewiseHex(stops: string[]): (t: number) => string {\n const rgb = stops.map((h) => [1, 3, 5].map((i) => Number.parseInt(h.slice(i, i + 2), 16)));\n return (t: number) => {\n const clamped = Math.min(1, Math.max(0, Number.isNaN(t) ? 0 : t));\n const pos = clamped * (rgb.length - 1);\n const i = Math.max(0, Math.min(rgb.length - 2, Math.floor(pos)));\n const f = pos - i;\n const a = rgb[i] ?? [0, 0, 0];\n const b = rgb[i + 1] ?? a;\n const mix = (k: number) => Math.round((a[k] ?? 0) + ((b[k] ?? 0) - (a[k] ?? 0)) * f);\n return `#${hex2(mix(0))}${hex2(mix(1))}${hex2(mix(2))}`;\n };\n}\n\nexport interface ChartScales {\n /** Low → high, as concrete hex stops. */\n sequential: string[];\n /** Negative → neutral → positive, as concrete hex stops. */\n diverging: string[];\n /** Interpolators over the stops, `t` in [0, 1], for Nivo's `interpolator` configs. */\n sequentialInterpolator: (t: number) => string;\n divergingInterpolator: (t: number) => string;\n /** `n` evenly spaced sequential swatches, for quantised fills like the calendar. */\n sequentialSteps: (n: number) => string[];\n /** Fill for cells with no value. */\n empty: string;\n /** The chart's surface (`--ds-background`), for the gaps between cells and arcs. */\n surface: string;\n}\n\n/**\n * Sequential and diverging scales from the tokens.\n *\n * The token set has only the eight categorical `--ds-viz-*` colours and no\n * sequential ramp, so the sequential scale is derived from the\n * `--ds-primary-100..900` ladder: light surfaces run 100 → 700 (pale to deep),\n * dark surfaces run 900 → 400 (deep to bright), so low values sit near the\n * background in both themes. The diverging scale runs `--ds-viz-5` (rose)\n * through the theme's neutral (`--ds-neutral-200` light, `--ds-neutral-700`\n * dark) to `--ds-viz-1` (blue).\n */\nexport function chartScales(el?: Element | null): ChartScales {\n const dark = isDarkSurface(el);\n const seqTokens = dark\n ? [\"--ds-primary-900\", \"--ds-primary-800\", \"--ds-primary-600\", \"--ds-primary-400\"]\n : [\"--ds-primary-100\", \"--ds-primary-300\", \"--ds-primary-500\", \"--ds-primary-700\"];\n const sequential = seqTokens.map((t) => resolveColor(t, el));\n const diverging = [\"--ds-viz-5\", dark ? \"--ds-neutral-700\" : \"--ds-neutral-200\", \"--ds-viz-1\"].map(\n (t) => resolveColor(t, el),\n );\n const sequentialInterpolator = piecewiseHex(sequential);\n const divergingInterpolator = piecewiseHex(diverging);\n return {\n sequential,\n diverging,\n sequentialInterpolator,\n divergingInterpolator,\n sequentialSteps: (n) =>\n Array.from({ length: n }, (_, i) => sequentialInterpolator(n === 1 ? 1 : i / (n - 1))),\n empty: resolveColor(\"--ds-muted\", el),\n surface: resolveColor(\"--ds-background\", el),\n };\n}\n\n/**\n * A counter that bumps whenever the theme may have changed: the `data-theme`\n * or `class` attribute on `<html>`, or the OS colour scheme. Resolved token\n * values are memoised on it so Nivo re-reads them on a flip.\n */\nexport function useThemeVersion(): number {\n const [version, setVersion] = useState(0);\n useEffect(() => {\n if (!hasDom()) return;\n const bump = () => setVersion((v) => v + 1);\n const observer = new MutationObserver(bump);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\", \"class\", \"style\"],\n });\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n media?.addEventListener?.(\"change\", bump);\n return () => {\n observer.disconnect();\n media?.removeEventListener?.(\"change\", bump);\n };\n }, []);\n return version;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Legend as RechartsLegend,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n type LegendPayload,\n type LegendProps,\n type TooltipContentProps,\n type TooltipProps,\n} from \"recharts\";\nimport { cn } from \"@/lib/cn\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { vizVar } from \"./tokens\";\nimport type { ChartConfig } from \"./types\";\n\n/* ── context ─────────────────────────────────────────────────────────────── */\n\ninterface ChartContextValue {\n config: ChartConfig;\n /** The container element, so token resolution can honour a nested theme scope. */\n element: HTMLDivElement | null;\n}\n\nconst ChartContext = React.createContext<ChartContextValue | null>(null);\n\n/** The nearest ChartContainer's config and element; null outside one. */\nexport function useChart(): ChartContextValue | null {\n return React.useContext(ChartContext);\n}\n\n/**\n * Resolve the colour a series key paints with: `config[key].color` when set,\n * otherwise `var(--ds-viz-N)` by the key's position in the config (or the\n * `index` given). Recharts consumers reference it as `var(--color-<key>)`,\n * which ChartContainer defines on its element.\n */\nexport function seriesColor(config: ChartConfig | undefined, key: string, index?: number): string {\n const entry = config?.[key];\n if (entry?.color) return entry.color;\n const keys = config ? Object.keys(config) : [];\n const position = keys.indexOf(key);\n return vizVar(position >= 0 ? position : (index ?? 0));\n}\n\n/* ── container ───────────────────────────────────────────────────────────── */\n\nexport interface ChartContainerProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n /** Series presentation; colours default to `--ds-viz-1..n` in key order. */\n config?: ChartConfig;\n /** Height of the drawing area; width is always 100% of the parent. Default 300. */\n height?: number | string;\n /**\n * Wrap children in Recharts' ResponsiveContainer (default). Nivo's\n * `Responsive*` components size themselves, so the Nivo renderers pass\n * `responsive={false}`.\n */\n responsive?: boolean;\n /**\n * Give the drawing area a floor of 600×300 so it draws where the layout\n * gives it none.\n *\n * Both engines size themselves from the parent box. Under jsdom nothing has\n * layout — every element measures 0×0 — so a page test that renders a screen\n * containing a Chart gets an empty `<div>` and can assert nothing about it.\n * `testMode` sets `min-width` / `min-height` on the container and hands the\n * same floor to Recharts' ResponsiveContainer, so the chart draws at\n * 600×300. It is a floor, not a fixed size: a parent that *does* give the\n * chart 900px still gets 900px, so a screenshot test is unaffected.\n */\n testMode?: boolean;\n children: React.ReactNode;\n}\n\n/** The box `testMode` falls back to when the layout gives the chart none. */\nconst TEST_WIDTH = 600;\nconst TEST_HEIGHT = 300;\n\n/**\n * ChartContainer — the sized, token-styled surface every chart draws in.\n *\n * It defines `--color-<key>` for each config key (so Recharts parts can say\n * `fill=\"var(--color-revenue)\"`) and styles Recharts' axis, grid, tick and\n * cursor classes from tokens with a caption-sm floor for text, so a custom\n * chart composed inside it needs no local colours or fonts.\n */\nfunction ChartContainer({\n config = {},\n height = 300,\n responsive = true,\n testMode = false,\n className,\n style,\n children,\n ...props\n}: ChartContainerProps) {\n const [element, setElement] = React.useState<HTMLDivElement | null>(null);\n const vars = React.useMemo(() => {\n const out: Record<string, string> = {};\n for (const key of Object.keys(config)) out[`--color-${key}`] = seriesColor(config, key);\n return out;\n }, [config]);\n const ctx = React.useMemo(() => ({ config, element }), [config, element]);\n\n return (\n <ChartContext.Provider value={ctx}>\n <div\n ref={setElement}\n data-slot=\"chart\"\n data-test-mode={testMode ? \"\" : undefined}\n className={cn(\n \"relative w-full min-w-0 overflow-hidden text-[length:var(--ds-text-caption-sm)] text-[color:var(--ds-foreground)]\",\n responsive ? \"flex justify-center\" : \"block [&>div]:h-full [&>div]:w-full\",\n \"[&_.recharts-cartesian-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-polar-angle-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-polar-radius-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-cartesian-grid-horizontal_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-cartesian-grid-vertical_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-angle_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-concentric-polygon]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-concentric-circle]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-cartesian-axis-line]:stroke-[var(--ds-border)]\",\n \"[&_.recharts-cartesian-axis-tick-line]:stroke-[var(--ds-border)]\",\n \"[&_.recharts-radial-bar-background-sector]:fill-[var(--ds-muted)]\",\n \"[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-[var(--ds-hover)]\",\n \"[&_.recharts-curve.recharts-tooltip-cursor]:stroke-[var(--ds-border-strong)]\",\n \"[&_.recharts-reference-line_line]:stroke-[var(--ds-border-strong)]\",\n \"[&_.recharts-pie-sector_.recharts-sector]:stroke-[var(--ds-card)]\",\n \"[&_.recharts-funnel-trapezoid_.recharts-trapezoid]:stroke-[var(--ds-card)]\",\n \"[&_.recharts-layer]:outline-hidden [&_.recharts-surface]:outline-hidden [&_.recharts-sector]:outline-hidden\",\n \"[&_text]:font-[family-name:var(--ds-font-body)]\",\n className,\n )}\n style={\n {\n height,\n ...(testMode ? { minWidth: TEST_WIDTH, minHeight: TEST_HEIGHT } : null),\n ...vars,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n >\n {responsive ? (\n <ResponsiveContainer\n width=\"100%\"\n height=\"100%\"\n minWidth={testMode ? TEST_WIDTH : undefined}\n minHeight={testMode ? TEST_HEIGHT : undefined}\n >\n {children as React.ReactElement}\n </ResponsiveContainer>\n ) : (\n children\n )}\n </div>\n </ChartContext.Provider>\n );\n}\n\n/* ── states ──────────────────────────────────────────────────────────────── */\n\nfunction ChartState({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-[var(--ds-radius-md)] border border-dashed border-[var(--ds-border-subtle)]\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** \"No data\" placeholder; rendered by Chart when the data is empty. */\nfunction ChartEmpty({ children = \"No data\", ...props }: React.ComponentProps<\"div\">) {\n return (\n <ChartState data-slot=\"chart-empty\" role=\"status\" {...props}>\n {children}\n </ChartState>\n );\n}\n\n/** Error placeholder; rendered by Chart for an `error` prop or a failed Nivo chunk. */\nfunction ChartError({ className, children = \"Chart could not be rendered\", ...props }: React.ComponentProps<\"div\">) {\n return (\n <ChartState\n data-slot=\"chart-error\"\n role=\"alert\"\n className={cn(\"border-[var(--ds-destructive)] text-[color:var(--ds-destructive)]\", className)}\n {...props}\n >\n {children}\n </ChartState>\n );\n}\n\n/** Loading placeholder: a skeleton the size of the drawing area, shown while a Nivo chunk loads. */\nfunction ChartLoading({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"chart-loading\" className={cn(\"h-full w-full\", className)} {...props}>\n <Skeleton className=\"h-full w-full rounded-[var(--ds-radius-md)]\" />\n </div>\n );\n}\n\n/* ── tooltip ─────────────────────────────────────────────────────────────── */\n\nexport interface ChartTooltipContentProps\n extends Partial<Pick<TooltipContentProps, \"active\" | \"payload\" | \"label\">> {\n className?: string;\n /** Hide the series label column. */\n hideLabel?: boolean;\n /** Hide the colour swatch. */\n hideIndicator?: boolean;\n /** Format a value; defaults to `toLocaleString`. */\n formatter?: (value: number | string, name: string) => React.ReactNode;\n /** Format the header (the category). */\n labelFormatter?: (label: React.ReactNode) => React.ReactNode;\n}\n\nfunction formatValue(value: unknown, formatter?: ChartTooltipContentProps[\"formatter\"], name = \"\"): React.ReactNode {\n if (formatter && (typeof value === \"number\" || typeof value === \"string\")) return formatter(value, name);\n if (typeof value === \"number\") return value.toLocaleString();\n if (value == null) return \"\";\n return String(value);\n}\n\n/**\n * ChartTooltipContent — the popover body for Recharts' Tooltip, styled like\n * the package Tooltip on the popover tokens. Pass as `content` to\n * ChartTooltip; reads series labels and colours from the ChartContainer config.\n */\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n hideLabel,\n hideIndicator,\n formatter,\n labelFormatter,\n}: ChartTooltipContentProps) {\n const chart = useChart();\n if (!active || !payload?.length) return null;\n const heading = labelFormatter ? labelFormatter(label) : label;\n return (\n <div\n data-slot=\"chart-tooltip\"\n className={cn(\n \"grid min-w-32 gap-1.5 rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-popover)] px-2.5 py-1.5\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-md)]\",\n className,\n )}\n >\n {!hideLabel && heading != null && heading !== \"\" ? (\n <div className=\"font-medium\">{heading}</div>\n ) : null}\n <div className=\"grid gap-1\">\n {payload.map((item, i) => {\n const key = String(item.dataKey ?? item.name ?? i);\n const entry = chart?.config[key];\n const colour = item.color ?? item.fill ?? item.stroke ?? `var(--color-${key})`;\n const name = entry?.label ?? item.name ?? key;\n return (\n <div key={key} className=\"flex items-center gap-2\">\n {hideIndicator ? null : (\n <span\n aria-hidden\n data-slot=\"chart-tooltip-indicator\"\n className=\"size-2 shrink-0 rounded-[var(--ds-radius-sm)]\"\n style={{ background: colour }}\n />\n )}\n <span className=\"flex-1 text-[color:var(--ds-muted-foreground)]\">{name}</span>\n <span className=\"font-[family-name:var(--ds-font-mono)] font-medium tabular-nums\">\n {formatValue(item.value, formatter, String(name))}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/** Recharts' Tooltip with the token-styled content and a subtle cursor. */\nfunction ChartTooltip(props: TooltipProps) {\n return <RechartsTooltip content={<ChartTooltipContent />} {...props} />;\n}\n\n/* ── legend ──────────────────────────────────────────────────────────────── */\n\nexport interface ChartLegendContentProps {\n payload?: readonly LegendPayload[];\n verticalAlign?: \"top\" | \"bottom\" | \"middle\";\n className?: string;\n hideIcon?: boolean;\n}\n\n/** ChartLegendContent — Recharts' legend on tokens; reads labels from the config. */\nfunction ChartLegendContent({ payload, verticalAlign = \"bottom\", className, hideIcon }: ChartLegendContentProps) {\n const chart = useChart();\n if (!payload?.length) return null;\n return (\n <div\n data-slot=\"chart-legend\"\n className={cn(\n \"flex flex-wrap items-center justify-center gap-x-4 gap-y-1\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {payload.map((item, i) => {\n const key = String(item.dataKey ?? item.value ?? i);\n const entry = chart?.config[key];\n const Icon = entry?.icon;\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {hideIcon ? null : Icon ? (\n <Icon />\n ) : (\n <span\n aria-hidden\n className=\"size-2 shrink-0 rounded-[var(--ds-radius-sm)]\"\n style={{ background: item.color ?? `var(--color-${key})` }}\n />\n )}\n {entry?.label ?? item.value}\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Recharts' Legend with the token-styled content. */\nfunction ChartLegend(props: LegendProps) {\n return <RechartsLegend content={<ChartLegendContent />} {...props} />;\n}\n\nexport {\n ChartContainer,\n ChartContext,\n ChartEmpty,\n ChartError,\n ChartLoading,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n};\n","import type { ChartConfig, ChartMatrix, ChartRow, ChartSeries, ChartSlice, ChartTree } from \"./types\";\n\n/** True for the `{ id, data: [{ x, y }] }[]` series shape. */\nexport function isSeriesArray(data: unknown): data is ChartSeries[] {\n return (\n Array.isArray(data) &&\n data.length > 0 &&\n data.every((d) => d && typeof d === \"object\" && Array.isArray((d as ChartSeries).data))\n );\n}\n\n/** True for the `{ rows, columns, values }` categorical matrix shape. */\nexport function isMatrix(data: unknown): data is ChartMatrix {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) return false;\n const m = data as ChartMatrix;\n return Array.isArray(m.rows) && Array.isArray(m.columns) && Array.isArray(m.values);\n}\n\n/**\n * Pivot a categorical matrix onto the Nivo heatmap shape. Every row gets a\n * point for every column so the grid stays rectangular; a missing or\n * non-finite cell becomes `null`, which Nivo paints with `emptyColor` rather\n * than as a zero.\n */\nexport function matrixToSeries(matrix: ChartMatrix): ChartSeries[] {\n return matrix.rows.map((row, r) => ({\n id: row,\n data: matrix.columns.map((column, c) => {\n const value = matrix.values[r]?.[c];\n return { x: column, y: typeof value === \"number\" && Number.isFinite(value) ? value : null };\n }),\n }));\n}\n\n/**\n * Infer the category key and the series keys of a row array the way the\n * webchat renderer did: the first string field is the index, every numeric\n * field is a series. Falls back to the first key when nothing is a string.\n */\nexport function inferRowKeys(rows: ChartRow[]): { indexBy: string | undefined; keys: string[] } {\n const sample = rows[0];\n if (!sample) return { indexBy: undefined, keys: [] };\n let indexBy: string | undefined;\n const keys: string[] = [];\n for (const [key, value] of Object.entries(sample)) {\n if (typeof value === \"number\") keys.push(key);\n else if (!indexBy && typeof value === \"string\") indexBy = key;\n }\n if (!indexBy) indexBy = Object.keys(sample)[0];\n return { indexBy, keys };\n}\n\nexport interface RowData {\n rows: ChartRow[];\n indexBy: string;\n keys: string[];\n}\n\n/**\n * Normalise bar/line/area/radar data to rows. Series input is pivoted so each\n * distinct x becomes a row and each series id a column; row input is used as\n * given with inferred keys unless `indexBy`/`keys` are passed.\n */\nexport function toRows(data: ChartRow[] | ChartSeries[], indexBy?: string, keys?: string[]): RowData {\n if (isSeriesArray(data)) {\n const index = indexBy ?? \"x\";\n const byX = new Map<string | number, ChartRow>();\n const ids: string[] = [];\n for (const series of data) {\n const id = String(series.id);\n ids.push(id);\n for (const point of series.data) {\n let row = byX.get(point.x);\n if (!row) {\n row = { [index]: point.x };\n byX.set(point.x, row);\n }\n row[id] = point.y;\n }\n }\n return { rows: [...byX.values()], indexBy: index, keys: keys ?? ids };\n }\n const rows = data as ChartRow[];\n const inferred = inferRowKeys(rows);\n return {\n rows,\n indexBy: indexBy ?? inferred.indexBy ?? \"x\",\n keys: keys ?? inferred.keys,\n };\n}\n\n/** Pie/donut/funnel slices as `{ name, value }` rows with the id preserved. */\nexport function toSlices(data: ChartSlice[]): Array<{ id: string; name: string; value: number }> {\n return data.map((d) => ({ id: String(d.id), name: d.label ?? String(d.id), value: d.value }));\n}\n\n/** Build a ChartConfig for the given keys, keeping any entries the caller set. */\nexport function configFor(keys: string[], config?: ChartConfig): ChartConfig {\n const out: ChartConfig = {};\n for (const key of keys) out[key] = { label: key, ...config?.[key] };\n // Keys the caller configured but the data lacks still get their colour slot.\n for (const key of Object.keys(config ?? {})) if (!(key in out)) out[key] = config![key]!;\n return out;\n}\n\n/** Whether a Nivo tree uses `name` rather than `id` as its identity. */\nexport function treeIdentity(tree: ChartTree): \"id\" | \"name\" {\n return tree.id === undefined && tree.name !== undefined ? \"name\" : \"id\";\n}\n\n/** True when there is nothing to draw. */\nexport function isEmptyData(data: unknown): boolean {\n if (data == null) return true;\n if (isMatrix(data)) return data.rows.length === 0 || data.columns.length === 0;\n if (Array.isArray(data)) {\n if (data.length === 0) return true;\n if (isSeriesArray(data)) return data.every((s) => s.data.length === 0);\n return false;\n }\n if (typeof data === \"object\") {\n const tree = data as ChartTree;\n return !tree.children?.length && tree.value === undefined;\n }\n return true;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useChart } from \"./container\";\nimport { readToken, resolveColor, tokenPx, useThemeVersion } from \"./tokens\";\n\n/**\n * The Nivo theme object, typed structurally so no `@nivo/*` package is a\n * static import of this module (the Nivo packages are lazy-loaded). It is a\n * subset of `PartialTheme` from `@nivo/theming` and assignable to every\n * chart's `theme` prop.\n */\nexport interface NivoTheme {\n background: string;\n text: { fontFamily: string; fontSize: number; fill: string };\n axis: {\n domain: { line: { stroke: string; strokeWidth: number } };\n ticks: {\n line: { stroke: string; strokeWidth: number };\n text: { fill: string; fontSize: number };\n };\n legend: { text: { fill: string; fontSize: number; fontWeight: number } };\n };\n grid: { line: { stroke: string; strokeWidth: number } };\n crosshair: { line: { stroke: string; strokeWidth: number; strokeOpacity: number; strokeDasharray: string } };\n legends: {\n text: { fill: string; fontSize: number };\n title: { text: { fill: string; fontSize: number } };\n ticks: { line: { stroke: string; strokeWidth: number }; text: { fill: string; fontSize: number } };\n };\n labels: { text: { fill: string; fontSize: number; fontWeight: number } };\n dots: { text: { fill: string; fontSize: number } };\n markers: { lineColor: string; lineStrokeWidth: number; text: { fill: string; fontSize: number } };\n annotations: {\n text: { fill: string; fontSize: number; outlineWidth: number; outlineColor: string };\n link: { stroke: string; strokeWidth: number; outlineWidth: number; outlineColor: string };\n outline: { stroke: string; strokeWidth: number; outlineWidth: number; outlineColor: string };\n symbol: { fill: string; outlineWidth: number; outlineColor: string };\n };\n tooltip: {\n container: {\n background: string;\n color: string;\n fontSize: number;\n fontFamily: string;\n borderRadius: number;\n boxShadow: string;\n border: string;\n padding: string;\n };\n chip: { borderRadius: number };\n };\n}\n\n/**\n * Build the Nivo theme from the tokens, resolved on `el` (default `<html>`).\n * Every colour is read from a `--ds-*` custom property and converted to hex,\n * because Nivo's canvas renderer and its colour derivation cannot read\n * `var()`. Sizes come from the type scale with `--ds-text-caption-sm` (11px)\n * as the floor for ticks and labels.\n *\n * Moved here from cortenaweb's webchat renderer; nothing is hard-coded.\n */\nexport function nivoTheme(el?: Element | null): NivoTheme {\n const fontFamily = readToken(\"--ds-font-body\", el) || \"var(--ds-font-body)\";\n const captionSm = tokenPx(\"--ds-text-caption-sm\", el) ?? 11;\n const caption = tokenPx(\"--ds-text-caption\", el) ?? 12;\n const radiusMd = tokenPx(\"--ds-radius-md\", el) ?? 6;\n const radiusSm = tokenPx(\"--ds-radius-sm\", el) ?? 4;\n const foreground = resolveColor(\"--ds-foreground\", el);\n const muted = resolveColor(\"--ds-muted-foreground\", el);\n const border = resolveColor(\"--ds-border\", el);\n const borderSubtle = resolveColor(\"--ds-border-subtle\", el);\n const borderStrong = resolveColor(\"--ds-border-strong\", el);\n const popover = resolveColor(\"--ds-popover\", el);\n const popoverForeground = resolveColor(\"--ds-popover-foreground\", el);\n const card = resolveColor(\"--ds-card\", el);\n const shadow = readToken(\"--ds-shadow-md\", el) || \"var(--ds-shadow-md)\";\n const space2 = readToken(\"--ds-space-2\", el) || \"var(--ds-space-2)\";\n const space3 = readToken(\"--ds-space-3\", el) || \"var(--ds-space-3)\";\n\n return {\n background: \"transparent\",\n text: { fontFamily, fontSize: captionSm, fill: foreground },\n axis: {\n domain: { line: { stroke: border, strokeWidth: 1 } },\n ticks: {\n line: { stroke: border, strokeWidth: 1 },\n text: { fill: muted, fontSize: captionSm },\n },\n legend: { text: { fill: foreground, fontSize: caption, fontWeight: 500 } },\n },\n grid: { line: { stroke: borderSubtle, strokeWidth: 1 } },\n crosshair: { line: { stroke: borderStrong, strokeWidth: 1, strokeOpacity: 1, strokeDasharray: \"4 4\" } },\n legends: {\n text: { fill: muted, fontSize: captionSm },\n title: { text: { fill: foreground, fontSize: caption } },\n ticks: { line: { stroke: border, strokeWidth: 1 }, text: { fill: muted, fontSize: captionSm } },\n },\n labels: { text: { fill: foreground, fontSize: captionSm, fontWeight: 500 } },\n dots: { text: { fill: foreground, fontSize: captionSm } },\n markers: { lineColor: borderStrong, lineStrokeWidth: 1, text: { fill: muted, fontSize: captionSm } },\n annotations: {\n text: { fill: foreground, fontSize: captionSm, outlineWidth: 2, outlineColor: card },\n link: { stroke: borderStrong, strokeWidth: 1, outlineWidth: 2, outlineColor: card },\n outline: { stroke: borderStrong, strokeWidth: 1, outlineWidth: 2, outlineColor: card },\n symbol: { fill: foreground, outlineWidth: 2, outlineColor: card },\n },\n tooltip: {\n container: {\n background: popover,\n color: popoverForeground,\n fontSize: caption,\n fontFamily,\n borderRadius: radiusMd,\n boxShadow: shadow,\n border: `1px solid ${borderSubtle}`,\n padding: `${space2} ${space3}`,\n },\n chip: { borderRadius: radiusSm },\n },\n };\n}\n\n/**\n * The Nivo theme for the current theme, re-resolved when `data-theme` or the\n * OS scheme flips. Inside a ChartContainer the tokens are read on its element,\n * so a nested theme scope is honoured.\n */\nexport function useNivoTheme(): NivoTheme {\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n return useMemo(() => nivoTheme(el), [el, version]);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useChart } from \"./container\";\nimport { isMatrix, matrixToSeries, treeIdentity } from \"./data\";\nimport { useNivoTheme } from \"./nivo-theme\";\nimport { chartScales, contrastLabel, resolveVizSeries, useThemeVersion } from \"./tokens\";\nimport type { ChartConfig, ChartDay, ChartMatrix, ChartRenderer, ChartScale, ChartSeries, ChartTree, ChartType } from \"./types\";\n\nexport type NivoType = Extract<ChartType, \"heatmap\" | \"calendar\" | \"treemap\" | \"sunburst\">;\n\n/*\n * Every Nivo package is a dynamic import so a consumer pays only for the chart\n * types a screen renders, and none of `@nivo/*` lands in the package's static\n * graph (test/chart-bundle.test.tsx greps for exactly this). Each lazy wrapper\n * resolves to the SVG or Canvas variant; sunburst has no canvas renderer and\n * falls back to SVG.\n */\ntype AnyComponent = React.ComponentType<Record<string, unknown>>;\n\nconst lazy = (load: () => Promise<AnyComponent>) =>\n React.lazy(async () => ({ default: await load() }));\n\nconst HeatMapSvg = lazy(async () => (await import(\"@nivo/heatmap\")).ResponsiveHeatMap as AnyComponent);\nconst HeatMapCanvas = lazy(async () => (await import(\"@nivo/heatmap\")).ResponsiveHeatMapCanvas as AnyComponent);\nconst CalendarSvg = lazy(async () => (await import(\"@nivo/calendar\")).ResponsiveCalendar as unknown as AnyComponent);\nconst CalendarCanvas = lazy(async () => (await import(\"@nivo/calendar\")).ResponsiveCalendarCanvas as unknown as AnyComponent);\nconst TreeMapSvg = lazy(async () => (await import(\"@nivo/treemap\")).ResponsiveTreeMap as AnyComponent);\nconst TreeMapCanvas = lazy(async () => (await import(\"@nivo/treemap\")).ResponsiveTreeMapCanvas as AnyComponent);\nconst SunburstSvg = lazy(async () => (await import(\"@nivo/sunburst\")).ResponsiveSunburst as AnyComponent);\n\nexport interface NivoRenderProps {\n type: NivoType;\n data: unknown;\n config: ChartConfig;\n renderer: ChartRenderer;\n scale: ChartScale;\n legend: boolean;\n valueFormatter?: (value: number) => string;\n /** Calendar range; defaults to the data's first and last day. */\n from?: string;\n to?: string;\n}\n\n/**\n * Resolved series colours for Nivo: config colours are `var()` strings, which\n * Nivo cannot use, so a configured colour is resolved through the container's\n * computed style and the rest come from `--ds-viz-1..n` in order.\n */\nfunction useNivoColors(config: ChartConfig): string[] {\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n return React.useMemo(() => {\n const palette = resolveVizSeries(el);\n const keys = Object.keys(config);\n if (keys.length === 0) return palette;\n return keys.map((key, i) => {\n const own = config[key]?.color;\n if (!own || !el) return palette[i % palette.length]!;\n // Resolve a var() through the element by painting it into a probe.\n const probe = document.createElement(\"span\");\n probe.style.color = own;\n el.appendChild(probe);\n const painted = getComputedStyle(probe).color;\n probe.remove();\n return painted || palette[i % palette.length]!;\n });\n }, [config, el, version]);\n}\n\nfunction calendarRange(data: ChartDay[], from?: string, to?: string): { from: string; to: string } {\n const days = data.map((d) => d.day).sort();\n return { from: from ?? days[0] ?? \"\", to: to ?? days[days.length - 1] ?? \"\" };\n}\n\n/** The Nivo side of `Chart`; rendered inside a ChartContainer with `responsive={false}`. */\nexport function NivoChart({ type, data, config, renderer, scale, legend, valueFormatter, from, to }: NivoRenderProps) {\n const theme = useNivoTheme();\n const colors = useNivoColors(config);\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n const scales = React.useMemo(() => chartScales(el), [el, version]);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n const onFill = React.useMemo(() => contrastLabel(el), [el, version]);\n const canvas = renderer === \"canvas\";\n const labelColor = theme.labels.text.fill;\n const border = theme.axis.domain.line.stroke;\n const labelOn = (d: { color: string }) => onFill(d.color);\n\n switch (type) {\n case \"heatmap\": {\n const Component = canvas ? HeatMapCanvas : HeatMapSvg;\n // Either shape lands on Nivo's `[{ id, data: [{ x, y }] }]`.\n const rows = isMatrix(data) ? matrixToSeries(data as ChartMatrix) : (data as ChartSeries[]);\n // Labels only when cells are big enough to carry them.\n const cells = rows.reduce((n, r) => n + r.data.length, 0);\n const colorConfig =\n scale === \"diverging\"\n ? { type: \"diverging\" as const, interpolator: scales.divergingInterpolator }\n : { type: \"sequential\" as const, interpolator: scales.sequentialInterpolator };\n return (\n <Component\n data={rows}\n theme={theme}\n colors={colorConfig}\n emptyColor={scales.empty}\n borderColor={border}\n borderWidth={1}\n enableLabels={cells <= 200}\n labelTextColor={labelOn}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n margin={{ top: 8, right: legend ? 72 : 8, bottom: cells <= 200 ? 40 : 8, left: cells <= 200 ? 64 : 8 }}\n axisTop={null}\n axisBottom={cells <= 200 ? { tickSize: 0, tickPadding: 8 } : null}\n axisLeft={cells <= 200 ? { tickSize: 0, tickPadding: 8 } : null}\n legends={\n legend\n ? [\n {\n anchor: \"right\",\n translateX: 40,\n length: 160,\n thickness: 8,\n direction: \"column\",\n tickSize: 0,\n tickSpacing: 4,\n tickFormat: valueFormatter,\n },\n ]\n : []\n }\n animate={!canvas}\n />\n );\n }\n\n case \"calendar\": {\n const Component = canvas ? CalendarCanvas : CalendarSvg;\n const days = data as ChartDay[];\n const range = calendarRange(days, from, to);\n return (\n <Component\n data={days}\n from={range.from}\n to={range.to}\n theme={theme}\n colors={scales.sequentialSteps(5)}\n emptyColor={scales.empty}\n dayBorderColor={scales.surface}\n dayBorderWidth={2}\n monthBorderColor={border}\n monthBorderWidth={1}\n margin={{ top: 24, right: 24, bottom: 8, left: 32 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n legends={\n legend\n ? [\n {\n anchor: \"bottom-right\",\n direction: \"row\",\n translateY: 36,\n itemCount: 4,\n itemWidth: 42,\n itemHeight: 36,\n itemsSpacing: 14,\n itemDirection: \"right-to-left\",\n },\n ]\n : []\n }\n />\n );\n }\n\n case \"treemap\": {\n const Component = canvas ? TreeMapCanvas : TreeMapSvg;\n const tree = data as ChartTree;\n return (\n <Component\n data={tree}\n identity={treeIdentity(tree)}\n value=\"value\"\n theme={theme}\n colors={colors}\n nodeOpacity={1}\n borderColor={scales.surface}\n borderWidth={2}\n labelTextColor={labelOn}\n parentLabelTextColor={labelColor}\n labelSkipSize={16}\n leavesOnly\n innerPadding={2}\n margin={{ top: 4, right: 4, bottom: 4, left: 4 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n animate={!canvas}\n />\n );\n }\n\n case \"sunburst\": {\n const tree = data as ChartTree;\n return (\n <SunburstSvg\n data={tree}\n id={treeIdentity(tree)}\n value=\"value\"\n theme={theme}\n colors={colors}\n inheritColorFromParent\n childColor={{ from: \"color\", modifiers: [[\"opacity\", 0.75]] }}\n borderColor={scales.surface}\n borderWidth={2}\n cornerRadius={2}\n enableArcLabels\n arcLabel=\"id\"\n arcLabelsSkipAngle={12}\n arcLabelsTextColor={labelOn}\n margin={{ top: 8, right: 8, bottom: 8, left: 8 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n />\n );\n }\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n Funnel,\n FunnelChart,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart,\n Scatter,\n ScatterChart,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { ChartLegend, ChartTooltip, seriesColor } from \"./container\";\nimport { toRows, toSlices } from \"./data\";\nimport type { ChartConfig, ChartRow, ChartSeries, ChartSlice, ChartType } from \"./types\";\n\nexport type RechartsType = Extract<\n ChartType,\n \"bar\" | \"line\" | \"area\" | \"pie\" | \"donut\" | \"scatter\" | \"scatterplot\" | \"radar\" | \"funnel\"\n>;\n\nexport interface RechartsRenderProps {\n type: RechartsType;\n data: unknown;\n config: ChartConfig;\n indexBy?: string;\n keys?: string[];\n stacked?: boolean;\n legend: boolean;\n grid: boolean;\n tooltip: boolean;\n valueFormatter?: (value: number) => string;\n}\n\nconst MARGIN = { top: 8, right: 8, bottom: 0, left: 0 };\n\n/**\n * The Recharts side of `Chart`. Returns a chart element for the\n * ResponsiveContainer inside ChartContainer; colours come from `seriesColor`\n * (config colour or `var(--ds-viz-N)` by series index) and every other visual\n * value from the container's token styling.\n */\nexport function RechartsChart({\n type,\n data,\n config,\n indexBy,\n keys,\n stacked,\n legend,\n grid,\n tooltip,\n valueFormatter,\n}: RechartsRenderProps): React.ReactElement {\n const tip = tooltip ? (\n <ChartTooltip\n formatter={valueFormatter ? (value: unknown) => valueFormatter(Number(value)) : undefined}\n />\n ) : null;\n const leg = legend ? <ChartLegend /> : null;\n\n switch (type) {\n case \"bar\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <BarChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n name={key}\n fill={seriesColor(config, key, i)}\n stackId={stacked ? \"stack\" : undefined}\n radius={stacked ? 0 : [2, 2, 0, 0]}\n maxBarSize={48}\n />\n ))}\n </BarChart>\n );\n }\n\n case \"line\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <LineChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 4 }}\n />\n ))}\n </LineChart>\n );\n }\n\n case \"area\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <AreaChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n fill={seriesColor(config, key, i)}\n fillOpacity={0.2}\n strokeWidth={2}\n stackId={stacked ? \"stack\" : undefined}\n />\n ))}\n </AreaChart>\n );\n }\n\n case \"pie\":\n case \"donut\": {\n const slices = toSlices(data as ChartSlice[]);\n return (\n <PieChart margin={MARGIN}>\n {tip}\n {leg}\n <Pie\n data={slices}\n dataKey=\"value\"\n nameKey=\"name\"\n innerRadius={type === \"donut\" ? \"55%\" : 0}\n outerRadius=\"80%\"\n paddingAngle={type === \"donut\" ? 2 : 0}\n strokeWidth={1}\n >\n {slices.map((slice, i) => (\n <Cell key={slice.id} fill={seriesColor(config, slice.id, i)} />\n ))}\n </Pie>\n </PieChart>\n );\n }\n\n case \"scatter\":\n case \"scatterplot\": {\n const series = data as ChartSeries[];\n return (\n <ScatterChart margin={MARGIN}>\n {grid ? <CartesianGrid /> : null}\n <XAxis dataKey=\"x\" type=\"number\" name=\"x\" tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis dataKey=\"y\" type=\"number\" name=\"y\" tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((s, i) => (\n <Scatter key={String(s.id)} name={String(s.id)} data={s.data} fill={seriesColor(config, String(s.id), i)} />\n ))}\n </ScatterChart>\n );\n }\n\n case \"radar\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <RadarChart data={rows} margin={MARGIN}>\n {grid ? <PolarGrid /> : null}\n <PolarAngleAxis dataKey={index} />\n <PolarRadiusAxis tick={false} axisLine={false} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Radar\n key={key}\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n fill={seriesColor(config, key, i)}\n fillOpacity={0.2}\n strokeWidth={2}\n />\n ))}\n </RadarChart>\n );\n }\n\n case \"funnel\": {\n const slices = toSlices(data as ChartSlice[]);\n return (\n <FunnelChart margin={MARGIN}>\n {tip}\n {leg}\n <Funnel data={slices} dataKey=\"value\" nameKey=\"name\">\n {slices.map((slice, i) => (\n <Cell key={slice.id} fill={seriesColor(config, slice.id, i)} />\n ))}\n </Funnel>\n </FunnelChart>\n );\n }\n }\n}\n","import type * as React from \"react\";\n\n/**\n * Chart types and the data shape each one expects.\n *\n * Engine per type (see cortena-docs/cortenaUI&Design/03-charting.md):\n *\n * | type | engine |\n * | -------------------------------------------------------- | ------------------------- |\n * | bar, line, area, pie, donut, scatter, radar, funnel | Recharts (static import) |\n * | heatmap, calendar, treemap, sunburst | Nivo (lazy, per package) |\n *\n * Data shapes (the webchat renderer's legacy shapes are all accepted):\n *\n * - **bar**, **radar**: `ChartRow[]` — one object per category with a string\n * category key (`indexBy`, inferred as the first string field) and one\n * numeric field per series (`keys`, inferred as every numeric field).\n * `[{ month: \"Jan\", revenue: 12, cost: 8 }, …]`. The series shape below is\n * also accepted and pivoted.\n * - **line**, **area**: `ChartSeries[]` — `[{ id: \"revenue\", data: [{ x, y }] }]`\n * (the Nivo line shape the webchat emits). `ChartRow[]` is also accepted.\n * - **pie**, **donut**, **funnel**: `ChartSlice[]` — `[{ id, label?, value }]`.\n * - **scatter** (alias `scatterplot`): `ChartSeries[]` — one series per group.\n * - **heatmap**: `ChartSeries[]` — Nivo heatmap shape, `[{ id: row, data: [{ x: column, y: value }] }]` —\n * or `ChartMatrix`, the categorical form a correlation / confusion matrix\n * already has: `{ rows, columns, values }` with `values[r][c]` at\n * `rows[r] × columns[c]`.\n * - **calendar**: `ChartDay[]` — `[{ day: \"2026-01-31\", value }]`; `from`/`to`\n * default to the data's range.\n * - **treemap**, **sunburst**: `ChartTree` — Nivo tree, `{ id, children?: [...], value? }`\n * (`name` is accepted in place of `id`).\n */\nexport type ChartType =\n | \"bar\"\n | \"line\"\n | \"area\"\n | \"pie\"\n | \"donut\"\n | \"scatter\"\n | \"scatterplot\"\n | \"radar\"\n | \"funnel\"\n | \"heatmap\"\n | \"calendar\"\n | \"treemap\"\n | \"sunburst\";\n\n/** The engine that draws a given type. */\nexport type ChartEngine = \"recharts\" | \"nivo\";\n\n/** Nivo renderer; only the Nivo types honour it (Recharts is SVG only). */\nexport type ChartRenderer = \"svg\" | \"canvas\";\n\n/** One category with a numeric value per series. */\nexport type ChartRow = Record<string, string | number | null | undefined>;\n\n/** One series of points; x may be a category or a number, y a number. */\nexport interface ChartPoint {\n x: string | number;\n y: number | null;\n}\nexport interface ChartSeries {\n id: string | number;\n data: ChartPoint[];\n}\n\n/** One slice of a pie, donut or funnel. */\nexport interface ChartSlice {\n id: string | number;\n label?: string;\n value: number;\n}\n\n/**\n * A categorical matrix: `values[r][c]` is the cell at `rows[r]` × `columns[c]`.\n * The shape a correlation matrix, a confusion matrix or a day × hour grid is\n * already in, so it needs no pivot at the call site. Short rows are padded\n * with `null` (drawn as the empty colour) rather than treated as zero.\n */\nexport interface ChartMatrix {\n rows: string[];\n columns: string[];\n values: Array<Array<number | null | undefined>>;\n}\n\n/** One day of a calendar heatmap. */\nexport interface ChartDay {\n day: string;\n value: number;\n}\n\n/** A Nivo tree node for treemap and sunburst. */\nexport interface ChartTree {\n id?: string | number;\n name?: string;\n value?: number;\n children?: ChartTree[];\n [key: string]: unknown;\n}\n\n/** The data type accepted for each chart type. */\nexport type ChartDataFor<T extends ChartType> = T extends \"bar\" | \"radar\"\n ? ChartRow[] | ChartSeries[]\n : T extends \"line\" | \"area\"\n ? ChartSeries[] | ChartRow[]\n : T extends \"pie\" | \"donut\" | \"funnel\"\n ? ChartSlice[]\n : T extends \"heatmap\"\n ? ChartSeries[] | ChartMatrix\n : T extends \"scatter\" | \"scatterplot\"\n ? ChartSeries[]\n : T extends \"calendar\"\n ? ChartDay[]\n : T extends \"treemap\" | \"sunburst\"\n ? ChartTree\n : never;\n\n/**\n * Per-series presentation, keyed by series id (the `keys` of a row chart, the\n * `id` of a series or slice). Colours default to `var(--ds-viz-1..n)` in key\n * order, so the same category index gets the same colour in every app; set\n * `color` only to pin a category to a semantic colour, and then only to a\n * token (`var(--ds-success)`), never a literal.\n */\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n color?: string;\n }\n>;\n\n/** Which continuous scale a heatmap or calendar uses. */\nexport type ChartScale = \"sequential\" | \"diverging\";\n\nexport const RECHARTS_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\n \"bar\",\n \"line\",\n \"area\",\n \"pie\",\n \"donut\",\n \"scatter\",\n \"scatterplot\",\n \"radar\",\n \"funnel\",\n]);\n\nexport const NIVO_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\n \"heatmap\",\n \"calendar\",\n \"treemap\",\n \"sunburst\",\n]);\n\n/** The engine the package uses for a chart type. */\nexport function chartEngine(type: ChartType): ChartEngine {\n return NIVO_TYPES.has(type) ? \"nivo\" : \"recharts\";\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { ChartContainer, ChartEmpty, ChartError, ChartLoading, type ChartContainerProps } from \"./container\";\nimport { configFor, isEmptyData, isMatrix, isSeriesArray, toRows, toSlices } from \"./data\";\nimport { NivoChart, type NivoType } from \"./nivo-charts\";\nimport { RechartsChart, type RechartsType } from \"./recharts-charts\";\nimport {\n chartEngine,\n type ChartConfig,\n type ChartDataFor,\n type ChartMatrix,\n type ChartRenderer,\n type ChartRow,\n type ChartScale,\n type ChartSeries,\n type ChartSlice,\n type ChartTree,\n type ChartType,\n} from \"./types\";\n\nexport interface ChartProps<T extends ChartType = ChartType>\n extends Omit<ChartContainerProps, \"children\" | \"config\" | \"responsive\"> {\n /** Which chart to draw; the package picks the engine. See {@link ChartType} for the data shape per type. */\n type: T;\n /** The data, in the shape documented on {@link ChartType}. */\n data: ChartDataFor<T>;\n /** Series presentation keyed by series id; colours default to `--ds-viz-1..n` in order. */\n config?: ChartConfig;\n /** Nivo renderer; `canvas` for large series. Ignored by the Recharts types and by sunburst. */\n renderer?: ChartRenderer;\n /** Category key for row data (bar, line, area, radar); inferred as the first string field. */\n indexBy?: string;\n /** Series keys for row data; inferred as every numeric field. */\n keys?: string[];\n /** Stack bars and areas instead of grouping them. */\n stacked?: boolean;\n /** Continuous scale for heatmap and calendar. Default sequential. */\n scale?: ChartScale;\n /** Show a legend. Default: when there is more than one series. */\n legend?: boolean;\n /** Draw grid lines (cartesian and radar types). Default true. */\n grid?: boolean;\n /** Show a tooltip on hover. Default true. */\n tooltip?: boolean;\n /** Format values in axes, tooltips and labels. */\n valueFormatter?: (value: number) => string;\n /** Calendar range (ISO dates); defaults to the data's extent. */\n from?: string;\n to?: string;\n /** Render the loading skeleton instead of the data. */\n loading?: boolean;\n /** Render the error state with this message instead of the data. */\n error?: React.ReactNode | Error | null;\n /** Content of the empty state. Default \"No data\". */\n emptyMessage?: React.ReactNode;\n}\n\nfunction seriesKeys(type: ChartType, data: unknown, indexBy?: string, keys?: string[]): string[] {\n switch (type) {\n case \"bar\":\n case \"line\":\n case \"area\":\n case \"radar\":\n return toRows(data as ChartRow[] | ChartSeries[], indexBy, keys).keys;\n case \"pie\":\n case \"donut\":\n case \"funnel\":\n return toSlices(data as ChartSlice[]).map((s) => s.id);\n case \"heatmap\":\n if (isMatrix(data)) return data.rows.map(String);\n return isSeriesArray(data) ? data.map((s) => String(s.id)) : [];\n case \"scatter\":\n case \"scatterplot\":\n return isSeriesArray(data) ? data.map((s) => String(s.id)) : [];\n case \"treemap\":\n case \"sunburst\":\n return ((data as ChartTree).children ?? []).map((c) => String(c.id ?? c.name ?? \"\"));\n case \"calendar\":\n return [];\n }\n}\n\nclass ChunkBoundary extends React.Component<\n { children: React.ReactNode; fallback: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n\n/**\n * Chart — one component for every chart type the fleet draws.\n *\n * `type` picks the engine: Recharts (bundled) for bar, line, area, pie, donut,\n * scatter, radar and funnel; Nivo, lazy-loaded per package, for heatmap,\n * calendar, treemap and sunburst, with `renderer=\"canvas\"` for large series.\n * Colours, fonts, axes, grid, tooltip, legend and the empty, loading and\n * error states all come from cortena-design tokens; a consumer passes data\n * and, optionally, a `config` of labels.\n *\n * `heatmap` takes either the Nivo series shape or a categorical\n * {@link ChartMatrix} — `{ rows, columns, values }` — for the correlation and\n * confusion matrices that are already in that form.\n *\n * `testMode` gives the drawing area a 600×300 floor so a chart still draws\n * where the layout gives it no size; see {@link ChartContainerProps.testMode}\n * and README.md, \"Charts in tests\".\n */\nfunction Chart<T extends ChartType>({\n type,\n data,\n config,\n renderer = \"svg\",\n indexBy,\n keys,\n stacked,\n scale = \"sequential\",\n legend,\n grid = true,\n tooltip = true,\n valueFormatter,\n from,\n to,\n loading,\n error,\n emptyMessage,\n className,\n height,\n ...props\n}: ChartProps<T>) {\n const engine = chartEngine(type);\n const empty = isEmptyData(data);\n const fullConfig = React.useMemo(\n () => configFor(empty ? [] : seriesKeys(type, data, indexBy, keys), config),\n [type, data, indexBy, keys, config, empty],\n );\n const showLegend = legend ?? Object.keys(fullConfig).length > 1;\n const errorText = error instanceof Error ? error.message : error;\n\n let body: React.ReactNode;\n let responsive = false;\n if (loading) body = <ChartLoading />;\n else if (errorText) body = <ChartError>{errorText}</ChartError>;\n else if (empty) body = <ChartEmpty>{emptyMessage}</ChartEmpty>;\n else if (engine === \"nivo\") {\n body = (\n <ChunkBoundary fallback={<ChartError>Chart could not be loaded</ChartError>}>\n <React.Suspense fallback={<ChartLoading />}>\n <NivoChart\n type={type as NivoType}\n data={data}\n config={fullConfig}\n renderer={renderer}\n scale={scale}\n legend={showLegend}\n valueFormatter={valueFormatter}\n from={from}\n to={to}\n />\n </React.Suspense>\n </ChunkBoundary>\n );\n } else {\n responsive = true;\n body = (\n <RechartsChart\n type={type as RechartsType}\n data={data}\n config={fullConfig}\n indexBy={indexBy}\n keys={keys}\n stacked={stacked}\n legend={showLegend}\n grid={grid}\n tooltip={tooltip}\n valueFormatter={valueFormatter}\n />\n );\n }\n\n return (\n <ChartContainer\n data-type={type}\n data-engine={engine}\n data-renderer={engine === \"nivo\" ? renderer : \"svg\"}\n config={fullConfig}\n height={height}\n responsive={responsive}\n className={cn(className)}\n {...props}\n >\n {body}\n </ChartContainer>\n );\n}\n\nexport { Chart };\n","\"use client\";\n\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\nimport { Check, Minus } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Checkbox.\n *\n * Base UI renders a `<span role=\"checkbox\">` with a hidden `<input>` beside\n * it, so it submits with forms and takes `checked`/`defaultChecked`. The\n * indicator only mounts while checked or indeterminate; the icon inside it is\n * a lucide Check, or a Minus when `indeterminate` is set.\n *\n * The 16px box takes half the small radius: the 8px ladder step would round\n * it into a circle.\n */\nexport interface CheckboxProps extends React.ComponentProps<typeof BaseCheckbox.Root> {}\n\nfunction Checkbox({ className, indeterminate, ...props }: CheckboxProps) {\n return (\n <BaseCheckbox.Root\n data-slot=\"checkbox\"\n indeterminate={indeterminate}\n className={cn(\n \"peer inline-flex size-4 shrink-0 items-center justify-center rounded-[calc(var(--ds-radius-sm)/2)] border\",\n \"border-[var(--ds-input)] bg-[var(--ds-background)]\",\n \"transition-[background-color,border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[checked]:border-[var(--ds-primary)] data-[checked]:bg-[var(--ds-primary)] data-[checked]:text-[color:var(--ds-primary-foreground)]\",\n \"data-[indeterminate]:border-[var(--ds-primary)] data-[indeterminate]:bg-[var(--ds-primary)] data-[indeterminate]:text-[color:var(--ds-primary-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current [&_svg]:size-3.5 [&_svg]:shrink-0\"\n >\n {indeterminate ? <Minus strokeWidth={3} /> : <Check strokeWidth={3} />}\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n );\n}\n\nexport { Checkbox };\n","\"use client\";\n\nimport { AlertTriangle, RefreshCw, X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface ErrorBannerProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n message: string;\n onDismiss?: () => void;\n onRetry?: () => void;\n}\n\nconst actionClass = cn(\n \"inline-flex items-center justify-center rounded-[var(--ds-radius-sm)] p-1\",\n \"text-[color:var(--ds-destructive)] hover:bg-[var(--ds-destructive)]/10\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-destructive)]/40\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n);\n\n/**\n * ErrorBanner — the one error surface every screen uses: a warning icon, the\n * message, and optional Retry / Dismiss actions. Renders nothing for an empty\n * message so callers can pass their error state straight through.\n */\nfunction ErrorBanner({ message, onDismiss, onRetry, className, ...props }: ErrorBannerProps) {\n if (!message) {\n return null;\n }\n\n return (\n <div\n data-slot=\"error-banner\"\n role=\"alert\"\n className={cn(\n \"flex items-start gap-3 rounded-[var(--ds-radius-md)] border px-4 py-3\",\n \"border-[var(--ds-destructive)]/30 bg-[var(--ds-destructive-soft)]\",\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n \"text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n >\n <AlertTriangle aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <p data-slot=\"error-banner-message\" className=\"flex-1\">\n {message}\n </p>\n {onRetry || onDismiss ? (\n <div className=\"flex shrink-0 items-center gap-1\">\n {onRetry ? (\n <button type=\"button\" onClick={onRetry} aria-label=\"Retry\" className={actionClass}>\n <RefreshCw className=\"size-3.5\" />\n </button>\n ) : null}\n {onDismiss ? (\n <button type=\"button\" onClick={onDismiss} aria-label=\"Dismiss\" className={actionClass}>\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { ErrorBanner };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Input.\n *\n * A plain `<input>`; Base UI has no primitive for it and none is needed. The\n * look is cortenaweb's: sunken surface, subtle border that strengthens on hover\n * and takes the ring colour on focus. `aria-invalid` swaps the border and ring\n * for the destructive pair so a Field can mark errors without extra classes.\n */\nconst inputClassName = cn(\n \"flex h-10 w-full min-w-0 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] px-3 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"outline-none focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"file:border-0 file:bg-transparent file:text-[length:var(--ds-text-body-sm)] file:font-medium file:text-[color:var(--ds-foreground)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n);\n\nexport interface InputProps extends React.ComponentProps<\"input\"> {}\n\nfunction Input({ className, type, ...props }: InputProps) {\n return <input type={type} data-slot=\"input\" className={cn(inputClassName, className)} {...props} />;\n}\n\nexport { Input, inputClassName };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SpinnerProps extends React.ComponentProps<\"span\"> {\n /** Diameter in px. Defaults to 16. */\n size?: number;\n /**\n * `inverse` for a spinner on a filled surface — inside a primary or\n * destructive Button, on a toast, on any `-foreground` pairing. The default\n * ring is `--ds-border` with a `--ds-primary` leading edge, which all but\n * disappears on a primary fill; `inverse` draws both from\n * `--ds-primary-foreground` instead.\n */\n tone?: \"default\" | \"inverse\";\n}\n\n/**\n * Spinner — a ring with a coloured leading edge. Announces itself as\n * `role=\"status\"` with a \"Loading\" label; pass `aria-label` to override.\n *\n * ```tsx\n * <Button disabled>\n * <Spinner tone=\"inverse\" /> Saving…\n * </Button>\n * ```\n */\nfunction Spinner({ className, size = 16, tone = \"default\", style, ...props }: SpinnerProps) {\n return (\n <span\n data-slot=\"spinner\"\n data-tone={tone}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-block shrink-0 animate-spin rounded-[var(--ds-radius-full)] border-2\",\n tone === \"inverse\"\n ? \"border-[var(--ds-primary-foreground)]/35 border-t-[var(--ds-primary-foreground)]\"\n : \"border-[var(--ds-border)] border-t-[var(--ds-primary)]\",\n className,\n )}\n style={{ width: size, height: size, ...style }}\n {...props}\n />\n );\n}\n\nexport { Spinner };\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DropdownMenu over Base UI's Menu.\n *\n * `DropdownMenuContent` and `DropdownMenuSubContent` compose Portal +\n * Positioner + Popup, so consumers keep writing one element; `side`, `align`\n * and `sideOffset` are forwarded to the Positioner where Base UI reads them.\n *\n * Radix users: `asChild` on the trigger becomes `render={<Button />}`;\n * `onSelect` on items is `onClick`; `DropdownMenuLabel` is Base UI's\n * `Menu.GroupLabel` (place it inside a `DropdownMenuGroup` for the\n * `aria-labelledby` wiring); `DropdownMenuCheckboxItem` reports through\n * `onCheckedChange(checked, eventDetails)`; `DropdownMenuRadioGroup` through\n * `onValueChange(value, eventDetails)`. Highlight state is `data-highlighted`,\n * not `:focus`.\n */\nfunction DropdownMenu(props: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root {...props} />;\n}\n\nfunction DropdownMenuTrigger(props: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuPortal(props: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuGroup(props: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuSub(props: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot {...props} />;\n}\n\nfunction DropdownMenuRadioGroup(props: MenuPrimitive.RadioGroup.Props) {\n return <MenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\ntype PositionerProps = Pick<\n MenuPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface DropdownMenuContentProps extends MenuPrimitive.Popup.Props, PositionerProps {\n /** Keep the menu mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the menu; defaults to `<body>`. */\n container?: MenuPrimitive.Portal.Props[\"container\"];\n}\n\nconst popupClassName = [\n \"min-w-[8rem] overflow-hidden p-1 outline-none\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n];\n\nfunction DropdownMenuContent({\n className,\n side,\n align,\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: DropdownMenuContentProps) {\n return (\n <MenuPrimitive.Portal keepMounted={keepMounted} container={container}>\n <MenuPrimitive.Positioner\n data-slot=\"dropdown-menu-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(popupClassName, className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n side,\n align,\n sideOffset,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: DropdownMenuContentProps) {\n return (\n <MenuPrimitive.Portal keepMounted={keepMounted} container={container}>\n <MenuPrimitive.Positioner\n data-slot=\"dropdown-menu-sub-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(popupClassName, className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nconst itemClassName = [\n \"relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 outline-none\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-body-sm)]\",\n \"transition-colors duration-[var(--ds-duration-fast)]\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n];\n\nexport interface DropdownMenuItemProps extends MenuPrimitive.Item.Props {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}\n\nfunction DropdownMenuItem({ className, inset, variant = \"default\", ...props }: DropdownMenuItemProps) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset ? \"\" : undefined}\n data-variant={variant}\n className={cn(\n itemClassName,\n inset && \"pl-8\",\n variant === \"destructive\" &&\n \"text-[color:var(--ds-destructive)] data-[highlighted]:bg-[var(--ds-destructive-soft)] data-[highlighted]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({ className, children, ...props }: MenuPrimitive.CheckboxItem.Props) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(itemClassName, \"pl-8 pr-2\", className)}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenuPrimitive.CheckboxItemIndicator data-slot=\"dropdown-menu-checkbox-item-indicator\">\n <Check className=\"size-3.5\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(itemClassName, \"pl-8 pr-2\", className)}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenuPrimitive.RadioItemIndicator data-slot=\"dropdown-menu-radio-item-indicator\">\n <Circle className=\"size-2 fill-current\" />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport interface DropdownMenuLabelProps extends MenuPrimitive.GroupLabel.Props {\n inset?: boolean;\n}\n\nfunction DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset ? \"\" : undefined}\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] font-semibold text-[color:var(--ds-muted-foreground)]\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border-subtle)]\", className)}\n {...props}\n />\n );\n}\n\nexport interface DropdownMenuSubTriggerProps extends MenuPrimitive.SubmenuTrigger.Props {\n inset?: boolean;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: DropdownMenuSubTriggerProps) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset ? \"\" : undefined}\n className={cn(\n itemClassName,\n \"popup-open:bg-[var(--ds-hover)] popup-open:text-[color:var(--ds-foreground)]\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-[length:var(--ds-text-caption)] tracking-widest text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","\"use client\";\n\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Select.\n *\n * `SelectContent` composes Base UI's Portal + Positioner + Popup so consumers\n * keep writing `<SelectContent side=\"bottom\" align=\"start\">`; positioning\n * props are forwarded to the Positioner, which is where Base UI reads them.\n *\n * Radix users:\n * - `SelectValue` shows the raw value unless the Root is given `items`\n * (`{ [value]: label }` or `[{ value, label }]`) or `itemToStringLabel`;\n * Base UI does not read the label out of an unmounted `SelectItem`.\n * - `onValueChange` receives `(value, eventDetails)`.\n * - `SelectContent` defaults to the dropdown layout; pass\n * `alignItemWithTrigger` for Base UI's native-like overlay of the selected item.\n *\n * ## Typing the value\n *\n * `null` is the cleared / placeholder state, so `onValueChange` always hands\n * back `Value | null`, never bare `Value`. Name the value type on the element\n * to keep that union at `string | null` instead of letting inference widen it:\n *\n * ```tsx\n * const [status, setStatus] = useState(\"\");\n *\n * <Select<string>\n * // \"\" is not a value any item carries; `|| null` is the placeholder state,\n * // which is what makes SelectValue fall back to its `placeholder`.\n * value={status || null}\n * onValueChange={(next) => setStatus(next ?? \"\")} // next: string | null\n * >\n * ```\n *\n * Without the explicit `<string>` the type argument is inferred from `value`,\n * so a `string | null` value widens `Value` and the handler's parameter turns\n * into `string | null | null`. Multi-select narrows too:\n * `<Select<string, true> multiple>` hands back `string[]`, never `null`.\n *\n * `SelectProps` is the same props type, for a wrapper that forwards them.\n */\nexport type SelectProps<\n Value = string,\n Multiple extends boolean | undefined = false,\n> = SelectPrimitive.Root.Props<Value, Multiple>;\n\nfunction Select<Value, Multiple extends boolean | undefined = false>(\n props: SelectProps<Value, Multiple>,\n) {\n return <SelectPrimitive.Root {...props} />;\n}\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"flex flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\n \"flex-1 truncate text-left data-[placeholder]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface SelectTriggerProps extends SelectPrimitive.Trigger.Props {\n size?: \"sm\" | \"md\";\n}\n\nfunction SelectTrigger({ className, size = \"md\", children, ...props }: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit min-w-40 items-center justify-between gap-2 whitespace-nowrap px-3\",\n size === \"sm\" ? \"h-8 text-[length:var(--ds-text-caption)]\" : \"h-9 text-[length:var(--ds-text-caption-lg)]\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-input)]\",\n \"bg-[var(--ds-background)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]\",\n \"transition-[border-color,box-shadow,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none hover:border-[var(--ds-border-strong)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[popup-open]:border-[var(--ds-ring)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[var(--ds-destructive)]/30\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n data-slot=\"select-icon\"\n className=\"flex text-[color:var(--ds-muted-foreground)] transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180\"\n >\n <ChevronDown />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\ntype PositionerProps = Pick<\n SelectPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n | \"alignItemWithTrigger\"\n>;\n\nexport interface SelectContentProps extends SelectPrimitive.Popup.Props, PositionerProps {\n /** Where to portal the popup; defaults to `<body>`. */\n container?: SelectPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n alignItemWithTrigger = false,\n container,\n ...props\n}: SelectContentProps) {\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Positioner\n data-slot=\"select-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50 outline-none\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n className={cn(\n \"relative max-h-[var(--available-height,none)] min-w-[var(--anchor-width,auto)] overflow-y-auto overflow-x-hidden p-1\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"outline-none\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {children}\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText data-slot=\"select-item-text\" className=\"flex-1 truncate\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]\"\n >\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n};\n","import type { RowData } from \"@tanstack/react-table\";\nimport type { DataTableColumn, DataTableRow, DataTableTable } from \"./types\";\n\nexport type ExportCell = string | number | boolean | Date | null;\n\nexport interface ExportSheet {\n headers: string[];\n records: ExportCell[][];\n}\n\n/** Human label for a column: `meta.label`, a string header, or the id. */\nexport function columnLabel<Row extends RowData>(column: DataTableColumn<Row, any>): string {\n const def = column.columnDef;\n if (def.meta?.label) return def.meta.label;\n if (typeof def.header === \"string\") return def.header;\n return column.id;\n}\n\nfunction exportableColumns<Row extends RowData>(table: DataTableTable<Row>) {\n return table\n .getVisibleLeafColumns()\n .filter((c) => c.columnDef.meta?.exportable !== false && (c.accessorFn || c.columnDef.meta?.exportValue));\n}\n\nfunction toCell(value: unknown): ExportCell {\n if (value == null) return null;\n if (value instanceof Date) return value;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return value;\n return JSON.stringify(value);\n}\n\n/**\n * Rows to export: every row the current filters and sort leave, ignoring the\n * page, for a client source; the loaded page(s) for a server source, which is\n * all the table has. Pass `rows` to export a selection instead.\n */\nexport function exportRows<Row extends RowData>(table: DataTableTable<Row>): DataTableRow<Row>[] {\n return table.getPrePaginatedRowModel().rows;\n}\n\nexport function toSheet<Row extends RowData>(\n table: DataTableTable<Row>,\n rows: DataTableRow<Row>[] = exportRows(table),\n): ExportSheet {\n const columns = exportableColumns(table);\n return {\n headers: columns.map(columnLabel),\n records: rows.map((row) =>\n columns.map((column) => {\n const custom = column.columnDef.meta?.exportValue;\n return toCell(custom ? custom(row.original) : row.getValue(column.id));\n }),\n ),\n };\n}\n\nfunction csvField(value: ExportCell): string {\n if (value == null) return \"\";\n const text = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\n\\r]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/** RFC 4180 text: comma separated, CRLF lines, quotes doubled. */\nexport function toCsv<Row extends RowData>(\n table: DataTableTable<Row>,\n rows?: DataTableRow<Row>[],\n): string {\n const { headers, records } = toSheet(table, rows);\n return [headers, ...records].map((line) => line.map(csvField).join(\",\")).join(\"\\r\\n\");\n}\n\nfunction download(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.rel = \"noopener\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\nexport function downloadCsv<Row extends RowData>(\n table: DataTableTable<Row>,\n fileName = \"export\",\n rows?: DataTableRow<Row>[],\n): void {\n // The BOM makes Excel read UTF-8 correctly; the text itself stays plain.\n download(\n new Blob([\"\\uFEFF\", toCsv(table, rows)], { type: \"text/csv;charset=utf-8\" }),\n `${fileName}.csv`,\n );\n}\n\n/**\n * Excel through exceljs, loaded on first use so the workbook code (about\n * 300 KB) never sits in a bundle that only ever exports CSV.\n */\nexport async function downloadExcel<Row extends RowData>(\n table: DataTableTable<Row>,\n fileName = \"export\",\n rows?: DataTableRow<Row>[],\n): Promise<void> {\n const { headers, records } = toSheet(table, rows);\n const ExcelJS = await import(\"exceljs\");\n const workbook = new ExcelJS.Workbook();\n const sheet = workbook.addWorksheet(\"Sheet1\");\n sheet.columns = headers.map((header, i) => ({\n header,\n key: String(i),\n width: Math.min(60, Math.max(10, header.length + 2)),\n }));\n for (const record of records) sheet.addRow(record);\n sheet.getRow(1).font = { bold: true };\n const buffer = await workbook.xlsx.writeBuffer();\n download(\n new Blob([buffer], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" }),\n `${fileName}.xlsx`,\n );\n}\n","\"use client\";\n\nimport type { RowData } from \"@tanstack/react-table\";\nimport {\n ArrowDown,\n ArrowUp,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n ChevronsUpDown,\n Download,\n EyeOff,\n ListFilter,\n PinOff,\n Search,\n Settings2,\n X,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"@/components/button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/dropdown-menu\";\nimport { Input } from \"@/components/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/select\";\nimport { cn } from \"@/lib/cn\";\nimport { columnLabel, downloadCsv, downloadExcel } from \"./export\";\nimport type { DataTableColumn, DataTableTable } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Column header */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableColumnHeaderProps<Row extends RowData>\n extends Omit<React.ComponentProps<\"div\">, \"title\"> {\n column: DataTableColumn<Row, any>;\n title: React.ReactNode;\n}\n\n/**\n * Header content for one column: the title as a sort toggle when the column\n * sorts, and a menu with sort, pin and hide when any of those apply. The\n * table renders it for every string `header` automatically; use it inside a\n * custom header function to keep the same affordances.\n */\nfunction DataTableColumnHeader<Row extends RowData>({\n column,\n title,\n className,\n ...props\n}: DataTableColumnHeaderProps<Row>) {\n const canSort = column.getCanSort();\n const canHide = column.getCanHide();\n const canPin = column.getCanPin();\n const sorted = column.getIsSorted();\n const align = column.columnDef.meta?.align ?? \"start\";\n\n if (!canSort && !canHide && !canPin) {\n return (\n <div data-slot=\"data-table-column-header\" className={cn(\"truncate\", className)} {...props}>\n {title}\n </div>\n );\n }\n\n const label = typeof title === \"string\" ? title : columnLabel(column);\n\n return (\n <div\n data-slot=\"data-table-column-header\"\n className={cn(\n \"group/header -mx-2 flex min-w-0 items-center\",\n // Leave room for the floating options trigger only while it shows;\n // anchored text does not move, it truncates if it must.\n align === \"end\" ? \"justify-end group-hover/head:pl-6\" : \"group-hover/head:pr-6\",\n align === \"center\" && \"justify-center\",\n className,\n )}\n {...props}\n >\n <button\n type=\"button\"\n data-slot=\"data-table-sort\"\n disabled={!canSort}\n onClick={canSort ? column.getToggleSortingHandler() : undefined}\n className={cn(\n \"inline-flex h-7 min-w-0 items-center gap-1 rounded-[var(--ds-radius-sm)] px-2 outline-none\",\n \"text-inherit transition-colors duration-[var(--ds-duration-fast)]\",\n canSort && \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:cursor-default\",\n )}\n >\n <span className=\"truncate\">{title}</span>\n {canSort ? (\n sorted === \"asc\" ? (\n <ArrowUp aria-hidden className=\"size-3.5 shrink-0 text-[color:var(--ds-primary)]\" />\n ) : sorted === \"desc\" ? (\n <ArrowDown aria-hidden className=\"size-3.5 shrink-0 text-[color:var(--ds-primary)]\" />\n ) : (\n // Out of flow until hover so narrow headers keep their full title.\n <ChevronsUpDown\n aria-hidden\n className=\"hidden size-3.5 shrink-0 opacity-60 group-hover/head:inline-block\"\n />\n )\n ) : null}\n </button>\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`${label} column options`}\n className={cn(\n // Floats over the cell edge so it costs the title no width.\n \"absolute top-1/2 z-[1] inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-[var(--ds-radius-sm)] outline-none\",\n align === \"end\" ? \"left-1\" : \"right-1\",\n \"bg-[var(--ds-muted)] opacity-0 transition-opacity duration-[var(--ds-duration-fast)]\",\n \"group-hover/head:opacity-100 focus-visible:opacity-100 data-[popup-open]:opacity-100\",\n \"hover:bg-[var(--ds-hover)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <ChevronDown className=\"size-3.5\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align === \"end\" ? \"end\" : \"start\"}>\n {canSort ? (\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={() => column.toggleSorting(false)}>\n <ArrowUp /> Sort ascending\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.toggleSorting(true)}>\n <ArrowDown /> Sort descending\n </DropdownMenuItem>\n {sorted ? (\n <DropdownMenuItem onClick={() => column.clearSorting()}>\n <ChevronsUpDown /> Clear sort\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuGroup>\n ) : null}\n {canSort && (canPin || canHide) ? <DropdownMenuSeparator /> : null}\n {canPin ? (\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={() => column.pin(\"start\")}>\n <ChevronsLeft /> Pin left\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.pin(\"end\")}>\n <ChevronsRight /> Pin right\n </DropdownMenuItem>\n {column.getIsPinned() ? (\n <DropdownMenuItem onClick={() => column.pin(false)}>\n <PinOff /> Unpin\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuGroup>\n ) : null}\n {canPin && canHide ? <DropdownMenuSeparator /> : null}\n {canHide ? (\n <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>\n <EyeOff /> Hide column\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Faceted filter */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableFacetedFilterOption {\n value: string | number | boolean;\n label?: string;\n icon?: React.ComponentType<{ className?: string }>;\n}\n\nexport interface DataTableFacetedFilterProps<Row extends RowData> {\n column: DataTableColumn<Row, any>;\n title?: React.ReactNode;\n /** Fixed options; defaults to the column's distinct values with counts (client source only). */\n options?: DataTableFacetedFilterOption[];\n className?: string;\n}\n\n/**\n * A checkbox list of a column's values. The filter value is the array of\n * picked values; the column's `filterFn` (`oneOf` by default for\n * `meta.filter: \"faceted\"`) decides what that means, and a server source\n * receives it verbatim in `TableQuery.filters`.\n */\nfunction DataTableFacetedFilter<Row extends RowData>({\n column,\n title,\n options,\n className,\n}: DataTableFacetedFilterProps<Row>) {\n const raw = column.getFilterValue();\n const selected = new Set<unknown>(Array.isArray(raw) ? raw : raw == null ? [] : [raw]);\n const facets = options ? null : column.getFacetedUniqueValues();\n const items: DataTableFacetedFilterOption[] =\n options ??\n column.columnDef.meta?.filterOptions ??\n Array.from(facets?.keys() ?? [])\n .filter((v): v is string | number | boolean => v != null && typeof v !== \"object\")\n .sort((a, b) => String(a).localeCompare(String(b)))\n .map((value) => ({ value }));\n const label = title ?? columnLabel(column);\n\n const toggle = (value: unknown, checked: boolean) => {\n const next = new Set(selected);\n if (checked) next.add(value);\n else next.delete(value);\n column.setFilterValue(next.size ? Array.from(next) : undefined);\n };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-faceted-filter\"\n render={<Button variant=\"outline\" size=\"sm\" className={cn(\"border-dashed\", className)} />}\n >\n <ListFilter />\n {label}\n {selected.size ? (\n <span\n data-slot=\"data-table-filter-count\"\n className={cn(\n \"ml-1 inline-flex h-5 min-w-5 items-center justify-center rounded-[var(--ds-radius-sm)] px-1.5\",\n \"bg-[var(--ds-primary-soft)] text-[length:var(--ds-text-caption-sm)] font-medium text-[color:var(--ds-primary-soft-foreground)]\",\n )}\n >\n {selected.size}\n </span>\n ) : null}\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-80 min-w-48 overflow-y-auto\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>{label}</DropdownMenuLabel>\n {items.length === 0 ? (\n <div className=\"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n No values\n </div>\n ) : null}\n {items.map((item) => {\n const Icon = item.icon;\n const count = facets?.get(item.value);\n return (\n <DropdownMenuCheckboxItem\n key={String(item.value)}\n closeOnClick={false}\n checked={selected.has(item.value)}\n onCheckedChange={(checked) => toggle(item.value, checked)}\n >\n {Icon ? <Icon className=\"size-4 text-[color:var(--ds-muted-foreground)]\" /> : null}\n <span className=\"flex-1 truncate\">{item.label ?? String(item.value)}</span>\n {count !== undefined ? (\n <span className=\"ml-auto font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\">\n {count}\n </span>\n ) : null}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuGroup>\n {selected.size ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => column.setFilterValue(undefined)} className=\"justify-center\">\n Clear filter\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* View options */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableViewOptionsProps<Row extends RowData> {\n table: DataTableTable<Row>;\n className?: string;\n}\n\n/** Column visibility menu. */\nfunction DataTableViewOptions<Row extends RowData>({ table, className }: DataTableViewOptionsProps<Row>) {\n const columns = table.getAllLeafColumns().filter((c) => c.getCanHide());\n if (columns.length === 0) return null;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-view-options\"\n aria-label=\"Toggle columns\"\n render={<Button variant=\"outline\" size=\"sm\" className={className} />}\n >\n <Settings2 />\n View\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"max-h-80 min-w-40 overflow-y-auto\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n {columns.map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n closeOnClick={false}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) => column.toggleVisibility(checked)}\n >\n {columnLabel(column)}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n {!table.getIsAllColumnsVisible() ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => table.toggleAllColumnsVisible(true)}>Show all</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Export menu */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableExportMenuProps<Row extends RowData> {\n table: DataTableTable<Row>;\n fileName?: string;\n className?: string;\n}\n\nfunction DataTableExportMenu<Row extends RowData>({ table, fileName, className }: DataTableExportMenuProps<Row>) {\n const selected = table.getSelectedRowModel().rows;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-export\"\n aria-label=\"Export\"\n render={<Button variant=\"outline\" size=\"sm\" className={className} />}\n >\n <Download />\n Export\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => downloadCsv(table, fileName)}>CSV</DropdownMenuItem>\n <DropdownMenuItem onClick={() => void downloadExcel(table, fileName)}>Excel</DropdownMenuItem>\n {selected.length ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => downloadCsv(table, fileName, selected)}>\n CSV of {selected.length} selected\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => void downloadExcel(table, fileName, selected)}>\n Excel of {selected.length} selected\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Toolbar */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableToolbarProps<Row extends RowData>\n extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n table: DataTableTable<Row>;\n /** Placeholder for the search box. @default \"Search…\" */\n searchPlaceholder?: string;\n /** Rendered while rows are selected, in place of the filters. */\n bulkActions?: (ctx: { rows: Row[]; table: DataTableTable<Row> }) => React.ReactNode;\n /** Extra controls on the right, before the view and export menus. */\n children?: React.ReactNode;\n /** @default true */\n enableExport?: boolean;\n exportFileName?: string;\n}\n\n/**\n * Search box, one faceted filter per `meta.filter: \"faceted\"` column, a reset\n * when anything is filtered, and the view / export menus. While rows are\n * selected the left side becomes the selection summary and `bulkActions`.\n */\nfunction DataTableToolbar<Row extends RowData>({\n table,\n searchPlaceholder = \"Search…\",\n bulkActions,\n children,\n enableExport = true,\n exportFileName,\n className,\n ...props\n}: DataTableToolbarProps<Row>) {\n const globalFilter = (table.state.globalFilter as string | undefined) ?? \"\";\n const canSearch = table.options.enableGlobalFilter !== false;\n const facetedColumns = table\n .getAllLeafColumns()\n .filter((c) => c.columnDef.meta?.filter === \"faceted\" && c.getCanFilter());\n const isFiltered = table.state.columnFilters.length > 0 || globalFilter !== \"\";\n const selectedRows = table.options.enableRowSelection ? table.getSelectedRowModel().rows : [];\n\n return (\n <div\n data-slot=\"data-table-toolbar\"\n className={cn(\"flex flex-wrap items-center gap-2\", className)}\n {...props}\n >\n {selectedRows.length ? (\n <div data-slot=\"data-table-bulk-actions\" className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <span className=\"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n <span className=\"font-medium text-[color:var(--ds-foreground)]\">{selectedRows.length}</span> selected\n </span>\n {bulkActions?.({ rows: selectedRows.map((r) => r.original), table })}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => table.resetRowSelection()}>\n Clear\n <X />\n </Button>\n </div>\n ) : (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n {canSearch ? (\n <div className=\"relative w-full max-w-64\">\n <Search\n aria-hidden\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-[color:var(--ds-text-tertiary)]\"\n />\n <Input\n data-slot=\"data-table-search\"\n type=\"search\"\n aria-label=\"Search\"\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => table.setGlobalFilter(e.target.value)}\n className=\"h-8 pl-8 text-[length:var(--ds-text-caption-lg)]\"\n />\n </div>\n ) : null}\n {facetedColumns.map((column) => (\n <DataTableFacetedFilter key={column.id} column={column} />\n ))}\n {isFiltered ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n table.resetColumnFilters();\n table.setGlobalFilter(\"\");\n }}\n >\n Reset\n <X />\n </Button>\n ) : null}\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n {children}\n <DataTableViewOptions table={table} />\n {enableExport ? <DataTableExportMenu table={table} fileName={exportFileName} /> : null}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pagination */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTablePaginationProps<Row extends RowData> extends React.ComponentProps<\"div\"> {\n table: DataTableTable<Row>;\n /** @default [10, 25, 50, 100] */\n pageSizeOptions?: number[];\n}\n\nconst DEFAULT_PAGE_SIZES = [10, 25, 50, 100];\n\nfunction DataTablePagination<Row extends RowData>({\n table,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n className,\n ...props\n}: DataTablePaginationProps<Row>) {\n const { pageIndex, pageSize } = table.state.pagination;\n const total = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = total === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min(total, (pageIndex + 1) * pageSize);\n const sizes = pageSizeOptions.includes(pageSize)\n ? pageSizeOptions\n : [...pageSizeOptions, pageSize].sort((a, b) => a - b);\n const sizeItems = sizes.map((s) => ({ value: String(s), label: String(s) }));\n\n const navButton = (label: string, icon: React.ReactNode, onClick: () => void, disabled: boolean) => (\n <Button variant=\"outline\" size=\"icon-sm\" aria-label={label} onClick={onClick} disabled={disabled}>\n {icon}\n </Button>\n );\n\n return (\n <div\n data-slot=\"data-table-pagination\"\n className={cn(\n \"flex flex-wrap items-center justify-between gap-3\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <Select\n items={sizeItems}\n value={String(pageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" aria-label=\"Rows per page\" className=\"min-w-0 w-[4.5rem]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {sizeItems.map((item) => (\n <SelectItem key={item.value} value={item.value}>\n {item.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-4\">\n <span data-slot=\"data-table-range\" aria-live=\"polite\">\n {from}–{to} of {total}\n </span>\n <div className=\"flex items-center gap-1\">\n {navButton(\"First page\", <ChevronsLeft />, () => table.firstPage(), !table.getCanPreviousPage())}\n {navButton(\"Previous page\", <ChevronLeft />, () => table.previousPage(), !table.getCanPreviousPage())}\n <span className=\"px-1 tabular-nums\">\n {pageCount === 0 ? 0 : pageIndex + 1} / {pageCount}\n </span>\n {navButton(\"Next page\", <ChevronRight />, () => table.nextPage(), !table.getCanNextPage())}\n {navButton(\"Last page\", <ChevronsRight />, () => table.lastPage(), !table.getCanNextPage())}\n </div>\n </div>\n </div>\n );\n}\n\nexport {\n DataTableColumnHeader,\n DataTableExportMenu,\n DataTableFacetedFilter,\n DataTablePagination,\n DataTableToolbar,\n DataTableViewOptions,\n};\n","import {\n columnFacetingFeature,\n columnFilteringFeature,\n columnPinningFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n constructFilterFn,\n createColumnHelper as createTanstackColumnHelper,\n createExpandedRowModel,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFn_arrIncludes,\n filterFn_arrIncludesSome,\n filterFn_equals,\n filterFn_equalsString,\n filterFn_inDateRange,\n filterFn_inNumberRange,\n filterFn_includesString,\n filterFn_weakEquals,\n globalFilteringFeature,\n metaHelper,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n sortFn_datetime,\n sortFn_text,\n tableFeatures,\n type ColumnHelper,\n type RowData,\n} from \"@tanstack/react-table\";\nimport type { DataTableColumnMeta } from \"./types\";\n\n/**\n * TanStack Table v9 registers features explicitly; an API that is not in this\n * object does not exist on the table. `DataTable` registers everything the\n * design decision lists so a consumer never has to touch the registry, and\n * pays for it once, not per table.\n *\n * `filterFn: \"auto\"` resolves by the column's first non-null value to\n * `includesString` / `inNumberRange` / `equals` / `arrIncludes` /\n * `inDateRange` / `weakEquals`, so those built-ins are registered under their\n * conventional names. `oneOf` is ours: the faceted filter stores an array of\n * picked values and a row passes when its scalar value is one of them.\n */\nconst filterFn_oneOf = constructFilterFn({\n filter: (dataValue: unknown, filterValue: unknown) =>\n Array.isArray(filterValue) ? filterValue.includes(dataValue) : dataValue === filterValue,\n autoRemove: (value: unknown) =>\n value == null || value === \"\" || (Array.isArray(value) && value.length === 0),\n});\n\nconst baseFeatures = tableFeatures({\n columnFilteringFeature,\n globalFilteringFeature,\n columnFacetingFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n columnVisibilityFeature,\n columnPinningFeature,\n columnSizingFeature,\n columnResizingFeature,\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n facetedRowModel: createFacetedRowModel(),\n facetedUniqueValues: createFacetedUniqueValues(),\n filterFns: {\n includesString: filterFn_includesString,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n arrIncludes: filterFn_arrIncludes,\n arrIncludesSome: filterFn_arrIncludesSome,\n inDateRange: filterFn_inDateRange,\n weakEquals: filterFn_weakEquals,\n oneOf: filterFn_oneOf,\n },\n sortFns: {\n alphanumeric: sortFn_alphanumeric,\n basic: sortFn_basic,\n datetime: sortFn_datetime,\n text: sortFn_text,\n },\n columnMeta: metaHelper<DataTableColumnMeta<any>>(),\n});\n\n/**\n * The registry type, re-keyed to the consumer's row type so `meta.onCommit`\n * receives a typed row. The runtime object is the same for every table.\n */\nexport type DataTableFeatures<Row extends RowData> = Omit<typeof baseFeatures, \"columnMeta\"> & {\n columnMeta: DataTableColumnMeta<Row>;\n};\n\nexport function dataTableFeatures<Row extends RowData>(): DataTableFeatures<Row> {\n return baseFeatures as unknown as DataTableFeatures<Row>;\n}\n\n/**\n * `createColumnHelper` bound to the DataTable feature set. v9's helper takes\n * the features as its first type argument; this saves consumers from\n * importing the registry.\n *\n * @example\n * const helper = createColumnHelper<Contact>();\n * const columns = helper.columns([\n * helper.accessor(\"name\", { header: \"Name\" }),\n * helper.accessor(\"status\", { header: \"Status\", meta: { filter: \"faceted\" } }),\n * ]);\n */\nexport function createColumnHelper<Row extends RowData>(): ColumnHelper<DataTableFeatures<Row>, Row> {\n return createTanstackColumnHelper<DataTableFeatures<Row>, Row>();\n}\n","\"use client\";\n\nimport type { ColumnHelper, RowData } from \"@tanstack/react-table\";\nimport { ChevronRight } from \"lucide-react\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { cn } from \"@/lib/cn\";\nimport type { DataTableFeatures } from \"./features\";\nimport type { DataTableColumnDef } from \"./types\";\n\n/**\n * Columns the table adds on the consumer's behalf: the selection checkbox\n * when `enableRowSelection` is set, the expander when a `renderSubComponent`\n * is given. Both are display columns, neither sorts, hides, resizes or\n * exports, and a consumer column with the same id replaces them.\n */\nexport function selectColumn<Row extends RowData>(\n helper: ColumnHelper<DataTableFeatures<Row>, Row>,\n): DataTableColumnDef<Row, unknown> {\n return helper.display({\n id: \"select\",\n header: ({ table }) => {\n const all = table.getIsAllPageRowsSelected();\n const some = table.getIsSomePageRowsSelected() && !all;\n return (\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={all}\n indeterminate={some}\n onCheckedChange={(checked) => table.toggleAllPageRowsSelected(Boolean(checked))}\n />\n );\n },\n cell: ({ row }) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(checked) => row.toggleSelected(Boolean(checked))}\n />\n ),\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n meta: { exportable: false, align: \"center\", cellClassName: \"px-2\", headerClassName: \"px-2\" },\n });\n}\n\nexport function expandColumn<Row extends RowData>(\n helper: ColumnHelper<DataTableFeatures<Row>, Row>,\n): DataTableColumnDef<Row, unknown> {\n return helper.display({\n id: \"expand\",\n header: () => <span className=\"sr-only\">Expand</span>,\n cell: ({ row }) =>\n row.getCanExpand() ? (\n <button\n type=\"button\"\n data-slot=\"data-table-expander\"\n aria-label={row.getIsExpanded() ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={row.getIsExpanded()}\n onClick={row.getToggleExpandedHandler()}\n className={cn(\n \"inline-flex size-6 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <ChevronRight\n className={cn(\n \"size-4 transition-transform duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n row.getIsExpanded() && \"rotate-90\",\n )}\n />\n </button>\n ) : null,\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n meta: { exportable: false, align: \"center\", cellClassName: \"px-2\", headerClassName: \"px-2\" },\n });\n}\n","\"use client\";\n\nimport {\n keepPreviousData,\n QueryClientContext,\n useInfiniteQuery,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ServerSource, TableQuery, TableResult } from \"./types\";\n\nexport interface ServerSourceState<Row> {\n rows: Row[];\n total: number | undefined;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => void;\n fetchNextPage: () => void;\n hasNextPage: boolean;\n}\n\nconst EMPTY: never[] = [];\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/** The part of a query that identifies a result set; the page is separate so infinite mode can append. */\nfunction scopeOf(query: TableQuery): Omit<TableQuery, \"page\"> {\n const { page: _page, ...scope } = query;\n return scope;\n}\n\n/**\n * Runs a server source. With a `QueryClientProvider` above the table, pages\n * go through TanStack Query: cached by query, previous page kept on screen\n * while the next loads, and the in-flight request aborted through `signal`\n * when the query changes. Without one, a small local fetch state does the\n * same minus the cache, so the table never requires the optional peer to be\n * wired up.\n *\n * The strategy is chosen once per mount: a provider appearing or vanishing\n * mid-life would change the hook order, which React forbids, and is not a\n * real scenario.\n */\nexport function useServerSource<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const client = React.useContext(QueryClientContext);\n const [strategy] = React.useState<\"query\" | \"local\">(() => (client ? \"query\" : \"local\"));\n // Hook order is stable for the life of the component because `strategy` is.\n return strategy === \"query\"\n ? useQueryStrategy(source, query, mode)\n : useLocalStrategy(source, query, mode);\n}\n\nfunction useQueryStrategy<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const id = React.useId();\n const base = source?.queryKey ?? [\"cortena-data-table\", id];\n const infinite = mode === \"infinite\";\n const fetch = source?.fetch;\n\n const page = useQuery({\n queryKey: [...base, \"page\", query],\n queryFn: ({ signal }) => fetch!(query, signal),\n enabled: Boolean(fetch) && !infinite,\n placeholderData: keepPreviousData,\n });\n\n const scope = scopeOf(query);\n const pages = useInfiniteQuery({\n queryKey: [...base, \"infinite\", scope],\n queryFn: ({ pageParam, signal }) => fetch!({ ...scope, page: pageParam }, signal),\n initialPageParam: 0,\n getNextPageParam: (last: TableResult<Row>, all: TableResult<Row>[]) => {\n const loaded = all.reduce((n, p) => n + p.rows.length, 0);\n return loaded < last.total && last.rows.length > 0 ? all.length : undefined;\n },\n enabled: Boolean(fetch) && infinite,\n placeholderData: keepPreviousData,\n });\n\n const flatRows = React.useMemo(\n () => (pages.data ? pages.data.pages.flatMap((p) => p.rows) : EMPTY),\n [pages.data],\n );\n\n if (!fetch) {\n return {\n rows: EMPTY,\n total: undefined,\n isLoading: false,\n isFetching: false,\n error: null,\n refetch: () => {},\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n }\n\n if (infinite) {\n return {\n rows: flatRows,\n total: pages.data?.pages.at(-1)?.total,\n isLoading: pages.isPending,\n isFetching: pages.isFetching,\n error: pages.error ? toError(pages.error) : null,\n refetch: () => void pages.refetch(),\n fetchNextPage: () => {\n if (pages.hasNextPage && !pages.isFetchingNextPage) void pages.fetchNextPage();\n },\n hasNextPage: pages.hasNextPage,\n };\n }\n\n return {\n rows: page.data?.rows ?? EMPTY,\n total: page.data?.total,\n isLoading: page.isPending,\n isFetching: page.isFetching,\n error: page.error ? toError(page.error) : null,\n refetch: () => void page.refetch(),\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n}\n\ninterface LocalState<Row> {\n pages: TableResult<Row>[];\n scopeKey: string;\n page: number;\n isFetching: boolean;\n error: Error | null;\n}\n\nfunction useLocalStrategy<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const infinite = mode === \"infinite\";\n const fetch = source?.fetch;\n const scope = scopeOf(query);\n const scopeKey = JSON.stringify(scope);\n const [tick, setTick] = React.useState(0);\n // Pages wanted in infinite mode, scoped so a new query starts over at one.\n const [wanted, setWanted] = React.useState({ scopeKey, n: 1 });\n const wantedPages = wanted.scopeKey === scopeKey ? wanted.n : 1;\n const [state, setState] = React.useState<LocalState<Row>>({\n pages: [],\n scopeKey,\n page: -1,\n isFetching: false,\n error: null,\n });\n\n const loadedForScope = state.scopeKey === scopeKey ? state.pages : EMPTY;\n const targetPage = infinite ? loadedForScope.length : query.page;\n const needs = infinite\n ? loadedForScope.length < wantedPages\n : !(state.scopeKey === scopeKey && state.page === query.page && state.pages.length > 0);\n const requestKey = `${scopeKey}|${targetPage}|${tick}`;\n\n React.useEffect(() => {\n if (!fetch || !needs) return;\n const controller = new AbortController();\n setState((s) => ({ ...s, isFetching: true }));\n fetch({ ...scope, page: targetPage }, controller.signal).then(\n (result) => {\n if (controller.signal.aborted) return;\n setState((s) => ({\n pages: infinite && s.scopeKey === scopeKey ? [...s.pages, result] : [result],\n scopeKey,\n page: targetPage,\n isFetching: false,\n error: null,\n }));\n },\n (err: unknown) => {\n if (controller.signal.aborted) return;\n setState((s) => ({ ...s, isFetching: false, error: toError(err) }));\n },\n );\n return () => controller.abort();\n // `requestKey` is the identity of the request; `scope` and `targetPage` derive from it.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetch, requestKey, needs]);\n\n // Like keepPreviousData: the last result stays on screen while the next loads.\n const rows = React.useMemo(\n () => (infinite ? state.pages.flatMap((p) => p.rows) : (state.pages[0]?.rows ?? EMPTY)),\n [state.pages, infinite],\n );\n const total = state.pages.at(-1)?.total;\n const hasNextPage = infinite && total !== undefined && rows.length < total;\n\n if (!fetch) {\n return {\n rows: EMPTY,\n total: undefined,\n isLoading: false,\n isFetching: false,\n error: null,\n refetch: () => {},\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n }\n\n return {\n rows,\n total,\n isLoading: state.pages.length === 0 && !state.error,\n isFetching: state.isFetching,\n error: state.error,\n refetch: () => {\n setState((s) => ({ ...s, pages: [], page: -1, error: null }));\n setTick((t) => t + 1);\n },\n fetchNextPage: () => {\n if (hasNextPage && !state.isFetching) setWanted({ scopeKey, n: loadedForScope.length + 1 });\n },\n hasNextPage,\n };\n}\n","\"use client\";\n\nimport {\n useTable,\n type ColumnFiltersState,\n type PaginationState,\n type RowData,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport { createColumnHelper, dataTableFeatures } from \"./features\";\nimport { expandColumn, selectColumn } from \"./system-columns\";\nimport type {\n DataSource,\n DataTableColumnDef,\n DataTableEditingCell,\n DataTableInstance,\n DataTableRow,\n DataTableTable,\n TableQuery,\n UseDataTableOptions,\n} from \"./types\";\nimport { useServerSource } from \"./use-server-source\";\n\nconst EMPTY_ROWS: never[] = [];\n\nfunction useDebounced<T>(value: T, ms: number): T {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n if (ms <= 0) {\n setDebounced(value);\n return;\n }\n const id = setTimeout(() => setDebounced(value), ms);\n return () => clearTimeout(id);\n }, [value, ms]);\n return ms <= 0 ? value : debounced;\n}\n\n/**\n * Builds the table for a `dataSource`. This is where the design decision's\n * \"the component sets the manual flags itself\" lives: a server source flips\n * `manualFiltering`, `manualSorting` and `manualPagination` and feeds the\n * table's own filter / sort / page state back out as a `TableQuery`; a client\n * source leaves every row model in memory. Everything else (selection,\n * expansion, visibility, pinning, sizing) is owned by the table.\n *\n * Use it directly when the default layout is not enough: pass the returned\n * `table` to `DataTableToolbar`, `DataTablePagination` and friends, or the\n * whole instance to `<DataTable instance={...} />`.\n */\nexport function useDataTable<Row extends RowData>(\n options: UseDataTableOptions<Row>,\n): DataTableInstance<Row> {\n const {\n columns,\n dataSource,\n getRowId,\n getSubRows,\n pagination: paginationMode = \"pages\",\n pageSize = 25,\n enableRowSelection = false,\n enableExpanding = false,\n getRowCanExpand,\n enableSorting = true,\n enableMultiSort = false,\n enableGlobalFilter = true,\n enableColumnFilters = true,\n enableHiding = true,\n enableColumnPinning = true,\n enableColumnResizing = false,\n initialState,\n onCellCommit,\n onRowSelectionChange,\n searchDebounceMs = 250,\n } = options;\n\n const isServer = dataSource.kind === \"server\";\n\n // Slices the server query is built from are React state; the table mirrors\n // them through `state` + `on*Change`, which v9 still supports alongside atoms.\n const [globalFilter, setGlobalFilter] = React.useState<string>(\n (initialState?.globalFilter as string | undefined) ?? \"\",\n );\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n initialState?.columnFilters ?? [],\n );\n const [sorting, setSorting] = React.useState<SortingState>(initialState?.sorting ?? []);\n const [pagination, setPagination] = React.useState<PaginationState>(\n initialState?.pagination ?? { pageIndex: 0, pageSize },\n );\n\n const searchQuery = useDebounced(globalFilter, isServer ? searchDebounceMs : 0);\n\n // A new search, filter or sort starts from page one again. Client sources\n // get this from `autoResetPageIndex`; manual pagination has to do it here.\n const scopeKey = JSON.stringify([searchQuery, columnFilters, sorting]);\n const lastScope = React.useRef(scopeKey);\n React.useEffect(() => {\n if (lastScope.current === scopeKey) return;\n lastScope.current = scopeKey;\n setPagination((p) => (p.pageIndex === 0 ? p : { ...p, pageIndex: 0 }));\n }, [scopeKey]);\n\n const query = React.useMemo<TableQuery>(\n () => ({\n q: searchQuery || undefined,\n filters: columnFilters.length ? columnFilters : undefined,\n sort: sorting.length ? sorting : undefined,\n page: pagination.pageIndex,\n pageSize: pagination.pageSize,\n }),\n [searchQuery, columnFilters, sorting, pagination.pageIndex, pagination.pageSize],\n );\n\n const server = useServerSource<Row>(isServer ? dataSource : undefined, query, paginationMode);\n\n const data: ReadonlyArray<Row> = isServer ? server.rows : dataSource.rows;\n\n // System columns first; then each consumer column with its meta defaults\n // applied (a faceted column filters with `oneOf` unless told otherwise).\n const resolvedColumns = React.useMemo(() => {\n const helper = createColumnHelper<Row>();\n const out: DataTableColumnDef<Row, any>[] = [];\n if (enableRowSelection && !columns.some((c) => c.id === \"select\")) out.push(selectColumn(helper));\n if (enableExpanding && !columns.some((c) => c.id === \"expand\")) out.push(expandColumn(helper));\n for (const column of columns) {\n const filter = column.meta?.filter;\n if (filter === \"faceted\" && column.filterFn === undefined) {\n out.push({ ...column, filterFn: \"oneOf\" });\n } else if (filter === \"text\" && column.filterFn === undefined) {\n out.push({ ...column, filterFn: \"includesString\" });\n } else {\n out.push(column);\n }\n }\n return out;\n }, [columns, enableRowSelection, enableExpanding]);\n\n const table: DataTableTable<Row> = useTable({\n features: dataTableFeatures<Row>(),\n columns: resolvedColumns,\n data: data.length ? data : EMPTY_ROWS,\n getRowId,\n getSubRows,\n initialState,\n state: { globalFilter, columnFilters, sorting, pagination },\n onGlobalFilterChange: setGlobalFilter,\n onColumnFiltersChange: setColumnFilters,\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n manualFiltering: isServer,\n manualSorting: isServer,\n manualPagination: isServer || paginationMode !== \"pages\",\n rowCount: isServer ? server.total : undefined,\n enableRowSelection,\n enableExpanding,\n getRowCanExpand: getRowCanExpand ?? (enableExpanding ? () => true : undefined),\n enableSorting,\n enableMultiSort,\n enableGlobalFilter,\n enableColumnFilters,\n enableHiding,\n enableColumnPinning,\n enableColumnResizing,\n columnResizeMode: \"onChange\",\n globalFilterFn: \"includesString\",\n });\n\n // Selection callback with original rows, for consumers that keep selection outside.\n const rowSelection = table.state.rowSelection;\n const onSelectionRef = React.useRef(onRowSelectionChange);\n onSelectionRef.current = onRowSelectionChange;\n const firstSelection = React.useRef(true);\n React.useEffect(() => {\n if (firstSelection.current) {\n firstSelection.current = false;\n return;\n }\n onSelectionRef.current?.(table.getSelectedRowModel().rows.map((r) => r.original));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowSelection]);\n\n const [editingCell, setEditingCell] = React.useState<DataTableEditingCell | null>(null);\n const commit = React.useCallback(\n async (row: DataTableRow<Row>, columnId: string, value: unknown) => {\n const meta = table.getColumn(columnId)?.columnDef.meta;\n const handler = meta?.onCommit ?? onCellCommit;\n await handler?.(row.original, columnId, value);\n },\n [table, onCellCommit],\n );\n const editing = React.useMemo(\n () => ({\n cell: editingCell,\n start: (cell: DataTableEditingCell) => setEditingCell(cell),\n stop: () => setEditingCell(null),\n commit,\n }),\n [editingCell, commit],\n );\n\n const total = isServer\n ? (server.total ?? 0)\n : paginationMode === \"pages\"\n ? table.getPrePaginatedRowModel().rows.length\n : table.getRowModel().rows.length;\n\n return {\n table,\n dataSource: dataSource as DataSource<Row>,\n paginationMode,\n rows: data as Row[],\n total,\n isLoading: server.isLoading,\n isFetching: server.isFetching,\n error: server.error,\n refetch: server.refetch,\n fetchNextPage: server.fetchNextPage,\n hasNextPage: server.hasNextPage,\n searchQuery,\n editing,\n };\n}\n","\"use client\";\n\nimport type { RowData } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { Inbox } from \"lucide-react\";\nimport * as React from \"react\";\nimport { ErrorBanner } from \"@/components/error-banner\";\nimport { Input } from \"@/components/input\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { Spinner } from \"@/components/spinner\";\nimport { cn } from \"@/lib/cn\";\nimport { DataTableColumnHeader, DataTablePagination, DataTableToolbar } from \"./parts\";\nimport type {\n DataTableCell,\n DataTableColumn,\n DataTableInstance,\n DataTableRow,\n DataTableTable,\n UseDataTableOptions,\n} from \"./types\";\nimport { useDataTable } from \"./use-data-table\";\n\n/**\n * DataTable — the composite from cortenaUI&Design/04-data-tables.md.\n *\n * `<DataTable columns={columns} dataSource={{ kind: \"client\", rows }} />`\n * renders a complete table: toolbar with search, faceted filters, view and\n * export menus; sortable, pinnable, hideable, resizable columns; sticky\n * header; pager; and, past 100 rows, virtualised rows. A server source\n * changes nothing in the markup and everything in the data flow.\n *\n * Markup is a real `<table>` with `role=\"grid\"` so screen readers get rows\n * and columns, and keyboard users get one tab stop with arrow-key movement\n * between cells (roving tabindex), Enter to edit an editable cell, Escape to\n * cancel, Space to toggle selection.\n *\n * Virtualised bodies keep the table element: rows outside the viewport are\n * replaced by two spacer rows sized from the virtualizer, which keeps column\n * widths, sticky headers and pinned columns working without absolute\n * positioning.\n */\n\nconst VIRTUALIZE_ABOVE = 100;\nconst DEFAULT_VIRTUAL_HEIGHT = 600;\nconst INFINITE_THRESHOLD_PX = 240;\n\nexport interface DataTableViewProps<Row extends RowData> {\n className?: string;\n /** Height of the scrolling body. Required for virtualisation to mean anything; defaults to 600px when virtualised. */\n maxHeight?: number | string;\n /** Force virtualisation on or off; undefined virtualises above 100 rows. */\n virtualize?: boolean;\n /** Estimated row height in px for the virtualizer. @default 40 */\n rowHeight?: number;\n /** @default true */\n stickyHeader?: boolean;\n /** @default \"default\" */\n density?: \"default\" | \"compact\";\n /** Detail panel under an expanded row; enables the expander column. */\n renderSubComponent?: (row: DataTableRow<Row>) => React.ReactNode;\n /** `false` hides the toolbar; a function replaces it. */\n toolbar?: boolean | ((ctx: { instance: DataTableInstance<Row> }) => React.ReactNode);\n /** Rendered in the toolbar while rows are selected. */\n bulkActions?: (ctx: { rows: Row[]; table: DataTableTable<Row> }) => React.ReactNode;\n /** Extra toolbar controls (right side). */\n toolbarActions?: React.ReactNode;\n searchPlaceholder?: string;\n emptyState?: React.ReactNode;\n /** @default \"No results\" */\n emptyMessage?: string;\n pageSizeOptions?: number[];\n /** @default true */\n enableExport?: boolean;\n /** @default \"export\" */\n exportFileName?: string;\n /** Show the loading skeleton regardless of the source's own state. */\n loading?: boolean;\n /** Error to show above the table, in addition to the server source's. */\n error?: string | Error | null;\n onRowClick?: (row: Row, event: React.MouseEvent<HTMLTableRowElement>) => void;\n /**\n * The row a detail pane is currently showing, matched against the row id\n * (`getRowId`, the row index when that is not set). It gets `data-active`\n * and the `--ds-primary-soft` tint, independent of checkbox selection — a\n * master/detail list highlights one row without selecting it, and a table\n * with both can show a selected set and one open row at once.\n */\n activeRowId?: string | null;\n /** Extra classes per row, e.g. to dim rows the app considers stale. */\n rowClassName?: (row: Row) => string | undefined;\n}\n\nexport type DataTableProps<Row extends RowData> = DataTableViewProps<Row> &\n ({ instance: DataTableInstance<Row> } | UseDataTableOptions<Row>);\n\nfunction DataTable<Row extends RowData>(props: DataTableProps<Row>) {\n if (\"instance\" in props) {\n const { instance, ...view } = props;\n return <DataTableView instance={instance} {...view} />;\n }\n return <DataTableOwned {...props} />;\n}\n\nfunction DataTableOwned<Row extends RowData>(props: DataTableViewProps<Row> & UseDataTableOptions<Row>) {\n const {\n className,\n maxHeight,\n virtualize,\n rowHeight,\n stickyHeader,\n density,\n renderSubComponent,\n toolbar,\n bulkActions,\n toolbarActions,\n searchPlaceholder,\n emptyState,\n emptyMessage,\n pageSizeOptions,\n enableExport,\n exportFileName,\n loading,\n error,\n onRowClick,\n activeRowId,\n rowClassName,\n ...options\n } = props;\n const instance = useDataTable<Row>({\n ...options,\n enableExpanding: options.enableExpanding ?? Boolean(renderSubComponent),\n });\n return (\n <DataTableView\n instance={instance}\n className={className}\n maxHeight={maxHeight}\n virtualize={virtualize}\n rowHeight={rowHeight}\n stickyHeader={stickyHeader}\n density={density}\n renderSubComponent={renderSubComponent}\n toolbar={toolbar}\n bulkActions={bulkActions}\n toolbarActions={toolbarActions}\n searchPlaceholder={searchPlaceholder}\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n pageSizeOptions={pageSizeOptions}\n enableExport={enableExport}\n exportFileName={exportFileName}\n loading={loading}\n error={error}\n onRowClick={onRowClick}\n activeRowId={activeRowId}\n rowClassName={rowClassName}\n />\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pinning */\n/* ------------------------------------------------------------------------ */\n\nfunction pinAttrs<Row extends RowData>(\n column: DataTableColumn<Row, any>,\n table: DataTableTable<Row>,\n): { style: React.CSSProperties; pinned: \"start\" | \"end\" | undefined; edge: boolean } {\n const pinned = column.getIsPinned();\n if (!pinned) return { style: {}, pinned: undefined, edge: false };\n if (pinned === \"start\") {\n const last = table.getStartVisibleLeafColumns().at(-1);\n return {\n style: { position: \"sticky\", left: column.getStart(\"start\") },\n pinned,\n edge: last?.id === column.id,\n };\n }\n const first = table.getEndVisibleLeafColumns()[0];\n return {\n style: { position: \"sticky\", right: column.getAfter(\"end\") },\n pinned,\n edge: first?.id === column.id,\n };\n}\n\nconst alignClass = { start: \"text-left\", center: \"text-center\", end: \"text-right\" } as const;\n\n/* ------------------------------------------------------------------------ */\n/* Editable cell */\n/* ------------------------------------------------------------------------ */\n\nfunction EditableCell<Row extends RowData>({\n cell,\n instance,\n onDone,\n}: {\n cell: DataTableCell<Row, any>;\n instance: DataTableInstance<Row>;\n onDone: () => void;\n}) {\n const editable = cell.column.columnDef.meta?.editable;\n const config = typeof editable === \"object\" ? editable : {};\n const initial = cell.getValue();\n const [draft, setDraft] = React.useState(initial == null ? \"\" : String(initial));\n const done = React.useRef(false);\n\n const finish = () => {\n done.current = true;\n instance.editing.stop();\n onDone();\n };\n const commit = () => {\n if (done.current) return;\n const value = config.parse ? config.parse(draft) : config.type === \"number\" ? Number(draft) : draft;\n void instance.editing.commit(cell.row, cell.column.id, value);\n finish();\n };\n const cancel = () => {\n if (done.current) return;\n finish();\n };\n\n return (\n <Input\n data-slot=\"data-table-editor\"\n autoFocus\n type={config.type === \"number\" ? \"number\" : \"text\"}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={(e) => e.target.select()}\n onBlur={commit}\n onKeyDown={(e) => {\n // The editor owns its keys; the grid must not move the focus cell.\n e.stopPropagation();\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n className=\"h-7 px-2 py-0 text-[length:var(--ds-text-body-sm)]\"\n />\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* View */\n/* ------------------------------------------------------------------------ */\n\ntype CellCoord = { r: number; c: number };\n\nfunction DataTableView<Row extends RowData>({\n instance,\n className,\n maxHeight,\n virtualize,\n rowHeight = 40,\n stickyHeader = true,\n density = \"default\",\n renderSubComponent,\n toolbar = true,\n bulkActions,\n toolbarActions,\n searchPlaceholder,\n emptyState,\n emptyMessage = \"No results\",\n pageSizeOptions,\n enableExport = true,\n exportFileName = \"export\",\n loading,\n error,\n onRowClick,\n activeRowId,\n rowClassName,\n}: DataTableViewProps<Row> & { instance: DataTableInstance<Row> }) {\n const { table, paginationMode } = instance;\n const rows = table.getRowModel().rows;\n const leafColumns = table.getVisibleLeafColumns();\n const colCount = leafColumns.length;\n const headerGroups = table.getHeaderGroups();\n const isVirtual = virtualize ?? rows.length > VIRTUALIZE_ABOVE;\n const isLoading = loading || instance.isLoading;\n const showSkeleton = isLoading && rows.length === 0;\n const showEmpty = !isLoading && rows.length === 0;\n const resolvedHeight = maxHeight ?? (isVirtual ? DEFAULT_VIRTUAL_HEIGHT : undefined);\n const errorMessage = error instanceof Error ? error.message : (error ?? instance.error?.message ?? \"\");\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const tableRef = React.useRef<HTMLTableElement>(null);\n\n /* Virtualisation ------------------------------------------------------ */\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n enabled: isVirtual,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => rowHeight,\n overscan: 8,\n getItemKey: (index) => rows[index]?.id ?? index,\n // An expanded row and its detail row are one virtual item.\n measureElement: (element) => {\n let height = element.getBoundingClientRect().height;\n const next = element.nextElementSibling as HTMLElement | null;\n if (next?.dataset.slot === \"data-table-subrow\") height += next.getBoundingClientRect().height;\n return height;\n },\n });\n const virtualItems = isVirtual ? virtualizer.getVirtualItems() : null;\n const paddingTop = virtualItems?.length ? virtualItems[0]!.start : 0;\n const paddingBottom = virtualItems?.length\n ? virtualizer.getTotalSize() - virtualItems[virtualItems.length - 1]!.end\n : 0;\n\n /* Infinite scroll ----------------------------------------------------- */\n\n const onScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n if (paginationMode !== \"infinite\" || !instance.hasNextPage || instance.isFetching) return;\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < INFINITE_THRESHOLD_PX) instance.fetchNextPage();\n },\n [paginationMode, instance],\n );\n\n /* Keyboard navigation ------------------------------------------------- */\n\n const [focused, setFocused] = React.useState<CellCoord>({ r: -1, c: 0 });\n const pendingFocus = React.useRef<CellCoord | null>(null);\n\n const cellElement = (coord: CellCoord) =>\n tableRef.current?.querySelector<HTMLElement>(\n `[data-row-index=\"${coord.r}\"][data-col-index=\"${coord.c}\"]`,\n ) ?? null;\n\n const focusCell = React.useCallback(\n (coord: CellCoord) => {\n const el = cellElement(coord);\n if (el) {\n setFocused(coord);\n el.focus();\n return;\n }\n if (isVirtual && coord.r >= 0) {\n pendingFocus.current = coord;\n setFocused(coord);\n virtualizer.scrollToIndex(coord.r, { align: \"auto\" });\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isVirtual, virtualizer],\n );\n\n React.useEffect(() => {\n const coord = pendingFocus.current;\n if (!coord) return;\n const el = cellElement(coord);\n if (el) {\n pendingFocus.current = null;\n el.focus();\n }\n });\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTableElement>) => {\n const target = event.target as HTMLElement;\n // Portaled menus bubble through React but live outside the table element.\n if (!tableRef.current?.contains(target)) return;\n if (instance.editing.cell) return;\n const cell = target.closest<HTMLElement>(\"[data-row-index][data-col-index]\");\n if (!cell) return;\n const r = Number(cell.dataset.rowIndex);\n const c = Number(cell.dataset.colIndex);\n const lastRow = rows.length - 1;\n const lastCol = colCount - 1;\n const onCellItself = target === cell;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n focusCell({ r: Math.min(lastRow, r + 1), c });\n return;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell({ r: Math.max(-1, r - 1), c });\n return;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell({ r, c: Math.min(lastCol, c + 1) });\n return;\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell({ r, c: Math.max(0, c - 1) });\n return;\n case \"Home\":\n event.preventDefault();\n focusCell(event.ctrlKey ? { r: -1, c: 0 } : { r, c: 0 });\n return;\n case \"End\":\n event.preventDefault();\n focusCell(event.ctrlKey ? { r: lastRow, c: lastCol } : { r, c: lastCol });\n return;\n case \"PageDown\":\n event.preventDefault();\n focusCell({ r: Math.min(lastRow, r + 10), c });\n return;\n case \"PageUp\":\n event.preventDefault();\n focusCell({ r: Math.max(-1, r - 10), c });\n return;\n case \"Enter\": {\n if (!onCellItself) return;\n if (r === -1) {\n const column = leafColumns[c];\n if (column?.getCanSort()) {\n event.preventDefault();\n column.toggleSorting(undefined, event.shiftKey);\n }\n return;\n }\n const row = rows[r];\n const column = leafColumns[c];\n if (row && column && column.columnDef.meta?.editable) {\n event.preventDefault();\n instance.editing.start({ rowId: row.id, columnId: column.id });\n }\n return;\n }\n case \" \": {\n if (!onCellItself || r === -1) return;\n const row = rows[r];\n if (row?.getCanSelect()) {\n event.preventDefault();\n row.toggleSelected();\n }\n return;\n }\n default:\n return;\n }\n };\n\n const onFocus = (event: React.FocusEvent<HTMLTableElement>) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>(\"[data-row-index][data-col-index]\");\n if (!cell || !tableRef.current?.contains(cell)) return;\n const r = Number(cell.dataset.rowIndex);\n const c = Number(cell.dataset.colIndex);\n setFocused((f) => (f.r === r && f.c === c ? f : { r, c }));\n };\n\n const tabIndexFor = (r: number, c: number) => (focused.r === r && focused.c === c ? 0 : -1);\n\n /* Rendering ----------------------------------------------------------- */\n\n const cellPadding = density === \"compact\" ? \"px-3 py-1.5\" : \"px-3 py-2.5\";\n const headPadding = density === \"compact\" ? \"px-3 py-1.5\" : \"px-3 py-2\";\n const editingCell = instance.editing.cell;\n\n const renderRow = (row: DataTableRow<Row>, index: number, virtualIndex?: number) => {\n const cells = row.getVisibleCells();\n const endStart = cells.findIndex((cell) => cell.column.getIsPinned() === \"end\");\n const splitAt = endStart === -1 ? cells.length : endStart;\n const selected = row.getIsSelected();\n const active = activeRowId != null && row.id === activeRowId;\n const expanded = renderSubComponent && row.getIsExpanded();\n\n const renderCell = (cell: DataTableCell<Row, any>, c: number) => {\n const column = cell.column;\n const meta = column.columnDef.meta;\n const pin = pinAttrs(column, table);\n const isEditing = editingCell?.rowId === row.id && editingCell.columnId === column.id;\n const canEdit = Boolean(meta?.editable);\n return (\n <td\n key={cell.id}\n role=\"gridcell\"\n data-slot=\"data-table-cell\"\n data-row-index={index}\n data-col-index={c}\n data-pinned={pin.pinned}\n data-pinned-edge={pin.edge ? \"\" : undefined}\n data-editable={canEdit ? \"\" : undefined}\n data-editing={isEditing ? \"\" : undefined}\n aria-colindex={c + 1}\n tabIndex={tabIndexFor(index, c)}\n style={{ width: column.getSize(), ...pin.style }}\n onDoubleClick={\n canEdit && !isEditing\n ? () => instance.editing.start({ rowId: row.id, columnId: column.id })\n : undefined\n }\n className={cn(\n \"relative align-middle outline-none\",\n isEditing ? \"px-1.5 py-1\" : cellPadding,\n alignClass[meta?.align ?? \"start\"],\n \"focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-[var(--ds-ring)]\",\n // Pinned cells cover what scrolls under them, so their background is\n // opaque card with the translucent hover / selected tint layered on.\n pin.pinned &&\n \"z-[1] bg-[var(--ds-card)] group-hover/row:bg-[linear-gradient(var(--ds-hover),var(--ds-hover))] group-data-[selected]/row:bg-[linear-gradient(var(--ds-primary-soft),var(--ds-primary-soft))] group-data-[active]/row:bg-[linear-gradient(var(--ds-primary-soft),var(--ds-primary-soft))]\",\n pin.pinned === \"start\" && pin.edge && \"shadow-[inset_-1px_0_0_var(--ds-border)]\",\n pin.pinned === \"end\" && pin.edge && \"shadow-[inset_1px_0_0_var(--ds-border)]\",\n !isEditing && \"truncate\",\n meta?.cellClassName,\n )}\n >\n {isEditing ? (\n <EditableCell\n cell={cell}\n instance={instance}\n onDone={() => {\n pendingFocus.current = { r: index, c };\n }}\n />\n ) : (\n <table.FlexRender cell={cell} />\n )}\n </td>\n );\n };\n\n return (\n <React.Fragment key={row.id}>\n <tr\n role=\"row\"\n data-slot=\"data-table-row\"\n data-index={virtualIndex}\n data-selected={selected ? \"\" : undefined}\n data-active={active ? \"\" : undefined}\n data-expanded={expanded ? \"\" : undefined}\n aria-rowindex={index + 2}\n aria-selected={table.options.enableRowSelection ? selected : undefined}\n ref={isVirtual ? virtualizer.measureElement : undefined}\n onClick={onRowClick ? (e) => onRowClick(row.original, e) : undefined}\n className={cn(\n \"group/row border-b border-[var(--ds-border-subtle)] transition-colors duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-hover)] data-[selected]:bg-[var(--ds-primary-soft)]\",\n // Independent of selection: a detail pane highlights one row\n // without ticking its checkbox.\n \"data-[active]:bg-[var(--ds-primary-soft)]\",\n onRowClick && \"cursor-pointer\",\n rowClassName?.(row.original),\n )}\n >\n {cells.slice(0, splitAt).map((cell, c) => renderCell(cell, c))}\n <td aria-hidden data-slot=\"data-table-filler\" className=\"p-0\" />\n {cells.slice(splitAt).map((cell, i) => renderCell(cell, splitAt + i))}\n </tr>\n {expanded ? (\n <tr role=\"row\" data-slot=\"data-table-subrow\" className=\"border-b border-[var(--ds-border-subtle)]\">\n <td\n role=\"gridcell\"\n colSpan={colCount + 1}\n className=\"bg-[var(--ds-muted)] px-4 py-3 text-[length:var(--ds-text-body-sm)]\"\n >\n {renderSubComponent(row)}\n </td>\n </tr>\n ) : null}\n </React.Fragment>\n );\n };\n\n const skeletonRows = Array.from({ length: Math.min(8, table.state.pagination.pageSize) }, (_, i) => (\n <tr key={`skeleton-${i}`} aria-hidden data-slot=\"data-table-skeleton-row\" className=\"border-b border-[var(--ds-border-subtle)]\">\n {leafColumns.map((column) => (\n <td key={column.id} className={cellPadding} style={{ width: column.getSize() }}>\n <Skeleton className=\"h-3.5 w-3/4\" />\n </td>\n ))}\n <td className=\"p-0\" />\n </tr>\n ));\n\n return (\n <div data-slot=\"data-table\" className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {errorMessage ? (\n <ErrorBanner message={errorMessage} onRetry={instance.error ? instance.refetch : undefined} />\n ) : null}\n {toolbar === false ? null : typeof toolbar === \"function\" ? (\n toolbar({ instance })\n ) : (\n <DataTableToolbar\n table={table}\n bulkActions={bulkActions}\n searchPlaceholder={searchPlaceholder}\n enableExport={enableExport}\n exportFileName={exportFileName}\n >\n {toolbarActions}\n </DataTableToolbar>\n )}\n <div\n ref={scrollRef}\n data-slot=\"data-table-container\"\n onScroll={onScroll}\n style={{ maxHeight: resolvedHeight }}\n className={cn(\n \"relative w-full overflow-auto rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-card)]\",\n )}\n >\n <table\n ref={tableRef}\n role=\"grid\"\n data-slot=\"data-table-grid\"\n data-virtualized={isVirtual ? \"\" : undefined}\n aria-rowcount={rows.length + 1}\n aria-colcount={colCount}\n aria-busy={instance.isFetching || undefined}\n aria-multiselectable={table.options.enableRowSelection ? true : undefined}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n style={{ minWidth: table.getTotalSize() }}\n className={cn(\n \"w-full table-fixed border-collapse caption-bottom\",\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n >\n <thead data-slot=\"data-table-header\" className={cn(stickyHeader && \"sticky top-0 z-[2]\")}>\n {headerGroups.map((group) => {\n const endStart = group.headers.findIndex((h) => h.column.getIsPinned() === \"end\");\n const splitAt = endStart === -1 ? group.headers.length : endStart;\n const renderHead = (header: (typeof group.headers)[number], c: number) => {\n const column = header.column;\n const meta = column.columnDef.meta;\n const pin = pinAttrs(column, table);\n const sorted = column.getIsSorted();\n const def = column.columnDef;\n return (\n <th\n key={header.id}\n role=\"columnheader\"\n scope=\"col\"\n data-slot=\"data-table-head\"\n data-row-index={-1}\n data-col-index={c}\n data-pinned={pin.pinned}\n data-pinned-edge={pin.edge ? \"\" : undefined}\n aria-colindex={c + 1}\n aria-sort={\n sorted === \"asc\"\n ? \"ascending\"\n : sorted === \"desc\"\n ? \"descending\"\n : column.getCanSort()\n ? \"none\"\n : undefined\n }\n colSpan={header.colSpan}\n tabIndex={tabIndexFor(-1, c)}\n style={{ width: header.getSize(), ...pin.style }}\n className={cn(\n \"group/head relative h-10 align-middle font-medium outline-none\",\n headPadding,\n \"bg-[var(--ds-muted)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n \"border-b border-[var(--ds-border)]\",\n alignClass[meta?.align ?? \"start\"],\n \"focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-[var(--ds-ring)]\",\n pin.pinned && \"z-[3]\",\n pin.pinned === \"start\" && pin.edge && \"shadow-[inset_-1px_0_0_var(--ds-border)]\",\n pin.pinned === \"end\" && pin.edge && \"shadow-[inset_1px_0_0_var(--ds-border)]\",\n meta?.headerClassName,\n )}\n >\n {header.isPlaceholder ? null : typeof def.header === \"string\" ? (\n <DataTableColumnHeader column={column} title={def.header} />\n ) : (\n <table.FlexRender header={header} />\n )}\n {column.getCanResize() ? (\n <div\n data-slot=\"data-table-resizer\"\n data-resizing={column.getIsResizing() ? \"\" : undefined}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => column.resetSize()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize touch-none select-none\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] hover:opacity-100 data-[resizing]:opacity-100\",\n \"bg-[var(--ds-ring)]\",\n )}\n />\n ) : null}\n </th>\n );\n };\n return (\n <tr key={group.id} role=\"row\" aria-rowindex={1}>\n {group.headers.slice(0, splitAt).map((header, c) => renderHead(header, c))}\n <th aria-hidden className=\"border-b border-[var(--ds-border)] bg-[var(--ds-muted)] p-0\" />\n {group.headers.slice(splitAt).map((header, i) => renderHead(header, splitAt + i))}\n </tr>\n );\n })}\n </thead>\n <tbody data-slot=\"data-table-body\">\n {showSkeleton ? skeletonRows : null}\n {showEmpty ? (\n <tr role=\"row\" data-slot=\"data-table-empty\">\n <td role=\"gridcell\" colSpan={colCount + 1} className=\"p-0\">\n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center gap-2 px-4 py-12 text-center text-[color:var(--ds-muted-foreground)]\">\n <Inbox aria-hidden className=\"size-6 text-[color:var(--ds-text-tertiary)]\" />\n <p className=\"text-[length:var(--ds-text-body-sm)]\">{emptyMessage}</p>\n </div>\n )}\n </td>\n </tr>\n ) : null}\n {virtualItems ? (\n <>\n {paddingTop > 0 ? (\n <tr aria-hidden data-slot=\"data-table-spacer\" style={{ height: paddingTop }}>\n <td colSpan={colCount + 1} className=\"p-0\" />\n </tr>\n ) : null}\n {virtualItems.map((item) => {\n const row = rows[item.index];\n return row ? renderRow(row, item.index, item.index) : null;\n })}\n {paddingBottom > 0 ? (\n <tr aria-hidden data-slot=\"data-table-spacer\" style={{ height: paddingBottom }}>\n <td colSpan={colCount + 1} className=\"p-0\" />\n </tr>\n ) : null}\n </>\n ) : (\n rows.map((row, index) => renderRow(row, index))\n )}\n </tbody>\n </table>\n {paginationMode === \"infinite\" && instance.isFetching && rows.length > 0 ? (\n <div\n data-slot=\"data-table-loading-more\"\n className=\"flex items-center justify-center gap-2 border-t border-[var(--ds-border-subtle)] py-2 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\"\n >\n <Spinner size={14} /> Loading more\n </div>\n ) : null}\n </div>\n {paginationMode === \"pages\" ? (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n ) : paginationMode === \"infinite\" ? (\n <div className=\"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n {rows.length} of {instance.total}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { DataTable, DataTableView };\n","\"use client\";\n\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from \"lucide-react\";\nimport * as React from \"react\";\nimport {\n DayPicker,\n getDefaultClassNames,\n type ChevronProps,\n type DayButtonProps,\n type DayPickerProps,\n type NextMonthButtonProps,\n type PreviousMonthButtonProps,\n type RootProps,\n} from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Calendar.\n *\n * The shadcn Calendar shape over react-day-picker 10. The library's stylesheet\n * is not imported; every class comes from the `classNames` map below and every\n * visual value in it is a cortena-design token. Structure (nav, caption, grid,\n * dropdown caption) is DayPicker's; the day cells, nav buttons and chevrons are\n * swapped for our Button and lucide icons through `components`.\n *\n * `showOutsideDays` defaults to true and `captionLayout` to `\"label\"`; pass\n * `captionLayout=\"dropdown\"` for native month/year selects in the caption.\n */\nexport type CalendarProps = DayPickerProps;\n\nfunction CalendarRoot({ className, rootRef, ...props }: RootProps) {\n return <div data-slot=\"calendar\" ref={rootRef} className={className} {...props} />;\n}\n\nfunction CalendarChevron({ className, orientation, size: _size, disabled, ...props }: ChevronProps) {\n const Icon =\n orientation === \"left\"\n ? ChevronLeft\n : orientation === \"right\"\n ? ChevronRight\n : orientation === \"up\"\n ? ChevronUp\n : ChevronDown;\n return (\n <Icon\n data-slot=\"calendar-chevron\"\n aria-hidden\n className={cn(\"size-4\", disabled && \"opacity-50\", className)}\n {...props}\n />\n );\n}\n\nfunction CalendarPreviousMonthButton(props: PreviousMonthButtonProps) {\n return <Button data-slot=\"calendar-previous-month\" variant=\"outline\" size=\"icon-sm\" {...props} />;\n}\n\nfunction CalendarNextMonthButton(props: NextMonthButtonProps) {\n return <Button data-slot=\"calendar-next-month\" variant=\"outline\" size=\"icon-sm\" {...props} />;\n}\n\n/**\n * One day cell's button. Selection and range state are exposed as data\n * attributes so the classes below (and a consumer's) can paint them; the\n * `today` attribute is only set when the day is not selected, so the soft\n * fill never competes with the selected fill.\n */\nfunction CalendarDayButton({ className, day, modifiers, ...props }: DayButtonProps) {\n const ref = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n const inRange = modifiers.range_start || modifiers.range_end || modifiers.range_middle;\n const selectedSingle = modifiers.selected && !inRange;\n const filled = selectedSingle || modifiers.range_start || modifiers.range_end;\n\n return (\n <Button\n ref={ref}\n data-slot=\"calendar-day-button\"\n data-day={day.isoDate}\n data-selected-single={selectedSingle || undefined}\n data-range-start={modifiers.range_start || undefined}\n data-range-end={modifiers.range_end || undefined}\n data-range-middle={(modifiers.range_middle && !filled) || undefined}\n data-today={(modifiers.today && !modifiers.selected) || undefined}\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n \"size-8 font-normal text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] leading-none\",\n // today: soft fill from the primary tint\n \"data-[today]:bg-[var(--ds-primary-soft)] data-[today]:text-[color:var(--ds-primary-soft-foreground)]\",\n // range interior: soft fill, square so the run reads as one band\n \"data-[range-middle]:rounded-none data-[range-middle]:bg-[var(--ds-primary-soft)] data-[range-middle]:text-[color:var(--ds-primary-soft-foreground)] data-[range-middle]:hover:bg-[var(--ds-primary-soft)] data-[range-middle]:hover:brightness-95\",\n // selected day and range ends: solid primary\n \"data-[selected-single]:bg-[var(--ds-primary)] data-[selected-single]:text-[color:var(--ds-primary-foreground)] data-[selected-single]:hover:bg-[var(--ds-primary-hover)] data-[selected-single]:hover:text-[color:var(--ds-primary-foreground)]\",\n \"data-[range-start]:bg-[var(--ds-primary)] data-[range-start]:text-[color:var(--ds-primary-foreground)] data-[range-start]:hover:bg-[var(--ds-primary-hover)] data-[range-start]:hover:text-[color:var(--ds-primary-foreground)]\",\n \"data-[range-end]:bg-[var(--ds-primary)] data-[range-end]:text-[color:var(--ds-primary-foreground)] data-[range-end]:hover:bg-[var(--ds-primary-hover)] data-[range-end]:hover:text-[color:var(--ds-primary-foreground)]\",\n // the cell's own flags, read from the parent <td>\n \"group-data-[outside]/day:text-[color:var(--ds-text-tertiary)]\",\n \"group-data-[disabled]/day:text-[color:var(--ds-text-disabled)] group-data-[disabled]/day:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Calendar({\n className,\n classNames,\n components,\n showOutsideDays = true,\n captionLayout = \"label\",\n formatters,\n ...props\n}: CalendarProps) {\n const defaults = getDefaultClassNames();\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n captionLayout={captionLayout}\n className={cn(\"w-fit p-3 text-[color:var(--ds-foreground)]\", className)}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaults.root),\n months: cn(\"relative flex flex-col gap-4 md:flex-row\", defaults.months),\n month: cn(\"flex w-full flex-col gap-3\", defaults.month),\n nav: cn(\"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\", defaults.nav),\n button_previous: cn(\"aria-disabled:pointer-events-none aria-disabled:opacity-50\", defaults.button_previous),\n button_next: cn(\"aria-disabled:pointer-events-none aria-disabled:opacity-50\", defaults.button_next),\n month_caption: cn(\"flex h-8 w-full items-center justify-center px-9\", defaults.month_caption),\n caption_label: cn(\n \"select-none font-medium text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-foreground)]\",\n captionLayout !== \"label\" &&\n \"flex h-8 items-center gap-1 rounded-[var(--ds-radius-sm)] pl-2 pr-1 [&>svg]:size-3.5 [&>svg]:text-[color:var(--ds-muted-foreground)]\",\n defaults.caption_label,\n ),\n dropdowns: cn(\n \"flex h-8 w-full items-center justify-center gap-1.5 font-medium text-[length:var(--ds-text-body-sm)]\",\n defaults.dropdowns,\n ),\n dropdown_root: cn(\n \"relative rounded-[var(--ds-radius-sm)] border border-[var(--ds-border)] bg-[var(--ds-muted)]\",\n \"has-focus-visible:border-[var(--ds-ring)] has-focus-visible:ring-[3px] has-focus-visible:ring-[var(--ds-ring)]/40\",\n defaults.dropdown_root,\n ),\n dropdown: cn(\"absolute inset-0 cursor-pointer opacity-0\", defaults.dropdown),\n month_grid: cn(\"w-full border-collapse\", defaults.month_grid),\n weekdays: cn(\"flex\", defaults.weekdays),\n weekday: cn(\n \"flex-1 select-none font-normal text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n defaults.weekday,\n ),\n week: cn(\"mt-1 flex w-full\", defaults.week),\n week_number_header: cn(\"w-8 select-none\", defaults.week_number_header),\n week_number: cn(\n \"select-none text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n defaults.week_number,\n ),\n day: cn(\n \"group/day relative aspect-square size-8 select-none p-0 text-center\",\n defaults.day,\n ),\n range_start: cn(\"rounded-l-[var(--ds-radius-sm)] bg-[var(--ds-primary-soft)]\", defaults.range_start),\n range_middle: cn(\"rounded-none bg-[var(--ds-primary-soft)]\", defaults.range_middle),\n range_end: cn(\"rounded-r-[var(--ds-radius-sm)] bg-[var(--ds-primary-soft)]\", defaults.range_end),\n today: defaults.today,\n outside: defaults.outside,\n disabled: defaults.disabled,\n hidden: cn(\"invisible\", defaults.hidden),\n ...classNames,\n }}\n components={{\n Root: CalendarRoot,\n Chevron: CalendarChevron,\n PreviousMonthButton: CalendarPreviousMonthButton,\n NextMonthButton: CalendarNextMonthButton,\n DayButton: CalendarDayButton,\n ...components,\n }}\n {...props}\n />\n );\n}\n\nexport { Calendar, CalendarDayButton };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Popover.\n *\n * `PopoverContent` composes Base UI's Portal + Positioner + Popup so consumers\n * keep writing `<PopoverContent side=\"bottom\" align=\"start\">`; the positioning\n * props are forwarded to the Positioner, which is where Base UI reads them.\n *\n * Radix users: `asChild` on the trigger becomes `render={<Button />}`;\n * `PopoverAnchor` is gone — pass `anchor={ref}` to `PopoverContent` instead.\n */\nfunction Popover(props: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root {...props} />;\n}\n\nfunction PopoverTrigger(props: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverClose(props: PopoverPrimitive.Close.Props) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] font-semibold text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({ className, ...props }: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype PositionerProps = Pick<\n PopoverPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface PopoverContentProps extends PopoverPrimitive.Popup.Props, PositionerProps {\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: PopoverPrimitive.Portal.Props[\"container\"];\n}\n\nfunction PopoverContent({\n className,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal keepMounted={keepMounted} container={container}>\n <PopoverPrimitive.Positioner\n data-slot=\"popover-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"w-72 p-4 outline-none\",\n \"rounded-[var(--ds-radius-lg)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverClose,\n PopoverTitle,\n PopoverDescription,\n};\n","\"use client\";\n\nimport { CalendarIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport type { Matcher } from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { Calendar, type CalendarProps } from \"@/components/calendar\";\nimport { Input } from \"@/components/input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DateField.\n *\n * A form-friendly date input: our `<Input>` showing the formatted date, with\n * the DatePicker's calendar behind a trailing icon button. Typing a date the\n * parser accepts commits it (the default parser reads ISO `yyyy-mm-dd`, and\n * the English `15 Jan 2026` / `15 January 2026` shapes the formatters below\n * produce); picking a day from the calendar writes it back through\n * `formatDate`. Non-empty text the parser rejects, or a date outside\n * `min`/`max`, clears the value and marks the input invalid so a Field can\n * show the error.\n *\n * The date helpers are hand-written for `en-GB` (day month year, no library);\n * any other `locale` goes through the browser's `Intl`.\n */\n\nconst MONTHS_LONG = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst MONTHS_SHORT = MONTHS_LONG.map((m) => m.slice(0, 3));\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nconst isEn = (locale: string) => /^en(-GB)?$/i.test(locale);\n\n/** `2026-01-05`. */\nfunction formatDateISO(date: Date): string {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/** `5 Jan 2026` for en-GB; other locales via `Intl.DateTimeFormat`. */\nfunction formatDateShort(date: Date, locale = \"en-GB\"): string {\n if (isEn(locale)) {\n return `${date.getDate()} ${MONTHS_SHORT[date.getMonth()]} ${date.getFullYear()}`;\n }\n return new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"short\", year: \"numeric\" }).format(\n date,\n );\n}\n\n/** `5 January 2026` for en-GB; other locales via `Intl.DateTimeFormat`. */\nfunction formatDateLong(date: Date, locale = \"en-GB\"): string {\n if (isEn(locale)) {\n return `${date.getDate()} ${MONTHS_LONG[date.getMonth()]} ${date.getFullYear()}`;\n }\n return new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"long\", year: \"numeric\" }).format(\n date,\n );\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction startOfDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/**\n * Calendar-day distance in words: `today`, `yesterday`, `tomorrow`, `3 days\n * ago`, `in 2 weeks`, `4 months ago`, `in 2 years`. Compares local calendar\n * days, so 23:59 to 00:01 is `tomorrow`. Other locales use\n * `Intl.RelativeTimeFormat`.\n */\nfunction formatRelative(date: Date, options: { now?: Date; locale?: string } = {}): string {\n const { now = new Date(), locale = \"en-GB\" } = options;\n const days = Math.round((startOfDay(date) - startOfDay(now)) / DAY_MS);\n const abs = Math.abs(days);\n let unit: \"day\" | \"week\" | \"month\" | \"year\";\n let count: number;\n if (abs < 7) {\n unit = \"day\";\n count = days;\n } else if (abs < 30) {\n unit = \"week\";\n count = Math.round(days / 7);\n } else if (abs < 365) {\n unit = \"month\";\n count = Math.round(days / 30);\n } else {\n unit = \"year\";\n count = Math.round(days / 365);\n }\n if (!isEn(locale)) {\n return new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" }).format(count, unit);\n }\n if (days === 0) return \"today\";\n if (days === -1) return \"yesterday\";\n if (days === 1) return \"tomorrow\";\n const n = Math.abs(count);\n const label = `${n} ${unit}${n === 1 ? \"\" : \"s\"}`;\n return count < 0 ? `${label} ago` : `in ${label}`;\n}\n\nfunction makeDate(year: number, month: number, day: number): Date | undefined {\n const date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {\n return undefined;\n }\n return date;\n}\n\n/** Strict `yyyy-mm-dd`; rejects impossible days such as `2026-02-30`. */\nfunction parseDateISO(text: string): Date | undefined {\n const m = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(text.trim());\n if (!m) return undefined;\n return makeDate(Number(m[1]), Number(m[2]), Number(m[3]));\n}\n\n/** ISO first, then the English `5 Jan 2026` / `5 January 2026` shapes. */\nfunction parseDateDefault(text: string): Date | undefined {\n const iso = parseDateISO(text);\n if (iso) return iso;\n const m = /^(\\d{1,2})\\s+([a-z]+)\\s+(\\d{4})$/i.exec(text.trim());\n if (!m) return undefined;\n const name = (m[2] ?? \"\").toLowerCase();\n const month = MONTHS_LONG.findIndex(\n (full) => full.toLowerCase() === name || full.slice(0, 3).toLowerCase() === name,\n );\n if (month < 0) return undefined;\n return makeDate(Number(m[3]), month + 1, Number(m[1]));\n}\n\nfunction sameDay(a: Date | undefined, b: Date | undefined): boolean {\n if (!a || !b) return a === b;\n return startOfDay(a) === startOfDay(b);\n}\n\nfunction inRange(date: Date, min: Date | undefined, max: Date | undefined): boolean {\n const t = startOfDay(date);\n if (min && t < startOfDay(min)) return false;\n if (max && t > startOfDay(max)) return false;\n return true;\n}\n\ntype CalendarPassthrough = Omit<\n CalendarProps,\n \"mode\" | \"selected\" | \"onSelect\" | \"required\" | \"disabled\"\n>;\n\nexport interface DateFieldProps extends Omit<\n React.ComponentProps<\"input\">,\n \"value\" | \"defaultValue\" | \"onChange\" | \"min\" | \"max\" | \"type\"\n> {\n /** The date (controlled). */\n value?: Date | undefined;\n /** The initial date (uncontrolled). */\n defaultValue?: Date | undefined;\n /** Called with the parsed or picked date, or `undefined` when the text is cleared or invalid. */\n onValueChange?: (date: Date | undefined) => void;\n /** Input placeholder; defaults to the ISO shape. */\n placeholder?: string;\n /** Formats the date into the input; defaults to ISO `yyyy-mm-dd`. */\n formatDate?: (date: Date) => string;\n /** Parses typed text; defaults to ISO plus the English day-month-year shapes. */\n parseDate?: (text: string) => Date | undefined;\n /** Earliest selectable day. */\n min?: Date;\n /** Latest selectable day. */\n max?: Date;\n disabled?: boolean;\n /** Force the invalid look (e.g. from a form validator). */\n invalid?: boolean;\n /** Extra props for the Calendar (e.g. `captionLayout`, `today`). */\n calendarProps?: CalendarPassthrough;\n /** Class name for the wrapper; use `className` for the input itself. */\n wrapperClassName?: string;\n}\n\nfunction DateField(props: DateFieldProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n formatDate = formatDateISO,\n parseDate = parseDateDefault,\n min,\n max,\n disabled,\n invalid,\n calendarProps,\n wrapperClassName,\n className,\n onBlur,\n ...inputProps\n } = props;\n const controlled = \"value\" in props;\n const [inner, setInner] = React.useState<Date | undefined>(defaultValue);\n const date = controlled ? value : inner;\n\n const [text, setText] = React.useState(() => (date ? formatDate(date) : \"\"));\n const [textInvalid, setTextInvalid] = React.useState(false);\n const [open, setOpen] = React.useState(false);\n const committed = React.useRef<Date | undefined>(date);\n\n const commit = React.useCallback(\n (next: Date | undefined) => {\n committed.current = next;\n if (!controlled) setInner(next);\n onValueChange?.(next);\n },\n [controlled, onValueChange],\n );\n\n // An external value change (form reset, server data) rewrites the text; a\n // change this field committed itself leaves the user's text alone.\n React.useEffect(() => {\n if (sameDay(date, committed.current)) return;\n committed.current = date;\n setText(date ? formatDate(date) : \"\");\n setTextInvalid(false);\n }, [date, formatDate]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value;\n setText(next);\n if (next.trim() === \"\") {\n setTextInvalid(false);\n if (date !== undefined) commit(undefined);\n return;\n }\n const parsed = parseDate(next);\n const ok = parsed !== undefined && inRange(parsed, min, max);\n setTextInvalid(!ok);\n if (ok) {\n if (!sameDay(parsed, date)) commit(parsed);\n } else if (date !== undefined) {\n commit(undefined);\n }\n };\n\n const pick = (next: Date | undefined) => {\n setOpen(false);\n setTextInvalid(false);\n setText(next ? formatDate(next) : \"\");\n if (!sameDay(next, date)) commit(next);\n };\n\n const matchers: Matcher[] = [];\n if (min) matchers.push({ before: min });\n if (max) matchers.push({ after: max });\n const isInvalid = invalid || textInvalid;\n\n return (\n <div\n data-slot=\"date-field\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={cn(\"relative w-60\", wrapperClassName)}\n >\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n data-slot=\"date-field-input\"\n value={text}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n onChange={onChange}\n onBlur={(event) => {\n if (date && !textInvalid) setText(formatDate(date));\n onBlur?.(event);\n }}\n className={cn(\"pr-10\", className)}\n {...inputProps}\n />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n data-slot=\"date-field-trigger\"\n render={<Button variant=\"ghost\" size=\"icon-sm\" />}\n aria-label=\"Open calendar\"\n disabled={disabled}\n className={cn(\n \"absolute top-1/2 right-1 -translate-y-1/2\",\n \"text-[color:var(--ds-muted-foreground)] hover:text-[color:var(--ds-foreground)]\",\n )}\n >\n <CalendarIcon />\n </PopoverTrigger>\n <PopoverContent data-slot=\"date-field-content\" align=\"end\" className=\"w-auto p-0\">\n <Calendar\n {...calendarProps}\n mode=\"single\"\n defaultMonth={calendarProps?.defaultMonth ?? date}\n selected={date}\n onSelect={pick}\n disabled={matchers.length > 0 ? matchers : undefined}\n startMonth={calendarProps?.startMonth ?? min}\n endMonth={calendarProps?.endMonth ?? max}\n />\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\nexport {\n DateField,\n formatDateISO,\n formatDateShort,\n formatDateLong,\n formatRelative,\n parseDateISO,\n parseDateDefault,\n};\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface EmptyStateProps extends Omit<React.ComponentProps<\"div\">, \"title\"> {\n /** A lucide icon; sized and coloured by the state. */\n icon?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** One or two buttons offering the next step. */\n action?: React.ReactNode;\n /** `compact` for an empty panel inside a card; `default` for an empty page. */\n size?: \"default\" | \"compact\";\n}\n\n/**\n * EmptyState — the centred, muted \"nothing here yet\" surface. The icon sits\n * in a soft disc on the muted token; the title stays in the foreground so the\n * eye lands on it, and everything else recedes.\n */\nfunction EmptyState({\n className,\n icon,\n title,\n description,\n action,\n size = \"default\",\n children,\n ...props\n}: EmptyStateProps) {\n return (\n <div\n data-slot=\"empty-state\"\n data-size={size}\n className={cn(\n \"flex flex-col items-center justify-center text-center\",\n size === \"compact\" ? \"gap-2 px-4 py-8\" : \"gap-3 px-6 py-16\",\n \"text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n {icon ? (\n <div\n data-slot=\"empty-state-icon\"\n aria-hidden\n className={cn(\n \"mb-1 flex items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-text-tertiary)]\",\n size === \"compact\" ? \"size-10 [&_svg]:size-5\" : \"size-12 [&_svg]:size-6\",\n )}\n >\n {icon}\n </div>\n ) : null}\n <p\n data-slot=\"empty-state-title\"\n className={cn(\n \"font-semibold text-[color:var(--ds-foreground)]\",\n size === \"compact\"\n ? \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\"\n : \"text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)]\",\n )}\n >\n {title}\n </p>\n {description ? (\n <p\n data-slot=\"empty-state-description\"\n className={cn(\n \"max-w-sm text-balance\",\n size === \"compact\"\n ? \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)]\"\n : \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n )}\n >\n {description}\n </p>\n ) : null}\n {children}\n {action ? (\n <div data-slot=\"empty-state-action\" className=\"mt-2 flex flex-wrap items-center justify-center gap-2\">\n {action}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { EmptyState };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Label — a plain `<label>`. Base UI's Label lives inside Field, so this is\n * the standalone form caption for anything that is not a Field.\n */\nconst labelVariants = cva([\n \"inline-flex items-center gap-2 select-none\",\n \"text-[length:var(--ds-text-body-sm)] font-medium leading-none\",\n \"text-[color:var(--ds-foreground)]\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n \"group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-70\",\n]);\n\nexport interface LabelProps\n extends React.ComponentProps<\"label\">, VariantProps<typeof labelVariants> {}\n\nfunction Label({ className, ...props }: LabelProps) {\n return <label data-slot=\"label\" className={cn(labelVariants(), className)} {...props} />;\n}\n\nexport { Label, labelVariants };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { Fieldset as FieldsetPrimitive } from \"@base-ui/react/fieldset\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { inputClassName } from \"@/components/input\";\nimport { labelVariants } from \"@/components/label\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Field.\n *\n * The shadcn Field shape over Base UI's Field and Fieldset. `Field` is\n * `Field.Root`: it owns the label/control/description/error association, so a\n * `FieldLabel` focuses its `FieldControl` (or any Base UI control such as\n * Checkbox, Select, Switch) without an explicit `htmlFor`, and every message\n * ends up in the control's `aria-describedby`.\n *\n * Validity: Base UI puts `data-invalid` on every part once the control fails\n * native constraints or a `validate` callback, and adds `aria-invalid` to the\n * control. Pass `invalid` on `Field` when an external library owns the state\n * (the Form component does this from react-hook-form).\n *\n * `FieldError` follows the field's validity: static children show once the\n * control is invalid or the Field is marked `invalid`; `match=\"valueMissing\"`\n * narrows that to one constraint. Given `errors` (a react-hook-form error\n * list) it renders whenever the list has a message.\n */\nconst fieldVariants = cva(\"group/field flex w-full gap-2\", {\n variants: {\n orientation: {\n vertical: \"flex-col [&>*]:w-full [&>.sr-only]:w-auto\",\n horizontal: [\n \"flex-row items-center [&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start\",\n ],\n },\n },\n defaultVariants: { orientation: \"vertical\" },\n});\n\nexport interface FieldProps\n extends React.ComponentProps<typeof FieldPrimitive.Root>,\n VariantProps<typeof fieldVariants> {}\n\n// Base UI's Field.Error reads the control's computed validity only; the\n// external `invalid` prop reaches the data attributes but not the error's\n// visibility. Carry it so FieldError can show its static message.\nconst FieldInvalidContext = React.createContext(false);\n\nfunction Field({ className, orientation = \"vertical\", invalid, ...props }: FieldProps) {\n return (\n <FieldInvalidContext.Provider value={invalid === true}>\n <FieldPrimitive.Root\n data-slot=\"field\"\n data-orientation={orientation}\n invalid={invalid}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n </FieldInvalidContext.Provider>\n );\n}\n\n/** Stacks a label and description beside a control in a horizontal Field. */\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\"group/field-content flex flex-1 flex-col gap-1 leading-snug\", className)}\n {...props}\n />\n );\n}\n\nexport interface FieldLabelProps extends React.ComponentProps<typeof FieldPrimitive.Label> {}\n\nfunction FieldLabel({ className, ...props }: FieldLabelProps) {\n return (\n <FieldPrimitive.Label\n data-slot=\"field-label\"\n className={cn(\n labelVariants(),\n \"w-fit\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-70\",\n \"data-[invalid]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldControlProps extends React.ComponentProps<typeof FieldPrimitive.Control> {}\n\n/**\n * The field's `<input>`, styled like Input. Swap the element with `render`\n * (`render={<Textarea />}`); the input styling still applies unless the\n * rendered element's own className wins in tailwind-merge.\n */\nfunction FieldControl({ className, ...props }: FieldControlProps) {\n return (\n <FieldPrimitive.Control\n data-slot=\"field-control\"\n className={cn(\n inputClassName,\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[3px] data-[invalid]:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldDescriptionProps\n extends React.ComponentProps<typeof FieldPrimitive.Description> {}\n\nfunction FieldDescription({ className, ...props }: FieldDescriptionProps) {\n return (\n <FieldPrimitive.Description\n data-slot=\"field-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)] font-normal text-[color:var(--ds-muted-foreground)]\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-[color:var(--ds-primary)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The shape react-hook-form gives for a field error; only `message` is read. */\nexport interface FieldErrorItem {\n message?: string | undefined;\n}\n\nexport interface FieldErrorProps extends React.ComponentProps<typeof FieldPrimitive.Error> {\n /**\n * Errors from an external validator. Duplicate messages collapse; one message\n * renders as text, several as a list.\n */\n errors?: ReadonlyArray<FieldErrorItem | undefined> | undefined;\n}\n\nfunction FieldError({ className, children, errors, match, ...props }: FieldErrorProps) {\n const fieldInvalid = React.useContext(FieldInvalidContext);\n const content = React.useMemo(() => {\n if (children) {\n return children;\n }\n if (!errors?.length) {\n return null;\n }\n const unique = [...new Map(errors.map((e) => [e?.message, e])).values()].filter(\n (e): e is FieldErrorItem => Boolean(e?.message),\n );\n if (unique.length === 0) {\n return null;\n }\n if (unique.length === 1) {\n return unique[0]?.message;\n }\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {unique.map((e) => (\n <li key={e.message}>{e.message}</li>\n ))}\n </ul>\n );\n }, [children, errors]);\n\n if (errors !== undefined && content === null) {\n return null;\n }\n\n return (\n <FieldPrimitive.Error\n role=\"alert\"\n data-slot=\"field-error\"\n match={match ?? (errors !== undefined || fieldInvalid ? true : undefined)}\n className={cn(\n \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)] font-normal text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n >\n {content}\n </FieldPrimitive.Error>\n );\n}\n\nexport interface FieldsetProps extends React.ComponentProps<typeof FieldsetPrimitive.Root> {}\n\nfunction Fieldset({ className, ...props }: FieldsetProps) {\n return (\n <FieldsetPrimitive.Root\n data-slot=\"fieldset\"\n className={cn(\n \"flex flex-col gap-4\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldsetLegendProps extends React.ComponentProps<typeof FieldsetPrimitive.Legend> {}\n\nfunction FieldsetLegend({ className, ...props }: FieldsetLegendProps) {\n return (\n <FieldsetPrimitive.Legend\n data-slot=\"fieldset-legend\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] font-medium leading-none text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:opacity-70\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A vertical stack of Fields with the spacing a form uses between rows. */\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group flex w-full flex-col gap-6 [&>[data-slot=field-group]]:gap-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Field,\n FieldContent,\n FieldLabel,\n FieldControl,\n FieldDescription,\n FieldError,\n Fieldset,\n FieldsetLegend,\n FieldGroup,\n fieldVariants,\n};\n","\"use client\";\n\nimport { Check, Copy } from \"lucide-react\";\nimport * as React from \"react\";\nimport ReactMarkdown, { type Components, type ExtraProps, type Options } from \"react-markdown\";\nimport rehypeSanitize, { defaultSchema, type Options as SanitizeSchema } from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Markdown.\n *\n * react-markdown with GFM (tables, task lists, strikethrough, autolinks) and\n * rehype-sanitize's GitHub schema, so pasted or model-written HTML cannot run\n * scripts or leak styles. Every element is mapped through `components` onto\n * tokens: headings take the type scale with the display face, body copy is\n * `body-sm`, code is mono on the sunken surface, tables stripe with the\n * border colour and fenced blocks carry a copy button.\n *\n * `compact` halves the vertical rhythm and steps headings down for chat\n * bubbles. There is no syntax highlighting; pass `codeRenderer` to plug one in\n * (shiki, prism) for fenced blocks — it receives the raw text and language.\n */\n\ntype HastNode = NonNullable<ExtraProps[\"node\"]>;\ntype HastChild = HastNode[\"children\"][number];\n\nfunction hastText(node: HastChild | HastNode): string {\n if (node.type === \"text\") return node.value;\n if (\"children\" in node) return node.children.map(hastText).join(\"\");\n return \"\";\n}\n\n/** The GitHub schema, plus `class=\"language-*\"` on code and `checked` on task boxes. */\nconst markdownSanitizeSchema: SanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [...(defaultSchema.attributes?.code ?? []), [\"className\", /^language-./]],\n input: [...(defaultSchema.attributes?.input ?? []), \"checked\"],\n },\n};\n\nexport interface CodeRendererProps {\n /** The fenced block's text, without a trailing newline. */\n code: string;\n /** From the fence's info string, e.g. `ts` for ```ts. */\n language: string | undefined;\n}\n\n/** Strip react-markdown's `node` so the rest can be spread onto a DOM element. */\nfunction dom<T extends object>(props: T & ExtraProps): T {\n const { node: _node, ...rest } = props;\n return rest as T;\n}\n\nconst block = \"my-3 first:mt-0 last:mb-0 group-data-[compact]/markdown:my-1.5\";\n\nconst body = cn(\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)] text-[color:var(--ds-foreground)]\",\n);\n\nconst heading = cn(\n \"font-[family-name:var(--ds-font-display)] text-[color:var(--ds-foreground)]\",\n \"mt-6 mb-2 first:mt-0 group-data-[compact]/markdown:mt-3 group-data-[compact]/markdown:mb-1\",\n);\n\nconst cellClassName = \"border border-[var(--ds-border)] px-3 py-1.5 align-top\";\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = React.useState(false);\n React.useEffect(() => {\n if (!copied) return;\n const id = window.setTimeout(() => setCopied(false), 1500);\n return () => window.clearTimeout(id);\n }, [copied]);\n return (\n <button\n type=\"button\"\n data-slot=\"markdown-copy\"\n data-copied={copied || undefined}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n onClick={() => {\n void navigator.clipboard?.writeText(text).then(() => setCopied(true));\n }}\n className={cn(\n \"absolute top-1.5 right-1.5 inline-flex size-7 items-center justify-center\",\n \"rounded-[var(--ds-radius-sm)] text-[color:var(--ds-muted-foreground)]\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"group-hover/pre:opacity-100 focus-visible:opacity-100 data-[copied]:opacity-100\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[copied]:text-[color:var(--ds-success)]\",\n \"[&_svg]:size-3.5\",\n )}\n >\n {copied ? <Check aria-hidden /> : <Copy aria-hidden />}\n </button>\n );\n}\n\nfunction buildComponents(codeRenderer: MarkdownProps[\"codeRenderer\"]): Components {\n return {\n h1: (p) => (\n <h1\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h1)] leading-[var(--ds-text-h1--line-height)] tracking-[var(--ds-text-h1--letter-spacing)] font-semibold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-h3)] group-data-[compact]/markdown:leading-[var(--ds-text-h3--line-height)]\",\n )}\n />\n ),\n h2: (p) => (\n <h2\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h2)] leading-[var(--ds-text-h2--line-height)] tracking-[var(--ds-text-h2--letter-spacing)] font-bold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-body-lg)] group-data-[compact]/markdown:leading-[var(--ds-text-body-lg--line-height)]\",\n )}\n />\n ),\n h3: (p) => (\n <h3\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h3)] leading-[var(--ds-text-h3--line-height)] font-semibold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-body-md)] group-data-[compact]/markdown:leading-[var(--ds-text-body-md--line-height)]\",\n )}\n />\n ),\n h4: (p) => (\n <h4\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)] font-semibold\",\n )}\n />\n ),\n h5: (p) => (\n <h5\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-body)] leading-[var(--ds-text-body--line-height)] font-semibold\",\n )}\n />\n ),\n h6: (p) => (\n <h6\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-eyebrow)] leading-[var(--ds-text-eyebrow--line-height)] tracking-[var(--ds-text-eyebrow--letter-spacing)] font-semibold uppercase text-[color:var(--ds-muted-foreground)]\",\n )}\n />\n ),\n p: (p) => <p {...dom(p)} className={cn(block, body)} />,\n a: (p) => {\n const { href, ...rest } = dom(p);\n const external = typeof href === \"string\" && /^https?:\\/\\//.test(href);\n return (\n <a\n {...rest}\n href={href}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n className={cn(\n \"text-[color:var(--ds-primary)] underline underline-offset-4 decoration-[color:var(--ds-primary)]/40\",\n \"hover:text-[color:var(--ds-primary-hover)] hover:decoration-[color:var(--ds-primary-hover)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40 rounded-[var(--ds-radius-sm)]\",\n )}\n />\n );\n },\n strong: (p) => <strong {...dom(p)} className=\"font-semibold text-[color:var(--ds-foreground)]\" />,\n em: (p) => <em {...dom(p)} className=\"italic\" />,\n del: (p) => <del {...dom(p)} className=\"line-through text-[color:var(--ds-muted-foreground)]\" />,\n code: (p) => (\n <code\n {...dom(p)}\n className={cn(\n \"rounded-[var(--ds-radius-sm)] bg-[var(--ds-muted)] px-1 py-0.5\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"border border-[var(--ds-border-subtle)]\",\n )}\n />\n ),\n pre: (p) => {\n const codeNode = p.node?.children.find(\n (c): c is HastNode => c.type === \"element\" && c.tagName === \"code\",\n );\n const source = codeNode ? hastText(codeNode) : hastText(p.node ?? { type: \"text\", value: \"\" });\n const code = source.replace(/\\n$/, \"\");\n const classes = codeNode?.properties.className;\n const language = (Array.isArray(classes) ? classes : [classes])\n .map(String)\n .find((c) => c.startsWith(\"language-\"))\n ?.slice(\"language-\".length);\n return (\n <div\n data-slot=\"markdown-pre\"\n data-language={language}\n className={cn(\n block,\n \"group/pre relative overflow-hidden\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-muted)]\",\n )}\n >\n {codeRenderer ? (\n codeRenderer({ code, language })\n ) : (\n <pre\n className={cn(\n \"overflow-x-auto p-3 pr-10\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n >\n <code data-language={language}>{code}</code>\n </pre>\n )}\n <CopyButton text={code} />\n </div>\n );\n },\n blockquote: (p) => (\n <blockquote\n {...dom(p)}\n className={cn(\n block,\n \"border-l-2 border-[var(--ds-border-strong)] pl-4 text-[color:var(--ds-muted-foreground)]\",\n \"[&>p]:text-[color:inherit]\",\n )}\n />\n ),\n ul: (p) => (\n <ul\n {...dom(p)}\n className={cn(\n block,\n body,\n \"list-disc pl-6 marker:text-[color:var(--ds-text-tertiary)]\",\n \"[&_ul]:my-1 [&_ol]:my-1\",\n )}\n />\n ),\n ol: (p) => (\n <ol\n {...dom(p)}\n className={cn(\n block,\n body,\n \"list-decimal pl-6 marker:text-[color:var(--ds-text-tertiary)]\",\n \"[&_ul]:my-1 [&_ol]:my-1\",\n )}\n />\n ),\n li: (p) => {\n const rest = dom(p);\n const task = typeof rest.className === \"string\" && rest.className.includes(\"task-list-item\");\n return (\n <li\n {...rest}\n data-task={task || undefined}\n className={cn(\"my-1 group-data-[compact]/markdown:my-0.5\", task && \"-ml-6 list-none\")}\n />\n );\n },\n input: (p) => {\n const rest = dom(p);\n return (\n <input\n {...rest}\n readOnly\n className={cn(\n \"mr-2 size-3.5 translate-y-px accent-[var(--ds-primary)] align-baseline\",\n \"rounded-[var(--ds-radius-sm)]\",\n )}\n />\n );\n },\n table: (p) => (\n <div data-slot=\"markdown-table\" className={cn(block, \"w-full overflow-x-auto\")}>\n <table\n {...dom(p)}\n className={cn(\n \"w-full border-collapse text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n />\n </div>\n ),\n thead: (p) => <thead {...dom(p)} className=\"bg-[var(--ds-muted)]\" />,\n tbody: (p) => <tbody {...dom(p)} className=\"[&>tr:nth-child(even)]:bg-[var(--ds-muted)]\" />,\n tr: (p) => <tr {...dom(p)} />,\n th: (p) => (\n <th\n {...dom(p)}\n className={cn(cellClassName, \"text-left font-semibold text-[color:var(--ds-foreground)]\")}\n />\n ),\n td: (p) => <td {...dom(p)} className={cellClassName} />,\n hr: (p) => (\n <hr {...dom(p)} className=\"my-5 border-0 border-t border-[var(--ds-border)] group-data-[compact]/markdown:my-3\" />\n ),\n img: (p) => (\n <img\n {...dom(p)}\n className=\"my-3 max-w-full rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)]\"\n />\n ),\n };\n}\n\nexport interface MarkdownProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n /** The markdown source. */\n children: string | null | undefined;\n /** Tighter rhythm and smaller headings, for chat bubbles. */\n compact?: boolean;\n /** Renders fenced code blocks; the copy button is still added. Use for syntax highlighting. */\n codeRenderer?: (props: CodeRendererProps) => React.ReactNode;\n /** Override or extend the element map. */\n components?: Components;\n /** Extra remark plugins, appended after GFM. */\n remarkPlugins?: NonNullable<Options[\"remarkPlugins\"]>;\n /** Extra rehype plugins, appended after sanitize. */\n rehypePlugins?: NonNullable<Options[\"rehypePlugins\"]>;\n /**\n * Rehype plugins that must run BEFORE sanitize. The one legitimate use is\n * `rehype-raw` in a host that embeds trusted custom tags in markdown (the\n * webchat's `<cortena-*>` blocks): raw HTML has to become nodes before the\n * sanitizer sees it, and the sanitize schema then decides what survives.\n * Anything placed here widens what reaches the sanitizer, so keep the\n * schema strict when you use it.\n */\n rehypePluginsBeforeSanitize?: NonNullable<Options[\"rehypePlugins\"]>;\n /** Replace the sanitize schema; defaults to `markdownSanitizeSchema`. */\n sanitizeSchema?: SanitizeSchema;\n /** Rewrite URLs; defaults to react-markdown's, which drops non-http(s)/mailto/tel schemes. */\n urlTransform?: Options[\"urlTransform\"];\n}\n\nfunction Markdown({\n children,\n compact = false,\n codeRenderer,\n components,\n remarkPlugins,\n rehypePlugins,\n rehypePluginsBeforeSanitize,\n sanitizeSchema = markdownSanitizeSchema,\n urlTransform,\n className,\n ...props\n}: MarkdownProps) {\n const map = React.useMemo(\n () => ({ ...buildComponents(codeRenderer), ...components }),\n [codeRenderer, components],\n );\n const remark = React.useMemo(() => [remarkGfm, ...(remarkPlugins ?? [])], [remarkPlugins]);\n const rehype = React.useMemo(\n () => [...(rehypePluginsBeforeSanitize ?? []), [rehypeSanitize, sanitizeSchema] as const, ...(rehypePlugins ?? [])],\n [rehypePluginsBeforeSanitize, rehypePlugins, sanitizeSchema],\n );\n return (\n <div\n data-slot=\"markdown\"\n data-compact={compact || undefined}\n className={cn(\"group/markdown min-w-0 break-words text-[color:var(--ds-foreground)]\", className)}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={remark}\n rehypePlugins={rehype as NonNullable<Options[\"rehypePlugins\"]>}\n components={map}\n urlTransform={urlTransform}\n >\n {children ?? \"\"}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport { Markdown, markdownSanitizeSchema };\nexport type { Components as MarkdownComponents };\n","\"use client\";\n\nimport { Progress as BaseProgress } from \"@base-ui/react/progress\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Progress.\n *\n * `Progress` renders the Base UI root (a `<div role=\"progressbar\">` carrying\n * `aria-valuenow`) with the track and indicator already inside; Base UI sizes\n * the indicator to `value` as a percentage of `min`..`max`. Put a\n * `ProgressLabel` and `ProgressValue` in `children` for a captioned bar; they\n * render in a row above the track. `value={null}` gives an indeterminate bar.\n */\nexport interface ProgressProps extends React.ComponentProps<typeof BaseProgress.Root> {}\n\nfunction Progress({ className, children, ...props }: ProgressProps) {\n return (\n <BaseProgress.Root data-slot=\"progress\" className={cn(\"flex w-full flex-col gap-2\", className)} {...props}>\n {children ? <div className=\"flex items-center justify-between gap-2\">{children}</div> : null}\n <ProgressTrack>\n <ProgressIndicator />\n </ProgressTrack>\n </BaseProgress.Root>\n );\n}\n\nfunction ProgressTrack({ className, ...props }: React.ComponentProps<typeof BaseProgress.Track>) {\n return (\n <BaseProgress.Track\n data-slot=\"progress-track\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-[var(--ds-radius-full)] bg-[var(--ds-border)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressIndicator({ className, ...props }: React.ComponentProps<typeof BaseProgress.Indicator>) {\n return (\n <BaseProgress.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"h-full rounded-[var(--ds-radius-full)] bg-[var(--ds-primary)]\",\n \"transition-[width] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[indeterminate]:w-1/3 data-[indeterminate]:animate-pulse\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressLabel({ className, ...props }: React.ComponentProps<typeof BaseProgress.Label>) {\n return (\n <BaseProgress.Label\n data-slot=\"progress-label\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressValue({ className, ...props }: React.ComponentProps<typeof BaseProgress.Value>) {\n return (\n <BaseProgress.Value\n data-slot=\"progress-value\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] tabular-nums text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue };\n","\"use client\";\n\nimport { Radio } from \"@base-ui/react/radio\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Radio group.\n *\n * `RadioGroup` owns the value (`value` / `defaultValue` / `onValueChange`) and\n * renders a `<div role=\"radiogroup\">`; each `RadioGroupItem` is a Base UI\n * `Radio.Root` (`<span role=\"radio\">`) with a dot indicator that only mounts\n * while checked. Arrow keys move the selection, as the ARIA pattern requires.\n */\nexport interface RadioGroupProps extends React.ComponentProps<typeof BaseRadioGroup> {}\n\nfunction RadioGroup({ className, ...props }: RadioGroupProps) {\n return <BaseRadioGroup data-slot=\"radio-group\" className={cn(\"grid gap-3\", className)} {...props} />;\n}\n\nexport interface RadioGroupItemProps extends React.ComponentProps<typeof Radio.Root> {}\n\nfunction RadioGroupItem({ className, ...props }: RadioGroupItemProps) {\n return (\n <Radio.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"peer inline-flex aspect-square size-4 shrink-0 items-center justify-center rounded-[var(--ds-radius-full)] border\",\n \"border-[var(--ds-input)] bg-[var(--ds-background)] text-[color:var(--ds-primary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[checked]:border-[var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n >\n <Radio.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"block size-2 rounded-[var(--ds-radius-full)] bg-current\"\n />\n </Radio.Root>\n );\n}\n\nexport { RadioGroup, RadioGroupItem };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n type CardProps,\n} from \"@/components/card\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SectionCardProps extends Omit<CardProps, \"title\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Controls for the section, right-aligned in the header row. */\n actions?: React.ReactNode;\n /** Rendered in a CardFooter under the body. */\n footer?: React.ReactNode;\n /** Remove the body padding, for a table or list that fills the card. */\n flush?: boolean;\n /** Class on the body wrapper. */\n bodyClassName?: string;\n}\n\n/**\n * SectionCard — a Card with a header row (title, description, actions), a\n * body and an optional footer. It composes the Card parts rather than\n * restyling them, so a SectionCard and a hand-built Card look identical.\n *\n * `render` is Card's and reaches the outer element, so a section card can be\n * the landmark it is named after: `render={<section aria-labelledby={id} />}`\n * with the same `id` on the title, or `render={<aside />}` for a side panel.\n */\nfunction SectionCard({\n title,\n description,\n actions,\n footer,\n flush,\n bodyClassName,\n children,\n ...props\n}: SectionCardProps) {\n return (\n <Card data-slot=\"section-card\" {...props}>\n <CardHeader\n data-slot=\"section-card-header\"\n className=\"flex-row items-start justify-between gap-4 border-b border-[var(--ds-border-subtle)] pb-4\"\n >\n <div data-slot=\"section-card-heading\" className=\"flex min-w-0 flex-col gap-1\">\n <CardTitle data-slot=\"section-card-title\">{title}</CardTitle>\n {description ? (\n <CardDescription data-slot=\"section-card-description\">{description}</CardDescription>\n ) : null}\n </div>\n {actions ? (\n <div\n data-slot=\"section-card-actions\"\n className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\"\n >\n {actions}\n </div>\n ) : null}\n </CardHeader>\n <CardContent\n data-slot=\"section-card-body\"\n className={cn(flush ? \"p-0\" : \"p-5\", bodyClassName)}\n >\n {children}\n </CardContent>\n {footer ? <CardFooter data-slot=\"section-card-footer\">{footer}</CardFooter> : null}\n </Card>\n );\n}\n\nexport { SectionCard };\n","\"use client\";\n\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SeparatorProps extends React.ComponentProps<typeof BaseSeparator> {\n /**\n * Purely visual: renders with `role=\"none\"` so screen readers skip it.\n * Defaults to true, matching the Radix component this replaces.\n */\n decorative?: boolean;\n}\n\n/**\n * Separator — a one-pixel rule on the border token. Base UI supplies the\n * `role=\"separator\"` and `aria-orientation` semantics when not decorative.\n */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: SeparatorProps) {\n return (\n <BaseSeparator\n data-slot=\"separator\"\n orientation={orientation}\n // An explicit undefined would still override Base UI's own role.\n {...(decorative ? { role: \"none\" } : {})}\n className={cn(\n \"shrink-0 bg-[var(--ds-border)]\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full min-h-4 w-px self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * The error tone is `destructive`, the same spelling Button, Alert and Badge\n * use. `danger` is a deprecated alias of it and paints the same.\n */\ntype StatusDotTone =\n | \"accent\"\n | \"success\"\n | \"warning\"\n | \"destructive\"\n /** @deprecated Use `destructive`; this alias paints the same. */\n | \"danger\"\n | \"info\"\n | \"neutral\";\n\nconst TONE_CLASS: Record<StatusDotTone, string> = {\n accent: \"bg-[var(--ds-primary)]\",\n success: \"bg-[var(--ds-success)]\",\n warning: \"bg-[var(--ds-warning)]\",\n destructive: \"bg-[var(--ds-destructive)]\",\n danger: \"bg-[var(--ds-destructive)]\",\n info: \"bg-[var(--ds-info)]\",\n neutral: \"bg-[var(--ds-text-tertiary)]\",\n};\n\nexport interface StatusDotProps extends Omit<React.ComponentProps<\"span\">, \"children\"> {\n tone?: StatusDotTone;\n /** Adds a pinging halo behind the dot for \"currently active\" states. */\n live?: boolean;\n label?: React.ReactNode;\n /** Dot diameter in px. Defaults to 7. */\n size?: number;\n}\n\n/**\n * StatusDot — a coloured dot with an optional caption. `live` layers a ping\n * ring in the same tone behind the dot.\n */\nfunction StatusDot({\n className,\n tone = \"accent\",\n live,\n label,\n size = 7,\n style,\n ...props\n}: StatusDotProps) {\n return (\n <span\n data-slot=\"status-dot\"\n data-tone={tone}\n className={cn(\n \"inline-flex items-center gap-1.5\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <span\n aria-hidden\n data-slot=\"status-dot-indicator\"\n className=\"relative inline-flex shrink-0\"\n style={{ width: size, height: size, ...style }}\n >\n {live ? (\n <span\n data-slot=\"status-dot-ping\"\n className={cn(\n \"absolute inset-0 animate-ping rounded-[var(--ds-radius-full)] opacity-60\",\n TONE_CLASS[tone],\n )}\n />\n ) : null}\n <span\n data-slot=\"status-dot-fill\"\n className={cn(\n \"relative inline-block size-full rounded-[var(--ds-radius-full)]\",\n TONE_CLASS[tone],\n )}\n />\n </span>\n {label}\n </span>\n );\n}\n\nexport { StatusDot, type StatusDotTone };\n","\"use client\";\n\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Switch.\n *\n * Base UI renders a `<span role=\"switch\">` with a hidden `<input>` beside it,\n * so the control submits with forms and takes `checked`/`defaultChecked`\n * exactly like a checkbox. State is exposed as `data-checked` /\n * `data-unchecked` / `data-disabled`, which is what the classes key on.\n *\n * cortenaweb users: `checked` and `onCheckedChange` keep their names, but the\n * control is now uncontrolled by default; pass `defaultChecked` if you do not\n * hold the state yourself.\n */\nexport interface SwitchProps extends React.ComponentProps<typeof BaseSwitch.Root> {}\n\nfunction Switch({ className, ...props }: SwitchProps) {\n return (\n <BaseSwitch.Root\n data-slot=\"switch\"\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 items-center rounded-[var(--ds-radius-full)] border\",\n \"transition-[background-color,border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[unchecked]:border-[var(--ds-border)] data-[unchecked]:bg-[var(--ds-input)]\",\n \"data-[checked]:border-[var(--ds-primary)] data-[checked]:bg-[var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseSwitch.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block size-3.5 rounded-[var(--ds-radius-full)] bg-[var(--ds-primary-foreground)]\",\n \"transition-transform duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"data-[unchecked]:translate-x-0.5 data-[checked]:translate-x-4.5\",\n )}\n />\n </BaseSwitch.Root>\n );\n}\n\nexport { Switch };\n","\"use client\";\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Tabs — the underlined pattern (primary-coloured underline under the active\n * tab). For the inset segmented style use Segmented.\n *\n * The underline is a Base UI `Tabs.Indicator` rendered inside `TabsList`, so it\n * slides between tabs instead of snapping. Base UI exposes the active tab's\n * box as `--active-tab-left` / `--active-tab-width` on the indicator.\n *\n * Radix users: `data-state=\"active\"` is now `data-active`; `TabsTrigger` and\n * `TabsContent` are Base UI's `Tab` and `Panel` under the shadcn names. Arrow\n * keys activate as they move (Radix's `activationMode=\"automatic\"`); pass\n * `activateOnFocus={false}` on `TabsList` for manual activation.\n */\nfunction Tabs({ className, ...props }: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col data-[orientation=vertical]:flex-row\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n children,\n activateOnFocus = true,\n ...props\n}: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n activateOnFocus={activateOnFocus}\n className={cn(\n \"relative inline-flex items-center gap-0.5 self-start\",\n \"border-[var(--ds-border-subtle)] text-[color:var(--ds-muted-foreground)]\",\n \"data-[orientation=horizontal]:border-b\",\n \"data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[orientation=vertical]:border-r\",\n className,\n )}\n {...props}\n >\n {children}\n <TabsIndicator />\n </TabsPrimitive.List>\n );\n}\n\nfunction TabsIndicator({ className, ...props }: TabsPrimitive.Indicator.Props) {\n return (\n <TabsPrimitive.Indicator\n data-slot=\"tabs-indicator\"\n className={cn(\n \"absolute rounded-[var(--ds-radius-full)] bg-[var(--ds-primary)]\",\n \"transition-[width,height,translate] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n // Horizontal: an underline that slides along the bottom edge.\n \"data-[orientation=horizontal]:-bottom-px data-[orientation=horizontal]:left-0 data-[orientation=horizontal]:h-0.5\",\n \"data-[orientation=horizontal]:w-[var(--active-tab-width,0px)] data-[orientation=horizontal]:translate-x-[var(--active-tab-left,0px)]\",\n // Vertical: a bar on the trailing edge that slides down the list.\n \"data-[orientation=vertical]:-right-px data-[orientation=vertical]:top-0 data-[orientation=vertical]:w-0.5\",\n \"data-[orientation=vertical]:h-[var(--active-tab-height,0px)] data-[orientation=vertical]:translate-y-[var(--active-tab-top,0px)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex items-center gap-1.5 whitespace-nowrap px-3.5 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-muted-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] outline-none\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[active]:text-[color:var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\n \"mt-3 flex-1 rounded-[var(--ds-radius-sm)] outline-none\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsIndicator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Textarea.\n *\n * Same surface, border, focus ring and invalid state as Input so the two sit\n * together in a form. `autoGrow` resizes the element to its content on every\n * change (and on mount), which is how chat composers and note fields use it.\n */\nconst textareaClassName = cn(\n \"flex min-h-20 w-full min-w-0 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] px-3 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"outline-none focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n);\n\nexport interface TextareaProps extends React.ComponentProps<\"textarea\"> {\n /** When true the textarea grows to fit its content instead of scrolling. */\n autoGrow?: boolean;\n}\n\nfunction Textarea({ className, autoGrow = false, onChange, ref, ...props }: TextareaProps) {\n const internalRef = React.useRef<HTMLTextAreaElement | null>(null);\n\n const setRefs = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const fitToContent = React.useCallback(() => {\n const el = internalRef.current;\n if (el && autoGrow) {\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }\n }, [autoGrow]);\n\n React.useEffect(() => {\n fitToContent();\n }, [fitToContent]);\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n fitToContent();\n },\n [onChange, fitToContent],\n );\n\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(textareaClassName, autoGrow && \"resize-none overflow-hidden\", className)}\n ref={setRefs}\n onChange={handleChange}\n {...props}\n />\n );\n}\n\nexport { Textarea, textareaClassName };\n","\"use client\";\n\n/**\n * The cortena-ui side of the A2UI catalogue.\n *\n * One React view per catalogue entry. Each is a real component, not a render\n * function, so an interactive entry can hold hooks (draft input state, the\n * debounce timer) without the renderer having to care which entries are\n * stateful.\n *\n * Views receive already-resolved props: the renderer has read the data\n * bindings, validated against the entry's zod schema and normalised actions\n * before any of this runs. A view therefore never parses A2UI, and never sees\n * an unvalidated value.\n *\n * Every visual value is a cortena-design token, as everywhere else in the\n * package. The Tailwind scale maps below exist because Tailwind only emits a\n * class it can see in the source, so `gap-${n}` would silently produce nothing.\n */\n\nimport { AlertTriangle, CheckCircle2, Info, OctagonAlert, Terminal } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Alert, AlertDescription, AlertIcon, AlertTitle } from \"@/components/alert\";\nimport { Badge } from \"@/components/badge\";\nimport { Button } from \"@/components/button\";\nimport { ButtonLink } from \"@/components/button-link\";\nimport { Card, CardContent } from \"@/components/card\";\nimport { Chart } from \"@/components/chart\";\nimport type { ChartDataFor, ChartType } from \"@/components/chart\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { DataTable } from \"@/components/data-table\";\nimport type { DataSource, DataTableColumnDef } from \"@/components/data-table\";\nimport { DateField, formatDateISO, parseDateISO } from \"@/components/date-field\";\nimport { EmptyState } from \"@/components/empty-state\";\nimport { Field, FieldDescription, FieldError, FieldLabel } from \"@/components/field\";\nimport { Input } from \"@/components/input\";\nimport { Markdown } from \"@/components/markdown\";\nimport { Progress, ProgressLabel, ProgressValue } from \"@/components/progress\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/radio-group\";\nimport { SectionCard } from \"@/components/section-card\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/select\";\nimport { Separator } from \"@/components/separator\";\nimport { StatusDot } from \"@/components/status-dot\";\nimport { Switch } from \"@/components/switch\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/tabs\";\nimport { Textarea } from \"@/components/textarea\";\nimport { cn } from \"@/lib/cn\";\nimport type { A2UIAction } from \"./message\";\n\n/** A row in an agent-drawn table. Every value is opaque until a column reads it. */\nexport type A2UIRow = Record<string, unknown>;\n\n/** Where a node sits, carried into every action the view emits. */\nexport interface A2UINodeInfo {\n surfaceId: string;\n componentId: string;\n /** JSON pointer this node's relative bindings resolve against. */\n dataContextPath: string;\n}\n\n/** A normalised action attached to an interactive property. */\nexport interface A2UIResolvedAction {\n name: string;\n context?: Record<string, unknown>;\n}\n\n/** What every view receives. */\nexport interface A2UIViewProps<P> {\n props: P;\n node: A2UINodeInfo;\n /** Already-rendered child nodes, in the order the component listed them. */\n children: React.ReactNode[];\n /** The surface data model, for actions that report the whole form. */\n dataModel: Record<string, unknown>;\n /**\n * Send an action. `action` is what the agent attached to the property; when\n * it is absent the event still fires under `fallbackName` so a host can\n * observe interactions the agent did not ask for.\n */\n emit: (\n action: A2UIResolvedAction | undefined,\n fallbackName: string,\n payload?: Record<string, unknown>,\n ) => void;\n /** Write a value back to the data model where this prop was bound. No-op for a literal. */\n writeBack: (property: string, value: unknown) => void;\n /** Resolve a `{ kind: \"server\", sourceId }` handle into a real data source. */\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n /** Debounce applied to continuous inputs before they become actions. */\n debounceMs: number;\n}\n\nexport type A2UIView<P> = React.FC<A2UIViewProps<P>>;\n\n/* ------------------------------------------------------------------ */\n/* Shared scales */\n/* ------------------------------------------------------------------ */\n\n/** Tailwind spacing steps an agent may pick. Written out so Tailwind emits them. */\nconst GAP: Record<number, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n};\n\nconst PADDING: Record<number, string> = {\n 0: \"p-0\",\n 1: \"p-1\",\n 2: \"p-2\",\n 3: \"p-3\",\n 4: \"p-4\",\n 6: \"p-6\",\n 8: \"p-8\",\n};\n\nconst HEIGHT: Record<number, string> = {\n 0: \"h-0\",\n 1: \"h-1\",\n 2: \"h-2\",\n 3: \"h-3\",\n 4: \"h-4\",\n 6: \"h-6\",\n 8: \"h-8\",\n};\n\nconst ALIGN: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst JUSTIFY: Record<string, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\n\nconst TEXT_ALIGN: Record<string, string> = {\n start: \"text-left\",\n center: \"text-center\",\n end: \"text-right\",\n};\n\nconst TEXT_ROLE: Record<string, string> = {\n heading:\n \"font-display text-[length:var(--ds-text-h3)] leading-[var(--ds-text-h3--line-height)] font-semibold\",\n subheading:\n \"text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)] font-semibold\",\n body: \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n caption: \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)]\",\n eyebrow:\n \"text-[length:var(--ds-text-eyebrow)] leading-[var(--ds-text-eyebrow--line-height)] font-medium uppercase tracking-[var(--ds-text-eyebrow--letter-spacing)]\",\n};\n\nconst TEXT_TONE: Record<string, string> = {\n default: \"text-[color:var(--ds-foreground)]\",\n muted: \"text-[color:var(--ds-muted-foreground)]\",\n success: \"text-[color:var(--ds-success)]\",\n warning: \"text-[color:var(--ds-warning)]\",\n danger: \"text-[color:var(--ds-destructive)]\",\n info: \"text-[color:var(--ds-info)]\",\n};\n\n/**\n * Components that are inline by nature.\n *\n * A Column stretches its children on the cross axis, which is right for a field\n * or a table and wrong for a badge — one would span the whole surface. `w-fit`\n * gives the item an explicit cross size, which is what disables the stretch,\n * without overriding a Row's own alignment.\n */\nconst INLINE = \"w-fit\";\n\nconst ALERT_ICON: Record<string, React.ReactNode> = {\n default: <Terminal />,\n success: <CheckCircle2 />,\n warn: <AlertTriangle />,\n danger: <OctagonAlert />,\n info: <Info />,\n};\n\n/**\n * Debounce a value. Used for continuous inputs so an agent receives one action\n * per pause rather than one per keystroke; the visible input stays immediate.\n */\nfunction useDebouncedEmit(\n emit: (value: unknown) => void,\n delay: number,\n): (value: unknown) => void {\n const latest = React.useRef(emit);\n latest.current = emit;\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n React.useEffect(\n () => () => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n }\n },\n [],\n );\n return React.useCallback(\n (value: unknown) => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(() => latest.current(value), delay);\n },\n [delay],\n );\n}\n\n/**\n * A value that follows the data model but can be typed over.\n *\n * The bound value wins whenever the agent changes it; between agent updates the\n * local draft wins, so typing is not swallowed by a re-render.\n *\n * `key` is what identity is judged on, and defaults to the value itself. It\n * matters for a value the renderer rebuilds each pass — a Date parsed from an\n * ISO string is a new object every render, so comparing the objects would reset\n * the draft forever. Compare the string instead.\n */\nfunction useDraft<T>(bound: T, key: unknown = bound): [T, (next: T) => void] {\n const [draft, setDraft] = React.useState<T>(bound);\n const previous = React.useRef(key);\n if (!Object.is(previous.current, key)) {\n previous.current = key;\n setDraft(bound);\n }\n return [draft, setDraft];\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout */\n/* ------------------------------------------------------------------ */\n\nexport interface ColumnProps {\n gap?: number;\n padding?: number;\n align?: string;\n justify?: string;\n}\n\nexport const ColumnView: A2UIView<ColumnProps> = ({ props, children }) => (\n <div\n data-slot=\"a2ui-column\"\n className={cn(\n \"flex min-w-0 flex-col\",\n GAP[props.gap ?? 3],\n props.padding !== undefined ? PADDING[props.padding] : undefined,\n props.align ? ALIGN[props.align] : undefined,\n props.justify ? JUSTIFY[props.justify] : undefined,\n )}\n >\n {children}\n </div>\n);\n\nexport interface RowProps extends ColumnProps {\n wrap?: boolean;\n}\n\nexport const RowView: A2UIView<RowProps> = ({ props, children }) => (\n <div\n data-slot=\"a2ui-row\"\n className={cn(\n \"flex min-w-0 flex-row\",\n props.wrap === false ? \"flex-nowrap\" : \"flex-wrap\",\n GAP[props.gap ?? 2],\n props.padding !== undefined ? PADDING[props.padding] : undefined,\n ALIGN[props.align ?? \"center\"],\n props.justify ? JUSTIFY[props.justify] : undefined,\n )}\n >\n {children}\n </div>\n);\n\nexport interface CardViewProps {\n accent?: boolean;\n flush?: boolean;\n}\n\nexport const CardView: A2UIView<CardViewProps> = ({ props, children }) => (\n <Card data-slot=\"a2ui-card\" accent={props.accent}>\n {props.flush ? (\n <div className=\"flex flex-col gap-3\">{children}</div>\n ) : (\n <CardContent className=\"flex flex-col gap-3 p-5\">{children}</CardContent>\n )}\n </Card>\n);\n\nexport interface SectionCardViewProps {\n title: string;\n description?: string;\n flush?: boolean;\n}\n\nexport const SectionCardView: A2UIView<SectionCardViewProps> = ({ props, children }) => (\n <SectionCard\n data-slot=\"a2ui-section-card\"\n title={props.title}\n description={props.description}\n flush={props.flush}\n >\n <div className=\"flex flex-col gap-3\">{children}</div>\n </SectionCard>\n);\n\nexport interface DividerProps {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const DividerView: A2UIView<DividerProps> = ({ props }) => (\n <Separator data-slot=\"a2ui-divider\" orientation={props.orientation ?? \"horizontal\"} />\n);\n\nexport interface SpacerProps {\n size?: number;\n}\n\nexport const SpacerView: A2UIView<SpacerProps> = ({ props }) => (\n <div data-slot=\"a2ui-spacer\" aria-hidden className={cn(\"w-full\", HEIGHT[props.size ?? 4])} />\n);\n\n/* ------------------------------------------------------------------ */\n/* Text */\n/* ------------------------------------------------------------------ */\n\nexport interface TextProps {\n text: string;\n role?: string;\n tone?: string;\n align?: string;\n mono?: boolean;\n}\n\nexport const TextView: A2UIView<TextProps> = ({ props }) => (\n <p\n data-slot=\"a2ui-text\"\n data-role={props.role ?? \"body\"}\n className={cn(\n \"min-w-0 break-words\",\n TEXT_ROLE[props.role ?? \"body\"],\n TEXT_TONE[props.tone ?? \"default\"],\n props.align ? TEXT_ALIGN[props.align] : undefined,\n props.mono ? \"font-[family-name:var(--ds-font-mono)]\" : undefined,\n )}\n >\n {props.text}\n </p>\n);\n\nexport interface MarkdownViewProps {\n text: string;\n compact?: boolean;\n}\n\nexport const MarkdownView: A2UIView<MarkdownViewProps> = ({ props }) => (\n <Markdown data-slot=\"a2ui-markdown\" compact={props.compact}>\n {props.text}\n </Markdown>\n);\n\n/* ------------------------------------------------------------------ */\n/* Inputs */\n/* ------------------------------------------------------------------ */\n\ninterface FieldShellProps {\n label?: string;\n description?: string;\n error?: string;\n children: React.ReactNode;\n slot: string;\n orientation?: \"vertical\" | \"horizontal\";\n /**\n * Ties the label to the control. Base UI's Field associates its own\n * `Field.Control`; these views render plain cortena-ui controls, so the pair\n * is wired explicitly rather than left to produce a label with no `for`.\n */\n controlId?: string;\n}\n\nfunction FieldShell({\n label,\n description,\n error,\n children,\n slot,\n orientation,\n controlId,\n}: FieldShellProps) {\n return (\n <Field data-slot={slot} orientation={orientation ?? \"vertical\"} invalid={Boolean(error)}>\n {label ? <FieldLabel htmlFor={controlId}>{label}</FieldLabel> : null}\n {children}\n {description ? <FieldDescription>{description}</FieldDescription> : null}\n {error ? <FieldError>{error}</FieldError> : null}\n </Field>\n );\n}\n\nexport interface TextFieldProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n type?: \"text\" | \"email\" | \"url\" | \"tel\" | \"number\" | \"password\" | \"search\";\n disabled?: boolean;\n required?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TextFieldView: A2UIView<TextFieldProps> = ({\n props,\n emit,\n writeBack,\n debounceMs,\n}) => {\n const id = React.useId();\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n const send = useDebouncedEmit(\n (value) => emit(props.onChange, \"change\", { value }),\n debounceMs,\n );\n return (\n <FieldShell\n slot=\"a2ui-text-field\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <Input\n id={id}\n type={props.type ?? \"text\"}\n value={draft}\n placeholder={props.placeholder}\n disabled={props.disabled}\n required={props.required}\n aria-label={props.label ? undefined : (props.placeholder ?? \"Text field\")}\n onChange={(event) => {\n const next = event.target.value;\n setDraft(next);\n writeBack(\"value\", next);\n send(next);\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface TextAreaProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n rows?: number;\n disabled?: boolean;\n autoGrow?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TextAreaView: A2UIView<TextAreaProps> = ({ props, emit, writeBack, debounceMs }) => {\n const id = React.useId();\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n const send = useDebouncedEmit((value) => emit(props.onChange, \"change\", { value }), debounceMs);\n return (\n <FieldShell\n slot=\"a2ui-text-area\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <Textarea\n id={id}\n value={draft}\n rows={props.rows ?? 4}\n placeholder={props.placeholder}\n disabled={props.disabled}\n autoGrow={props.autoGrow}\n aria-label={props.label ? undefined : (props.placeholder ?? \"Text area\")}\n onChange={(event) => {\n const next = event.target.value;\n setDraft(next);\n writeBack(\"value\", next);\n send(next);\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface SelectOption {\n value: string;\n label?: string;\n disabled?: boolean;\n}\n\nexport interface SelectViewProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n options: SelectOption[];\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const SelectView: A2UIView<SelectViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.value ?? null);\n const items = React.useMemo(\n () => props.options.map((option) => ({ value: option.value, label: option.label ?? option.value })),\n [props.options],\n );\n return (\n <FieldShell\n slot=\"a2ui-select\"\n label={props.label}\n description={props.description}\n error={props.error}\n >\n <Select\n items={items}\n value={draft}\n disabled={props.disabled}\n onValueChange={(next) => {\n const value = next === null ? \"\" : String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n >\n <SelectTrigger aria-label={props.label ?? props.placeholder ?? \"Select\"}>\n <SelectValue placeholder={props.placeholder ?? \"Select…\"} />\n </SelectTrigger>\n <SelectContent>\n {props.options.map((option) => (\n <SelectItem key={option.value} value={option.value} disabled={option.disabled}>\n {option.label ?? option.value}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FieldShell>\n );\n};\n\nexport interface CheckboxViewProps {\n label?: string;\n checked?: boolean;\n description?: string;\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const CheckboxView: A2UIView<CheckboxViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.checked ?? false);\n return (\n <FieldShell\n slot=\"a2ui-checkbox\"\n description={props.description}\n orientation=\"horizontal\"\n >\n <label className=\"flex items-start gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\">\n <span className=\"flex h-5 items-center\">\n <Checkbox\n checked={draft}\n disabled={props.disabled}\n aria-label={props.label ?? \"Checkbox\"}\n onCheckedChange={(checked) => {\n setDraft(checked);\n writeBack(\"checked\", checked);\n emit(props.onChange, \"change\", { checked });\n }}\n />\n </span>\n <span>{props.label}</span>\n </label>\n </FieldShell>\n );\n};\n\nexport interface SwitchViewProps extends CheckboxViewProps {}\n\nexport const SwitchView: A2UIView<SwitchViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.checked ?? false);\n return (\n <FieldShell slot=\"a2ui-switch\" description={props.description} orientation=\"horizontal\">\n <label className=\"flex items-center gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\">\n <Switch\n checked={draft}\n disabled={props.disabled}\n aria-label={props.label ?? \"Switch\"}\n onCheckedChange={(checked) => {\n setDraft(checked);\n writeBack(\"checked\", checked);\n emit(props.onChange, \"change\", { checked });\n }}\n />\n <span>{props.label}</span>\n </label>\n </FieldShell>\n );\n};\n\nexport interface RadioGroupViewProps {\n label?: string;\n value?: string;\n description?: string;\n options: SelectOption[];\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const RadioGroupView: A2UIView<RadioGroupViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n return (\n <FieldShell\n slot=\"a2ui-radio-group\"\n label={props.label}\n description={props.description}\n >\n <RadioGroup\n aria-label={props.label ?? \"Options\"}\n value={draft}\n disabled={props.disabled}\n onValueChange={(next) => {\n const value = String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n >\n {props.options.map((option) => (\n <label\n key={option.value}\n className=\"flex items-start gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\"\n >\n <span className=\"flex h-5 items-center\">\n <RadioGroupItem value={option.value} disabled={option.disabled} />\n </span>\n <span>{option.label ?? option.value}</span>\n </label>\n ))}\n </RadioGroup>\n </FieldShell>\n );\n};\n\nexport interface DateFieldViewProps {\n label?: string;\n /** ISO `yyyy-mm-dd`; the wire format for a date in A2UI. */\n value?: string;\n min?: string;\n max?: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const DateFieldView: A2UIView<DateFieldViewProps> = ({ props, emit, writeBack }) => {\n const id = React.useId();\n const bound = props.value ? parseDateISO(props.value) : undefined;\n const [draft, setDraft] = useDraft<Date | undefined>(bound, props.value ?? \"\");\n return (\n <FieldShell\n slot=\"a2ui-date-field\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <DateField\n id={id}\n value={draft}\n min={props.min ? parseDateISO(props.min) : undefined}\n max={props.max ? parseDateISO(props.max) : undefined}\n disabled={props.disabled}\n invalid={Boolean(props.error)}\n aria-label={props.label ?? \"Date\"}\n onValueChange={(date) => {\n setDraft(date);\n const value = date ? formatDateISO(date) : \"\";\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface ButtonViewProps {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"soft\" | \"destructive\" | \"link\";\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n /** Report the whole surface data model with the action, for a form submit. */\n submit?: boolean;\n onPress?: A2UIResolvedAction;\n}\n\nexport const ButtonView: A2UIView<ButtonViewProps> = ({ props, emit, dataModel }) => (\n <Button\n data-slot=\"a2ui-button\"\n className={INLINE}\n variant={props.variant ?? \"primary\"}\n size={props.size ?? \"md\"}\n disabled={props.disabled}\n onClick={() =>\n emit(\n props.onPress,\n props.submit ? \"submit\" : \"press\",\n props.submit ? { data: dataModel } : {},\n )\n }\n >\n {props.label}\n </Button>\n);\n\nexport interface ButtonLinkViewProps {\n label: string;\n href: string;\n variant?: ButtonViewProps[\"variant\"];\n size?: ButtonViewProps[\"size\"];\n target?: \"_self\" | \"_blank\";\n}\n\n// ButtonLink sets its own `data-slot` after spreading props, so the A2UI marker\n// goes on a wrapper rather than being silently dropped.\nexport const ButtonLinkView: A2UIView<ButtonLinkViewProps> = ({ props }) => (\n <span data-slot=\"a2ui-button-link\" className={cn(\"inline-flex\", INLINE)}>\n <ButtonLink\n variant={props.variant ?? \"secondary\"}\n size={props.size ?? \"md\"}\n href={props.href}\n target={props.target}\n rel={props.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n >\n {props.label}\n </ButtonLink>\n </span>\n);\n\nexport interface LinkViewProps {\n label: string;\n href: string;\n target?: \"_self\" | \"_blank\";\n}\n\nexport const LinkView: A2UIView<LinkViewProps> = ({ props }) => (\n <a\n data-slot=\"a2ui-link\"\n href={props.href}\n target={props.target}\n rel={props.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={cn(\n INLINE,\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-primary)] underline underline-offset-4\",\n \"hover:text-[color:var(--ds-primary-hover)]\",\n )}\n >\n {props.label}\n </a>\n);\n\n/* ------------------------------------------------------------------ */\n/* Feedback */\n/* ------------------------------------------------------------------ */\n\nexport interface BadgeViewProps {\n label: string;\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\" | \"outline\";\n}\n\nexport const BadgeView: A2UIView<BadgeViewProps> = ({ props }) => (\n <Badge data-slot=\"a2ui-badge\" className={INLINE} variant={props.variant ?? \"default\"}>\n {props.label}\n </Badge>\n);\n\nexport interface AlertViewProps {\n title?: string;\n description?: string;\n variant?: \"default\" | \"success\" | \"warn\" | \"danger\" | \"info\";\n}\n\nexport const AlertView: A2UIView<AlertViewProps> = ({ props }) => {\n const variant = props.variant ?? \"default\";\n return (\n <Alert data-slot=\"a2ui-alert\" variant={variant}>\n <AlertIcon>{ALERT_ICON[variant]}</AlertIcon>\n <div>\n {props.title ? <AlertTitle>{props.title}</AlertTitle> : null}\n {props.description ? <AlertDescription>{props.description}</AlertDescription> : null}\n </div>\n </Alert>\n );\n};\n\nexport interface ProgressViewProps {\n /** `null` renders the indeterminate bar. */\n value?: number | null;\n max?: number;\n label?: string;\n showValue?: boolean;\n}\n\nexport const ProgressViewComponent: A2UIView<ProgressViewProps> = ({ props }) => (\n <Progress\n data-slot=\"a2ui-progress\"\n value={props.value === undefined ? null : props.value}\n max={props.max}\n aria-label={props.label ?? \"Progress\"}\n >\n {props.label ? <ProgressLabel>{props.label}</ProgressLabel> : null}\n {props.showValue === false ? null : <ProgressValue />}\n </Progress>\n);\n\nexport interface StatusDotViewProps {\n label?: string;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n live?: boolean;\n}\n\nexport const StatusDotView: A2UIView<StatusDotViewProps> = ({ props }) => (\n <StatusDot\n data-slot=\"a2ui-status-dot\"\n className={INLINE}\n tone={props.tone ?? \"accent\"}\n live={props.live}\n label={props.label}\n />\n);\n\nexport interface EmptyStateViewProps {\n title: string;\n description?: string;\n size?: \"default\" | \"compact\";\n}\n\nexport const EmptyStateView: A2UIView<EmptyStateViewProps> = ({ props, children }) => (\n <EmptyState\n data-slot=\"a2ui-empty-state\"\n title={props.title}\n description={props.description}\n size={props.size ?? \"compact\"}\n action={children.length > 0 ? <div className=\"flex gap-2\">{children}</div> : undefined}\n />\n);\n\n/* ------------------------------------------------------------------ */\n/* Data */\n/* ------------------------------------------------------------------ */\n\nexport interface A2UIColumn {\n id: string;\n label?: string;\n align?: \"start\" | \"center\" | \"end\";\n filter?: \"faceted\" | \"text\";\n width?: number;\n}\n\n/**\n * Where a table's rows come from.\n *\n * `client` carries the rows inline, which suits a short result an agent\n * already has. `server` carries a handle instead: the agent obtains a\n * `sourceId` from a tool and the host resolves it through\n * `resolveDataSource`, so search, sort and paging run on the backend and the\n * agent never has to put ten thousand rows in a message.\n */\nexport type A2UITableSource =\n | { kind: \"client\"; rows: A2UIRow[] }\n | { kind: \"server\"; sourceId: string };\n\nexport interface DataTableViewProps {\n columns: A2UIColumn[];\n dataSource: A2UITableSource;\n pageSize?: number;\n density?: \"default\" | \"compact\";\n searchPlaceholder?: string;\n emptyMessage?: string;\n maxHeight?: number;\n onRowClick?: A2UIResolvedAction;\n}\n\nexport const DataTableView: A2UIView<DataTableViewProps> = ({\n props,\n emit,\n resolveDataSource,\n}) => {\n const columns = React.useMemo<DataTableColumnDef<A2UIRow>[]>(\n () =>\n props.columns.map((column) => ({\n id: column.id,\n accessorKey: column.id,\n header: column.label ?? column.id,\n size: column.width,\n meta: {\n align: column.align,\n filter: column.filter,\n label: column.label ?? column.id,\n },\n })) as DataTableColumnDef<A2UIRow>[],\n [props.columns],\n );\n\n const source = props.dataSource;\n const resolved: DataSource<A2UIRow> | undefined =\n source.kind === \"client\" ? { kind: \"client\", rows: source.rows } : resolveDataSource(source.sourceId);\n\n if (!resolved) {\n return (\n <A2UIErrorCard\n title=\"Unknown data source\"\n detail={`No data source is registered for \"${(source as { sourceId: string }).sourceId}\". The host resolves a server table through resolveDataSource.`}\n />\n );\n }\n\n return (\n <div data-slot=\"a2ui-data-table\">\n <DataTable<A2UIRow>\n columns={columns}\n dataSource={resolved}\n pageSize={props.pageSize ?? 10}\n density={props.density ?? \"compact\"}\n maxHeight={props.maxHeight}\n searchPlaceholder={props.searchPlaceholder}\n emptyMessage={props.emptyMessage}\n onRowClick={(row) => emit(props.onRowClick, \"rowClick\", { row })}\n />\n </div>\n );\n};\n\nexport interface ChartViewProps {\n type: ChartType;\n data: unknown;\n title?: string;\n height?: number;\n stacked?: boolean;\n legend?: boolean;\n grid?: boolean;\n scale?: \"sequential\" | \"diverging\";\n indexBy?: string;\n keys?: string[];\n from?: string;\n to?: string;\n emptyMessage?: string;\n}\n\nexport const ChartView: A2UIView<ChartViewProps> = ({ props }) => (\n <div data-slot=\"a2ui-chart\" className=\"flex flex-col gap-2\">\n {props.title ? (\n <p className=\"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-foreground)]\">\n {props.title}\n </p>\n ) : null}\n <Chart\n type={props.type}\n data={props.data as ChartDataFor<ChartType>}\n height={props.height ?? 260}\n stacked={props.stacked}\n legend={props.legend}\n grid={props.grid}\n scale={props.scale}\n indexBy={props.indexBy}\n keys={props.keys}\n from={props.from}\n to={props.to}\n emptyMessage={props.emptyMessage}\n />\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Tabs and media */\n/* ------------------------------------------------------------------ */\n\nexport interface TabDescriptor {\n value: string;\n label: string;\n}\n\nexport interface TabsViewProps {\n tabs: TabDescriptor[];\n value?: string;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TabsView: A2UIView<TabsViewProps> = ({ props, children, emit, writeBack }) => {\n const first = props.tabs[0]?.value ?? \"\";\n const [draft, setDraft] = useDraft(props.value ?? first);\n return (\n <Tabs\n data-slot=\"a2ui-tabs\"\n value={draft}\n onValueChange={(next) => {\n const value = String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"tabChange\", { value });\n }}\n >\n <TabsList>\n {props.tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {props.tabs.map((tab, index) => (\n <TabsContent key={tab.value} value={tab.value}>\n {children[index] ?? null}\n </TabsContent>\n ))}\n </Tabs>\n );\n};\n\nexport interface ImageViewProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n rounded?: boolean;\n fit?: \"cover\" | \"contain\";\n}\n\nexport const ImageView: A2UIView<ImageViewProps> = ({ props }) => (\n <img\n data-slot=\"a2ui-image\"\n src={props.src}\n alt={props.alt}\n width={props.width}\n height={props.height}\n className={cn(\n INLINE,\n \"max-w-full\",\n props.fit === \"cover\" ? \"object-cover\" : \"object-contain\",\n props.rounded === false ? undefined : \"rounded-[var(--ds-radius-md)]\",\n \"border border-[var(--ds-border-subtle)]\",\n )}\n />\n);\n\n/* ------------------------------------------------------------------ */\n/* Error card */\n/* ------------------------------------------------------------------ */\n\n/**\n * What the renderer draws instead of a component it cannot draw.\n *\n * Never raw markup and never the offending payload as HTML: the detail is set\n * as text, so a malformed message cannot inject anything. This is the\n * \"fallback: an error card on malformed payloads\" of `05-agent-ui.md`.\n */\nexport function A2UIErrorCard({\n title,\n detail,\n componentId,\n}: {\n title: string;\n detail?: string;\n componentId?: string;\n}) {\n return (\n <Alert data-slot=\"a2ui-error\" variant=\"danger\" role=\"alert\">\n <AlertIcon>\n <OctagonAlert />\n </AlertIcon>\n <div className=\"min-w-0\">\n <AlertTitle>{title}</AlertTitle>\n {detail ? (\n <AlertDescription className=\"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] break-words\">\n {detail}\n </AlertDescription>\n ) : null}\n {componentId ? (\n <AlertDescription className=\"text-[length:var(--ds-text-caption-sm)] text-[color:var(--ds-muted-foreground)]\">\n Component id: {componentId}\n </AlertDescription>\n ) : null}\n </div>\n </Alert>\n );\n}\n\n/** Re-exported so consumers can type an action handler without the message module. */\nexport type { A2UIAction };\n","/**\n * The A2UI catalogue, bound to cortena-ui.\n *\n * A2UI's safety property is that an agent may only choose from a catalogue the\n * host controls: it cannot emit markup, styles or script, only a component name\n * and properties the host validates. This file is that catalogue. Each entry\n * declares\n *\n * - the A2UI component name an agent writes,\n * - a zod schema for its **resolved** properties (bindings already read),\n * - the event names it can raise,\n * - whether it takes children,\n * - a self-contained example, which is both the doc's sample and a fixture,\n * - the cortena-ui view that draws it.\n *\n * The vocabulary therefore grows with the package rather than with a parser:\n * adding a component here adds it to what every agent can draw, and\n * `catalogue-doc.ts` regenerates the prompt section from the same object, so\n * prompt and renderer cannot drift (DESIGN-34).\n *\n * Schemas describe resolved values because the renderer resolves `{ path }`\n * bindings, unwraps literals and normalises actions before validating. A view\n * therefore never receives an unchecked value, and a property an agent got\n * wrong produces an error card naming the property rather than a blank area.\n */\n\nimport { z } from \"zod\";\nimport type { A2UIComponentSpec } from \"./message\";\nimport * as views from \"./views\";\nimport type { A2UIView } from \"./views\";\n\n/** The five families the doc and the prompt group components by. */\nexport type A2UIGroup = \"layout\" | \"text\" | \"input\" | \"feedback\" | \"data\";\n\n/** A ready-to-render example: the components, plus any data model they bind to. */\nexport interface A2UIExample {\n /** Components for this entry. The first is the one being demonstrated. */\n components: A2UIComponentSpec[];\n /** Seed data for `{ path }` bindings used by the example. */\n data?: Record<string, unknown>;\n}\n\nexport interface A2UICatalogueEntry<P = unknown> {\n /** The name an agent writes in `component`. */\n name: string;\n group: A2UIGroup;\n /** One sentence, used verbatim in the generated prompt section. */\n summary: string;\n /** Schema of the resolved properties. */\n props: z.ZodType<P>;\n /** Event names this component can raise through `onAction`. */\n events: readonly string[];\n /** `many` takes a `children` list; `none` ignores one. */\n children: \"none\" | \"many\";\n example: A2UIExample;\n view: A2UIView<P>;\n}\n\nexport type A2UICatalogue = Readonly<Record<string, A2UICatalogueEntry<never>>>;\n\n/** Keeps each entry's props type tied to its view without widening the record. */\nfunction entry<P>(definition: A2UICatalogueEntry<P>): A2UICatalogueEntry<never> {\n return definition as unknown as A2UICatalogueEntry<never>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared property fragments */\n/* ------------------------------------------------------------------ */\n\n/**\n * A resolved action.\n *\n * On the wire an agent writes A2UI v0.9's `{ event: { name, context } }`, the\n * bare `{ name, context }`, or just the name as a string; the renderer\n * normalises all three to this before validation.\n */\nconst Action = z\n .object({\n name: z.string().describe(\"Event name sent back to the agent.\"),\n context: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Extra values merged into the action payload.\"),\n })\n .describe(\"An action reported to the agent when the user interacts.\");\n\nconst Option = z.object({\n value: z.string().describe(\"Value written to the data model.\"),\n label: z.string().optional().describe(\"Text shown to the user; defaults to the value.\"),\n disabled: z.boolean().optional(),\n});\n\nconst gap = z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])\n .describe(\"Spacing step between children.\");\n\nconst padding = z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])\n .describe(\"Inner padding step.\");\n\nconst alignment = z\n .enum([\"start\", \"center\", \"end\", \"stretch\", \"baseline\"])\n .describe(\"Cross-axis alignment.\");\n\nconst justification = z\n .enum([\"start\", \"center\", \"end\", \"between\"])\n .describe(\"Main-axis distribution.\");\n\nconst fieldChrome = {\n label: z.string().optional().describe(\"Field label.\"),\n description: z.string().optional().describe(\"Helper text under the control.\"),\n error: z.string().optional().describe(\"Validation message; also marks the field invalid.\"),\n disabled: z.boolean().optional(),\n};\n\nconst buttonVariant = z\n .enum([\"primary\", \"secondary\", \"outline\", \"ghost\", \"soft\", \"destructive\", \"link\"])\n .describe(\"Visual weight.\");\n\nconst buttonSize = z.enum([\"sm\", \"md\", \"lg\"]).describe(\"Control size.\");\n\n/**\n * A URL an agent may point at.\n *\n * Restricted by scheme rather than sanitised after the fact: `javascript:` and\n * friends never reach the DOM because they never pass validation, so the\n * component gets an error card instead.\n */\nconst httpUrl = z\n .string()\n .refine(\n (value) => /^https?:\\/\\//i.test(value) || value.startsWith(\"/\") || value.startsWith(\"#\"),\n \"Must be an http(s), root-relative or fragment URL.\",\n )\n .describe(\"Destination URL (http, https, root-relative or fragment).\");\n\nconst imageUrl = z\n .string()\n .refine(\n (value) => /^https?:\\/\\//i.test(value) || /^data:image\\//i.test(value) || value.startsWith(\"/\"),\n \"Must be an http(s), root-relative or data:image URL.\",\n )\n .describe(\"Image URL (http, https, root-relative or data:image).\");\n\n/** Every chart type the Chart composite draws, Recharts and Nivo alike. */\nconst chartType = z\n .enum([\n \"bar\",\n \"line\",\n \"area\",\n \"pie\",\n \"donut\",\n \"scatter\",\n \"scatterplot\",\n \"radar\",\n \"funnel\",\n \"heatmap\",\n \"calendar\",\n \"treemap\",\n \"sunburst\",\n ])\n .describe(\"Chart type; the package picks Recharts or Nivo for it.\");\n\n/**\n * A table's rows, or a handle to them.\n *\n * The server form is the point of `04-data-tables.md` in an agent context: the\n * agent calls a tool, gets back a `sourceId`, and passes that. The host resolves\n * it through `resolveDataSource`, so search, sort and paging stay on the backend\n * and a large result never travels through the model.\n */\nconst tableSource = z\n .union([\n z.object({\n kind: z.literal(\"client\"),\n rows: z.array(z.record(z.string(), z.unknown())).describe(\"The rows, inline.\"),\n }),\n z.object({\n kind: z.literal(\"server\"),\n sourceId: z\n .string()\n .describe(\"Handle obtained from a tool; the host resolves it to a server source.\"),\n }),\n ])\n .describe(\"Where the table's rows come from.\");\n\n/* ------------------------------------------------------------------ */\n/* The catalogue */\n/* ------------------------------------------------------------------ */\n\nconst layout = {\n Column: entry<views.ColumnProps>({\n name: \"Column\",\n group: \"layout\",\n summary: \"Stacks its children vertically.\",\n props: z.object({ gap: gap.optional(), padding: padding.optional(), align: alignment.optional(), justify: justification.optional() }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"col\", component: \"Column\", gap: 3, children: [\"col-a\", \"col-b\"] },\n { id: \"col-a\", component: \"Text\", text: \"First\", role: \"body\" },\n { id: \"col-b\", component: \"Text\", text: \"Second\", role: \"body\" },\n ],\n },\n view: views.ColumnView,\n }),\n\n Row: entry<views.RowProps>({\n name: \"Row\",\n group: \"layout\",\n summary: \"Lays its children out horizontally, wrapping by default.\",\n props: z.object({\n gap: gap.optional(),\n padding: padding.optional(),\n align: alignment.optional(),\n justify: justification.optional(),\n wrap: z.boolean().optional().describe(\"Set false to keep one line.\"),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"row\", component: \"Row\", gap: 2, children: [\"row-a\", \"row-b\"] },\n { id: \"row-a\", component: \"Badge\", label: \"Open\", variant: \"info\" },\n { id: \"row-b\", component: \"Badge\", label: \"3 days\", variant: \"neutral\" },\n ],\n },\n view: views.RowView,\n }),\n\n Card: entry<views.CardViewProps>({\n name: \"Card\",\n group: \"layout\",\n summary: \"A bordered surface grouping related content.\",\n props: z.object({\n accent: z.boolean().optional().describe(\"Draw the border in the ring colour.\"),\n flush: z.boolean().optional().describe(\"Remove the body padding.\"),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"card\", component: \"Card\", children: [\"card-text\"] },\n { id: \"card-text\", component: \"Text\", text: \"Inside a card.\", role: \"body\" },\n ],\n },\n view: views.CardView,\n }),\n\n SectionCard: entry<views.SectionCardViewProps>({\n name: \"SectionCard\",\n group: \"layout\",\n summary: \"A card with a title and description header above its children.\",\n props: z.object({\n title: z.string().describe(\"Header title.\"),\n description: z.string().optional().describe(\"Header description.\"),\n flush: z.boolean().optional(),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n {\n id: \"section\",\n component: \"SectionCard\",\n title: \"Pipeline\",\n description: \"Deals closing this quarter.\",\n children: [\"section-text\"],\n },\n { id: \"section-text\", component: \"Text\", text: \"Twelve open deals.\", role: \"body\" },\n ],\n },\n view: views.SectionCardView,\n }),\n\n Divider: entry<views.DividerProps>({\n name: \"Divider\",\n group: \"layout\",\n summary: \"A hairline rule between sections.\",\n props: z.object({ orientation: z.enum([\"horizontal\", \"vertical\"]).optional() }),\n events: [],\n children: \"none\",\n example: { components: [{ id: \"divider\", component: \"Divider\" }] },\n view: views.DividerView,\n }),\n\n Spacer: entry<views.SpacerProps>({\n name: \"Spacer\",\n group: \"layout\",\n summary: \"Blank vertical space where a gap is not enough.\",\n props: z.object({ size: gap.optional().describe(\"Height step; default 4.\") }),\n events: [],\n children: \"none\",\n example: { components: [{ id: \"spacer\", component: \"Spacer\", size: 4 }] },\n view: views.SpacerView,\n }),\n};\n\nconst text = {\n Text: entry<views.TextProps>({\n name: \"Text\",\n group: \"text\",\n summary: \"A run of plain text at one of the type-scale roles.\",\n props: z.object({\n text: z.string().describe(\"The text to show.\"),\n role: z\n .enum([\"heading\", \"subheading\", \"body\", \"caption\", \"eyebrow\"])\n .optional()\n .describe(\"Type-scale role; default body.\"),\n tone: z\n .enum([\"default\", \"muted\", \"success\", \"warning\", \"danger\", \"info\"])\n .optional()\n .describe(\"Semantic colour; default foreground.\"),\n align: z.enum([\"start\", \"center\", \"end\"]).optional(),\n mono: z.boolean().optional().describe(\"Render in the mono face, for ids and numbers.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"heading\", component: \"Text\", text: \"Quarterly review\", role: \"heading\" },\n ],\n },\n view: views.TextView,\n }),\n\n Markdown: entry<views.MarkdownViewProps>({\n name: \"Markdown\",\n group: \"text\",\n summary: \"Rich text as markdown; sanitised, with GFM tables and code blocks.\",\n props: z.object({\n text: z.string().describe(\"Markdown source.\"),\n compact: z.boolean().optional().describe(\"Tighter rhythm, for chat bubbles.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"md\",\n component: \"Markdown\",\n text: \"**Summary**\\n\\n- Revenue up 12%\\n- Churn flat\\n\",\n compact: true,\n },\n ],\n },\n view: views.MarkdownView,\n }),\n};\n\nconst input = {\n TextField: entry<views.TextFieldProps>({\n name: \"TextField\",\n group: \"input\",\n summary: \"A single-line text input.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional().describe(\"Current value; bind it to the data model.\"),\n placeholder: z.string().optional(),\n type: z\n .enum([\"text\", \"email\", \"url\", \"tel\", \"number\", \"password\", \"search\"])\n .optional()\n .describe(\"Input type; default text.\"),\n required: z.boolean().optional(),\n onChange: Action.optional().describe(\"Raised after the user stops typing.\"),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { name: \"\" } },\n components: [\n {\n id: \"name\",\n component: \"TextField\",\n label: \"Full name\",\n value: { path: \"/form/name\" },\n placeholder: \"Ada Lovelace\",\n onChange: { event: { name: \"nameChanged\" } },\n },\n ],\n },\n view: views.TextFieldView,\n }),\n\n TextArea: entry<views.TextAreaProps>({\n name: \"TextArea\",\n group: \"input\",\n summary: \"A multi-line text input.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional(),\n placeholder: z.string().optional(),\n rows: z.number().int().min(2).max(20).optional().describe(\"Visible rows; default 4.\"),\n autoGrow: z.boolean().optional().describe(\"Grow with the content.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { notes: \"\" } },\n components: [\n {\n id: \"notes\",\n component: \"TextArea\",\n label: \"Notes\",\n value: { path: \"/form/notes\" },\n rows: 3,\n onChange: { event: { name: \"notesChanged\" } },\n },\n ],\n },\n view: views.TextAreaView,\n }),\n\n Select: entry<views.SelectViewProps>({\n name: \"Select\",\n group: \"input\",\n summary: \"A dropdown offering one of a fixed list of options.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(Option).min(1).describe(\"The options to choose from.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { region: \"ap-south-1\" } },\n components: [\n {\n id: \"region\",\n component: \"Select\",\n label: \"Region\",\n value: { path: \"/form/region\" },\n options: [\n { value: \"ap-south-1\", label: \"Mumbai\" },\n { value: \"eu-west-1\", label: \"Ireland\" },\n ],\n onChange: { event: { name: \"regionChanged\" } },\n },\n ],\n },\n view: views.SelectView,\n }),\n\n Checkbox: entry<views.CheckboxViewProps>({\n name: \"Checkbox\",\n group: \"input\",\n summary: \"A single on/off box with a label.\",\n props: z.object({\n label: z.string().optional().describe(\"Text beside the box.\"),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n checked: z.boolean().optional(),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { terms: false } },\n components: [\n {\n id: \"terms\",\n component: \"Checkbox\",\n label: \"I accept the terms\",\n checked: { path: \"/form/terms\" },\n onChange: { event: { name: \"termsChanged\" } },\n },\n ],\n },\n view: views.CheckboxView,\n }),\n\n Switch: entry<views.SwitchViewProps>({\n name: \"Switch\",\n group: \"input\",\n summary: \"A toggle for a setting that takes effect immediately.\",\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n checked: z.boolean().optional(),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { alerts: true } },\n components: [\n {\n id: \"alerts\",\n component: \"Switch\",\n label: \"Email alerts\",\n checked: { path: \"/form/alerts\" },\n onChange: { event: { name: \"alertsChanged\" } },\n },\n ],\n },\n view: views.SwitchView,\n }),\n\n RadioGroup: entry<views.RadioGroupViewProps>({\n name: \"RadioGroup\",\n group: \"input\",\n summary: \"One choice from a short visible list.\",\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n value: z.string().optional(),\n options: z.array(Option).min(2).describe(\"Two or more choices.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { plan: \"pro\" } },\n components: [\n {\n id: \"plan\",\n component: \"RadioGroup\",\n label: \"Plan\",\n value: { path: \"/form/plan\" },\n options: [\n { value: \"free\", label: \"Free\" },\n { value: \"pro\", label: \"Pro\" },\n ],\n onChange: { event: { name: \"planChanged\" } },\n },\n ],\n },\n view: views.RadioGroupView,\n }),\n\n DateField: entry<views.DateFieldViewProps>({\n name: \"DateField\",\n group: \"input\",\n summary: \"A date, typed or picked from a calendar. ISO yyyy-mm-dd on the wire.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional().describe(\"ISO date, yyyy-mm-dd.\"),\n min: z.string().optional().describe(\"Earliest selectable ISO date.\"),\n max: z.string().optional().describe(\"Latest selectable ISO date.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { start: \"2026-09-01\" } },\n components: [\n {\n id: \"start\",\n component: \"DateField\",\n label: \"Start date\",\n value: { path: \"/form/start\" },\n onChange: { event: { name: \"startChanged\" } },\n },\n ],\n },\n view: views.DateFieldView,\n }),\n\n Button: entry<views.ButtonViewProps>({\n name: \"Button\",\n group: \"input\",\n summary: \"A button. Set submit to report the whole data model with the action.\",\n props: z.object({\n label: z.string().describe(\"Button text.\"),\n variant: buttonVariant.optional().describe(\"Visual weight; default primary.\"),\n size: buttonSize.optional(),\n disabled: z.boolean().optional(),\n submit: z\n .boolean()\n .optional()\n .describe(\"Send the surface data model as the action payload; use for form submits.\"),\n onPress: Action.optional().describe(\"Raised when the user presses the button.\"),\n }),\n events: [\"press\", \"submit\"],\n children: \"none\",\n example: {\n components: [\n {\n id: \"save\",\n component: \"Button\",\n label: \"Save\",\n variant: \"primary\",\n submit: true,\n onPress: { event: { name: \"saveProfile\" } },\n },\n ],\n },\n view: views.ButtonView,\n }),\n\n ButtonLink: entry<views.ButtonLinkViewProps>({\n name: \"ButtonLink\",\n group: \"input\",\n summary: \"A link that looks like a button. Navigates; raises no action.\",\n props: z.object({\n label: z.string(),\n href: httpUrl,\n variant: buttonVariant.optional().describe(\"Visual weight; default secondary.\"),\n size: buttonSize.optional(),\n target: z.enum([\"_self\", \"_blank\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"docs\",\n component: \"ButtonLink\",\n label: \"Open runbook\",\n href: \"https://example.com/runbook\",\n target: \"_blank\",\n },\n ],\n },\n view: views.ButtonLinkView,\n }),\n};\n\nconst feedback = {\n Badge: entry<views.BadgeViewProps>({\n name: \"Badge\",\n group: \"feedback\",\n summary: \"A small status label.\",\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"default\", \"success\", \"warning\", \"danger\", \"info\", \"neutral\", \"outline\"])\n .optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [{ id: \"badge\", component: \"Badge\", label: \"Active\", variant: \"success\" }],\n },\n view: views.BadgeView,\n }),\n\n Alert: entry<views.AlertViewProps>({\n name: \"Alert\",\n group: \"feedback\",\n summary: \"A callout carrying a short message the user should notice.\",\n props: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n variant: z.enum([\"default\", \"success\", \"warn\", \"danger\", \"info\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"alert\",\n component: \"Alert\",\n variant: \"warn\",\n title: \"Quota at 90%\",\n description: \"Upgrade before the end of the month.\",\n },\n ],\n },\n view: views.AlertView,\n }),\n\n Progress: entry<views.ProgressViewProps>({\n name: \"Progress\",\n group: \"feedback\",\n summary: \"A determinate or indeterminate progress bar.\",\n props: z.object({\n value: z.number().nullable().optional().describe(\"Null renders the indeterminate bar.\"),\n max: z.number().optional().describe(\"Maximum; default 100.\"),\n label: z.string().optional(),\n showValue: z.boolean().optional().describe(\"Set false to hide the numeric readout.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"progress\", component: \"Progress\", label: \"Indexing\", value: 64 },\n ],\n },\n view: views.ProgressViewComponent,\n }),\n\n StatusDot: entry<views.StatusDotViewProps>({\n name: \"StatusDot\",\n group: \"feedback\",\n summary: \"A coloured dot with a caption, for live status.\",\n props: z.object({\n label: z.string().optional(),\n tone: z.enum([\"accent\", \"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).optional(),\n live: z.boolean().optional().describe(\"Add a pulsing halo for an active state.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"status\", component: \"StatusDot\", label: \"Running\", tone: \"success\", live: true },\n ],\n },\n view: views.StatusDotView,\n }),\n\n EmptyState: entry<views.EmptyStateViewProps>({\n name: \"EmptyState\",\n group: \"feedback\",\n summary: \"The 'nothing here' surface; children become its actions.\",\n props: z.object({\n title: z.string(),\n description: z.string().optional(),\n size: z.enum([\"default\", \"compact\"]).optional(),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n {\n id: \"empty\",\n component: \"EmptyState\",\n title: \"No results\",\n description: \"Try a wider date range.\",\n children: [\"empty-action\"],\n },\n {\n id: \"empty-action\",\n component: \"Button\",\n label: \"Reset filters\",\n variant: \"secondary\",\n onPress: { event: { name: \"resetFilters\" } },\n },\n ],\n },\n view: views.EmptyStateView,\n }),\n};\n\nconst data = {\n DataTable: entry<views.DataTableViewProps>({\n name: \"DataTable\",\n group: \"data\",\n summary:\n \"A sortable, searchable table. Pass rows inline, or a server sourceId obtained from a tool.\",\n props: z.object({\n columns: z\n .array(\n z.object({\n id: z.string().describe(\"Row property this column reads.\"),\n label: z.string().optional().describe(\"Header text; defaults to the id.\"),\n align: z.enum([\"start\", \"center\", \"end\"]).optional(),\n filter: z\n .enum([\"faceted\", \"text\"])\n .optional()\n .describe(\"Add a toolbar filter for this column.\"),\n width: z.number().optional(),\n }),\n )\n .min(1),\n dataSource: tableSource,\n pageSize: z.number().int().min(1).max(200).optional().describe(\"Rows per page; default 10.\"),\n density: z.enum([\"default\", \"compact\"]).optional(),\n searchPlaceholder: z.string().optional(),\n emptyMessage: z.string().optional(),\n maxHeight: z.number().optional().describe(\"Scrolling body height in px.\"),\n onRowClick: Action.optional().describe(\"Raised with the clicked row.\"),\n }),\n events: [\"rowClick\"],\n children: \"none\",\n example: {\n components: [\n {\n id: \"table\",\n component: \"DataTable\",\n columns: [\n { id: \"name\", label: \"Name\" },\n { id: \"status\", label: \"Status\", filter: \"faceted\" },\n { id: \"deals\", label: \"Deals\", align: \"end\" },\n ],\n dataSource: {\n kind: \"client\",\n rows: [\n { name: \"Ada Lovelace\", status: \"active\", deals: 12 },\n { name: \"Grace Hopper\", status: \"invited\", deals: 4 },\n ],\n },\n onRowClick: { event: { name: \"openContact\" } },\n },\n ],\n },\n view: views.DataTableView,\n }),\n\n Chart: entry<views.ChartViewProps>({\n name: \"Chart\",\n group: \"data\",\n summary:\n \"Any chart the package draws: bar, line, area, pie, donut, scatter, radar, funnel, heatmap, calendar, treemap, sunburst.\",\n props: z.object({\n type: chartType,\n data: z\n .unknown()\n .describe(\n \"Rows [{category, series…}] for bar/radar; series [{id, data:[{x,y}]}] for line/area/scatter/heatmap; slices [{id,value}] for pie/donut/funnel; days [{day,value}] for calendar; a tree {id, children} for treemap/sunburst.\",\n ),\n title: z.string().optional().describe(\"Caption above the chart.\"),\n height: z.number().int().min(120).max(800).optional().describe(\"Drawing height in px.\"),\n stacked: z.boolean().optional(),\n legend: z.boolean().optional(),\n grid: z.boolean().optional(),\n scale: z.enum([\"sequential\", \"diverging\"]).optional().describe(\"Heatmap and calendar scale.\"),\n indexBy: z.string().optional().describe(\"Category key for row data.\"),\n keys: z.array(z.string()).optional().describe(\"Series keys for row data.\"),\n from: z.string().optional().describe(\"Calendar range start, ISO date.\"),\n to: z.string().optional().describe(\"Calendar range end, ISO date.\"),\n emptyMessage: z.string().optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"chart\",\n component: \"Chart\",\n type: \"bar\",\n title: \"Revenue by month\",\n data: [\n { month: \"Jan\", revenue: 42, cost: 18 },\n { month: \"Feb\", revenue: 51, cost: 22 },\n ],\n },\n ],\n },\n view: views.ChartView,\n }),\n};\n\nconst other = {\n Tabs: entry<views.TabsViewProps>({\n name: \"Tabs\",\n group: \"layout\",\n summary: \"Tabbed panels; the nth child is the nth tab's panel.\",\n props: z.object({\n tabs: z\n .array(z.object({ value: z.string(), label: z.string() }))\n .min(2)\n .describe(\"Tab bar, in order.\"),\n value: z.string().optional().describe(\"Selected tab; defaults to the first.\"),\n onChange: Action.optional(),\n }),\n events: [\"tabChange\"],\n children: \"many\",\n example: {\n components: [\n {\n id: \"tabs\",\n component: \"Tabs\",\n tabs: [\n { value: \"summary\", label: \"Summary\" },\n { value: \"detail\", label: \"Detail\" },\n ],\n children: [\"tab-summary\", \"tab-detail\"],\n onChange: { event: { name: \"tabChanged\" } },\n },\n { id: \"tab-summary\", component: \"Text\", text: \"Two open incidents.\", role: \"body\" },\n { id: \"tab-detail\", component: \"Text\", text: \"INC-42, INC-51.\", role: \"body\" },\n ],\n },\n view: views.TabsView,\n }),\n\n Image: entry<views.ImageViewProps>({\n name: \"Image\",\n group: \"text\",\n summary: \"An image. Alt text is required.\",\n props: z.object({\n src: imageUrl,\n alt: z.string().describe(\"Alternative text; required.\"),\n width: z.number().optional(),\n height: z.number().optional(),\n rounded: z.boolean().optional().describe(\"Set false for square corners.\"),\n fit: z.enum([\"cover\", \"contain\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"image\",\n component: \"Image\",\n src: \"https://example.com/chart.png\",\n alt: \"Revenue by month\",\n height: 160,\n },\n ],\n },\n view: views.ImageView,\n }),\n\n Link: entry<views.LinkViewProps>({\n name: \"Link\",\n group: \"text\",\n summary: \"An inline text link.\",\n props: z.object({\n label: z.string(),\n href: httpUrl,\n target: z.enum([\"_self\", \"_blank\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"link\",\n component: \"Link\",\n label: \"View the incident\",\n href: \"https://example.com/inc-42\",\n target: \"_blank\",\n },\n ],\n },\n view: views.LinkView,\n }),\n};\n\n/**\n * The catalogue an agent draws from, and the renderer's default.\n *\n * A host may narrow it (hand the renderer a subset) but should not widen it\n * with components the prompt does not describe: an agent can only usefully\n * emit what `catalogue-doc.ts` told it about.\n */\nexport const defaultCatalogue: A2UICatalogue = Object.freeze({\n ...layout,\n ...text,\n ...input,\n ...feedback,\n ...data,\n ...other,\n});\n\n/** Catalogue id an agent may echo in `createSurface.catalogId`. */\nexport const A2UI_CATALOGUE_ID = \"https://cortena.ai/a2ui/catalogues/cortena-ui/v1.json\";\n\n/** Every component name in the catalogue, sorted. */\nexport function catalogueNames(catalogue: A2UICatalogue = defaultCatalogue): string[] {\n return Object.keys(catalogue).sort();\n}\n","/**\n * A2UI message layer.\n *\n * The wire format cortena-ui accepts, and the fold from a stream of messages\n * onto a set of surfaces. Deliberately free of React so it can be reused by a\n * canvas host, a test fixture, or the catalogue doc generator.\n *\n * ## Two dialects, one fold\n *\n * **v0.9** is the current A2UI protocol (`createSurface`, `updateComponents`,\n * `updateDataModel`, `deleteSurface`) and is what an agent should emit.\n *\n * **v0.8** is what Cortena already speaks: core bundles Google's A2UI Lit\n * renderer at `src/canvas-host/a2ui/` and its `A2uiMessageProcessor` handles\n * `beginRendering`, `surfaceUpdate`, `dataModelUpdate` and `deleteSurface`.\n * The `canvas` agent tool pushes exactly those, as JSON lines, through\n * `canvas.a2ui.pushJSONL`. Accepting both means one renderer serves the chat,\n * the web canvas panel and every payload already written against the native\n * nodes.\n *\n * ## Transport\n *\n * Per `05-agent-ui.md`, an A2UI block travels as an AG-UI `CUSTOM` event. The\n * event value is a message, an array of messages, or the JSONL text the canvas\n * tool sends; {@link parseA2UIMessages} takes all three.\n */\n\n/** Surface id used when a message omits one, matching core's Lit processor. */\nexport const A2UI_DEFAULT_SURFACE_ID = \"@default\";\n\n/** Protocol version this package speaks. */\nexport const A2UI_VERSION = \"v0.9\";\n\n/** A reference to a value in the surface's data model, as a JSON pointer. */\nexport interface A2UIDataBinding {\n path: string;\n}\n\n/**\n * A property value as an agent writes it: a literal, a data binding, or one of\n * the v0.8 literal wrappers the Lit renderer accepts.\n */\nexport type A2UIPropertyValue =\n | string\n | number\n | boolean\n | null\n | A2UIDataBinding\n | { literal: unknown }\n | { literalString: string }\n | readonly A2UIPropertyValue[]\n | { readonly [key: string]: unknown };\n\n/**\n * A component's children. v0.9 uses a plain id array or a `{ componentId, path }`\n * template; v0.8 wraps the same two in `explicitList` / `template`.\n */\nexport type A2UIChildList =\n | readonly string[]\n | { componentId: string; path: string }\n | { explicitList: readonly string[] }\n | { template: { componentId: string; dataBinding: string } };\n\n/** An action an agent attaches to an interactive property. */\nexport type A2UIActionSpec =\n | string\n | { event: { name: string; context?: Record<string, unknown> } }\n | { name: string; context?: Record<string, unknown> };\n\n/**\n * One component in a surface.\n *\n * v0.9 is flat — `{ id, component: \"Text\", text: \"hi\" }` — and v0.8 wraps the\n * properties under the type name — `{ id, component: { Text: { text: \"hi\" } } }`.\n */\nexport interface A2UIComponentSpec {\n id: string;\n component: string | Record<string, Record<string, unknown>>;\n children?: A2UIChildList;\n /** v0.8 flex weight; carried through but not used for layout here. */\n weight?: number | string;\n [property: string]: unknown;\n}\n\nexport interface A2UICreateSurface {\n surfaceId?: string;\n catalogId?: string;\n /** Not in the v0.9 schema; accepted so a single message can seed a surface. */\n root?: string;\n sendDataModel?: boolean;\n}\n\nexport interface A2UIUpdateComponents {\n surfaceId?: string;\n components: A2UIComponentSpec[];\n root?: string;\n}\n\nexport interface A2UIUpdateDataModel {\n surfaceId?: string;\n path?: string;\n value?: unknown;\n /** v0.8 spelling of `value`. */\n contents?: unknown;\n}\n\nexport interface A2UIBeginRendering {\n surfaceId?: string;\n root?: string;\n styles?: Record<string, unknown>;\n}\n\nexport interface A2UIDeleteSurface {\n surfaceId?: string;\n}\n\n/** One message on the wire. Exactly one operation key is read per message. */\nexport interface A2UIMessage {\n version?: string;\n createSurface?: A2UICreateSurface;\n updateComponents?: A2UIUpdateComponents;\n updateDataModel?: A2UIUpdateDataModel;\n deleteSurface?: A2UIDeleteSurface;\n /** v0.8 */\n beginRendering?: A2UIBeginRendering;\n /** v0.8 */\n surfaceUpdate?: A2UIUpdateComponents;\n /** v0.8 */\n dataModelUpdate?: A2UIUpdateDataModel;\n}\n\n/**\n * Everything the renderer's `message` prop takes: one message, a list of them\n * (the AG-UI `CUSTOM` payload), or JSONL / a JSON array as text (the canvas\n * tool's `a2ui_push`).\n */\nexport type A2UIMessageInput = A2UIMessage | readonly A2UIMessage[] | string | null | undefined;\n\n/** A folded surface: what the renderer draws. */\nexport interface A2UISurface {\n id: string;\n /** Id of the root component; `undefined` until a message names one. */\n root: string | undefined;\n components: ReadonlyMap<string, A2UIComponentSpec>;\n dataModel: Record<string, unknown>;\n styles: Record<string, unknown>;\n}\n\nexport interface A2UIFoldResult {\n surfaces: A2UISurface[];\n /** One line per malformed message; the renderer shows these in an error card. */\n errors: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True when a value is a `{ path }` data binding rather than a literal object. */\nexport function isDataBinding(value: unknown): value is A2UIDataBinding {\n return isRecord(value) && typeof value.path === \"string\" && Object.keys(value).length === 1;\n}\n\n/**\n * Parse whatever arrived into a message list.\n *\n * A string is tried as JSON first (an array or a single message) and then as\n * JSONL, which is the form `canvas.a2ui.pushJSONL` sends. A line that does not\n * parse is reported rather than dropped: silently rendering three of four\n * pushed messages is the failure mode this returns errors for.\n */\nexport function parseA2UIMessages(input: A2UIMessageInput): {\n messages: A2UIMessage[];\n errors: string[];\n} {\n if (input === null || input === undefined) {\n return { messages: [], errors: [] };\n }\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n if (!trimmed) {\n return { messages: [], errors: [] };\n }\n if (trimmed.startsWith(\"[\")) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return collect(parsed);\n }\n return { messages: [], errors: [\"Expected an array of A2UI messages.\"] };\n } catch (error) {\n return { messages: [], errors: [`Malformed JSON: ${errorText(error)}`] };\n }\n }\n const messages: A2UIMessage[] = [];\n const errors: string[] = [];\n const lines = trimmed.split(\"\\n\");\n for (let index = 0; index < lines.length; index += 1) {\n const line = (lines[index] ?? \"\").trim();\n if (!line) {\n continue;\n }\n try {\n const parsed: unknown = JSON.parse(line);\n const one = collect([parsed]);\n messages.push(...one.messages);\n errors.push(...one.errors.map((text) => `Line ${index + 1}: ${text}`));\n } catch (error) {\n errors.push(`Line ${index + 1}: malformed JSON (${errorText(error)}).`);\n }\n }\n return { messages, errors };\n }\n return collect(Array.isArray(input) ? input : [input]);\n}\n\nfunction collect(values: readonly unknown[]): { messages: A2UIMessage[]; errors: string[] } {\n const messages: A2UIMessage[] = [];\n const errors: string[] = [];\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (!isRecord(value)) {\n errors.push(`Message ${index + 1} is not an object.`);\n continue;\n }\n messages.push(value as A2UIMessage);\n }\n return { messages, errors };\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface MutableSurface {\n id: string;\n root: string | undefined;\n components: Map<string, A2UIComponentSpec>;\n dataModel: Record<string, unknown>;\n styles: Record<string, unknown>;\n}\n\n/**\n * Fold a message stream onto surfaces.\n *\n * Updates accumulate: a later `updateComponents` replaces the components it\n * names and leaves the rest, and a later `updateDataModel` writes at its path\n * only. That is what makes the JSONL push form work — the agent sends the\n * shell, then the rows, then a correction, and each one folds onto the same\n * surface.\n */\nexport function foldMessages(input: A2UIMessageInput): A2UIFoldResult {\n const { messages, errors } = parseA2UIMessages(input);\n const surfaces = new Map<string, MutableSurface>();\n const order: string[] = [];\n\n const surfaceFor = (id: string | undefined): MutableSurface => {\n const key = id && id.trim() ? id : A2UI_DEFAULT_SURFACE_ID;\n let surface = surfaces.get(key);\n if (!surface) {\n surface = { id: key, root: undefined, components: new Map(), dataModel: {}, styles: {} };\n surfaces.set(key, surface);\n order.push(key);\n }\n return surface;\n };\n\n const applyComponents = (payload: A2UIUpdateComponents | undefined, index: number): void => {\n if (!payload) {\n return;\n }\n const surface = surfaceFor(payload.surfaceId);\n if (!Array.isArray(payload.components)) {\n errors.push(`Message ${index + 1}: components must be an array.`);\n return;\n }\n for (const spec of payload.components) {\n if (!isRecord(spec) || typeof spec.id !== \"string\" || !spec.id) {\n errors.push(`Message ${index + 1}: a component is missing a string id.`);\n continue;\n }\n surface.components.set(spec.id, spec as A2UIComponentSpec);\n }\n if (typeof payload.root === \"string\" && payload.root) {\n surface.root = payload.root;\n }\n };\n\n const applyData = (payload: A2UIUpdateDataModel | undefined): void => {\n if (!payload) {\n return;\n }\n const surface = surfaceFor(payload.surfaceId);\n const value = payload.value !== undefined ? payload.value : payload.contents;\n const path = payload.path && payload.path.trim() ? payload.path : \"/\";\n surface.dataModel = setAtPointer(surface.dataModel, path, value);\n };\n\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) {\n continue;\n }\n if (message.createSurface) {\n const surface = surfaceFor(message.createSurface.surfaceId);\n if (typeof message.createSurface.root === \"string\" && message.createSurface.root) {\n surface.root = message.createSurface.root;\n }\n }\n if (message.beginRendering) {\n const surface = surfaceFor(message.beginRendering.surfaceId);\n if (typeof message.beginRendering.root === \"string\" && message.beginRendering.root) {\n surface.root = message.beginRendering.root;\n }\n if (isRecord(message.beginRendering.styles)) {\n surface.styles = { ...surface.styles, ...message.beginRendering.styles };\n }\n }\n applyComponents(message.updateComponents, index);\n applyComponents(message.surfaceUpdate, index);\n applyData(message.updateDataModel);\n applyData(message.dataModelUpdate);\n if (message.deleteSurface) {\n const key = message.deleteSurface.surfaceId ?? A2UI_DEFAULT_SURFACE_ID;\n surfaces.delete(key);\n const at = order.indexOf(key);\n if (at !== -1) {\n order.splice(at, 1);\n }\n }\n const known =\n message.createSurface ??\n message.updateComponents ??\n message.updateDataModel ??\n message.deleteSurface ??\n message.beginRendering ??\n message.surfaceUpdate ??\n message.dataModelUpdate;\n if (!known) {\n errors.push(\n `Message ${index + 1}: no known operation (createSurface, updateComponents, updateDataModel, deleteSurface, beginRendering, surfaceUpdate, dataModelUpdate).`,\n );\n }\n }\n\n const result: A2UISurface[] = [];\n for (const key of order) {\n const surface = surfaces.get(key);\n if (!surface) {\n continue;\n }\n result.push({\n id: surface.id,\n root: surface.root ?? defaultRoot(surface.components),\n components: surface.components,\n dataModel: surface.dataModel,\n styles: surface.styles,\n });\n }\n return { surfaces: result, errors };\n}\n\n/** No explicit root: prefer the conventional `root` id, else the first component. */\nfunction defaultRoot(components: ReadonlyMap<string, A2UIComponentSpec>): string | undefined {\n if (components.has(\"root\")) {\n return \"root\";\n }\n for (const id of components.keys()) {\n return id;\n }\n return undefined;\n}\n\n/** Split a JSON pointer into its unescaped segments. */\nexport function pointerSegments(pointer: string): string[] {\n const trimmed = pointer.trim();\n if (!trimmed || trimmed === \"/\" || trimmed === \".\") {\n return [];\n }\n const body = trimmed.startsWith(\"/\") ? trimmed.slice(1) : trimmed;\n return body\n .split(\"/\")\n .filter((segment) => segment !== \"\")\n .map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n}\n\n/** Resolve a possibly relative pointer against a data context. */\nexport function resolvePointer(path: string, contextPath: string): string {\n if (path.startsWith(\"/\")) {\n return path;\n }\n const relative = path === \".\" || path === \"\" ? \"\" : path.replace(/^\\.?\\//, \"\");\n const base = contextPath === \"/\" || !contextPath ? \"\" : contextPath.replace(/\\/$/, \"\");\n if (!relative) {\n return base || \"/\";\n }\n return `${base}/${relative}`;\n}\n\n/** Read a JSON pointer out of the data model. */\nexport function getAtPointer(model: unknown, pointer: string): unknown {\n let current: unknown = model;\n for (const segment of pointerSegments(pointer)) {\n if (Array.isArray(current)) {\n const index = Number(segment);\n current = Number.isInteger(index) ? current[index] : undefined;\n } else if (isRecord(current)) {\n current = current[segment];\n } else {\n return undefined;\n }\n if (current === undefined) {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Write a JSON pointer into the data model, returning a new model.\n *\n * Immutable because the renderer keeps the model in React state: a mutation in\n * place would not re-render, which is the kind of silent nothing-happens bug\n * that is hard to see in a browser test.\n */\nexport function setAtPointer(\n model: Record<string, unknown>,\n pointer: string,\n value: unknown,\n): Record<string, unknown> {\n const segments = pointerSegments(pointer);\n if (segments.length === 0) {\n return isRecord(value) ? { ...value } : {};\n }\n const clone: Record<string, unknown> = { ...model };\n let cursor: Record<string, unknown> | unknown[] = clone;\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index] ?? \"\";\n const nextSegment = segments[index + 1] ?? \"\";\n const wantsArray = /^\\d+$/.test(nextSegment);\n const existing: unknown = Array.isArray(cursor)\n ? cursor[Number(segment)]\n : (cursor as Record<string, unknown>)[segment];\n let next: Record<string, unknown> | unknown[];\n if (Array.isArray(existing)) {\n next = [...existing];\n } else if (isRecord(existing)) {\n next = { ...existing };\n } else {\n next = wantsArray ? [] : {};\n }\n if (Array.isArray(cursor)) {\n cursor[Number(segment)] = next;\n } else {\n (cursor as Record<string, unknown>)[segment] = next;\n }\n cursor = next;\n }\n const last = segments[segments.length - 1] ?? \"\";\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n (cursor as Record<string, unknown>)[last] = value;\n }\n return clone;\n}\n\n/** Normalise the children of a component spec into a single description. */\nexport type A2UIChildren =\n | { kind: \"list\"; ids: readonly string[] }\n | { kind: \"template\"; componentId: string; path: string }\n | { kind: \"none\" };\n\nexport function readChildren(spec: A2UIComponentSpec, properties: Record<string, unknown>): A2UIChildren {\n const raw = (spec.children ?? properties.children) as A2UIChildList | undefined;\n if (!raw) {\n return { kind: \"none\" };\n }\n if (Array.isArray(raw)) {\n return { kind: \"list\", ids: raw.filter((id): id is string => typeof id === \"string\") };\n }\n if (isRecord(raw)) {\n const record: Record<string, unknown> = raw;\n const explicitList = record.explicitList;\n if (Array.isArray(explicitList)) {\n return {\n kind: \"list\",\n ids: explicitList.filter((id): id is string => typeof id === \"string\"),\n };\n }\n const template = record.template;\n if (isRecord(template)) {\n const { componentId, dataBinding } = template;\n if (typeof componentId === \"string\" && typeof dataBinding === \"string\") {\n return { kind: \"template\", componentId, path: dataBinding };\n }\n }\n if (typeof record.componentId === \"string\" && typeof record.path === \"string\") {\n return { kind: \"template\", componentId: record.componentId, path: record.path };\n }\n }\n return { kind: \"none\" };\n}\n\n/**\n * Split a component spec into its type name and its raw (unresolved) properties,\n * across both dialects. Returns `undefined` when the spec names no type.\n */\nexport function readComponent(\n spec: A2UIComponentSpec,\n): { name: string; properties: Record<string, unknown> } | undefined {\n if (typeof spec.component === \"string\") {\n const { id: _id, component: _component, children: _children, weight: _weight, ...rest } = spec;\n return { name: spec.component, properties: rest };\n }\n if (isRecord(spec.component)) {\n const name = Object.keys(spec.component)[0];\n if (!name) {\n return undefined;\n }\n const properties = (spec.component as Record<string, unknown>)[name];\n return { name, properties: isRecord(properties) ? properties : {} };\n }\n return undefined;\n}\n\n/**\n * Resolve one property value against the data model.\n *\n * `{ path }` reads the model, `{ literal }` / `{ literalString }` unwrap, and\n * everything else is returned as written, recursing through arrays and objects\n * so a binding nested inside a prop object still resolves.\n */\nexport function resolveValue(\n value: unknown,\n model: Record<string, unknown>,\n contextPath: string,\n): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => resolveValue(item, model, contextPath));\n }\n if (isRecord(value)) {\n if (isDataBinding(value)) {\n return getAtPointer(model, resolvePointer(value.path, contextPath));\n }\n if (\"literalString\" in value && typeof value.literalString === \"string\") {\n return value.literalString;\n }\n if (\"literal\" in value && Object.keys(value).length === 1) {\n return value.literal;\n }\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = resolveValue(item, model, contextPath);\n }\n return out;\n }\n return value;\n}\n\n/** A user action leaving the renderer, shaped like A2UI's client-to-server action. */\nexport interface A2UIAction {\n surfaceId: string;\n componentId: string;\n name: string;\n payload: Record<string, unknown>;\n}\n\n/**\n * Normalise an action property into `{ name, context }`.\n *\n * Accepts v0.9's `{ event: { name, context } }`, the bare `{ name, context }`\n * shape, and a plain string, which is what an agent writes most often.\n */\nexport function readAction(\n value: unknown,\n): { name: string; context: Record<string, unknown> } | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return { name: value, context: {} };\n }\n if (!isRecord(value)) {\n return undefined;\n }\n const event = isRecord(value.event) ? value.event : value;\n const name = event.name;\n if (typeof name !== \"string\" || !name) {\n return undefined;\n }\n return { name, context: isRecord(event.context) ? event.context : {} };\n}\n","/**\n * Catalogue documentation generator.\n *\n * Emits a machine-readable description of the catalogue — every component's\n * name, group, summary, property schema, events and a worked example — plus a\n * markdown rendering of the same thing.\n *\n * This exists so the \"Rich Content\" system-prompt section can be *generated*\n * from the catalogue rather than written beside it (DESIGN-34). A prompt that\n * describes a component the renderer does not have, or omits one it does, is\n * the failure `05-agent-ui.md` calls out; the only way to prevent it is for\n * both to come from one object.\n *\n * `pnpm a2ui:catalogue` writes `dist-a2ui/catalogue.json` and `.md`.\n */\n\nimport { z } from \"zod\";\nimport { A2UI_CATALOGUE_ID, defaultCatalogue, type A2UICatalogue, type A2UIGroup } from \"./catalogue\";\nimport { A2UI_VERSION, type A2UIComponentSpec } from \"./message\";\n\n/** A JSON Schema object, as far as this module cares. */\nexport type JsonSchema = Record<string, unknown>;\n\nexport interface A2UIComponentDoc {\n name: string;\n group: A2UIGroup;\n summary: string;\n /** Whether the component takes a `children` list. */\n children: \"none\" | \"many\";\n /** Event names the component raises through `onAction`. */\n events: string[];\n /** JSON Schema of the resolved properties, derived from the zod schema. */\n props: JsonSchema;\n /** Property names that must be present. */\n required: string[];\n /** A complete, renderable example: the components and any data they bind to. */\n example: { components: A2UIComponentSpec[]; data?: Record<string, unknown> };\n}\n\nexport interface A2UICatalogueDoc {\n catalogueId: string;\n protocol: string;\n generator: string;\n components: A2UIComponentDoc[];\n}\n\n/**\n * zod 4 ships `toJSONSchema`; zod 3 does not.\n *\n * The package's zod peer allows both, so this is checked rather than assumed —\n * emitting `{}` for every component would produce a doc that passes every test\n * and teaches an agent nothing, which is the silent-success failure this whole\n * package's lint exists to avoid.\n */\nfunction toJsonSchema(schema: z.ZodType<unknown>): JsonSchema {\n const converter = (z as unknown as { toJSONSchema?: (s: unknown, o?: unknown) => JsonSchema })\n .toJSONSchema;\n if (typeof converter !== \"function\") {\n throw new Error(\n \"Generating the A2UI catalogue doc needs zod 4 (z.toJSONSchema). The installed zod is 3.x.\",\n );\n }\n return converter(schema, { io: \"input\", unrepresentable: \"any\" });\n}\n\n/** Build the machine-readable catalogue document. */\nexport function buildCatalogueDoc(catalogue: A2UICatalogue = defaultCatalogue): A2UICatalogueDoc {\n const components = Object.values(catalogue)\n .map((entry): A2UIComponentDoc => {\n const schema = toJsonSchema(entry.props as unknown as z.ZodType<unknown>);\n const properties = (schema.properties ?? {}) as JsonSchema;\n const required = Array.isArray(schema.required) ? (schema.required as string[]) : [];\n return {\n name: entry.name,\n group: entry.group,\n summary: entry.summary,\n children: entry.children,\n events: [...entry.events],\n props: properties,\n required,\n example: {\n components: entry.example.components,\n ...(entry.example.data ? { data: entry.example.data } : {}),\n },\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n catalogueId: A2UI_CATALOGUE_ID,\n protocol: A2UI_VERSION,\n generator: \"cortena-ui/a2ui\",\n components,\n };\n}\n\nconst GROUP_ORDER: A2UIGroup[] = [\"layout\", \"text\", \"input\", \"feedback\", \"data\"];\n\nconst GROUP_TITLE: Record<A2UIGroup, string> = {\n layout: \"Layout\",\n text: \"Text and media\",\n input: \"Inputs and actions\",\n feedback: \"Feedback\",\n data: \"Data\",\n};\n\n/** One-line type summary for a JSON Schema property, for the markdown table. */\nfunction describeType(schema: unknown): string {\n if (typeof schema !== \"object\" || schema === null) {\n return \"any\";\n }\n const node = schema as JsonSchema;\n if (Array.isArray(node.enum)) {\n return node.enum.map((value) => JSON.stringify(value)).join(\" \\\\| \");\n }\n if (Array.isArray(node.anyOf) || Array.isArray(node.oneOf)) {\n const options = (node.anyOf ?? node.oneOf) as unknown[];\n return options.map((option) => describeType(option)).join(\" \\\\| \");\n }\n if (node.const !== undefined) {\n return JSON.stringify(node.const);\n }\n if (node.type === \"array\") {\n return `${describeType(node.items)}[]`;\n }\n if (typeof node.type === \"string\") {\n return node.type;\n }\n if (Array.isArray(node.type)) {\n return node.type.join(\" \\\\| \");\n }\n return \"any\";\n}\n\nfunction escapeCell(text: string): string {\n return text.replace(/\\|/g, \"\\\\|\").replace(/\\n+/g, \" \").trim();\n}\n\n/**\n * Render the catalogue document as markdown.\n *\n * The output is written to be pasted into a system prompt: one table per\n * component listing every property with its type, whether it is required and\n * what it means, then a fenced example an agent can copy.\n */\nexport function catalogueMarkdown(doc: A2UICatalogueDoc = buildCatalogueDoc()): string {\n const lines: string[] = [];\n lines.push(\"# A2UI catalogue — cortena-ui\");\n lines.push(\"\");\n lines.push(\n `Protocol \\`${doc.protocol}\\`, catalogue \\`${doc.catalogueId}\\`. Generated from the catalogue definition in \\`cortena-ui\\`; do not edit by hand.`,\n );\n lines.push(\"\");\n lines.push(\n \"A surface is described by three message kinds: `createSurface` names it, `updateComponents` sends the component tree, `updateDataModel` sends the data those components bind to. Any property may be a literal or a `{ \\\"path\\\": \\\"/pointer\\\" }` binding into the data model. A component takes children through `children`, either a list of ids or `{ \\\"componentId\\\": \\\"…\\\", \\\"path\\\": \\\"/items\\\" }` to repeat one component per array item.\",\n );\n lines.push(\"\");\n lines.push(`${doc.components.length} components:`);\n lines.push(\"\");\n\n for (const group of GROUP_ORDER) {\n const inGroup = doc.components.filter((component) => component.group === group);\n if (inGroup.length === 0) {\n continue;\n }\n lines.push(`## ${GROUP_TITLE[group]}`);\n lines.push(\"\");\n for (const component of inGroup) {\n lines.push(`### ${component.name}`);\n lines.push(\"\");\n lines.push(component.summary);\n lines.push(\"\");\n lines.push(\n `Children: ${component.children === \"many\" ? \"yes\" : \"no\"}. Events: ${\n component.events.length > 0 ? component.events.map((e) => `\\`${e}\\``).join(\", \") : \"none\"\n }.`,\n );\n lines.push(\"\");\n const propertyNames = Object.keys(component.props);\n if (propertyNames.length > 0) {\n lines.push(\"| Property | Type | Required | Description |\");\n lines.push(\"| --- | --- | --- | --- |\");\n for (const name of propertyNames) {\n const schema = component.props[name] as JsonSchema | undefined;\n const description =\n typeof schema?.description === \"string\" ? schema.description : \"\";\n lines.push(\n `| \\`${name}\\` | ${escapeCell(describeType(schema))} | ${\n component.required.includes(name) ? \"yes\" : \"no\"\n } | ${escapeCell(description)} |`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"```json\");\n lines.push(JSON.stringify(exampleMessages(component), null, 2));\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Turn an entry's example into the messages an agent would actually send. */\nexport function exampleMessages(component: A2UIComponentDoc): unknown[] {\n const root = component.example.components[0]?.id ?? \"root\";\n const messages: unknown[] = [\n { version: \"v0.9\", createSurface: { surfaceId: \"demo\", root } },\n { version: \"v0.9\", updateComponents: { surfaceId: \"demo\", components: component.example.components } },\n ];\n if (component.example.data) {\n messages.push({\n version: \"v0.9\",\n updateDataModel: { surfaceId: \"demo\", path: \"/\", value: component.example.data },\n });\n }\n return messages;\n}\n","\"use client\";\n\n/**\n * The A2UI React renderer.\n *\n * Takes A2UI messages, folds them onto surfaces, walks the component tree and\n * draws each node through the catalogue. Nothing an agent sends reaches the DOM\n * as markup: a node is a catalogue name plus properties that must pass the\n * entry's zod schema, and anything else becomes an inline error card.\n *\n * ## Why this is written rather than adopted\n *\n * `@a2ui/react` 0.11.0 (Google, Apache-2.0, published 2026-09-01) is a real,\n * maintained v0.9 renderer and it does let a host supply a catalogue. It was\n * evaluated for DESIGN-33 and not adopted, for three reasons:\n *\n * 1. **zod major.** `@a2ui/web_core`'s generic binder reads zod 3 internals —\n * `schema._def.typeName`, `_def.shape()`, `_def.innerType` — to decide how to\n * bind each property. cortena-ui's zod peer is `^3.25 || ^4`, and zod 4 has\n * no `_def.typeName` and exposes `shape` as a property, so a catalogue\n * authored with the consumer's zod 4 fails inside the binder. Adopting would\n * pin the whole package's schema layer to zod 3 while `form.tsx` and\n * `@hookform/resolvers` follow the consumer's.\n * 2. **Dialect.** Cortena already speaks A2UI v0.8: core bundles the Lit\n * renderer at `src/canvas-host/a2ui/` and the `canvas` tool pushes\n * `beginRendering` / `surfaceUpdate` / `dataModelUpdate` as JSONL.\n * `@a2ui/react` splits v0_8 and v0_9 into separate entry points with separate\n * catalogues, so neither one reads both. Every payload written for the\n * native nodes would have to be rewritten before it rendered on the web.\n * 3. **Weight and surface.** It brings `@a2ui/web_core` (3.8 MB unpacked),\n * markdown-it, `@preact/signals-core` and date-fns into a package whose build\n * externalises everything and whose markdown already goes through\n * react-markdown with a sanitize schema. And the API this task needs —\n * `resolveDataSource` for server tables, `onAction` for the AG-UI round trip —\n * has no counterpart there, so it would be wrapped either way.\n *\n * What we keep is the part that matters for interop: the **wire format** is\n * A2UI's, the action we emit is shaped like A2UI's client-to-server `action`\n * (`{ name, surfaceId, sourceComponentId, context }`), and the catalogue is a\n * schema-per-component registry. Swapping the engine later is mechanical.\n */\n\nimport * as React from \"react\";\nimport type { DataSource } from \"@/components/data-table\";\nimport { cn } from \"@/lib/cn\";\nimport {\n A2UI_DEFAULT_SURFACE_ID,\n foldMessages,\n isDataBinding,\n readAction,\n readChildren,\n readComponent,\n resolvePointer,\n resolveValue,\n setAtPointer,\n type A2UIAction,\n type A2UIComponentSpec,\n type A2UIMessageInput,\n type A2UISurface,\n} from \"./message\";\nimport { defaultCatalogue, type A2UICatalogue } from \"./catalogue\";\nimport { A2UIErrorCard, type A2UINodeInfo, type A2UIResolvedAction, type A2UIRow } from \"./views\";\n\nexport interface A2UIRendererProps {\n /**\n * The payload. One message, the list an AG-UI `CUSTOM` event carries, or the\n * JSONL text `canvas.a2ui.pushJSONL` sends. Later messages fold onto earlier\n * ones, so a push stream can be accumulated by the host and handed here whole.\n */\n message: A2UIMessageInput;\n /** The component vocabulary. Defaults to the whole cortena-ui catalogue. */\n catalogue?: A2UICatalogue;\n /** Receives every user event, shaped like A2UI's client-to-server action. */\n onAction?: (action: A2UIAction) => void;\n /**\n * Resolves a `{ kind: \"server\", sourceId }` table handle into a real data\n * source. Without it, a server table renders an error card rather than an\n * empty one, because a silently empty table reads as \"no results\".\n */\n resolveDataSource?: (sourceId: string) => DataSource<A2UIRow> | undefined;\n /** Render only this surface. Default: every surface, in arrival order. */\n surfaceId?: string;\n /** Debounce before a continuous input becomes an action. @default 300 */\n debounceMs?: number;\n className?: string;\n}\n\n/** Depth limit; a tree deeper than this is a malformed payload, not a design. */\nconst MAX_DEPTH = 32;\n\ninterface NodeContext {\n surface: A2UISurface;\n catalogue: A2UICatalogue;\n model: Record<string, unknown>;\n setModel: (updater: (model: Record<string, unknown>) => Record<string, unknown>) => void;\n onAction: ((action: A2UIAction) => void) | undefined;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n}\n\n/**\n * A2UIRenderer — draws A2UI messages through cortena-ui.\n *\n * ```tsx\n * <A2UIRenderer\n * message={customEvent.value}\n * catalogue={defaultCatalogue}\n * onAction={(action) => agent.send(action)}\n * resolveDataSource={(id) => sources[id]}\n * />\n * ```\n */\nexport function A2UIRenderer({\n message,\n catalogue = defaultCatalogue,\n onAction,\n resolveDataSource,\n surfaceId,\n debounceMs = 300,\n className,\n}: A2UIRendererProps) {\n const fold = React.useMemo(() => foldMessages(message), [message]);\n\n // Local data model per surface, seeded from the folded one. Inputs write here\n // so a bound value updates as the user types; a new payload replaces it,\n // because the agent is then the authority on what the surface shows.\n const [models, setModels] = React.useState<Record<string, Record<string, unknown>>>(() =>\n seedModels(fold.surfaces),\n );\n const seenFold = React.useRef(fold);\n if (seenFold.current !== fold) {\n seenFold.current = fold;\n setModels(seedModels(fold.surfaces));\n }\n\n const resolve = React.useCallback(\n (sourceId: string) => resolveDataSource?.(sourceId),\n [resolveDataSource],\n );\n\n const surfaces = surfaceId\n ? fold.surfaces.filter((surface) => surface.id === surfaceId)\n : fold.surfaces;\n\n const missingSurface = Boolean(surfaceId) && surfaces.length === 0 && fold.surfaces.length > 0;\n\n return (\n <div data-slot=\"a2ui-renderer\" className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {fold.errors.length > 0 ? (\n <A2UIErrorCard\n title=\"Malformed A2UI payload\"\n detail={fold.errors.slice(0, 5).join(\" \")}\n />\n ) : null}\n {missingSurface ? (\n <A2UIErrorCard\n title=\"Unknown surface\"\n detail={`No surface \"${surfaceId}\" in this payload.`}\n />\n ) : null}\n {surfaces.map((surface) => (\n <A2UISurfaceView\n key={surface.id}\n surface={surface}\n catalogue={catalogue}\n model={models[surface.id] ?? surface.dataModel}\n setModel={(updater) =>\n setModels((current) => ({\n ...current,\n [surface.id]: updater(current[surface.id] ?? surface.dataModel),\n }))\n }\n onAction={onAction}\n resolveDataSource={resolve}\n debounceMs={debounceMs}\n />\n ))}\n </div>\n );\n}\n\nfunction seedModels(surfaces: readonly A2UISurface[]): Record<string, Record<string, unknown>> {\n const models: Record<string, Record<string, unknown>> = {};\n for (const surface of surfaces) {\n models[surface.id] = surface.dataModel;\n }\n return models;\n}\n\nfunction A2UISurfaceView({\n surface,\n catalogue,\n model,\n setModel,\n onAction,\n resolveDataSource,\n debounceMs,\n}: {\n surface: A2UISurface;\n catalogue: A2UICatalogue;\n model: Record<string, unknown>;\n setModel: (updater: (model: Record<string, unknown>) => Record<string, unknown>) => void;\n onAction: ((action: A2UIAction) => void) | undefined;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n}) {\n const context: NodeContext = {\n surface,\n catalogue,\n model,\n setModel,\n onAction,\n resolveDataSource,\n debounceMs,\n };\n\n if (!surface.root) {\n return (\n <div data-slot=\"a2ui-surface\" data-surface-id={surface.id}>\n <A2UIErrorCard\n title=\"Empty A2UI surface\"\n detail={`Surface \"${surface.id}\" has no root component. Send updateComponents with a component whose id is \"root\", or name one in createSurface.`}\n />\n </div>\n );\n }\n\n return (\n <div data-slot=\"a2ui-surface\" data-surface-id={surface.id} className=\"flex min-w-0 flex-col\">\n <A2UINode context={context} id={surface.root} contextPath=\"/\" ancestors={[]} depth={0} />\n </div>\n );\n}\n\nfunction A2UINode({\n context,\n id,\n contextPath,\n ancestors,\n depth,\n}: {\n context: NodeContext;\n id: string;\n contextPath: string;\n ancestors: readonly string[];\n depth: number;\n}) {\n const spec = context.surface.components.get(id);\n\n if (!spec) {\n return <A2UIErrorCard title=\"Unknown component id\" detail={`No component \"${id}\" in this surface.`} />;\n }\n if (ancestors.includes(id)) {\n return (\n <A2UIErrorCard\n title=\"Circular component reference\"\n detail={`\"${id}\" is already an ancestor of itself: ${[...ancestors, id].join(\" → \")}.`}\n componentId={id}\n />\n );\n }\n if (depth > MAX_DEPTH) {\n return (\n <A2UIErrorCard\n title=\"Component tree too deep\"\n detail={`More than ${MAX_DEPTH} levels below the root.`}\n componentId={id}\n />\n );\n }\n\n const declaration = readComponent(spec);\n if (!declaration) {\n return (\n <A2UIErrorCard\n title=\"Component has no type\"\n detail=\"Expected `component` to be a catalogue name, or an object keyed by one.\"\n componentId={id}\n />\n );\n }\n\n const entry = context.catalogue[declaration.name];\n if (!entry) {\n return (\n <A2UIErrorCard\n title={`Unknown component \"${declaration.name}\"`}\n detail={`The catalogue has: ${Object.keys(context.catalogue).sort().join(\", \")}.`}\n componentId={id}\n />\n );\n }\n\n // Resolve bindings first, then normalise actions, then validate. A view\n // therefore only ever sees values that passed the entry's schema.\n const raw = declaration.properties;\n const bindings: Record<string, string> = {};\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (key === \"children\") {\n continue;\n }\n if (isDataBinding(value)) {\n bindings[key] = resolvePointer(value.path, contextPath);\n }\n const next = resolveValue(value, context.model, contextPath);\n resolved[key] = key.startsWith(\"on\") ? readAction(next) : next;\n }\n\n const parsed = entry.props.safeParse(resolved);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .slice(0, 4)\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n return (\n <A2UIErrorCard\n title={`Invalid props for ${declaration.name}`}\n detail={issues}\n componentId={id}\n />\n );\n }\n\n const node: A2UINodeInfo = {\n surfaceId: context.surface.id,\n componentId: id,\n dataContextPath: contextPath,\n };\n\n const children =\n entry.children === \"many\"\n ? renderChildren(context, spec, raw, contextPath, [...ancestors, id], depth)\n : [];\n\n const emit = (\n action: A2UIResolvedAction | undefined,\n fallbackName: string,\n payload?: Record<string, unknown>,\n ) => {\n context.onAction?.({\n surfaceId: context.surface.id,\n componentId: id,\n name: action?.name ?? fallbackName,\n payload: { ...(action?.context ?? {}), ...(payload ?? {}) },\n });\n };\n\n const writeBack = (property: string, value: unknown) => {\n const pointer = bindings[property];\n if (!pointer) {\n return;\n }\n context.setModel((model) => setAtPointer(model, pointer, value));\n };\n\n const View = entry.view as React.FC<{\n props: unknown;\n node: A2UINodeInfo;\n children: React.ReactNode[];\n dataModel: Record<string, unknown>;\n emit: typeof emit;\n writeBack: typeof writeBack;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n }>;\n\n return (\n <View\n props={parsed.data}\n node={node}\n dataModel={context.model}\n emit={emit}\n writeBack={writeBack}\n resolveDataSource={context.resolveDataSource}\n debounceMs={context.debounceMs}\n >\n {children}\n </View>\n );\n}\n\n/**\n * Render a component's children.\n *\n * An explicit list renders each id once. A template renders the referenced\n * component once per item in a bound array, each with its own data context, so\n * an agent describes a row of a table or a list item once instead of repeating\n * it per item.\n */\nfunction renderChildren(\n context: NodeContext,\n spec: A2UIComponentSpec,\n properties: Record<string, unknown>,\n contextPath: string,\n ancestors: readonly string[],\n depth: number,\n): React.ReactNode[] {\n const children = readChildren(spec, properties);\n if (children.kind === \"none\") {\n return [];\n }\n if (children.kind === \"list\") {\n return children.ids.map((childId) => (\n <A2UINode\n key={childId}\n context={context}\n id={childId}\n contextPath={contextPath}\n ancestors={ancestors}\n depth={depth + 1}\n />\n ));\n }\n const pointer = resolvePointer(children.path, contextPath);\n const items = resolveValue({ path: children.path }, context.model, contextPath);\n if (!Array.isArray(items)) {\n return [\n <A2UIErrorCard\n key=\"template-error\"\n title=\"Template list is not an array\"\n detail={`\"${pointer}\" does not resolve to an array in the data model.`}\n />,\n ];\n }\n return items.map((_item, index) => (\n <A2UINode\n key={`${children.componentId}:${index}`}\n context={context}\n id={children.componentId}\n contextPath={`${pointer === \"/\" ? \"\" : pointer}/${index}`}\n ancestors={ancestors}\n depth={depth + 1}\n />\n ));\n}\n\nexport { A2UI_DEFAULT_SURFACE_ID };\n","\"use client\";\n\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Accordion.\n *\n * Base UI's Accordion is a list of Collapsibles: `Root > Item > Header > Trigger`\n * plus `Panel`. The panel animates on height through Base UI's\n * `--accordion-panel-height`, and marks its first/last frame with\n * `data-starting-style` / `data-ending-style`, which is where it collapses to 0.\n *\n * Radix users: `type=\"single\" | \"multiple\"` is now the boolean `multiple`, and\n * `value` is always an array. `collapsible` is the default. `data-state=\"open\"`\n * is `data-open` on the item and panel, `data-panel-open` on the trigger.\n */\nfunction Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b border-[var(--ds-border)] last:border-b-0\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props) {\n return (\n <AccordionPrimitive.Header data-slot=\"accordion-header\" className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-start justify-between gap-4 py-4 text-left\",\n \"text-[length:var(--ds-text-body-sm)] font-medium text-[color:var(--ds-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] outline-none\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:underline focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&[data-panel-open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n aria-hidden\n className={cn(\n \"pointer-events-none size-4 shrink-0 translate-y-0.5 text-[color:var(--ds-muted-foreground)]\",\n \"transition-transform duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n )}\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({ className, children, ...props }: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n className={cn(\n \"h-[var(--accordion-panel-height,auto)] overflow-hidden\",\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]\",\n \"transition-[height] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[starting-style]:h-0 data-[ending-style]:h-0\",\n )}\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Panel>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","\"use client\";\n\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Avatar.\n *\n * Base UI preloads the image and only mounts `<img>` once it has loaded, so\n * the fallback is what paints while loading and after an error. Initials sit\n * on the primary fill in inverse text.\n *\n * Radix users: `delayMs` on the fallback is now `delay`.\n */\nfunction Avatar({ className, ...props }: AvatarPrimitive.Root.Props) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-[var(--ds-radius-full)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full object-cover\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full select-none items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-primary)] text-[color:var(--ds-primary-foreground)]\",\n \"text-[length:var(--ds-text-caption-lg)] font-semibold tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","\"use client\";\n\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\n\n/**\n * Breadcrumb — the trail above a page title.\n *\n * A `<nav aria-label=\"Breadcrumb\">` around an ordered list, which is what\n * assistive technology expects: the list order is the hierarchy, so a screen\n * reader announces \"list, 4 items\" and reads the path in order. Separators are\n * decorative list items, not text inside the links, so a link's accessible\n * name is the crumb and nothing else.\n *\n * The last crumb is `BreadcrumbPage`, not a link: it is the page you are on,\n * so it carries `aria-current=\"page\"` and is not focusable. Everything before\n * it is a `BreadcrumbLink`.\n *\n * ```tsx\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">Home</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbEllipsis />\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Invoice 4021</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n * ```\n *\n * **Router links.** `BreadcrumbLink` renders an `<a>` by default. Pass\n * `render` with the router's link component and the class name, `href` and\n * handlers are merged onto it, the same contract as `ButtonLink`:\n * `render={<NextLink href=\"/projects\" />}` or\n * `render={<Link to=\"/projects\" />}`. This is deliberately not Base UI's\n * `render` — a breadcrumb is markup, not a Base UI primitive — but it takes\n * the same shape so there is one thing to remember.\n */\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"breadcrumb\"\n aria-label=\"Breadcrumb\"\n className={cn(\"min-w-0\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words p-0 sm:gap-2\",\n \"list-none text-[length:var(--ds-text-caption-lg)]\",\n \"leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nexport interface BreadcrumbLinkProps extends React.ComponentProps<\"a\"> {\n /** Replace the rendered `<a>` with a router link; props are merged onto it. */\n render?: RenderProp;\n}\n\nfunction BreadcrumbLink({ className, render, children, ...props }: BreadcrumbLinkProps) {\n const merged = {\n ...props,\n \"data-slot\": \"breadcrumb-link\",\n className: cn(\n \"truncate rounded-[var(--ds-radius-sm)] text-[color:var(--ds-muted-foreground)] no-underline\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:text-[color:var(--ds-foreground)] hover:underline underline-offset-4\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"[&_svg]:size-3.5 [&_svg]:shrink-0\",\n className,\n ),\n };\n return renderWith(render, merged, children, \"a\");\n}\n\n/**\n * The current page: the last crumb, which is not a link.\n *\n * A plain `<span aria-current=\"page\">`, deliberately not `role=\"link\"` with\n * `aria-disabled` — a disabled link that cannot be focused is a fiction, and\n * it makes `getByRole(\"link\")` return a crumb that navigates nowhere. With a\n * span, the roles in the trail are exactly the crumbs you can travel to.\n */\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n aria-current=\"page\"\n className={cn(\"truncate font-medium text-[color:var(--ds-foreground)]\", className)}\n {...props}\n />\n );\n}\n\n/** Decorative divider between two crumbs; a chevron unless children replace it. */\nfunction BreadcrumbSeparator({ className, children, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex shrink-0 items-center text-[color:var(--ds-text-tertiary)] [&_svg]:size-3.5\",\n className,\n )}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\n/**\n * Stands in for the crumbs a long trail collapses; put it inside a\n * BreadcrumbItem. The glyph is hidden and the label is not: an ellipsis that\n * announces nothing leaves a screen-reader user with a gap in the path.\n */\nfunction BreadcrumbEllipsis({ className, children, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n className={cn(\n \"inline-flex size-5 items-center justify-center text-[color:var(--ds-text-tertiary)]\",\n \"[&_svg]:size-3.5\",\n className,\n )}\n {...props}\n >\n <MoreHorizontal aria-hidden />\n <span className=\"sr-only\">{children ?? \"More levels\"}</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Chip — a pill for filters, tags and selected values. Unlike Badge it keeps\n * sentence case and the body font.\n */\nconst chipVariants = cva(\n [\n \"inline-flex items-center gap-1.5 whitespace-nowrap border font-medium\",\n \"rounded-[var(--ds-radius-full)]\",\n \"transition-[background-color,border-color,color]\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"[&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--ds-hover)] border-[var(--ds-border-subtle)] text-[color:var(--ds-muted-foreground)]\",\n accent: \"bg-[var(--ds-primary-soft)] border-[var(--ds-ring)] text-[color:var(--ds-primary)]\",\n outline:\n \"bg-transparent border-[var(--ds-border)] text-[color:var(--ds-muted-foreground)]\",\n },\n size: {\n default: \"px-2.5 py-1 text-[length:var(--ds-text-caption)] [&_svg]:size-3.5\",\n sm: \"px-2 py-0.5 text-[length:var(--ds-text-caption-sm)] [&_svg]:size-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ChipProps\n extends React.ComponentProps<\"span\">, VariantProps<typeof chipVariants> {}\n\nfunction Chip({ className, variant, size, ...props }: ChipProps) {\n return (\n <span data-slot=\"chip\" className={cn(chipVariants({ variant, size }), className)} {...props} />\n );\n}\n\nexport { Chip, chipVariants };\n","\"use client\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react/combobox\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { inputClassName } from \"@/components/input\";\n\n/**\n * Combobox: a filterable text input with a listbox popup, on Base UI.\n *\n * Give the Root `items` (an array, or `[{ value, label }]`) and render the\n * list with `<ComboboxList>{(item) => <ComboboxItem value={item} />}</ComboboxList>`;\n * Base UI filters `items` against the input as the user types. Without\n * `items` nothing is filtered and `ComboboxEmpty` never shows.\n *\n * - `ComboboxInput` is our `Input` with a trailing open/close trigger and,\n * with `clearable`, an X button that clears the value.\n * - `ComboboxContent` composes Portal + Positioner + Popup + List so\n * consumers write one element; positioning props go to the Positioner.\n * - Multiple selection: set `multiple` on the Root and wrap `ComboboxValue`\n * (rendering a `ComboboxChip` per value) plus `ComboboxInput` in\n * `ComboboxChips`. Inside `ComboboxChips` the input drops its own frame;\n * the chips container carries the field look and anchors the popup.\n * - `useComboboxFilter` is Base UI's `useFilter` for external filtering via\n * `filteredItems`.\n *\n * `onValueChange` receives `(value, eventDetails)`; `onInputValueChange`\n * reports the typed text.\n */\nfunction Combobox<Value, Multiple extends boolean | undefined = false, Item = Value>(\n props: ComboboxPrimitive.Root.Props<Value, Multiple, Item>,\n) {\n return <ComboboxPrimitive.Root {...props} />;\n}\n\nconst InsideChipsContext = createContext(false);\n\nconst controlButtonClassName = cn(\n \"flex size-6 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] outline-none\",\n \"transition-[background-color,color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n);\n\nfunction ComboboxTrigger({ className, children, ...props }: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n aria-label=\"Open\"\n className={cn(controlButtonClassName, className)}\n {...props}\n >\n {children ?? (\n <ComboboxPrimitive.Icon\n data-slot=\"combobox-icon\"\n className=\"flex transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180\"\n >\n <ChevronDown />\n </ComboboxPrimitive.Icon>\n )}\n </ComboboxPrimitive.Trigger>\n );\n}\n\nfunction ComboboxClear({ className, children, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n aria-label=\"Clear\"\n className={cn(controlButtonClassName, className)}\n {...props}\n >\n {children ?? <X />}\n </ComboboxPrimitive.Clear>\n );\n}\n\nexport interface ComboboxInputProps extends ComboboxPrimitive.Input.Props {\n /** Show an X button that clears the selection while there is one. */\n clearable?: boolean;\n /** Class for the wrapper that holds the input and its buttons. */\n wrapperClassName?: string;\n}\n\nfunction ComboboxInput({ className, clearable = false, wrapperClassName, ...props }: ComboboxInputProps) {\n const insideChips = useContext(InsideChipsContext);\n if (insideChips) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-input\"\n className={cn(\n \"h-7 min-w-16 flex-1 bg-transparent outline-none\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"disabled:cursor-not-allowed\",\n className,\n )}\n {...props}\n />\n );\n }\n return (\n <ComboboxPrimitive.InputGroup\n data-slot=\"combobox-input-group\"\n className={cn(\"relative flex w-full items-center\", wrapperClassName)}\n >\n <ComboboxPrimitive.Input\n data-slot=\"combobox-input\"\n className={cn(inputClassName, clearable ? \"pr-16\" : \"pr-9\", className)}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1.5 flex items-center gap-0.5\">\n {clearable ? <ComboboxClear /> : null}\n <ComboboxTrigger />\n </div>\n </ComboboxPrimitive.InputGroup>\n );\n}\n\nfunction ComboboxValue(props: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value {...props} />;\n}\n\nexport interface ComboboxChipsProps extends ComboboxPrimitive.Chips.Props {\n /** Class for the inner chip row; `className` styles the field frame. */\n chipsClassName?: string;\n}\n\nfunction ComboboxChips({ className, chipsClassName, children, ...props }: ComboboxChipsProps) {\n return (\n <InsideChipsContext.Provider value>\n <ComboboxPrimitive.InputGroup\n data-slot=\"combobox-input-group\"\n className={cn(\n \"relative flex w-full min-w-0 items-start gap-1 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] py-1 pl-1.5 pr-1.5\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"focus-within:border-[var(--ds-ring)] focus-within:ring-[3px] focus-within:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[3px] data-[invalid]:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n >\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\"flex min-h-7 min-w-0 flex-1 flex-wrap items-center gap-1 px-1\", chipsClassName)}\n {...props}\n >\n {children}\n </ComboboxPrimitive.Chips>\n <ComboboxTrigger className=\"mt-0.5\" />\n </ComboboxPrimitive.InputGroup>\n </InsideChipsContext.Provider>\n );\n}\n\nexport interface ComboboxChipProps extends ComboboxPrimitive.Chip.Props {\n /** Hide the remove button. */\n removable?: boolean;\n}\n\nfunction ComboboxChip({ className, children, removable = true, ...props }: ComboboxChipProps) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"inline-flex h-6 max-w-full cursor-default items-center gap-1 whitespace-nowrap border pl-2.5 outline-none\",\n removable ? \"pr-1\" : \"pr-2.5\",\n \"rounded-[var(--ds-radius-full)] border-[var(--ds-border-subtle)] bg-[var(--ds-hover)]\",\n \"text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:bg-[var(--ds-primary-soft)] focus-visible:text-[color:var(--ds-primary)]\",\n \"data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"truncate\">{children}</span>\n {removable ? (\n <ComboboxPrimitive.ChipRemove\n data-slot=\"combobox-chip-remove\"\n aria-label=\"Remove\"\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded-[var(--ds-radius-full)] outline-none\",\n \"transition-[background-color,color] duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-border)] hover:text-[color:var(--ds-foreground)]\",\n \"[&_svg]:size-3\",\n )}\n >\n <X />\n </ComboboxPrimitive.ChipRemove>\n ) : null}\n </ComboboxPrimitive.Chip>\n );\n}\n\ntype PositionerProps = Pick<\n ComboboxPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface ComboboxContentProps\n extends Omit<ComboboxPrimitive.Popup.Props, \"children\">,\n PositionerProps {\n /** Items, or a render function called per filtered item (needs `items` on the Root). */\n children?: ComboboxPrimitive.List.Props[\"children\"];\n /**\n * Shown (via `ComboboxEmpty`, above the list) when nothing matches the query.\n * Needs `items` on the Root.\n */\n empty?: ReactNode;\n /** Class for the inner List element. */\n listClassName?: string;\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: ComboboxPrimitive.Portal.Props[\"container\"];\n}\n\nfunction ComboboxContent({\n className,\n children,\n empty,\n listClassName,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: ComboboxContentProps) {\n return (\n <ComboboxPrimitive.Portal keepMounted={keepMounted} container={container}>\n <ComboboxPrimitive.Positioner\n data-slot=\"combobox-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50 outline-none\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n className={cn(\n \"flex max-h-[min(var(--available-height,none),24rem)] w-[var(--anchor-width,auto)] min-w-[var(--anchor-width,auto)] flex-col overflow-hidden\",\n \"rounded-[var(--ds-radius-lg)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"outline-none\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {empty !== undefined ? <ComboboxEmpty>{empty}</ComboboxEmpty> : null}\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\"flex flex-col overflow-y-auto overflow-x-hidden p-1 outline-none\", listClassName)}\n >\n {children}\n </ComboboxPrimitive.List>\n </ComboboxPrimitive.Popup>\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n );\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span data-slot=\"combobox-item-text\" className=\"flex-1 truncate\">\n {children}\n </span>\n <ComboboxPrimitive.ItemIndicator\n data-slot=\"combobox-item-indicator\"\n className=\"absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]\"\n >\n <Check className=\"size-4\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n );\n}\n\n/** Renders per filtered item; use inside a `ComboboxGroup` given `items`, or for a flat list pass a function as `ComboboxContent` children instead. */\nfunction ComboboxCollection(props: ComboboxPrimitive.Collection.Props) {\n return <ComboboxPrimitive.Collection {...props} />;\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)] empty:m-0 empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxStatus({ className, ...props }: ComboboxPrimitive.Status.Props) {\n return (\n <ComboboxPrimitive.Status\n data-slot=\"combobox-status\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)] empty:m-0 empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(\"flex flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxGroupLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-group-label\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nconst useComboboxFilter = ComboboxPrimitive.useFilter;\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxTrigger,\n ComboboxClear,\n ComboboxValue,\n ComboboxContent,\n ComboboxItem,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxStatus,\n ComboboxGroup,\n ComboboxGroupLabel,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n useComboboxFilter,\n};\n","\"use client\";\n\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Dialog.\n *\n * `DialogContent` composes Base UI's Portal + Backdrop + Popup so consumers\n * keep writing `<DialogContent>…</DialogContent>`. The Radix `Overlay` part is\n * exported as `DialogOverlay` (a styled Backdrop) for anyone composing by hand.\n *\n * Radix users: `asChild` becomes `render={...}`; `onOpenChange` receives\n * `(open, eventDetails)` rather than just `open`; the popup is only\n * dismissable via pointer when `modal` is true (the default), and\n * `disablePointerDismissal` replaces `onPointerDownOutside` preventDefault.\n */\nfunction Dialog(props: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root {...props} />;\n}\n\nfunction DialogTrigger(props: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal(props: DialogPrimitive.Portal.Props) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose(props: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({ className, ...props }: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 backdrop-blur-[2px]\",\n \"bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]\",\n \"open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface DialogContentProps extends DialogPrimitive.Popup.Props {\n /** Keep the dialog mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the dialog; defaults to `<body>`. */\n container?: DialogPrimitive.Portal.Props[\"container\"];\n}\n\nfunction DialogContent({ className, children, keepMounted, container, ...props }: DialogContentProps) {\n return (\n <DialogPortal keepMounted={keepMounted} container={container}>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed left-1/2 top-1/2 z-50 grid w-full max-w-[440px] -translate-x-1/2 -translate-y-1/2 overflow-hidden outline-none\",\n \"rounded-[var(--ds-radius-xl)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Popup>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-1.5 px-5 pb-1 pt-5 text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogBody({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"dialog-body\" className={cn(\"px-5 pb-5 pt-1\", className)} {...props} />;\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 border-t border-[var(--ds-border-subtle)] bg-[var(--ds-card)] px-5 py-3.5 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold leading-none tracking-[-0.01em] text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({ className, ...props }: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogBody,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport {\n Dialog,\n DialogContent,\n type DialogContentProps,\n DialogDescription,\n DialogTitle,\n} from \"@/components/dialog\";\n\n/**\n * Command palette on cmdk, styled like DropdownMenu.\n *\n * cmdk filters and ranks items itself from each item's text (or `value` /\n * `keywords`); `CommandEmpty` renders when nothing matches. The selected\n * (keyboard-highlighted) item carries `data-selected=\"true\"`; `onSelect` on\n * `CommandItem` fires on click and on Enter.\n *\n * `CommandDialog` puts a palette inside our Dialog with no header padding;\n * it needs a `title` (visually hidden) so the dialog is labelled. Wire\n * `open` / `onOpenChange` to a global shortcut (⌘K) for the usual pattern.\n */\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden outline-none\",\n \"rounded-[var(--ds-radius-lg)] bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface CommandDialogProps extends React.ComponentProps<typeof Dialog> {\n /** Accessible name for the dialog; visually hidden. */\n title?: string;\n /** Accessible description for the dialog; visually hidden. */\n description?: string;\n /** Class for the dialog popup. */\n className?: string;\n /** Class for the inner Command root. */\n commandClassName?: string;\n /** Where to portal the dialog; defaults to `<body>`. */\n container?: DialogContentProps[\"container\"];\n /** Keep the dialog mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Props for the inner cmdk root (`filter`, `shouldFilter`, `loop`, `value`, ...). */\n commandProps?: Omit<React.ComponentProps<typeof CommandPrimitive>, \"children\" | \"className\">;\n children?: React.ReactNode;\n}\n\nfunction CommandDialog({\n title = \"Command palette\",\n description = \"Search for a command to run\",\n className,\n commandClassName,\n container,\n keepMounted,\n commandProps,\n children,\n ...props\n}: CommandDialogProps) {\n return (\n <Dialog {...props}>\n <DialogContent\n data-slot=\"command-dialog\"\n container={container}\n keepMounted={keepMounted}\n className={cn(\"max-w-xl overflow-hidden p-0\", className)}\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n <Command\n className={cn(\n \"rounded-none\",\n \"[&_[data-slot=command-input-wrapper]]:h-12 [&_[data-slot=command-input-wrapper]_svg]:size-5\",\n \"[&_[data-slot=command-input]]:h-12 [&_[data-slot=command-input]]:text-[length:var(--ds-text-body-sm)]\",\n \"[&_[data-slot=command-list]]:max-h-80\",\n \"[&_[data-slot=command-item]]:py-2 [&_[data-slot=command-item]_svg]:size-5\",\n commandClassName,\n )}\n {...commandProps}\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-10 items-center gap-2 border-b border-[var(--ds-border)] px-3\"\n >\n <Search className=\"size-4 shrink-0 text-[color:var(--ds-muted-foreground)]\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full min-w-0 bg-transparent py-2 outline-none\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-72 scroll-py-1 overflow-y-auto overflow-x-hidden p-1 outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\n \"py-6 text-center text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden text-[color:var(--ds-foreground)]\",\n \"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5\",\n \"[&_[cmdk-group-heading]]:text-[length:var(--ds-text-caption)] [&_[cmdk-group-heading]]:font-medium\",\n \"[&_[cmdk-group-heading]]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border-subtle)]\", className)}\n {...props}\n />\n );\n}\n\nexport interface CommandItemProps extends React.ComponentProps<typeof CommandPrimitive.Item> {\n variant?: \"default\" | \"destructive\";\n}\n\nfunction CommandItem({ className, variant = \"default\", ...props }: CommandItemProps) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 outline-none\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-foreground)]\",\n \"transition-colors duration-[var(--ds-duration-fast)]\",\n \"data-[selected=true]:bg-[var(--ds-hover)] data-[selected=true]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n variant === \"destructive\" &&\n \"text-[color:var(--ds-destructive)] data-[selected=true]:bg-[var(--ds-destructive-soft)] data-[selected=true]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-[length:var(--ds-text-caption)] tracking-widest text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandLoading(props: React.ComponentProps<typeof CommandPrimitive.Loading>) {\n return <CommandPrimitive.Loading data-slot=\"command-loading\" {...props} />;\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n CommandLoading,\n};\n","\"use client\";\n\nimport { CalendarIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { Calendar, type CalendarProps } from \"@/components/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DatePicker.\n *\n * Our outline Button as the trigger, showing the formatted value or a muted\n * placeholder, opening a Popover that holds a single-select Calendar. Picking\n * a day commits the value and closes the popup. Controlled through `value` /\n * `onValueChange`, uncontrolled through `defaultValue`.\n *\n * `DateRangePicker` is the same shape over `mode=\"range\"`. Its popup stays\n * open while both ends are chosen (react-day-picker's first click sets\n * `from === to`, the second widens it), so the user dismisses it.\n */\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/** en-GB order, no library: `15 January 2026`. */\nfunction formatDateDefault(date: Date): string {\n return `${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()}`;\n}\n\nfunction useControllable<T>(\n controlled: boolean,\n value: T | undefined,\n defaultValue: T | undefined,\n onChange: ((next: T) => void) | undefined,\n): [T | undefined, (next: T) => void] {\n const [inner, setInner] = React.useState<T | undefined>(defaultValue);\n const current = controlled ? value : inner;\n const set = React.useCallback(\n (next: T) => {\n if (!controlled) setInner(next);\n onChange?.(next);\n },\n [controlled, onChange],\n );\n return [current, set];\n}\n\ntype CalendarPassthrough = Omit<\n CalendarProps,\n \"mode\" | \"selected\" | \"onSelect\" | \"required\" | \"disabled\"\n>;\n\ninterface PickerTriggerProps {\n slot: string;\n placeholder: string;\n label: string | undefined;\n disabled?: boolean | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n}\n\nfunction PickerTrigger({ slot, placeholder, label, className, ...props }: PickerTriggerProps) {\n return (\n <PopoverTrigger\n data-slot={slot}\n data-empty={label ? undefined : true}\n render={<Button variant=\"outline\" />}\n className={cn(\n \"w-60 justify-start font-normal\",\n \"data-[empty]:text-[color:var(--ds-muted-foreground)]\",\n \"[&_svg]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <CalendarIcon />\n <span data-slot={`${slot}-value`} className=\"truncate\">\n {label ?? placeholder}\n </span>\n </PopoverTrigger>\n );\n}\n\nexport interface DatePickerProps {\n /** The selected date (controlled). */\n value?: Date | undefined;\n /** The initial date (uncontrolled). */\n defaultValue?: Date | undefined;\n /** Called with the picked date, or `undefined` when the selected day is clicked again. */\n onValueChange?: (date: Date | undefined) => void;\n /** Trigger text while nothing is selected. */\n placeholder?: string;\n /** Formats the trigger text; defaults to `15 January 2026`. */\n formatDate?: (date: Date) => string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Class name for the trigger button. */\n className?: string;\n /** Extra props for the Calendar (e.g. `startMonth`, `captionLayout`, `disabled` matchers via `calendarProps.hidden`). */\n calendarProps?: CalendarPassthrough & { disabled?: CalendarProps[\"disabled\"] };\n /** Accessible name for the trigger. */\n \"aria-label\"?: string;\n}\n\nfunction DatePicker(props: DatePickerProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date\",\n formatDate = formatDateDefault,\n disabled,\n className,\n calendarProps,\n ...rest\n } = props;\n const [date, setDate] = useControllable<Date | undefined>(\n \"value\" in props,\n value,\n defaultValue,\n onValueChange,\n );\n const [open, setOpen] = React.useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PickerTrigger\n slot=\"date-picker-trigger\"\n placeholder={placeholder}\n label={date ? formatDate(date) : undefined}\n disabled={disabled}\n className={className}\n {...rest}\n />\n <PopoverContent data-slot=\"date-picker-content\" align=\"start\" className=\"w-auto p-0\">\n <Calendar\n {...calendarProps}\n mode=\"single\"\n defaultMonth={calendarProps?.defaultMonth ?? date}\n selected={date}\n onSelect={(next) => {\n setDate(next);\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport interface DateRangePickerProps extends Omit<\n DatePickerProps,\n \"value\" | \"defaultValue\" | \"onValueChange\"\n> {\n value?: DateRange | undefined;\n defaultValue?: DateRange | undefined;\n onValueChange?: (range: DateRange | undefined) => void;\n /** Separator between the two ends; defaults to an en dash. */\n separator?: string;\n}\n\nfunction formatRange(\n range: DateRange | undefined,\n formatDate: (d: Date) => string,\n separator: string,\n): string | undefined {\n if (!range?.from) return undefined;\n if (!range.to || range.to.getTime() === range.from.getTime()) return formatDate(range.from);\n return `${formatDate(range.from)}${separator}${formatDate(range.to)}`;\n}\n\nfunction DateRangePicker(props: DateRangePickerProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date range\",\n formatDate = formatDateDefault,\n separator = \" \\u2013 \",\n disabled,\n className,\n calendarProps,\n ...rest\n } = props;\n const [range, setRange] = useControllable<DateRange | undefined>(\n \"value\" in props,\n value,\n defaultValue,\n onValueChange,\n );\n\n return (\n <Popover>\n <PickerTrigger\n slot=\"date-range-picker-trigger\"\n placeholder={placeholder}\n label={formatRange(range, formatDate, separator)}\n disabled={disabled}\n className={cn(\"w-72\", className)}\n {...rest}\n />\n <PopoverContent data-slot=\"date-range-picker-content\" align=\"start\" className=\"w-auto p-0\">\n <Calendar\n numberOfMonths={2}\n {...calendarProps}\n mode=\"range\"\n defaultMonth={calendarProps?.defaultMonth ?? range?.from}\n selected={range}\n onSelect={setRange}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { DatePicker, DateRangePicker, formatDateDefault };\n","\"use client\";\n\nimport { FileIcon, Upload, X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { useDropzone, type Accept, type DropzoneState, type FileRejection } from \"react-dropzone\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Dropzone.\n *\n * A drop target over react-dropzone's `useDropzone`. The root is a focusable\n * region that opens the file dialog on click or Enter; the hidden `<input>` is\n * what the dialog fills. Every state is exposed as a data attribute so the\n * classes below (and a consumer's) can paint it:\n *\n * - `data-active` a drag is over the zone\n * - `data-accept` every dragged file passes `accept` / `maxSize`\n * - `data-reject` at least one dragged file fails\n * - `data-disabled`\n *\n * `onFiles` receives only the accepted files; rejections go to `onReject`.\n * `FileList` and `formatFileSize` are separate parts for listing what was\n * picked, so a form can keep the zone and the list in different places.\n *\n * ## Wrapping a whole page as a drop target\n *\n * `noClick` and `noKeyboard` turn off the two activators that only make sense\n * on a dashed box: clicking anywhere inside opens the file dialog, and Enter /\n * Space on the focused root does the same. A page-sized zone wraps content\n * that has its own buttons and inputs, so both have to go — otherwise every\n * click in the page opens a file picker.\n *\n * ```tsx\n * <Dropzone noClick noKeyboard onFiles={upload} className=\"min-h-dvh border-0 bg-transparent p-0\">\n * {({ isDragActive, open }) => (\n * <>\n * <PageContent />\n * <Button onClick={open}>Browse…</Button>\n * {isDragActive ? <DropHint /> : null}\n * </>\n * )}\n * </Dropzone>\n * ```\n *\n * The render-prop form gets react-dropzone's `open()`, which is the way back\n * to the file dialog from a deliberate control. With `noClick` the root also\n * drops its `cursor-pointer`, since it is no longer clickable.\n */\n\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\n\n/** `1536` → `1.5 KB`, `0` → `0 B`; base 1024, one decimal above bytes. */\nfunction formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"0 B\";\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const rounded = unit === 0 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${UNITS[unit]}`;\n}\n\n/** Turns an `accept` map into a hint such as `PNG, JPG, PDF`. */\nfunction describeAccept(accept: Accept | undefined): string | undefined {\n if (!accept) return undefined;\n const exts = new Set<string>();\n for (const [mime, list] of Object.entries(accept)) {\n const items = typeof list === \"string\" ? [list] : list;\n if (items.length > 0) {\n for (const ext of items) exts.add(ext.replace(/^\\./, \"\").toUpperCase());\n } else {\n const sub = mime.split(\"/\")[1];\n if (sub && sub !== \"*\") exts.add(sub.toUpperCase());\n }\n }\n return exts.size > 0 ? [...exts].join(\", \") : undefined;\n}\n\nexport interface DropzoneProps extends Omit<\n React.ComponentProps<\"div\">,\n \"children\" | \"onDrop\" | \"onDragEnter\" | \"onDragOver\" | \"onDragLeave\"\n> {\n /** Called with the accepted files after a drop, a paste or the file dialog. */\n onFiles: (files: File[]) => void;\n /** Called with the rejected files and their reasons. */\n onReject?: (rejections: FileRejection[]) => void;\n /** MIME type to extension map, e.g. `{ \"image/png\": [\".png\"] }`. */\n accept?: Accept;\n /** Allow more than one file; defaults to true. */\n multiple?: boolean;\n /** Largest accepted file in bytes. */\n maxSize?: number;\n /** Most files accepted per drop; `0` means unlimited. */\n maxFiles?: number;\n disabled?: boolean;\n /** Do not open the file dialog on click; for a zone that wraps clickable content. @default false */\n noClick?: boolean;\n /** Do not open the file dialog on Enter or Space; pair with `noClick`. @default false */\n noKeyboard?: boolean;\n /** Primary line of the default body. */\n label?: React.ReactNode;\n /** Muted second line of the default body; derived from `accept` and `maxSize` when omitted. */\n hint?: React.ReactNode;\n /** Replace the default body. A function receives react-dropzone's state. */\n children?: React.ReactNode | ((state: DropzoneState) => React.ReactNode);\n}\n\nfunction Dropzone({\n onFiles,\n onReject,\n accept,\n multiple = true,\n maxSize,\n maxFiles,\n disabled = false,\n noClick = false,\n noKeyboard = false,\n label,\n hint,\n children,\n className,\n ref,\n ...props\n}: DropzoneProps) {\n const state = useDropzone({\n accept,\n multiple,\n maxSize,\n maxFiles,\n disabled,\n noClick,\n noKeyboard,\n onDropAccepted: (files) => onFiles(files),\n onDropRejected: (rejections) => onReject?.(rejections),\n });\n const { getRootProps, getInputProps, isDragActive, isDragAccept, isDragReject, isFocused, rootRef } =\n state;\n // getRootProps would let a consumer `ref` replace its own; hold both.\n const setRoot = (node: HTMLDivElement | null) => {\n (rootRef as React.MutableRefObject<HTMLElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n const derivedHint =\n hint ??\n [describeAccept(accept), maxSize ? `up to ${formatFileSize(maxSize)}` : undefined]\n .filter(Boolean)\n .join(\" \");\n\n const body =\n typeof children === \"function\" ? (\n children(state)\n ) : children !== undefined ? (\n children\n ) : (\n <>\n <span\n data-slot=\"dropzone-icon\"\n className={cn(\n \"flex size-10 items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-muted-foreground)]\",\n \"group-data-[active]/dropzone:bg-[var(--ds-primary-soft)] group-data-[active]/dropzone:text-[color:var(--ds-primary)]\",\n \"group-data-[reject]/dropzone:bg-[var(--ds-destructive-soft)] group-data-[reject]/dropzone:text-[color:var(--ds-destructive)]\",\n )}\n >\n <Upload aria-hidden className=\"size-5\" />\n </span>\n <span\n data-slot=\"dropzone-label\"\n className=\"text-[length:var(--ds-text-body-sm)] font-medium text-[color:var(--ds-foreground)]\"\n >\n {label ??\n (isDragReject\n ? \"Some of these files are not allowed\"\n : isDragActive\n ? \"Drop to upload\"\n : multiple\n ? \"Drop files here, or click to browse\"\n : \"Drop a file here, or click to browse\")}\n </span>\n {derivedHint ? (\n <span\n data-slot=\"dropzone-hint\"\n className=\"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\"\n >\n {derivedHint}\n </span>\n ) : null}\n </>\n );\n\n return (\n <div\n {...getRootProps({\n ...props,\n ref: setRoot,\n className: cn(\n \"group/dropzone flex flex-col items-center justify-center gap-2 p-6 text-center\",\n \"rounded-[var(--ds-radius-lg)] border border-dashed border-[var(--ds-border)] bg-[var(--ds-card)]\",\n noClick ? \"select-none outline-none\" : \"cursor-pointer select-none outline-none\",\n \"transition-[border-color,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)] hover:bg-[var(--ds-hover)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[active]:border-[var(--ds-primary)] data-[active]:bg-[var(--ds-primary-soft)]\",\n \"data-[reject]:border-[var(--ds-destructive)] data-[reject]:bg-[var(--ds-destructive-soft)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n ),\n })}\n data-slot=\"dropzone\"\n data-active={isDragActive || undefined}\n data-accept={(isDragActive && isDragAccept) || undefined}\n data-reject={isDragReject || undefined}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n data-no-click={noClick || undefined}\n data-no-keyboard={noKeyboard || undefined}\n >\n <input data-slot=\"dropzone-input\" {...getInputProps()} />\n {body}\n </div>\n );\n}\n\nexport interface FileListProps extends Omit<React.ComponentProps<\"ul\">, \"children\"> {\n files: readonly File[];\n /** Called with the file and its index when its remove button is pressed; the button is hidden when omitted. */\n onRemove?: (file: File, index: number) => void;\n /** Formats the size column; defaults to `formatFileSize`. */\n formatSize?: (bytes: number) => string;\n}\n\n/**\n * The files a Dropzone picked: name, size and a remove button per row. Rows\n * are keyed by name, size and last-modified time so re-picking the same file\n * keeps its row stable.\n */\nfunction FileList({ files, onRemove, formatSize = formatFileSize, className, ...props }: FileListProps) {\n if (files.length === 0) return null;\n return (\n <ul data-slot=\"file-list\" className={cn(\"flex list-none flex-col gap-1.5 p-0\", className)} {...props}>\n {files.map((file, index) => (\n <li\n key={`${file.name}-${file.size}-${file.lastModified}`}\n data-slot=\"file-list-item\"\n className={cn(\n \"flex items-center gap-3 px-3 py-2\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-card)]\",\n )}\n >\n <FileIcon\n aria-hidden\n className=\"size-4 shrink-0 text-[color:var(--ds-muted-foreground)]\"\n />\n <span\n data-slot=\"file-list-name\"\n className=\"min-w-0 flex-1 truncate text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\"\n title={file.name}\n >\n {file.name}\n </span>\n <span\n data-slot=\"file-list-size\"\n className=\"shrink-0 font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\"\n >\n {formatSize(file.size)}\n </span>\n {onRemove ? (\n <button\n type=\"button\"\n data-slot=\"file-list-remove\"\n aria-label={`Remove ${file.name}`}\n onClick={() => onRemove(file, index)}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"[&_svg]:size-3.5\",\n )}\n >\n <X aria-hidden />\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\nexport { Dropzone, FileList, formatFileSize };\nexport type { Accept, FileRejection, DropzoneState };\n","\"use client\";\n\nimport { useRender } from \"@base-ui/react/use-render\";\nimport * as React from \"react\";\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldError as RHFFieldError,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n type FieldDescriptionProps,\n type FieldErrorProps,\n type FieldLabelProps,\n type FieldProps,\n} from \"@/components/field\";\n\n/**\n * Form.\n *\n * The shadcn react-hook-form recipe, with the parts built on Field so a form\n * written this way and one written with Field directly look the same:\n *\n * ```tsx\n * const form = useForm({ resolver: zodResolver(schema), defaultValues: { email: \"\" } });\n * <Form {...form}>\n * <form onSubmit={form.handleSubmit(onSubmit)}>\n * <FormField control={form.control} name=\"email\" render={({ field }) => (\n * <FormItem>\n * <FormLabel>Email</FormLabel>\n * <FormControl><Input {...field} /></FormControl>\n * <FormDescription>Where we send receipts.</FormDescription>\n * <FormMessage />\n * </FormItem>\n * )} />\n * </form>\n * </Form>\n * ```\n *\n * `FormItem` is a Field marked `invalid` from the react-hook-form error, so\n * `data-invalid` lands on the label and any Base UI control. `FormControl`\n * has no element of its own: it merges `id`, `aria-describedby` and\n * `aria-invalid` onto its single child, so a plain Input, Textarea or a Base\n * UI Checkbox/Select/Switch all work. `FormLabel` targets that `id`.\n *\n * `useForm` and `zodResolver` are re-exported so a consumer imports one package.\n */\nexport { useForm } from \"react-hook-form\";\nexport type { SubmitHandler, UseFormReturn } from \"react-hook-form\";\nexport { zodResolver } from \"@hookform/resolvers/zod\";\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null);\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n TTransformedValues = TFieldValues,\n>(props: ControllerProps<TFieldValues, TName, TTransformedValues>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n}\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null);\n\nfunction useFormFieldState() {\n const fieldContext = React.useContext(FormFieldContext);\n if (!fieldContext) {\n throw new Error(\"useFormField must be used within <FormField>\");\n }\n const { getFieldState } = useFormContext();\n const formState = useFormState({ name: fieldContext.name });\n const fieldState = getFieldState(fieldContext.name, formState);\n return { name: fieldContext.name, ...fieldState };\n}\n\nexport interface UseFormFieldReturn {\n id: string;\n name: string;\n formItemId: string;\n formDescriptionId: string;\n formMessageId: string;\n invalid: boolean;\n isDirty: boolean;\n isTouched: boolean;\n isValidating: boolean;\n error?: RHFFieldError | undefined;\n}\n\nfunction useFormField(): UseFormFieldReturn {\n const fieldState = useFormFieldState();\n const itemContext = React.useContext(FormItemContext);\n if (!itemContext) {\n throw new Error(\"useFormField must be used within <FormItem>\");\n }\n const { id } = itemContext;\n return {\n id,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n}\n\nexport interface FormItemProps extends Omit<FieldProps, \"invalid\" | \"name\"> {}\n\nfunction FormItem({ className, ...props }: FormItemProps) {\n const id = React.useId();\n const { name, error } = useFormFieldState();\n return (\n <FormItemContext.Provider value={{ id }}>\n <Field\n data-slot=\"form-item\"\n name={name}\n invalid={Boolean(error)}\n className={className}\n {...props}\n />\n </FormItemContext.Provider>\n );\n}\n\nexport interface FormLabelProps extends FieldLabelProps {}\n\nfunction FormLabel({ className, ...props }: FormLabelProps) {\n const { formItemId } = useFormField();\n return (\n <FieldLabel data-slot=\"form-label\" htmlFor={formItemId} className={className} {...props} />\n );\n}\n\nexport interface FormControlProps extends React.HTMLAttributes<HTMLElement> {\n /** The single control element; it receives `id`, `aria-describedby` and `aria-invalid`. */\n children: React.ReactElement;\n}\n\nfunction FormControl({ children, ...props }: FormControlProps) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n return useRender({\n render: children,\n props: {\n id: formItemId,\n \"aria-describedby\": error ? `${formDescriptionId} ${formMessageId}` : formDescriptionId,\n \"aria-invalid\": error ? true : undefined,\n ...props,\n },\n });\n}\n\nexport interface FormDescriptionProps extends FieldDescriptionProps {}\n\nfunction FormDescription({ className, ...props }: FormDescriptionProps) {\n const { formDescriptionId } = useFormField();\n return (\n <FieldDescription\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={className}\n {...props}\n />\n );\n}\n\nexport interface FormMessageProps extends Omit<FieldErrorProps, \"errors\" | \"match\"> {}\n\nfunction FormMessage({ className, children, ...props }: FormMessageProps) {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error.message ?? \"\") : children;\n if (!body) {\n return null;\n }\n return (\n <FieldError data-slot=\"form-message\" id={formMessageId} match className={className} {...props}>\n {body}\n </FieldError>\n );\n}\n\nexport {\n Form,\n FormField,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n useFormField,\n};\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Kbd — an inline keyboard-key cap. Mono caption-sm text on the sunken\n * surface, with a heavier bottom border for the key-cap read.\n */\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"inline-flex items-center px-1.5 py-0.5\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-sm)] leading-none\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-muted-foreground)]\",\n \"border border-b-2 border-[var(--ds-border)] rounded-[var(--ds-radius-sm)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Kbd };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { cn } from \"@/lib/cn\";\n\nexport type LoadingSkeletonPreset = \"list\" | \"table\" | \"card\" | \"form\";\n\nexport interface LoadingSkeletonProps extends React.ComponentProps<\"div\"> {\n /** Which shape of content is loading. */\n preset?: LoadingSkeletonPreset;\n /** Rows (list, table, form) or cards. Each preset has a sensible default. */\n rows?: number;\n /** Columns for `table` and `card`. */\n columns?: number;\n}\n\nconst DEFAULT_ROWS: Record<LoadingSkeletonPreset, number> = {\n list: 4,\n table: 5,\n card: 3,\n form: 3,\n};\n\nconst DEFAULT_COLUMNS: Record<LoadingSkeletonPreset, number> = {\n list: 1,\n table: 4,\n card: 3,\n form: 1,\n};\n\n/* Widths cycle so rows do not line up into a solid block. */\nconst LINE_WIDTHS = [\"w-3/4\", \"w-1/2\", \"w-5/6\", \"w-2/3\", \"w-3/5\"] as const;\nconst width = (i: number) => LINE_WIDTHS[i % LINE_WIDTHS.length];\n\nfunction ListSkeleton({ rows }: { rows: number }) {\n return (\n <div data-slot=\"loading-skeleton-list\" className=\"flex flex-col gap-4\">\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} data-slot=\"loading-skeleton-row\" className=\"flex items-center gap-3\">\n <Skeleton className=\"size-9 shrink-0 rounded-[var(--ds-radius-full)]\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Skeleton className={cn(\"h-3.5\", width(i))} />\n <Skeleton className={cn(\"h-3\", width(i + 2))} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction TableSkeleton({ rows, columns }: { rows: number; columns: number }) {\n const grid = { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` };\n return (\n <div data-slot=\"loading-skeleton-table\" className=\"flex flex-col\">\n <div\n data-slot=\"loading-skeleton-row\"\n className=\"grid gap-4 border-b border-[var(--ds-border-subtle)] px-3 py-3\"\n style={grid}\n >\n {Array.from({ length: columns }, (_, c) => (\n <Skeleton key={c} className=\"h-3 w-1/2\" />\n ))}\n </div>\n {Array.from({ length: rows }, (_, r) => (\n <div\n key={r}\n data-slot=\"loading-skeleton-row\"\n className=\"grid gap-4 border-b border-[var(--ds-border-subtle)] px-3 py-3.5 last:border-b-0\"\n style={grid}\n >\n {Array.from({ length: columns }, (_, c) => (\n <Skeleton key={c} className={cn(\"h-3.5\", width(r + c))} />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction CardSkeleton({ rows, columns }: { rows: number; columns: number }) {\n return (\n <div\n data-slot=\"loading-skeleton-cards\"\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: rows }, (_, i) => (\n <div\n key={i}\n data-slot=\"loading-skeleton-card\"\n className=\"flex flex-col gap-3 rounded-[var(--ds-radius-lg)] border border-[var(--ds-border-subtle)] bg-[var(--ds-card)] p-5\"\n >\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-3/4\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n <Skeleton className=\"h-3 w-full\" />\n <Skeleton className={cn(\"h-3\", width(i))} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FormSkeleton({ rows }: { rows: number }) {\n return (\n <div data-slot=\"loading-skeleton-form\" className=\"flex max-w-xl flex-col gap-5\">\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} data-slot=\"loading-skeleton-field\" className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-3 w-24\" />\n <Skeleton className=\"h-9 w-full rounded-[var(--ds-radius-md)]\" />\n </div>\n ))}\n <Skeleton className=\"mt-1 h-9 w-28 rounded-[var(--ds-radius-md)]\" />\n </div>\n );\n}\n\n/**\n * LoadingSkeleton — page-level placeholders assembled from Skeleton, one per\n * shape of content: a list of rows with an avatar, a table with a header row,\n * a grid of cards, or a stacked form. Announces itself as busy so assistive\n * technology knows the region is loading; the blocks themselves are hidden.\n */\nfunction LoadingSkeleton({\n className,\n preset = \"list\",\n rows,\n columns,\n ...props\n}: LoadingSkeletonProps) {\n const count = Math.max(1, rows ?? DEFAULT_ROWS[preset]);\n const cols = Math.max(1, columns ?? DEFAULT_COLUMNS[preset]);\n return (\n <div\n data-slot=\"loading-skeleton\"\n data-preset={preset}\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className={cn(\"w-full\", className)}\n {...props}\n >\n {preset === \"list\" ? <ListSkeleton rows={count} /> : null}\n {preset === \"table\" ? <TableSkeleton rows={count} columns={cols} /> : null}\n {preset === \"card\" ? <CardSkeleton rows={count} columns={cols} /> : null}\n {preset === \"form\" ? <FormSkeleton rows={count} /> : null}\n </div>\n );\n}\n\nexport { LoadingSkeleton };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface PageHeaderProps extends Omit<React.ComponentProps<\"header\">, \"title\"> {\n /** The page title. Rendered as the h1; use `titleAs` to demote it. */\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Buttons for the page, right-aligned on wide viewports. */\n actions?: React.ReactNode;\n /** Short uppercase label above the title, e.g. a section or product name. */\n eyebrow?: React.ReactNode;\n /** A Breadcrumb or any navigation rendered above the eyebrow. */\n breadcrumb?: React.ReactNode;\n /** Heading level when the page already has an h1. */\n titleAs?: \"h1\" | \"h2\" | \"h3\";\n}\n\n/**\n * PageHeader — the top of every screen: breadcrumb, eyebrow, title,\n * description, and an actions slot. The title is an h1 on the h2 step of the\n * type scale in the display face, so screens read as one product rather than\n * as a stack of card titles.\n */\nfunction PageHeader({\n className,\n title,\n description,\n actions,\n eyebrow,\n breadcrumb,\n titleAs: Title = \"h1\",\n children,\n ...props\n}: PageHeaderProps) {\n return (\n <header\n data-slot=\"page-header\"\n className={cn(\n \"flex flex-col gap-4 text-[color:var(--ds-foreground)] md:flex-row md:items-end md:justify-between\",\n className,\n )}\n {...props}\n >\n <div data-slot=\"page-header-content\" className=\"flex min-w-0 flex-col gap-1.5\">\n {breadcrumb ? (\n <div data-slot=\"page-header-breadcrumb\" className=\"mb-1\">\n {breadcrumb}\n </div>\n ) : null}\n {eyebrow ? (\n <span\n data-slot=\"page-header-eyebrow\"\n className={cn(\n \"text-[length:var(--ds-text-eyebrow)] font-extrabold uppercase\",\n \"leading-[var(--ds-text-eyebrow--line-height)] tracking-[var(--ds-text-eyebrow--letter-spacing)]\",\n \"text-[color:var(--ds-eyebrow)]\",\n )}\n >\n {eyebrow}\n </span>\n ) : null}\n <Title\n data-slot=\"page-header-title\"\n className={cn(\n \"font-display text-[length:var(--ds-text-h2)] font-bold text-balance\",\n \"leading-[var(--ds-text-h2--line-height)] tracking-[var(--ds-text-h2--letter-spacing)]\",\n \"text-[color:var(--ds-foreground)]\",\n )}\n >\n {title}\n </Title>\n {description ? (\n <p\n data-slot=\"page-header-description\"\n className={cn(\n \"max-w-prose text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n \"text-[color:var(--ds-muted-foreground)]\",\n )}\n >\n {description}\n </p>\n ) : null}\n {children}\n </div>\n {actions ? (\n <div\n data-slot=\"page-header-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-2 md:justify-end\"\n >\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\nexport { PageHeader };\n","\"use client\";\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * ScrollArea.\n *\n * Base UI positions the scrollbar and thumb itself (absolute inside the root,\n * thumb size in `--scroll-area-thumb-*`); this file only sets the track width,\n * the thumb colour and the hover/scroll reveal. Base UI also unmounts the\n * scrollbar when there is nothing to scroll, so an empty list shows no track.\n *\n * Radix users: the `display: table` wrapper is gone, so `truncate` works\n * inside the viewport without the `[&>div]:!block` override cortenaweb needed.\n * `type=\"always\" | \"hover\"` is gone too; the scrollbar shows on hover and while\n * scrolling, and `keepMounted` on `ScrollBar` keeps it in the DOM otherwise.\n */\nexport interface ScrollAreaProps extends ScrollAreaPrimitive.Root.Props {\n /** Which scrollbars to render. Defaults to vertical only. */\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n}\n\nfunction ScrollArea({ className, children, orientation = \"vertical\", ...props }: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full overscroll-contain rounded-[inherit] outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation !== \"horizontal\" && <ScrollBar orientation=\"vertical\" />}\n {orientation !== \"vertical\" && <ScrollBar orientation=\"horizontal\" />}\n <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none p-px\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"data-[hovering]:opacity-100 data-[scrolling]:opacity-100\",\n orientation === \"vertical\" && \"w-2.5 flex-col\",\n orientation === \"horizontal\" && \"h-2.5 flex-row\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className={cn(\n \"relative flex-1 rounded-[var(--ds-radius-full)] bg-[var(--ds-border-strong)]\",\n orientation === \"vertical\" ? \"w-full\" : \"h-full\",\n )}\n />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Segmented control.\n *\n * A single-select row of options exposed as a radiogroup: the same semantics\n * cortenaweb shipped, which screen readers announce as \"1 of 3, selected\".\n * The active segment lifts onto the raised surface with the small shadow; the\n * others read as muted text until hovered.\n */\nexport interface SegmentedOption<T extends string = string> {\n value: T;\n label: React.ReactNode;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SegmentedProps<T extends string = string>\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value: T;\n onValueChange: (value: T) => void;\n options: readonly SegmentedOption<T>[];\n \"aria-label\"?: string;\n}\n\nfunction Segmented<T extends string = string>({\n className,\n value,\n onValueChange,\n options,\n \"aria-label\": ariaLabel,\n ...props\n}: SegmentedProps<T>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n data-slot=\"segmented\"\n className={cn(\n \"inline-flex gap-0.5 rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-muted)] p-1\",\n className,\n )}\n {...props}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={opt.disabled}\n data-slot=\"segmented-item\"\n data-state={active ? \"on\" : \"off\"}\n onClick={() => onValueChange(opt.value)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-[var(--ds-radius-sm)] px-3 py-1 font-medium\",\n \"text-[length:var(--ds-text-caption)]\",\n \"transition-[background-color,color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n active\n ? \"bg-[var(--ds-popover)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]\"\n : \"text-[color:var(--ds-muted-foreground)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n )}\n >\n {opt.icon}\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport { Segmented };\n","\"use client\";\n\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Sheet: a Dialog whose Popup is anchored to one edge of the viewport.\n *\n * Same Base UI parts as Dialog (Root, Trigger, Portal, Backdrop, Popup, Title,\n * Description, Close); only the Popup's placement differs, chosen by `side`.\n * `SheetContent` composes Portal + Backdrop + Popup so consumers keep writing\n * `<SheetContent side=\"right\">…</SheetContent>`.\n *\n * ## Non-modal side panels\n *\n * `modal={false}` is the help-panel / inspector case: a sheet read *alongside*\n * the app rather than instead of it. No backdrop is rendered, focus is not\n * trapped, page scroll is not locked, and the rest of the page stays clickable,\n * so a user can keep working with the panel open. `modal=\"trap-focus\"` is the\n * middle setting Base UI offers: focus stays inside, the page still scrolls.\n *\n * ```tsx\n * <Sheet modal={false} open={helpOpen} onOpenChange={setHelpOpen}>\n * <SheetContent side=\"right\" disablePointerDismissal>…</SheetContent>\n * </Sheet>\n * ```\n *\n * A non-modal sheet closes when focus or a press leaves it; pass\n * `disablePointerDismissal` (a Base UI Root prop, forwarded) to keep it open\n * until the user closes it. `modal` is on the Root because that is where Base\n * UI reads it; `SheetContent` picks the backdrop up from there through context.\n */\nconst SheetModalContext = React.createContext<boolean | \"trap-focus\">(true);\n\nexport interface SheetProps extends SheetPrimitive.Root.Props {\n /**\n * `true` (default) traps focus, locks page scroll and draws a backdrop.\n * `false` draws no backdrop and traps nothing, for a panel read alongside\n * the app. `\"trap-focus\"` keeps focus in but leaves the page scrollable.\n */\n modal?: boolean | \"trap-focus\";\n}\n\nfunction Sheet({ modal = true, ...props }: SheetProps) {\n return (\n <SheetModalContext.Provider value={modal}>\n <SheetPrimitive.Root modal={modal} {...props} />\n </SheetModalContext.Provider>\n );\n}\n\nfunction SheetTrigger(props: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose(props: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal(props: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50\",\n \"bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]\",\n \"open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst sheetVariants = cva(\n [\n \"fixed z-50 flex flex-col gap-4 p-6 outline-none\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in closed:animate-out\",\n \"open:duration-[var(--ds-duration-slow)] closed:duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n ],\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b border-[var(--ds-border)] open:slide-in-from-top closed:slide-out-to-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t border-[var(--ds-border)] open:slide-in-from-bottom closed:slide-out-to-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r border-[var(--ds-border)] open:slide-in-from-left closed:slide-out-to-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l border-[var(--ds-border)] open:slide-in-from-right closed:slide-out-to-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\nexport interface SheetContentProps\n extends SheetPrimitive.Popup.Props, VariantProps<typeof sheetVariants> {\n /** Keep the sheet mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the sheet; defaults to `<body>`. */\n container?: SheetPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SheetContent({\n side = \"right\",\n className,\n children,\n keepMounted,\n container,\n ...props\n}: SheetContentProps) {\n const modal = React.useContext(SheetModalContext);\n return (\n <SheetPortal keepMounted={keepMounted} container={container}>\n {modal === false ? null : <SheetOverlay />}\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n data-modal={modal === false ? undefined : modal === true ? \"\" : modal}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </SheetPrimitive.Popup>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n sheetVariants,\n};\n","\"use client\";\n\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n MouseSensor,\n PointerSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { GripVertical } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * SortableList.\n *\n * A reorderable list over dnd-kit: `DndContext` + `SortableContext` around one\n * `useSortable` item per entry. The list owns nothing — it calls `onReorder`\n * with the next array and the consumer stores it. Pointer and keyboard sensors\n * are wired (Space picks up, arrows move, Space drops, Escape cancels) and a\n * `DragOverlay` paints the lifted copy with `--ds-shadow-lg` while the item\n * left behind dims and takes the ring colour.\n *\n * By default the whole row is the drag activator. Pass `handle` to restrict\n * dragging to a `<SortableHandle>` (or any element given `handleProps`) so\n * buttons and inputs inside a row stay clickable.\n *\n * ## Touch\n *\n * A pointer drag and a touch scroll start the same way, so something has to\n * say which one a finger means. In handle mode only the small handle is\n * `touch-none`, so the rest of the row scrolls: nothing to decide. In\n * whole-row mode the whole row is `touch-none`, which is why a touch list\n * whose rows are the activators cannot be scrolled by dragging over them.\n *\n * `touchScroll` is the way out, and it defaults to whichever of those is\n * already true — `true` in handle mode, `false` in whole-row mode, so existing\n * lists behave exactly as before. Setting it `true` on a whole-row list drops\n * `touch-none` and swaps the PointerSensor for a MouseSensor plus a\n * TouchSensor with delay activation: a quick swipe scrolls, a press held for\n * {@link TOUCH_DELAY_MS} picks the row up. `false` in handle mode is the\n * opposite trade — the row never scrolls under a finger.\n */\n\n/** How long a finger must rest on a row before it becomes a drag. */\nconst TOUCH_DELAY_MS = 250;\n/** How far it may slip in that time and still count as a press, not a scroll. */\nconst TOUCH_TOLERANCE_PX = 8;\n\n/** Spread onto the element that should start a drag. */\nexport interface SortableHandleProps extends Partial<DraggableAttributes> {\n ref: (element: HTMLElement | null) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n onPointerDown?: React.PointerEventHandler<HTMLElement>;\n onMouseDown?: React.MouseEventHandler<HTMLElement>;\n onTouchStart?: React.TouchEventHandler<HTMLElement>;\n}\n\n/** dnd-kit types its listeners as a bag of `Function`s; narrow them to the handlers they are. */\nfunction asHandlers(listeners: DraggableSyntheticListeners): Partial<SortableHandleProps> {\n return (listeners ?? {}) as Partial<SortableHandleProps>;\n}\n\nexport interface SortableRenderState {\n /** Attributes, listeners and ref for a custom drag handle. */\n handleProps: SortableHandleProps;\n /** True for the item being dragged (and for the overlay copy). */\n isDragging: boolean;\n}\n\n/** What moved where, passed to `onReorder` alongside the reordered array. */\nexport interface SortableReorderDetails {\n /** Index the item came from, in the array as it was passed in. */\n from: number;\n /** Index it landed on. */\n to: number;\n /** Id of the item that moved (`getId` of the dragged item). */\n activeId: UniqueIdentifier;\n /** Id of the item it was dropped onto. */\n overId: UniqueIdentifier;\n}\n\nexport interface SortableListProps<T> extends Omit<React.ComponentProps<\"ul\">, \"children\"> {\n items: readonly T[];\n /** Stable id per item; must be unique within the list. */\n getId: (item: T) => UniqueIdentifier;\n /**\n * Called with the reordered array after a successful drop, and with the move\n * itself — `{ from, to, activeId, overId }` — for a server that persists a\n * position rather than the whole list.\n */\n onReorder: (next: T[], details: SortableReorderDetails) => void;\n renderItem: (item: T, state: SortableRenderState) => React.ReactNode;\n /** Layout axis; also selects the sorting strategy. */\n orientation?: \"vertical\" | \"horizontal\";\n /** Only a `<SortableHandle>` (or an element given `handleProps`) starts a drag. */\n handle?: boolean;\n /**\n * Let a finger scroll the page over the rows. Defaults to `handle`: `true`\n * in handle mode, `false` in whole-row mode, which is what each already did.\n * `true` on a whole-row list drops `touch-none` and uses a TouchSensor with\n * delay activation, so a swipe scrolls and a held press drags.\n */\n touchScroll?: boolean;\n /** Disables every sensor and hides the handles. */\n disabled?: boolean;\n /** Class name for each item wrapper. */\n itemClassName?: string;\n}\n\ninterface ItemContextValue {\n handleProps: SortableHandleProps;\n isDragging: boolean;\n disabled: boolean;\n}\n\nconst noopRef = () => {};\nconst inertHandle: SortableHandleProps = { ref: noopRef };\n\nconst SortableItemContext = React.createContext<ItemContextValue>({\n handleProps: inertHandle,\n isDragging: false,\n disabled: false,\n});\n\nconst itemClassName = cn(\n \"relative rounded-[var(--ds-radius-md)] outline-none\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[dragging]:opacity-50 data-[dragging]:ring-2 data-[dragging]:ring-[var(--ds-ring)]\",\n);\n\ninterface SortableItemProps<T> {\n id: UniqueIdentifier;\n item: T;\n handle: boolean;\n disabled: boolean;\n touchScroll: boolean;\n renderItem: SortableListProps<T>[\"renderItem\"];\n className: string | undefined;\n}\n\nfunction SortableItem<T>({ id, item, handle, disabled, touchScroll, renderItem, className }: SortableItemProps<T>) {\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } =\n useSortable({ id, disabled });\n\n const handleProps = React.useMemo<SortableHandleProps>(\n () => ({ ...attributes, ...asHandlers(listeners), ref: setActivatorNodeRef }),\n [attributes, listeners, setActivatorNodeRef],\n );\n const context = React.useMemo<ItemContextValue>(\n () => ({ handleProps, isDragging, disabled }),\n [handleProps, isDragging, disabled],\n );\n const rowActivator = handle ? undefined : { ...attributes, ...asHandlers(listeners) };\n\n return (\n <SortableItemContext.Provider value={context}>\n <li\n ref={setNodeRef}\n data-slot=\"sortable-item\"\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n style={{ transform: CSS.Translate.toString(transform), transition }}\n className={cn(\n itemClassName,\n !handle && !disabled && \"cursor-grab data-[dragging]:cursor-grabbing\",\n // touch-action is what decides whether a finger scrolls or drags.\n !touchScroll && !disabled && \"touch-none\",\n className,\n )}\n {...rowActivator}\n >\n {renderItem(item, { handleProps, isDragging })}\n </li>\n </SortableItemContext.Provider>\n );\n}\n\n/**\n * A grip button that starts the drag for its row. Reads the row's activator\n * props from context, so it needs no wiring beyond being rendered inside\n * `renderItem`. Hidden (kept in layout) when the list is disabled.\n */\nfunction SortableHandle({ className, children, ...props }: React.ComponentProps<\"button\">) {\n const { handleProps, disabled } = React.useContext(SortableItemContext);\n return (\n <button\n type=\"button\"\n data-slot=\"sortable-handle\"\n aria-label=\"Drag to reorder\"\n className={cn(\n \"inline-flex size-7 shrink-0 cursor-grab touch-none items-center justify-center\",\n \"rounded-[var(--ds-radius-sm)] text-[color:var(--ds-text-tertiary)]\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-muted-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"active:cursor-grabbing disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:size-4 [&_svg]:pointer-events-none\",\n disabled && \"invisible\",\n className,\n )}\n disabled={disabled}\n {...handleProps}\n {...props}\n >\n {children ?? <GripVertical aria-hidden />}\n </button>\n );\n}\n\nfunction SortableList<T>({\n items,\n getId,\n onReorder,\n renderItem,\n orientation = \"vertical\",\n handle = false,\n disabled = false,\n touchScroll = handle,\n itemClassName: itemClass,\n className,\n ...props\n}: SortableListProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null);\n // Only a whole-row list needs the split sensors: in handle mode the row is\n // already scrollable because only the handle is touch-none, and swapping\n // sensors there would put a 250 ms delay on the handle for no gain.\n const delayTouch = touchScroll && !handle;\n // Every sensor is created on every render (they are hooks); which ones are\n // handed to DndContext is what changes.\n const pointerSensor = useSensor(PointerSensor, { activationConstraint: { distance: 4 } });\n const mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance: 4 } });\n const touchSensor = useSensor(TouchSensor, {\n activationConstraint: { delay: TOUCH_DELAY_MS, tolerance: TOUCH_TOLERANCE_PX },\n });\n const keyboardSensor = useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates });\n const pointerSensors = useSensors(pointerSensor, keyboardSensor);\n const splitSensors = useSensors(mouseSensor, touchSensor, keyboardSensor);\n const sensors = delayTouch ? splitSensors : pointerSensors;\n const ids = React.useMemo(() => items.map(getId), [items, getId]);\n const activeItem = activeId === null ? undefined : items[ids.indexOf(activeId)];\n\n const onDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id);\n }, []);\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const from = ids.indexOf(active.id);\n const to = ids.indexOf(over.id);\n if (from < 0 || to < 0) return;\n onReorder(arrayMove([...items], from, to), {\n from,\n to,\n activeId: active.id,\n overId: over.id,\n });\n },\n [ids, items, onReorder],\n );\n const onDragCancel = React.useCallback(() => setActiveId(null), []);\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n >\n <SortableContext\n items={ids}\n strategy={orientation === \"horizontal\" ? horizontalListSortingStrategy : verticalListSortingStrategy}\n disabled={disabled}\n >\n <ul\n data-slot=\"sortable-list\"\n data-orientation={orientation}\n data-disabled={disabled || undefined}\n data-touch-scroll={touchScroll ? \"\" : undefined}\n className={cn(\n \"flex list-none gap-2 p-0\",\n orientation === \"horizontal\" ? \"flex-row flex-wrap\" : \"flex-col\",\n className,\n )}\n {...props}\n >\n {items.map((item, index) => (\n <SortableItem\n key={ids[index] ?? index}\n id={ids[index] ?? index}\n item={item}\n handle={handle}\n disabled={disabled}\n touchScroll={touchScroll}\n renderItem={renderItem}\n className={itemClass}\n />\n ))}\n </ul>\n </SortableContext>\n <DragOverlay>\n {activeItem === undefined ? null : (\n <SortableItemContext.Provider\n value={{ handleProps: inertHandle, isDragging: true, disabled: false }}\n >\n <div\n data-slot=\"sortable-overlay\"\n className={cn(\n \"cursor-grabbing rounded-[var(--ds-radius-md)] bg-[var(--ds-card)]\",\n \"shadow-[var(--ds-shadow-lg)] ring-1 ring-[var(--ds-ring)]\",\n itemClass,\n )}\n >\n {renderItem(activeItem, { handleProps: inertHandle, isDragging: true })}\n </div>\n </SortableItemContext.Provider>\n )}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport { SortableList, SortableHandle, arrayMove };\n","\"use client\";\n\nimport { Toast as ToastPrimitive } from \"@base-ui/react/toast\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Toast.\n *\n * Base UI toasts are imperative: `useToast().add({ title, description, type })`\n * from anywhere under the provider. `Toaster` mounts `Toast.Provider` and the\n * `Toast.Viewport`, and renders every toast the manager holds, so it must wrap\n * the part of the tree that calls `useToast` (usually the whole app).\n *\n * The `type` field on a toast picks the variant: `default`, `success`,\n * `warning` or `destructive`, painted from the semantic soft tokens. Anything\n * else falls back to `default`.\n *\n * sonner / Radix users: there is no `toast()` module singleton. Get the manager\n * from `useToast()` inside a component, or build one with\n * `createToastManager()` from `@base-ui/react/toast` and pass it as\n * `toastManager` to `Toaster` when you need to fire toasts outside React.\n */\nconst toastVariants = cva(\n [\n \"pointer-events-auto relative flex w-full items-start gap-3 p-4\",\n \"rounded-[var(--ds-radius-lg)] border shadow-[var(--ds-shadow-lg)]\",\n \"text-[length:var(--ds-text-caption-lg)]\",\n \"open:animate-in open:fade-in-0 open:slide-in-from-bottom-2\",\n \"closed:animate-out closed:fade-out-0 closed:slide-out-to-right-2\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[swiping]:transition-none data-[limited]:hidden\",\n ],\n {\n variants: {\n variant: {\n default:\n \"border-[var(--ds-border)] bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)]\",\n success:\n \"border-[var(--ds-success)]/30 bg-[var(--ds-success-soft)] text-[color:var(--ds-success)]\",\n warning:\n \"border-[var(--ds-warning)]/30 bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n destructive:\n \"border-[var(--ds-destructive)]/30 bg-[var(--ds-destructive-soft)] text-[color:var(--ds-destructive)]\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\ntype ToastVariant = NonNullable<VariantProps<typeof toastVariants>[\"variant\"]>;\n\nconst VARIANTS: readonly ToastVariant[] = [\"default\", \"success\", \"warning\", \"destructive\"];\n\nfunction variantOf(type: string | undefined): ToastVariant {\n return (VARIANTS as readonly string[]).includes(type ?? \"\") ? (type as ToastVariant) : \"default\";\n}\n\n/** The Base UI toast manager: `{ toasts, add, close, update, promise }`. */\nconst useToast = ToastPrimitive.useToastManager;\n\nexport interface ToastProps extends Omit<ToastPrimitive.Root.Props, \"toast\">, VariantProps<typeof toastVariants> {\n toast: ToastPrimitive.Root.ToastObject;\n}\n\n/** One toast. Rendered by `Toaster`; exported for custom viewports. */\nfunction Toast({ className, variant, toast, ...props }: ToastProps) {\n return (\n <ToastPrimitive.Root\n data-slot=\"toast\"\n toast={toast}\n className={cn(toastVariants({ variant: variant ?? variantOf(toast.type) }), className)}\n {...props}\n >\n <ToastPrimitive.Content data-slot=\"toast-content\" className=\"flex min-w-0 flex-1 flex-col gap-1\">\n {toast.title ? (\n <ToastPrimitive.Title\n data-slot=\"toast-title\"\n className=\"text-[length:var(--ds-text-body-sm)] font-semibold leading-tight\"\n />\n ) : null}\n {toast.description ? (\n <ToastPrimitive.Description\n data-slot=\"toast-description\"\n className=\"text-[length:var(--ds-text-caption-lg)] opacity-90\"\n />\n ) : null}\n </ToastPrimitive.Content>\n <ToastPrimitive.Close\n data-slot=\"toast-close\"\n aria-label=\"Close\"\n className={cn(\n \"-mr-1 -mt-1 flex size-7 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"opacity-70 outline-none transition-[opacity,background-color] duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-hover)] hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <X className=\"size-4\" />\n </ToastPrimitive.Close>\n </ToastPrimitive.Root>\n );\n}\n\nfunction ToastList() {\n const { toasts } = useToast();\n return toasts.map((toast) => <Toast key={toast.id} toast={toast} />);\n}\n\nexport interface ToasterProps extends ToastPrimitive.Provider.Props {\n /** Corner of the screen the stack grows from. */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n /** Extra classes on the viewport. */\n className?: string;\n children?: React.ReactNode;\n}\n\nconst positionClasses: Record<NonNullable<ToasterProps[\"position\"]>, string> = {\n \"bottom-right\": \"bottom-4 right-4 flex-col\",\n \"bottom-left\": \"bottom-4 left-4 flex-col\",\n \"top-right\": \"top-4 right-4 flex-col-reverse\",\n \"top-left\": \"top-4 left-4 flex-col-reverse\",\n};\n\n/**\n * Provider + viewport. Wrap the app in it once; `useToast()` works anywhere\n * beneath. Toasts render in a fixed corner as a flat stack (newest last).\n */\nfunction Toaster({ position = \"bottom-right\", className, children, ...props }: ToasterProps) {\n return (\n <ToastPrimitive.Provider {...props}>\n {children}\n <ToastPrimitive.Portal>\n <ToastPrimitive.Viewport\n data-slot=\"toast-viewport\"\n className={cn(\n \"pointer-events-none fixed z-50 flex w-[calc(100vw-2rem)] max-w-sm gap-2 outline-none\",\n positionClasses[position],\n className,\n )}\n >\n <ToastList />\n </ToastPrimitive.Viewport>\n </ToastPrimitive.Portal>\n </ToastPrimitive.Provider>\n );\n}\n\nexport { Toaster, Toast, useToast, toastVariants };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface ToolbarProps extends React.ComponentProps<\"div\"> {\n /** Draw a rule under the row, for a toolbar that sits above a table or list. */\n bordered?: boolean;\n}\n\n/**\n * Toolbar — a single flex row of controls above content. `ToolbarStart` and\n * `ToolbarEnd` group the two ends; `ToolbarSeparator` is a short vertical rule\n * between clusters of controls in the same group.\n */\nfunction Toolbar({ className, bordered, ...props }: ToolbarProps) {\n return (\n <div\n data-slot=\"toolbar\"\n role=\"toolbar\"\n className={cn(\n \"flex min-h-10 flex-wrap items-center gap-2 text-[color:var(--ds-foreground)]\",\n bordered && \"border-b border-[var(--ds-border-subtle)] pb-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ToolbarStart({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-start\"\n className={cn(\"flex min-w-0 flex-1 flex-wrap items-center gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ToolbarEnd({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-end\"\n className={cn(\"ml-auto flex shrink-0 flex-wrap items-center gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ToolbarSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-separator\"\n role=\"none\"\n aria-hidden\n className={cn(\"mx-1 h-5 w-px shrink-0 self-center bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Toolbar, ToolbarStart, ToolbarEnd, ToolbarSeparator };\n","\"use client\";\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Tooltip.\n *\n * Base UI's Tooltip opens on hover and focus (never on click). Radix users:\n * `asChild` on the trigger becomes `render={<Button />}`, and the delay moves\n * from `delayDuration` on the Provider to `delay` on the Provider or Trigger.\n * `TooltipContent` composes Portal + Positioner + Popup so the consumer still\n * writes one element; `side`, `align` and `sideOffset` are forwarded to the\n * Positioner where Base UI expects them. Base UI sets no ARIA role on the\n * popup; `role=\"tooltip\"` is added here so it reads like the Radix version.\n */\nfunction TooltipProvider(props: TooltipPrimitive.Provider.Props) {\n return <TooltipPrimitive.Provider {...props} />;\n}\n\nfunction Tooltip(props: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root {...props} />;\n}\n\nfunction TooltipTrigger(props: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\ntype PositionerProps = Pick<\n TooltipPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface TooltipContentProps extends TooltipPrimitive.Popup.Props, PositionerProps {\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: TooltipPrimitive.Portal.Props[\"container\"];\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n align = \"center\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: TooltipContentProps) {\n return (\n <TooltipPrimitive.Portal keepMounted={keepMounted} container={container}>\n <TooltipPrimitive.Positioner\n data-slot=\"tooltip-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n role=\"tooltip\"\n className={cn(\n \"overflow-hidden px-3 py-1.5\",\n \"rounded-[var(--ds-radius-sm)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-md)]\",\n \"text-[length:var(--ds-text-caption-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport { useCallback, useEffect, useSyncExternalStore } from \"react\";\n\n/**\n * useCortenaTheme — the one theme bridge for every Cortena surface.\n *\n * cortena-design drives dark mode off `data-theme=\"light\" | \"dark\"` on <html>\n * and falls back to `prefers-color-scheme` when the attribute is absent. So the\n * hook has exactly three jobs, consolidated from the flux and engram copies:\n *\n * 1. Remember the last choice in localStorage and put it back before the\n * first paint (`applyStoredTheme`, or `themeInitScript` as a blocking\n * <script> for apps that cannot run a module that early).\n * 2. Listen for the message cortenaweb posts into an extension iframe on load\n * and on every theme change:\n *\n * iframe.contentWindow.postMessage({ type: \"cortena-theme\", colors }, \"*\")\n *\n * and apply the *mode* it implies. The host may say `mode` or `theme`\n * explicitly; otherwise the background colour's luminance decides.\n * 3. Expose `{ theme, resolvedTheme, setTheme }` so a settings toggle can\n * drive the same state.\n *\n * What it deliberately does NOT do is apply the individual colours in the\n * host's message. The palette comes from cortena-design tokens, the single\n * source of truth; writing the host's raw values onto `--ds-*` or `--color-*`\n * would silently override every token the design system publishes. The\n * `colors` object is read for its luminance only, never written to the DOM.\n */\n\nexport type CortenaTheme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedCortenaTheme = \"light\" | \"dark\";\n\n/** The message cortenaweb posts into an embedded iframe. */\nexport interface CortenaThemeMessage {\n type: \"cortena-theme\";\n /** Explicit mode. Preferred when present. */\n theme?: CortenaTheme;\n /** Older name for `theme`, sent by some hosts. */\n mode?: CortenaTheme;\n /** Raw palette. Only `background` is read, and only to infer the mode. */\n colors?: Record<string, unknown>;\n}\n\nexport interface UseCortenaThemeOptions {\n /** localStorage key the choice persists under. Defaults to `\"cortena.theme\"`. */\n storageKey?: string;\n /**\n * Origins allowed to push a theme via postMessage. When omitted or empty,\n * every origin is accepted — matching cortenaweb, which posts with `\"*\"`\n * to cross-origin extensions. A same-origin embed should pass\n * `[window.location.origin]`.\n */\n allowedOrigins?: readonly string[];\n /** Set false to keep the state and DOM sync but ignore host messages. */\n listen?: boolean;\n}\n\nexport interface UseCortenaThemeResult {\n /** The stored choice; `\"system\"` when nothing has been chosen. */\n theme: CortenaTheme;\n /** What is actually painted: `theme`, or the OS scheme when `theme` is `\"system\"`. */\n resolvedTheme: ResolvedCortenaTheme;\n setTheme: (theme: CortenaTheme) => void;\n}\n\nexport const DEFAULT_THEME_STORAGE_KEY = \"cortena.theme\";\nexport const THEME_MESSAGE_TYPE = \"cortena-theme\";\nconst CHANGE_EVENT = \"cortena-theme-change\";\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\nfunction isTheme(value: unknown): value is CortenaTheme {\n return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\n/* ── DOM ─────────────────────────────────────────────────────────────────── */\n\n/**\n * Write the mode onto <html>. `\"system\"` removes the attribute so\n * cortena-design's `:root:not([data-theme])` fallback follows the OS.\n */\nexport function applyTheme(theme: CortenaTheme, root: HTMLElement = document.documentElement): void {\n if (theme === \"system\") {\n root.removeAttribute(\"data-theme\");\n } else {\n root.setAttribute(\"data-theme\", theme);\n }\n}\n\n/* ── storage ─────────────────────────────────────────────────────────────── */\n\nexport function readStoredTheme(storageKey: string = DEFAULT_THEME_STORAGE_KEY): CortenaTheme {\n try {\n const raw = window.localStorage.getItem(storageKey);\n return isTheme(raw) ? raw : \"system\";\n } catch {\n // Storage partitioned or blocked in a third-party iframe: the system\n // preference still applies, and the host will post the mode again.\n return \"system\";\n }\n}\n\nfunction writeStoredTheme(theme: CortenaTheme, storageKey: string): void {\n try {\n window.localStorage.setItem(storageKey, theme);\n } catch {\n /* cannot persist; the attribute is still applied for this document */\n }\n}\n\n/**\n * Put the remembered mode back on <html>. Tiny and synchronous on purpose:\n * call it at the top of the app entry, before `createRoot`, so a reload does\n * not flash the light palette at somebody reading in the dark. Returns what\n * it applied.\n */\nexport function applyStoredTheme(storageKey: string = DEFAULT_THEME_STORAGE_KEY): CortenaTheme {\n if (typeof document === \"undefined\") {\n return \"system\";\n }\n const theme = readStoredTheme(storageKey);\n applyTheme(theme);\n return theme;\n}\n\n/**\n * The same logic as `applyStoredTheme` as a self-contained IIFE string, for\n * consumers that inject a blocking `<script>` into <head> (Next.js\n * `dangerouslySetInnerHTML`, or a Vite index.html). It cannot import anything,\n * which is why it is duplicated rather than derived.\n */\nexport function getThemeInitScript(storageKey: string = DEFAULT_THEME_STORAGE_KEY): string {\n return `(function(){var k=${JSON.stringify(storageKey)};var d=document.documentElement;var v=null;try{v=localStorage.getItem(k)}catch(e){}if(v===\"light\"||v===\"dark\"){d.setAttribute(\"data-theme\",v)}else{d.removeAttribute(\"data-theme\")}})();`;\n}\n\n/** `getThemeInitScript()` for the default storage key. */\nexport const themeInitScript: string = getThemeInitScript();\n\n/* ── host message ────────────────────────────────────────────────────────── */\n\n/**\n * Infer the mode from a hex background colour by relative luminance. Any\n * other colour syntax is ignored, since the host only ever sends hex and a\n * wrong guess is worse than no change.\n */\nexport function themeFromBackground(background: unknown): ResolvedCortenaTheme | null {\n if (typeof background !== \"string\") {\n return null;\n }\n const match = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(background.trim());\n if (!match?.[1]) {\n return null;\n }\n const hex = match[1].length === 3 ? [...match[1]].map((c) => c + c).join(\"\") : match[1];\n const channel = (i: number) => {\n const c = parseInt(hex.slice(i, i + 2), 16) / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const luminance = 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);\n return luminance < 0.5 ? \"dark\" : \"light\";\n}\n\nfunction isThemeMessage(data: unknown): data is CortenaThemeMessage {\n return (\n typeof data === \"object\" &&\n data !== null &&\n (data as { type?: unknown }).type === THEME_MESSAGE_TYPE\n );\n}\n\n/**\n * The mode a host message asks for, or null when it does not carry one.\n * Explicit `theme` / `mode` win; otherwise the background luminance decides.\n */\nexport function themeFromMessage(data: unknown): CortenaTheme | null {\n if (!isThemeMessage(data)) {\n return null;\n }\n if (isTheme(data.theme)) {\n return data.theme;\n }\n if (isTheme(data.mode)) {\n return data.mode;\n }\n return themeFromBackground(data.colors?.background);\n}\n\n/* ── store ───────────────────────────────────────────────────────────────── */\n\nfunction subscribeTheme(onChange: () => void): () => void {\n window.addEventListener(CHANGE_EVENT, onChange);\n window.addEventListener(\"storage\", onChange);\n return () => {\n window.removeEventListener(CHANGE_EVENT, onChange);\n window.removeEventListener(\"storage\", onChange);\n };\n}\n\n// jsdom (the extensions' test environment) has no matchMedia; treat its\n// absence as a light system scheme that never changes, rather than throwing.\nfunction schemeQuery(): MediaQueryList | null {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_QUERY)\n : null;\n}\n\nfunction subscribeScheme(onChange: () => void): () => void {\n const query = schemeQuery();\n query?.addEventListener(\"change\", onChange);\n const unsubscribeTheme = subscribeTheme(onChange);\n return () => {\n query?.removeEventListener(\"change\", onChange);\n unsubscribeTheme();\n };\n}\n\nfunction systemScheme(): ResolvedCortenaTheme {\n return schemeQuery()?.matches ? \"dark\" : \"light\";\n}\n\n/* ── hook ────────────────────────────────────────────────────────────────── */\n\nexport function useCortenaTheme(options: UseCortenaThemeOptions = {}): UseCortenaThemeResult {\n const { storageKey = DEFAULT_THEME_STORAGE_KEY, allowedOrigins, listen = true } = options;\n\n const theme = useSyncExternalStore(\n subscribeTheme,\n () => readStoredTheme(storageKey),\n () => \"system\" as const,\n );\n\n const resolvedTheme = useSyncExternalStore(\n subscribeScheme,\n () => (theme === \"system\" ? systemScheme() : theme),\n () => \"light\" as const,\n );\n\n const setTheme = useCallback(\n (next: CortenaTheme) => {\n writeStoredTheme(next, storageKey);\n applyTheme(next);\n window.dispatchEvent(new Event(CHANGE_EVENT));\n },\n [storageKey],\n );\n\n // Keep <html> in step with the store, including a change made in another tab.\n useEffect(() => {\n applyTheme(theme);\n }, [theme]);\n\n // Joined so a fresh array literal on every render does not re-subscribe.\n const originsKey = allowedOrigins?.join(\" \") ?? \"\";\n useEffect(() => {\n if (!listen) {\n return;\n }\n const origins = originsKey ? new Set(originsKey.split(\" \")) : null;\n const onMessage = (event: MessageEvent) => {\n if (origins && !origins.has(event.origin)) {\n return;\n }\n const next = themeFromMessage(event.data);\n if (next) {\n setTheme(next);\n }\n };\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n // A new array literal each render must not re-subscribe.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [listen, setTheme, allowedOrigins?.join(\"\u0000\")]);\n\n return { theme, resolvedTheme, setTheme };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["BaseButton","Element","ResponsiveContainer","RechartsTooltip","RechartsLegend","BarChart","CartesianGrid","XAxis","YAxis","Bar","LineChart","Line","AreaChart","Area","PieChart","Pie","Cell","ScatterChart","series","Scatter","RadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","Radar","FunnelChart","Funnel","BaseCheckbox","MenuPrimitive","itemClassName","SelectPrimitive","createTanstackColumnHelper","PopoverPrimitive","FieldPrimitive","FieldsetPrimitive","BaseProgress","BaseRadioGroup","BaseSeparator","BaseSwitch","TabsPrimitive","DataTableView","views.ColumnView","views.RowView","views.CardView","views.SectionCardView","views.DividerView","views.SpacerView","views.TextView","views.MarkdownView","views.TextFieldView","views.TextAreaView","views.SelectView","views.CheckboxView","views.SwitchView","views.RadioGroupView","views.DateFieldView","views.ButtonView","views.ButtonLinkView","views.BadgeView","views.AlertView","views.ProgressViewComponent","views.StatusDotView","views.EmptyStateView","views.DataTableView","views.ChartView","views.TabsView","views.ImageView","views.LinkView","AccordionPrimitive","AvatarPrimitive","ComboboxPrimitive","DialogPrimitive","CommandPrimitive","ScrollAreaPrimitive","SheetPrimitive","ToastPrimitive","TooltipPrimitive"],"sources":["../src/lib/cn.ts","../src/components/alert.tsx","../src/components/badge.tsx","../src/components/button.tsx","../src/lib/render.tsx","../src/components/button-link.tsx","../src/components/card.tsx","../src/components/skeleton.tsx","../src/components/chart/tokens.ts","../src/components/chart/container.tsx","../src/components/chart/data.ts","../src/components/chart/nivo-theme.ts","../src/components/chart/nivo-charts.tsx","../src/components/chart/recharts-charts.tsx","../src/components/chart/types.ts","../src/components/chart/chart.tsx","../src/components/checkbox.tsx","../src/components/error-banner.tsx","../src/components/input.tsx","../src/components/spinner.tsx","../src/components/dropdown-menu.tsx","../src/components/select.tsx","../src/components/data-table/export.ts","../src/components/data-table/parts.tsx","../src/components/data-table/features.ts","../src/components/data-table/system-columns.tsx","../src/components/data-table/use-server-source.ts","../src/components/data-table/use-data-table.ts","../src/components/data-table/data-table.tsx","../src/components/calendar.tsx","../src/components/popover.tsx","../src/components/date-field.tsx","../src/components/empty-state.tsx","../src/components/label.tsx","../src/components/field.tsx","../src/components/markdown.tsx","../src/components/progress.tsx","../src/components/radio-group.tsx","../src/components/section-card.tsx","../src/components/separator.tsx","../src/components/status-dot.tsx","../src/components/switch.tsx","../src/components/tabs.tsx","../src/components/textarea.tsx","../src/a2ui/views.tsx","../src/a2ui/catalogue.ts","../src/a2ui/message.ts","../src/a2ui/catalogue-doc.ts","../src/a2ui/renderer.tsx","../src/components/accordion.tsx","../src/components/avatar.tsx","../src/components/breadcrumb.tsx","../src/components/chip.tsx","../src/components/combobox.tsx","../src/components/dialog.tsx","../src/components/command.tsx","../src/components/date-picker.tsx","../src/components/dropzone.tsx","../src/components/form.tsx","../src/components/kbd.tsx","../src/components/loading-skeleton.tsx","../src/components/page-header.tsx","../src/components/scroll-area.tsx","../src/components/segmented.tsx","../src/components/sheet.tsx","../src/components/sortable-list.tsx","../src/components/toast.tsx","../src/components/toolbar.tsx","../src/components/tooltip.tsx","../src/hooks/use-cortena-theme.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names the shadcn way: clsx for conditionals, tailwind-merge so a\n * consumer's `className` wins over a component's default for the same utility.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Alert — an inline callout. Tinted variants use the `-soft` fill for the\n * background and the tone colour for the border and icon; the body text stays\n * on the foreground token so it reads in both themes.\n *\n * The error tone is `destructive`, the same spelling Button uses; `danger` is\n * a deprecated alias of it and paints identically.\n */\nconst DESTRUCTIVE_ALERT =\n \"bg-[var(--ds-destructive-soft)] border-[var(--ds-destructive)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-destructive)]\";\n\nconst alertVariants = cva(\n [\n \"flex gap-3 rounded-[var(--ds-radius-md)] border px-3.5 py-3\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)]\",\n \"text-[color:var(--ds-foreground)]\",\n ],\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--ds-card)] border-[var(--ds-border-subtle)] [&_[data-slot=alert-icon]]:text-[color:var(--ds-muted-foreground)]\",\n success:\n \"bg-[var(--ds-success-soft)] border-[var(--ds-success)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-success)]\",\n warn: \"bg-[var(--ds-warning-soft)] border-[var(--ds-warning)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-warning)]\",\n destructive: DESTRUCTIVE_ALERT,\n /** @deprecated Use `destructive`, the name Button and Badge use; this alias paints the same. */\n danger: DESTRUCTIVE_ALERT,\n info: \"bg-[var(--ds-info-soft)] border-[var(--ds-info)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-info)]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface AlertProps\n extends React.ComponentProps<\"div\">, VariantProps<typeof alertVariants> {}\n\nfunction Alert({ className, variant, ...props }: AlertProps) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertIcon({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-icon\"\n className={cn(\"shrink-0 self-start [&_svg]:size-4.5 [&_svg]:shrink-0\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\"self-start font-semibold text-[color:var(--ds-foreground)]\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"mt-0.5 self-start text-[color:var(--ds-muted-foreground)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertIcon, AlertTitle, AlertDescription, alertVariants };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Badge — the mono, uppercase status label. Each tone pairs a `-soft` fill\n * with its foreground token. The error tone is `destructive`, the same\n * spelling Button and Alert use; `warn`, `danger` and `secondary` are\n * deprecated aliases kept for cortenaweb call sites and paint identically.\n */\nconst DESTRUCTIVE_BADGE = \"bg-[var(--ds-destructive-soft)] text-[color:var(--ds-destructive)]\";\n\nconst badgeVariants = cva(\n [\n \"inline-flex items-center gap-1.5 px-1.5 py-0.5 whitespace-nowrap\",\n \"rounded-[var(--ds-radius-sm)]\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-sm)] font-medium uppercase\",\n \"tracking-[var(--ds-text-eyebrow--letter-spacing)] leading-[var(--ds-text-caption-sm--line-height)]\",\n \"[&_svg]:size-3 [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n default: \"bg-[var(--ds-primary-soft)] text-[color:var(--ds-primary-soft-foreground)]\",\n success: \"bg-[var(--ds-success-soft)] text-[color:var(--ds-success)]\",\n warning: \"bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n /** @deprecated Use `warning`; this alias paints the same. */\n warn: \"bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n destructive: DESTRUCTIVE_BADGE,\n /** @deprecated Use `destructive`, the name Button and Alert use; this alias paints the same. */\n danger: DESTRUCTIVE_BADGE,\n info: \"bg-[var(--ds-info-soft)] text-[color:var(--ds-info)]\",\n neutral: \"bg-[var(--ds-hover)] text-[color:var(--ds-muted-foreground)]\",\n secondary: \"bg-[var(--ds-hover)] text-[color:var(--ds-muted-foreground)]\",\n outline:\n \"bg-transparent border border-[var(--ds-border)] text-[color:var(--ds-muted-foreground)]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.ComponentProps<\"span\">, VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <span data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport { Button as BaseButton } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Button.\n *\n * Base UI supplies the behaviour (native button semantics, `focusableWhenDisabled`,\n * keyboard activation on non-button elements through `render`). Every visual\n * value is a cortena-design token; nothing here is a literal the lint would flag.\n *\n * Radix users: `asChild` is gone. Pass `render={<a href=... />}` to change the\n * rendered element, which is Base UI's equivalent.\n */\nconst buttonVariants = cva(\n [\n \"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap\",\n \"font-medium\",\n \"rounded-[var(--ds-radius-md)]\",\n \"border\",\n \"transition-[background-color,border-color,color,box-shadow,filter]\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ds-primary)] bg-[var(--ds-primary)] text-[color:var(--ds-primary-foreground)] hover:border-[var(--ds-primary-hover)] hover:bg-[var(--ds-primary-hover)]\",\n secondary:\n \"border-[var(--ds-border)] bg-[var(--ds-secondary)] text-[color:var(--ds-secondary-foreground)] hover:border-[var(--ds-border-strong)] hover:bg-[var(--ds-hover)]\",\n outline:\n \"border-[var(--ds-border-strong)] bg-transparent text-[color:var(--ds-foreground)] hover:bg-[var(--ds-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n soft:\n \"border-transparent bg-[var(--ds-primary-soft)] text-[color:var(--ds-primary-soft-foreground)] hover:bg-[var(--ds-primary-soft)] hover:brightness-95\",\n destructive:\n \"border-[var(--ds-destructive)] bg-[var(--ds-destructive)] text-[color:var(--ds-destructive-foreground)] hover:brightness-110\",\n link: \"border-transparent bg-transparent text-[color:var(--ds-primary)] underline-offset-4 hover:underline\",\n },\n size: {\n sm: \"h-8 px-3 text-[length:var(--ds-text-caption)] rounded-[var(--ds-radius-sm)] [&_svg]:size-3.5\",\n md: \"h-9 px-4 text-[length:var(--ds-text-caption-lg)] [&_svg]:size-4\",\n lg: \"h-10 px-5 text-[length:var(--ds-text-body-sm)] [&_svg]:size-4\",\n icon: \"size-9 [&_svg]:size-4\",\n \"icon-sm\": \"size-8 rounded-[var(--ds-radius-sm)] [&_svg]:size-3.5\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ComponentProps<typeof BaseButton>, VariantProps<typeof buttonVariants> {}\n\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\n return (\n <BaseButton\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import type * as React from \"react\";\n\n/**\n * The `render` prop for the components that are plain markup rather than Base\n * UI primitives (Card, SectionCard, ButtonLink, BreadcrumbLink).\n *\n * Base UI parts take their own `render` and need nothing from here. The rest\n * are a `<div>` or an `<a>` this package writes itself, and a consumer\n * sometimes needs a different element under the same styling: a Card that is\n * the page's `<aside>` landmark, or a link that is the router's `<Link>`.\n * Passing an element rather than a component keeps the call site readable and\n * lets the caller set props on it (`render={<Link to=\"/x\" />}`).\n *\n * `props` wins over the passed element's own props, so the `className` and\n * handlers a component computed are not silently dropped, while the element's\n * own props (`href`, `to`, `aria-labelledby`) come through untouched. What a\n * component lets a *caller* override is decided by the order it builds `props`\n * in, not here. Children are `children`, falling back to the element's.\n */\nexport type RenderProp = React.ReactElement<Record<string, unknown>>;\n\nexport function renderWith(\n render: RenderProp | undefined,\n props: Record<string, unknown>,\n children: React.ReactNode,\n Fallback: React.ElementType,\n): React.ReactElement {\n if (!render) {\n const Element = Fallback;\n return <Element {...props}>{children}</Element>;\n }\n const Element = render.type as React.ElementType;\n const given = render.props as { children?: React.ReactNode };\n return (\n <Element {...(render.props as Record<string, unknown>)} {...props}>\n {children ?? given.children}\n </Element>\n );\n}\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\nimport { buttonVariants, type ButtonProps } from \"@/components/button\";\n\n/**\n * An anchor that looks like a Button and keeps link semantics.\n *\n * `Button render={<a />}` makes Base UI treat the anchor as a button (role,\n * tabindex, its `nativeButton` warning), which demotes real navigation for\n * assistive technology and breaks `getByRole(\"link\")`. Navigation should stay\n * an anchor. This is the migration target for every Radix-era\n * `<Button asChild><Link /></Button>`.\n *\n * Framework routers: pass `render` with the router's link so the styling and\n * `href` land on it, e.g. `render={<NextLink href=\"/x\" />}`; otherwise it\n * renders a plain `<a>`.\n */\nexport interface ButtonLinkProps\n extends Omit<React.ComponentProps<\"a\">, \"children\">,\n Pick<ButtonProps, \"variant\" | \"size\"> {\n children?: React.ReactNode;\n /** Replace the rendered `<a>` with a router link; props are merged onto it. */\n render?: RenderProp;\n disabled?: boolean;\n}\n\nfunction ButtonLink({ className, variant, size, render, disabled, children, ...props }: ButtonLinkProps) {\n const classes = cn(buttonVariants({ variant, size }), disabled && \"pointer-events-none opacity-50\", className);\n const merged = {\n ...props,\n \"data-slot\": \"button-link\",\n className: classes,\n \"aria-disabled\": disabled || undefined,\n tabIndex: disabled ? -1 : props.tabIndex,\n };\n return renderWith(render, merged, children, \"a\");\n}\n\nexport { ButtonLink };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\n\nexport interface CardProps extends React.ComponentProps<\"div\"> {\n /** Lift the border and surface on hover, for clickable cards. */\n hover?: boolean;\n /** Draw the border in the ring colour, for a selected or highlighted card. */\n accent?: boolean;\n /**\n * Replace the rendered `<div>` with another element, so a card can *be* the\n * landmark rather than sit inside a wrapper that is one:\n * `render={<aside />}` for a sidebar panel, `render={<section />}` (with an\n * `aria-labelledby` pointing at its title) for a labelled region,\n * `render={<article />}` for a self-contained item in a feed. Props set on\n * the passed element come through; the card's own styling wins.\n */\n render?: RenderProp;\n}\n\n/**\n * Card — the bordered surface everything else sits on. `render` changes the\n * element without changing the look, which is how a card becomes a landmark.\n */\nfunction Card({ className, hover, accent, render, children, ...props }: CardProps) {\n return renderWith(\n render,\n {\n // data-slot first: SectionCard (and any other composer) overrides it.\n \"data-slot\": \"card\",\n \"data-accent\": accent ? \"\" : undefined,\n ...props,\n className: cn(\n \"flex flex-col rounded-[var(--ds-radius-lg)] border bg-[var(--ds-card)] text-[color:var(--ds-foreground)]\",\n \"transition-[border-color,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n accent ? \"border-[var(--ds-ring)]\" : \"border-[var(--ds-border-subtle)]\",\n hover && \"hover:border-[var(--ds-border)] hover:bg-[var(--ds-popover)]\",\n className,\n ),\n },\n children,\n \"div\",\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\"flex flex-col gap-1.5 p-5 pb-3\", className)}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold\",\n \"leading-[var(--ds-text-h1--line-height)] tracking-[var(--ds-text-h1--letter-spacing)]\",\n \"text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-content\" className={cn(\"p-5 pt-0\", className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center gap-2 border-t border-[var(--ds-border-subtle)] p-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Skeleton — a pulsing placeholder block. Sized by the consumer (`h-4 w-40`);\n * the fill is the border token, which reads on the canvas, a card and a\n * popover in both themes.\n */\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n aria-hidden\n className={cn(\"animate-pulse rounded-[var(--ds-radius-sm)] bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { vizSeries } from \"cortena-design/tokens\";\n\n/**\n * Token plumbing for the chart engines.\n *\n * Recharts draws SVG, so it can take `var(--ds-viz-1)` verbatim and the\n * browser resolves it. Nivo cannot: its canvas renderer hands colours to a\n * 2D context, and its SVG renderer runs colours through d3-color for label and\n * border derivation, and neither understands `var()`. So every Nivo value is\n * read from the `--ds-*` custom property at runtime and handed over as a\n * concrete hex. Nothing in this file is a literal; on the server (no DOM) the\n * `var()` form is returned so SSR markup still resolves in the browser.\n */\n\n/** Number of categorical series colours the design system defines (`--ds-viz-1..n`). */\nexport const VIZ_SERIES_COUNT = vizSeries.length;\n\n/** `var(--ds-viz-N)` for a zero-based series index, wrapping past the palette. */\nexport function vizVar(index: number): string {\n const n = VIZ_SERIES_COUNT;\n return `var(--ds-viz-${(((index % n) + n) % n) + 1})`;\n}\n\n/** The categorical palette as `var()` references, in series order. */\nexport const vizSeriesVars: readonly string[] = Array.from({ length: VIZ_SERIES_COUNT }, (_, i) =>\n vizVar(i),\n);\n\nfunction hasDom(): boolean {\n return typeof document !== \"undefined\" && typeof getComputedStyle === \"function\";\n}\n\n/** Read a custom property as the browser computes it on `el` (default: `<html>`). */\nexport function readToken(name: string, el?: Element | null): string {\n if (!hasDom()) return \"\";\n return getComputedStyle(el ?? document.documentElement).getPropertyValue(name).trim();\n}\n\n/** A `--ds-text-*` size (rem or px) as a pixel number, for engines that want numbers. */\nexport function tokenPx(name: string, el?: Element | null): number | undefined {\n const raw = readToken(name, el);\n if (!raw) return undefined;\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) return undefined;\n if (raw.endsWith(\"rem\")) {\n const root = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return n * root;\n }\n return n;\n}\n\nlet probe: CanvasRenderingContext2D | null | undefined;\n\nfunction hex2(n: number): string {\n return n.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Convert any CSS colour the browser understands (oklch, color-mix, rgba…) to\n * `#rrggbb`, by painting it into an offscreen 2D context. Alpha is composited\n * against transparent, so translucent tokens come back opaque; chart fills\n * never use those.\n */\nexport function toHex(css: string): string | undefined {\n if (!hasDom() || !css) return undefined;\n if (probe === undefined) {\n probe = document.createElement(\"canvas\").getContext(\"2d\", { willReadFrequently: true });\n }\n if (!probe) return undefined;\n probe.clearRect(0, 0, 1, 1);\n probe.fillStyle = css;\n probe.fillRect(0, 0, 1, 1);\n const d = probe.getImageData(0, 0, 1, 1).data;\n return `#${hex2(d[0] ?? 0)}${hex2(d[1] ?? 0)}${hex2(d[2] ?? 0)}`;\n}\n\n/**\n * A token as a concrete colour. Returns hex in the browser; on the server the\n * `var()` form, which is fine for SVG markup and irrelevant for canvas.\n */\nexport function resolveColor(token: string, el?: Element | null): string {\n return toHex(readToken(token, el)) ?? `var(${token})`;\n}\n\n/** The categorical palette resolved to concrete colours, in series order. */\nexport function resolveVizSeries(el?: Element | null): string[] {\n return vizSeriesVars.map((_, i) => resolveColor(`--ds-viz-${i + 1}`, el));\n}\n\n/** Relative luminance of a `#rrggbb`, for choosing a scale direction. */\nfunction luminance(hex: string): number {\n const c = (i: number) => {\n const v = Number.parseInt(hex.slice(i, i + 2), 16) / 255;\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * c(1) + 0.7152 * c(3) + 0.0722 * c(5);\n}\n\n/**\n * A label colour that reads on a given fill: the design system's ink on light\n * fills, its white on dark ones. Nivo cells and arcs paint their labels with\n * this so a value on a deep sequential cell stays legible.\n */\nexport function contrastLabel(el?: Element | null): (fill: string) => string {\n const ink = resolveColor(\"--ds-base-text-ink\", el);\n const white = resolveColor(\"--ds-base-white\", el);\n return (fill: string) => {\n const hex = fill.startsWith(\"#\") && fill.length === 7 ? fill : toHex(fill);\n return hex && luminance(hex) < 0.3 ? white : ink;\n };\n}\n\n/** True when the resolved `--ds-background` is dark, whatever set the theme (attribute or OS). */\nexport function isDarkSurface(el?: Element | null): boolean {\n const bg = toHex(readToken(\"--ds-background\", el));\n return bg ? luminance(bg) < 0.4 : false;\n}\n\n/** Linear interpolation through a list of hex stops; `t` in [0, 1]. */\nexport function piecewiseHex(stops: string[]): (t: number) => string {\n const rgb = stops.map((h) => [1, 3, 5].map((i) => Number.parseInt(h.slice(i, i + 2), 16)));\n return (t: number) => {\n const clamped = Math.min(1, Math.max(0, Number.isNaN(t) ? 0 : t));\n const pos = clamped * (rgb.length - 1);\n const i = Math.max(0, Math.min(rgb.length - 2, Math.floor(pos)));\n const f = pos - i;\n const a = rgb[i] ?? [0, 0, 0];\n const b = rgb[i + 1] ?? a;\n const mix = (k: number) => Math.round((a[k] ?? 0) + ((b[k] ?? 0) - (a[k] ?? 0)) * f);\n return `#${hex2(mix(0))}${hex2(mix(1))}${hex2(mix(2))}`;\n };\n}\n\nexport interface ChartScales {\n /** Low → high, as concrete hex stops. */\n sequential: string[];\n /** Negative → neutral → positive, as concrete hex stops. */\n diverging: string[];\n /** Interpolators over the stops, `t` in [0, 1], for Nivo's `interpolator` configs. */\n sequentialInterpolator: (t: number) => string;\n divergingInterpolator: (t: number) => string;\n /** `n` evenly spaced sequential swatches, for quantised fills like the calendar. */\n sequentialSteps: (n: number) => string[];\n /** Fill for cells with no value. */\n empty: string;\n /** The chart's surface (`--ds-background`), for the gaps between cells and arcs. */\n surface: string;\n}\n\n/**\n * Sequential and diverging scales from the tokens.\n *\n * The token set has only the eight categorical `--ds-viz-*` colours and no\n * sequential ramp, so the sequential scale is derived from the\n * `--ds-primary-100..900` ladder: light surfaces run 100 → 700 (pale to deep),\n * dark surfaces run 900 → 400 (deep to bright), so low values sit near the\n * background in both themes. The diverging scale runs `--ds-viz-5` (rose)\n * through the theme's neutral (`--ds-neutral-200` light, `--ds-neutral-700`\n * dark) to `--ds-viz-1` (blue).\n */\nexport function chartScales(el?: Element | null): ChartScales {\n const dark = isDarkSurface(el);\n const seqTokens = dark\n ? [\"--ds-primary-900\", \"--ds-primary-800\", \"--ds-primary-600\", \"--ds-primary-400\"]\n : [\"--ds-primary-100\", \"--ds-primary-300\", \"--ds-primary-500\", \"--ds-primary-700\"];\n const sequential = seqTokens.map((t) => resolveColor(t, el));\n const diverging = [\"--ds-viz-5\", dark ? \"--ds-neutral-700\" : \"--ds-neutral-200\", \"--ds-viz-1\"].map(\n (t) => resolveColor(t, el),\n );\n const sequentialInterpolator = piecewiseHex(sequential);\n const divergingInterpolator = piecewiseHex(diverging);\n return {\n sequential,\n diverging,\n sequentialInterpolator,\n divergingInterpolator,\n sequentialSteps: (n) =>\n Array.from({ length: n }, (_, i) => sequentialInterpolator(n === 1 ? 1 : i / (n - 1))),\n empty: resolveColor(\"--ds-muted\", el),\n surface: resolveColor(\"--ds-background\", el),\n };\n}\n\n/**\n * A counter that bumps whenever the theme may have changed: the `data-theme`\n * or `class` attribute on `<html>`, or the OS colour scheme. Resolved token\n * values are memoised on it so Nivo re-reads them on a flip.\n */\nexport function useThemeVersion(): number {\n const [version, setVersion] = useState(0);\n useEffect(() => {\n if (!hasDom()) return;\n const bump = () => setVersion((v) => v + 1);\n const observer = new MutationObserver(bump);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\", \"class\", \"style\"],\n });\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n media?.addEventListener?.(\"change\", bump);\n return () => {\n observer.disconnect();\n media?.removeEventListener?.(\"change\", bump);\n };\n }, []);\n return version;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Legend as RechartsLegend,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n type LegendPayload,\n type LegendProps,\n type TooltipContentProps,\n type TooltipProps,\n} from \"recharts\";\nimport { cn } from \"@/lib/cn\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { vizVar } from \"./tokens\";\nimport type { ChartConfig } from \"./types\";\n\n/* ── context ─────────────────────────────────────────────────────────────── */\n\ninterface ChartContextValue {\n config: ChartConfig;\n /** The container element, so token resolution can honour a nested theme scope. */\n element: HTMLDivElement | null;\n}\n\nconst ChartContext = React.createContext<ChartContextValue | null>(null);\n\n/** The nearest ChartContainer's config and element; null outside one. */\nexport function useChart(): ChartContextValue | null {\n return React.useContext(ChartContext);\n}\n\n/**\n * Resolve the colour a series key paints with: `config[key].color` when set,\n * otherwise `var(--ds-viz-N)` by the key's position in the config (or the\n * `index` given). Recharts consumers reference it as `var(--color-<key>)`,\n * which ChartContainer defines on its element.\n */\nexport function seriesColor(config: ChartConfig | undefined, key: string, index?: number): string {\n const entry = config?.[key];\n if (entry?.color) return entry.color;\n const keys = config ? Object.keys(config) : [];\n const position = keys.indexOf(key);\n return vizVar(position >= 0 ? position : (index ?? 0));\n}\n\n/* ── container ───────────────────────────────────────────────────────────── */\n\nexport interface ChartContainerProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n /** Series presentation; colours default to `--ds-viz-1..n` in key order. */\n config?: ChartConfig;\n /** Height of the drawing area; width is always 100% of the parent. Default 300. */\n height?: number | string;\n /**\n * Wrap children in Recharts' ResponsiveContainer (default). Nivo's\n * `Responsive*` components size themselves, so the Nivo renderers pass\n * `responsive={false}`.\n */\n responsive?: boolean;\n /**\n * Give the drawing area a floor of 600×300 so it draws where the layout\n * gives it none.\n *\n * Both engines size themselves from the parent box. Under jsdom nothing has\n * layout — every element measures 0×0 — so a page test that renders a screen\n * containing a Chart gets an empty `<div>` and can assert nothing about it.\n * `testMode` sets `min-width` / `min-height` on the container and hands the\n * same floor to Recharts' ResponsiveContainer, so the chart draws at\n * 600×300. It is a floor, not a fixed size: a parent that *does* give the\n * chart 900px still gets 900px, so a screenshot test is unaffected.\n */\n testMode?: boolean;\n children: React.ReactNode;\n}\n\n/** The box `testMode` falls back to when the layout gives the chart none. */\nconst TEST_WIDTH = 600;\nconst TEST_HEIGHT = 300;\n\n/**\n * ChartContainer — the sized, token-styled surface every chart draws in.\n *\n * It defines `--color-<key>` for each config key (so Recharts parts can say\n * `fill=\"var(--color-revenue)\"`) and styles Recharts' axis, grid, tick and\n * cursor classes from tokens with a caption-sm floor for text, so a custom\n * chart composed inside it needs no local colours or fonts.\n */\nfunction ChartContainer({\n config = {},\n height = 300,\n responsive = true,\n testMode = false,\n className,\n style,\n children,\n ...props\n}: ChartContainerProps) {\n const [element, setElement] = React.useState<HTMLDivElement | null>(null);\n const vars = React.useMemo(() => {\n const out: Record<string, string> = {};\n for (const key of Object.keys(config)) out[`--color-${key}`] = seriesColor(config, key);\n return out;\n }, [config]);\n const ctx = React.useMemo(() => ({ config, element }), [config, element]);\n\n return (\n <ChartContext.Provider value={ctx}>\n <div\n ref={setElement}\n data-slot=\"chart\"\n data-test-mode={testMode ? \"\" : undefined}\n className={cn(\n \"relative w-full min-w-0 overflow-hidden text-[length:var(--ds-text-caption-sm)] text-[color:var(--ds-foreground)]\",\n responsive ? \"flex justify-center\" : \"block [&>div]:h-full [&>div]:w-full\",\n \"[&_.recharts-cartesian-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-polar-angle-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-polar-radius-axis-tick-value]:fill-[var(--ds-muted-foreground)]\",\n \"[&_.recharts-cartesian-grid-horizontal_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-cartesian-grid-vertical_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-angle_line]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-concentric-polygon]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-polar-grid-concentric-circle]:stroke-[var(--ds-border-subtle)]\",\n \"[&_.recharts-cartesian-axis-line]:stroke-[var(--ds-border)]\",\n \"[&_.recharts-cartesian-axis-tick-line]:stroke-[var(--ds-border)]\",\n \"[&_.recharts-radial-bar-background-sector]:fill-[var(--ds-muted)]\",\n \"[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-[var(--ds-hover)]\",\n \"[&_.recharts-curve.recharts-tooltip-cursor]:stroke-[var(--ds-border-strong)]\",\n \"[&_.recharts-reference-line_line]:stroke-[var(--ds-border-strong)]\",\n \"[&_.recharts-pie-sector_.recharts-sector]:stroke-[var(--ds-card)]\",\n \"[&_.recharts-funnel-trapezoid_.recharts-trapezoid]:stroke-[var(--ds-card)]\",\n \"[&_.recharts-layer]:outline-hidden [&_.recharts-surface]:outline-hidden [&_.recharts-sector]:outline-hidden\",\n \"[&_text]:font-[family-name:var(--ds-font-body)]\",\n className,\n )}\n style={\n {\n height,\n ...(testMode ? { minWidth: TEST_WIDTH, minHeight: TEST_HEIGHT } : null),\n ...vars,\n ...style,\n } as React.CSSProperties\n }\n {...props}\n >\n {responsive ? (\n <ResponsiveContainer\n width=\"100%\"\n height=\"100%\"\n minWidth={testMode ? TEST_WIDTH : undefined}\n minHeight={testMode ? TEST_HEIGHT : undefined}\n >\n {children as React.ReactElement}\n </ResponsiveContainer>\n ) : (\n children\n )}\n </div>\n </ChartContext.Provider>\n );\n}\n\n/* ── states ──────────────────────────────────────────────────────────────── */\n\nfunction ChartState({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-[var(--ds-radius-md)] border border-dashed border-[var(--ds-border-subtle)]\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** \"No data\" placeholder; rendered by Chart when the data is empty. */\nfunction ChartEmpty({ children = \"No data\", ...props }: React.ComponentProps<\"div\">) {\n return (\n <ChartState data-slot=\"chart-empty\" role=\"status\" {...props}>\n {children}\n </ChartState>\n );\n}\n\n/** Error placeholder; rendered by Chart for an `error` prop or a failed Nivo chunk. */\nfunction ChartError({ className, children = \"Chart could not be rendered\", ...props }: React.ComponentProps<\"div\">) {\n return (\n <ChartState\n data-slot=\"chart-error\"\n role=\"alert\"\n className={cn(\"border-[var(--ds-destructive)] text-[color:var(--ds-destructive)]\", className)}\n {...props}\n >\n {children}\n </ChartState>\n );\n}\n\n/** Loading placeholder: a skeleton the size of the drawing area, shown while a Nivo chunk loads. */\nfunction ChartLoading({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"chart-loading\" className={cn(\"h-full w-full\", className)} {...props}>\n <Skeleton className=\"h-full w-full rounded-[var(--ds-radius-md)]\" />\n </div>\n );\n}\n\n/* ── tooltip ─────────────────────────────────────────────────────────────── */\n\nexport interface ChartTooltipContentProps\n extends Partial<Pick<TooltipContentProps, \"active\" | \"payload\" | \"label\">> {\n className?: string;\n /** Hide the series label column. */\n hideLabel?: boolean;\n /** Hide the colour swatch. */\n hideIndicator?: boolean;\n /** Format a value; defaults to `toLocaleString`. */\n formatter?: (value: number | string, name: string) => React.ReactNode;\n /** Format the header (the category). */\n labelFormatter?: (label: React.ReactNode) => React.ReactNode;\n}\n\nfunction formatValue(value: unknown, formatter?: ChartTooltipContentProps[\"formatter\"], name = \"\"): React.ReactNode {\n if (formatter && (typeof value === \"number\" || typeof value === \"string\")) return formatter(value, name);\n if (typeof value === \"number\") return value.toLocaleString();\n if (value == null) return \"\";\n return String(value);\n}\n\n/**\n * ChartTooltipContent — the popover body for Recharts' Tooltip, styled like\n * the package Tooltip on the popover tokens. Pass as `content` to\n * ChartTooltip; reads series labels and colours from the ChartContainer config.\n */\nfunction ChartTooltipContent({\n active,\n payload,\n label,\n className,\n hideLabel,\n hideIndicator,\n formatter,\n labelFormatter,\n}: ChartTooltipContentProps) {\n const chart = useChart();\n if (!active || !payload?.length) return null;\n const heading = labelFormatter ? labelFormatter(label) : label;\n return (\n <div\n data-slot=\"chart-tooltip\"\n className={cn(\n \"grid min-w-32 gap-1.5 rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-popover)] px-2.5 py-1.5\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-md)]\",\n className,\n )}\n >\n {!hideLabel && heading != null && heading !== \"\" ? (\n <div className=\"font-medium\">{heading}</div>\n ) : null}\n <div className=\"grid gap-1\">\n {payload.map((item, i) => {\n const key = String(item.dataKey ?? item.name ?? i);\n const entry = chart?.config[key];\n const colour = item.color ?? item.fill ?? item.stroke ?? `var(--color-${key})`;\n const name = entry?.label ?? item.name ?? key;\n return (\n <div key={key} className=\"flex items-center gap-2\">\n {hideIndicator ? null : (\n <span\n aria-hidden\n data-slot=\"chart-tooltip-indicator\"\n className=\"size-2 shrink-0 rounded-[var(--ds-radius-sm)]\"\n style={{ background: colour }}\n />\n )}\n <span className=\"flex-1 text-[color:var(--ds-muted-foreground)]\">{name}</span>\n <span className=\"font-[family-name:var(--ds-font-mono)] font-medium tabular-nums\">\n {formatValue(item.value, formatter, String(name))}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/** Recharts' Tooltip with the token-styled content and a subtle cursor. */\nfunction ChartTooltip(props: TooltipProps) {\n return <RechartsTooltip content={<ChartTooltipContent />} {...props} />;\n}\n\n/* ── legend ──────────────────────────────────────────────────────────────── */\n\nexport interface ChartLegendContentProps {\n payload?: readonly LegendPayload[];\n verticalAlign?: \"top\" | \"bottom\" | \"middle\";\n className?: string;\n hideIcon?: boolean;\n}\n\n/** ChartLegendContent — Recharts' legend on tokens; reads labels from the config. */\nfunction ChartLegendContent({ payload, verticalAlign = \"bottom\", className, hideIcon }: ChartLegendContentProps) {\n const chart = useChart();\n if (!payload?.length) return null;\n return (\n <div\n data-slot=\"chart-legend\"\n className={cn(\n \"flex flex-wrap items-center justify-center gap-x-4 gap-y-1\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {payload.map((item, i) => {\n const key = String(item.dataKey ?? item.value ?? i);\n const entry = chart?.config[key];\n const Icon = entry?.icon;\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {hideIcon ? null : Icon ? (\n <Icon />\n ) : (\n <span\n aria-hidden\n className=\"size-2 shrink-0 rounded-[var(--ds-radius-sm)]\"\n style={{ background: item.color ?? `var(--color-${key})` }}\n />\n )}\n {entry?.label ?? item.value}\n </div>\n );\n })}\n </div>\n );\n}\n\n/** Recharts' Legend with the token-styled content. */\nfunction ChartLegend(props: LegendProps) {\n return <RechartsLegend content={<ChartLegendContent />} {...props} />;\n}\n\nexport {\n ChartContainer,\n ChartContext,\n ChartEmpty,\n ChartError,\n ChartLoading,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n};\n","import type { ChartConfig, ChartMatrix, ChartRow, ChartSeries, ChartSlice, ChartTree } from \"./types\";\n\n/** True for the `{ id, data: [{ x, y }] }[]` series shape. */\nexport function isSeriesArray(data: unknown): data is ChartSeries[] {\n return (\n Array.isArray(data) &&\n data.length > 0 &&\n data.every((d) => d && typeof d === \"object\" && Array.isArray((d as ChartSeries).data))\n );\n}\n\n/** True for the `{ rows, columns, values }` categorical matrix shape. */\nexport function isMatrix(data: unknown): data is ChartMatrix {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) return false;\n const m = data as ChartMatrix;\n return Array.isArray(m.rows) && Array.isArray(m.columns) && Array.isArray(m.values);\n}\n\n/**\n * Pivot a categorical matrix onto the Nivo heatmap shape. Every row gets a\n * point for every column so the grid stays rectangular; a missing or\n * non-finite cell becomes `null`, which Nivo paints with `emptyColor` rather\n * than as a zero.\n */\nexport function matrixToSeries(matrix: ChartMatrix): ChartSeries[] {\n return matrix.rows.map((row, r) => ({\n id: row,\n data: matrix.columns.map((column, c) => {\n const value = matrix.values[r]?.[c];\n return { x: column, y: typeof value === \"number\" && Number.isFinite(value) ? value : null };\n }),\n }));\n}\n\n/**\n * Infer the category key and the series keys of a row array the way the\n * webchat renderer did: the first string field is the index, every numeric\n * field is a series. Falls back to the first key when nothing is a string.\n */\nexport function inferRowKeys(rows: ChartRow[]): { indexBy: string | undefined; keys: string[] } {\n const sample = rows[0];\n if (!sample) return { indexBy: undefined, keys: [] };\n let indexBy: string | undefined;\n const keys: string[] = [];\n for (const [key, value] of Object.entries(sample)) {\n if (typeof value === \"number\") keys.push(key);\n else if (!indexBy && typeof value === \"string\") indexBy = key;\n }\n if (!indexBy) indexBy = Object.keys(sample)[0];\n return { indexBy, keys };\n}\n\nexport interface RowData {\n rows: ChartRow[];\n indexBy: string;\n keys: string[];\n}\n\n/**\n * Normalise bar/line/area/radar data to rows. Series input is pivoted so each\n * distinct x becomes a row and each series id a column; row input is used as\n * given with inferred keys unless `indexBy`/`keys` are passed.\n */\nexport function toRows(data: ChartRow[] | ChartSeries[], indexBy?: string, keys?: string[]): RowData {\n if (isSeriesArray(data)) {\n const index = indexBy ?? \"x\";\n const byX = new Map<string | number, ChartRow>();\n const ids: string[] = [];\n for (const series of data) {\n const id = String(series.id);\n ids.push(id);\n for (const point of series.data) {\n let row = byX.get(point.x);\n if (!row) {\n row = { [index]: point.x };\n byX.set(point.x, row);\n }\n row[id] = point.y;\n }\n }\n return { rows: [...byX.values()], indexBy: index, keys: keys ?? ids };\n }\n const rows = data as ChartRow[];\n const inferred = inferRowKeys(rows);\n return {\n rows,\n indexBy: indexBy ?? inferred.indexBy ?? \"x\",\n keys: keys ?? inferred.keys,\n };\n}\n\n/** Pie/donut/funnel slices as `{ name, value }` rows with the id preserved. */\nexport function toSlices(data: ChartSlice[]): Array<{ id: string; name: string; value: number }> {\n return data.map((d) => ({ id: String(d.id), name: d.label ?? String(d.id), value: d.value }));\n}\n\n/** Build a ChartConfig for the given keys, keeping any entries the caller set. */\nexport function configFor(keys: string[], config?: ChartConfig): ChartConfig {\n const out: ChartConfig = {};\n for (const key of keys) out[key] = { label: key, ...config?.[key] };\n // Keys the caller configured but the data lacks still get their colour slot.\n for (const key of Object.keys(config ?? {})) if (!(key in out)) out[key] = config![key]!;\n return out;\n}\n\n/** Whether a Nivo tree uses `name` rather than `id` as its identity. */\nexport function treeIdentity(tree: ChartTree): \"id\" | \"name\" {\n return tree.id === undefined && tree.name !== undefined ? \"name\" : \"id\";\n}\n\n/** True when there is nothing to draw. */\nexport function isEmptyData(data: unknown): boolean {\n if (data == null) return true;\n if (isMatrix(data)) return data.rows.length === 0 || data.columns.length === 0;\n if (Array.isArray(data)) {\n if (data.length === 0) return true;\n if (isSeriesArray(data)) return data.every((s) => s.data.length === 0);\n return false;\n }\n if (typeof data === \"object\") {\n const tree = data as ChartTree;\n return !tree.children?.length && tree.value === undefined;\n }\n return true;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useChart } from \"./container\";\nimport { readToken, resolveColor, tokenPx, useThemeVersion } from \"./tokens\";\n\n/**\n * The Nivo theme object, typed structurally so no `@nivo/*` package is a\n * static import of this module (the Nivo packages are lazy-loaded). It is a\n * subset of `PartialTheme` from `@nivo/theming` and assignable to every\n * chart's `theme` prop.\n */\nexport interface NivoTheme {\n background: string;\n text: { fontFamily: string; fontSize: number; fill: string };\n axis: {\n domain: { line: { stroke: string; strokeWidth: number } };\n ticks: {\n line: { stroke: string; strokeWidth: number };\n text: { fill: string; fontSize: number };\n };\n legend: { text: { fill: string; fontSize: number; fontWeight: number } };\n };\n grid: { line: { stroke: string; strokeWidth: number } };\n crosshair: { line: { stroke: string; strokeWidth: number; strokeOpacity: number; strokeDasharray: string } };\n legends: {\n text: { fill: string; fontSize: number };\n title: { text: { fill: string; fontSize: number } };\n ticks: { line: { stroke: string; strokeWidth: number }; text: { fill: string; fontSize: number } };\n };\n labels: { text: { fill: string; fontSize: number; fontWeight: number } };\n dots: { text: { fill: string; fontSize: number } };\n markers: { lineColor: string; lineStrokeWidth: number; text: { fill: string; fontSize: number } };\n annotations: {\n text: { fill: string; fontSize: number; outlineWidth: number; outlineColor: string };\n link: { stroke: string; strokeWidth: number; outlineWidth: number; outlineColor: string };\n outline: { stroke: string; strokeWidth: number; outlineWidth: number; outlineColor: string };\n symbol: { fill: string; outlineWidth: number; outlineColor: string };\n };\n tooltip: {\n container: {\n background: string;\n color: string;\n fontSize: number;\n fontFamily: string;\n borderRadius: number;\n boxShadow: string;\n border: string;\n padding: string;\n };\n chip: { borderRadius: number };\n };\n}\n\n/**\n * Build the Nivo theme from the tokens, resolved on `el` (default `<html>`).\n * Every colour is read from a `--ds-*` custom property and converted to hex,\n * because Nivo's canvas renderer and its colour derivation cannot read\n * `var()`. Sizes come from the type scale with `--ds-text-caption-sm` (11px)\n * as the floor for ticks and labels.\n *\n * Moved here from cortenaweb's webchat renderer; nothing is hard-coded.\n */\nexport function nivoTheme(el?: Element | null): NivoTheme {\n const fontFamily = readToken(\"--ds-font-body\", el) || \"var(--ds-font-body)\";\n const captionSm = tokenPx(\"--ds-text-caption-sm\", el) ?? 11;\n const caption = tokenPx(\"--ds-text-caption\", el) ?? 12;\n const radiusMd = tokenPx(\"--ds-radius-md\", el) ?? 6;\n const radiusSm = tokenPx(\"--ds-radius-sm\", el) ?? 4;\n const foreground = resolveColor(\"--ds-foreground\", el);\n const muted = resolveColor(\"--ds-muted-foreground\", el);\n const border = resolveColor(\"--ds-border\", el);\n const borderSubtle = resolveColor(\"--ds-border-subtle\", el);\n const borderStrong = resolveColor(\"--ds-border-strong\", el);\n const popover = resolveColor(\"--ds-popover\", el);\n const popoverForeground = resolveColor(\"--ds-popover-foreground\", el);\n const card = resolveColor(\"--ds-card\", el);\n const shadow = readToken(\"--ds-shadow-md\", el) || \"var(--ds-shadow-md)\";\n const space2 = readToken(\"--ds-space-2\", el) || \"var(--ds-space-2)\";\n const space3 = readToken(\"--ds-space-3\", el) || \"var(--ds-space-3)\";\n\n return {\n background: \"transparent\",\n text: { fontFamily, fontSize: captionSm, fill: foreground },\n axis: {\n domain: { line: { stroke: border, strokeWidth: 1 } },\n ticks: {\n line: { stroke: border, strokeWidth: 1 },\n text: { fill: muted, fontSize: captionSm },\n },\n legend: { text: { fill: foreground, fontSize: caption, fontWeight: 500 } },\n },\n grid: { line: { stroke: borderSubtle, strokeWidth: 1 } },\n crosshair: { line: { stroke: borderStrong, strokeWidth: 1, strokeOpacity: 1, strokeDasharray: \"4 4\" } },\n legends: {\n text: { fill: muted, fontSize: captionSm },\n title: { text: { fill: foreground, fontSize: caption } },\n ticks: { line: { stroke: border, strokeWidth: 1 }, text: { fill: muted, fontSize: captionSm } },\n },\n labels: { text: { fill: foreground, fontSize: captionSm, fontWeight: 500 } },\n dots: { text: { fill: foreground, fontSize: captionSm } },\n markers: { lineColor: borderStrong, lineStrokeWidth: 1, text: { fill: muted, fontSize: captionSm } },\n annotations: {\n text: { fill: foreground, fontSize: captionSm, outlineWidth: 2, outlineColor: card },\n link: { stroke: borderStrong, strokeWidth: 1, outlineWidth: 2, outlineColor: card },\n outline: { stroke: borderStrong, strokeWidth: 1, outlineWidth: 2, outlineColor: card },\n symbol: { fill: foreground, outlineWidth: 2, outlineColor: card },\n },\n tooltip: {\n container: {\n background: popover,\n color: popoverForeground,\n fontSize: caption,\n fontFamily,\n borderRadius: radiusMd,\n boxShadow: shadow,\n border: `1px solid ${borderSubtle}`,\n padding: `${space2} ${space3}`,\n },\n chip: { borderRadius: radiusSm },\n },\n };\n}\n\n/**\n * The Nivo theme for the current theme, re-resolved when `data-theme` or the\n * OS scheme flips. Inside a ChartContainer the tokens are read on its element,\n * so a nested theme scope is honoured.\n */\nexport function useNivoTheme(): NivoTheme {\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n return useMemo(() => nivoTheme(el), [el, version]);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useChart } from \"./container\";\nimport { isMatrix, matrixToSeries, treeIdentity } from \"./data\";\nimport { useNivoTheme } from \"./nivo-theme\";\nimport { chartScales, contrastLabel, resolveVizSeries, useThemeVersion } from \"./tokens\";\nimport type { ChartConfig, ChartDay, ChartMatrix, ChartRenderer, ChartScale, ChartSeries, ChartTree, ChartType } from \"./types\";\n\nexport type NivoType = Extract<ChartType, \"heatmap\" | \"calendar\" | \"treemap\" | \"sunburst\">;\n\n/*\n * Every Nivo package is a dynamic import so a consumer pays only for the chart\n * types a screen renders, and none of `@nivo/*` lands in the package's static\n * graph (test/chart-bundle.test.tsx greps for exactly this). Each lazy wrapper\n * resolves to the SVG or Canvas variant; sunburst has no canvas renderer and\n * falls back to SVG.\n */\ntype AnyComponent = React.ComponentType<Record<string, unknown>>;\n\nconst loaders = {\n \"heatmap-svg\": async () => (await import(\"@nivo/heatmap\")).ResponsiveHeatMap as AnyComponent,\n \"heatmap-canvas\": async () => (await import(\"@nivo/heatmap\")).ResponsiveHeatMapCanvas as AnyComponent,\n \"calendar-svg\": async () => (await import(\"@nivo/calendar\")).ResponsiveCalendar as unknown as AnyComponent,\n \"calendar-canvas\": async () =>\n (await import(\"@nivo/calendar\")).ResponsiveCalendarCanvas as unknown as AnyComponent,\n \"treemap-svg\": async () => (await import(\"@nivo/treemap\")).ResponsiveTreeMap as AnyComponent,\n \"treemap-canvas\": async () => (await import(\"@nivo/treemap\")).ResponsiveTreeMapCanvas as AnyComponent,\n \"sunburst-svg\": async () => (await import(\"@nivo/sunburst\")).ResponsiveSunburst as AnyComponent,\n} satisfies Record<string, () => Promise<AnyComponent>>;\n\ntype ChunkName = keyof typeof loaders;\n\n/*\n * `React.lazy` memoises the outcome of its loader, a rejection included: a\n * chunk that fails once — an offline moment, a deploy that moved the file —\n * throws the same error for the life of the page, and no re-render retries it.\n * The lazy components are therefore cached here rather than frozen at module\n * scope, and `resetNivoChunks` drops the cache so the next render builds fresh\n * ones and asks for the chunk again. `Chart`'s ChunkBoundary calls it.\n */\nlet chunks = new Map<ChunkName, AnyComponent>();\n\nfunction chunk(name: ChunkName): AnyComponent {\n let component = chunks.get(name);\n if (!component) {\n component = React.lazy(async () => ({ default: await loaders[name]() })) as unknown as AnyComponent;\n chunks.set(name, component);\n }\n return component;\n}\n\n/** Forget every loaded-or-failed Nivo chunk, so the next render loads it again. */\nexport function resetNivoChunks(): void {\n chunks = new Map();\n}\n\nexport interface NivoRenderProps {\n type: NivoType;\n data: unknown;\n config: ChartConfig;\n renderer: ChartRenderer;\n scale: ChartScale;\n legend: boolean;\n valueFormatter?: (value: number) => string;\n /** Calendar range; defaults to the data's first and last day. */\n from?: string;\n to?: string;\n}\n\n/**\n * Resolved series colours for Nivo: config colours are `var()` strings, which\n * Nivo cannot use, so a configured colour is resolved through the container's\n * computed style and the rest come from `--ds-viz-1..n` in order.\n */\nfunction useNivoColors(config: ChartConfig): string[] {\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n return React.useMemo(() => {\n const palette = resolveVizSeries(el);\n const keys = Object.keys(config);\n if (keys.length === 0) return palette;\n return keys.map((key, i) => {\n const own = config[key]?.color;\n if (!own || !el) return palette[i % palette.length]!;\n // Resolve a var() through the element by painting it into a probe.\n const probe = document.createElement(\"span\");\n probe.style.color = own;\n el.appendChild(probe);\n const painted = getComputedStyle(probe).color;\n probe.remove();\n return painted || palette[i % palette.length]!;\n });\n }, [config, el, version]);\n}\n\nfunction calendarRange(data: ChartDay[], from?: string, to?: string): { from: string; to: string } {\n const days = data.map((d) => d.day).sort();\n return { from: from ?? days[0] ?? \"\", to: to ?? days[days.length - 1] ?? \"\" };\n}\n\n/** The Nivo side of `Chart`; rendered inside a ChartContainer with `responsive={false}`. */\nexport function NivoChart({ type, data, config, renderer, scale, legend, valueFormatter, from, to }: NivoRenderProps) {\n const theme = useNivoTheme();\n const colors = useNivoColors(config);\n const version = useThemeVersion();\n const chart = useChart();\n const el = chart?.element ?? null;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n const scales = React.useMemo(() => chartScales(el), [el, version]);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- version is the cache key for the DOM read\n const onFill = React.useMemo(() => contrastLabel(el), [el, version]);\n const canvas = renderer === \"canvas\";\n const labelColor = theme.labels.text.fill;\n const border = theme.axis.domain.line.stroke;\n const labelOn = (d: { color: string }) => onFill(d.color);\n\n switch (type) {\n case \"heatmap\": {\n const Component = chunk(canvas ? \"heatmap-canvas\" : \"heatmap-svg\");\n // Either shape lands on Nivo's `[{ id, data: [{ x, y }] }]`.\n const rows = isMatrix(data) ? matrixToSeries(data as ChartMatrix) : (data as ChartSeries[]);\n // Labels only when cells are big enough to carry them.\n const cells = rows.reduce((n, r) => n + r.data.length, 0);\n const colorConfig =\n scale === \"diverging\"\n ? { type: \"diverging\" as const, interpolator: scales.divergingInterpolator }\n : { type: \"sequential\" as const, interpolator: scales.sequentialInterpolator };\n return (\n <Component\n data={rows}\n theme={theme}\n colors={colorConfig}\n emptyColor={scales.empty}\n borderColor={border}\n borderWidth={1}\n enableLabels={cells <= 200}\n labelTextColor={labelOn}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n margin={{ top: 8, right: legend ? 72 : 8, bottom: cells <= 200 ? 40 : 8, left: cells <= 200 ? 64 : 8 }}\n axisTop={null}\n axisBottom={cells <= 200 ? { tickSize: 0, tickPadding: 8 } : null}\n axisLeft={cells <= 200 ? { tickSize: 0, tickPadding: 8 } : null}\n legends={\n legend\n ? [\n {\n anchor: \"right\",\n translateX: 40,\n length: 160,\n thickness: 8,\n direction: \"column\",\n tickSize: 0,\n tickSpacing: 4,\n tickFormat: valueFormatter,\n },\n ]\n : []\n }\n animate={!canvas}\n />\n );\n }\n\n case \"calendar\": {\n const Component = chunk(canvas ? \"calendar-canvas\" : \"calendar-svg\");\n const days = data as ChartDay[];\n const range = calendarRange(days, from, to);\n return (\n <Component\n data={days}\n from={range.from}\n to={range.to}\n theme={theme}\n colors={scales.sequentialSteps(5)}\n emptyColor={scales.empty}\n dayBorderColor={scales.surface}\n dayBorderWidth={2}\n monthBorderColor={border}\n monthBorderWidth={1}\n margin={{ top: 24, right: 24, bottom: 8, left: 32 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n legends={\n legend\n ? [\n {\n anchor: \"bottom-right\",\n direction: \"row\",\n translateY: 36,\n itemCount: 4,\n itemWidth: 42,\n itemHeight: 36,\n itemsSpacing: 14,\n itemDirection: \"right-to-left\",\n },\n ]\n : []\n }\n />\n );\n }\n\n case \"treemap\": {\n const Component = chunk(canvas ? \"treemap-canvas\" : \"treemap-svg\");\n const tree = data as ChartTree;\n return (\n <Component\n data={tree}\n identity={treeIdentity(tree)}\n value=\"value\"\n theme={theme}\n colors={colors}\n nodeOpacity={1}\n borderColor={scales.surface}\n borderWidth={2}\n labelTextColor={labelOn}\n parentLabelTextColor={labelColor}\n labelSkipSize={16}\n leavesOnly\n innerPadding={2}\n margin={{ top: 4, right: 4, bottom: 4, left: 4 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n animate={!canvas}\n />\n );\n }\n\n case \"sunburst\": {\n // Sunburst has no canvas renderer; SVG either way.\n const Component = chunk(\"sunburst-svg\");\n const tree = data as ChartTree;\n return (\n <Component\n data={tree}\n id={treeIdentity(tree)}\n value=\"value\"\n theme={theme}\n colors={colors}\n inheritColorFromParent\n childColor={{ from: \"color\", modifiers: [[\"opacity\", 0.75]] }}\n borderColor={scales.surface}\n borderWidth={2}\n cornerRadius={2}\n enableArcLabels\n arcLabel=\"id\"\n arcLabelsSkipAngle={12}\n arcLabelsTextColor={labelOn}\n margin={{ top: 8, right: 8, bottom: 8, left: 8 }}\n valueFormat={valueFormatter ? (v: number) => valueFormatter(v) : undefined}\n />\n );\n }\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n Funnel,\n FunnelChart,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart,\n Scatter,\n ScatterChart,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { ChartLegend, ChartTooltip, seriesColor } from \"./container\";\nimport { toRows, toSlices } from \"./data\";\nimport type { ChartConfig, ChartRow, ChartSeries, ChartSlice, ChartType } from \"./types\";\n\nexport type RechartsType = Extract<\n ChartType,\n \"bar\" | \"line\" | \"area\" | \"pie\" | \"donut\" | \"scatter\" | \"scatterplot\" | \"radar\" | \"funnel\"\n>;\n\nexport interface RechartsRenderProps {\n type: RechartsType;\n data: unknown;\n config: ChartConfig;\n indexBy?: string;\n keys?: string[];\n stacked?: boolean;\n legend: boolean;\n grid: boolean;\n tooltip: boolean;\n valueFormatter?: (value: number) => string;\n}\n\nconst MARGIN = { top: 8, right: 8, bottom: 0, left: 0 };\n\n/**\n * The Recharts side of `Chart`. Returns a chart element for the\n * ResponsiveContainer inside ChartContainer; colours come from `seriesColor`\n * (config colour or `var(--ds-viz-N)` by series index) and every other visual\n * value from the container's token styling.\n */\nexport function RechartsChart({\n type,\n data,\n config,\n indexBy,\n keys,\n stacked,\n legend,\n grid,\n tooltip,\n valueFormatter,\n}: RechartsRenderProps): React.ReactElement {\n const tip = tooltip ? (\n <ChartTooltip\n formatter={valueFormatter ? (value: unknown) => valueFormatter(Number(value)) : undefined}\n />\n ) : null;\n const leg = legend ? <ChartLegend /> : null;\n\n switch (type) {\n case \"bar\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <BarChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n name={key}\n fill={seriesColor(config, key, i)}\n stackId={stacked ? \"stack\" : undefined}\n radius={stacked ? 0 : [2, 2, 0, 0]}\n maxBarSize={48}\n />\n ))}\n </BarChart>\n );\n }\n\n case \"line\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <LineChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 4 }}\n />\n ))}\n </LineChart>\n );\n }\n\n case \"area\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <AreaChart data={rows} margin={MARGIN}>\n {grid ? <CartesianGrid vertical={false} /> : null}\n <XAxis dataKey={index} tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n fill={seriesColor(config, key, i)}\n fillOpacity={0.2}\n strokeWidth={2}\n stackId={stacked ? \"stack\" : undefined}\n />\n ))}\n </AreaChart>\n );\n }\n\n case \"pie\":\n case \"donut\": {\n const slices = toSlices(data as ChartSlice[]);\n return (\n <PieChart margin={MARGIN}>\n {tip}\n {leg}\n <Pie\n data={slices}\n dataKey=\"value\"\n nameKey=\"name\"\n innerRadius={type === \"donut\" ? \"55%\" : 0}\n outerRadius=\"80%\"\n paddingAngle={type === \"donut\" ? 2 : 0}\n strokeWidth={1}\n >\n {slices.map((slice, i) => (\n <Cell key={slice.id} fill={seriesColor(config, slice.id, i)} />\n ))}\n </Pie>\n </PieChart>\n );\n }\n\n case \"scatter\":\n case \"scatterplot\": {\n const series = data as ChartSeries[];\n return (\n <ScatterChart margin={MARGIN}>\n {grid ? <CartesianGrid /> : null}\n <XAxis dataKey=\"x\" type=\"number\" name=\"x\" tickLine={false} axisLine={false} tickMargin={8} />\n <YAxis dataKey=\"y\" type=\"number\" name=\"y\" tickLine={false} axisLine={false} tickFormatter={valueFormatter} />\n {tip}\n {leg}\n {series.map((s, i) => (\n <Scatter key={String(s.id)} name={String(s.id)} data={s.data} fill={seriesColor(config, String(s.id), i)} />\n ))}\n </ScatterChart>\n );\n }\n\n case \"radar\": {\n const { rows, indexBy: index, keys: series } = toRows(data as ChartRow[] | ChartSeries[], indexBy, keys);\n return (\n <RadarChart data={rows} margin={MARGIN}>\n {grid ? <PolarGrid /> : null}\n <PolarAngleAxis dataKey={index} />\n <PolarRadiusAxis tick={false} axisLine={false} />\n {tip}\n {leg}\n {series.map((key, i) => (\n <Radar\n key={key}\n dataKey={key}\n name={key}\n stroke={seriesColor(config, key, i)}\n fill={seriesColor(config, key, i)}\n fillOpacity={0.2}\n strokeWidth={2}\n />\n ))}\n </RadarChart>\n );\n }\n\n case \"funnel\": {\n const slices = toSlices(data as ChartSlice[]);\n return (\n <FunnelChart margin={MARGIN}>\n {tip}\n {leg}\n <Funnel data={slices} dataKey=\"value\" nameKey=\"name\">\n {slices.map((slice, i) => (\n <Cell key={slice.id} fill={seriesColor(config, slice.id, i)} />\n ))}\n </Funnel>\n </FunnelChart>\n );\n }\n }\n}\n","import type * as React from \"react\";\n\n/**\n * Chart types and the data shape each one expects.\n *\n * Engine per type (see cortena-docs/cortenaUI&Design/03-charting.md):\n *\n * | type | engine |\n * | -------------------------------------------------------- | ------------------------- |\n * | bar, line, area, pie, donut, scatter, radar, funnel | Recharts (static import) |\n * | heatmap, calendar, treemap, sunburst | Nivo (lazy, per package) |\n *\n * Data shapes (the webchat renderer's legacy shapes are all accepted):\n *\n * - **bar**, **radar**: `ChartRow[]` — one object per category with a string\n * category key (`indexBy`, inferred as the first string field) and one\n * numeric field per series (`keys`, inferred as every numeric field).\n * `[{ month: \"Jan\", revenue: 12, cost: 8 }, …]`. The series shape below is\n * also accepted and pivoted.\n * - **line**, **area**: `ChartSeries[]` — `[{ id: \"revenue\", data: [{ x, y }] }]`\n * (the Nivo line shape the webchat emits). `ChartRow[]` is also accepted.\n * - **pie**, **donut**, **funnel**: `ChartSlice[]` — `[{ id, label?, value }]`.\n * - **scatter** (alias `scatterplot`): `ChartSeries[]` — one series per group.\n * - **heatmap**: `ChartSeries[]` — Nivo heatmap shape, `[{ id: row, data: [{ x: column, y: value }] }]` —\n * or `ChartMatrix`, the categorical form a correlation / confusion matrix\n * already has: `{ rows, columns, values }` with `values[r][c]` at\n * `rows[r] × columns[c]`.\n * - **calendar**: `ChartDay[]` — `[{ day: \"2026-01-31\", value }]`; `from`/`to`\n * default to the data's range.\n * - **treemap**, **sunburst**: `ChartTree` — Nivo tree, `{ id, children?: [...], value? }`\n * (`name` is accepted in place of `id`).\n */\nexport type ChartType =\n | \"bar\"\n | \"line\"\n | \"area\"\n | \"pie\"\n | \"donut\"\n | \"scatter\"\n | \"scatterplot\"\n | \"radar\"\n | \"funnel\"\n | \"heatmap\"\n | \"calendar\"\n | \"treemap\"\n | \"sunburst\";\n\n/** The engine that draws a given type. */\nexport type ChartEngine = \"recharts\" | \"nivo\";\n\n/** Nivo renderer; only the Nivo types honour it (Recharts is SVG only). */\nexport type ChartRenderer = \"svg\" | \"canvas\";\n\n/** One category with a numeric value per series. */\nexport type ChartRow = Record<string, string | number | null | undefined>;\n\n/** One series of points; x may be a category or a number, y a number. */\nexport interface ChartPoint {\n x: string | number;\n y: number | null;\n}\nexport interface ChartSeries {\n id: string | number;\n data: ChartPoint[];\n}\n\n/** One slice of a pie, donut or funnel. */\nexport interface ChartSlice {\n id: string | number;\n label?: string;\n value: number;\n}\n\n/**\n * A categorical matrix: `values[r][c]` is the cell at `rows[r]` × `columns[c]`.\n * The shape a correlation matrix, a confusion matrix or a day × hour grid is\n * already in, so it needs no pivot at the call site. Short rows are padded\n * with `null` (drawn as the empty colour) rather than treated as zero.\n */\nexport interface ChartMatrix {\n rows: string[];\n columns: string[];\n values: Array<Array<number | null | undefined>>;\n}\n\n/** One day of a calendar heatmap. */\nexport interface ChartDay {\n day: string;\n value: number;\n}\n\n/** A Nivo tree node for treemap and sunburst. */\nexport interface ChartTree {\n id?: string | number;\n name?: string;\n value?: number;\n children?: ChartTree[];\n [key: string]: unknown;\n}\n\n/** The data type accepted for each chart type. */\nexport type ChartDataFor<T extends ChartType> = T extends \"bar\" | \"radar\"\n ? ChartRow[] | ChartSeries[]\n : T extends \"line\" | \"area\"\n ? ChartSeries[] | ChartRow[]\n : T extends \"pie\" | \"donut\" | \"funnel\"\n ? ChartSlice[]\n : T extends \"heatmap\"\n ? ChartSeries[] | ChartMatrix\n : T extends \"scatter\" | \"scatterplot\"\n ? ChartSeries[]\n : T extends \"calendar\"\n ? ChartDay[]\n : T extends \"treemap\" | \"sunburst\"\n ? ChartTree\n : never;\n\n/**\n * Per-series presentation, keyed by series id (the `keys` of a row chart, the\n * `id` of a series or slice). Colours default to `var(--ds-viz-1..n)` in key\n * order, so the same category index gets the same colour in every app; set\n * `color` only to pin a category to a semantic colour, and then only to a\n * token (`var(--ds-success)`), never a literal.\n */\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n color?: string;\n }\n>;\n\n/** Which continuous scale a heatmap or calendar uses. */\nexport type ChartScale = \"sequential\" | \"diverging\";\n\nexport const RECHARTS_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\n \"bar\",\n \"line\",\n \"area\",\n \"pie\",\n \"donut\",\n \"scatter\",\n \"scatterplot\",\n \"radar\",\n \"funnel\",\n]);\n\nexport const NIVO_TYPES: ReadonlySet<ChartType> = new Set<ChartType>([\n \"heatmap\",\n \"calendar\",\n \"treemap\",\n \"sunburst\",\n]);\n\n/** The engine the package uses for a chart type. */\nexport function chartEngine(type: ChartType): ChartEngine {\n return NIVO_TYPES.has(type) ? \"nivo\" : \"recharts\";\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { ChartContainer, ChartEmpty, ChartError, ChartLoading, type ChartContainerProps } from \"./container\";\nimport { configFor, isEmptyData, isMatrix, isSeriesArray, toRows, toSlices } from \"./data\";\nimport { NivoChart, resetNivoChunks, type NivoType } from \"./nivo-charts\";\nimport { RechartsChart, type RechartsType } from \"./recharts-charts\";\nimport {\n chartEngine,\n type ChartConfig,\n type ChartDataFor,\n type ChartMatrix,\n type ChartRenderer,\n type ChartRow,\n type ChartScale,\n type ChartSeries,\n type ChartSlice,\n type ChartTree,\n type ChartType,\n} from \"./types\";\n\nexport interface ChartProps<T extends ChartType = ChartType>\n extends Omit<ChartContainerProps, \"children\" | \"config\" | \"responsive\"> {\n /** Which chart to draw; the package picks the engine. See {@link ChartType} for the data shape per type. */\n type: T;\n /** The data, in the shape documented on {@link ChartType}. */\n data: ChartDataFor<T>;\n /** Series presentation keyed by series id; colours default to `--ds-viz-1..n` in order. */\n config?: ChartConfig;\n /** Nivo renderer; `canvas` for large series. Ignored by the Recharts types and by sunburst. */\n renderer?: ChartRenderer;\n /** Category key for row data (bar, line, area, radar); inferred as the first string field. */\n indexBy?: string;\n /** Series keys for row data; inferred as every numeric field. */\n keys?: string[];\n /** Stack bars and areas instead of grouping them. */\n stacked?: boolean;\n /** Continuous scale for heatmap and calendar. Default sequential. */\n scale?: ChartScale;\n /** Show a legend. Default: when there is more than one series. */\n legend?: boolean;\n /** Draw grid lines (cartesian and radar types). Default true. */\n grid?: boolean;\n /** Show a tooltip on hover. Default true. */\n tooltip?: boolean;\n /** Format values in axes, tooltips and labels. */\n valueFormatter?: (value: number) => string;\n /** Calendar range (ISO dates); defaults to the data's extent. */\n from?: string;\n to?: string;\n /** Render the loading skeleton instead of the data. */\n loading?: boolean;\n /** Render the error state with this message instead of the data. */\n error?: React.ReactNode | Error | null;\n /** Content of the empty state. Default \"No data\". */\n emptyMessage?: React.ReactNode;\n}\n\nfunction seriesKeys(type: ChartType, data: unknown, indexBy?: string, keys?: string[]): string[] {\n switch (type) {\n case \"bar\":\n case \"line\":\n case \"area\":\n case \"radar\":\n return toRows(data as ChartRow[] | ChartSeries[], indexBy, keys).keys;\n case \"pie\":\n case \"donut\":\n case \"funnel\":\n return toSlices(data as ChartSlice[]).map((s) => s.id);\n case \"heatmap\":\n if (isMatrix(data)) return data.rows.map(String);\n return isSeriesArray(data) ? data.map((s) => String(s.id)) : [];\n case \"scatter\":\n case \"scatterplot\":\n return isSeriesArray(data) ? data.map((s) => String(s.id)) : [];\n case \"treemap\":\n case \"sunburst\":\n return ((data as ChartTree).children ?? []).map((c) => String(c.id ?? c.name ?? \"\"));\n case \"calendar\":\n return [];\n }\n}\n\ninterface ChunkBoundaryProps {\n children: React.ReactNode;\n /** Changing it clears a previous failure and renders the children again. */\n resetKey: string;\n fallback: (retry: () => void) => React.ReactNode;\n}\n\n/**\n * Catches a Nivo chunk that failed to load. Recovering takes two things,\n * because `React.lazy` memoises a rejection for the life of the page: fresh\n * lazy components ({@link resetNivoChunks}) and a boundary that leaves its\n * failed state. `resetKey` does the second on its own when the chart changes,\n * and the fallback gets a `retry` that does both.\n */\nclass ChunkBoundary extends React.Component<ChunkBoundaryProps, { failed: boolean; key: string }> {\n state = { failed: false, key: this.props.resetKey };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n static getDerivedStateFromProps(props: ChunkBoundaryProps, state: { failed: boolean; key: string }) {\n return props.resetKey === state.key ? null : { failed: false, key: props.resetKey };\n }\n retry = () => {\n resetNivoChunks();\n this.setState({ failed: false });\n };\n render() {\n return this.state.failed ? this.props.fallback(this.retry) : this.props.children;\n }\n}\n\n/**\n * Chart — one component for every chart type the fleet draws.\n *\n * `type` picks the engine: Recharts (bundled) for bar, line, area, pie, donut,\n * scatter, radar and funnel; Nivo, lazy-loaded per package, for heatmap,\n * calendar, treemap and sunburst, with `renderer=\"canvas\"` for large series.\n * Colours, fonts, axes, grid, tooltip, legend and the empty, loading and\n * error states all come from cortena-design tokens; a consumer passes data\n * and, optionally, a `config` of labels.\n *\n * `heatmap` takes either the Nivo series shape or a categorical\n * {@link ChartMatrix} — `{ rows, columns, values }` — for the correlation and\n * confusion matrices that are already in that form.\n *\n * `testMode` gives the drawing area a 600×300 floor so a chart still draws\n * where the layout gives it no size; see {@link ChartContainerProps.testMode}\n * and README.md, \"Charts in tests\".\n */\nfunction Chart<T extends ChartType>({\n type,\n data,\n config,\n renderer = \"svg\",\n indexBy,\n keys,\n stacked,\n scale = \"sequential\",\n legend,\n grid = true,\n tooltip = true,\n valueFormatter,\n from,\n to,\n loading,\n error,\n emptyMessage,\n className,\n height,\n ...props\n}: ChartProps<T>) {\n const engine = chartEngine(type);\n const empty = isEmptyData(data);\n const fullConfig = React.useMemo(\n () => configFor(empty ? [] : seriesKeys(type, data, indexBy, keys), config),\n [type, data, indexBy, keys, config, empty],\n );\n const showLegend = legend ?? Object.keys(fullConfig).length > 1;\n const errorText = error instanceof Error ? error.message : error;\n\n let body: React.ReactNode;\n let responsive = false;\n if (loading) body = <ChartLoading />;\n else if (errorText) body = <ChartError>{errorText}</ChartError>;\n else if (empty) body = <ChartEmpty>{emptyMessage}</ChartEmpty>;\n else if (engine === \"nivo\") {\n body = (\n <ChunkBoundary\n resetKey={`${type}|${renderer}`}\n fallback={(retry) => (\n <ChartError>\n Chart could not be loaded.{\" \"}\n <button\n type=\"button\"\n data-slot=\"chart-retry\"\n onClick={retry}\n className=\"underline underline-offset-2\"\n >\n Retry\n </button>\n </ChartError>\n )}\n >\n <React.Suspense fallback={<ChartLoading />}>\n <NivoChart\n type={type as NivoType}\n data={data}\n config={fullConfig}\n renderer={renderer}\n scale={scale}\n legend={showLegend}\n valueFormatter={valueFormatter}\n from={from}\n to={to}\n />\n </React.Suspense>\n </ChunkBoundary>\n );\n } else {\n responsive = true;\n body = (\n <RechartsChart\n type={type as RechartsType}\n data={data}\n config={fullConfig}\n indexBy={indexBy}\n keys={keys}\n stacked={stacked}\n legend={showLegend}\n grid={grid}\n tooltip={tooltip}\n valueFormatter={valueFormatter}\n />\n );\n }\n\n return (\n <ChartContainer\n data-type={type}\n data-engine={engine}\n data-renderer={engine === \"nivo\" ? renderer : \"svg\"}\n config={fullConfig}\n height={height}\n responsive={responsive}\n className={cn(className)}\n {...props}\n >\n {body}\n </ChartContainer>\n );\n}\n\nexport { Chart };\n","\"use client\";\n\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\nimport { Check, Minus } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Checkbox.\n *\n * Base UI renders a `<span role=\"checkbox\">` with a hidden `<input>` beside\n * it, so it submits with forms and takes `checked`/`defaultChecked`. The\n * indicator only mounts while checked or indeterminate; the icon inside it is\n * a lucide Check, or a Minus when `indeterminate` is set.\n *\n * The 16px box takes half the small radius: the 8px ladder step would round\n * it into a circle.\n */\nexport interface CheckboxProps extends React.ComponentProps<typeof BaseCheckbox.Root> {}\n\nfunction Checkbox({ className, indeterminate, ...props }: CheckboxProps) {\n return (\n <BaseCheckbox.Root\n data-slot=\"checkbox\"\n indeterminate={indeterminate}\n className={cn(\n \"peer inline-flex size-4 shrink-0 items-center justify-center rounded-[calc(var(--ds-radius-sm)/2)] border\",\n \"border-[var(--ds-input)] bg-[var(--ds-background)]\",\n \"transition-[background-color,border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[checked]:border-[var(--ds-primary)] data-[checked]:bg-[var(--ds-primary)] data-[checked]:text-[color:var(--ds-primary-foreground)]\",\n \"data-[indeterminate]:border-[var(--ds-primary)] data-[indeterminate]:bg-[var(--ds-primary)] data-[indeterminate]:text-[color:var(--ds-primary-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current [&_svg]:size-3.5 [&_svg]:shrink-0\"\n >\n {indeterminate ? <Minus strokeWidth={3} /> : <Check strokeWidth={3} />}\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n );\n}\n\nexport { Checkbox };\n","\"use client\";\n\nimport { AlertTriangle, RefreshCw, X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface ErrorBannerProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n message: string;\n onDismiss?: () => void;\n onRetry?: () => void;\n}\n\nconst actionClass = cn(\n \"inline-flex items-center justify-center rounded-[var(--ds-radius-sm)] p-1\",\n \"text-[color:var(--ds-destructive)] hover:bg-[var(--ds-destructive)]/10\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-destructive)]/40\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n);\n\n/**\n * ErrorBanner — the one error surface every screen uses: a warning icon, the\n * message, and optional Retry / Dismiss actions. Renders nothing for an empty\n * message so callers can pass their error state straight through.\n */\nfunction ErrorBanner({ message, onDismiss, onRetry, className, ...props }: ErrorBannerProps) {\n if (!message) {\n return null;\n }\n\n return (\n <div\n data-slot=\"error-banner\"\n role=\"alert\"\n className={cn(\n \"flex items-start gap-3 rounded-[var(--ds-radius-md)] border px-4 py-3\",\n \"border-[var(--ds-destructive)]/30 bg-[var(--ds-destructive-soft)]\",\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n \"text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n >\n <AlertTriangle aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <p data-slot=\"error-banner-message\" className=\"flex-1\">\n {message}\n </p>\n {onRetry || onDismiss ? (\n <div className=\"flex shrink-0 items-center gap-1\">\n {onRetry ? (\n <button type=\"button\" onClick={onRetry} aria-label=\"Retry\" className={actionClass}>\n <RefreshCw className=\"size-3.5\" />\n </button>\n ) : null}\n {onDismiss ? (\n <button type=\"button\" onClick={onDismiss} aria-label=\"Dismiss\" className={actionClass}>\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { ErrorBanner };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Input.\n *\n * A plain `<input>`; Base UI has no primitive for it and none is needed. The\n * look is cortenaweb's: sunken surface, subtle border that strengthens on hover\n * and takes the ring colour on focus. `aria-invalid` swaps the border and ring\n * for the destructive pair so a Field can mark errors without extra classes.\n */\nconst inputClassName = cn(\n \"flex h-10 w-full min-w-0 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] px-3 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"outline-none focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"file:border-0 file:bg-transparent file:text-[length:var(--ds-text-body-sm)] file:font-medium file:text-[color:var(--ds-foreground)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n);\n\nexport interface InputProps extends React.ComponentProps<\"input\"> {}\n\nfunction Input({ className, type, ...props }: InputProps) {\n return <input type={type} data-slot=\"input\" className={cn(inputClassName, className)} {...props} />;\n}\n\nexport { Input, inputClassName };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SpinnerProps extends React.ComponentProps<\"span\"> {\n /** Diameter in px. Defaults to 16. */\n size?: number;\n /**\n * `inverse` for a spinner on a filled surface — inside a primary or\n * destructive Button, on a toast, on any `-foreground` pairing. The default\n * ring is `--ds-border` with a `--ds-primary` leading edge, which all but\n * disappears on a primary fill; `inverse` draws both from\n * `--ds-primary-foreground` instead.\n */\n tone?: \"default\" | \"inverse\";\n}\n\n/**\n * Spinner — a ring with a coloured leading edge. Announces itself as\n * `role=\"status\"` with a \"Loading\" label; pass `aria-label` to override.\n *\n * ```tsx\n * <Button disabled>\n * <Spinner tone=\"inverse\" /> Saving…\n * </Button>\n * ```\n */\nfunction Spinner({ className, size = 16, tone = \"default\", style, ...props }: SpinnerProps) {\n return (\n <span\n data-slot=\"spinner\"\n data-tone={tone}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"inline-block shrink-0 animate-spin rounded-[var(--ds-radius-full)] border-2\",\n tone === \"inverse\"\n ? \"border-[var(--ds-primary-foreground)]/35 border-t-[var(--ds-primary-foreground)]\"\n : \"border-[var(--ds-border)] border-t-[var(--ds-primary)]\",\n className,\n )}\n style={{ width: size, height: size, ...style }}\n {...props}\n />\n );\n}\n\nexport { Spinner };\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DropdownMenu over Base UI's Menu.\n *\n * `DropdownMenuContent` and `DropdownMenuSubContent` compose Portal +\n * Positioner + Popup, so consumers keep writing one element; `side`, `align`\n * and `sideOffset` are forwarded to the Positioner where Base UI reads them.\n *\n * Radix users: `asChild` on the trigger becomes `render={<Button />}`;\n * `onSelect` on items is `onClick`; `DropdownMenuLabel` is Base UI's\n * `Menu.GroupLabel` (place it inside a `DropdownMenuGroup` for the\n * `aria-labelledby` wiring); `DropdownMenuCheckboxItem` reports through\n * `onCheckedChange(checked, eventDetails)`; `DropdownMenuRadioGroup` through\n * `onValueChange(value, eventDetails)`. Highlight state is `data-highlighted`,\n * not `:focus`.\n */\nfunction DropdownMenu(props: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root {...props} />;\n}\n\nfunction DropdownMenuTrigger(props: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuPortal(props: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuGroup(props: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuSub(props: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot {...props} />;\n}\n\nfunction DropdownMenuRadioGroup(props: MenuPrimitive.RadioGroup.Props) {\n return <MenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\ntype PositionerProps = Pick<\n MenuPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface DropdownMenuContentProps extends MenuPrimitive.Popup.Props, PositionerProps {\n /** Keep the menu mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the menu; defaults to `<body>`. */\n container?: MenuPrimitive.Portal.Props[\"container\"];\n}\n\nconst popupClassName = [\n \"min-w-[8rem] overflow-hidden p-1 outline-none\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n];\n\nfunction DropdownMenuContent({\n className,\n side,\n align,\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: DropdownMenuContentProps) {\n return (\n <MenuPrimitive.Portal keepMounted={keepMounted} container={container}>\n <MenuPrimitive.Positioner\n data-slot=\"dropdown-menu-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(popupClassName, className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n side,\n align,\n sideOffset,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: DropdownMenuContentProps) {\n return (\n <MenuPrimitive.Portal keepMounted={keepMounted} container={container}>\n <MenuPrimitive.Positioner\n data-slot=\"dropdown-menu-sub-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(popupClassName, className)}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nconst itemClassName = [\n \"relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 outline-none\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-body-sm)]\",\n \"transition-colors duration-[var(--ds-duration-fast)]\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n];\n\nexport interface DropdownMenuItemProps extends MenuPrimitive.Item.Props {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}\n\nfunction DropdownMenuItem({ className, inset, variant = \"default\", ...props }: DropdownMenuItemProps) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset ? \"\" : undefined}\n data-variant={variant}\n className={cn(\n itemClassName,\n inset && \"pl-8\",\n variant === \"destructive\" &&\n \"text-[color:var(--ds-destructive)] data-[highlighted]:bg-[var(--ds-destructive-soft)] data-[highlighted]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({ className, children, ...props }: MenuPrimitive.CheckboxItem.Props) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(itemClassName, \"pl-8 pr-2\", className)}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenuPrimitive.CheckboxItemIndicator data-slot=\"dropdown-menu-checkbox-item-indicator\">\n <Check className=\"size-3.5\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(itemClassName, \"pl-8 pr-2\", className)}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenuPrimitive.RadioItemIndicator data-slot=\"dropdown-menu-radio-item-indicator\">\n <Circle className=\"size-2 fill-current\" />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport interface DropdownMenuLabelProps extends MenuPrimitive.GroupLabel.Props {\n inset?: boolean;\n}\n\nfunction DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset ? \"\" : undefined}\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] font-semibold text-[color:var(--ds-muted-foreground)]\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border-subtle)]\", className)}\n {...props}\n />\n );\n}\n\nexport interface DropdownMenuSubTriggerProps extends MenuPrimitive.SubmenuTrigger.Props {\n inset?: boolean;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: DropdownMenuSubTriggerProps) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset ? \"\" : undefined}\n className={cn(\n itemClassName,\n \"popup-open:bg-[var(--ds-hover)] popup-open:text-[color:var(--ds-foreground)]\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-[length:var(--ds-text-caption)] tracking-widest text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","\"use client\";\n\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Select.\n *\n * `SelectContent` composes Base UI's Portal + Positioner + Popup so consumers\n * keep writing `<SelectContent side=\"bottom\" align=\"start\">`; positioning\n * props are forwarded to the Positioner, which is where Base UI reads them.\n *\n * Radix users:\n * - `SelectValue` shows the raw value unless the Root is given `items`\n * (`{ [value]: label }` or `[{ value, label }]`) or `itemToStringLabel`;\n * Base UI does not read the label out of an unmounted `SelectItem`.\n * - `onValueChange` receives `(value, eventDetails)`.\n * - `SelectContent` defaults to the dropdown layout; pass\n * `alignItemWithTrigger` for Base UI's native-like overlay of the selected item.\n *\n * ## Typing the value\n *\n * `null` is the cleared / placeholder state, so `onValueChange` always hands\n * back `Value | null`, never bare `Value`. Name the value type on the element\n * to keep that union at `string | null` instead of letting inference widen it:\n *\n * ```tsx\n * const [status, setStatus] = useState(\"\");\n *\n * <Select<string>\n * // \"\" is not a value any item carries; `|| null` is the placeholder state,\n * // which is what makes SelectValue fall back to its `placeholder`.\n * value={status || null}\n * onValueChange={(next) => setStatus(next ?? \"\")} // next: string | null\n * >\n * ```\n *\n * Without the explicit `<string>` the type argument is inferred from `value`,\n * so a `string | null` value widens `Value` and the handler's parameter turns\n * into `string | null | null`. Multi-select narrows too:\n * `<Select<string, true> multiple>` hands back `string[]`, never `null`.\n *\n * `SelectProps` is the same props type, for a wrapper that forwards them.\n */\nexport type SelectProps<\n Value = string,\n Multiple extends boolean | undefined = false,\n> = SelectPrimitive.Root.Props<Value, Multiple>;\n\nfunction Select<Value, Multiple extends boolean | undefined = false>(\n props: SelectProps<Value, Multiple>,\n) {\n return <SelectPrimitive.Root {...props} />;\n}\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"flex flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\n \"flex-1 truncate text-left data-[placeholder]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface SelectTriggerProps extends SelectPrimitive.Trigger.Props {\n size?: \"sm\" | \"md\";\n}\n\nfunction SelectTrigger({ className, size = \"md\", children, ...props }: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit min-w-40 items-center justify-between gap-2 whitespace-nowrap px-3\",\n size === \"sm\" ? \"h-8 text-[length:var(--ds-text-caption)]\" : \"h-9 text-[length:var(--ds-text-caption-lg)]\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-input)]\",\n \"bg-[var(--ds-background)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]\",\n \"transition-[border-color,box-shadow,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none hover:border-[var(--ds-border-strong)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[popup-open]:border-[var(--ds-ring)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[var(--ds-destructive)]/30\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n data-slot=\"select-icon\"\n className=\"flex text-[color:var(--ds-muted-foreground)] transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180\"\n >\n <ChevronDown />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\ntype PositionerProps = Pick<\n SelectPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n | \"alignItemWithTrigger\"\n>;\n\nexport interface SelectContentProps extends SelectPrimitive.Popup.Props, PositionerProps {\n /** Where to portal the popup; defaults to `<body>`. */\n container?: SelectPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n alignItemWithTrigger = false,\n container,\n ...props\n}: SelectContentProps) {\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Positioner\n data-slot=\"select-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50 outline-none\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n className={cn(\n \"relative max-h-[var(--available-height,none)] min-w-[var(--anchor-width,auto)] overflow-y-auto overflow-x-hidden p-1\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"outline-none\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {children}\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SelectItem({ className, children, ...props }: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText data-slot=\"select-item-text\" className=\"flex-1 truncate\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]\"\n >\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n};\n","import type { RowData } from \"@tanstack/react-table\";\nimport type { DataTableColumn, DataTableRow, DataTableTable } from \"./types\";\n\nexport type ExportCell = string | number | boolean | Date | null;\n\nexport interface ExportSheet {\n headers: string[];\n records: ExportCell[][];\n}\n\n/** Human label for a column: `meta.label`, a string header, or the id. */\nexport function columnLabel<Row extends RowData>(column: DataTableColumn<Row, any>): string {\n const def = column.columnDef;\n if (def.meta?.label) return def.meta.label;\n if (typeof def.header === \"string\") return def.header;\n return column.id;\n}\n\nfunction exportableColumns<Row extends RowData>(table: DataTableTable<Row>) {\n return table\n .getVisibleLeafColumns()\n .filter((c) => c.columnDef.meta?.exportable !== false && (c.accessorFn || c.columnDef.meta?.exportValue));\n}\n\nfunction toCell(value: unknown): ExportCell {\n if (value == null) return null;\n if (value instanceof Date) return value;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return value;\n return JSON.stringify(value);\n}\n\n/**\n * Rows to export: every row the current filters and sort leave, ignoring the\n * page, for a client source; the loaded page(s) for a server source, which is\n * all the table has. Pass `rows` to export a selection instead.\n */\nexport function exportRows<Row extends RowData>(table: DataTableTable<Row>): DataTableRow<Row>[] {\n return table.getPrePaginatedRowModel().rows;\n}\n\nexport function toSheet<Row extends RowData>(\n table: DataTableTable<Row>,\n rows: DataTableRow<Row>[] = exportRows(table),\n): ExportSheet {\n const columns = exportableColumns(table);\n return {\n headers: columns.map(columnLabel),\n records: rows.map((row) =>\n columns.map((column) => {\n const custom = column.columnDef.meta?.exportValue;\n return toCell(custom ? custom(row.original) : row.getValue(column.id));\n }),\n ),\n };\n}\n\n/**\n * Text a spreadsheet would evaluate rather than display. Excel, Sheets and\n * LibreOffice all treat a leading `=`, `+`, `-` or `@` as the start of a\n * formula, and a leading tab or CR as whitespace they strip before looking\n * again — so `\\t=cmd|'/c calc'!A1` is a formula too. Only strings are checked:\n * a number, boolean or Date cell cannot carry one, and prefixing `-5` would\n * turn a number column into text.\n */\nconst FORMULA_START = /^[=+\\-@\\t\\r]/;\n\nfunction csvField(value: ExportCell): string {\n if (value == null) return \"\";\n let text = value instanceof Date ? value.toISOString() : String(value);\n // Prefix before quoting: the apostrophe is what makes the spreadsheet read\n // the cell as text, and it has to sit inside the quotes to survive the parse.\n if (typeof value === \"string\" && FORMULA_START.test(text)) text = `'${text}`;\n return /[\",\\n\\r]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/**\n * RFC 4180 text: comma separated, CRLF lines, quotes doubled. A cell that a\n * spreadsheet would read as a formula is prefixed with `'` so it stays text.\n */\nexport function toCsv<Row extends RowData>(\n table: DataTableTable<Row>,\n rows?: DataTableRow<Row>[],\n): string {\n const { headers, records } = toSheet(table, rows);\n return [headers, ...records].map((line) => line.map(csvField).join(\",\")).join(\"\\r\\n\");\n}\n\nfunction download(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.rel = \"noopener\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\nexport function downloadCsv<Row extends RowData>(\n table: DataTableTable<Row>,\n fileName = \"export\",\n rows?: DataTableRow<Row>[],\n): void {\n // The BOM makes Excel read UTF-8 correctly; the text itself stays plain.\n download(\n new Blob([\"\\uFEFF\", toCsv(table, rows)], { type: \"text/csv;charset=utf-8\" }),\n `${fileName}.csv`,\n );\n}\n\n/**\n * Excel through exceljs, loaded on first use so the workbook code (about\n * 300 KB) never sits in a bundle that only ever exports CSV.\n */\nexport async function downloadExcel<Row extends RowData>(\n table: DataTableTable<Row>,\n fileName = \"export\",\n rows?: DataTableRow<Row>[],\n): Promise<void> {\n const { headers, records } = toSheet(table, rows);\n const ExcelJS = await import(\"exceljs\");\n const workbook = new ExcelJS.Workbook();\n const sheet = workbook.addWorksheet(\"Sheet1\");\n sheet.columns = headers.map((header, i) => ({\n header,\n key: String(i),\n width: Math.min(60, Math.max(10, header.length + 2)),\n }));\n for (const record of records) sheet.addRow(record);\n sheet.getRow(1).font = { bold: true };\n const buffer = await workbook.xlsx.writeBuffer();\n download(\n new Blob([buffer], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" }),\n `${fileName}.xlsx`,\n );\n}\n","\"use client\";\n\nimport type { RowData } from \"@tanstack/react-table\";\nimport {\n ArrowDown,\n ArrowUp,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n ChevronsUpDown,\n Download,\n EyeOff,\n ListFilter,\n PinOff,\n Search,\n Settings2,\n X,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"@/components/button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/dropdown-menu\";\nimport { Input } from \"@/components/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/select\";\nimport { cn } from \"@/lib/cn\";\nimport { columnLabel, downloadCsv, downloadExcel } from \"./export\";\nimport type { DataTableColumn, DataTableTable } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Column header */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableColumnHeaderProps<Row extends RowData>\n extends Omit<React.ComponentProps<\"div\">, \"title\"> {\n column: DataTableColumn<Row, any>;\n title: React.ReactNode;\n}\n\n/**\n * Header content for one column: the title as a sort toggle when the column\n * sorts, and a menu with sort, pin and hide when any of those apply. The\n * table renders it for every string `header` automatically; use it inside a\n * custom header function to keep the same affordances.\n */\nfunction DataTableColumnHeader<Row extends RowData>({\n column,\n title,\n className,\n ...props\n}: DataTableColumnHeaderProps<Row>) {\n const canSort = column.getCanSort();\n const canHide = column.getCanHide();\n const canPin = column.getCanPin();\n const sorted = column.getIsSorted();\n const align = column.columnDef.meta?.align ?? \"start\";\n\n if (!canSort && !canHide && !canPin) {\n return (\n <div data-slot=\"data-table-column-header\" className={cn(\"truncate\", className)} {...props}>\n {title}\n </div>\n );\n }\n\n const label = typeof title === \"string\" ? title : columnLabel(column);\n\n return (\n <div\n data-slot=\"data-table-column-header\"\n className={cn(\n \"group/header -mx-2 flex min-w-0 items-center\",\n // Leave room for the floating options trigger only while it shows;\n // anchored text does not move, it truncates if it must.\n align === \"end\" ? \"justify-end group-hover/head:pl-6\" : \"group-hover/head:pr-6\",\n align === \"center\" && \"justify-center\",\n className,\n )}\n {...props}\n >\n <button\n type=\"button\"\n data-slot=\"data-table-sort\"\n disabled={!canSort}\n onClick={canSort ? column.getToggleSortingHandler() : undefined}\n className={cn(\n \"inline-flex h-7 min-w-0 items-center gap-1 rounded-[var(--ds-radius-sm)] px-2 outline-none\",\n \"text-inherit transition-colors duration-[var(--ds-duration-fast)]\",\n canSort && \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:cursor-default\",\n )}\n >\n <span className=\"truncate\">{title}</span>\n {canSort ? (\n sorted === \"asc\" ? (\n <ArrowUp aria-hidden className=\"size-3.5 shrink-0 text-[color:var(--ds-primary)]\" />\n ) : sorted === \"desc\" ? (\n <ArrowDown aria-hidden className=\"size-3.5 shrink-0 text-[color:var(--ds-primary)]\" />\n ) : (\n // Out of flow until hover so narrow headers keep their full title.\n <ChevronsUpDown\n aria-hidden\n className=\"hidden size-3.5 shrink-0 opacity-60 group-hover/head:inline-block\"\n />\n )\n ) : null}\n </button>\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`${label} column options`}\n className={cn(\n // Floats over the cell edge so it costs the title no width.\n \"absolute top-1/2 z-[1] inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-[var(--ds-radius-sm)] outline-none\",\n align === \"end\" ? \"left-1\" : \"right-1\",\n \"bg-[var(--ds-muted)] opacity-0 transition-opacity duration-[var(--ds-duration-fast)]\",\n \"group-hover/head:opacity-100 focus-visible:opacity-100 data-[popup-open]:opacity-100\",\n \"hover:bg-[var(--ds-hover)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <ChevronDown className=\"size-3.5\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align === \"end\" ? \"end\" : \"start\"}>\n {canSort ? (\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={() => column.toggleSorting(false)}>\n <ArrowUp /> Sort ascending\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.toggleSorting(true)}>\n <ArrowDown /> Sort descending\n </DropdownMenuItem>\n {sorted ? (\n <DropdownMenuItem onClick={() => column.clearSorting()}>\n <ChevronsUpDown /> Clear sort\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuGroup>\n ) : null}\n {canSort && (canPin || canHide) ? <DropdownMenuSeparator /> : null}\n {canPin ? (\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={() => column.pin(\"start\")}>\n <ChevronsLeft /> Pin left\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.pin(\"end\")}>\n <ChevronsRight /> Pin right\n </DropdownMenuItem>\n {column.getIsPinned() ? (\n <DropdownMenuItem onClick={() => column.pin(false)}>\n <PinOff /> Unpin\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuGroup>\n ) : null}\n {canPin && canHide ? <DropdownMenuSeparator /> : null}\n {canHide ? (\n <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>\n <EyeOff /> Hide column\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Faceted filter */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableFacetedFilterOption {\n value: string | number | boolean;\n label?: string;\n icon?: React.ComponentType<{ className?: string }>;\n}\n\nexport interface DataTableFacetedFilterProps<Row extends RowData> {\n column: DataTableColumn<Row, any>;\n title?: React.ReactNode;\n /** Fixed options; defaults to the column's distinct values with counts (client source only). */\n options?: DataTableFacetedFilterOption[];\n className?: string;\n}\n\n/**\n * A checkbox list of a column's values. The filter value is the array of\n * picked values; the column's `filterFn` (`oneOf` by default for\n * `meta.filter: \"faceted\"`) decides what that means, and a server source\n * receives it verbatim in `TableQuery.filters`.\n */\nfunction DataTableFacetedFilter<Row extends RowData>({\n column,\n title,\n options,\n className,\n}: DataTableFacetedFilterProps<Row>) {\n const raw = column.getFilterValue();\n const selected = new Set<unknown>(Array.isArray(raw) ? raw : raw == null ? [] : [raw]);\n const facets = options ? null : column.getFacetedUniqueValues();\n const items: DataTableFacetedFilterOption[] =\n options ??\n column.columnDef.meta?.filterOptions ??\n Array.from(facets?.keys() ?? [])\n .filter((v): v is string | number | boolean => v != null && typeof v !== \"object\")\n .sort((a, b) => String(a).localeCompare(String(b)))\n .map((value) => ({ value }));\n const label = title ?? columnLabel(column);\n\n const toggle = (value: unknown, checked: boolean) => {\n const next = new Set(selected);\n if (checked) next.add(value);\n else next.delete(value);\n column.setFilterValue(next.size ? Array.from(next) : undefined);\n };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-faceted-filter\"\n render={<Button variant=\"outline\" size=\"sm\" className={cn(\"border-dashed\", className)} />}\n >\n <ListFilter />\n {label}\n {selected.size ? (\n <span\n data-slot=\"data-table-filter-count\"\n className={cn(\n \"ml-1 inline-flex h-5 min-w-5 items-center justify-center rounded-[var(--ds-radius-sm)] px-1.5\",\n \"bg-[var(--ds-primary-soft)] text-[length:var(--ds-text-caption-sm)] font-medium text-[color:var(--ds-primary-soft-foreground)]\",\n )}\n >\n {selected.size}\n </span>\n ) : null}\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-80 min-w-48 overflow-y-auto\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>{label}</DropdownMenuLabel>\n {items.length === 0 ? (\n <div className=\"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n No values\n </div>\n ) : null}\n {items.map((item) => {\n const Icon = item.icon;\n const count = facets?.get(item.value);\n return (\n <DropdownMenuCheckboxItem\n key={String(item.value)}\n closeOnClick={false}\n checked={selected.has(item.value)}\n onCheckedChange={(checked) => toggle(item.value, checked)}\n >\n {Icon ? <Icon className=\"size-4 text-[color:var(--ds-muted-foreground)]\" /> : null}\n <span className=\"flex-1 truncate\">{item.label ?? String(item.value)}</span>\n {count !== undefined ? (\n <span className=\"ml-auto font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\">\n {count}\n </span>\n ) : null}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuGroup>\n {selected.size ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => column.setFilterValue(undefined)} className=\"justify-center\">\n Clear filter\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* View options */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableViewOptionsProps<Row extends RowData> {\n table: DataTableTable<Row>;\n className?: string;\n}\n\n/** Column visibility menu. */\nfunction DataTableViewOptions<Row extends RowData>({ table, className }: DataTableViewOptionsProps<Row>) {\n const columns = table.getAllLeafColumns().filter((c) => c.getCanHide());\n if (columns.length === 0) return null;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-view-options\"\n aria-label=\"Toggle columns\"\n render={<Button variant=\"outline\" size=\"sm\" className={className} />}\n >\n <Settings2 />\n View\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"max-h-80 min-w-40 overflow-y-auto\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n {columns.map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n closeOnClick={false}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) => column.toggleVisibility(checked)}\n >\n {columnLabel(column)}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n {!table.getIsAllColumnsVisible() ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => table.toggleAllColumnsVisible(true)}>Show all</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Export menu */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableExportMenuProps<Row extends RowData> {\n table: DataTableTable<Row>;\n fileName?: string;\n className?: string;\n}\n\nfunction DataTableExportMenu<Row extends RowData>({ table, fileName, className }: DataTableExportMenuProps<Row>) {\n const selected = table.getSelectedRowModel().rows;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"data-table-export\"\n aria-label=\"Export\"\n render={<Button variant=\"outline\" size=\"sm\" className={className} />}\n >\n <Download />\n Export\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => downloadCsv(table, fileName)}>CSV</DropdownMenuItem>\n <DropdownMenuItem onClick={() => void downloadExcel(table, fileName)}>Excel</DropdownMenuItem>\n {selected.length ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => downloadCsv(table, fileName, selected)}>\n CSV of {selected.length} selected\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => void downloadExcel(table, fileName, selected)}>\n Excel of {selected.length} selected\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Toolbar */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTableToolbarProps<Row extends RowData>\n extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n table: DataTableTable<Row>;\n /** Placeholder for the search box. @default \"Search…\" */\n searchPlaceholder?: string;\n /** Rendered while rows are selected, in place of the filters. */\n bulkActions?: (ctx: { rows: Row[]; table: DataTableTable<Row> }) => React.ReactNode;\n /** Extra controls on the right, before the view and export menus. */\n children?: React.ReactNode;\n /** @default true */\n enableExport?: boolean;\n exportFileName?: string;\n}\n\n/**\n * Search box, one faceted filter per `meta.filter: \"faceted\"` column, a reset\n * when anything is filtered, and the view / export menus. While rows are\n * selected the left side becomes the selection summary and `bulkActions`.\n */\nfunction DataTableToolbar<Row extends RowData>({\n table,\n searchPlaceholder = \"Search…\",\n bulkActions,\n children,\n enableExport = true,\n exportFileName,\n className,\n ...props\n}: DataTableToolbarProps<Row>) {\n const globalFilter = (table.state.globalFilter as string | undefined) ?? \"\";\n const canSearch = table.options.enableGlobalFilter !== false;\n const facetedColumns = table\n .getAllLeafColumns()\n .filter((c) => c.columnDef.meta?.filter === \"faceted\" && c.getCanFilter());\n const isFiltered = table.state.columnFilters.length > 0 || globalFilter !== \"\";\n const selectedRows = table.options.enableRowSelection ? table.getSelectedRowModel().rows : [];\n\n return (\n <div\n data-slot=\"data-table-toolbar\"\n className={cn(\"flex flex-wrap items-center gap-2\", className)}\n {...props}\n >\n {selectedRows.length ? (\n <div data-slot=\"data-table-bulk-actions\" className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n <span className=\"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n <span className=\"font-medium text-[color:var(--ds-foreground)]\">{selectedRows.length}</span> selected\n </span>\n {bulkActions?.({ rows: selectedRows.map((r) => r.original), table })}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => table.resetRowSelection()}>\n Clear\n <X />\n </Button>\n </div>\n ) : (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n {canSearch ? (\n <div className=\"relative w-full max-w-64\">\n <Search\n aria-hidden\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-[color:var(--ds-text-tertiary)]\"\n />\n <Input\n data-slot=\"data-table-search\"\n type=\"search\"\n aria-label=\"Search\"\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => table.setGlobalFilter(e.target.value)}\n className=\"h-8 pl-8 text-[length:var(--ds-text-caption-lg)]\"\n />\n </div>\n ) : null}\n {facetedColumns.map((column) => (\n <DataTableFacetedFilter key={column.id} column={column} />\n ))}\n {isFiltered ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n table.resetColumnFilters();\n table.setGlobalFilter(\"\");\n }}\n >\n Reset\n <X />\n </Button>\n ) : null}\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n {children}\n <DataTableViewOptions table={table} />\n {enableExport ? <DataTableExportMenu table={table} fileName={exportFileName} /> : null}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pagination */\n/* ------------------------------------------------------------------------ */\n\nexport interface DataTablePaginationProps<Row extends RowData> extends React.ComponentProps<\"div\"> {\n table: DataTableTable<Row>;\n /** @default [10, 25, 50, 100] */\n pageSizeOptions?: number[];\n}\n\nconst DEFAULT_PAGE_SIZES = [10, 25, 50, 100];\n\nfunction DataTablePagination<Row extends RowData>({\n table,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n className,\n ...props\n}: DataTablePaginationProps<Row>) {\n const { pageIndex, pageSize } = table.state.pagination;\n const total = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = total === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min(total, (pageIndex + 1) * pageSize);\n const sizes = pageSizeOptions.includes(pageSize)\n ? pageSizeOptions\n : [...pageSizeOptions, pageSize].sort((a, b) => a - b);\n const sizeItems = sizes.map((s) => ({ value: String(s), label: String(s) }));\n\n const navButton = (label: string, icon: React.ReactNode, onClick: () => void, disabled: boolean) => (\n <Button variant=\"outline\" size=\"icon-sm\" aria-label={label} onClick={onClick} disabled={disabled}>\n {icon}\n </Button>\n );\n\n return (\n <div\n data-slot=\"data-table-pagination\"\n className={cn(\n \"flex flex-wrap items-center justify-between gap-3\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <Select\n items={sizeItems}\n value={String(pageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" aria-label=\"Rows per page\" className=\"min-w-0 w-[4.5rem]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {sizeItems.map((item) => (\n <SelectItem key={item.value} value={item.value}>\n {item.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-4\">\n <span data-slot=\"data-table-range\" aria-live=\"polite\">\n {from}–{to} of {total}\n </span>\n <div className=\"flex items-center gap-1\">\n {navButton(\"First page\", <ChevronsLeft />, () => table.firstPage(), !table.getCanPreviousPage())}\n {navButton(\"Previous page\", <ChevronLeft />, () => table.previousPage(), !table.getCanPreviousPage())}\n <span className=\"px-1 tabular-nums\">\n {pageCount === 0 ? 0 : pageIndex + 1} / {pageCount}\n </span>\n {navButton(\"Next page\", <ChevronRight />, () => table.nextPage(), !table.getCanNextPage())}\n {navButton(\"Last page\", <ChevronsRight />, () => table.lastPage(), !table.getCanNextPage())}\n </div>\n </div>\n </div>\n );\n}\n\nexport {\n DataTableColumnHeader,\n DataTableExportMenu,\n DataTableFacetedFilter,\n DataTablePagination,\n DataTableToolbar,\n DataTableViewOptions,\n};\n","import {\n columnFacetingFeature,\n columnFilteringFeature,\n columnPinningFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n constructFilterFn,\n createColumnHelper as createTanstackColumnHelper,\n createExpandedRowModel,\n createFacetedRowModel,\n createFacetedUniqueValues,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFn_arrIncludes,\n filterFn_arrIncludesSome,\n filterFn_equals,\n filterFn_equalsString,\n filterFn_inDateRange,\n filterFn_inNumberRange,\n filterFn_includesString,\n filterFn_weakEquals,\n globalFilteringFeature,\n metaHelper,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n sortFn_datetime,\n sortFn_text,\n tableFeatures,\n type ColumnHelper,\n type RowData,\n} from \"@tanstack/react-table\";\nimport type { DataTableColumnMeta } from \"./types\";\n\n/**\n * TanStack Table v9 registers features explicitly; an API that is not in this\n * object does not exist on the table. `DataTable` registers everything the\n * design decision lists so a consumer never has to touch the registry, and\n * pays for it once, not per table.\n *\n * `filterFn: \"auto\"` resolves by the column's first non-null value to\n * `includesString` / `inNumberRange` / `equals` / `arrIncludes` /\n * `inDateRange` / `weakEquals`, so those built-ins are registered under their\n * conventional names. `oneOf` is ours: the faceted filter stores an array of\n * picked values and a row passes when its scalar value is one of them.\n */\nconst filterFn_oneOf = constructFilterFn({\n filter: (dataValue: unknown, filterValue: unknown) =>\n Array.isArray(filterValue) ? filterValue.includes(dataValue) : dataValue === filterValue,\n autoRemove: (value: unknown) =>\n value == null || value === \"\" || (Array.isArray(value) && value.length === 0),\n});\n\nconst baseFeatures = tableFeatures({\n columnFilteringFeature,\n globalFilteringFeature,\n columnFacetingFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n columnVisibilityFeature,\n columnPinningFeature,\n columnSizingFeature,\n columnResizingFeature,\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n facetedRowModel: createFacetedRowModel(),\n facetedUniqueValues: createFacetedUniqueValues(),\n filterFns: {\n includesString: filterFn_includesString,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n inNumberRange: filterFn_inNumberRange,\n arrIncludes: filterFn_arrIncludes,\n arrIncludesSome: filterFn_arrIncludesSome,\n inDateRange: filterFn_inDateRange,\n weakEquals: filterFn_weakEquals,\n oneOf: filterFn_oneOf,\n },\n sortFns: {\n alphanumeric: sortFn_alphanumeric,\n basic: sortFn_basic,\n datetime: sortFn_datetime,\n text: sortFn_text,\n },\n columnMeta: metaHelper<DataTableColumnMeta<any>>(),\n});\n\n/**\n * The registry type, re-keyed to the consumer's row type so `meta.onCommit`\n * receives a typed row. The runtime object is the same for every table.\n */\nexport type DataTableFeatures<Row extends RowData> = Omit<typeof baseFeatures, \"columnMeta\"> & {\n columnMeta: DataTableColumnMeta<Row>;\n};\n\nexport function dataTableFeatures<Row extends RowData>(): DataTableFeatures<Row> {\n return baseFeatures as unknown as DataTableFeatures<Row>;\n}\n\n/**\n * `createColumnHelper` bound to the DataTable feature set. v9's helper takes\n * the features as its first type argument; this saves consumers from\n * importing the registry.\n *\n * @example\n * const helper = createColumnHelper<Contact>();\n * const columns = helper.columns([\n * helper.accessor(\"name\", { header: \"Name\" }),\n * helper.accessor(\"status\", { header: \"Status\", meta: { filter: \"faceted\" } }),\n * ]);\n */\nexport function createColumnHelper<Row extends RowData>(): ColumnHelper<DataTableFeatures<Row>, Row> {\n return createTanstackColumnHelper<DataTableFeatures<Row>, Row>();\n}\n","\"use client\";\n\nimport type { ColumnHelper, RowData } from \"@tanstack/react-table\";\nimport { ChevronRight } from \"lucide-react\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { cn } from \"@/lib/cn\";\nimport type { DataTableFeatures } from \"./features\";\nimport type { DataTableColumnDef } from \"./types\";\n\n/**\n * Columns the table adds on the consumer's behalf: the selection checkbox\n * when `enableRowSelection` is set, the expander when a `renderSubComponent`\n * is given. Both are display columns, neither sorts, hides, resizes or\n * exports, and a consumer column with the same id replaces them.\n */\nexport function selectColumn<Row extends RowData>(\n helper: ColumnHelper<DataTableFeatures<Row>, Row>,\n): DataTableColumnDef<Row, unknown> {\n return helper.display({\n id: \"select\",\n header: ({ table }) => {\n const all = table.getIsAllPageRowsSelected();\n const some = table.getIsSomePageRowsSelected() && !all;\n return (\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={all}\n indeterminate={some}\n onCheckedChange={(checked) => table.toggleAllPageRowsSelected(Boolean(checked))}\n />\n );\n },\n cell: ({ row }) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(checked) => row.toggleSelected(Boolean(checked))}\n />\n ),\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n meta: { exportable: false, align: \"center\", cellClassName: \"px-2\", headerClassName: \"px-2\" },\n });\n}\n\nexport function expandColumn<Row extends RowData>(\n helper: ColumnHelper<DataTableFeatures<Row>, Row>,\n): DataTableColumnDef<Row, unknown> {\n return helper.display({\n id: \"expand\",\n header: () => <span className=\"sr-only\">Expand</span>,\n cell: ({ row }) =>\n row.getCanExpand() ? (\n <button\n type=\"button\"\n data-slot=\"data-table-expander\"\n aria-label={row.getIsExpanded() ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={row.getIsExpanded()}\n onClick={row.getToggleExpandedHandler()}\n className={cn(\n \"inline-flex size-6 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <ChevronRight\n className={cn(\n \"size-4 transition-transform duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n row.getIsExpanded() && \"rotate-90\",\n )}\n />\n </button>\n ) : null,\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n meta: { exportable: false, align: \"center\", cellClassName: \"px-2\", headerClassName: \"px-2\" },\n });\n}\n","\"use client\";\n\nimport {\n keepPreviousData,\n QueryClientContext,\n useInfiniteQuery,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ServerSource, TableQuery, TableResult } from \"./types\";\n\nexport interface ServerSourceState<Row> {\n rows: Row[];\n total: number | undefined;\n isLoading: boolean;\n isFetching: boolean;\n error: Error | null;\n refetch: () => void;\n fetchNextPage: () => void;\n hasNextPage: boolean;\n}\n\nconst EMPTY: never[] = [];\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/** The part of a query that identifies a result set; the page is separate so infinite mode can append. */\nfunction scopeOf(query: TableQuery): Omit<TableQuery, \"page\"> {\n const { page: _page, ...scope } = query;\n return scope;\n}\n\n/**\n * Runs a server source. With a `QueryClientProvider` above the table, pages\n * go through TanStack Query: cached by query, previous page kept on screen\n * while the next loads, and the in-flight request aborted through `signal`\n * when the query changes. Without one, a small local fetch state does the\n * same minus the cache, so the table never requires the optional peer to be\n * wired up.\n *\n * The strategy is chosen once per mount: a provider appearing or vanishing\n * mid-life would change the hook order, which React forbids, and is not a\n * real scenario.\n */\nexport function useServerSource<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const client = React.useContext(QueryClientContext);\n const [strategy] = React.useState<\"query\" | \"local\">(() => (client ? \"query\" : \"local\"));\n // Hook order is stable for the life of the component because `strategy` is.\n return strategy === \"query\"\n ? useQueryStrategy(source, query, mode)\n : useLocalStrategy(source, query, mode);\n}\n\nfunction useQueryStrategy<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const id = React.useId();\n const base = source?.queryKey ?? [\"cortena-data-table\", id];\n const infinite = mode === \"infinite\";\n const fetch = source?.fetch;\n\n const page = useQuery({\n queryKey: [...base, \"page\", query],\n queryFn: ({ signal }) => fetch!(query, signal),\n enabled: Boolean(fetch) && !infinite,\n placeholderData: keepPreviousData,\n });\n\n const scope = scopeOf(query);\n const pages = useInfiniteQuery({\n queryKey: [...base, \"infinite\", scope],\n queryFn: ({ pageParam, signal }) => fetch!({ ...scope, page: pageParam }, signal),\n initialPageParam: 0,\n getNextPageParam: (last: TableResult<Row>, all: TableResult<Row>[]) => {\n const loaded = all.reduce((n, p) => n + p.rows.length, 0);\n return loaded < last.total && last.rows.length > 0 ? all.length : undefined;\n },\n enabled: Boolean(fetch) && infinite,\n placeholderData: keepPreviousData,\n });\n\n const flatRows = React.useMemo(\n () => (pages.data ? pages.data.pages.flatMap((p) => p.rows) : EMPTY),\n [pages.data],\n );\n\n if (!fetch) {\n return {\n rows: EMPTY,\n total: undefined,\n isLoading: false,\n isFetching: false,\n error: null,\n refetch: () => {},\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n }\n\n if (infinite) {\n return {\n rows: flatRows,\n total: pages.data?.pages.at(-1)?.total,\n isLoading: pages.isPending,\n isFetching: pages.isFetching,\n error: pages.error ? toError(pages.error) : null,\n refetch: () => void pages.refetch(),\n fetchNextPage: () => {\n if (pages.hasNextPage && !pages.isFetchingNextPage) void pages.fetchNextPage();\n },\n hasNextPage: pages.hasNextPage,\n };\n }\n\n return {\n rows: page.data?.rows ?? EMPTY,\n total: page.data?.total,\n isLoading: page.isPending,\n isFetching: page.isFetching,\n error: page.error ? toError(page.error) : null,\n refetch: () => void page.refetch(),\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n}\n\ninterface LocalState<Row> {\n pages: TableResult<Row>[];\n scopeKey: string;\n page: number;\n isFetching: boolean;\n error: Error | null;\n}\n\nfunction useLocalStrategy<Row>(\n source: ServerSource<Row> | undefined,\n query: TableQuery,\n mode: \"pages\" | \"infinite\" | \"none\",\n): ServerSourceState<Row> {\n const infinite = mode === \"infinite\";\n const fetch = source?.fetch;\n const scope = scopeOf(query);\n const scopeKey = JSON.stringify(scope);\n const [tick, setTick] = React.useState(0);\n // Pages wanted in infinite mode, scoped so a new query starts over at one.\n const [wanted, setWanted] = React.useState({ scopeKey, n: 1 });\n const wantedPages = wanted.scopeKey === scopeKey ? wanted.n : 1;\n const [state, setState] = React.useState<LocalState<Row>>({\n pages: [],\n scopeKey,\n page: -1,\n isFetching: false,\n error: null,\n });\n\n const loadedForScope = state.scopeKey === scopeKey ? state.pages : EMPTY;\n const targetPage = infinite ? loadedForScope.length : query.page;\n const needs = infinite\n ? loadedForScope.length < wantedPages\n : !(state.scopeKey === scopeKey && state.page === query.page && state.pages.length > 0);\n const requestKey = `${scopeKey}|${targetPage}|${tick}`;\n\n // The consumer's `fetch` is usually an inline arrow — `fetch: q => api.list(q)`\n // is the documented call — so it is a new function on every parent render.\n // Depending on it would abort and refire the request each time; the request's\n // identity is `requestKey`, so the latest function is read from a ref instead.\n const fetchRef = React.useRef(fetch);\n React.useEffect(() => {\n fetchRef.current = fetch;\n });\n\n const hasFetch = Boolean(fetch);\n\n React.useEffect(() => {\n const run = fetchRef.current;\n if (!run || !needs) return;\n const controller = new AbortController();\n setState((s) => ({ ...s, isFetching: true }));\n run({ ...scope, page: targetPage }, controller.signal).then(\n (result) => {\n if (controller.signal.aborted) return;\n setState((s) => ({\n pages: infinite && s.scopeKey === scopeKey ? [...s.pages, result] : [result],\n scopeKey,\n page: targetPage,\n isFetching: false,\n error: null,\n }));\n },\n (err: unknown) => {\n if (controller.signal.aborted) return;\n setState((s) => ({ ...s, isFetching: false, error: toError(err) }));\n },\n );\n return () => controller.abort();\n // `requestKey` is the identity of the request; `scope` and `targetPage` derive\n // from it. `fetch` itself is held in a ref, so only its presence is a dep.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasFetch, requestKey, needs]);\n\n // Like keepPreviousData: the last result stays on screen while the next loads.\n const rows = React.useMemo(\n () => (infinite ? state.pages.flatMap((p) => p.rows) : (state.pages[0]?.rows ?? EMPTY)),\n [state.pages, infinite],\n );\n const total = state.pages.at(-1)?.total;\n const hasNextPage = infinite && total !== undefined && rows.length < total;\n\n if (!fetch) {\n return {\n rows: EMPTY,\n total: undefined,\n isLoading: false,\n isFetching: false,\n error: null,\n refetch: () => {},\n fetchNextPage: () => {},\n hasNextPage: false,\n };\n }\n\n return {\n rows,\n total,\n isLoading: state.pages.length === 0 && !state.error,\n isFetching: state.isFetching,\n error: state.error,\n refetch: () => {\n setState((s) => ({ ...s, pages: [], page: -1, error: null }));\n setTick((t) => t + 1);\n },\n fetchNextPage: () => {\n if (hasNextPage && !state.isFetching) setWanted({ scopeKey, n: loadedForScope.length + 1 });\n },\n hasNextPage,\n };\n}\n","\"use client\";\n\nimport {\n useTable,\n type ColumnFiltersState,\n type PaginationState,\n type RowData,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport { createColumnHelper, dataTableFeatures } from \"./features\";\nimport { expandColumn, selectColumn } from \"./system-columns\";\nimport type {\n DataSource,\n DataTableColumnDef,\n DataTableEditingCell,\n DataTableInstance,\n DataTableRow,\n DataTableTable,\n TableQuery,\n UseDataTableOptions,\n} from \"./types\";\nimport { useServerSource } from \"./use-server-source\";\n\nconst EMPTY_ROWS: never[] = [];\n\nfunction useDebounced<T>(value: T, ms: number): T {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n if (ms <= 0) {\n setDebounced(value);\n return;\n }\n const id = setTimeout(() => setDebounced(value), ms);\n return () => clearTimeout(id);\n }, [value, ms]);\n return ms <= 0 ? value : debounced;\n}\n\n/**\n * Builds the table for a `dataSource`. This is where the design decision's\n * \"the component sets the manual flags itself\" lives: a server source flips\n * `manualFiltering`, `manualSorting` and `manualPagination` and feeds the\n * table's own filter / sort / page state back out as a `TableQuery`; a client\n * source leaves every row model in memory. Everything else (selection,\n * expansion, visibility, pinning, sizing) is owned by the table.\n *\n * Use it directly when the default layout is not enough: pass the returned\n * `table` to `DataTableToolbar`, `DataTablePagination` and friends, or the\n * whole instance to `<DataTable instance={...} />`.\n */\nexport function useDataTable<Row extends RowData>(\n options: UseDataTableOptions<Row>,\n): DataTableInstance<Row> {\n const {\n columns,\n dataSource,\n getRowId,\n getSubRows,\n pagination: paginationMode = \"pages\",\n pageSize = 25,\n enableRowSelection = false,\n enableExpanding = false,\n getRowCanExpand,\n enableSorting = true,\n enableMultiSort = false,\n enableGlobalFilter = true,\n enableColumnFilters = true,\n enableHiding = true,\n enableColumnPinning = true,\n enableColumnResizing = false,\n initialState,\n onCellCommit,\n onRowSelectionChange,\n searchDebounceMs = 250,\n } = options;\n\n const isServer = dataSource.kind === \"server\";\n\n // Slices the server query is built from are React state; the table mirrors\n // them through `state` + `on*Change`, which v9 still supports alongside atoms.\n const [globalFilter, setGlobalFilter] = React.useState<string>(\n (initialState?.globalFilter as string | undefined) ?? \"\",\n );\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n initialState?.columnFilters ?? [],\n );\n const [sorting, setSorting] = React.useState<SortingState>(initialState?.sorting ?? []);\n const [pagination, setPagination] = React.useState<PaginationState>(\n initialState?.pagination ?? { pageIndex: 0, pageSize },\n );\n\n const searchQuery = useDebounced(globalFilter, isServer ? searchDebounceMs : 0);\n\n // A new search, filter or sort starts from page one again. Client sources\n // get this from `autoResetPageIndex`; manual pagination has to do it here.\n const scopeKey = JSON.stringify([searchQuery, columnFilters, sorting]);\n const lastScope = React.useRef(scopeKey);\n React.useEffect(() => {\n if (lastScope.current === scopeKey) return;\n lastScope.current = scopeKey;\n setPagination((p) => (p.pageIndex === 0 ? p : { ...p, pageIndex: 0 }));\n }, [scopeKey]);\n\n const query = React.useMemo<TableQuery>(\n () => ({\n q: searchQuery || undefined,\n filters: columnFilters.length ? columnFilters : undefined,\n sort: sorting.length ? sorting : undefined,\n page: pagination.pageIndex,\n pageSize: pagination.pageSize,\n }),\n [searchQuery, columnFilters, sorting, pagination.pageIndex, pagination.pageSize],\n );\n\n const server = useServerSource<Row>(isServer ? dataSource : undefined, query, paginationMode);\n\n const data: ReadonlyArray<Row> = isServer ? server.rows : dataSource.rows;\n\n // System columns first; then each consumer column with its meta defaults\n // applied (a faceted column filters with `oneOf` unless told otherwise).\n const resolvedColumns = React.useMemo(() => {\n const helper = createColumnHelper<Row>();\n const out: DataTableColumnDef<Row, any>[] = [];\n if (enableRowSelection && !columns.some((c) => c.id === \"select\")) out.push(selectColumn(helper));\n if (enableExpanding && !columns.some((c) => c.id === \"expand\")) out.push(expandColumn(helper));\n for (const column of columns) {\n const filter = column.meta?.filter;\n if (filter === \"faceted\" && column.filterFn === undefined) {\n out.push({ ...column, filterFn: \"oneOf\" });\n } else if (filter === \"text\" && column.filterFn === undefined) {\n out.push({ ...column, filterFn: \"includesString\" });\n } else {\n out.push(column);\n }\n }\n return out;\n }, [columns, enableRowSelection, enableExpanding]);\n\n const table: DataTableTable<Row> = useTable({\n features: dataTableFeatures<Row>(),\n columns: resolvedColumns,\n data: data.length ? data : EMPTY_ROWS,\n getRowId,\n getSubRows,\n initialState,\n state: { globalFilter, columnFilters, sorting, pagination },\n onGlobalFilterChange: setGlobalFilter,\n onColumnFiltersChange: setColumnFilters,\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n manualFiltering: isServer,\n manualSorting: isServer,\n manualPagination: isServer || paginationMode !== \"pages\",\n rowCount: isServer ? server.total : undefined,\n enableRowSelection,\n enableExpanding,\n getRowCanExpand: getRowCanExpand ?? (enableExpanding ? () => true : undefined),\n enableSorting,\n enableMultiSort,\n enableGlobalFilter,\n enableColumnFilters,\n enableHiding,\n enableColumnPinning,\n enableColumnResizing,\n columnResizeMode: \"onChange\",\n globalFilterFn: \"includesString\",\n });\n\n // Selection callback with original rows, for consumers that keep selection outside.\n const rowSelection = table.state.rowSelection;\n const onSelectionRef = React.useRef(onRowSelectionChange);\n onSelectionRef.current = onRowSelectionChange;\n const firstSelection = React.useRef(true);\n React.useEffect(() => {\n if (firstSelection.current) {\n firstSelection.current = false;\n return;\n }\n onSelectionRef.current?.(table.getSelectedRowModel().rows.map((r) => r.original));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowSelection]);\n\n const [editingCell, setEditingCell] = React.useState<DataTableEditingCell | null>(null);\n const commit = React.useCallback(\n async (row: DataTableRow<Row>, columnId: string, value: unknown) => {\n const meta = table.getColumn(columnId)?.columnDef.meta;\n const handler = meta?.onCommit ?? onCellCommit;\n await handler?.(row.original, columnId, value);\n },\n [table, onCellCommit],\n );\n const editing = React.useMemo(\n () => ({\n cell: editingCell,\n start: (cell: DataTableEditingCell) => setEditingCell(cell),\n stop: () => setEditingCell(null),\n commit,\n }),\n [editingCell, commit],\n );\n\n const total = isServer\n ? (server.total ?? 0)\n : paginationMode === \"pages\"\n ? table.getPrePaginatedRowModel().rows.length\n : table.getRowModel().rows.length;\n\n return {\n table,\n dataSource: dataSource as DataSource<Row>,\n paginationMode,\n rows: data as Row[],\n total,\n isLoading: server.isLoading,\n isFetching: server.isFetching,\n error: server.error,\n refetch: server.refetch,\n fetchNextPage: server.fetchNextPage,\n hasNextPage: server.hasNextPage,\n searchQuery,\n editing,\n };\n}\n","\"use client\";\n\nimport type { RowData } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { Inbox } from \"lucide-react\";\nimport * as React from \"react\";\nimport { ErrorBanner } from \"@/components/error-banner\";\nimport { Input } from \"@/components/input\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { Spinner } from \"@/components/spinner\";\nimport { cn } from \"@/lib/cn\";\nimport { DataTableColumnHeader, DataTablePagination, DataTableToolbar } from \"./parts\";\nimport type {\n DataTableCell,\n DataTableColumn,\n DataTableInstance,\n DataTableRow,\n DataTableTable,\n UseDataTableOptions,\n} from \"./types\";\nimport { useDataTable } from \"./use-data-table\";\n\n/**\n * DataTable — the composite from cortenaUI&Design/04-data-tables.md.\n *\n * `<DataTable columns={columns} dataSource={{ kind: \"client\", rows }} />`\n * renders a complete table: toolbar with search, faceted filters, view and\n * export menus; sortable, pinnable, hideable, resizable columns; sticky\n * header; pager; and, past 100 rows, virtualised rows. A server source\n * changes nothing in the markup and everything in the data flow.\n *\n * Markup is a real `<table>` with `role=\"grid\"` so screen readers get rows\n * and columns, and keyboard users get one tab stop with arrow-key movement\n * between cells (roving tabindex), Enter to edit an editable cell, Escape to\n * cancel, Space to toggle selection.\n *\n * Virtualised bodies keep the table element: rows outside the viewport are\n * replaced by two spacer rows sized from the virtualizer, which keeps column\n * widths, sticky headers and pinned columns working without absolute\n * positioning.\n */\n\nconst VIRTUALIZE_ABOVE = 100;\nconst DEFAULT_VIRTUAL_HEIGHT = 600;\nconst INFINITE_THRESHOLD_PX = 240;\n\nexport interface DataTableViewProps<Row extends RowData> {\n className?: string;\n /** Height of the scrolling body. Required for virtualisation to mean anything; defaults to 600px when virtualised. */\n maxHeight?: number | string;\n /** Force virtualisation on or off; undefined virtualises above 100 rows. */\n virtualize?: boolean;\n /** Estimated row height in px for the virtualizer. @default 40 */\n rowHeight?: number;\n /** @default true */\n stickyHeader?: boolean;\n /** @default \"default\" */\n density?: \"default\" | \"compact\";\n /** Detail panel under an expanded row; enables the expander column. */\n renderSubComponent?: (row: DataTableRow<Row>) => React.ReactNode;\n /** `false` hides the toolbar; a function replaces it. */\n toolbar?: boolean | ((ctx: { instance: DataTableInstance<Row> }) => React.ReactNode);\n /** Rendered in the toolbar while rows are selected. */\n bulkActions?: (ctx: { rows: Row[]; table: DataTableTable<Row> }) => React.ReactNode;\n /** Extra toolbar controls (right side). */\n toolbarActions?: React.ReactNode;\n searchPlaceholder?: string;\n emptyState?: React.ReactNode;\n /** @default \"No results\" */\n emptyMessage?: string;\n pageSizeOptions?: number[];\n /** @default true */\n enableExport?: boolean;\n /** @default \"export\" */\n exportFileName?: string;\n /** Show the loading skeleton regardless of the source's own state. */\n loading?: boolean;\n /** Error to show above the table, in addition to the server source's. */\n error?: string | Error | null;\n onRowClick?: (row: Row, event: React.MouseEvent<HTMLTableRowElement>) => void;\n /**\n * The row a detail pane is currently showing, matched against the row id\n * (`getRowId`, the row index when that is not set). It gets `data-active`\n * and the `--ds-primary-soft` tint, independent of checkbox selection — a\n * master/detail list highlights one row without selecting it, and a table\n * with both can show a selected set and one open row at once.\n */\n activeRowId?: string | null;\n /** Extra classes per row, e.g. to dim rows the app considers stale. */\n rowClassName?: (row: Row) => string | undefined;\n}\n\nexport type DataTableProps<Row extends RowData> = DataTableViewProps<Row> &\n ({ instance: DataTableInstance<Row> } | UseDataTableOptions<Row>);\n\nfunction DataTable<Row extends RowData>(props: DataTableProps<Row>) {\n if (\"instance\" in props) {\n const { instance, ...view } = props;\n return <DataTableView instance={instance} {...view} />;\n }\n return <DataTableOwned {...props} />;\n}\n\nfunction DataTableOwned<Row extends RowData>(props: DataTableViewProps<Row> & UseDataTableOptions<Row>) {\n const {\n className,\n maxHeight,\n virtualize,\n rowHeight,\n stickyHeader,\n density,\n renderSubComponent,\n toolbar,\n bulkActions,\n toolbarActions,\n searchPlaceholder,\n emptyState,\n emptyMessage,\n pageSizeOptions,\n enableExport,\n exportFileName,\n loading,\n error,\n onRowClick,\n activeRowId,\n rowClassName,\n ...options\n } = props;\n const instance = useDataTable<Row>({\n ...options,\n enableExpanding: options.enableExpanding ?? Boolean(renderSubComponent),\n });\n return (\n <DataTableView\n instance={instance}\n className={className}\n maxHeight={maxHeight}\n virtualize={virtualize}\n rowHeight={rowHeight}\n stickyHeader={stickyHeader}\n density={density}\n renderSubComponent={renderSubComponent}\n toolbar={toolbar}\n bulkActions={bulkActions}\n toolbarActions={toolbarActions}\n searchPlaceholder={searchPlaceholder}\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n pageSizeOptions={pageSizeOptions}\n enableExport={enableExport}\n exportFileName={exportFileName}\n loading={loading}\n error={error}\n onRowClick={onRowClick}\n activeRowId={activeRowId}\n rowClassName={rowClassName}\n />\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pinning */\n/* ------------------------------------------------------------------------ */\n\nfunction pinAttrs<Row extends RowData>(\n column: DataTableColumn<Row, any>,\n table: DataTableTable<Row>,\n): { style: React.CSSProperties; pinned: \"start\" | \"end\" | undefined; edge: boolean } {\n const pinned = column.getIsPinned();\n if (!pinned) return { style: {}, pinned: undefined, edge: false };\n if (pinned === \"start\") {\n const last = table.getStartVisibleLeafColumns().at(-1);\n return {\n style: { position: \"sticky\", left: column.getStart(\"start\") },\n pinned,\n edge: last?.id === column.id,\n };\n }\n const first = table.getEndVisibleLeafColumns()[0];\n return {\n style: { position: \"sticky\", right: column.getAfter(\"end\") },\n pinned,\n edge: first?.id === column.id,\n };\n}\n\nconst alignClass = { start: \"text-left\", center: \"text-center\", end: \"text-right\" } as const;\n\n/* ------------------------------------------------------------------------ */\n/* Editable cell */\n/* ------------------------------------------------------------------------ */\n\nfunction EditableCell<Row extends RowData>({\n cell,\n instance,\n onDone,\n}: {\n cell: DataTableCell<Row, any>;\n instance: DataTableInstance<Row>;\n onDone: () => void;\n}) {\n const editable = cell.column.columnDef.meta?.editable;\n const config = typeof editable === \"object\" ? editable : {};\n const initial = cell.getValue();\n const [draft, setDraft] = React.useState(initial == null ? \"\" : String(initial));\n const done = React.useRef(false);\n\n const finish = () => {\n done.current = true;\n instance.editing.stop();\n onDone();\n };\n const commit = () => {\n if (done.current) return;\n const value = config.parse ? config.parse(draft) : config.type === \"number\" ? Number(draft) : draft;\n void instance.editing.commit(cell.row, cell.column.id, value);\n finish();\n };\n const cancel = () => {\n if (done.current) return;\n finish();\n };\n\n return (\n <Input\n data-slot=\"data-table-editor\"\n autoFocus\n type={config.type === \"number\" ? \"number\" : \"text\"}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={(e) => e.target.select()}\n onBlur={commit}\n onKeyDown={(e) => {\n // The editor owns its keys; the grid must not move the focus cell.\n e.stopPropagation();\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n className=\"h-7 px-2 py-0 text-[length:var(--ds-text-body-sm)]\"\n />\n );\n}\n\n/* ------------------------------------------------------------------------ */\n/* View */\n/* ------------------------------------------------------------------------ */\n\ntype CellCoord = { r: number; c: number };\n\nfunction DataTableView<Row extends RowData>({\n instance,\n className,\n maxHeight,\n virtualize,\n rowHeight = 40,\n stickyHeader = true,\n density = \"default\",\n renderSubComponent,\n toolbar = true,\n bulkActions,\n toolbarActions,\n searchPlaceholder,\n emptyState,\n emptyMessage = \"No results\",\n pageSizeOptions,\n enableExport = true,\n exportFileName = \"export\",\n loading,\n error,\n onRowClick,\n activeRowId,\n rowClassName,\n}: DataTableViewProps<Row> & { instance: DataTableInstance<Row> }) {\n const { table, paginationMode } = instance;\n const rows = table.getRowModel().rows;\n const leafColumns = table.getVisibleLeafColumns();\n const colCount = leafColumns.length;\n const headerGroups = table.getHeaderGroups();\n const isVirtual = virtualize ?? rows.length > VIRTUALIZE_ABOVE;\n const isLoading = loading || instance.isLoading;\n const showSkeleton = isLoading && rows.length === 0;\n const showEmpty = !isLoading && rows.length === 0;\n const resolvedHeight = maxHeight ?? (isVirtual ? DEFAULT_VIRTUAL_HEIGHT : undefined);\n const errorMessage = error instanceof Error ? error.message : (error ?? instance.error?.message ?? \"\");\n\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const tableRef = React.useRef<HTMLTableElement>(null);\n\n /* Virtualisation ------------------------------------------------------ */\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n enabled: isVirtual,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => rowHeight,\n overscan: 8,\n getItemKey: (index) => rows[index]?.id ?? index,\n // An expanded row and its detail row are one virtual item.\n measureElement: (element) => {\n let height = element.getBoundingClientRect().height;\n const next = element.nextElementSibling as HTMLElement | null;\n if (next?.dataset.slot === \"data-table-subrow\") height += next.getBoundingClientRect().height;\n return height;\n },\n });\n const virtualItems = isVirtual ? virtualizer.getVirtualItems() : null;\n const paddingTop = virtualItems?.length ? virtualItems[0]!.start : 0;\n const paddingBottom = virtualItems?.length\n ? virtualizer.getTotalSize() - virtualItems[virtualItems.length - 1]!.end\n : 0;\n\n /* Infinite scroll ----------------------------------------------------- */\n\n const onScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n if (paginationMode !== \"infinite\" || !instance.hasNextPage || instance.isFetching) return;\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < INFINITE_THRESHOLD_PX) instance.fetchNextPage();\n },\n [paginationMode, instance],\n );\n\n /* Keyboard navigation ------------------------------------------------- */\n\n const [focused, setFocused] = React.useState<CellCoord>({ r: -1, c: 0 });\n const pendingFocus = React.useRef<CellCoord | null>(null);\n\n const cellElement = (coord: CellCoord) =>\n tableRef.current?.querySelector<HTMLElement>(\n `[data-row-index=\"${coord.r}\"][data-col-index=\"${coord.c}\"]`,\n ) ?? null;\n\n const focusCell = React.useCallback(\n (coord: CellCoord) => {\n const el = cellElement(coord);\n if (el) {\n setFocused(coord);\n el.focus();\n return;\n }\n if (isVirtual && coord.r >= 0) {\n pendingFocus.current = coord;\n setFocused(coord);\n virtualizer.scrollToIndex(coord.r, { align: \"auto\" });\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isVirtual, virtualizer],\n );\n\n React.useEffect(() => {\n const coord = pendingFocus.current;\n if (!coord) return;\n const el = cellElement(coord);\n if (el) {\n pendingFocus.current = null;\n el.focus();\n }\n });\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTableElement>) => {\n const target = event.target as HTMLElement;\n // Portaled menus bubble through React but live outside the table element.\n if (!tableRef.current?.contains(target)) return;\n if (instance.editing.cell) return;\n const cell = target.closest<HTMLElement>(\"[data-row-index][data-col-index]\");\n if (!cell) return;\n const r = Number(cell.dataset.rowIndex);\n const c = Number(cell.dataset.colIndex);\n const lastRow = rows.length - 1;\n const lastCol = colCount - 1;\n const onCellItself = target === cell;\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n focusCell({ r: Math.min(lastRow, r + 1), c });\n return;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell({ r: Math.max(-1, r - 1), c });\n return;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell({ r, c: Math.min(lastCol, c + 1) });\n return;\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell({ r, c: Math.max(0, c - 1) });\n return;\n case \"Home\":\n event.preventDefault();\n focusCell(event.ctrlKey ? { r: -1, c: 0 } : { r, c: 0 });\n return;\n case \"End\":\n event.preventDefault();\n focusCell(event.ctrlKey ? { r: lastRow, c: lastCol } : { r, c: lastCol });\n return;\n case \"PageDown\":\n event.preventDefault();\n focusCell({ r: Math.min(lastRow, r + 10), c });\n return;\n case \"PageUp\":\n event.preventDefault();\n focusCell({ r: Math.max(-1, r - 10), c });\n return;\n case \"Enter\": {\n if (!onCellItself) return;\n if (r === -1) {\n const column = leafColumns[c];\n if (column?.getCanSort()) {\n event.preventDefault();\n column.toggleSorting(undefined, event.shiftKey);\n }\n return;\n }\n const row = rows[r];\n const column = leafColumns[c];\n if (row && column && column.columnDef.meta?.editable) {\n event.preventDefault();\n instance.editing.start({ rowId: row.id, columnId: column.id });\n }\n return;\n }\n case \" \": {\n if (!onCellItself || r === -1) return;\n const row = rows[r];\n if (row?.getCanSelect()) {\n event.preventDefault();\n row.toggleSelected();\n }\n return;\n }\n default:\n return;\n }\n };\n\n const onFocus = (event: React.FocusEvent<HTMLTableElement>) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>(\"[data-row-index][data-col-index]\");\n if (!cell || !tableRef.current?.contains(cell)) return;\n const r = Number(cell.dataset.rowIndex);\n const c = Number(cell.dataset.colIndex);\n setFocused((f) => (f.r === r && f.c === c ? f : { r, c }));\n };\n\n const tabIndexFor = (r: number, c: number) => (focused.r === r && focused.c === c ? 0 : -1);\n\n /* Rendering ----------------------------------------------------------- */\n\n const cellPadding = density === \"compact\" ? \"px-3 py-1.5\" : \"px-3 py-2.5\";\n const headPadding = density === \"compact\" ? \"px-3 py-1.5\" : \"px-3 py-2\";\n const editingCell = instance.editing.cell;\n\n const renderRow = (row: DataTableRow<Row>, index: number, virtualIndex?: number) => {\n const cells = row.getVisibleCells();\n const endStart = cells.findIndex((cell) => cell.column.getIsPinned() === \"end\");\n const splitAt = endStart === -1 ? cells.length : endStart;\n const selected = row.getIsSelected();\n const active = activeRowId != null && row.id === activeRowId;\n const expanded = renderSubComponent && row.getIsExpanded();\n\n const renderCell = (cell: DataTableCell<Row, any>, c: number) => {\n const column = cell.column;\n const meta = column.columnDef.meta;\n const pin = pinAttrs(column, table);\n const isEditing = editingCell?.rowId === row.id && editingCell.columnId === column.id;\n const canEdit = Boolean(meta?.editable);\n return (\n <td\n key={cell.id}\n role=\"gridcell\"\n data-slot=\"data-table-cell\"\n data-row-index={index}\n data-col-index={c}\n data-pinned={pin.pinned}\n data-pinned-edge={pin.edge ? \"\" : undefined}\n data-editable={canEdit ? \"\" : undefined}\n data-editing={isEditing ? \"\" : undefined}\n aria-colindex={c + 1}\n tabIndex={tabIndexFor(index, c)}\n style={{ width: column.getSize(), ...pin.style }}\n onDoubleClick={\n canEdit && !isEditing\n ? () => instance.editing.start({ rowId: row.id, columnId: column.id })\n : undefined\n }\n className={cn(\n \"relative align-middle outline-none\",\n isEditing ? \"px-1.5 py-1\" : cellPadding,\n alignClass[meta?.align ?? \"start\"],\n \"focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-[var(--ds-ring)]\",\n // Pinned cells cover what scrolls under them, so their background is\n // opaque card with the translucent hover / selected tint layered on.\n pin.pinned &&\n \"z-[1] bg-[var(--ds-card)] group-hover/row:bg-[linear-gradient(var(--ds-hover),var(--ds-hover))] group-data-[selected]/row:bg-[linear-gradient(var(--ds-primary-soft),var(--ds-primary-soft))] group-data-[active]/row:bg-[linear-gradient(var(--ds-primary-soft),var(--ds-primary-soft))]\",\n pin.pinned === \"start\" && pin.edge && \"shadow-[inset_-1px_0_0_var(--ds-border)]\",\n pin.pinned === \"end\" && pin.edge && \"shadow-[inset_1px_0_0_var(--ds-border)]\",\n !isEditing && \"truncate\",\n meta?.cellClassName,\n )}\n >\n {isEditing ? (\n <EditableCell\n cell={cell}\n instance={instance}\n onDone={() => {\n pendingFocus.current = { r: index, c };\n }}\n />\n ) : (\n <table.FlexRender cell={cell} />\n )}\n </td>\n );\n };\n\n return (\n <React.Fragment key={row.id}>\n <tr\n role=\"row\"\n data-slot=\"data-table-row\"\n data-index={virtualIndex}\n data-selected={selected ? \"\" : undefined}\n data-active={active ? \"\" : undefined}\n data-expanded={expanded ? \"\" : undefined}\n aria-rowindex={index + 2}\n aria-selected={table.options.enableRowSelection ? selected : undefined}\n ref={isVirtual ? virtualizer.measureElement : undefined}\n onClick={onRowClick ? (e) => onRowClick(row.original, e) : undefined}\n className={cn(\n \"group/row border-b border-[var(--ds-border-subtle)] transition-colors duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-hover)] data-[selected]:bg-[var(--ds-primary-soft)]\",\n // Independent of selection: a detail pane highlights one row\n // without ticking its checkbox.\n \"data-[active]:bg-[var(--ds-primary-soft)]\",\n onRowClick && \"cursor-pointer\",\n rowClassName?.(row.original),\n )}\n >\n {cells.slice(0, splitAt).map((cell, c) => renderCell(cell, c))}\n <td aria-hidden data-slot=\"data-table-filler\" className=\"p-0\" />\n {cells.slice(splitAt).map((cell, i) => renderCell(cell, splitAt + i))}\n </tr>\n {expanded ? (\n <tr role=\"row\" data-slot=\"data-table-subrow\" className=\"border-b border-[var(--ds-border-subtle)]\">\n <td\n role=\"gridcell\"\n colSpan={colCount + 1}\n className=\"bg-[var(--ds-muted)] px-4 py-3 text-[length:var(--ds-text-body-sm)]\"\n >\n {renderSubComponent(row)}\n </td>\n </tr>\n ) : null}\n </React.Fragment>\n );\n };\n\n const skeletonRows = Array.from({ length: Math.min(8, table.state.pagination.pageSize) }, (_, i) => (\n <tr key={`skeleton-${i}`} aria-hidden data-slot=\"data-table-skeleton-row\" className=\"border-b border-[var(--ds-border-subtle)]\">\n {leafColumns.map((column) => (\n <td key={column.id} className={cellPadding} style={{ width: column.getSize() }}>\n <Skeleton className=\"h-3.5 w-3/4\" />\n </td>\n ))}\n <td className=\"p-0\" />\n </tr>\n ));\n\n return (\n <div data-slot=\"data-table\" className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {errorMessage ? (\n <ErrorBanner message={errorMessage} onRetry={instance.error ? instance.refetch : undefined} />\n ) : null}\n {toolbar === false ? null : typeof toolbar === \"function\" ? (\n toolbar({ instance })\n ) : (\n <DataTableToolbar\n table={table}\n bulkActions={bulkActions}\n searchPlaceholder={searchPlaceholder}\n enableExport={enableExport}\n exportFileName={exportFileName}\n >\n {toolbarActions}\n </DataTableToolbar>\n )}\n <div\n ref={scrollRef}\n data-slot=\"data-table-container\"\n onScroll={onScroll}\n style={{ maxHeight: resolvedHeight }}\n className={cn(\n \"relative w-full overflow-auto rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-card)]\",\n )}\n >\n <table\n ref={tableRef}\n role=\"grid\"\n data-slot=\"data-table-grid\"\n data-virtualized={isVirtual ? \"\" : undefined}\n aria-rowcount={rows.length + 1}\n aria-colcount={colCount}\n aria-busy={instance.isFetching || undefined}\n aria-multiselectable={table.options.enableRowSelection ? true : undefined}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n style={{ minWidth: table.getTotalSize() }}\n className={cn(\n \"w-full table-fixed border-collapse caption-bottom\",\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n >\n <thead data-slot=\"data-table-header\" className={cn(stickyHeader && \"sticky top-0 z-[2]\")}>\n {headerGroups.map((group) => {\n const endStart = group.headers.findIndex((h) => h.column.getIsPinned() === \"end\");\n const splitAt = endStart === -1 ? group.headers.length : endStart;\n const renderHead = (header: (typeof group.headers)[number], c: number) => {\n const column = header.column;\n const meta = column.columnDef.meta;\n const pin = pinAttrs(column, table);\n const sorted = column.getIsSorted();\n const def = column.columnDef;\n return (\n <th\n key={header.id}\n role=\"columnheader\"\n scope=\"col\"\n data-slot=\"data-table-head\"\n data-row-index={-1}\n data-col-index={c}\n data-pinned={pin.pinned}\n data-pinned-edge={pin.edge ? \"\" : undefined}\n aria-colindex={c + 1}\n aria-sort={\n sorted === \"asc\"\n ? \"ascending\"\n : sorted === \"desc\"\n ? \"descending\"\n : column.getCanSort()\n ? \"none\"\n : undefined\n }\n colSpan={header.colSpan}\n tabIndex={tabIndexFor(-1, c)}\n style={{ width: header.getSize(), ...pin.style }}\n className={cn(\n \"group/head relative h-10 align-middle font-medium outline-none\",\n headPadding,\n \"bg-[var(--ds-muted)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n \"border-b border-[var(--ds-border)]\",\n alignClass[meta?.align ?? \"start\"],\n \"focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-[var(--ds-ring)]\",\n pin.pinned && \"z-[3]\",\n pin.pinned === \"start\" && pin.edge && \"shadow-[inset_-1px_0_0_var(--ds-border)]\",\n pin.pinned === \"end\" && pin.edge && \"shadow-[inset_1px_0_0_var(--ds-border)]\",\n meta?.headerClassName,\n )}\n >\n {header.isPlaceholder ? null : typeof def.header === \"string\" ? (\n <DataTableColumnHeader column={column} title={def.header} />\n ) : (\n <table.FlexRender header={header} />\n )}\n {column.getCanResize() ? (\n <div\n data-slot=\"data-table-resizer\"\n data-resizing={column.getIsResizing() ? \"\" : undefined}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => column.resetSize()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize touch-none select-none\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] hover:opacity-100 data-[resizing]:opacity-100\",\n \"bg-[var(--ds-ring)]\",\n )}\n />\n ) : null}\n </th>\n );\n };\n return (\n <tr key={group.id} role=\"row\" aria-rowindex={1}>\n {group.headers.slice(0, splitAt).map((header, c) => renderHead(header, c))}\n <th aria-hidden className=\"border-b border-[var(--ds-border)] bg-[var(--ds-muted)] p-0\" />\n {group.headers.slice(splitAt).map((header, i) => renderHead(header, splitAt + i))}\n </tr>\n );\n })}\n </thead>\n <tbody data-slot=\"data-table-body\">\n {showSkeleton ? skeletonRows : null}\n {showEmpty ? (\n <tr role=\"row\" data-slot=\"data-table-empty\">\n <td role=\"gridcell\" colSpan={colCount + 1} className=\"p-0\">\n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center gap-2 px-4 py-12 text-center text-[color:var(--ds-muted-foreground)]\">\n <Inbox aria-hidden className=\"size-6 text-[color:var(--ds-text-tertiary)]\" />\n <p className=\"text-[length:var(--ds-text-body-sm)]\">{emptyMessage}</p>\n </div>\n )}\n </td>\n </tr>\n ) : null}\n {virtualItems ? (\n <>\n {paddingTop > 0 ? (\n <tr aria-hidden data-slot=\"data-table-spacer\" style={{ height: paddingTop }}>\n <td colSpan={colCount + 1} className=\"p-0\" />\n </tr>\n ) : null}\n {virtualItems.map((item) => {\n const row = rows[item.index];\n return row ? renderRow(row, item.index, item.index) : null;\n })}\n {paddingBottom > 0 ? (\n <tr aria-hidden data-slot=\"data-table-spacer\" style={{ height: paddingBottom }}>\n <td colSpan={colCount + 1} className=\"p-0\" />\n </tr>\n ) : null}\n </>\n ) : (\n rows.map((row, index) => renderRow(row, index))\n )}\n </tbody>\n </table>\n {paginationMode === \"infinite\" && instance.isFetching && rows.length > 0 ? (\n <div\n data-slot=\"data-table-loading-more\"\n className=\"flex items-center justify-center gap-2 border-t border-[var(--ds-border-subtle)] py-2 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\"\n >\n <Spinner size={14} /> Loading more\n </div>\n ) : null}\n </div>\n {paginationMode === \"pages\" ? (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n ) : paginationMode === \"infinite\" ? (\n <div className=\"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\">\n {rows.length} of {instance.total}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { DataTable, DataTableView };\n","\"use client\";\n\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from \"lucide-react\";\nimport * as React from \"react\";\nimport {\n DayPicker,\n getDefaultClassNames,\n type ChevronProps,\n type DayButtonProps,\n type DayPickerProps,\n type NextMonthButtonProps,\n type PreviousMonthButtonProps,\n type RootProps,\n} from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Calendar.\n *\n * The shadcn Calendar shape over react-day-picker 10. The library's stylesheet\n * is not imported; every class comes from the `classNames` map below and every\n * visual value in it is a cortena-design token. Structure (nav, caption, grid,\n * dropdown caption) is DayPicker's; the day cells, nav buttons and chevrons are\n * swapped for our Button and lucide icons through `components`.\n *\n * `showOutsideDays` defaults to true and `captionLayout` to `\"label\"`; pass\n * `captionLayout=\"dropdown\"` for native month/year selects in the caption.\n */\nexport type CalendarProps = DayPickerProps;\n\nfunction CalendarRoot({ className, rootRef, ...props }: RootProps) {\n return <div data-slot=\"calendar\" ref={rootRef} className={className} {...props} />;\n}\n\nfunction CalendarChevron({ className, orientation, size: _size, disabled, ...props }: ChevronProps) {\n const Icon =\n orientation === \"left\"\n ? ChevronLeft\n : orientation === \"right\"\n ? ChevronRight\n : orientation === \"up\"\n ? ChevronUp\n : ChevronDown;\n return (\n <Icon\n data-slot=\"calendar-chevron\"\n aria-hidden\n className={cn(\"size-4\", disabled && \"opacity-50\", className)}\n {...props}\n />\n );\n}\n\nfunction CalendarPreviousMonthButton(props: PreviousMonthButtonProps) {\n return <Button data-slot=\"calendar-previous-month\" variant=\"outline\" size=\"icon-sm\" {...props} />;\n}\n\nfunction CalendarNextMonthButton(props: NextMonthButtonProps) {\n return <Button data-slot=\"calendar-next-month\" variant=\"outline\" size=\"icon-sm\" {...props} />;\n}\n\n/**\n * One day cell's button. Selection and range state are exposed as data\n * attributes so the classes below (and a consumer's) can paint them; the\n * `today` attribute is only set when the day is not selected, so the soft\n * fill never competes with the selected fill.\n */\nfunction CalendarDayButton({ className, day, modifiers, ...props }: DayButtonProps) {\n const ref = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n const inRange = modifiers.range_start || modifiers.range_end || modifiers.range_middle;\n const selectedSingle = modifiers.selected && !inRange;\n const filled = selectedSingle || modifiers.range_start || modifiers.range_end;\n\n return (\n <Button\n ref={ref}\n data-slot=\"calendar-day-button\"\n data-day={day.isoDate}\n data-selected-single={selectedSingle || undefined}\n data-range-start={modifiers.range_start || undefined}\n data-range-end={modifiers.range_end || undefined}\n data-range-middle={(modifiers.range_middle && !filled) || undefined}\n data-today={(modifiers.today && !modifiers.selected) || undefined}\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(\n \"size-8 font-normal text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] leading-none\",\n // today: soft fill from the primary tint\n \"data-[today]:bg-[var(--ds-primary-soft)] data-[today]:text-[color:var(--ds-primary-soft-foreground)]\",\n // range interior: soft fill, square so the run reads as one band\n \"data-[range-middle]:rounded-none data-[range-middle]:bg-[var(--ds-primary-soft)] data-[range-middle]:text-[color:var(--ds-primary-soft-foreground)] data-[range-middle]:hover:bg-[var(--ds-primary-soft)] data-[range-middle]:hover:brightness-95\",\n // selected day and range ends: solid primary\n \"data-[selected-single]:bg-[var(--ds-primary)] data-[selected-single]:text-[color:var(--ds-primary-foreground)] data-[selected-single]:hover:bg-[var(--ds-primary-hover)] data-[selected-single]:hover:text-[color:var(--ds-primary-foreground)]\",\n \"data-[range-start]:bg-[var(--ds-primary)] data-[range-start]:text-[color:var(--ds-primary-foreground)] data-[range-start]:hover:bg-[var(--ds-primary-hover)] data-[range-start]:hover:text-[color:var(--ds-primary-foreground)]\",\n \"data-[range-end]:bg-[var(--ds-primary)] data-[range-end]:text-[color:var(--ds-primary-foreground)] data-[range-end]:hover:bg-[var(--ds-primary-hover)] data-[range-end]:hover:text-[color:var(--ds-primary-foreground)]\",\n // the cell's own flags, read from the parent <td>\n \"group-data-[outside]/day:text-[color:var(--ds-text-tertiary)]\",\n \"group-data-[disabled]/day:text-[color:var(--ds-text-disabled)] group-data-[disabled]/day:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Calendar({\n className,\n classNames,\n components,\n showOutsideDays = true,\n captionLayout = \"label\",\n formatters,\n ...props\n}: CalendarProps) {\n const defaults = getDefaultClassNames();\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n captionLayout={captionLayout}\n className={cn(\"w-fit p-3 text-[color:var(--ds-foreground)]\", className)}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaults.root),\n months: cn(\"relative flex flex-col gap-4 md:flex-row\", defaults.months),\n month: cn(\"flex w-full flex-col gap-3\", defaults.month),\n nav: cn(\"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\", defaults.nav),\n button_previous: cn(\"aria-disabled:pointer-events-none aria-disabled:opacity-50\", defaults.button_previous),\n button_next: cn(\"aria-disabled:pointer-events-none aria-disabled:opacity-50\", defaults.button_next),\n month_caption: cn(\"flex h-8 w-full items-center justify-center px-9\", defaults.month_caption),\n caption_label: cn(\n \"select-none font-medium text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-foreground)]\",\n captionLayout !== \"label\" &&\n \"flex h-8 items-center gap-1 rounded-[var(--ds-radius-sm)] pl-2 pr-1 [&>svg]:size-3.5 [&>svg]:text-[color:var(--ds-muted-foreground)]\",\n defaults.caption_label,\n ),\n dropdowns: cn(\n \"flex h-8 w-full items-center justify-center gap-1.5 font-medium text-[length:var(--ds-text-body-sm)]\",\n defaults.dropdowns,\n ),\n dropdown_root: cn(\n \"relative rounded-[var(--ds-radius-sm)] border border-[var(--ds-border)] bg-[var(--ds-muted)]\",\n \"has-focus-visible:border-[var(--ds-ring)] has-focus-visible:ring-[3px] has-focus-visible:ring-[var(--ds-ring)]/40\",\n defaults.dropdown_root,\n ),\n dropdown: cn(\"absolute inset-0 cursor-pointer opacity-0\", defaults.dropdown),\n month_grid: cn(\"w-full border-collapse\", defaults.month_grid),\n weekdays: cn(\"flex\", defaults.weekdays),\n weekday: cn(\n \"flex-1 select-none font-normal text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n defaults.weekday,\n ),\n week: cn(\"mt-1 flex w-full\", defaults.week),\n week_number_header: cn(\"w-8 select-none\", defaults.week_number_header),\n week_number: cn(\n \"select-none text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n defaults.week_number,\n ),\n day: cn(\n \"group/day relative aspect-square size-8 select-none p-0 text-center\",\n defaults.day,\n ),\n range_start: cn(\"rounded-l-[var(--ds-radius-sm)] bg-[var(--ds-primary-soft)]\", defaults.range_start),\n range_middle: cn(\"rounded-none bg-[var(--ds-primary-soft)]\", defaults.range_middle),\n range_end: cn(\"rounded-r-[var(--ds-radius-sm)] bg-[var(--ds-primary-soft)]\", defaults.range_end),\n today: defaults.today,\n outside: defaults.outside,\n disabled: defaults.disabled,\n hidden: cn(\"invisible\", defaults.hidden),\n ...classNames,\n }}\n components={{\n Root: CalendarRoot,\n Chevron: CalendarChevron,\n PreviousMonthButton: CalendarPreviousMonthButton,\n NextMonthButton: CalendarNextMonthButton,\n DayButton: CalendarDayButton,\n ...components,\n }}\n {...props}\n />\n );\n}\n\nexport { Calendar, CalendarDayButton };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Popover.\n *\n * `PopoverContent` composes Base UI's Portal + Positioner + Popup so consumers\n * keep writing `<PopoverContent side=\"bottom\" align=\"start\">`; the positioning\n * props are forwarded to the Positioner, which is where Base UI reads them.\n *\n * Radix users: `asChild` on the trigger becomes `render={<Button />}`;\n * `PopoverAnchor` is gone — pass `anchor={ref}` to `PopoverContent` instead.\n */\nfunction Popover(props: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root {...props} />;\n}\n\nfunction PopoverTrigger(props: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverClose(props: PopoverPrimitive.Close.Props) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] font-semibold text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({ className, ...props }: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype PositionerProps = Pick<\n PopoverPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface PopoverContentProps extends PopoverPrimitive.Popup.Props, PositionerProps {\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: PopoverPrimitive.Portal.Props[\"container\"];\n}\n\nfunction PopoverContent({\n className,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal keepMounted={keepMounted} container={container}>\n <PopoverPrimitive.Positioner\n data-slot=\"popover-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"w-72 p-4 outline-none\",\n \"rounded-[var(--ds-radius-lg)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverClose,\n PopoverTitle,\n PopoverDescription,\n};\n","\"use client\";\n\nimport { CalendarIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport type { Matcher } from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { Calendar, type CalendarProps } from \"@/components/calendar\";\nimport { Input } from \"@/components/input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DateField.\n *\n * A form-friendly date input: our `<Input>` showing the formatted date, with\n * the DatePicker's calendar behind a trailing icon button. Typing a date the\n * parser accepts commits it (the default parser reads ISO `yyyy-mm-dd`, and\n * the English `15 Jan 2026` / `15 January 2026` shapes the formatters below\n * produce); picking a day from the calendar writes it back through\n * `formatDate`. Non-empty text the parser rejects, or a date outside\n * `min`/`max`, clears the value and marks the input invalid so a Field can\n * show the error.\n *\n * The date helpers are hand-written for `en-GB` (day month year, no library);\n * any other `locale` goes through the browser's `Intl`.\n */\n\nconst MONTHS_LONG = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst MONTHS_SHORT = MONTHS_LONG.map((m) => m.slice(0, 3));\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nconst isEn = (locale: string) => /^en(-GB)?$/i.test(locale);\n\n/** `2026-01-05`. */\nfunction formatDateISO(date: Date): string {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\n/** `5 Jan 2026` for en-GB; other locales via `Intl.DateTimeFormat`. */\nfunction formatDateShort(date: Date, locale = \"en-GB\"): string {\n if (isEn(locale)) {\n return `${date.getDate()} ${MONTHS_SHORT[date.getMonth()]} ${date.getFullYear()}`;\n }\n return new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"short\", year: \"numeric\" }).format(\n date,\n );\n}\n\n/** `5 January 2026` for en-GB; other locales via `Intl.DateTimeFormat`. */\nfunction formatDateLong(date: Date, locale = \"en-GB\"): string {\n if (isEn(locale)) {\n return `${date.getDate()} ${MONTHS_LONG[date.getMonth()]} ${date.getFullYear()}`;\n }\n return new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"long\", year: \"numeric\" }).format(\n date,\n );\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction startOfDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/**\n * Calendar-day distance in words: `today`, `yesterday`, `tomorrow`, `3 days\n * ago`, `in 2 weeks`, `4 months ago`, `in 2 years`. Compares local calendar\n * days, so 23:59 to 00:01 is `tomorrow`. Other locales use\n * `Intl.RelativeTimeFormat`.\n */\nfunction formatRelative(date: Date, options: { now?: Date; locale?: string } = {}): string {\n const { now = new Date(), locale = \"en-GB\" } = options;\n const days = Math.round((startOfDay(date) - startOfDay(now)) / DAY_MS);\n const abs = Math.abs(days);\n let unit: \"day\" | \"week\" | \"month\" | \"year\";\n let count: number;\n if (abs < 7) {\n unit = \"day\";\n count = days;\n } else if (abs < 30) {\n unit = \"week\";\n count = Math.round(days / 7);\n } else if (abs < 365) {\n unit = \"month\";\n count = Math.round(days / 30);\n } else {\n unit = \"year\";\n count = Math.round(days / 365);\n }\n if (!isEn(locale)) {\n return new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" }).format(count, unit);\n }\n if (days === 0) return \"today\";\n if (days === -1) return \"yesterday\";\n if (days === 1) return \"tomorrow\";\n const n = Math.abs(count);\n const label = `${n} ${unit}${n === 1 ? \"\" : \"s\"}`;\n return count < 0 ? `${label} ago` : `in ${label}`;\n}\n\nfunction makeDate(year: number, month: number, day: number): Date | undefined {\n const date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {\n return undefined;\n }\n return date;\n}\n\n/** Strict `yyyy-mm-dd`; rejects impossible days such as `2026-02-30`. */\nfunction parseDateISO(text: string): Date | undefined {\n const m = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/.exec(text.trim());\n if (!m) return undefined;\n return makeDate(Number(m[1]), Number(m[2]), Number(m[3]));\n}\n\n/** ISO first, then the English `5 Jan 2026` / `5 January 2026` shapes. */\nfunction parseDateDefault(text: string): Date | undefined {\n const iso = parseDateISO(text);\n if (iso) return iso;\n const m = /^(\\d{1,2})\\s+([a-z]+)\\s+(\\d{4})$/i.exec(text.trim());\n if (!m) return undefined;\n const name = (m[2] ?? \"\").toLowerCase();\n const month = MONTHS_LONG.findIndex(\n (full) => full.toLowerCase() === name || full.slice(0, 3).toLowerCase() === name,\n );\n if (month < 0) return undefined;\n return makeDate(Number(m[3]), month + 1, Number(m[1]));\n}\n\nfunction sameDay(a: Date | undefined, b: Date | undefined): boolean {\n if (!a || !b) return a === b;\n return startOfDay(a) === startOfDay(b);\n}\n\nfunction inRange(date: Date, min: Date | undefined, max: Date | undefined): boolean {\n const t = startOfDay(date);\n if (min && t < startOfDay(min)) return false;\n if (max && t > startOfDay(max)) return false;\n return true;\n}\n\ntype CalendarPassthrough = Omit<\n CalendarProps,\n \"mode\" | \"selected\" | \"onSelect\" | \"required\" | \"disabled\"\n>;\n\nexport interface DateFieldProps extends Omit<\n React.ComponentProps<\"input\">,\n \"value\" | \"defaultValue\" | \"onChange\" | \"min\" | \"max\" | \"type\"\n> {\n /** The date (controlled). */\n value?: Date | undefined;\n /** The initial date (uncontrolled). */\n defaultValue?: Date | undefined;\n /** Called with the parsed or picked date, or `undefined` when the text is cleared or invalid. */\n onValueChange?: (date: Date | undefined) => void;\n /** Input placeholder; defaults to the ISO shape. */\n placeholder?: string;\n /** Formats the date into the input; defaults to ISO `yyyy-mm-dd`. */\n formatDate?: (date: Date) => string;\n /** Parses typed text; defaults to ISO plus the English day-month-year shapes. */\n parseDate?: (text: string) => Date | undefined;\n /** Earliest selectable day. */\n min?: Date;\n /** Latest selectable day. */\n max?: Date;\n disabled?: boolean;\n /** Force the invalid look (e.g. from a form validator). */\n invalid?: boolean;\n /** Extra props for the Calendar (e.g. `captionLayout`, `today`). */\n calendarProps?: CalendarPassthrough;\n /** Class name for the wrapper; use `className` for the input itself. */\n wrapperClassName?: string;\n}\n\nfunction DateField(props: DateFieldProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n formatDate = formatDateISO,\n parseDate = parseDateDefault,\n min,\n max,\n disabled,\n invalid,\n calendarProps,\n wrapperClassName,\n className,\n onBlur,\n ...inputProps\n } = props;\n const controlled = \"value\" in props;\n const [inner, setInner] = React.useState<Date | undefined>(defaultValue);\n const date = controlled ? value : inner;\n\n const [text, setText] = React.useState(() => (date ? formatDate(date) : \"\"));\n const [textInvalid, setTextInvalid] = React.useState(false);\n const [open, setOpen] = React.useState(false);\n const committed = React.useRef<Date | undefined>(date);\n\n const commit = React.useCallback(\n (next: Date | undefined) => {\n committed.current = next;\n if (!controlled) setInner(next);\n onValueChange?.(next);\n },\n [controlled, onValueChange],\n );\n\n // An external value change (form reset, server data) rewrites the text; a\n // change this field committed itself leaves the user's text alone.\n React.useEffect(() => {\n if (sameDay(date, committed.current)) return;\n committed.current = date;\n setText(date ? formatDate(date) : \"\");\n setTextInvalid(false);\n }, [date, formatDate]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value;\n setText(next);\n if (next.trim() === \"\") {\n setTextInvalid(false);\n if (date !== undefined) commit(undefined);\n return;\n }\n const parsed = parseDate(next);\n const ok = parsed !== undefined && inRange(parsed, min, max);\n setTextInvalid(!ok);\n if (ok) {\n if (!sameDay(parsed, date)) commit(parsed);\n } else if (date !== undefined) {\n commit(undefined);\n }\n };\n\n const pick = (next: Date | undefined) => {\n setOpen(false);\n setTextInvalid(false);\n setText(next ? formatDate(next) : \"\");\n if (!sameDay(next, date)) commit(next);\n };\n\n const matchers: Matcher[] = [];\n if (min) matchers.push({ before: min });\n if (max) matchers.push({ after: max });\n const isInvalid = invalid || textInvalid;\n\n return (\n <div\n data-slot=\"date-field\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={cn(\"relative w-60\", wrapperClassName)}\n >\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n data-slot=\"date-field-input\"\n value={text}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n onChange={onChange}\n onBlur={(event) => {\n if (date && !textInvalid) setText(formatDate(date));\n onBlur?.(event);\n }}\n className={cn(\"pr-10\", className)}\n {...inputProps}\n />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n data-slot=\"date-field-trigger\"\n render={<Button variant=\"ghost\" size=\"icon-sm\" />}\n aria-label=\"Open calendar\"\n disabled={disabled}\n className={cn(\n \"absolute top-1/2 right-1 -translate-y-1/2\",\n \"text-[color:var(--ds-muted-foreground)] hover:text-[color:var(--ds-foreground)]\",\n )}\n >\n <CalendarIcon />\n </PopoverTrigger>\n <PopoverContent data-slot=\"date-field-content\" align=\"end\" className=\"w-auto p-0\">\n <Calendar\n {...calendarProps}\n mode=\"single\"\n defaultMonth={calendarProps?.defaultMonth ?? date}\n selected={date}\n onSelect={pick}\n disabled={matchers.length > 0 ? matchers : undefined}\n startMonth={calendarProps?.startMonth ?? min}\n endMonth={calendarProps?.endMonth ?? max}\n />\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\nexport {\n DateField,\n formatDateISO,\n formatDateShort,\n formatDateLong,\n formatRelative,\n parseDateISO,\n parseDateDefault,\n};\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface EmptyStateProps extends Omit<React.ComponentProps<\"div\">, \"title\"> {\n /** A lucide icon; sized and coloured by the state. */\n icon?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** One or two buttons offering the next step. */\n action?: React.ReactNode;\n /** `compact` for an empty panel inside a card; `default` for an empty page. */\n size?: \"default\" | \"compact\";\n}\n\n/**\n * EmptyState — the centred, muted \"nothing here yet\" surface. The icon sits\n * in a soft disc on the muted token; the title stays in the foreground so the\n * eye lands on it, and everything else recedes.\n */\nfunction EmptyState({\n className,\n icon,\n title,\n description,\n action,\n size = \"default\",\n children,\n ...props\n}: EmptyStateProps) {\n return (\n <div\n data-slot=\"empty-state\"\n data-size={size}\n className={cn(\n \"flex flex-col items-center justify-center text-center\",\n size === \"compact\" ? \"gap-2 px-4 py-8\" : \"gap-3 px-6 py-16\",\n \"text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n {icon ? (\n <div\n data-slot=\"empty-state-icon\"\n aria-hidden\n className={cn(\n \"mb-1 flex items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-text-tertiary)]\",\n size === \"compact\" ? \"size-10 [&_svg]:size-5\" : \"size-12 [&_svg]:size-6\",\n )}\n >\n {icon}\n </div>\n ) : null}\n <p\n data-slot=\"empty-state-title\"\n className={cn(\n \"font-semibold text-[color:var(--ds-foreground)]\",\n size === \"compact\"\n ? \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\"\n : \"text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)]\",\n )}\n >\n {title}\n </p>\n {description ? (\n <p\n data-slot=\"empty-state-description\"\n className={cn(\n \"max-w-sm text-balance\",\n size === \"compact\"\n ? \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)]\"\n : \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n )}\n >\n {description}\n </p>\n ) : null}\n {children}\n {action ? (\n <div data-slot=\"empty-state-action\" className=\"mt-2 flex flex-wrap items-center justify-center gap-2\">\n {action}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { EmptyState };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Label — a plain `<label>`. Base UI's Label lives inside Field, so this is\n * the standalone form caption for anything that is not a Field.\n */\nconst labelVariants = cva([\n \"inline-flex items-center gap-2 select-none\",\n \"text-[length:var(--ds-text-body-sm)] font-medium leading-none\",\n \"text-[color:var(--ds-foreground)]\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n \"group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-70\",\n]);\n\nexport interface LabelProps\n extends React.ComponentProps<\"label\">, VariantProps<typeof labelVariants> {}\n\nfunction Label({ className, ...props }: LabelProps) {\n return <label data-slot=\"label\" className={cn(labelVariants(), className)} {...props} />;\n}\n\nexport { Label, labelVariants };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { Fieldset as FieldsetPrimitive } from \"@base-ui/react/fieldset\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { inputClassName } from \"@/components/input\";\nimport { labelVariants } from \"@/components/label\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Field.\n *\n * The shadcn Field shape over Base UI's Field and Fieldset. `Field` is\n * `Field.Root`: it owns the label/control/description/error association, so a\n * `FieldLabel` focuses its `FieldControl` (or any Base UI control such as\n * Checkbox, Select, Switch) without an explicit `htmlFor`, and every message\n * ends up in the control's `aria-describedby`.\n *\n * Validity: Base UI puts `data-invalid` on every part once the control fails\n * native constraints or a `validate` callback, and adds `aria-invalid` to the\n * control. Pass `invalid` on `Field` when an external library owns the state\n * (the Form component does this from react-hook-form).\n *\n * `FieldError` follows the field's validity: static children show once the\n * control is invalid or the Field is marked `invalid`; `match=\"valueMissing\"`\n * narrows that to one constraint. Given `errors` (a react-hook-form error\n * list) it renders whenever the list has a message.\n */\nconst fieldVariants = cva(\"group/field flex w-full gap-2\", {\n variants: {\n orientation: {\n vertical: \"flex-col [&>*]:w-full [&>.sr-only]:w-auto\",\n horizontal: [\n \"flex-row items-center [&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start\",\n ],\n },\n },\n defaultVariants: { orientation: \"vertical\" },\n});\n\nexport interface FieldProps\n extends React.ComponentProps<typeof FieldPrimitive.Root>,\n VariantProps<typeof fieldVariants> {}\n\n// Base UI's Field.Error reads the control's computed validity only; the\n// external `invalid` prop reaches the data attributes but not the error's\n// visibility. Carry it so FieldError can show its static message.\nconst FieldInvalidContext = React.createContext(false);\n\nfunction Field({ className, orientation = \"vertical\", invalid, ...props }: FieldProps) {\n return (\n <FieldInvalidContext.Provider value={invalid === true}>\n <FieldPrimitive.Root\n data-slot=\"field\"\n data-orientation={orientation}\n invalid={invalid}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n </FieldInvalidContext.Provider>\n );\n}\n\n/** Stacks a label and description beside a control in a horizontal Field. */\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\"group/field-content flex flex-1 flex-col gap-1 leading-snug\", className)}\n {...props}\n />\n );\n}\n\nexport interface FieldLabelProps extends React.ComponentProps<typeof FieldPrimitive.Label> {}\n\nfunction FieldLabel({ className, ...props }: FieldLabelProps) {\n return (\n <FieldPrimitive.Label\n data-slot=\"field-label\"\n className={cn(\n labelVariants(),\n \"w-fit\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-70\",\n \"data-[invalid]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldControlProps extends React.ComponentProps<typeof FieldPrimitive.Control> {}\n\n/**\n * The field's `<input>`, styled like Input. Swap the element with `render`\n * (`render={<Textarea />}`); the input styling still applies unless the\n * rendered element's own className wins in tailwind-merge.\n */\nfunction FieldControl({ className, ...props }: FieldControlProps) {\n return (\n <FieldPrimitive.Control\n data-slot=\"field-control\"\n className={cn(\n inputClassName,\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[3px] data-[invalid]:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldDescriptionProps\n extends React.ComponentProps<typeof FieldPrimitive.Description> {}\n\nfunction FieldDescription({ className, ...props }: FieldDescriptionProps) {\n return (\n <FieldPrimitive.Description\n data-slot=\"field-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)] font-normal text-[color:var(--ds-muted-foreground)]\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-[color:var(--ds-primary)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The shape react-hook-form gives for a field error; only `message` is read. */\nexport interface FieldErrorItem {\n message?: string | undefined;\n}\n\nexport interface FieldErrorProps extends React.ComponentProps<typeof FieldPrimitive.Error> {\n /**\n * Errors from an external validator. Duplicate messages collapse; one message\n * renders as text, several as a list.\n */\n errors?: ReadonlyArray<FieldErrorItem | undefined> | undefined;\n}\n\nfunction FieldError({ className, children, errors, match, ...props }: FieldErrorProps) {\n const fieldInvalid = React.useContext(FieldInvalidContext);\n const content = React.useMemo(() => {\n if (children) {\n return children;\n }\n if (!errors?.length) {\n return null;\n }\n const unique = [...new Map(errors.map((e) => [e?.message, e])).values()].filter(\n (e): e is FieldErrorItem => Boolean(e?.message),\n );\n if (unique.length === 0) {\n return null;\n }\n if (unique.length === 1) {\n return unique[0]?.message;\n }\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {unique.map((e) => (\n <li key={e.message}>{e.message}</li>\n ))}\n </ul>\n );\n }, [children, errors]);\n\n if (errors !== undefined && content === null) {\n return null;\n }\n\n return (\n <FieldPrimitive.Error\n role=\"alert\"\n data-slot=\"field-error\"\n match={match ?? (errors !== undefined || fieldInvalid ? true : undefined)}\n className={cn(\n \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)] font-normal text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n >\n {content}\n </FieldPrimitive.Error>\n );\n}\n\nexport interface FieldsetProps extends React.ComponentProps<typeof FieldsetPrimitive.Root> {}\n\nfunction Fieldset({ className, ...props }: FieldsetProps) {\n return (\n <FieldsetPrimitive.Root\n data-slot=\"fieldset\"\n className={cn(\n \"flex flex-col gap-4\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface FieldsetLegendProps extends React.ComponentProps<typeof FieldsetPrimitive.Legend> {}\n\nfunction FieldsetLegend({ className, ...props }: FieldsetLegendProps) {\n return (\n <FieldsetPrimitive.Legend\n data-slot=\"fieldset-legend\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] font-medium leading-none text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:opacity-70\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A vertical stack of Fields with the spacing a form uses between rows. */\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group flex w-full flex-col gap-6 [&>[data-slot=field-group]]:gap-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Field,\n FieldContent,\n FieldLabel,\n FieldControl,\n FieldDescription,\n FieldError,\n Fieldset,\n FieldsetLegend,\n FieldGroup,\n fieldVariants,\n};\n","\"use client\";\n\nimport { Check, Copy } from \"lucide-react\";\nimport * as React from \"react\";\nimport ReactMarkdown, { type Components, type ExtraProps, type Options } from \"react-markdown\";\nimport rehypeSanitize, { defaultSchema, type Options as SanitizeSchema } from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Markdown.\n *\n * react-markdown with GFM (tables, task lists, strikethrough, autolinks) and\n * rehype-sanitize's GitHub schema, so pasted or model-written HTML cannot run\n * scripts or leak styles. Every element is mapped through `components` onto\n * tokens: headings take the type scale with the display face, body copy is\n * `body-sm`, code is mono on the sunken surface, tables stripe with the\n * border colour and fenced blocks carry a copy button.\n *\n * `compact` halves the vertical rhythm and steps headings down for chat\n * bubbles. There is no syntax highlighting; pass `codeRenderer` to plug one in\n * (shiki, prism) for fenced blocks — it receives the raw text and language.\n */\n\ntype HastNode = NonNullable<ExtraProps[\"node\"]>;\ntype HastChild = HastNode[\"children\"][number];\n\nfunction hastText(node: HastChild | HastNode): string {\n if (node.type === \"text\") return node.value;\n if (\"children\" in node) return node.children.map(hastText).join(\"\");\n return \"\";\n}\n\n/** The GitHub schema, plus `class=\"language-*\"` on code and `checked` on task boxes. */\nconst markdownSanitizeSchema: SanitizeSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [...(defaultSchema.attributes?.code ?? []), [\"className\", /^language-./]],\n input: [...(defaultSchema.attributes?.input ?? []), \"checked\"],\n },\n};\n\nexport interface CodeRendererProps {\n /** The fenced block's text, without a trailing newline. */\n code: string;\n /** From the fence's info string, e.g. `ts` for ```ts. */\n language: string | undefined;\n}\n\n/** Strip react-markdown's `node` so the rest can be spread onto a DOM element. */\nfunction dom<T extends object>(props: T & ExtraProps): T {\n const { node: _node, ...rest } = props;\n return rest as T;\n}\n\nconst block = \"my-3 first:mt-0 last:mb-0 group-data-[compact]/markdown:my-1.5\";\n\nconst body = cn(\n \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)] text-[color:var(--ds-foreground)]\",\n);\n\nconst heading = cn(\n \"font-[family-name:var(--ds-font-display)] text-[color:var(--ds-foreground)]\",\n \"mt-6 mb-2 first:mt-0 group-data-[compact]/markdown:mt-3 group-data-[compact]/markdown:mb-1\",\n);\n\nconst cellClassName = \"border border-[var(--ds-border)] px-3 py-1.5 align-top\";\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = React.useState(false);\n React.useEffect(() => {\n if (!copied) return;\n const id = window.setTimeout(() => setCopied(false), 1500);\n return () => window.clearTimeout(id);\n }, [copied]);\n return (\n <button\n type=\"button\"\n data-slot=\"markdown-copy\"\n data-copied={copied || undefined}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n onClick={() => {\n void navigator.clipboard?.writeText(text).then(() => setCopied(true));\n }}\n className={cn(\n \"absolute top-1.5 right-1.5 inline-flex size-7 items-center justify-center\",\n \"rounded-[var(--ds-radius-sm)] text-[color:var(--ds-muted-foreground)]\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"group-hover/pre:opacity-100 focus-visible:opacity-100 data-[copied]:opacity-100\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[copied]:text-[color:var(--ds-success)]\",\n \"[&_svg]:size-3.5\",\n )}\n >\n {copied ? <Check aria-hidden /> : <Copy aria-hidden />}\n </button>\n );\n}\n\nfunction buildComponents(codeRenderer: MarkdownProps[\"codeRenderer\"]): Components {\n return {\n h1: (p) => (\n <h1\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h1)] leading-[var(--ds-text-h1--line-height)] tracking-[var(--ds-text-h1--letter-spacing)] font-semibold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-h3)] group-data-[compact]/markdown:leading-[var(--ds-text-h3--line-height)]\",\n )}\n />\n ),\n h2: (p) => (\n <h2\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h2)] leading-[var(--ds-text-h2--line-height)] tracking-[var(--ds-text-h2--letter-spacing)] font-bold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-body-lg)] group-data-[compact]/markdown:leading-[var(--ds-text-body-lg--line-height)]\",\n )}\n />\n ),\n h3: (p) => (\n <h3\n {...dom(p)}\n className={cn(\n heading,\n \"text-[length:var(--ds-text-h3)] leading-[var(--ds-text-h3--line-height)] font-semibold\",\n \"group-data-[compact]/markdown:text-[length:var(--ds-text-body-md)] group-data-[compact]/markdown:leading-[var(--ds-text-body-md--line-height)]\",\n )}\n />\n ),\n h4: (p) => (\n <h4\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)] font-semibold\",\n )}\n />\n ),\n h5: (p) => (\n <h5\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-body)] leading-[var(--ds-text-body--line-height)] font-semibold\",\n )}\n />\n ),\n h6: (p) => (\n <h6\n {...dom(p)}\n className={cn(\n heading,\n \"font-[family-name:var(--ds-font-body)] text-[length:var(--ds-text-eyebrow)] leading-[var(--ds-text-eyebrow--line-height)] tracking-[var(--ds-text-eyebrow--letter-spacing)] font-semibold uppercase text-[color:var(--ds-muted-foreground)]\",\n )}\n />\n ),\n p: (p) => <p {...dom(p)} className={cn(block, body)} />,\n a: (p) => {\n const { href, ...rest } = dom(p);\n const external = typeof href === \"string\" && /^https?:\\/\\//.test(href);\n return (\n <a\n {...rest}\n href={href}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n className={cn(\n \"text-[color:var(--ds-primary)] underline underline-offset-4 decoration-[color:var(--ds-primary)]/40\",\n \"hover:text-[color:var(--ds-primary-hover)] hover:decoration-[color:var(--ds-primary-hover)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40 rounded-[var(--ds-radius-sm)]\",\n )}\n />\n );\n },\n strong: (p) => <strong {...dom(p)} className=\"font-semibold text-[color:var(--ds-foreground)]\" />,\n em: (p) => <em {...dom(p)} className=\"italic\" />,\n del: (p) => <del {...dom(p)} className=\"line-through text-[color:var(--ds-muted-foreground)]\" />,\n code: (p) => (\n <code\n {...dom(p)}\n className={cn(\n \"rounded-[var(--ds-radius-sm)] bg-[var(--ds-muted)] px-1 py-0.5\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"border border-[var(--ds-border-subtle)]\",\n )}\n />\n ),\n pre: (p) => {\n const codeNode = p.node?.children.find(\n (c): c is HastNode => c.type === \"element\" && c.tagName === \"code\",\n );\n const source = codeNode ? hastText(codeNode) : hastText(p.node ?? { type: \"text\", value: \"\" });\n const code = source.replace(/\\n$/, \"\");\n const classes = codeNode?.properties.className;\n const language = (Array.isArray(classes) ? classes : [classes])\n .map(String)\n .find((c) => c.startsWith(\"language-\"))\n ?.slice(\"language-\".length);\n return (\n <div\n data-slot=\"markdown-pre\"\n data-language={language}\n className={cn(\n block,\n \"group/pre relative overflow-hidden\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-muted)]\",\n )}\n >\n {codeRenderer ? (\n codeRenderer({ code, language })\n ) : (\n <pre\n className={cn(\n \"overflow-x-auto p-3 pr-10\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n >\n <code data-language={language}>{code}</code>\n </pre>\n )}\n <CopyButton text={code} />\n </div>\n );\n },\n blockquote: (p) => (\n <blockquote\n {...dom(p)}\n className={cn(\n block,\n \"border-l-2 border-[var(--ds-border-strong)] pl-4 text-[color:var(--ds-muted-foreground)]\",\n \"[&>p]:text-[color:inherit]\",\n )}\n />\n ),\n ul: (p) => (\n <ul\n {...dom(p)}\n className={cn(\n block,\n body,\n \"list-disc pl-6 marker:text-[color:var(--ds-text-tertiary)]\",\n \"[&_ul]:my-1 [&_ol]:my-1\",\n )}\n />\n ),\n ol: (p) => (\n <ol\n {...dom(p)}\n className={cn(\n block,\n body,\n \"list-decimal pl-6 marker:text-[color:var(--ds-text-tertiary)]\",\n \"[&_ul]:my-1 [&_ol]:my-1\",\n )}\n />\n ),\n li: (p) => {\n const rest = dom(p);\n const task = typeof rest.className === \"string\" && rest.className.includes(\"task-list-item\");\n return (\n <li\n {...rest}\n data-task={task || undefined}\n className={cn(\"my-1 group-data-[compact]/markdown:my-0.5\", task && \"-ml-6 list-none\")}\n />\n );\n },\n input: (p) => {\n const rest = dom(p);\n return (\n <input\n {...rest}\n readOnly\n className={cn(\n \"mr-2 size-3.5 translate-y-px accent-[var(--ds-primary)] align-baseline\",\n \"rounded-[var(--ds-radius-sm)]\",\n )}\n />\n );\n },\n table: (p) => (\n <div data-slot=\"markdown-table\" className={cn(block, \"w-full overflow-x-auto\")}>\n <table\n {...dom(p)}\n className={cn(\n \"w-full border-collapse text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n )}\n />\n </div>\n ),\n thead: (p) => <thead {...dom(p)} className=\"bg-[var(--ds-muted)]\" />,\n tbody: (p) => <tbody {...dom(p)} className=\"[&>tr:nth-child(even)]:bg-[var(--ds-muted)]\" />,\n tr: (p) => <tr {...dom(p)} />,\n th: (p) => (\n <th\n {...dom(p)}\n className={cn(cellClassName, \"text-left font-semibold text-[color:var(--ds-foreground)]\")}\n />\n ),\n td: (p) => <td {...dom(p)} className={cellClassName} />,\n hr: (p) => (\n <hr {...dom(p)} className=\"my-5 border-0 border-t border-[var(--ds-border)] group-data-[compact]/markdown:my-3\" />\n ),\n img: (p) => (\n <img\n {...dom(p)}\n className=\"my-3 max-w-full rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)]\"\n />\n ),\n };\n}\n\nexport interface MarkdownProps extends Omit<React.ComponentProps<\"div\">, \"children\"> {\n /** The markdown source. */\n children: string | null | undefined;\n /** Tighter rhythm and smaller headings, for chat bubbles. */\n compact?: boolean;\n /** Renders fenced code blocks; the copy button is still added. Use for syntax highlighting. */\n codeRenderer?: (props: CodeRendererProps) => React.ReactNode;\n /** Override or extend the element map. */\n components?: Components;\n /** Extra remark plugins, appended after GFM. */\n remarkPlugins?: NonNullable<Options[\"remarkPlugins\"]>;\n /** Extra rehype plugins, appended after sanitize. */\n rehypePlugins?: NonNullable<Options[\"rehypePlugins\"]>;\n /**\n * Rehype plugins that must run BEFORE sanitize. The one legitimate use is\n * `rehype-raw` in a host that embeds trusted custom tags in markdown (the\n * webchat's `<cortena-*>` blocks): raw HTML has to become nodes before the\n * sanitizer sees it, and the sanitize schema then decides what survives.\n * Anything placed here widens what reaches the sanitizer, so keep the\n * schema strict when you use it.\n */\n rehypePluginsBeforeSanitize?: NonNullable<Options[\"rehypePlugins\"]>;\n /** Replace the sanitize schema; defaults to `markdownSanitizeSchema`. */\n sanitizeSchema?: SanitizeSchema;\n /** Rewrite URLs; defaults to react-markdown's, which drops non-http(s)/mailto/tel schemes. */\n urlTransform?: Options[\"urlTransform\"];\n}\n\nfunction Markdown({\n children,\n compact = false,\n codeRenderer,\n components,\n remarkPlugins,\n rehypePlugins,\n rehypePluginsBeforeSanitize,\n sanitizeSchema = markdownSanitizeSchema,\n urlTransform,\n className,\n ...props\n}: MarkdownProps) {\n const map = React.useMemo(\n () => ({ ...buildComponents(codeRenderer), ...components }),\n [codeRenderer, components],\n );\n const remark = React.useMemo(() => [remarkGfm, ...(remarkPlugins ?? [])], [remarkPlugins]);\n const rehype = React.useMemo(\n () => [...(rehypePluginsBeforeSanitize ?? []), [rehypeSanitize, sanitizeSchema] as const, ...(rehypePlugins ?? [])],\n [rehypePluginsBeforeSanitize, rehypePlugins, sanitizeSchema],\n );\n return (\n <div\n data-slot=\"markdown\"\n data-compact={compact || undefined}\n className={cn(\"group/markdown min-w-0 break-words text-[color:var(--ds-foreground)]\", className)}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={remark}\n rehypePlugins={rehype as NonNullable<Options[\"rehypePlugins\"]>}\n components={map}\n urlTransform={urlTransform}\n >\n {children ?? \"\"}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport { Markdown, markdownSanitizeSchema };\nexport type { Components as MarkdownComponents };\n","\"use client\";\n\nimport { Progress as BaseProgress } from \"@base-ui/react/progress\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Progress.\n *\n * `Progress` renders the Base UI root (a `<div role=\"progressbar\">` carrying\n * `aria-valuenow`) with the track and indicator already inside; Base UI sizes\n * the indicator to `value` as a percentage of `min`..`max`. Put a\n * `ProgressLabel` and `ProgressValue` in `children` for a captioned bar; they\n * render in a row above the track. `value={null}` gives an indeterminate bar.\n */\nexport interface ProgressProps extends React.ComponentProps<typeof BaseProgress.Root> {}\n\nfunction Progress({ className, children, ...props }: ProgressProps) {\n return (\n <BaseProgress.Root data-slot=\"progress\" className={cn(\"flex w-full flex-col gap-2\", className)} {...props}>\n {children ? <div className=\"flex items-center justify-between gap-2\">{children}</div> : null}\n <ProgressTrack>\n <ProgressIndicator />\n </ProgressTrack>\n </BaseProgress.Root>\n );\n}\n\nfunction ProgressTrack({ className, ...props }: React.ComponentProps<typeof BaseProgress.Track>) {\n return (\n <BaseProgress.Track\n data-slot=\"progress-track\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-[var(--ds-radius-full)] bg-[var(--ds-border)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressIndicator({ className, ...props }: React.ComponentProps<typeof BaseProgress.Indicator>) {\n return (\n <BaseProgress.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"h-full rounded-[var(--ds-radius-full)] bg-[var(--ds-primary)]\",\n \"transition-[width] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[indeterminate]:w-1/3 data-[indeterminate]:animate-pulse\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressLabel({ className, ...props }: React.ComponentProps<typeof BaseProgress.Label>) {\n return (\n <BaseProgress.Label\n data-slot=\"progress-label\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ProgressValue({ className, ...props }: React.ComponentProps<typeof BaseProgress.Value>) {\n return (\n <BaseProgress.Value\n data-slot=\"progress-value\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] tabular-nums text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue };\n","\"use client\";\n\nimport { Radio } from \"@base-ui/react/radio\";\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Radio group.\n *\n * `RadioGroup` owns the value (`value` / `defaultValue` / `onValueChange`) and\n * renders a `<div role=\"radiogroup\">`; each `RadioGroupItem` is a Base UI\n * `Radio.Root` (`<span role=\"radio\">`) with a dot indicator that only mounts\n * while checked. Arrow keys move the selection, as the ARIA pattern requires.\n */\nexport interface RadioGroupProps extends React.ComponentProps<typeof BaseRadioGroup> {}\n\nfunction RadioGroup({ className, ...props }: RadioGroupProps) {\n return <BaseRadioGroup data-slot=\"radio-group\" className={cn(\"grid gap-3\", className)} {...props} />;\n}\n\nexport interface RadioGroupItemProps extends React.ComponentProps<typeof Radio.Root> {}\n\nfunction RadioGroupItem({ className, ...props }: RadioGroupItemProps) {\n return (\n <Radio.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"peer inline-flex aspect-square size-4 shrink-0 items-center justify-center rounded-[var(--ds-radius-full)] border\",\n \"border-[var(--ds-input)] bg-[var(--ds-background)] text-[color:var(--ds-primary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[checked]:border-[var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n {...props}\n >\n <Radio.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"block size-2 rounded-[var(--ds-radius-full)] bg-current\"\n />\n </Radio.Root>\n );\n}\n\nexport { RadioGroup, RadioGroupItem };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n type CardProps,\n} from \"@/components/card\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SectionCardProps extends Omit<CardProps, \"title\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Controls for the section, right-aligned in the header row. */\n actions?: React.ReactNode;\n /** Rendered in a CardFooter under the body. */\n footer?: React.ReactNode;\n /** Remove the body padding, for a table or list that fills the card. */\n flush?: boolean;\n /** Class on the body wrapper. */\n bodyClassName?: string;\n}\n\n/**\n * SectionCard — a Card with a header row (title, description, actions), a\n * body and an optional footer. It composes the Card parts rather than\n * restyling them, so a SectionCard and a hand-built Card look identical.\n *\n * `render` is Card's and reaches the outer element, so a section card can be\n * the landmark it is named after: `render={<section aria-labelledby={id} />}`\n * with the same `id` on the title, or `render={<aside />}` for a side panel.\n */\nfunction SectionCard({\n title,\n description,\n actions,\n footer,\n flush,\n bodyClassName,\n children,\n ...props\n}: SectionCardProps) {\n return (\n <Card data-slot=\"section-card\" {...props}>\n <CardHeader\n data-slot=\"section-card-header\"\n className=\"flex-row items-start justify-between gap-4 border-b border-[var(--ds-border-subtle)] pb-4\"\n >\n <div data-slot=\"section-card-heading\" className=\"flex min-w-0 flex-col gap-1\">\n <CardTitle data-slot=\"section-card-title\">{title}</CardTitle>\n {description ? (\n <CardDescription data-slot=\"section-card-description\">{description}</CardDescription>\n ) : null}\n </div>\n {actions ? (\n <div\n data-slot=\"section-card-actions\"\n className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\"\n >\n {actions}\n </div>\n ) : null}\n </CardHeader>\n <CardContent\n data-slot=\"section-card-body\"\n className={cn(flush ? \"p-0\" : \"p-5\", bodyClassName)}\n >\n {children}\n </CardContent>\n {footer ? <CardFooter data-slot=\"section-card-footer\">{footer}</CardFooter> : null}\n </Card>\n );\n}\n\nexport { SectionCard };\n","\"use client\";\n\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface SeparatorProps extends React.ComponentProps<typeof BaseSeparator> {\n /**\n * Purely visual: renders with `role=\"none\"` so screen readers skip it.\n * Defaults to true, matching the Radix component this replaces.\n */\n decorative?: boolean;\n}\n\n/**\n * Separator — a one-pixel rule on the border token. Base UI supplies the\n * `role=\"separator\"` and `aria-orientation` semantics when not decorative.\n */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: SeparatorProps) {\n return (\n <BaseSeparator\n data-slot=\"separator\"\n orientation={orientation}\n // An explicit undefined would still override Base UI's own role.\n {...(decorative ? { role: \"none\" } : {})}\n className={cn(\n \"shrink-0 bg-[var(--ds-border)]\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full min-h-4 w-px self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * The error tone is `destructive`, the same spelling Button, Alert and Badge\n * use. `danger` is a deprecated alias of it and paints the same.\n */\ntype StatusDotTone =\n | \"accent\"\n | \"success\"\n | \"warning\"\n | \"destructive\"\n /** @deprecated Use `destructive`; this alias paints the same. */\n | \"danger\"\n | \"info\"\n | \"neutral\";\n\nconst TONE_CLASS: Record<StatusDotTone, string> = {\n accent: \"bg-[var(--ds-primary)]\",\n success: \"bg-[var(--ds-success)]\",\n warning: \"bg-[var(--ds-warning)]\",\n destructive: \"bg-[var(--ds-destructive)]\",\n danger: \"bg-[var(--ds-destructive)]\",\n info: \"bg-[var(--ds-info)]\",\n neutral: \"bg-[var(--ds-text-tertiary)]\",\n};\n\nexport interface StatusDotProps extends Omit<React.ComponentProps<\"span\">, \"children\"> {\n tone?: StatusDotTone;\n /** Adds a pinging halo behind the dot for \"currently active\" states. */\n live?: boolean;\n label?: React.ReactNode;\n /** Dot diameter in px. Defaults to 7. */\n size?: number;\n}\n\n/**\n * StatusDot — a coloured dot with an optional caption. `live` layers a ping\n * ring in the same tone behind the dot.\n */\nfunction StatusDot({\n className,\n tone = \"accent\",\n live,\n label,\n size = 7,\n style,\n ...props\n}: StatusDotProps) {\n return (\n <span\n data-slot=\"status-dot\"\n data-tone={tone}\n className={cn(\n \"inline-flex items-center gap-1.5\",\n \"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <span\n aria-hidden\n data-slot=\"status-dot-indicator\"\n className=\"relative inline-flex shrink-0\"\n style={{ width: size, height: size, ...style }}\n >\n {live ? (\n <span\n data-slot=\"status-dot-ping\"\n className={cn(\n \"absolute inset-0 animate-ping rounded-[var(--ds-radius-full)] opacity-60\",\n TONE_CLASS[tone],\n )}\n />\n ) : null}\n <span\n data-slot=\"status-dot-fill\"\n className={cn(\n \"relative inline-block size-full rounded-[var(--ds-radius-full)]\",\n TONE_CLASS[tone],\n )}\n />\n </span>\n {label}\n </span>\n );\n}\n\nexport { StatusDot, type StatusDotTone };\n","\"use client\";\n\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Switch.\n *\n * Base UI renders a `<span role=\"switch\">` with a hidden `<input>` beside it,\n * so the control submits with forms and takes `checked`/`defaultChecked`\n * exactly like a checkbox. State is exposed as `data-checked` /\n * `data-unchecked` / `data-disabled`, which is what the classes key on.\n *\n * cortenaweb users: `checked` and `onCheckedChange` keep their names, but the\n * control is now uncontrolled by default; pass `defaultChecked` if you do not\n * hold the state yourself.\n */\nexport interface SwitchProps extends React.ComponentProps<typeof BaseSwitch.Root> {}\n\nfunction Switch({ className, ...props }: SwitchProps) {\n return (\n <BaseSwitch.Root\n data-slot=\"switch\"\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 items-center rounded-[var(--ds-radius-full)] border\",\n \"transition-[background-color,border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[unchecked]:border-[var(--ds-border)] data-[unchecked]:bg-[var(--ds-input)]\",\n \"data-[checked]:border-[var(--ds-primary)] data-[checked]:bg-[var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseSwitch.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block size-3.5 rounded-[var(--ds-radius-full)] bg-[var(--ds-primary-foreground)]\",\n \"transition-transform duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"data-[unchecked]:translate-x-0.5 data-[checked]:translate-x-4.5\",\n )}\n />\n </BaseSwitch.Root>\n );\n}\n\nexport { Switch };\n","\"use client\";\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Tabs — the underlined pattern (primary-coloured underline under the active\n * tab). For the inset segmented style use Segmented.\n *\n * The underline is a Base UI `Tabs.Indicator` rendered inside `TabsList`, so it\n * slides between tabs instead of snapping. Base UI exposes the active tab's\n * box as `--active-tab-left` / `--active-tab-width` on the indicator.\n *\n * Radix users: `data-state=\"active\"` is now `data-active`; `TabsTrigger` and\n * `TabsContent` are Base UI's `Tab` and `Panel` under the shadcn names. Arrow\n * keys activate as they move (Radix's `activationMode=\"automatic\"`); pass\n * `activateOnFocus={false}` on `TabsList` for manual activation.\n */\nfunction Tabs({ className, ...props }: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col data-[orientation=vertical]:flex-row\", className)}\n {...props}\n />\n );\n}\n\nfunction TabsList({\n className,\n children,\n activateOnFocus = true,\n ...props\n}: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n activateOnFocus={activateOnFocus}\n className={cn(\n \"relative inline-flex items-center gap-0.5 self-start\",\n \"border-[var(--ds-border-subtle)] text-[color:var(--ds-muted-foreground)]\",\n \"data-[orientation=horizontal]:border-b\",\n \"data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[orientation=vertical]:border-r\",\n className,\n )}\n {...props}\n >\n {children}\n <TabsIndicator />\n </TabsPrimitive.List>\n );\n}\n\nfunction TabsIndicator({ className, ...props }: TabsPrimitive.Indicator.Props) {\n return (\n <TabsPrimitive.Indicator\n data-slot=\"tabs-indicator\"\n className={cn(\n \"absolute rounded-[var(--ds-radius-full)] bg-[var(--ds-primary)]\",\n \"transition-[width,height,translate] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n // Horizontal: an underline that slides along the bottom edge.\n \"data-[orientation=horizontal]:-bottom-px data-[orientation=horizontal]:left-0 data-[orientation=horizontal]:h-0.5\",\n \"data-[orientation=horizontal]:w-[var(--active-tab-width,0px)] data-[orientation=horizontal]:translate-x-[var(--active-tab-left,0px)]\",\n // Vertical: a bar on the trailing edge that slides down the list.\n \"data-[orientation=vertical]:-right-px data-[orientation=vertical]:top-0 data-[orientation=vertical]:w-0.5\",\n \"data-[orientation=vertical]:h-[var(--active-tab-height,0px)] data-[orientation=vertical]:translate-y-[var(--active-tab-top,0px)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex items-center gap-1.5 whitespace-nowrap px-3.5 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-muted-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] outline-none\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[active]:text-[color:var(--ds-primary)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\n \"mt-3 flex-1 rounded-[var(--ds-radius-sm)] outline-none\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsIndicator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Textarea.\n *\n * Same surface, border, focus ring and invalid state as Input so the two sit\n * together in a form. `autoGrow` resizes the element to its content on every\n * change (and on mount), which is how chat composers and note fields use it.\n */\nconst textareaClassName = cn(\n \"flex min-h-20 w-full min-w-0 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] px-3 py-2\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"outline-none focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-[var(--ds-destructive)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--ds-destructive)]/20\",\n);\n\nexport interface TextareaProps extends React.ComponentProps<\"textarea\"> {\n /** When true the textarea grows to fit its content instead of scrolling. */\n autoGrow?: boolean;\n}\n\nfunction Textarea({ className, autoGrow = false, onChange, ref, ...props }: TextareaProps) {\n const internalRef = React.useRef<HTMLTextAreaElement | null>(null);\n\n const setRefs = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const fitToContent = React.useCallback(() => {\n const el = internalRef.current;\n if (el && autoGrow) {\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }\n }, [autoGrow]);\n\n React.useEffect(() => {\n fitToContent();\n }, [fitToContent]);\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n fitToContent();\n },\n [onChange, fitToContent],\n );\n\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(textareaClassName, autoGrow && \"resize-none overflow-hidden\", className)}\n ref={setRefs}\n onChange={handleChange}\n {...props}\n />\n );\n}\n\nexport { Textarea, textareaClassName };\n","\"use client\";\n\n/**\n * The cortena-ui side of the A2UI catalogue.\n *\n * One React view per catalogue entry. Each is a real component, not a render\n * function, so an interactive entry can hold hooks (draft input state, the\n * debounce timer) without the renderer having to care which entries are\n * stateful.\n *\n * Views receive already-resolved props: the renderer has read the data\n * bindings, validated against the entry's zod schema and normalised actions\n * before any of this runs. A view therefore never parses A2UI, and never sees\n * an unvalidated value.\n *\n * Every visual value is a cortena-design token, as everywhere else in the\n * package. The Tailwind scale maps below exist because Tailwind only emits a\n * class it can see in the source, so `gap-${n}` would silently produce nothing.\n */\n\nimport { AlertTriangle, CheckCircle2, Info, OctagonAlert, Terminal } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Alert, AlertDescription, AlertIcon, AlertTitle } from \"@/components/alert\";\nimport { Badge } from \"@/components/badge\";\nimport { Button } from \"@/components/button\";\nimport { ButtonLink } from \"@/components/button-link\";\nimport { Card, CardContent } from \"@/components/card\";\nimport { Chart } from \"@/components/chart\";\nimport type { ChartDataFor, ChartType } from \"@/components/chart\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { DataTable } from \"@/components/data-table\";\nimport type { DataSource, DataTableColumnDef } from \"@/components/data-table\";\nimport { DateField, formatDateISO, parseDateISO } from \"@/components/date-field\";\nimport { EmptyState } from \"@/components/empty-state\";\nimport { Field, FieldDescription, FieldError, FieldLabel } from \"@/components/field\";\nimport { Input } from \"@/components/input\";\nimport { Markdown } from \"@/components/markdown\";\nimport { Progress, ProgressLabel, ProgressValue } from \"@/components/progress\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/radio-group\";\nimport { SectionCard } from \"@/components/section-card\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/select\";\nimport { Separator } from \"@/components/separator\";\nimport { StatusDot } from \"@/components/status-dot\";\nimport { Switch } from \"@/components/switch\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/tabs\";\nimport { Textarea } from \"@/components/textarea\";\nimport { cn } from \"@/lib/cn\";\nimport type { A2UIAction } from \"./message\";\n\n/** A row in an agent-drawn table. Every value is opaque until a column reads it. */\nexport type A2UIRow = Record<string, unknown>;\n\n/** Where a node sits, carried into every action the view emits. */\nexport interface A2UINodeInfo {\n surfaceId: string;\n componentId: string;\n /** JSON pointer this node's relative bindings resolve against. */\n dataContextPath: string;\n}\n\n/** A normalised action attached to an interactive property. */\nexport interface A2UIResolvedAction {\n name: string;\n context?: Record<string, unknown>;\n}\n\n/** What every view receives. */\nexport interface A2UIViewProps<P> {\n props: P;\n node: A2UINodeInfo;\n /** Already-rendered child nodes, in the order the component listed them. */\n children: React.ReactNode[];\n /** The surface data model, for actions that report the whole form. */\n dataModel: Record<string, unknown>;\n /**\n * Send an action. `action` is what the agent attached to the property; when\n * it is absent the event still fires under `fallbackName` so a host can\n * observe interactions the agent did not ask for.\n */\n emit: (\n action: A2UIResolvedAction | undefined,\n fallbackName: string,\n payload?: Record<string, unknown>,\n ) => void;\n /** Write a value back to the data model where this prop was bound. No-op for a literal. */\n writeBack: (property: string, value: unknown) => void;\n /** Resolve a `{ kind: \"server\", sourceId }` handle into a real data source. */\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n /** Debounce applied to continuous inputs before they become actions. */\n debounceMs: number;\n}\n\nexport type A2UIView<P> = React.FC<A2UIViewProps<P>>;\n\n/* ------------------------------------------------------------------ */\n/* Shared scales */\n/* ------------------------------------------------------------------ */\n\n/** Tailwind spacing steps an agent may pick. Written out so Tailwind emits them. */\nconst GAP: Record<number, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n};\n\nconst PADDING: Record<number, string> = {\n 0: \"p-0\",\n 1: \"p-1\",\n 2: \"p-2\",\n 3: \"p-3\",\n 4: \"p-4\",\n 6: \"p-6\",\n 8: \"p-8\",\n};\n\nconst HEIGHT: Record<number, string> = {\n 0: \"h-0\",\n 1: \"h-1\",\n 2: \"h-2\",\n 3: \"h-3\",\n 4: \"h-4\",\n 6: \"h-6\",\n 8: \"h-8\",\n};\n\nconst ALIGN: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst JUSTIFY: Record<string, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\n\nconst TEXT_ALIGN: Record<string, string> = {\n start: \"text-left\",\n center: \"text-center\",\n end: \"text-right\",\n};\n\nconst TEXT_ROLE: Record<string, string> = {\n heading:\n \"font-display text-[length:var(--ds-text-h3)] leading-[var(--ds-text-h3--line-height)] font-semibold\",\n subheading:\n \"text-[length:var(--ds-text-body-md)] leading-[var(--ds-text-body-md--line-height)] font-semibold\",\n body: \"text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n caption: \"text-[length:var(--ds-text-caption)] leading-[var(--ds-text-caption--line-height)]\",\n eyebrow:\n \"text-[length:var(--ds-text-eyebrow)] leading-[var(--ds-text-eyebrow--line-height)] font-medium uppercase tracking-[var(--ds-text-eyebrow--letter-spacing)]\",\n};\n\nconst TEXT_TONE: Record<string, string> = {\n default: \"text-[color:var(--ds-foreground)]\",\n muted: \"text-[color:var(--ds-muted-foreground)]\",\n success: \"text-[color:var(--ds-success)]\",\n warning: \"text-[color:var(--ds-warning)]\",\n danger: \"text-[color:var(--ds-destructive)]\",\n info: \"text-[color:var(--ds-info)]\",\n};\n\n/**\n * Components that are inline by nature.\n *\n * A Column stretches its children on the cross axis, which is right for a field\n * or a table and wrong for a badge — one would span the whole surface. `w-fit`\n * gives the item an explicit cross size, which is what disables the stretch,\n * without overriding a Row's own alignment.\n */\nconst INLINE = \"w-fit\";\n\nconst ALERT_ICON: Record<string, React.ReactNode> = {\n default: <Terminal />,\n success: <CheckCircle2 />,\n warn: <AlertTriangle />,\n danger: <OctagonAlert />,\n info: <Info />,\n};\n\n/**\n * Debounce a value. Used for continuous inputs so an agent receives one action\n * per pause rather than one per keystroke; the visible input stays immediate.\n */\nfunction useDebouncedEmit(\n emit: (value: unknown) => void,\n delay: number,\n): (value: unknown) => void {\n const latest = React.useRef(emit);\n latest.current = emit;\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n React.useEffect(\n () => () => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n }\n },\n [],\n );\n return React.useCallback(\n (value: unknown) => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(() => latest.current(value), delay);\n },\n [delay],\n );\n}\n\n/**\n * A value that follows the data model but can be typed over.\n *\n * The bound value wins whenever the agent changes it; between agent updates the\n * local draft wins, so typing is not swallowed by a re-render.\n *\n * `key` is what identity is judged on, and defaults to the value itself. It\n * matters for a value the renderer rebuilds each pass — a Date parsed from an\n * ISO string is a new object every render, so comparing the objects would reset\n * the draft forever. Compare the string instead.\n */\nfunction useDraft<T>(bound: T, key: unknown = bound): [T, (next: T) => void] {\n const [draft, setDraft] = React.useState<T>(bound);\n const previous = React.useRef(key);\n if (!Object.is(previous.current, key)) {\n previous.current = key;\n setDraft(bound);\n }\n return [draft, setDraft];\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout */\n/* ------------------------------------------------------------------ */\n\nexport interface ColumnProps {\n gap?: number;\n padding?: number;\n align?: string;\n justify?: string;\n}\n\nexport const ColumnView: A2UIView<ColumnProps> = ({ props, children }) => (\n <div\n data-slot=\"a2ui-column\"\n className={cn(\n \"flex min-w-0 flex-col\",\n GAP[props.gap ?? 3],\n props.padding !== undefined ? PADDING[props.padding] : undefined,\n props.align ? ALIGN[props.align] : undefined,\n props.justify ? JUSTIFY[props.justify] : undefined,\n )}\n >\n {children}\n </div>\n);\n\nexport interface RowProps extends ColumnProps {\n wrap?: boolean;\n}\n\nexport const RowView: A2UIView<RowProps> = ({ props, children }) => (\n <div\n data-slot=\"a2ui-row\"\n className={cn(\n \"flex min-w-0 flex-row\",\n props.wrap === false ? \"flex-nowrap\" : \"flex-wrap\",\n GAP[props.gap ?? 2],\n props.padding !== undefined ? PADDING[props.padding] : undefined,\n ALIGN[props.align ?? \"center\"],\n props.justify ? JUSTIFY[props.justify] : undefined,\n )}\n >\n {children}\n </div>\n);\n\nexport interface CardViewProps {\n accent?: boolean;\n flush?: boolean;\n}\n\nexport const CardView: A2UIView<CardViewProps> = ({ props, children }) => (\n <Card data-slot=\"a2ui-card\" accent={props.accent}>\n {props.flush ? (\n <div className=\"flex flex-col gap-3\">{children}</div>\n ) : (\n <CardContent className=\"flex flex-col gap-3 p-5\">{children}</CardContent>\n )}\n </Card>\n);\n\nexport interface SectionCardViewProps {\n title: string;\n description?: string;\n flush?: boolean;\n}\n\nexport const SectionCardView: A2UIView<SectionCardViewProps> = ({ props, children }) => (\n <SectionCard\n data-slot=\"a2ui-section-card\"\n title={props.title}\n description={props.description}\n flush={props.flush}\n >\n <div className=\"flex flex-col gap-3\">{children}</div>\n </SectionCard>\n);\n\nexport interface DividerProps {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const DividerView: A2UIView<DividerProps> = ({ props }) => (\n <Separator data-slot=\"a2ui-divider\" orientation={props.orientation ?? \"horizontal\"} />\n);\n\nexport interface SpacerProps {\n size?: number;\n}\n\nexport const SpacerView: A2UIView<SpacerProps> = ({ props }) => (\n <div data-slot=\"a2ui-spacer\" aria-hidden className={cn(\"w-full\", HEIGHT[props.size ?? 4])} />\n);\n\n/* ------------------------------------------------------------------ */\n/* Text */\n/* ------------------------------------------------------------------ */\n\nexport interface TextProps {\n text: string;\n role?: string;\n tone?: string;\n align?: string;\n mono?: boolean;\n}\n\nexport const TextView: A2UIView<TextProps> = ({ props }) => (\n <p\n data-slot=\"a2ui-text\"\n data-role={props.role ?? \"body\"}\n className={cn(\n \"min-w-0 break-words\",\n TEXT_ROLE[props.role ?? \"body\"],\n TEXT_TONE[props.tone ?? \"default\"],\n props.align ? TEXT_ALIGN[props.align] : undefined,\n props.mono ? \"font-[family-name:var(--ds-font-mono)]\" : undefined,\n )}\n >\n {props.text}\n </p>\n);\n\nexport interface MarkdownViewProps {\n text: string;\n compact?: boolean;\n}\n\nexport const MarkdownView: A2UIView<MarkdownViewProps> = ({ props }) => (\n <Markdown data-slot=\"a2ui-markdown\" compact={props.compact}>\n {props.text}\n </Markdown>\n);\n\n/* ------------------------------------------------------------------ */\n/* Inputs */\n/* ------------------------------------------------------------------ */\n\ninterface FieldShellProps {\n label?: string;\n description?: string;\n error?: string;\n children: React.ReactNode;\n slot: string;\n orientation?: \"vertical\" | \"horizontal\";\n /**\n * Ties the label to the control. Base UI's Field associates its own\n * `Field.Control`; these views render plain cortena-ui controls, so the pair\n * is wired explicitly rather than left to produce a label with no `for`.\n */\n controlId?: string;\n}\n\nfunction FieldShell({\n label,\n description,\n error,\n children,\n slot,\n orientation,\n controlId,\n}: FieldShellProps) {\n return (\n <Field data-slot={slot} orientation={orientation ?? \"vertical\"} invalid={Boolean(error)}>\n {label ? <FieldLabel htmlFor={controlId}>{label}</FieldLabel> : null}\n {children}\n {description ? <FieldDescription>{description}</FieldDescription> : null}\n {error ? <FieldError>{error}</FieldError> : null}\n </Field>\n );\n}\n\nexport interface TextFieldProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n type?: \"text\" | \"email\" | \"url\" | \"tel\" | \"number\" | \"password\" | \"search\";\n disabled?: boolean;\n required?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TextFieldView: A2UIView<TextFieldProps> = ({\n props,\n emit,\n writeBack,\n debounceMs,\n}) => {\n const id = React.useId();\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n const send = useDebouncedEmit(\n (value) => emit(props.onChange, \"change\", { value }),\n debounceMs,\n );\n return (\n <FieldShell\n slot=\"a2ui-text-field\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <Input\n id={id}\n type={props.type ?? \"text\"}\n value={draft}\n placeholder={props.placeholder}\n disabled={props.disabled}\n required={props.required}\n aria-label={props.label ? undefined : (props.placeholder ?? \"Text field\")}\n onChange={(event) => {\n const next = event.target.value;\n setDraft(next);\n writeBack(\"value\", next);\n send(next);\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface TextAreaProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n rows?: number;\n disabled?: boolean;\n autoGrow?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TextAreaView: A2UIView<TextAreaProps> = ({ props, emit, writeBack, debounceMs }) => {\n const id = React.useId();\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n const send = useDebouncedEmit((value) => emit(props.onChange, \"change\", { value }), debounceMs);\n return (\n <FieldShell\n slot=\"a2ui-text-area\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <Textarea\n id={id}\n value={draft}\n rows={props.rows ?? 4}\n placeholder={props.placeholder}\n disabled={props.disabled}\n autoGrow={props.autoGrow}\n aria-label={props.label ? undefined : (props.placeholder ?? \"Text area\")}\n onChange={(event) => {\n const next = event.target.value;\n setDraft(next);\n writeBack(\"value\", next);\n send(next);\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface SelectOption {\n value: string;\n label?: string;\n disabled?: boolean;\n}\n\nexport interface SelectViewProps {\n label?: string;\n value?: string;\n placeholder?: string;\n description?: string;\n error?: string;\n options: SelectOption[];\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const SelectView: A2UIView<SelectViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.value ?? null);\n const items = React.useMemo(\n () => props.options.map((option) => ({ value: option.value, label: option.label ?? option.value })),\n [props.options],\n );\n return (\n <FieldShell\n slot=\"a2ui-select\"\n label={props.label}\n description={props.description}\n error={props.error}\n >\n <Select\n items={items}\n value={draft}\n disabled={props.disabled}\n onValueChange={(next) => {\n const value = next === null ? \"\" : String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n >\n <SelectTrigger aria-label={props.label ?? props.placeholder ?? \"Select\"}>\n <SelectValue placeholder={props.placeholder ?? \"Select…\"} />\n </SelectTrigger>\n <SelectContent>\n {props.options.map((option) => (\n <SelectItem key={option.value} value={option.value} disabled={option.disabled}>\n {option.label ?? option.value}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FieldShell>\n );\n};\n\nexport interface CheckboxViewProps {\n label?: string;\n checked?: boolean;\n description?: string;\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const CheckboxView: A2UIView<CheckboxViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.checked ?? false);\n return (\n <FieldShell\n slot=\"a2ui-checkbox\"\n description={props.description}\n orientation=\"horizontal\"\n >\n <label className=\"flex items-start gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\">\n <span className=\"flex h-5 items-center\">\n <Checkbox\n checked={draft}\n disabled={props.disabled}\n aria-label={props.label ?? \"Checkbox\"}\n onCheckedChange={(checked) => {\n setDraft(checked);\n writeBack(\"checked\", checked);\n emit(props.onChange, \"change\", { checked });\n }}\n />\n </span>\n <span>{props.label}</span>\n </label>\n </FieldShell>\n );\n};\n\nexport interface SwitchViewProps extends CheckboxViewProps {}\n\nexport const SwitchView: A2UIView<SwitchViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.checked ?? false);\n return (\n <FieldShell slot=\"a2ui-switch\" description={props.description} orientation=\"horizontal\">\n <label className=\"flex items-center gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\">\n <Switch\n checked={draft}\n disabled={props.disabled}\n aria-label={props.label ?? \"Switch\"}\n onCheckedChange={(checked) => {\n setDraft(checked);\n writeBack(\"checked\", checked);\n emit(props.onChange, \"change\", { checked });\n }}\n />\n <span>{props.label}</span>\n </label>\n </FieldShell>\n );\n};\n\nexport interface RadioGroupViewProps {\n label?: string;\n value?: string;\n description?: string;\n options: SelectOption[];\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const RadioGroupView: A2UIView<RadioGroupViewProps> = ({ props, emit, writeBack }) => {\n const [draft, setDraft] = useDraft(props.value ?? \"\");\n return (\n <FieldShell\n slot=\"a2ui-radio-group\"\n label={props.label}\n description={props.description}\n >\n <RadioGroup\n aria-label={props.label ?? \"Options\"}\n value={draft}\n disabled={props.disabled}\n onValueChange={(next) => {\n const value = String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n >\n {props.options.map((option) => (\n <label\n key={option.value}\n className=\"flex items-start gap-3 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\"\n >\n <span className=\"flex h-5 items-center\">\n <RadioGroupItem value={option.value} disabled={option.disabled} />\n </span>\n <span>{option.label ?? option.value}</span>\n </label>\n ))}\n </RadioGroup>\n </FieldShell>\n );\n};\n\nexport interface DateFieldViewProps {\n label?: string;\n /** ISO `yyyy-mm-dd`; the wire format for a date in A2UI. */\n value?: string;\n min?: string;\n max?: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n onChange?: A2UIResolvedAction;\n}\n\nexport const DateFieldView: A2UIView<DateFieldViewProps> = ({ props, emit, writeBack }) => {\n const id = React.useId();\n const bound = props.value ? parseDateISO(props.value) : undefined;\n const [draft, setDraft] = useDraft<Date | undefined>(bound, props.value ?? \"\");\n return (\n <FieldShell\n slot=\"a2ui-date-field\"\n label={props.label}\n description={props.description}\n error={props.error}\n controlId={id}\n >\n <DateField\n id={id}\n value={draft}\n min={props.min ? parseDateISO(props.min) : undefined}\n max={props.max ? parseDateISO(props.max) : undefined}\n disabled={props.disabled}\n invalid={Boolean(props.error)}\n aria-label={props.label ?? \"Date\"}\n onValueChange={(date) => {\n setDraft(date);\n const value = date ? formatDateISO(date) : \"\";\n writeBack(\"value\", value);\n emit(props.onChange, \"change\", { value });\n }}\n />\n </FieldShell>\n );\n};\n\nexport interface ButtonViewProps {\n label: string;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"soft\" | \"destructive\" | \"link\";\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n /** Report the whole surface data model with the action, for a form submit. */\n submit?: boolean;\n onPress?: A2UIResolvedAction;\n}\n\nexport const ButtonView: A2UIView<ButtonViewProps> = ({ props, emit, dataModel }) => (\n <Button\n data-slot=\"a2ui-button\"\n className={INLINE}\n variant={props.variant ?? \"primary\"}\n size={props.size ?? \"md\"}\n disabled={props.disabled}\n onClick={() =>\n emit(\n props.onPress,\n props.submit ? \"submit\" : \"press\",\n props.submit ? { data: dataModel } : {},\n )\n }\n >\n {props.label}\n </Button>\n);\n\nexport interface ButtonLinkViewProps {\n label: string;\n href: string;\n variant?: ButtonViewProps[\"variant\"];\n size?: ButtonViewProps[\"size\"];\n target?: \"_self\" | \"_blank\";\n}\n\n// ButtonLink sets its own `data-slot` after spreading props, so the A2UI marker\n// goes on a wrapper rather than being silently dropped.\nexport const ButtonLinkView: A2UIView<ButtonLinkViewProps> = ({ props }) => (\n <span data-slot=\"a2ui-button-link\" className={cn(\"inline-flex\", INLINE)}>\n <ButtonLink\n variant={props.variant ?? \"secondary\"}\n size={props.size ?? \"md\"}\n href={props.href}\n target={props.target}\n rel={props.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n >\n {props.label}\n </ButtonLink>\n </span>\n);\n\nexport interface LinkViewProps {\n label: string;\n href: string;\n target?: \"_self\" | \"_blank\";\n}\n\nexport const LinkView: A2UIView<LinkViewProps> = ({ props }) => (\n <a\n data-slot=\"a2ui-link\"\n href={props.href}\n target={props.target}\n rel={props.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={cn(\n INLINE,\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-primary)] underline underline-offset-4\",\n \"hover:text-[color:var(--ds-primary-hover)]\",\n )}\n >\n {props.label}\n </a>\n);\n\n/* ------------------------------------------------------------------ */\n/* Feedback */\n/* ------------------------------------------------------------------ */\n\nexport interface BadgeViewProps {\n label: string;\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\" | \"outline\";\n}\n\nexport const BadgeView: A2UIView<BadgeViewProps> = ({ props }) => (\n <Badge data-slot=\"a2ui-badge\" className={INLINE} variant={props.variant ?? \"default\"}>\n {props.label}\n </Badge>\n);\n\nexport interface AlertViewProps {\n title?: string;\n description?: string;\n variant?: \"default\" | \"success\" | \"warn\" | \"danger\" | \"info\";\n}\n\nexport const AlertView: A2UIView<AlertViewProps> = ({ props }) => {\n const variant = props.variant ?? \"default\";\n return (\n <Alert data-slot=\"a2ui-alert\" variant={variant}>\n <AlertIcon>{ALERT_ICON[variant]}</AlertIcon>\n <div>\n {props.title ? <AlertTitle>{props.title}</AlertTitle> : null}\n {props.description ? <AlertDescription>{props.description}</AlertDescription> : null}\n </div>\n </Alert>\n );\n};\n\nexport interface ProgressViewProps {\n /** `null` renders the indeterminate bar. */\n value?: number | null;\n max?: number;\n label?: string;\n showValue?: boolean;\n}\n\nexport const ProgressViewComponent: A2UIView<ProgressViewProps> = ({ props }) => (\n <Progress\n data-slot=\"a2ui-progress\"\n value={props.value === undefined ? null : props.value}\n max={props.max}\n aria-label={props.label ?? \"Progress\"}\n >\n {props.label ? <ProgressLabel>{props.label}</ProgressLabel> : null}\n {props.showValue === false ? null : <ProgressValue />}\n </Progress>\n);\n\nexport interface StatusDotViewProps {\n label?: string;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n live?: boolean;\n}\n\nexport const StatusDotView: A2UIView<StatusDotViewProps> = ({ props }) => (\n <StatusDot\n data-slot=\"a2ui-status-dot\"\n className={INLINE}\n tone={props.tone ?? \"accent\"}\n live={props.live}\n label={props.label}\n />\n);\n\nexport interface EmptyStateViewProps {\n title: string;\n description?: string;\n size?: \"default\" | \"compact\";\n}\n\nexport const EmptyStateView: A2UIView<EmptyStateViewProps> = ({ props, children }) => (\n <EmptyState\n data-slot=\"a2ui-empty-state\"\n title={props.title}\n description={props.description}\n size={props.size ?? \"compact\"}\n action={children.length > 0 ? <div className=\"flex gap-2\">{children}</div> : undefined}\n />\n);\n\n/* ------------------------------------------------------------------ */\n/* Data */\n/* ------------------------------------------------------------------ */\n\nexport interface A2UIColumn {\n id: string;\n label?: string;\n align?: \"start\" | \"center\" | \"end\";\n filter?: \"faceted\" | \"text\";\n width?: number;\n}\n\n/**\n * Where a table's rows come from.\n *\n * `client` carries the rows inline, which suits a short result an agent\n * already has. `server` carries a handle instead: the agent obtains a\n * `sourceId` from a tool and the host resolves it through\n * `resolveDataSource`, so search, sort and paging run on the backend and the\n * agent never has to put ten thousand rows in a message.\n */\nexport type A2UITableSource =\n | { kind: \"client\"; rows: A2UIRow[] }\n | { kind: \"server\"; sourceId: string };\n\nexport interface DataTableViewProps {\n columns: A2UIColumn[];\n dataSource: A2UITableSource;\n pageSize?: number;\n density?: \"default\" | \"compact\";\n searchPlaceholder?: string;\n emptyMessage?: string;\n maxHeight?: number;\n onRowClick?: A2UIResolvedAction;\n}\n\nexport const DataTableView: A2UIView<DataTableViewProps> = ({\n props,\n emit,\n resolveDataSource,\n}) => {\n const columns = React.useMemo<DataTableColumnDef<A2UIRow>[]>(\n () =>\n props.columns.map((column) => ({\n id: column.id,\n accessorKey: column.id,\n header: column.label ?? column.id,\n size: column.width,\n meta: {\n align: column.align,\n filter: column.filter,\n label: column.label ?? column.id,\n },\n })) as DataTableColumnDef<A2UIRow>[],\n [props.columns],\n );\n\n const source = props.dataSource;\n const resolved: DataSource<A2UIRow> | undefined =\n source.kind === \"client\" ? { kind: \"client\", rows: source.rows } : resolveDataSource(source.sourceId);\n\n if (!resolved) {\n return (\n <A2UIErrorCard\n title=\"Unknown data source\"\n detail={`No data source is registered for \"${(source as { sourceId: string }).sourceId}\". The host resolves a server table through resolveDataSource.`}\n />\n );\n }\n\n return (\n <div data-slot=\"a2ui-data-table\">\n <DataTable<A2UIRow>\n columns={columns}\n dataSource={resolved}\n pageSize={props.pageSize ?? 10}\n density={props.density ?? \"compact\"}\n maxHeight={props.maxHeight}\n searchPlaceholder={props.searchPlaceholder}\n emptyMessage={props.emptyMessage}\n onRowClick={(row) => emit(props.onRowClick, \"rowClick\", { row })}\n />\n </div>\n );\n};\n\nexport interface ChartViewProps {\n type: ChartType;\n data: unknown;\n title?: string;\n height?: number;\n stacked?: boolean;\n legend?: boolean;\n grid?: boolean;\n scale?: \"sequential\" | \"diverging\";\n indexBy?: string;\n keys?: string[];\n from?: string;\n to?: string;\n emptyMessage?: string;\n}\n\nexport const ChartView: A2UIView<ChartViewProps> = ({ props }) => (\n <div data-slot=\"a2ui-chart\" className=\"flex flex-col gap-2\">\n {props.title ? (\n <p className=\"text-[length:var(--ds-text-caption-lg)] font-medium text-[color:var(--ds-foreground)]\">\n {props.title}\n </p>\n ) : null}\n <Chart\n type={props.type}\n data={props.data as ChartDataFor<ChartType>}\n height={props.height ?? 260}\n stacked={props.stacked}\n legend={props.legend}\n grid={props.grid}\n scale={props.scale}\n indexBy={props.indexBy}\n keys={props.keys}\n from={props.from}\n to={props.to}\n emptyMessage={props.emptyMessage}\n />\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Tabs and media */\n/* ------------------------------------------------------------------ */\n\nexport interface TabDescriptor {\n value: string;\n label: string;\n}\n\nexport interface TabsViewProps {\n tabs: TabDescriptor[];\n value?: string;\n onChange?: A2UIResolvedAction;\n}\n\nexport const TabsView: A2UIView<TabsViewProps> = ({ props, children, emit, writeBack }) => {\n const first = props.tabs[0]?.value ?? \"\";\n const [draft, setDraft] = useDraft(props.value ?? first);\n return (\n <Tabs\n data-slot=\"a2ui-tabs\"\n value={draft}\n onValueChange={(next) => {\n const value = String(next);\n setDraft(value);\n writeBack(\"value\", value);\n emit(props.onChange, \"tabChange\", { value });\n }}\n >\n <TabsList>\n {props.tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {props.tabs.map((tab, index) => (\n <TabsContent key={tab.value} value={tab.value}>\n {children[index] ?? null}\n </TabsContent>\n ))}\n </Tabs>\n );\n};\n\nexport interface ImageViewProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n rounded?: boolean;\n fit?: \"cover\" | \"contain\";\n}\n\nexport const ImageView: A2UIView<ImageViewProps> = ({ props }) => (\n <img\n data-slot=\"a2ui-image\"\n src={props.src}\n alt={props.alt}\n width={props.width}\n height={props.height}\n className={cn(\n INLINE,\n \"max-w-full\",\n props.fit === \"cover\" ? \"object-cover\" : \"object-contain\",\n props.rounded === false ? undefined : \"rounded-[var(--ds-radius-md)]\",\n \"border border-[var(--ds-border-subtle)]\",\n )}\n />\n);\n\n/* ------------------------------------------------------------------ */\n/* Error card */\n/* ------------------------------------------------------------------ */\n\n/**\n * What the renderer draws instead of a component it cannot draw.\n *\n * Never raw markup and never the offending payload as HTML: the detail is set\n * as text, so a malformed message cannot inject anything. This is the\n * \"fallback: an error card on malformed payloads\" of `05-agent-ui.md`.\n */\nexport function A2UIErrorCard({\n title,\n detail,\n componentId,\n}: {\n title: string;\n detail?: string;\n componentId?: string;\n}) {\n return (\n <Alert data-slot=\"a2ui-error\" variant=\"danger\" role=\"alert\">\n <AlertIcon>\n <OctagonAlert />\n </AlertIcon>\n <div className=\"min-w-0\">\n <AlertTitle>{title}</AlertTitle>\n {detail ? (\n <AlertDescription className=\"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] break-words\">\n {detail}\n </AlertDescription>\n ) : null}\n {componentId ? (\n <AlertDescription className=\"text-[length:var(--ds-text-caption-sm)] text-[color:var(--ds-muted-foreground)]\">\n Component id: {componentId}\n </AlertDescription>\n ) : null}\n </div>\n </Alert>\n );\n}\n\n/** Re-exported so consumers can type an action handler without the message module. */\nexport type { A2UIAction };\n","/**\n * The A2UI catalogue, bound to cortena-ui.\n *\n * A2UI's safety property is that an agent may only choose from a catalogue the\n * host controls: it cannot emit markup, styles or script, only a component name\n * and properties the host validates. This file is that catalogue. Each entry\n * declares\n *\n * - the A2UI component name an agent writes,\n * - a zod schema for its **resolved** properties (bindings already read),\n * - the event names it can raise,\n * - whether it takes children,\n * - a self-contained example, which is both the doc's sample and a fixture,\n * - the cortena-ui view that draws it.\n *\n * The vocabulary therefore grows with the package rather than with a parser:\n * adding a component here adds it to what every agent can draw, and\n * `catalogue-doc.ts` regenerates the prompt section from the same object, so\n * prompt and renderer cannot drift (DESIGN-34).\n *\n * Schemas describe resolved values because the renderer resolves `{ path }`\n * bindings, unwraps literals and normalises actions before validating. A view\n * therefore never receives an unchecked value, and a property an agent got\n * wrong produces an error card naming the property rather than a blank area.\n */\n\nimport { z } from \"zod\";\nimport type { A2UIComponentSpec } from \"./message\";\nimport * as views from \"./views\";\nimport type { A2UIView } from \"./views\";\n\n/** The five families the doc and the prompt group components by. */\nexport type A2UIGroup = \"layout\" | \"text\" | \"input\" | \"feedback\" | \"data\";\n\n/** A ready-to-render example: the components, plus any data model they bind to. */\nexport interface A2UIExample {\n /** Components for this entry. The first is the one being demonstrated. */\n components: A2UIComponentSpec[];\n /** Seed data for `{ path }` bindings used by the example. */\n data?: Record<string, unknown>;\n}\n\nexport interface A2UICatalogueEntry<P = unknown> {\n /** The name an agent writes in `component`. */\n name: string;\n group: A2UIGroup;\n /** One sentence, used verbatim in the generated prompt section. */\n summary: string;\n /** Schema of the resolved properties. */\n props: z.ZodType<P>;\n /** Event names this component can raise through `onAction`. */\n events: readonly string[];\n /** `many` takes a `children` list; `none` ignores one. */\n children: \"none\" | \"many\";\n example: A2UIExample;\n view: A2UIView<P>;\n}\n\nexport type A2UICatalogue = Readonly<Record<string, A2UICatalogueEntry<never>>>;\n\n/** Keeps each entry's props type tied to its view without widening the record. */\nfunction entry<P>(definition: A2UICatalogueEntry<P>): A2UICatalogueEntry<never> {\n return definition as unknown as A2UICatalogueEntry<never>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared property fragments */\n/* ------------------------------------------------------------------ */\n\n/**\n * A resolved action.\n *\n * On the wire an agent writes A2UI v0.9's `{ event: { name, context } }`, the\n * bare `{ name, context }`, or just the name as a string; the renderer\n * normalises all three to this before validation.\n */\nconst Action = z\n .object({\n name: z.string().describe(\"Event name sent back to the agent.\"),\n context: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Extra values merged into the action payload.\"),\n })\n .describe(\"An action reported to the agent when the user interacts.\");\n\nconst Option = z.object({\n value: z.string().describe(\"Value written to the data model.\"),\n label: z.string().optional().describe(\"Text shown to the user; defaults to the value.\"),\n disabled: z.boolean().optional(),\n});\n\nconst gap = z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])\n .describe(\"Spacing step between children.\");\n\nconst padding = z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])\n .describe(\"Inner padding step.\");\n\nconst alignment = z\n .enum([\"start\", \"center\", \"end\", \"stretch\", \"baseline\"])\n .describe(\"Cross-axis alignment.\");\n\nconst justification = z\n .enum([\"start\", \"center\", \"end\", \"between\"])\n .describe(\"Main-axis distribution.\");\n\nconst fieldChrome = {\n label: z.string().optional().describe(\"Field label.\"),\n description: z.string().optional().describe(\"Helper text under the control.\"),\n error: z.string().optional().describe(\"Validation message; also marks the field invalid.\"),\n disabled: z.boolean().optional(),\n};\n\nconst buttonVariant = z\n .enum([\"primary\", \"secondary\", \"outline\", \"ghost\", \"soft\", \"destructive\", \"link\"])\n .describe(\"Visual weight.\");\n\nconst buttonSize = z.enum([\"sm\", \"md\", \"lg\"]).describe(\"Control size.\");\n\n/**\n * Root-relative means one slash and then a path. `//evil.example/x` is\n * protocol-relative — the browser resolves it against the page's scheme and\n * goes off-origin — and `/\\evil.example` is the same trick, because browsers\n * treat a backslash after the leading slash as a second slash.\n */\nconst rootRelative = (value: string) =>\n value.startsWith(\"/\") && value[1] !== \"/\" && value[1] !== \"\\\\\";\n\n/**\n * A URL an agent may point at.\n *\n * Restricted by scheme rather than sanitised after the fact: `javascript:` and\n * friends never reach the DOM because they never pass validation, so the\n * component gets an error card instead.\n */\nconst httpUrl = z\n .string()\n .refine(\n (value) => /^https?:\\/\\//i.test(value) || rootRelative(value) || value.startsWith(\"#\"),\n \"Must be an http(s), root-relative or fragment URL.\",\n )\n .describe(\"Destination URL (http, https, root-relative or fragment).\");\n\nconst imageUrl = z\n .string()\n .refine(\n (value) => /^https?:\\/\\//i.test(value) || /^data:image\\//i.test(value) || rootRelative(value),\n \"Must be an http(s), root-relative or data:image URL.\",\n )\n .describe(\"Image URL (http, https, root-relative or data:image).\");\n\n/** Every chart type the Chart composite draws, Recharts and Nivo alike. */\nconst chartType = z\n .enum([\n \"bar\",\n \"line\",\n \"area\",\n \"pie\",\n \"donut\",\n \"scatter\",\n \"scatterplot\",\n \"radar\",\n \"funnel\",\n \"heatmap\",\n \"calendar\",\n \"treemap\",\n \"sunburst\",\n ])\n .describe(\"Chart type; the package picks Recharts or Nivo for it.\");\n\n/**\n * A table's rows, or a handle to them.\n *\n * The server form is the point of `04-data-tables.md` in an agent context: the\n * agent calls a tool, gets back a `sourceId`, and passes that. The host resolves\n * it through `resolveDataSource`, so search, sort and paging stay on the backend\n * and a large result never travels through the model.\n */\nconst tableSource = z\n .union([\n z.object({\n kind: z.literal(\"client\"),\n rows: z.array(z.record(z.string(), z.unknown())).describe(\"The rows, inline.\"),\n }),\n z.object({\n kind: z.literal(\"server\"),\n sourceId: z\n .string()\n .describe(\"Handle obtained from a tool; the host resolves it to a server source.\"),\n }),\n ])\n .describe(\"Where the table's rows come from.\");\n\n/* ------------------------------------------------------------------ */\n/* The catalogue */\n/* ------------------------------------------------------------------ */\n\nconst layout = {\n Column: entry<views.ColumnProps>({\n name: \"Column\",\n group: \"layout\",\n summary: \"Stacks its children vertically.\",\n props: z.object({ gap: gap.optional(), padding: padding.optional(), align: alignment.optional(), justify: justification.optional() }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"col\", component: \"Column\", gap: 3, children: [\"col-a\", \"col-b\"] },\n { id: \"col-a\", component: \"Text\", text: \"First\", role: \"body\" },\n { id: \"col-b\", component: \"Text\", text: \"Second\", role: \"body\" },\n ],\n },\n view: views.ColumnView,\n }),\n\n Row: entry<views.RowProps>({\n name: \"Row\",\n group: \"layout\",\n summary: \"Lays its children out horizontally, wrapping by default.\",\n props: z.object({\n gap: gap.optional(),\n padding: padding.optional(),\n align: alignment.optional(),\n justify: justification.optional(),\n wrap: z.boolean().optional().describe(\"Set false to keep one line.\"),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"row\", component: \"Row\", gap: 2, children: [\"row-a\", \"row-b\"] },\n { id: \"row-a\", component: \"Badge\", label: \"Open\", variant: \"info\" },\n { id: \"row-b\", component: \"Badge\", label: \"3 days\", variant: \"neutral\" },\n ],\n },\n view: views.RowView,\n }),\n\n Card: entry<views.CardViewProps>({\n name: \"Card\",\n group: \"layout\",\n summary: \"A bordered surface grouping related content.\",\n props: z.object({\n accent: z.boolean().optional().describe(\"Draw the border in the ring colour.\"),\n flush: z.boolean().optional().describe(\"Remove the body padding.\"),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n { id: \"card\", component: \"Card\", children: [\"card-text\"] },\n { id: \"card-text\", component: \"Text\", text: \"Inside a card.\", role: \"body\" },\n ],\n },\n view: views.CardView,\n }),\n\n SectionCard: entry<views.SectionCardViewProps>({\n name: \"SectionCard\",\n group: \"layout\",\n summary: \"A card with a title and description header above its children.\",\n props: z.object({\n title: z.string().describe(\"Header title.\"),\n description: z.string().optional().describe(\"Header description.\"),\n flush: z.boolean().optional(),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n {\n id: \"section\",\n component: \"SectionCard\",\n title: \"Pipeline\",\n description: \"Deals closing this quarter.\",\n children: [\"section-text\"],\n },\n { id: \"section-text\", component: \"Text\", text: \"Twelve open deals.\", role: \"body\" },\n ],\n },\n view: views.SectionCardView,\n }),\n\n Divider: entry<views.DividerProps>({\n name: \"Divider\",\n group: \"layout\",\n summary: \"A hairline rule between sections.\",\n props: z.object({ orientation: z.enum([\"horizontal\", \"vertical\"]).optional() }),\n events: [],\n children: \"none\",\n example: { components: [{ id: \"divider\", component: \"Divider\" }] },\n view: views.DividerView,\n }),\n\n Spacer: entry<views.SpacerProps>({\n name: \"Spacer\",\n group: \"layout\",\n summary: \"Blank vertical space where a gap is not enough.\",\n props: z.object({ size: gap.optional().describe(\"Height step; default 4.\") }),\n events: [],\n children: \"none\",\n example: { components: [{ id: \"spacer\", component: \"Spacer\", size: 4 }] },\n view: views.SpacerView,\n }),\n};\n\nconst text = {\n Text: entry<views.TextProps>({\n name: \"Text\",\n group: \"text\",\n summary: \"A run of plain text at one of the type-scale roles.\",\n props: z.object({\n text: z.string().describe(\"The text to show.\"),\n role: z\n .enum([\"heading\", \"subheading\", \"body\", \"caption\", \"eyebrow\"])\n .optional()\n .describe(\"Type-scale role; default body.\"),\n tone: z\n .enum([\"default\", \"muted\", \"success\", \"warning\", \"danger\", \"info\"])\n .optional()\n .describe(\"Semantic colour; default foreground.\"),\n align: z.enum([\"start\", \"center\", \"end\"]).optional(),\n mono: z.boolean().optional().describe(\"Render in the mono face, for ids and numbers.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"heading\", component: \"Text\", text: \"Quarterly review\", role: \"heading\" },\n ],\n },\n view: views.TextView,\n }),\n\n Markdown: entry<views.MarkdownViewProps>({\n name: \"Markdown\",\n group: \"text\",\n summary: \"Rich text as markdown; sanitised, with GFM tables and code blocks.\",\n props: z.object({\n text: z.string().describe(\"Markdown source.\"),\n compact: z.boolean().optional().describe(\"Tighter rhythm, for chat bubbles.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"md\",\n component: \"Markdown\",\n text: \"**Summary**\\n\\n- Revenue up 12%\\n- Churn flat\\n\",\n compact: true,\n },\n ],\n },\n view: views.MarkdownView,\n }),\n};\n\nconst input = {\n TextField: entry<views.TextFieldProps>({\n name: \"TextField\",\n group: \"input\",\n summary: \"A single-line text input.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional().describe(\"Current value; bind it to the data model.\"),\n placeholder: z.string().optional(),\n type: z\n .enum([\"text\", \"email\", \"url\", \"tel\", \"number\", \"password\", \"search\"])\n .optional()\n .describe(\"Input type; default text.\"),\n required: z.boolean().optional(),\n onChange: Action.optional().describe(\"Raised after the user stops typing.\"),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { name: \"\" } },\n components: [\n {\n id: \"name\",\n component: \"TextField\",\n label: \"Full name\",\n value: { path: \"/form/name\" },\n placeholder: \"Ada Lovelace\",\n onChange: { event: { name: \"nameChanged\" } },\n },\n ],\n },\n view: views.TextFieldView,\n }),\n\n TextArea: entry<views.TextAreaProps>({\n name: \"TextArea\",\n group: \"input\",\n summary: \"A multi-line text input.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional(),\n placeholder: z.string().optional(),\n rows: z.number().int().min(2).max(20).optional().describe(\"Visible rows; default 4.\"),\n autoGrow: z.boolean().optional().describe(\"Grow with the content.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { notes: \"\" } },\n components: [\n {\n id: \"notes\",\n component: \"TextArea\",\n label: \"Notes\",\n value: { path: \"/form/notes\" },\n rows: 3,\n onChange: { event: { name: \"notesChanged\" } },\n },\n ],\n },\n view: views.TextAreaView,\n }),\n\n Select: entry<views.SelectViewProps>({\n name: \"Select\",\n group: \"input\",\n summary: \"A dropdown offering one of a fixed list of options.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(Option).min(1).describe(\"The options to choose from.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { region: \"ap-south-1\" } },\n components: [\n {\n id: \"region\",\n component: \"Select\",\n label: \"Region\",\n value: { path: \"/form/region\" },\n options: [\n { value: \"ap-south-1\", label: \"Mumbai\" },\n { value: \"eu-west-1\", label: \"Ireland\" },\n ],\n onChange: { event: { name: \"regionChanged\" } },\n },\n ],\n },\n view: views.SelectView,\n }),\n\n Checkbox: entry<views.CheckboxViewProps>({\n name: \"Checkbox\",\n group: \"input\",\n summary: \"A single on/off box with a label.\",\n props: z.object({\n label: z.string().optional().describe(\"Text beside the box.\"),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n checked: z.boolean().optional(),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { terms: false } },\n components: [\n {\n id: \"terms\",\n component: \"Checkbox\",\n label: \"I accept the terms\",\n checked: { path: \"/form/terms\" },\n onChange: { event: { name: \"termsChanged\" } },\n },\n ],\n },\n view: views.CheckboxView,\n }),\n\n Switch: entry<views.SwitchViewProps>({\n name: \"Switch\",\n group: \"input\",\n summary: \"A toggle for a setting that takes effect immediately.\",\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n checked: z.boolean().optional(),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { alerts: true } },\n components: [\n {\n id: \"alerts\",\n component: \"Switch\",\n label: \"Email alerts\",\n checked: { path: \"/form/alerts\" },\n onChange: { event: { name: \"alertsChanged\" } },\n },\n ],\n },\n view: views.SwitchView,\n }),\n\n RadioGroup: entry<views.RadioGroupViewProps>({\n name: \"RadioGroup\",\n group: \"input\",\n summary: \"One choice from a short visible list.\",\n props: z.object({\n label: z.string().optional(),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n value: z.string().optional(),\n options: z.array(Option).min(2).describe(\"Two or more choices.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { plan: \"pro\" } },\n components: [\n {\n id: \"plan\",\n component: \"RadioGroup\",\n label: \"Plan\",\n value: { path: \"/form/plan\" },\n options: [\n { value: \"free\", label: \"Free\" },\n { value: \"pro\", label: \"Pro\" },\n ],\n onChange: { event: { name: \"planChanged\" } },\n },\n ],\n },\n view: views.RadioGroupView,\n }),\n\n DateField: entry<views.DateFieldViewProps>({\n name: \"DateField\",\n group: \"input\",\n summary: \"A date, typed or picked from a calendar. ISO yyyy-mm-dd on the wire.\",\n props: z.object({\n ...fieldChrome,\n value: z.string().optional().describe(\"ISO date, yyyy-mm-dd.\"),\n min: z.string().optional().describe(\"Earliest selectable ISO date.\"),\n max: z.string().optional().describe(\"Latest selectable ISO date.\"),\n onChange: Action.optional(),\n }),\n events: [\"change\"],\n children: \"none\",\n example: {\n data: { form: { start: \"2026-09-01\" } },\n components: [\n {\n id: \"start\",\n component: \"DateField\",\n label: \"Start date\",\n value: { path: \"/form/start\" },\n onChange: { event: { name: \"startChanged\" } },\n },\n ],\n },\n view: views.DateFieldView,\n }),\n\n Button: entry<views.ButtonViewProps>({\n name: \"Button\",\n group: \"input\",\n summary: \"A button. Set submit to report the whole data model with the action.\",\n props: z.object({\n label: z.string().describe(\"Button text.\"),\n variant: buttonVariant.optional().describe(\"Visual weight; default primary.\"),\n size: buttonSize.optional(),\n disabled: z.boolean().optional(),\n submit: z\n .boolean()\n .optional()\n .describe(\"Send the surface data model as the action payload; use for form submits.\"),\n onPress: Action.optional().describe(\"Raised when the user presses the button.\"),\n }),\n events: [\"press\", \"submit\"],\n children: \"none\",\n example: {\n components: [\n {\n id: \"save\",\n component: \"Button\",\n label: \"Save\",\n variant: \"primary\",\n submit: true,\n onPress: { event: { name: \"saveProfile\" } },\n },\n ],\n },\n view: views.ButtonView,\n }),\n\n ButtonLink: entry<views.ButtonLinkViewProps>({\n name: \"ButtonLink\",\n group: \"input\",\n summary: \"A link that looks like a button. Navigates; raises no action.\",\n props: z.object({\n label: z.string(),\n href: httpUrl,\n variant: buttonVariant.optional().describe(\"Visual weight; default secondary.\"),\n size: buttonSize.optional(),\n target: z.enum([\"_self\", \"_blank\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"docs\",\n component: \"ButtonLink\",\n label: \"Open runbook\",\n href: \"https://example.com/runbook\",\n target: \"_blank\",\n },\n ],\n },\n view: views.ButtonLinkView,\n }),\n};\n\nconst feedback = {\n Badge: entry<views.BadgeViewProps>({\n name: \"Badge\",\n group: \"feedback\",\n summary: \"A small status label.\",\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"default\", \"success\", \"warning\", \"danger\", \"info\", \"neutral\", \"outline\"])\n .optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [{ id: \"badge\", component: \"Badge\", label: \"Active\", variant: \"success\" }],\n },\n view: views.BadgeView,\n }),\n\n Alert: entry<views.AlertViewProps>({\n name: \"Alert\",\n group: \"feedback\",\n summary: \"A callout carrying a short message the user should notice.\",\n props: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n variant: z.enum([\"default\", \"success\", \"warn\", \"danger\", \"info\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"alert\",\n component: \"Alert\",\n variant: \"warn\",\n title: \"Quota at 90%\",\n description: \"Upgrade before the end of the month.\",\n },\n ],\n },\n view: views.AlertView,\n }),\n\n Progress: entry<views.ProgressViewProps>({\n name: \"Progress\",\n group: \"feedback\",\n summary: \"A determinate or indeterminate progress bar.\",\n props: z.object({\n value: z.number().nullable().optional().describe(\"Null renders the indeterminate bar.\"),\n max: z.number().optional().describe(\"Maximum; default 100.\"),\n label: z.string().optional(),\n showValue: z.boolean().optional().describe(\"Set false to hide the numeric readout.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"progress\", component: \"Progress\", label: \"Indexing\", value: 64 },\n ],\n },\n view: views.ProgressViewComponent,\n }),\n\n StatusDot: entry<views.StatusDotViewProps>({\n name: \"StatusDot\",\n group: \"feedback\",\n summary: \"A coloured dot with a caption, for live status.\",\n props: z.object({\n label: z.string().optional(),\n tone: z.enum([\"accent\", \"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).optional(),\n live: z.boolean().optional().describe(\"Add a pulsing halo for an active state.\"),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n { id: \"status\", component: \"StatusDot\", label: \"Running\", tone: \"success\", live: true },\n ],\n },\n view: views.StatusDotView,\n }),\n\n EmptyState: entry<views.EmptyStateViewProps>({\n name: \"EmptyState\",\n group: \"feedback\",\n summary: \"The 'nothing here' surface; children become its actions.\",\n props: z.object({\n title: z.string(),\n description: z.string().optional(),\n size: z.enum([\"default\", \"compact\"]).optional(),\n }),\n events: [],\n children: \"many\",\n example: {\n components: [\n {\n id: \"empty\",\n component: \"EmptyState\",\n title: \"No results\",\n description: \"Try a wider date range.\",\n children: [\"empty-action\"],\n },\n {\n id: \"empty-action\",\n component: \"Button\",\n label: \"Reset filters\",\n variant: \"secondary\",\n onPress: { event: { name: \"resetFilters\" } },\n },\n ],\n },\n view: views.EmptyStateView,\n }),\n};\n\nconst data = {\n DataTable: entry<views.DataTableViewProps>({\n name: \"DataTable\",\n group: \"data\",\n summary:\n \"A sortable, searchable table. Pass rows inline, or a server sourceId obtained from a tool.\",\n props: z.object({\n columns: z\n .array(\n z.object({\n id: z.string().describe(\"Row property this column reads.\"),\n label: z.string().optional().describe(\"Header text; defaults to the id.\"),\n align: z.enum([\"start\", \"center\", \"end\"]).optional(),\n filter: z\n .enum([\"faceted\", \"text\"])\n .optional()\n .describe(\"Add a toolbar filter for this column.\"),\n width: z.number().optional(),\n }),\n )\n .min(1),\n dataSource: tableSource,\n pageSize: z.number().int().min(1).max(200).optional().describe(\"Rows per page; default 10.\"),\n density: z.enum([\"default\", \"compact\"]).optional(),\n searchPlaceholder: z.string().optional(),\n emptyMessage: z.string().optional(),\n maxHeight: z.number().optional().describe(\"Scrolling body height in px.\"),\n onRowClick: Action.optional().describe(\"Raised with the clicked row.\"),\n }),\n events: [\"rowClick\"],\n children: \"none\",\n example: {\n components: [\n {\n id: \"table\",\n component: \"DataTable\",\n columns: [\n { id: \"name\", label: \"Name\" },\n { id: \"status\", label: \"Status\", filter: \"faceted\" },\n { id: \"deals\", label: \"Deals\", align: \"end\" },\n ],\n dataSource: {\n kind: \"client\",\n rows: [\n { name: \"Ada Lovelace\", status: \"active\", deals: 12 },\n { name: \"Grace Hopper\", status: \"invited\", deals: 4 },\n ],\n },\n onRowClick: { event: { name: \"openContact\" } },\n },\n ],\n },\n view: views.DataTableView,\n }),\n\n Chart: entry<views.ChartViewProps>({\n name: \"Chart\",\n group: \"data\",\n summary:\n \"Any chart the package draws: bar, line, area, pie, donut, scatter, radar, funnel, heatmap, calendar, treemap, sunburst.\",\n props: z.object({\n type: chartType,\n data: z\n .unknown()\n .describe(\n \"Rows [{category, series…}] for bar/radar; series [{id, data:[{x,y}]}] for line/area/scatter/heatmap; slices [{id,value}] for pie/donut/funnel; days [{day,value}] for calendar; a tree {id, children} for treemap/sunburst.\",\n ),\n title: z.string().optional().describe(\"Caption above the chart.\"),\n height: z.number().int().min(120).max(800).optional().describe(\"Drawing height in px.\"),\n stacked: z.boolean().optional(),\n legend: z.boolean().optional(),\n grid: z.boolean().optional(),\n scale: z.enum([\"sequential\", \"diverging\"]).optional().describe(\"Heatmap and calendar scale.\"),\n indexBy: z.string().optional().describe(\"Category key for row data.\"),\n keys: z.array(z.string()).optional().describe(\"Series keys for row data.\"),\n from: z.string().optional().describe(\"Calendar range start, ISO date.\"),\n to: z.string().optional().describe(\"Calendar range end, ISO date.\"),\n emptyMessage: z.string().optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"chart\",\n component: \"Chart\",\n type: \"bar\",\n title: \"Revenue by month\",\n data: [\n { month: \"Jan\", revenue: 42, cost: 18 },\n { month: \"Feb\", revenue: 51, cost: 22 },\n ],\n },\n ],\n },\n view: views.ChartView,\n }),\n};\n\nconst other = {\n Tabs: entry<views.TabsViewProps>({\n name: \"Tabs\",\n group: \"layout\",\n summary: \"Tabbed panels; the nth child is the nth tab's panel.\",\n props: z.object({\n tabs: z\n .array(z.object({ value: z.string(), label: z.string() }))\n .min(2)\n .describe(\"Tab bar, in order.\"),\n value: z.string().optional().describe(\"Selected tab; defaults to the first.\"),\n onChange: Action.optional(),\n }),\n events: [\"tabChange\"],\n children: \"many\",\n example: {\n components: [\n {\n id: \"tabs\",\n component: \"Tabs\",\n tabs: [\n { value: \"summary\", label: \"Summary\" },\n { value: \"detail\", label: \"Detail\" },\n ],\n children: [\"tab-summary\", \"tab-detail\"],\n onChange: { event: { name: \"tabChanged\" } },\n },\n { id: \"tab-summary\", component: \"Text\", text: \"Two open incidents.\", role: \"body\" },\n { id: \"tab-detail\", component: \"Text\", text: \"INC-42, INC-51.\", role: \"body\" },\n ],\n },\n view: views.TabsView,\n }),\n\n Image: entry<views.ImageViewProps>({\n name: \"Image\",\n group: \"text\",\n summary: \"An image. Alt text is required.\",\n props: z.object({\n src: imageUrl,\n alt: z.string().describe(\"Alternative text; required.\"),\n width: z.number().optional(),\n height: z.number().optional(),\n rounded: z.boolean().optional().describe(\"Set false for square corners.\"),\n fit: z.enum([\"cover\", \"contain\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"image\",\n component: \"Image\",\n src: \"https://example.com/chart.png\",\n alt: \"Revenue by month\",\n height: 160,\n },\n ],\n },\n view: views.ImageView,\n }),\n\n Link: entry<views.LinkViewProps>({\n name: \"Link\",\n group: \"text\",\n summary: \"An inline text link.\",\n props: z.object({\n label: z.string(),\n href: httpUrl,\n target: z.enum([\"_self\", \"_blank\"]).optional(),\n }),\n events: [],\n children: \"none\",\n example: {\n components: [\n {\n id: \"link\",\n component: \"Link\",\n label: \"View the incident\",\n href: \"https://example.com/inc-42\",\n target: \"_blank\",\n },\n ],\n },\n view: views.LinkView,\n }),\n};\n\n/**\n * The catalogue an agent draws from, and the renderer's default.\n *\n * A host may narrow it (hand the renderer a subset) but should not widen it\n * with components the prompt does not describe: an agent can only usefully\n * emit what `catalogue-doc.ts` told it about.\n */\nexport const defaultCatalogue: A2UICatalogue = Object.freeze({\n ...layout,\n ...text,\n ...input,\n ...feedback,\n ...data,\n ...other,\n});\n\n/** Catalogue id an agent may echo in `createSurface.catalogId`. */\nexport const A2UI_CATALOGUE_ID = \"https://cortena.ai/a2ui/catalogues/cortena-ui/v1.json\";\n\n/** Every component name in the catalogue, sorted. */\nexport function catalogueNames(catalogue: A2UICatalogue = defaultCatalogue): string[] {\n return Object.keys(catalogue).sort();\n}\n","/**\n * A2UI message layer.\n *\n * The wire format cortena-ui accepts, and the fold from a stream of messages\n * onto a set of surfaces. Deliberately free of React so it can be reused by a\n * canvas host, a test fixture, or the catalogue doc generator.\n *\n * ## Two dialects, one fold\n *\n * **v0.9** is the current A2UI protocol (`createSurface`, `updateComponents`,\n * `updateDataModel`, `deleteSurface`) and is what an agent should emit.\n *\n * **v0.8** is what Cortena already speaks: core bundles Google's A2UI Lit\n * renderer at `src/canvas-host/a2ui/` and its `A2uiMessageProcessor` handles\n * `beginRendering`, `surfaceUpdate`, `dataModelUpdate` and `deleteSurface`.\n * The `canvas` agent tool pushes exactly those, as JSON lines, through\n * `canvas.a2ui.pushJSONL`. Accepting both means one renderer serves the chat,\n * the web canvas panel and every payload already written against the native\n * nodes.\n *\n * ## Transport\n *\n * Per `05-agent-ui.md`, an A2UI block travels as an AG-UI `CUSTOM` event. The\n * event value is a message, an array of messages, or the JSONL text the canvas\n * tool sends; {@link parseA2UIMessages} takes all three.\n */\n\n/** Surface id used when a message omits one, matching core's Lit processor. */\nexport const A2UI_DEFAULT_SURFACE_ID = \"@default\";\n\n/** Protocol version this package speaks. */\nexport const A2UI_VERSION = \"v0.9\";\n\n/** A reference to a value in the surface's data model, as a JSON pointer. */\nexport interface A2UIDataBinding {\n path: string;\n}\n\n/**\n * A property value as an agent writes it: a literal, a data binding, or one of\n * the v0.8 literal wrappers the Lit renderer accepts.\n */\nexport type A2UIPropertyValue =\n | string\n | number\n | boolean\n | null\n | A2UIDataBinding\n | { literal: unknown }\n | { literalString: string }\n | readonly A2UIPropertyValue[]\n | { readonly [key: string]: unknown };\n\n/**\n * A component's children. v0.9 uses a plain id array or a `{ componentId, path }`\n * template; v0.8 wraps the same two in `explicitList` / `template`.\n */\nexport type A2UIChildList =\n | readonly string[]\n | { componentId: string; path: string }\n | { explicitList: readonly string[] }\n | { template: { componentId: string; dataBinding: string } };\n\n/** An action an agent attaches to an interactive property. */\nexport type A2UIActionSpec =\n | string\n | { event: { name: string; context?: Record<string, unknown> } }\n | { name: string; context?: Record<string, unknown> };\n\n/**\n * One component in a surface.\n *\n * v0.9 is flat — `{ id, component: \"Text\", text: \"hi\" }` — and v0.8 wraps the\n * properties under the type name — `{ id, component: { Text: { text: \"hi\" } } }`.\n */\nexport interface A2UIComponentSpec {\n id: string;\n component: string | Record<string, Record<string, unknown>>;\n children?: A2UIChildList;\n /** v0.8 flex weight; carried through but not used for layout here. */\n weight?: number | string;\n [property: string]: unknown;\n}\n\nexport interface A2UICreateSurface {\n surfaceId?: string;\n catalogId?: string;\n /** Not in the v0.9 schema; accepted so a single message can seed a surface. */\n root?: string;\n sendDataModel?: boolean;\n}\n\nexport interface A2UIUpdateComponents {\n surfaceId?: string;\n components: A2UIComponentSpec[];\n root?: string;\n}\n\nexport interface A2UIUpdateDataModel {\n surfaceId?: string;\n path?: string;\n value?: unknown;\n /** v0.8 spelling of `value`. */\n contents?: unknown;\n}\n\nexport interface A2UIBeginRendering {\n surfaceId?: string;\n root?: string;\n styles?: Record<string, unknown>;\n}\n\nexport interface A2UIDeleteSurface {\n surfaceId?: string;\n}\n\n/** One message on the wire. Exactly one operation key is read per message. */\nexport interface A2UIMessage {\n version?: string;\n createSurface?: A2UICreateSurface;\n updateComponents?: A2UIUpdateComponents;\n updateDataModel?: A2UIUpdateDataModel;\n deleteSurface?: A2UIDeleteSurface;\n /** v0.8 */\n beginRendering?: A2UIBeginRendering;\n /** v0.8 */\n surfaceUpdate?: A2UIUpdateComponents;\n /** v0.8 */\n dataModelUpdate?: A2UIUpdateDataModel;\n}\n\n/**\n * Everything the renderer's `message` prop takes: one message, a list of them\n * (the AG-UI `CUSTOM` payload), or JSONL / a JSON array as text (the canvas\n * tool's `a2ui_push`).\n */\nexport type A2UIMessageInput = A2UIMessage | readonly A2UIMessage[] | string | null | undefined;\n\n/** A folded surface: what the renderer draws. */\nexport interface A2UISurface {\n id: string;\n /** Id of the root component; `undefined` until a message names one. */\n root: string | undefined;\n components: ReadonlyMap<string, A2UIComponentSpec>;\n dataModel: Record<string, unknown>;\n styles: Record<string, unknown>;\n}\n\nexport interface A2UIFoldResult {\n surfaces: A2UISurface[];\n /** One line per malformed message; the renderer shows these in an error card. */\n errors: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True when a value is a `{ path }` data binding rather than a literal object. */\nexport function isDataBinding(value: unknown): value is A2UIDataBinding {\n return isRecord(value) && typeof value.path === \"string\" && Object.keys(value).length === 1;\n}\n\n/**\n * Parse whatever arrived into a message list.\n *\n * A string is tried as JSON first (an array or a single message) and then as\n * JSONL, which is the form `canvas.a2ui.pushJSONL` sends. A line that does not\n * parse is reported rather than dropped: silently rendering three of four\n * pushed messages is the failure mode this returns errors for.\n */\nexport function parseA2UIMessages(input: A2UIMessageInput): {\n messages: A2UIMessage[];\n errors: string[];\n} {\n if (input === null || input === undefined) {\n return { messages: [], errors: [] };\n }\n if (typeof input === \"string\") {\n const trimmed = input.trim();\n if (!trimmed) {\n return { messages: [], errors: [] };\n }\n if (trimmed.startsWith(\"[\")) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return collect(parsed);\n }\n return { messages: [], errors: [\"Expected an array of A2UI messages.\"] };\n } catch (error) {\n return { messages: [], errors: [`Malformed JSON: ${errorText(error)}`] };\n }\n }\n const messages: A2UIMessage[] = [];\n const errors: string[] = [];\n const lines = trimmed.split(\"\\n\");\n for (let index = 0; index < lines.length; index += 1) {\n const line = (lines[index] ?? \"\").trim();\n if (!line) {\n continue;\n }\n try {\n const parsed: unknown = JSON.parse(line);\n const one = collect([parsed]);\n messages.push(...one.messages);\n errors.push(...one.errors.map((text) => `Line ${index + 1}: ${text}`));\n } catch (error) {\n errors.push(`Line ${index + 1}: malformed JSON (${errorText(error)}).`);\n }\n }\n return { messages, errors };\n }\n return collect(Array.isArray(input) ? input : [input]);\n}\n\nfunction collect(values: readonly unknown[]): { messages: A2UIMessage[]; errors: string[] } {\n const messages: A2UIMessage[] = [];\n const errors: string[] = [];\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (!isRecord(value)) {\n errors.push(`Message ${index + 1} is not an object.`);\n continue;\n }\n messages.push(value as A2UIMessage);\n }\n return { messages, errors };\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface MutableSurface {\n id: string;\n root: string | undefined;\n components: Map<string, A2UIComponentSpec>;\n dataModel: Record<string, unknown>;\n styles: Record<string, unknown>;\n}\n\n/**\n * Fold a message stream onto surfaces.\n *\n * Updates accumulate: a later `updateComponents` replaces the components it\n * names and leaves the rest, and a later `updateDataModel` writes at its path\n * only. That is what makes the JSONL push form work — the agent sends the\n * shell, then the rows, then a correction, and each one folds onto the same\n * surface.\n */\nexport function foldMessages(input: A2UIMessageInput): A2UIFoldResult {\n const { messages, errors } = parseA2UIMessages(input);\n const surfaces = new Map<string, MutableSurface>();\n const order: string[] = [];\n\n const surfaceFor = (id: string | undefined): MutableSurface => {\n const key = id && id.trim() ? id : A2UI_DEFAULT_SURFACE_ID;\n let surface = surfaces.get(key);\n if (!surface) {\n surface = { id: key, root: undefined, components: new Map(), dataModel: {}, styles: {} };\n surfaces.set(key, surface);\n order.push(key);\n }\n return surface;\n };\n\n const applyComponents = (payload: A2UIUpdateComponents | undefined, index: number): void => {\n if (!payload) {\n return;\n }\n const surface = surfaceFor(payload.surfaceId);\n if (!Array.isArray(payload.components)) {\n errors.push(`Message ${index + 1}: components must be an array.`);\n return;\n }\n for (const spec of payload.components) {\n if (!isRecord(spec) || typeof spec.id !== \"string\" || !spec.id) {\n errors.push(`Message ${index + 1}: a component is missing a string id.`);\n continue;\n }\n surface.components.set(spec.id, spec as A2UIComponentSpec);\n }\n if (typeof payload.root === \"string\" && payload.root) {\n surface.root = payload.root;\n }\n };\n\n const applyData = (payload: A2UIUpdateDataModel | undefined): void => {\n if (!payload) {\n return;\n }\n const surface = surfaceFor(payload.surfaceId);\n const value = payload.value !== undefined ? payload.value : payload.contents;\n const path = payload.path && payload.path.trim() ? payload.path : \"/\";\n surface.dataModel = setAtPointer(surface.dataModel, path, value);\n };\n\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) {\n continue;\n }\n if (message.createSurface) {\n const surface = surfaceFor(message.createSurface.surfaceId);\n if (typeof message.createSurface.root === \"string\" && message.createSurface.root) {\n surface.root = message.createSurface.root;\n }\n }\n if (message.beginRendering) {\n const surface = surfaceFor(message.beginRendering.surfaceId);\n if (typeof message.beginRendering.root === \"string\" && message.beginRendering.root) {\n surface.root = message.beginRendering.root;\n }\n if (isRecord(message.beginRendering.styles)) {\n surface.styles = { ...surface.styles, ...message.beginRendering.styles };\n }\n }\n applyComponents(message.updateComponents, index);\n applyComponents(message.surfaceUpdate, index);\n applyData(message.updateDataModel);\n applyData(message.dataModelUpdate);\n if (message.deleteSurface) {\n const key = message.deleteSurface.surfaceId ?? A2UI_DEFAULT_SURFACE_ID;\n surfaces.delete(key);\n const at = order.indexOf(key);\n if (at !== -1) {\n order.splice(at, 1);\n }\n }\n const known =\n message.createSurface ??\n message.updateComponents ??\n message.updateDataModel ??\n message.deleteSurface ??\n message.beginRendering ??\n message.surfaceUpdate ??\n message.dataModelUpdate;\n if (!known) {\n errors.push(\n `Message ${index + 1}: no known operation (createSurface, updateComponents, updateDataModel, deleteSurface, beginRendering, surfaceUpdate, dataModelUpdate).`,\n );\n }\n }\n\n const result: A2UISurface[] = [];\n for (const key of order) {\n const surface = surfaces.get(key);\n if (!surface) {\n continue;\n }\n result.push({\n id: surface.id,\n root: surface.root ?? defaultRoot(surface.components),\n components: surface.components,\n dataModel: surface.dataModel,\n styles: surface.styles,\n });\n }\n return { surfaces: result, errors };\n}\n\n/** No explicit root: prefer the conventional `root` id, else the first component. */\nfunction defaultRoot(components: ReadonlyMap<string, A2UIComponentSpec>): string | undefined {\n if (components.has(\"root\")) {\n return \"root\";\n }\n for (const id of components.keys()) {\n return id;\n }\n return undefined;\n}\n\n/** Split a JSON pointer into its unescaped segments. */\nexport function pointerSegments(pointer: string): string[] {\n const trimmed = pointer.trim();\n if (!trimmed || trimmed === \"/\" || trimmed === \".\") {\n return [];\n }\n const body = trimmed.startsWith(\"/\") ? trimmed.slice(1) : trimmed;\n return body\n .split(\"/\")\n .filter((segment) => segment !== \"\")\n .map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n}\n\n/** Resolve a possibly relative pointer against a data context. */\nexport function resolvePointer(path: string, contextPath: string): string {\n if (path.startsWith(\"/\")) {\n return path;\n }\n const relative = path === \".\" || path === \"\" ? \"\" : path.replace(/^\\.?\\//, \"\");\n const base = contextPath === \"/\" || !contextPath ? \"\" : contextPath.replace(/\\/$/, \"\");\n if (!relative) {\n return base || \"/\";\n }\n return `${base}/${relative}`;\n}\n\n/** Read a JSON pointer out of the data model. */\nexport function getAtPointer(model: unknown, pointer: string): unknown {\n let current: unknown = model;\n for (const segment of pointerSegments(pointer)) {\n if (Array.isArray(current)) {\n const index = Number(segment);\n current = Number.isInteger(index) ? current[index] : undefined;\n } else if (isRecord(current)) {\n current = current[segment];\n } else {\n return undefined;\n }\n if (current === undefined) {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Write a JSON pointer into the data model, returning a new model.\n *\n * Immutable because the renderer keeps the model in React state: a mutation in\n * place would not re-render, which is the kind of silent nothing-happens bug\n * that is hard to see in a browser test.\n */\nexport function setAtPointer(\n model: Record<string, unknown>,\n pointer: string,\n value: unknown,\n): Record<string, unknown> {\n const segments = pointerSegments(pointer);\n if (segments.length === 0) {\n return isRecord(value) ? { ...value } : {};\n }\n const clone: Record<string, unknown> = { ...model };\n let cursor: Record<string, unknown> | unknown[] = clone;\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index] ?? \"\";\n const nextSegment = segments[index + 1] ?? \"\";\n const wantsArray = /^\\d+$/.test(nextSegment);\n const existing: unknown = Array.isArray(cursor)\n ? cursor[Number(segment)]\n : (cursor as Record<string, unknown>)[segment];\n let next: Record<string, unknown> | unknown[];\n if (Array.isArray(existing)) {\n next = [...existing];\n } else if (isRecord(existing)) {\n next = { ...existing };\n } else {\n next = wantsArray ? [] : {};\n }\n if (Array.isArray(cursor)) {\n cursor[Number(segment)] = next;\n } else {\n (cursor as Record<string, unknown>)[segment] = next;\n }\n cursor = next;\n }\n const last = segments[segments.length - 1] ?? \"\";\n if (Array.isArray(cursor)) {\n cursor[Number(last)] = value;\n } else {\n (cursor as Record<string, unknown>)[last] = value;\n }\n return clone;\n}\n\n/** Normalise the children of a component spec into a single description. */\nexport type A2UIChildren =\n | { kind: \"list\"; ids: readonly string[] }\n | { kind: \"template\"; componentId: string; path: string }\n | { kind: \"none\" };\n\nexport function readChildren(spec: A2UIComponentSpec, properties: Record<string, unknown>): A2UIChildren {\n const raw = (spec.children ?? properties.children) as A2UIChildList | undefined;\n if (!raw) {\n return { kind: \"none\" };\n }\n if (Array.isArray(raw)) {\n return { kind: \"list\", ids: raw.filter((id): id is string => typeof id === \"string\") };\n }\n if (isRecord(raw)) {\n const record: Record<string, unknown> = raw;\n const explicitList = record.explicitList;\n if (Array.isArray(explicitList)) {\n return {\n kind: \"list\",\n ids: explicitList.filter((id): id is string => typeof id === \"string\"),\n };\n }\n const template = record.template;\n if (isRecord(template)) {\n const { componentId, dataBinding } = template;\n if (typeof componentId === \"string\" && typeof dataBinding === \"string\") {\n return { kind: \"template\", componentId, path: dataBinding };\n }\n }\n if (typeof record.componentId === \"string\" && typeof record.path === \"string\") {\n return { kind: \"template\", componentId: record.componentId, path: record.path };\n }\n }\n return { kind: \"none\" };\n}\n\n/**\n * Split a component spec into its type name and its raw (unresolved) properties,\n * across both dialects. Returns `undefined` when the spec names no type.\n */\nexport function readComponent(\n spec: A2UIComponentSpec,\n): { name: string; properties: Record<string, unknown> } | undefined {\n if (typeof spec.component === \"string\") {\n const { id: _id, component: _component, children: _children, weight: _weight, ...rest } = spec;\n return { name: spec.component, properties: rest };\n }\n if (isRecord(spec.component)) {\n const name = Object.keys(spec.component)[0];\n if (!name) {\n return undefined;\n }\n const properties = (spec.component as Record<string, unknown>)[name];\n return { name, properties: isRecord(properties) ? properties : {} };\n }\n return undefined;\n}\n\n/**\n * Resolve one property value against the data model.\n *\n * `{ path }` reads the model, `{ literal }` / `{ literalString }` unwrap, and\n * everything else is returned as written, recursing through arrays and objects\n * so a binding nested inside a prop object still resolves.\n */\nexport function resolveValue(\n value: unknown,\n model: Record<string, unknown>,\n contextPath: string,\n): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => resolveValue(item, model, contextPath));\n }\n if (isRecord(value)) {\n if (isDataBinding(value)) {\n return getAtPointer(model, resolvePointer(value.path, contextPath));\n }\n if (\"literalString\" in value && typeof value.literalString === \"string\") {\n return value.literalString;\n }\n if (\"literal\" in value && Object.keys(value).length === 1) {\n return value.literal;\n }\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = resolveValue(item, model, contextPath);\n }\n return out;\n }\n return value;\n}\n\n/** A user action leaving the renderer, shaped like A2UI's client-to-server action. */\nexport interface A2UIAction {\n surfaceId: string;\n componentId: string;\n name: string;\n payload: Record<string, unknown>;\n}\n\n/**\n * Normalise an action property into `{ name, context }`.\n *\n * Accepts v0.9's `{ event: { name, context } }`, the bare `{ name, context }`\n * shape, and a plain string, which is what an agent writes most often.\n */\nexport function readAction(\n value: unknown,\n): { name: string; context: Record<string, unknown> } | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return { name: value, context: {} };\n }\n if (!isRecord(value)) {\n return undefined;\n }\n const event = isRecord(value.event) ? value.event : value;\n const name = event.name;\n if (typeof name !== \"string\" || !name) {\n return undefined;\n }\n return { name, context: isRecord(event.context) ? event.context : {} };\n}\n","/**\n * Catalogue documentation generator.\n *\n * Emits a machine-readable description of the catalogue — every component's\n * name, group, summary, property schema, events and a worked example — plus a\n * markdown rendering of the same thing.\n *\n * This exists so the \"Rich Content\" system-prompt section can be *generated*\n * from the catalogue rather than written beside it (DESIGN-34). A prompt that\n * describes a component the renderer does not have, or omits one it does, is\n * the failure `05-agent-ui.md` calls out; the only way to prevent it is for\n * both to come from one object.\n *\n * `pnpm a2ui:catalogue` writes `dist-a2ui/catalogue.json` and `.md`.\n */\n\nimport { z } from \"zod\";\nimport { A2UI_CATALOGUE_ID, defaultCatalogue, type A2UICatalogue, type A2UIGroup } from \"./catalogue\";\nimport { A2UI_VERSION, type A2UIComponentSpec } from \"./message\";\n\n/** A JSON Schema object, as far as this module cares. */\nexport type JsonSchema = Record<string, unknown>;\n\nexport interface A2UIComponentDoc {\n name: string;\n group: A2UIGroup;\n summary: string;\n /** Whether the component takes a `children` list. */\n children: \"none\" | \"many\";\n /** Event names the component raises through `onAction`. */\n events: string[];\n /** JSON Schema of the resolved properties, derived from the zod schema. */\n props: JsonSchema;\n /** Property names that must be present. */\n required: string[];\n /** A complete, renderable example: the components and any data they bind to. */\n example: { components: A2UIComponentSpec[]; data?: Record<string, unknown> };\n}\n\nexport interface A2UICatalogueDoc {\n catalogueId: string;\n protocol: string;\n generator: string;\n components: A2UIComponentDoc[];\n}\n\n/**\n * zod 4 ships `toJSONSchema`; zod 3 does not.\n *\n * The package's zod peer allows both, so this is checked rather than assumed —\n * emitting `{}` for every component would produce a doc that passes every test\n * and teaches an agent nothing, which is the silent-success failure this whole\n * package's lint exists to avoid.\n */\nfunction toJsonSchema(schema: z.ZodType<unknown>): JsonSchema {\n const converter = (z as unknown as { toJSONSchema?: (s: unknown, o?: unknown) => JsonSchema })\n .toJSONSchema;\n if (typeof converter !== \"function\") {\n throw new Error(\n \"Generating the A2UI catalogue doc needs zod 4 (z.toJSONSchema). The installed zod is 3.x.\",\n );\n }\n return converter(schema, { io: \"input\", unrepresentable: \"any\" });\n}\n\n/** Build the machine-readable catalogue document. */\nexport function buildCatalogueDoc(catalogue: A2UICatalogue = defaultCatalogue): A2UICatalogueDoc {\n const components = Object.values(catalogue)\n .map((entry): A2UIComponentDoc => {\n const schema = toJsonSchema(entry.props as unknown as z.ZodType<unknown>);\n const properties = (schema.properties ?? {}) as JsonSchema;\n const required = Array.isArray(schema.required) ? (schema.required as string[]) : [];\n return {\n name: entry.name,\n group: entry.group,\n summary: entry.summary,\n children: entry.children,\n events: [...entry.events],\n props: properties,\n required,\n example: {\n components: entry.example.components,\n ...(entry.example.data ? { data: entry.example.data } : {}),\n },\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n catalogueId: A2UI_CATALOGUE_ID,\n protocol: A2UI_VERSION,\n generator: \"cortena-ui/a2ui\",\n components,\n };\n}\n\nconst GROUP_ORDER: A2UIGroup[] = [\"layout\", \"text\", \"input\", \"feedback\", \"data\"];\n\nconst GROUP_TITLE: Record<A2UIGroup, string> = {\n layout: \"Layout\",\n text: \"Text and media\",\n input: \"Inputs and actions\",\n feedback: \"Feedback\",\n data: \"Data\",\n};\n\n/** One-line type summary for a JSON Schema property, for the markdown table. */\nfunction describeType(schema: unknown): string {\n if (typeof schema !== \"object\" || schema === null) {\n return \"any\";\n }\n const node = schema as JsonSchema;\n if (Array.isArray(node.enum)) {\n return node.enum.map((value) => JSON.stringify(value)).join(\" \\\\| \");\n }\n if (Array.isArray(node.anyOf) || Array.isArray(node.oneOf)) {\n const options = (node.anyOf ?? node.oneOf) as unknown[];\n return options.map((option) => describeType(option)).join(\" \\\\| \");\n }\n if (node.const !== undefined) {\n return JSON.stringify(node.const);\n }\n if (node.type === \"array\") {\n return `${describeType(node.items)}[]`;\n }\n if (typeof node.type === \"string\") {\n return node.type;\n }\n if (Array.isArray(node.type)) {\n return node.type.join(\" \\\\| \");\n }\n return \"any\";\n}\n\nfunction escapeCell(text: string): string {\n return text.replace(/\\|/g, \"\\\\|\").replace(/\\n+/g, \" \").trim();\n}\n\n/**\n * Render the catalogue document as markdown.\n *\n * The output is written to be pasted into a system prompt: one table per\n * component listing every property with its type, whether it is required and\n * what it means, then a fenced example an agent can copy.\n */\nexport function catalogueMarkdown(doc: A2UICatalogueDoc = buildCatalogueDoc()): string {\n const lines: string[] = [];\n lines.push(\"# A2UI catalogue — cortena-ui\");\n lines.push(\"\");\n lines.push(\n `Protocol \\`${doc.protocol}\\`, catalogue \\`${doc.catalogueId}\\`. Generated from the catalogue definition in \\`cortena-ui\\`; do not edit by hand.`,\n );\n lines.push(\"\");\n lines.push(\n \"A surface is described by three message kinds: `createSurface` names it, `updateComponents` sends the component tree, `updateDataModel` sends the data those components bind to. Any property may be a literal or a `{ \\\"path\\\": \\\"/pointer\\\" }` binding into the data model. A component takes children through `children`, either a list of ids or `{ \\\"componentId\\\": \\\"…\\\", \\\"path\\\": \\\"/items\\\" }` to repeat one component per array item.\",\n );\n lines.push(\"\");\n lines.push(`${doc.components.length} components:`);\n lines.push(\"\");\n\n for (const group of GROUP_ORDER) {\n const inGroup = doc.components.filter((component) => component.group === group);\n if (inGroup.length === 0) {\n continue;\n }\n lines.push(`## ${GROUP_TITLE[group]}`);\n lines.push(\"\");\n for (const component of inGroup) {\n lines.push(`### ${component.name}`);\n lines.push(\"\");\n lines.push(component.summary);\n lines.push(\"\");\n lines.push(\n `Children: ${component.children === \"many\" ? \"yes\" : \"no\"}. Events: ${\n component.events.length > 0 ? component.events.map((e) => `\\`${e}\\``).join(\", \") : \"none\"\n }.`,\n );\n lines.push(\"\");\n const propertyNames = Object.keys(component.props);\n if (propertyNames.length > 0) {\n lines.push(\"| Property | Type | Required | Description |\");\n lines.push(\"| --- | --- | --- | --- |\");\n for (const name of propertyNames) {\n const schema = component.props[name] as JsonSchema | undefined;\n const description =\n typeof schema?.description === \"string\" ? schema.description : \"\";\n lines.push(\n `| \\`${name}\\` | ${escapeCell(describeType(schema))} | ${\n component.required.includes(name) ? \"yes\" : \"no\"\n } | ${escapeCell(description)} |`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"```json\");\n lines.push(JSON.stringify(exampleMessages(component), null, 2));\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** Turn an entry's example into the messages an agent would actually send. */\nexport function exampleMessages(component: A2UIComponentDoc): unknown[] {\n const root = component.example.components[0]?.id ?? \"root\";\n const messages: unknown[] = [\n { version: \"v0.9\", createSurface: { surfaceId: \"demo\", root } },\n { version: \"v0.9\", updateComponents: { surfaceId: \"demo\", components: component.example.components } },\n ];\n if (component.example.data) {\n messages.push({\n version: \"v0.9\",\n updateDataModel: { surfaceId: \"demo\", path: \"/\", value: component.example.data },\n });\n }\n return messages;\n}\n","\"use client\";\n\n/**\n * The A2UI React renderer.\n *\n * Takes A2UI messages, folds them onto surfaces, walks the component tree and\n * draws each node through the catalogue. Nothing an agent sends reaches the DOM\n * as markup: a node is a catalogue name plus properties that must pass the\n * entry's zod schema, and anything else becomes an inline error card.\n *\n * ## Why this is written rather than adopted\n *\n * `@a2ui/react` 0.11.0 (Google, Apache-2.0, published 2026-09-01) is a real,\n * maintained v0.9 renderer and it does let a host supply a catalogue. It was\n * evaluated for DESIGN-33 and not adopted, for three reasons:\n *\n * 1. **zod major.** `@a2ui/web_core`'s generic binder reads zod 3 internals —\n * `schema._def.typeName`, `_def.shape()`, `_def.innerType` — to decide how to\n * bind each property. cortena-ui's zod peer is `^3.25 || ^4`, and zod 4 has\n * no `_def.typeName` and exposes `shape` as a property, so a catalogue\n * authored with the consumer's zod 4 fails inside the binder. Adopting would\n * pin the whole package's schema layer to zod 3 while `form.tsx` and\n * `@hookform/resolvers` follow the consumer's.\n * 2. **Dialect.** Cortena already speaks A2UI v0.8: core bundles the Lit\n * renderer at `src/canvas-host/a2ui/` and the `canvas` tool pushes\n * `beginRendering` / `surfaceUpdate` / `dataModelUpdate` as JSONL.\n * `@a2ui/react` splits v0_8 and v0_9 into separate entry points with separate\n * catalogues, so neither one reads both. Every payload written for the\n * native nodes would have to be rewritten before it rendered on the web.\n * 3. **Weight and surface.** It brings `@a2ui/web_core` (3.8 MB unpacked),\n * markdown-it, `@preact/signals-core` and date-fns into a package whose build\n * externalises everything and whose markdown already goes through\n * react-markdown with a sanitize schema. And the API this task needs —\n * `resolveDataSource` for server tables, `onAction` for the AG-UI round trip —\n * has no counterpart there, so it would be wrapped either way.\n *\n * What we keep is the part that matters for interop: the **wire format** is\n * A2UI's, the action we emit is shaped like A2UI's client-to-server `action`\n * (`{ name, surfaceId, sourceComponentId, context }`), and the catalogue is a\n * schema-per-component registry. Swapping the engine later is mechanical.\n */\n\nimport * as React from \"react\";\nimport type { DataSource } from \"@/components/data-table\";\nimport { cn } from \"@/lib/cn\";\nimport {\n A2UI_DEFAULT_SURFACE_ID,\n foldMessages,\n isDataBinding,\n readAction,\n readChildren,\n readComponent,\n resolvePointer,\n resolveValue,\n setAtPointer,\n type A2UIAction,\n type A2UIComponentSpec,\n type A2UIMessageInput,\n type A2UISurface,\n} from \"./message\";\nimport { defaultCatalogue, type A2UICatalogue } from \"./catalogue\";\nimport { A2UIErrorCard, type A2UINodeInfo, type A2UIResolvedAction, type A2UIRow } from \"./views\";\n\nexport interface A2UIRendererProps {\n /**\n * The payload. One message, the list an AG-UI `CUSTOM` event carries, or the\n * JSONL text `canvas.a2ui.pushJSONL` sends. Later messages fold onto earlier\n * ones, so a push stream can be accumulated by the host and handed here whole.\n */\n message: A2UIMessageInput;\n /** The component vocabulary. Defaults to the whole cortena-ui catalogue. */\n catalogue?: A2UICatalogue;\n /** Receives every user event, shaped like A2UI's client-to-server action. */\n onAction?: (action: A2UIAction) => void;\n /**\n * Resolves a `{ kind: \"server\", sourceId }` table handle into a real data\n * source. Without it, a server table renders an error card rather than an\n * empty one, because a silently empty table reads as \"no results\".\n */\n resolveDataSource?: (sourceId: string) => DataSource<A2UIRow> | undefined;\n /** Render only this surface. Default: every surface, in arrival order. */\n surfaceId?: string;\n /** Debounce before a continuous input becomes an action. @default 300 */\n debounceMs?: number;\n className?: string;\n}\n\n/** Depth limit; a tree deeper than this is a malformed payload, not a design. */\nconst MAX_DEPTH = 32;\n\ninterface NodeContext {\n surface: A2UISurface;\n catalogue: A2UICatalogue;\n model: Record<string, unknown>;\n setModel: (updater: (model: Record<string, unknown>) => Record<string, unknown>) => void;\n onAction: ((action: A2UIAction) => void) | undefined;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n}\n\n/**\n * A2UIRenderer — draws A2UI messages through cortena-ui.\n *\n * ```tsx\n * <A2UIRenderer\n * message={customEvent.value}\n * catalogue={defaultCatalogue}\n * onAction={(action) => agent.send(action)}\n * resolveDataSource={(id) => sources[id]}\n * />\n * ```\n */\nexport function A2UIRenderer({\n message,\n catalogue = defaultCatalogue,\n onAction,\n resolveDataSource,\n surfaceId,\n debounceMs = 300,\n className,\n}: A2UIRendererProps) {\n const fold = React.useMemo(() => foldMessages(message), [message]);\n\n // Local data model per surface, seeded from the folded one. Inputs write here\n // so a bound value updates as the user types; a new payload replaces it,\n // because the agent is then the authority on what the surface shows.\n const [models, setModels] = React.useState<Record<string, Record<string, unknown>>>(() =>\n seedModels(fold.surfaces),\n );\n const seenFold = React.useRef(fold);\n if (seenFold.current !== fold) {\n seenFold.current = fold;\n setModels(seedModels(fold.surfaces));\n }\n\n const resolve = React.useCallback(\n (sourceId: string) => resolveDataSource?.(sourceId),\n [resolveDataSource],\n );\n\n const surfaces = surfaceId\n ? fold.surfaces.filter((surface) => surface.id === surfaceId)\n : fold.surfaces;\n\n const missingSurface = Boolean(surfaceId) && surfaces.length === 0 && fold.surfaces.length > 0;\n\n return (\n <div data-slot=\"a2ui-renderer\" className={cn(\"flex min-w-0 flex-col gap-3\", className)}>\n {fold.errors.length > 0 ? (\n <A2UIErrorCard\n title=\"Malformed A2UI payload\"\n detail={fold.errors.slice(0, 5).join(\" \")}\n />\n ) : null}\n {missingSurface ? (\n <A2UIErrorCard\n title=\"Unknown surface\"\n detail={`No surface \"${surfaceId}\" in this payload.`}\n />\n ) : null}\n {surfaces.map((surface) => (\n <A2UISurfaceView\n key={surface.id}\n surface={surface}\n catalogue={catalogue}\n model={models[surface.id] ?? surface.dataModel}\n setModel={(updater) =>\n setModels((current) => ({\n ...current,\n [surface.id]: updater(current[surface.id] ?? surface.dataModel),\n }))\n }\n onAction={onAction}\n resolveDataSource={resolve}\n debounceMs={debounceMs}\n />\n ))}\n </div>\n );\n}\n\nfunction seedModels(surfaces: readonly A2UISurface[]): Record<string, Record<string, unknown>> {\n const models: Record<string, Record<string, unknown>> = {};\n for (const surface of surfaces) {\n models[surface.id] = surface.dataModel;\n }\n return models;\n}\n\nfunction A2UISurfaceView({\n surface,\n catalogue,\n model,\n setModel,\n onAction,\n resolveDataSource,\n debounceMs,\n}: {\n surface: A2UISurface;\n catalogue: A2UICatalogue;\n model: Record<string, unknown>;\n setModel: (updater: (model: Record<string, unknown>) => Record<string, unknown>) => void;\n onAction: ((action: A2UIAction) => void) | undefined;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n}) {\n const context: NodeContext = {\n surface,\n catalogue,\n model,\n setModel,\n onAction,\n resolveDataSource,\n debounceMs,\n };\n\n if (!surface.root) {\n return (\n <div data-slot=\"a2ui-surface\" data-surface-id={surface.id}>\n <A2UIErrorCard\n title=\"Empty A2UI surface\"\n detail={`Surface \"${surface.id}\" has no root component. Send updateComponents with a component whose id is \"root\", or name one in createSurface.`}\n />\n </div>\n );\n }\n\n return (\n <div data-slot=\"a2ui-surface\" data-surface-id={surface.id} className=\"flex min-w-0 flex-col\">\n <A2UINode context={context} id={surface.root} contextPath=\"/\" ancestors={[]} depth={0} />\n </div>\n );\n}\n\nfunction A2UINode({\n context,\n id,\n contextPath,\n ancestors,\n depth,\n}: {\n context: NodeContext;\n id: string;\n contextPath: string;\n ancestors: readonly string[];\n depth: number;\n}) {\n const spec = context.surface.components.get(id);\n\n if (!spec) {\n return <A2UIErrorCard title=\"Unknown component id\" detail={`No component \"${id}\" in this surface.`} />;\n }\n if (ancestors.includes(id)) {\n return (\n <A2UIErrorCard\n title=\"Circular component reference\"\n detail={`\"${id}\" is already an ancestor of itself: ${[...ancestors, id].join(\" → \")}.`}\n componentId={id}\n />\n );\n }\n if (depth > MAX_DEPTH) {\n return (\n <A2UIErrorCard\n title=\"Component tree too deep\"\n detail={`More than ${MAX_DEPTH} levels below the root.`}\n componentId={id}\n />\n );\n }\n\n const declaration = readComponent(spec);\n if (!declaration) {\n return (\n <A2UIErrorCard\n title=\"Component has no type\"\n detail=\"Expected `component` to be a catalogue name, or an object keyed by one.\"\n componentId={id}\n />\n );\n }\n\n const entry = context.catalogue[declaration.name];\n if (!entry) {\n return (\n <A2UIErrorCard\n title={`Unknown component \"${declaration.name}\"`}\n detail={`The catalogue has: ${Object.keys(context.catalogue).sort().join(\", \")}.`}\n componentId={id}\n />\n );\n }\n\n // Resolve bindings first, then normalise actions, then validate. A view\n // therefore only ever sees values that passed the entry's schema.\n const raw = declaration.properties;\n const bindings: Record<string, string> = {};\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (key === \"children\") {\n continue;\n }\n if (isDataBinding(value)) {\n bindings[key] = resolvePointer(value.path, contextPath);\n }\n const next = resolveValue(value, context.model, contextPath);\n resolved[key] = key.startsWith(\"on\") ? readAction(next) : next;\n }\n\n const parsed = entry.props.safeParse(resolved);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .slice(0, 4)\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n return (\n <A2UIErrorCard\n title={`Invalid props for ${declaration.name}`}\n detail={issues}\n componentId={id}\n />\n );\n }\n\n const node: A2UINodeInfo = {\n surfaceId: context.surface.id,\n componentId: id,\n dataContextPath: contextPath,\n };\n\n const children =\n entry.children === \"many\"\n ? renderChildren(context, spec, raw, contextPath, [...ancestors, id], depth)\n : [];\n\n const emit = (\n action: A2UIResolvedAction | undefined,\n fallbackName: string,\n payload?: Record<string, unknown>,\n ) => {\n context.onAction?.({\n surfaceId: context.surface.id,\n componentId: id,\n name: action?.name ?? fallbackName,\n payload: { ...(action?.context ?? {}), ...(payload ?? {}) },\n });\n };\n\n const writeBack = (property: string, value: unknown) => {\n const pointer = bindings[property];\n if (!pointer) {\n return;\n }\n context.setModel((model) => setAtPointer(model, pointer, value));\n };\n\n const View = entry.view as React.FC<{\n props: unknown;\n node: A2UINodeInfo;\n children: React.ReactNode[];\n dataModel: Record<string, unknown>;\n emit: typeof emit;\n writeBack: typeof writeBack;\n resolveDataSource: (sourceId: string) => DataSource<A2UIRow> | undefined;\n debounceMs: number;\n }>;\n\n return (\n <View\n props={parsed.data}\n node={node}\n dataModel={context.model}\n emit={emit}\n writeBack={writeBack}\n resolveDataSource={context.resolveDataSource}\n debounceMs={context.debounceMs}\n >\n {children}\n </View>\n );\n}\n\n/**\n * Render a component's children.\n *\n * An explicit list renders each id once. A template renders the referenced\n * component once per item in a bound array, each with its own data context, so\n * an agent describes a row of a table or a list item once instead of repeating\n * it per item.\n */\nfunction renderChildren(\n context: NodeContext,\n spec: A2UIComponentSpec,\n properties: Record<string, unknown>,\n contextPath: string,\n ancestors: readonly string[],\n depth: number,\n): React.ReactNode[] {\n const children = readChildren(spec, properties);\n if (children.kind === \"none\") {\n return [];\n }\n if (children.kind === \"list\") {\n return children.ids.map((childId) => (\n <A2UINode\n key={childId}\n context={context}\n id={childId}\n contextPath={contextPath}\n ancestors={ancestors}\n depth={depth + 1}\n />\n ));\n }\n const pointer = resolvePointer(children.path, contextPath);\n const items = resolveValue({ path: children.path }, context.model, contextPath);\n if (!Array.isArray(items)) {\n return [\n <A2UIErrorCard\n key=\"template-error\"\n title=\"Template list is not an array\"\n detail={`\"${pointer}\" does not resolve to an array in the data model.`}\n />,\n ];\n }\n return items.map((_item, index) => (\n <A2UINode\n key={`${children.componentId}:${index}`}\n context={context}\n id={children.componentId}\n contextPath={`${pointer === \"/\" ? \"\" : pointer}/${index}`}\n ancestors={ancestors}\n depth={depth + 1}\n />\n ));\n}\n\nexport { A2UI_DEFAULT_SURFACE_ID };\n","\"use client\";\n\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Accordion.\n *\n * Base UI's Accordion is a list of Collapsibles: `Root > Item > Header > Trigger`\n * plus `Panel`. The panel animates on height through Base UI's\n * `--accordion-panel-height`, and marks its first/last frame with\n * `data-starting-style` / `data-ending-style`, which is where it collapses to 0.\n *\n * Radix users: `type=\"single\" | \"multiple\"` is now the boolean `multiple`, and\n * `value` is always an array. `collapsible` is the default. `data-state=\"open\"`\n * is `data-open` on the item and panel, `data-panel-open` on the trigger.\n */\nfunction Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b border-[var(--ds-border)] last:border-b-0\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props) {\n return (\n <AccordionPrimitive.Header data-slot=\"accordion-header\" className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-start justify-between gap-4 py-4 text-left\",\n \"text-[length:var(--ds-text-body-sm)] font-medium text-[color:var(--ds-foreground)]\",\n \"rounded-[var(--ds-radius-sm)] outline-none\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:underline focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&[data-panel-open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n aria-hidden\n className={cn(\n \"pointer-events-none size-4 shrink-0 translate-y-0.5 text-[color:var(--ds-muted-foreground)]\",\n \"transition-transform duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n )}\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({ className, children, ...props }: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n className={cn(\n \"h-[var(--accordion-panel-height,auto)] overflow-hidden\",\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]\",\n \"transition-[height] duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[starting-style]:h-0 data-[ending-style]:h-0\",\n )}\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Panel>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","\"use client\";\n\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Avatar.\n *\n * Base UI preloads the image and only mounts `<img>` once it has loaded, so\n * the fallback is what paints while loading and after an error. Initials sit\n * on the primary fill in inverse text.\n *\n * Radix users: `delayMs` on the fallback is now `delay`.\n */\nfunction Avatar({ className, ...props }: AvatarPrimitive.Root.Props) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-[var(--ds-radius-full)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full object-cover\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full select-none items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-primary)] text-[color:var(--ds-primary-foreground)]\",\n \"text-[length:var(--ds-text-caption-lg)] font-semibold tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","\"use client\";\n\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { renderWith, type RenderProp } from \"@/lib/render\";\n\n/**\n * Breadcrumb — the trail above a page title.\n *\n * A `<nav aria-label=\"Breadcrumb\">` around an ordered list, which is what\n * assistive technology expects: the list order is the hierarchy, so a screen\n * reader announces \"list, 4 items\" and reads the path in order. Separators are\n * decorative list items, not text inside the links, so a link's accessible\n * name is the crumb and nothing else.\n *\n * The last crumb is `BreadcrumbPage`, not a link: it is the page you are on,\n * so it carries `aria-current=\"page\"` and is not focusable. Everything before\n * it is a `BreadcrumbLink`.\n *\n * ```tsx\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">Home</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbEllipsis />\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Invoice 4021</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n * ```\n *\n * **Router links.** `BreadcrumbLink` renders an `<a>` by default. Pass\n * `render` with the router's link component and the class name, `href` and\n * handlers are merged onto it, the same contract as `ButtonLink`:\n * `render={<NextLink href=\"/projects\" />}` or\n * `render={<Link to=\"/projects\" />}`. This is deliberately not Base UI's\n * `render` — a breadcrumb is markup, not a Base UI primitive — but it takes\n * the same shape so there is one thing to remember.\n */\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n data-slot=\"breadcrumb\"\n aria-label=\"Breadcrumb\"\n className={cn(\"min-w-0\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words p-0 sm:gap-2\",\n \"list-none text-[length:var(--ds-text-caption-lg)]\",\n \"leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nexport interface BreadcrumbLinkProps extends React.ComponentProps<\"a\"> {\n /** Replace the rendered `<a>` with a router link; props are merged onto it. */\n render?: RenderProp;\n}\n\nfunction BreadcrumbLink({ className, render, children, ...props }: BreadcrumbLinkProps) {\n const merged = {\n ...props,\n \"data-slot\": \"breadcrumb-link\",\n className: cn(\n \"truncate rounded-[var(--ds-radius-sm)] text-[color:var(--ds-muted-foreground)] no-underline\",\n \"transition-colors duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:text-[color:var(--ds-foreground)] hover:underline underline-offset-4\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"[&_svg]:size-3.5 [&_svg]:shrink-0\",\n className,\n ),\n };\n return renderWith(render, merged, children, \"a\");\n}\n\n/**\n * The current page: the last crumb, which is not a link.\n *\n * A plain `<span aria-current=\"page\">`, deliberately not `role=\"link\"` with\n * `aria-disabled` — a disabled link that cannot be focused is a fiction, and\n * it makes `getByRole(\"link\")` return a crumb that navigates nowhere. With a\n * span, the roles in the trail are exactly the crumbs you can travel to.\n */\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n aria-current=\"page\"\n className={cn(\"truncate font-medium text-[color:var(--ds-foreground)]\", className)}\n {...props}\n />\n );\n}\n\n/** Decorative divider between two crumbs; a chevron unless children replace it. */\nfunction BreadcrumbSeparator({ className, children, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex shrink-0 items-center text-[color:var(--ds-text-tertiary)] [&_svg]:size-3.5\",\n className,\n )}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\n/**\n * Stands in for the crumbs a long trail collapses; put it inside a\n * BreadcrumbItem. The glyph is hidden and the label is not: an ellipsis that\n * announces nothing leaves a screen-reader user with a gap in the path.\n */\nfunction BreadcrumbEllipsis({ className, children, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n className={cn(\n \"inline-flex size-5 items-center justify-center text-[color:var(--ds-text-tertiary)]\",\n \"[&_svg]:size-3.5\",\n className,\n )}\n {...props}\n >\n <MoreHorizontal aria-hidden />\n <span className=\"sr-only\">{children ?? \"More levels\"}</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Chip — a pill for filters, tags and selected values. Unlike Badge it keeps\n * sentence case and the body font.\n */\nconst chipVariants = cva(\n [\n \"inline-flex items-center gap-1.5 whitespace-nowrap border font-medium\",\n \"rounded-[var(--ds-radius-full)]\",\n \"transition-[background-color,border-color,color]\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"[&_svg]:shrink-0\",\n ],\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--ds-hover)] border-[var(--ds-border-subtle)] text-[color:var(--ds-muted-foreground)]\",\n accent: \"bg-[var(--ds-primary-soft)] border-[var(--ds-ring)] text-[color:var(--ds-primary)]\",\n outline:\n \"bg-transparent border-[var(--ds-border)] text-[color:var(--ds-muted-foreground)]\",\n },\n size: {\n default: \"px-2.5 py-1 text-[length:var(--ds-text-caption)] [&_svg]:size-3.5\",\n sm: \"px-2 py-0.5 text-[length:var(--ds-text-caption-sm)] [&_svg]:size-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ChipProps\n extends React.ComponentProps<\"span\">, VariantProps<typeof chipVariants> {}\n\nfunction Chip({ className, variant, size, ...props }: ChipProps) {\n return (\n <span data-slot=\"chip\" className={cn(chipVariants({ variant, size }), className)} {...props} />\n );\n}\n\nexport { Chip, chipVariants };\n","\"use client\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react/combobox\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { inputClassName } from \"@/components/input\";\n\n/**\n * Combobox: a filterable text input with a listbox popup, on Base UI.\n *\n * Give the Root `items` (an array, or `[{ value, label }]`) and render the\n * list with `<ComboboxList>{(item) => <ComboboxItem value={item} />}</ComboboxList>`;\n * Base UI filters `items` against the input as the user types. Without\n * `items` nothing is filtered and `ComboboxEmpty` never shows.\n *\n * - `ComboboxInput` is our `Input` with a trailing open/close trigger and,\n * with `clearable`, an X button that clears the value.\n * - `ComboboxContent` composes Portal + Positioner + Popup + List so\n * consumers write one element; positioning props go to the Positioner.\n * - Multiple selection: set `multiple` on the Root and wrap `ComboboxValue`\n * (rendering a `ComboboxChip` per value) plus `ComboboxInput` in\n * `ComboboxChips`. Inside `ComboboxChips` the input drops its own frame;\n * the chips container carries the field look and anchors the popup.\n * - `useComboboxFilter` is Base UI's `useFilter` for external filtering via\n * `filteredItems`.\n *\n * `onValueChange` receives `(value, eventDetails)`; `onInputValueChange`\n * reports the typed text.\n */\nfunction Combobox<Value, Multiple extends boolean | undefined = false, Item = Value>(\n props: ComboboxPrimitive.Root.Props<Value, Multiple, Item>,\n) {\n return <ComboboxPrimitive.Root {...props} />;\n}\n\nconst InsideChipsContext = createContext(false);\n\nconst controlButtonClassName = cn(\n \"flex size-6 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] outline-none\",\n \"transition-[background-color,color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n);\n\nfunction ComboboxTrigger({ className, children, ...props }: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n aria-label=\"Open\"\n className={cn(controlButtonClassName, className)}\n {...props}\n >\n {children ?? (\n <ComboboxPrimitive.Icon\n data-slot=\"combobox-icon\"\n className=\"flex transition-transform duration-[var(--ds-duration-fast)] data-[popup-open]:rotate-180\"\n >\n <ChevronDown />\n </ComboboxPrimitive.Icon>\n )}\n </ComboboxPrimitive.Trigger>\n );\n}\n\nfunction ComboboxClear({ className, children, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n aria-label=\"Clear\"\n className={cn(controlButtonClassName, className)}\n {...props}\n >\n {children ?? <X />}\n </ComboboxPrimitive.Clear>\n );\n}\n\nexport interface ComboboxInputProps extends ComboboxPrimitive.Input.Props {\n /** Show an X button that clears the selection while there is one. */\n clearable?: boolean;\n /** Class for the wrapper that holds the input and its buttons. */\n wrapperClassName?: string;\n}\n\nfunction ComboboxInput({ className, clearable = false, wrapperClassName, ...props }: ComboboxInputProps) {\n const insideChips = useContext(InsideChipsContext);\n if (insideChips) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-input\"\n className={cn(\n \"h-7 min-w-16 flex-1 bg-transparent outline-none\",\n \"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"disabled:cursor-not-allowed\",\n className,\n )}\n {...props}\n />\n );\n }\n return (\n <ComboboxPrimitive.InputGroup\n data-slot=\"combobox-input-group\"\n className={cn(\"relative flex w-full items-center\", wrapperClassName)}\n >\n <ComboboxPrimitive.Input\n data-slot=\"combobox-input\"\n className={cn(inputClassName, clearable ? \"pr-16\" : \"pr-9\", className)}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1.5 flex items-center gap-0.5\">\n {clearable ? <ComboboxClear /> : null}\n <ComboboxTrigger />\n </div>\n </ComboboxPrimitive.InputGroup>\n );\n}\n\nfunction ComboboxValue(props: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value {...props} />;\n}\n\nexport interface ComboboxChipsProps extends ComboboxPrimitive.Chips.Props {\n /** Class for the inner chip row; `className` styles the field frame. */\n chipsClassName?: string;\n}\n\nfunction ComboboxChips({ className, chipsClassName, children, ...props }: ComboboxChipsProps) {\n return (\n <InsideChipsContext.Provider value>\n <ComboboxPrimitive.InputGroup\n data-slot=\"combobox-input-group\"\n className={cn(\n \"relative flex w-full min-w-0 items-start gap-1 rounded-[var(--ds-radius-md)] border border-[var(--ds-border)] bg-[var(--ds-muted)] py-1 pl-1.5 pr-1.5\",\n \"transition-[border-color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)]\",\n \"focus-within:border-[var(--ds-ring)] focus-within:ring-[3px] focus-within:ring-[var(--ds-ring)]/40\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n \"data-[invalid]:border-[var(--ds-destructive)] data-[invalid]:ring-[3px] data-[invalid]:ring-[var(--ds-destructive)]/20\",\n className,\n )}\n >\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\"flex min-h-7 min-w-0 flex-1 flex-wrap items-center gap-1 px-1\", chipsClassName)}\n {...props}\n >\n {children}\n </ComboboxPrimitive.Chips>\n <ComboboxTrigger className=\"mt-0.5\" />\n </ComboboxPrimitive.InputGroup>\n </InsideChipsContext.Provider>\n );\n}\n\nexport interface ComboboxChipProps extends ComboboxPrimitive.Chip.Props {\n /** Hide the remove button. */\n removable?: boolean;\n}\n\nfunction ComboboxChip({ className, children, removable = true, ...props }: ComboboxChipProps) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"inline-flex h-6 max-w-full cursor-default items-center gap-1 whitespace-nowrap border pl-2.5 outline-none\",\n removable ? \"pr-1\" : \"pr-2.5\",\n \"rounded-[var(--ds-radius-full)] border-[var(--ds-border-subtle)] bg-[var(--ds-hover)]\",\n \"text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:bg-[var(--ds-primary-soft)] focus-visible:text-[color:var(--ds-primary)]\",\n \"data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"truncate\">{children}</span>\n {removable ? (\n <ComboboxPrimitive.ChipRemove\n data-slot=\"combobox-chip-remove\"\n aria-label=\"Remove\"\n className={cn(\n \"flex size-4 shrink-0 items-center justify-center rounded-[var(--ds-radius-full)] outline-none\",\n \"transition-[background-color,color] duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-border)] hover:text-[color:var(--ds-foreground)]\",\n \"[&_svg]:size-3\",\n )}\n >\n <X />\n </ComboboxPrimitive.ChipRemove>\n ) : null}\n </ComboboxPrimitive.Chip>\n );\n}\n\ntype PositionerProps = Pick<\n ComboboxPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface ComboboxContentProps\n extends Omit<ComboboxPrimitive.Popup.Props, \"children\">,\n PositionerProps {\n /** Items, or a render function called per filtered item (needs `items` on the Root). */\n children?: ComboboxPrimitive.List.Props[\"children\"];\n /**\n * Shown (via `ComboboxEmpty`, above the list) when nothing matches the query.\n * Needs `items` on the Root.\n */\n empty?: ReactNode;\n /** Class for the inner List element. */\n listClassName?: string;\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: ComboboxPrimitive.Portal.Props[\"container\"];\n}\n\nfunction ComboboxContent({\n className,\n children,\n empty,\n listClassName,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: ComboboxContentProps) {\n return (\n <ComboboxPrimitive.Portal keepMounted={keepMounted} container={container}>\n <ComboboxPrimitive.Positioner\n data-slot=\"combobox-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50 outline-none\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n className={cn(\n \"flex max-h-[min(var(--available-height,none),24rem)] w-[var(--anchor-width,auto)] min-w-[var(--anchor-width,auto)] flex-col overflow-hidden\",\n \"rounded-[var(--ds-radius-lg)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"outline-none\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {empty !== undefined ? <ComboboxEmpty>{empty}</ComboboxEmpty> : null}\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\"flex flex-col overflow-y-auto overflow-x-hidden p-1 outline-none\", listClassName)}\n >\n {children}\n </ComboboxPrimitive.List>\n </ComboboxPrimitive.Popup>\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n );\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 py-1.5 pr-8 pl-2\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)] outline-none\",\n \"data-[highlighted]:bg-[var(--ds-hover)] data-[highlighted]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span data-slot=\"combobox-item-text\" className=\"flex-1 truncate\">\n {children}\n </span>\n <ComboboxPrimitive.ItemIndicator\n data-slot=\"combobox-item-indicator\"\n className=\"absolute right-2 flex size-4 items-center justify-center text-[color:var(--ds-primary)]\"\n >\n <Check className=\"size-4\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n );\n}\n\n/** Renders per filtered item; use inside a `ComboboxGroup` given `items`, or for a flat list pass a function as `ComboboxContent` children instead. */\nfunction ComboboxCollection(props: ComboboxPrimitive.Collection.Props) {\n return <ComboboxPrimitive.Collection {...props} />;\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)] empty:m-0 empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxStatus({ className, ...props }: ComboboxPrimitive.Status.Props) {\n return (\n <ComboboxPrimitive.Status\n data-slot=\"combobox-status\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)] empty:m-0 empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(\"flex flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxGroupLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-group-label\"\n className={cn(\n \"px-2 py-1.5 text-[length:var(--ds-text-caption)] font-medium text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nconst useComboboxFilter = ComboboxPrimitive.useFilter;\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxTrigger,\n ComboboxClear,\n ComboboxValue,\n ComboboxContent,\n ComboboxItem,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxStatus,\n ComboboxGroup,\n ComboboxGroupLabel,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n useComboboxFilter,\n};\n","\"use client\";\n\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Dialog.\n *\n * `DialogContent` composes Base UI's Portal + Backdrop + Popup so consumers\n * keep writing `<DialogContent>…</DialogContent>`. The Radix `Overlay` part is\n * exported as `DialogOverlay` (a styled Backdrop) for anyone composing by hand.\n *\n * Radix users: `asChild` becomes `render={...}`; `onOpenChange` receives\n * `(open, eventDetails)` rather than just `open`; the popup is only\n * dismissable via pointer when `modal` is true (the default), and\n * `disablePointerDismissal` replaces `onPointerDownOutside` preventDefault.\n */\nfunction Dialog(props: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root {...props} />;\n}\n\nfunction DialogTrigger(props: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal(props: DialogPrimitive.Portal.Props) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose(props: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({ className, ...props }: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 backdrop-blur-[2px]\",\n \"bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]\",\n \"open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface DialogContentProps extends DialogPrimitive.Popup.Props {\n /** Keep the dialog mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the dialog; defaults to `<body>`. */\n container?: DialogPrimitive.Portal.Props[\"container\"];\n}\n\nfunction DialogContent({ className, children, keepMounted, container, ...props }: DialogContentProps) {\n return (\n <DialogPortal keepMounted={keepMounted} container={container}>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed left-1/2 top-1/2 z-50 grid w-full max-w-[440px] -translate-x-1/2 -translate-y-1/2 overflow-hidden outline-none\",\n \"rounded-[var(--ds-radius-xl)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Popup>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-1.5 px-5 pb-1 pt-5 text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogBody({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"dialog-body\" className={cn(\"px-5 pb-5 pt-1\", className)} {...props} />;\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 border-t border-[var(--ds-border-subtle)] bg-[var(--ds-card)] px-5 py-3.5 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold leading-none tracking-[-0.01em] text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({ className, ...props }: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogBody,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","\"use client\";\n\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport {\n Dialog,\n DialogContent,\n type DialogContentProps,\n DialogDescription,\n DialogTitle,\n} from \"@/components/dialog\";\n\n/**\n * Command palette on cmdk, styled like DropdownMenu.\n *\n * cmdk filters and ranks items itself from each item's text (or `value` /\n * `keywords`); `CommandEmpty` renders when nothing matches. The selected\n * (keyboard-highlighted) item carries `data-selected=\"true\"`; `onSelect` on\n * `CommandItem` fires on click and on Enter.\n *\n * `CommandDialog` puts a palette inside our Dialog with no header padding;\n * it needs a `title` (visually hidden) so the dialog is labelled. Wire\n * `open` / `onOpenChange` to a global shortcut (⌘K) for the usual pattern.\n */\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden outline-none\",\n \"rounded-[var(--ds-radius-lg)] bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface CommandDialogProps extends React.ComponentProps<typeof Dialog> {\n /** Accessible name for the dialog; visually hidden. */\n title?: string;\n /** Accessible description for the dialog; visually hidden. */\n description?: string;\n /** Class for the dialog popup. */\n className?: string;\n /** Class for the inner Command root. */\n commandClassName?: string;\n /** Where to portal the dialog; defaults to `<body>`. */\n container?: DialogContentProps[\"container\"];\n /** Keep the dialog mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Props for the inner cmdk root (`filter`, `shouldFilter`, `loop`, `value`, ...). */\n commandProps?: Omit<React.ComponentProps<typeof CommandPrimitive>, \"children\" | \"className\">;\n children?: React.ReactNode;\n}\n\nfunction CommandDialog({\n title = \"Command palette\",\n description = \"Search for a command to run\",\n className,\n commandClassName,\n container,\n keepMounted,\n commandProps,\n children,\n ...props\n}: CommandDialogProps) {\n return (\n <Dialog {...props}>\n <DialogContent\n data-slot=\"command-dialog\"\n container={container}\n keepMounted={keepMounted}\n className={cn(\"max-w-xl overflow-hidden p-0\", className)}\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n <Command\n className={cn(\n \"rounded-none\",\n \"[&_[data-slot=command-input-wrapper]]:h-12 [&_[data-slot=command-input-wrapper]_svg]:size-5\",\n \"[&_[data-slot=command-input]]:h-12 [&_[data-slot=command-input]]:text-[length:var(--ds-text-body-sm)]\",\n \"[&_[data-slot=command-list]]:max-h-80\",\n \"[&_[data-slot=command-item]]:py-2 [&_[data-slot=command-item]_svg]:size-5\",\n commandClassName,\n )}\n {...commandProps}\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-10 items-center gap-2 border-b border-[var(--ds-border)] px-3\"\n >\n <Search className=\"size-4 shrink-0 text-[color:var(--ds-muted-foreground)]\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full min-w-0 bg-transparent py-2 outline-none\",\n \"text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\",\n \"placeholder:text-[color:var(--ds-text-tertiary)]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-72 scroll-py-1 overflow-y-auto overflow-x-hidden p-1 outline-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\n \"py-6 text-center text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden text-[color:var(--ds-foreground)]\",\n \"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5\",\n \"[&_[cmdk-group-heading]]:text-[length:var(--ds-text-caption)] [&_[cmdk-group-heading]]:font-medium\",\n \"[&_[cmdk-group-heading]]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-[var(--ds-border-subtle)]\", className)}\n {...props}\n />\n );\n}\n\nexport interface CommandItemProps extends React.ComponentProps<typeof CommandPrimitive.Item> {\n variant?: \"default\" | \"destructive\";\n}\n\nfunction CommandItem({ className, variant = \"default\", ...props }: CommandItemProps) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 outline-none\",\n \"rounded-[var(--ds-radius-sm)] text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-foreground)]\",\n \"transition-colors duration-[var(--ds-duration-fast)]\",\n \"data-[selected=true]:bg-[var(--ds-hover)] data-[selected=true]:text-[color:var(--ds-foreground)]\",\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n variant === \"destructive\" &&\n \"text-[color:var(--ds-destructive)] data-[selected=true]:bg-[var(--ds-destructive-soft)] data-[selected=true]:text-[color:var(--ds-destructive)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-[length:var(--ds-text-caption)] tracking-widest text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandLoading(props: React.ComponentProps<typeof CommandPrimitive.Loading>) {\n return <CommandPrimitive.Loading data-slot=\"command-loading\" {...props} />;\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n CommandLoading,\n};\n","\"use client\";\n\nimport { CalendarIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport { Button } from \"@/components/button\";\nimport { Calendar, type CalendarProps } from \"@/components/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/popover\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * DatePicker.\n *\n * Our outline Button as the trigger, showing the formatted value or a muted\n * placeholder, opening a Popover that holds a single-select Calendar. Picking\n * a day commits the value and closes the popup. Controlled through `value` /\n * `onValueChange`, uncontrolled through `defaultValue`.\n *\n * `DateRangePicker` is the same shape over `mode=\"range\"`. Its popup stays\n * open while both ends are chosen (react-day-picker's first click sets\n * `from === to`, the second widens it), so the user dismisses it.\n */\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/** en-GB order, no library: `15 January 2026`. */\nfunction formatDateDefault(date: Date): string {\n return `${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()}`;\n}\n\nfunction useControllable<T>(\n controlled: boolean,\n value: T | undefined,\n defaultValue: T | undefined,\n onChange: ((next: T) => void) | undefined,\n): [T | undefined, (next: T) => void] {\n const [inner, setInner] = React.useState<T | undefined>(defaultValue);\n const current = controlled ? value : inner;\n const set = React.useCallback(\n (next: T) => {\n if (!controlled) setInner(next);\n onChange?.(next);\n },\n [controlled, onChange],\n );\n return [current, set];\n}\n\ntype CalendarPassthrough = Omit<\n CalendarProps,\n \"mode\" | \"selected\" | \"onSelect\" | \"required\" | \"disabled\"\n>;\n\ninterface PickerTriggerProps {\n slot: string;\n placeholder: string;\n label: string | undefined;\n disabled?: boolean | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n}\n\nfunction PickerTrigger({ slot, placeholder, label, className, ...props }: PickerTriggerProps) {\n return (\n <PopoverTrigger\n data-slot={slot}\n data-empty={label ? undefined : true}\n render={<Button variant=\"outline\" />}\n className={cn(\n \"w-60 justify-start font-normal\",\n \"data-[empty]:text-[color:var(--ds-muted-foreground)]\",\n \"[&_svg]:text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n >\n <CalendarIcon />\n <span data-slot={`${slot}-value`} className=\"truncate\">\n {label ?? placeholder}\n </span>\n </PopoverTrigger>\n );\n}\n\nexport interface DatePickerProps {\n /** The selected date (controlled). */\n value?: Date | undefined;\n /** The initial date (uncontrolled). */\n defaultValue?: Date | undefined;\n /** Called with the picked date, or `undefined` when the selected day is clicked again. */\n onValueChange?: (date: Date | undefined) => void;\n /** Trigger text while nothing is selected. */\n placeholder?: string;\n /** Formats the trigger text; defaults to `15 January 2026`. */\n formatDate?: (date: Date) => string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Class name for the trigger button. */\n className?: string;\n /** Extra props for the Calendar (e.g. `startMonth`, `captionLayout`, `disabled` matchers via `calendarProps.hidden`). */\n calendarProps?: CalendarPassthrough & { disabled?: CalendarProps[\"disabled\"] };\n /** Accessible name for the trigger. */\n \"aria-label\"?: string;\n}\n\nfunction DatePicker(props: DatePickerProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date\",\n formatDate = formatDateDefault,\n disabled,\n className,\n calendarProps,\n ...rest\n } = props;\n const [date, setDate] = useControllable<Date | undefined>(\n \"value\" in props,\n value,\n defaultValue,\n onValueChange,\n );\n const [open, setOpen] = React.useState(false);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PickerTrigger\n slot=\"date-picker-trigger\"\n placeholder={placeholder}\n label={date ? formatDate(date) : undefined}\n disabled={disabled}\n className={className}\n {...rest}\n />\n <PopoverContent data-slot=\"date-picker-content\" align=\"start\" className=\"w-auto p-0\">\n <Calendar\n {...calendarProps}\n mode=\"single\"\n defaultMonth={calendarProps?.defaultMonth ?? date}\n selected={date}\n onSelect={(next) => {\n setDate(next);\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport interface DateRangePickerProps extends Omit<\n DatePickerProps,\n \"value\" | \"defaultValue\" | \"onValueChange\"\n> {\n value?: DateRange | undefined;\n defaultValue?: DateRange | undefined;\n onValueChange?: (range: DateRange | undefined) => void;\n /** Separator between the two ends; defaults to an en dash. */\n separator?: string;\n}\n\nfunction formatRange(\n range: DateRange | undefined,\n formatDate: (d: Date) => string,\n separator: string,\n): string | undefined {\n if (!range?.from) return undefined;\n if (!range.to || range.to.getTime() === range.from.getTime()) return formatDate(range.from);\n return `${formatDate(range.from)}${separator}${formatDate(range.to)}`;\n}\n\nfunction DateRangePicker(props: DateRangePickerProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date range\",\n formatDate = formatDateDefault,\n separator = \" \\u2013 \",\n disabled,\n className,\n calendarProps,\n ...rest\n } = props;\n const [range, setRange] = useControllable<DateRange | undefined>(\n \"value\" in props,\n value,\n defaultValue,\n onValueChange,\n );\n\n return (\n <Popover>\n <PickerTrigger\n slot=\"date-range-picker-trigger\"\n placeholder={placeholder}\n label={formatRange(range, formatDate, separator)}\n disabled={disabled}\n className={cn(\"w-72\", className)}\n {...rest}\n />\n <PopoverContent data-slot=\"date-range-picker-content\" align=\"start\" className=\"w-auto p-0\">\n <Calendar\n numberOfMonths={2}\n {...calendarProps}\n mode=\"range\"\n defaultMonth={calendarProps?.defaultMonth ?? range?.from}\n selected={range}\n onSelect={setRange}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { DatePicker, DateRangePicker, formatDateDefault };\n","\"use client\";\n\nimport { FileIcon, Upload, X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { useDropzone, type Accept, type DropzoneState, type FileRejection } from \"react-dropzone\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Dropzone.\n *\n * A drop target over react-dropzone's `useDropzone`. The root is a focusable\n * region that opens the file dialog on click or Enter; the hidden `<input>` is\n * what the dialog fills. Every state is exposed as a data attribute so the\n * classes below (and a consumer's) can paint it:\n *\n * - `data-active` a drag is over the zone\n * - `data-accept` every dragged file passes `accept` / `maxSize`\n * - `data-reject` at least one dragged file fails\n * - `data-disabled`\n *\n * `onFiles` receives only the accepted files; rejections go to `onReject`.\n * `FileList` and `formatFileSize` are separate parts for listing what was\n * picked, so a form can keep the zone and the list in different places.\n *\n * ## Wrapping a whole page as a drop target\n *\n * `noClick` and `noKeyboard` turn off the two activators that only make sense\n * on a dashed box: clicking anywhere inside opens the file dialog, and Enter /\n * Space on the focused root does the same. A page-sized zone wraps content\n * that has its own buttons and inputs, so both have to go — otherwise every\n * click in the page opens a file picker.\n *\n * ```tsx\n * <Dropzone noClick noKeyboard onFiles={upload} className=\"min-h-dvh border-0 bg-transparent p-0\">\n * {({ isDragActive, open }) => (\n * <>\n * <PageContent />\n * <Button onClick={open}>Browse…</Button>\n * {isDragActive ? <DropHint /> : null}\n * </>\n * )}\n * </Dropzone>\n * ```\n *\n * The render-prop form gets react-dropzone's `open()`, which is the way back\n * to the file dialog from a deliberate control. With `noClick` the root also\n * drops its `cursor-pointer`, since it is no longer clickable.\n */\n\nconst UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"] as const;\n\n/** `1536` → `1.5 KB`, `0` → `0 B`; base 1024, one decimal above bytes. */\nfunction formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"0 B\";\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit += 1;\n }\n const rounded = unit === 0 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${UNITS[unit]}`;\n}\n\n/** Turns an `accept` map into a hint such as `PNG, JPG, PDF`. */\nfunction describeAccept(accept: Accept | undefined): string | undefined {\n if (!accept) return undefined;\n const exts = new Set<string>();\n for (const [mime, list] of Object.entries(accept)) {\n const items = typeof list === \"string\" ? [list] : list;\n if (items.length > 0) {\n for (const ext of items) exts.add(ext.replace(/^\\./, \"\").toUpperCase());\n } else {\n const sub = mime.split(\"/\")[1];\n if (sub && sub !== \"*\") exts.add(sub.toUpperCase());\n }\n }\n return exts.size > 0 ? [...exts].join(\", \") : undefined;\n}\n\nexport interface DropzoneProps extends Omit<\n React.ComponentProps<\"div\">,\n \"children\" | \"onDrop\" | \"onDragEnter\" | \"onDragOver\" | \"onDragLeave\"\n> {\n /** Called with the accepted files after a drop, a paste or the file dialog. */\n onFiles: (files: File[]) => void;\n /** Called with the rejected files and their reasons. */\n onReject?: (rejections: FileRejection[]) => void;\n /** MIME type to extension map, e.g. `{ \"image/png\": [\".png\"] }`. */\n accept?: Accept;\n /** Allow more than one file; defaults to true. */\n multiple?: boolean;\n /** Largest accepted file in bytes. */\n maxSize?: number;\n /** Most files accepted per drop; `0` means unlimited. */\n maxFiles?: number;\n disabled?: boolean;\n /** Do not open the file dialog on click; for a zone that wraps clickable content. @default false */\n noClick?: boolean;\n /** Do not open the file dialog on Enter or Space; pair with `noClick`. @default false */\n noKeyboard?: boolean;\n /** Primary line of the default body. */\n label?: React.ReactNode;\n /** Muted second line of the default body; derived from `accept` and `maxSize` when omitted. */\n hint?: React.ReactNode;\n /** Replace the default body. A function receives react-dropzone's state. */\n children?: React.ReactNode | ((state: DropzoneState) => React.ReactNode);\n}\n\nfunction Dropzone({\n onFiles,\n onReject,\n accept,\n multiple = true,\n maxSize,\n maxFiles,\n disabled = false,\n noClick = false,\n noKeyboard = false,\n label,\n hint,\n children,\n className,\n ref,\n ...props\n}: DropzoneProps) {\n const state = useDropzone({\n accept,\n multiple,\n maxSize,\n maxFiles,\n disabled,\n noClick,\n noKeyboard,\n onDropAccepted: (files) => onFiles(files),\n onDropRejected: (rejections) => onReject?.(rejections),\n });\n const { getRootProps, getInputProps, isDragActive, isDragAccept, isDragReject, isFocused, rootRef } =\n state;\n // getRootProps would let a consumer `ref` replace its own; hold both.\n const setRoot = (node: HTMLDivElement | null) => {\n (rootRef as React.MutableRefObject<HTMLElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n const derivedHint =\n hint ??\n [describeAccept(accept), maxSize ? `up to ${formatFileSize(maxSize)}` : undefined]\n .filter(Boolean)\n .join(\" \");\n\n const body =\n typeof children === \"function\" ? (\n children(state)\n ) : children !== undefined ? (\n children\n ) : (\n <>\n <span\n data-slot=\"dropzone-icon\"\n className={cn(\n \"flex size-10 items-center justify-center rounded-[var(--ds-radius-full)]\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-muted-foreground)]\",\n \"group-data-[active]/dropzone:bg-[var(--ds-primary-soft)] group-data-[active]/dropzone:text-[color:var(--ds-primary)]\",\n \"group-data-[reject]/dropzone:bg-[var(--ds-destructive-soft)] group-data-[reject]/dropzone:text-[color:var(--ds-destructive)]\",\n )}\n >\n <Upload aria-hidden className=\"size-5\" />\n </span>\n <span\n data-slot=\"dropzone-label\"\n className=\"text-[length:var(--ds-text-body-sm)] font-medium text-[color:var(--ds-foreground)]\"\n >\n {label ??\n (isDragReject\n ? \"Some of these files are not allowed\"\n : isDragActive\n ? \"Drop to upload\"\n : multiple\n ? \"Drop files here, or click to browse\"\n : \"Drop a file here, or click to browse\")}\n </span>\n {derivedHint ? (\n <span\n data-slot=\"dropzone-hint\"\n className=\"text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\"\n >\n {derivedHint}\n </span>\n ) : null}\n </>\n );\n\n return (\n <div\n {...getRootProps({\n ...props,\n ref: setRoot,\n className: cn(\n \"group/dropzone flex flex-col items-center justify-center gap-2 p-6 text-center\",\n \"rounded-[var(--ds-radius-lg)] border border-dashed border-[var(--ds-border)] bg-[var(--ds-card)]\",\n noClick ? \"select-none outline-none\" : \"cursor-pointer select-none outline-none\",\n \"transition-[border-color,background-color] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"hover:border-[var(--ds-border-strong)] hover:bg-[var(--ds-hover)]\",\n \"focus-visible:border-[var(--ds-ring)] focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[active]:border-[var(--ds-primary)] data-[active]:bg-[var(--ds-primary-soft)]\",\n \"data-[reject]:border-[var(--ds-destructive)] data-[reject]:bg-[var(--ds-destructive-soft)]\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n ),\n })}\n data-slot=\"dropzone\"\n data-active={isDragActive || undefined}\n data-accept={(isDragActive && isDragAccept) || undefined}\n data-reject={isDragReject || undefined}\n data-focused={isFocused || undefined}\n data-disabled={disabled || undefined}\n data-no-click={noClick || undefined}\n data-no-keyboard={noKeyboard || undefined}\n >\n <input data-slot=\"dropzone-input\" {...getInputProps()} />\n {body}\n </div>\n );\n}\n\nexport interface FileListProps extends Omit<React.ComponentProps<\"ul\">, \"children\"> {\n files: readonly File[];\n /** Called with the file and its index when its remove button is pressed; the button is hidden when omitted. */\n onRemove?: (file: File, index: number) => void;\n /** Formats the size column; defaults to `formatFileSize`. */\n formatSize?: (bytes: number) => string;\n}\n\n/**\n * The files a Dropzone picked: name, size and a remove button per row. Rows\n * are keyed by name, size and last-modified time so re-picking the same file\n * keeps its row stable.\n */\nfunction FileList({ files, onRemove, formatSize = formatFileSize, className, ...props }: FileListProps) {\n if (files.length === 0) return null;\n return (\n <ul data-slot=\"file-list\" className={cn(\"flex list-none flex-col gap-1.5 p-0\", className)} {...props}>\n {files.map((file, index) => (\n <li\n key={`${file.name}-${file.size}-${file.lastModified}`}\n data-slot=\"file-list-item\"\n className={cn(\n \"flex items-center gap-3 px-3 py-2\",\n \"rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-card)]\",\n )}\n >\n <FileIcon\n aria-hidden\n className=\"size-4 shrink-0 text-[color:var(--ds-muted-foreground)]\"\n />\n <span\n data-slot=\"file-list-name\"\n className=\"min-w-0 flex-1 truncate text-[length:var(--ds-text-caption-lg)] text-[color:var(--ds-foreground)]\"\n title={file.name}\n >\n {file.name}\n </span>\n <span\n data-slot=\"file-list-size\"\n className=\"shrink-0 font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption)] text-[color:var(--ds-muted-foreground)]\"\n >\n {formatSize(file.size)}\n </span>\n {onRemove ? (\n <button\n type=\"button\"\n data-slot=\"file-list-remove\"\n aria-label={`Remove ${file.name}`}\n onClick={() => onRemove(file, index)}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"text-[color:var(--ds-muted-foreground)] hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"[&_svg]:size-3.5\",\n )}\n >\n <X aria-hidden />\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\nexport { Dropzone, FileList, formatFileSize };\nexport type { Accept, FileRejection, DropzoneState };\n","\"use client\";\n\nimport { useRender } from \"@base-ui/react/use-render\";\nimport * as React from \"react\";\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldError as RHFFieldError,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n type FieldDescriptionProps,\n type FieldErrorProps,\n type FieldLabelProps,\n type FieldProps,\n} from \"@/components/field\";\n\n/**\n * Form.\n *\n * The shadcn react-hook-form recipe, with the parts built on Field so a form\n * written this way and one written with Field directly look the same:\n *\n * ```tsx\n * const form = useForm({ resolver: zodResolver(schema), defaultValues: { email: \"\" } });\n * <Form {...form}>\n * <form onSubmit={form.handleSubmit(onSubmit)}>\n * <FormField control={form.control} name=\"email\" render={({ field }) => (\n * <FormItem>\n * <FormLabel>Email</FormLabel>\n * <FormControl><Input {...field} /></FormControl>\n * <FormDescription>Where we send receipts.</FormDescription>\n * <FormMessage />\n * </FormItem>\n * )} />\n * </form>\n * </Form>\n * ```\n *\n * `FormItem` is a Field marked `invalid` from the react-hook-form error, so\n * `data-invalid` lands on the label and any Base UI control. `FormControl`\n * has no element of its own: it merges `id`, `aria-describedby` and\n * `aria-invalid` onto its single child, so a plain Input, Textarea or a Base\n * UI Checkbox/Select/Switch all work. `FormLabel` targets that `id`.\n *\n * `useForm` and `zodResolver` are re-exported so a consumer imports one package.\n */\nexport { useForm } from \"react-hook-form\";\nexport type { SubmitHandler, UseFormReturn } from \"react-hook-form\";\nexport { zodResolver } from \"@hookform/resolvers/zod\";\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null);\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n TTransformedValues = TFieldValues,\n>(props: ControllerProps<TFieldValues, TName, TTransformedValues>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n}\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null);\n\nfunction useFormFieldState() {\n const fieldContext = React.useContext(FormFieldContext);\n if (!fieldContext) {\n throw new Error(\"useFormField must be used within <FormField>\");\n }\n const { getFieldState } = useFormContext();\n const formState = useFormState({ name: fieldContext.name });\n const fieldState = getFieldState(fieldContext.name, formState);\n return { name: fieldContext.name, ...fieldState };\n}\n\nexport interface UseFormFieldReturn {\n id: string;\n name: string;\n formItemId: string;\n formDescriptionId: string;\n formMessageId: string;\n invalid: boolean;\n isDirty: boolean;\n isTouched: boolean;\n isValidating: boolean;\n error?: RHFFieldError | undefined;\n}\n\nfunction useFormField(): UseFormFieldReturn {\n const fieldState = useFormFieldState();\n const itemContext = React.useContext(FormItemContext);\n if (!itemContext) {\n throw new Error(\"useFormField must be used within <FormItem>\");\n }\n const { id } = itemContext;\n return {\n id,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n}\n\nexport interface FormItemProps extends Omit<FieldProps, \"invalid\" | \"name\"> {}\n\nfunction FormItem({ className, ...props }: FormItemProps) {\n const id = React.useId();\n const { name, error } = useFormFieldState();\n return (\n <FormItemContext.Provider value={{ id }}>\n <Field\n data-slot=\"form-item\"\n name={name}\n invalid={Boolean(error)}\n className={className}\n {...props}\n />\n </FormItemContext.Provider>\n );\n}\n\nexport interface FormLabelProps extends FieldLabelProps {}\n\nfunction FormLabel({ className, ...props }: FormLabelProps) {\n const { formItemId } = useFormField();\n return (\n <FieldLabel data-slot=\"form-label\" htmlFor={formItemId} className={className} {...props} />\n );\n}\n\nexport interface FormControlProps extends React.HTMLAttributes<HTMLElement> {\n /** The single control element; it receives `id`, `aria-describedby` and `aria-invalid`. */\n children: React.ReactElement;\n}\n\nfunction FormControl({ children, ...props }: FormControlProps) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n return useRender({\n render: children,\n props: {\n id: formItemId,\n \"aria-describedby\": error ? `${formDescriptionId} ${formMessageId}` : formDescriptionId,\n \"aria-invalid\": error ? true : undefined,\n ...props,\n },\n });\n}\n\nexport interface FormDescriptionProps extends FieldDescriptionProps {}\n\nfunction FormDescription({ className, ...props }: FormDescriptionProps) {\n const { formDescriptionId } = useFormField();\n return (\n <FieldDescription\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={className}\n {...props}\n />\n );\n}\n\nexport interface FormMessageProps extends Omit<FieldErrorProps, \"errors\" | \"match\"> {}\n\nfunction FormMessage({ className, children, ...props }: FormMessageProps) {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error.message ?? \"\") : children;\n if (!body) {\n return null;\n }\n return (\n <FieldError data-slot=\"form-message\" id={formMessageId} match className={className} {...props}>\n {body}\n </FieldError>\n );\n}\n\nexport {\n Form,\n FormField,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n useFormField,\n};\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Kbd — an inline keyboard-key cap. Mono caption-sm text on the sunken\n * surface, with a heavier bottom border for the key-cap read.\n */\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"inline-flex items-center px-1.5 py-0.5\",\n \"font-[family-name:var(--ds-font-mono)] text-[length:var(--ds-text-caption-sm)] leading-none\",\n \"bg-[var(--ds-muted)] text-[color:var(--ds-muted-foreground)]\",\n \"border border-b-2 border-[var(--ds-border)] rounded-[var(--ds-radius-sm)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Kbd };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { Skeleton } from \"@/components/skeleton\";\nimport { cn } from \"@/lib/cn\";\n\nexport type LoadingSkeletonPreset = \"list\" | \"table\" | \"card\" | \"form\";\n\nexport interface LoadingSkeletonProps extends React.ComponentProps<\"div\"> {\n /** Which shape of content is loading. */\n preset?: LoadingSkeletonPreset;\n /** Rows (list, table, form) or cards. Each preset has a sensible default. */\n rows?: number;\n /** Columns for `table` and `card`. */\n columns?: number;\n}\n\nconst DEFAULT_ROWS: Record<LoadingSkeletonPreset, number> = {\n list: 4,\n table: 5,\n card: 3,\n form: 3,\n};\n\nconst DEFAULT_COLUMNS: Record<LoadingSkeletonPreset, number> = {\n list: 1,\n table: 4,\n card: 3,\n form: 1,\n};\n\n/* Widths cycle so rows do not line up into a solid block. */\nconst LINE_WIDTHS = [\"w-3/4\", \"w-1/2\", \"w-5/6\", \"w-2/3\", \"w-3/5\"] as const;\nconst width = (i: number) => LINE_WIDTHS[i % LINE_WIDTHS.length];\n\nfunction ListSkeleton({ rows }: { rows: number }) {\n return (\n <div data-slot=\"loading-skeleton-list\" className=\"flex flex-col gap-4\">\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} data-slot=\"loading-skeleton-row\" className=\"flex items-center gap-3\">\n <Skeleton className=\"size-9 shrink-0 rounded-[var(--ds-radius-full)]\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Skeleton className={cn(\"h-3.5\", width(i))} />\n <Skeleton className={cn(\"h-3\", width(i + 2))} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction TableSkeleton({ rows, columns }: { rows: number; columns: number }) {\n const grid = { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` };\n return (\n <div data-slot=\"loading-skeleton-table\" className=\"flex flex-col\">\n <div\n data-slot=\"loading-skeleton-row\"\n className=\"grid gap-4 border-b border-[var(--ds-border-subtle)] px-3 py-3\"\n style={grid}\n >\n {Array.from({ length: columns }, (_, c) => (\n <Skeleton key={c} className=\"h-3 w-1/2\" />\n ))}\n </div>\n {Array.from({ length: rows }, (_, r) => (\n <div\n key={r}\n data-slot=\"loading-skeleton-row\"\n className=\"grid gap-4 border-b border-[var(--ds-border-subtle)] px-3 py-3.5 last:border-b-0\"\n style={grid}\n >\n {Array.from({ length: columns }, (_, c) => (\n <Skeleton key={c} className={cn(\"h-3.5\", width(r + c))} />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction CardSkeleton({ rows, columns }: { rows: number; columns: number }) {\n return (\n <div\n data-slot=\"loading-skeleton-cards\"\n className=\"grid gap-4\"\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: rows }, (_, i) => (\n <div\n key={i}\n data-slot=\"loading-skeleton-card\"\n className=\"flex flex-col gap-3 rounded-[var(--ds-radius-lg)] border border-[var(--ds-border-subtle)] bg-[var(--ds-card)] p-5\"\n >\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-3/4\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n <Skeleton className=\"h-3 w-full\" />\n <Skeleton className={cn(\"h-3\", width(i))} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FormSkeleton({ rows }: { rows: number }) {\n return (\n <div data-slot=\"loading-skeleton-form\" className=\"flex max-w-xl flex-col gap-5\">\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} data-slot=\"loading-skeleton-field\" className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-3 w-24\" />\n <Skeleton className=\"h-9 w-full rounded-[var(--ds-radius-md)]\" />\n </div>\n ))}\n <Skeleton className=\"mt-1 h-9 w-28 rounded-[var(--ds-radius-md)]\" />\n </div>\n );\n}\n\n/**\n * LoadingSkeleton — page-level placeholders assembled from Skeleton, one per\n * shape of content: a list of rows with an avatar, a table with a header row,\n * a grid of cards, or a stacked form. Announces itself as busy so assistive\n * technology knows the region is loading; the blocks themselves are hidden.\n */\nfunction LoadingSkeleton({\n className,\n preset = \"list\",\n rows,\n columns,\n ...props\n}: LoadingSkeletonProps) {\n const count = Math.max(1, rows ?? DEFAULT_ROWS[preset]);\n const cols = Math.max(1, columns ?? DEFAULT_COLUMNS[preset]);\n return (\n <div\n data-slot=\"loading-skeleton\"\n data-preset={preset}\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className={cn(\"w-full\", className)}\n {...props}\n >\n {preset === \"list\" ? <ListSkeleton rows={count} /> : null}\n {preset === \"table\" ? <TableSkeleton rows={count} columns={cols} /> : null}\n {preset === \"card\" ? <CardSkeleton rows={count} columns={cols} /> : null}\n {preset === \"form\" ? <FormSkeleton rows={count} /> : null}\n </div>\n );\n}\n\nexport { LoadingSkeleton };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface PageHeaderProps extends Omit<React.ComponentProps<\"header\">, \"title\"> {\n /** The page title. Rendered as the h1; use `titleAs` to demote it. */\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Buttons for the page, right-aligned on wide viewports. */\n actions?: React.ReactNode;\n /** Short uppercase label above the title, e.g. a section or product name. */\n eyebrow?: React.ReactNode;\n /** A Breadcrumb or any navigation rendered above the eyebrow. */\n breadcrumb?: React.ReactNode;\n /** Heading level when the page already has an h1. */\n titleAs?: \"h1\" | \"h2\" | \"h3\";\n}\n\n/**\n * PageHeader — the top of every screen: breadcrumb, eyebrow, title,\n * description, and an actions slot. The title is an h1 on the h2 step of the\n * type scale in the display face, so screens read as one product rather than\n * as a stack of card titles.\n */\nfunction PageHeader({\n className,\n title,\n description,\n actions,\n eyebrow,\n breadcrumb,\n titleAs: Title = \"h1\",\n children,\n ...props\n}: PageHeaderProps) {\n return (\n <header\n data-slot=\"page-header\"\n className={cn(\n \"flex flex-col gap-4 text-[color:var(--ds-foreground)] md:flex-row md:items-end md:justify-between\",\n className,\n )}\n {...props}\n >\n <div data-slot=\"page-header-content\" className=\"flex min-w-0 flex-col gap-1.5\">\n {breadcrumb ? (\n <div data-slot=\"page-header-breadcrumb\" className=\"mb-1\">\n {breadcrumb}\n </div>\n ) : null}\n {eyebrow ? (\n <span\n data-slot=\"page-header-eyebrow\"\n className={cn(\n \"text-[length:var(--ds-text-eyebrow)] font-extrabold uppercase\",\n \"leading-[var(--ds-text-eyebrow--line-height)] tracking-[var(--ds-text-eyebrow--letter-spacing)]\",\n \"text-[color:var(--ds-eyebrow)]\",\n )}\n >\n {eyebrow}\n </span>\n ) : null}\n <Title\n data-slot=\"page-header-title\"\n className={cn(\n \"font-display text-[length:var(--ds-text-h2)] font-bold text-balance\",\n \"leading-[var(--ds-text-h2--line-height)] tracking-[var(--ds-text-h2--letter-spacing)]\",\n \"text-[color:var(--ds-foreground)]\",\n )}\n >\n {title}\n </Title>\n {description ? (\n <p\n data-slot=\"page-header-description\"\n className={cn(\n \"max-w-prose text-[length:var(--ds-text-body-sm)] leading-[var(--ds-text-body-sm--line-height)]\",\n \"text-[color:var(--ds-muted-foreground)]\",\n )}\n >\n {description}\n </p>\n ) : null}\n {children}\n </div>\n {actions ? (\n <div\n data-slot=\"page-header-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-2 md:justify-end\"\n >\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\nexport { PageHeader };\n","\"use client\";\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * ScrollArea.\n *\n * Base UI positions the scrollbar and thumb itself (absolute inside the root,\n * thumb size in `--scroll-area-thumb-*`); this file only sets the track width,\n * the thumb colour and the hover/scroll reveal. Base UI also unmounts the\n * scrollbar when there is nothing to scroll, so an empty list shows no track.\n *\n * Radix users: the `display: table` wrapper is gone, so `truncate` works\n * inside the viewport without the `[&>div]:!block` override cortenaweb needed.\n * `type=\"always\" | \"hover\"` is gone too; the scrollbar shows on hover and while\n * scrolling, and `keepMounted` on `ScrollBar` keeps it in the DOM otherwise.\n */\nexport interface ScrollAreaProps extends ScrollAreaPrimitive.Root.Props {\n /** Which scrollbars to render. Defaults to vertical only. */\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n}\n\nfunction ScrollArea({ className, children, orientation = \"vertical\", ...props }: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full overscroll-contain rounded-[inherit] outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation !== \"horizontal\" && <ScrollBar orientation=\"vertical\" />}\n {orientation !== \"vertical\" && <ScrollBar orientation=\"horizontal\" />}\n <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none p-px\",\n \"opacity-0 transition-opacity duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n \"data-[hovering]:opacity-100 data-[scrolling]:opacity-100\",\n orientation === \"vertical\" && \"w-2.5 flex-col\",\n orientation === \"horizontal\" && \"h-2.5 flex-row\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className={cn(\n \"relative flex-1 rounded-[var(--ds-radius-full)] bg-[var(--ds-border-strong)]\",\n orientation === \"vertical\" ? \"w-full\" : \"h-full\",\n )}\n />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Segmented control.\n *\n * A single-select row of options exposed as a radiogroup: the same semantics\n * cortenaweb shipped, which screen readers announce as \"1 of 3, selected\".\n * The active segment lifts onto the raised surface with the small shadow; the\n * others read as muted text until hovered.\n */\nexport interface SegmentedOption<T extends string = string> {\n value: T;\n label: React.ReactNode;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface SegmentedProps<T extends string = string>\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value: T;\n onValueChange: (value: T) => void;\n options: readonly SegmentedOption<T>[];\n \"aria-label\"?: string;\n}\n\nfunction Segmented<T extends string = string>({\n className,\n value,\n onValueChange,\n options,\n \"aria-label\": ariaLabel,\n ...props\n}: SegmentedProps<T>) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n data-slot=\"segmented\"\n className={cn(\n \"inline-flex gap-0.5 rounded-[var(--ds-radius-md)] border border-[var(--ds-border-subtle)] bg-[var(--ds-muted)] p-1\",\n className,\n )}\n {...props}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={opt.disabled}\n data-slot=\"segmented-item\"\n data-state={active ? \"on\" : \"off\"}\n onClick={() => onValueChange(opt.value)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-[var(--ds-radius-sm)] px-3 py-1 font-medium\",\n \"text-[length:var(--ds-text-caption)]\",\n \"transition-[background-color,color,box-shadow] duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n active\n ? \"bg-[var(--ds-popover)] text-[color:var(--ds-foreground)] shadow-[var(--ds-shadow-sm)]\"\n : \"text-[color:var(--ds-muted-foreground)] hover:text-[color:var(--ds-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n )}\n >\n {opt.icon}\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport { Segmented };\n","\"use client\";\n\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Sheet: a Dialog whose Popup is anchored to one edge of the viewport.\n *\n * Same Base UI parts as Dialog (Root, Trigger, Portal, Backdrop, Popup, Title,\n * Description, Close); only the Popup's placement differs, chosen by `side`.\n * `SheetContent` composes Portal + Backdrop + Popup so consumers keep writing\n * `<SheetContent side=\"right\">…</SheetContent>`.\n *\n * ## Non-modal side panels\n *\n * `modal={false}` is the help-panel / inspector case: a sheet read *alongside*\n * the app rather than instead of it. No backdrop is rendered, focus is not\n * trapped, page scroll is not locked, and the rest of the page stays clickable,\n * so a user can keep working with the panel open. `modal=\"trap-focus\"` is the\n * middle setting Base UI offers: focus stays inside, the page still scrolls.\n *\n * ```tsx\n * <Sheet modal={false} open={helpOpen} onOpenChange={setHelpOpen}>\n * <SheetContent side=\"right\" disablePointerDismissal>…</SheetContent>\n * </Sheet>\n * ```\n *\n * A non-modal sheet closes when focus or a press leaves it; pass\n * `disablePointerDismissal` (a Base UI Root prop, forwarded) to keep it open\n * until the user closes it. `modal` is on the Root because that is where Base\n * UI reads it; `SheetContent` picks the backdrop up from there through context.\n */\nconst SheetModalContext = React.createContext<boolean | \"trap-focus\">(true);\n\nexport interface SheetProps extends SheetPrimitive.Root.Props {\n /**\n * `true` (default) traps focus, locks page scroll and draws a backdrop.\n * `false` draws no backdrop and traps nothing, for a panel read alongside\n * the app. `\"trap-focus\"` keeps focus in but leaves the page scrollable.\n */\n modal?: boolean | \"trap-focus\";\n}\n\nfunction Sheet({ modal = true, ...props }: SheetProps) {\n return (\n <SheetModalContext.Provider value={modal}>\n <SheetPrimitive.Root modal={modal} {...props} />\n </SheetModalContext.Provider>\n );\n}\n\nfunction SheetTrigger(props: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose(props: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal(props: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50\",\n \"bg-[color-mix(in_oklab,var(--ds-ink-950)_70%,transparent)]\",\n \"open:animate-in open:fade-in-0 closed:animate-out closed:fade-out-0\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst sheetVariants = cva(\n [\n \"fixed z-50 flex flex-col gap-4 p-6 outline-none\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-lg)]\",\n \"open:animate-in closed:animate-out\",\n \"open:duration-[var(--ds-duration-slow)] closed:duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n ],\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b border-[var(--ds-border)] open:slide-in-from-top closed:slide-out-to-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t border-[var(--ds-border)] open:slide-in-from-bottom closed:slide-out-to-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r border-[var(--ds-border)] open:slide-in-from-left closed:slide-out-to-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l border-[var(--ds-border)] open:slide-in-from-right closed:slide-out-to-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n },\n);\n\nexport interface SheetContentProps\n extends SheetPrimitive.Popup.Props, VariantProps<typeof sheetVariants> {\n /** Keep the sheet mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the sheet; defaults to `<body>`. */\n container?: SheetPrimitive.Portal.Props[\"container\"];\n}\n\nfunction SheetContent({\n side = \"right\",\n className,\n children,\n keepMounted,\n container,\n ...props\n}: SheetContentProps) {\n const modal = React.useContext(SheetModalContext);\n return (\n <SheetPortal keepMounted={keepMounted} container={container}>\n {modal === false ? null : <SheetOverlay />}\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n data-modal={modal === false ? undefined : modal === true ? \"\" : modal}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </SheetPrimitive.Popup>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-[length:var(--ds-text-body-md)] font-semibold text-[color:var(--ds-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({ className, ...props }: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\n \"text-[length:var(--ds-text-body-sm)] text-[color:var(--ds-muted-foreground)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n sheetVariants,\n};\n","\"use client\";\n\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n MouseSensor,\n PointerSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { GripVertical } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * SortableList.\n *\n * A reorderable list over dnd-kit: `DndContext` + `SortableContext` around one\n * `useSortable` item per entry. The list owns nothing — it calls `onReorder`\n * with the next array and the consumer stores it. Pointer and keyboard sensors\n * are wired (Space picks up, arrows move, Space drops, Escape cancels) and a\n * `DragOverlay` paints the lifted copy with `--ds-shadow-lg` while the item\n * left behind dims and takes the ring colour.\n *\n * By default the whole row is the drag activator. Pass `handle` to restrict\n * dragging to a `<SortableHandle>` (or any element given `handleProps`) so\n * buttons and inputs inside a row stay clickable.\n *\n * ## Touch\n *\n * A pointer drag and a touch scroll start the same way, so something has to\n * say which one a finger means. In handle mode only the small handle is\n * `touch-none`, so the rest of the row scrolls: nothing to decide. In\n * whole-row mode the whole row is `touch-none`, which is why a touch list\n * whose rows are the activators cannot be scrolled by dragging over them.\n *\n * `touchScroll` is the way out, and it defaults to whichever of those is\n * already true — `true` in handle mode, `false` in whole-row mode, so existing\n * lists behave exactly as before. Setting it `true` on a whole-row list drops\n * `touch-none` and swaps the PointerSensor for a MouseSensor plus a\n * TouchSensor with delay activation: a quick swipe scrolls, a press held for\n * {@link TOUCH_DELAY_MS} picks the row up. `false` in handle mode is the\n * opposite trade — the row never scrolls under a finger.\n */\n\n/** How long a finger must rest on a row before it becomes a drag. */\nconst TOUCH_DELAY_MS = 250;\n/** How far it may slip in that time and still count as a press, not a scroll. */\nconst TOUCH_TOLERANCE_PX = 8;\n\n/** Spread onto the element that should start a drag. */\nexport interface SortableHandleProps extends Partial<DraggableAttributes> {\n ref: (element: HTMLElement | null) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n onPointerDown?: React.PointerEventHandler<HTMLElement>;\n onMouseDown?: React.MouseEventHandler<HTMLElement>;\n onTouchStart?: React.TouchEventHandler<HTMLElement>;\n}\n\n/** dnd-kit types its listeners as a bag of `Function`s; narrow them to the handlers they are. */\nfunction asHandlers(listeners: DraggableSyntheticListeners): Partial<SortableHandleProps> {\n return (listeners ?? {}) as Partial<SortableHandleProps>;\n}\n\nexport interface SortableRenderState {\n /** Attributes, listeners and ref for a custom drag handle. */\n handleProps: SortableHandleProps;\n /** True for the item being dragged (and for the overlay copy). */\n isDragging: boolean;\n}\n\n/** What moved where, passed to `onReorder` alongside the reordered array. */\nexport interface SortableReorderDetails {\n /** Index the item came from, in the array as it was passed in. */\n from: number;\n /** Index it landed on. */\n to: number;\n /** Id of the item that moved (`getId` of the dragged item). */\n activeId: UniqueIdentifier;\n /** Id of the item it was dropped onto. */\n overId: UniqueIdentifier;\n}\n\nexport interface SortableListProps<T> extends Omit<React.ComponentProps<\"ul\">, \"children\"> {\n items: readonly T[];\n /** Stable id per item; must be unique within the list. */\n getId: (item: T) => UniqueIdentifier;\n /**\n * Called with the reordered array after a successful drop, and with the move\n * itself — `{ from, to, activeId, overId }` — for a server that persists a\n * position rather than the whole list.\n */\n onReorder: (next: T[], details: SortableReorderDetails) => void;\n renderItem: (item: T, state: SortableRenderState) => React.ReactNode;\n /** Layout axis; also selects the sorting strategy. */\n orientation?: \"vertical\" | \"horizontal\";\n /** Only a `<SortableHandle>` (or an element given `handleProps`) starts a drag. */\n handle?: boolean;\n /**\n * Let a finger scroll the page over the rows. Defaults to `handle`: `true`\n * in handle mode, `false` in whole-row mode, which is what each already did.\n * `true` on a whole-row list drops `touch-none` and uses a TouchSensor with\n * delay activation, so a swipe scrolls and a held press drags.\n */\n touchScroll?: boolean;\n /** Disables every sensor and hides the handles. */\n disabled?: boolean;\n /** Class name for each item wrapper. */\n itemClassName?: string;\n}\n\ninterface ItemContextValue {\n handleProps: SortableHandleProps;\n isDragging: boolean;\n disabled: boolean;\n}\n\nconst noopRef = () => {};\nconst inertHandle: SortableHandleProps = { ref: noopRef };\n\nconst SortableItemContext = React.createContext<ItemContextValue>({\n handleProps: inertHandle,\n isDragging: false,\n disabled: false,\n});\n\nconst itemClassName = cn(\n \"relative rounded-[var(--ds-radius-md)] outline-none\",\n \"focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"data-[dragging]:opacity-50 data-[dragging]:ring-2 data-[dragging]:ring-[var(--ds-ring)]\",\n);\n\ninterface SortableItemProps<T> {\n id: UniqueIdentifier;\n item: T;\n handle: boolean;\n disabled: boolean;\n touchScroll: boolean;\n renderItem: SortableListProps<T>[\"renderItem\"];\n className: string | undefined;\n}\n\nfunction SortableItem<T>({ id, item, handle, disabled, touchScroll, renderItem, className }: SortableItemProps<T>) {\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } =\n useSortable({ id, disabled });\n\n const handleProps = React.useMemo<SortableHandleProps>(\n () => ({ ...attributes, ...asHandlers(listeners), ref: setActivatorNodeRef }),\n [attributes, listeners, setActivatorNodeRef],\n );\n const context = React.useMemo<ItemContextValue>(\n () => ({ handleProps, isDragging, disabled }),\n [handleProps, isDragging, disabled],\n );\n const rowActivator = handle ? undefined : { ...attributes, ...asHandlers(listeners) };\n\n return (\n <SortableItemContext.Provider value={context}>\n <li\n ref={setNodeRef}\n data-slot=\"sortable-item\"\n data-dragging={isDragging || undefined}\n data-disabled={disabled || undefined}\n style={{ transform: CSS.Translate.toString(transform), transition }}\n className={cn(\n itemClassName,\n !handle && !disabled && \"cursor-grab data-[dragging]:cursor-grabbing\",\n // touch-action is what decides whether a finger scrolls or drags.\n !touchScroll && !disabled && \"touch-none\",\n className,\n )}\n {...rowActivator}\n >\n {renderItem(item, { handleProps, isDragging })}\n </li>\n </SortableItemContext.Provider>\n );\n}\n\n/**\n * A grip button that starts the drag for its row. Reads the row's activator\n * props from context, so it needs no wiring beyond being rendered inside\n * `renderItem`. Hidden (kept in layout) when the list is disabled.\n */\nfunction SortableHandle({ className, children, ...props }: React.ComponentProps<\"button\">) {\n const { handleProps, disabled } = React.useContext(SortableItemContext);\n return (\n <button\n type=\"button\"\n data-slot=\"sortable-handle\"\n aria-label=\"Drag to reorder\"\n className={cn(\n \"inline-flex size-7 shrink-0 cursor-grab touch-none items-center justify-center\",\n \"rounded-[var(--ds-radius-sm)] text-[color:var(--ds-text-tertiary)]\",\n \"hover:bg-[var(--ds-hover)] hover:text-[color:var(--ds-muted-foreground)]\",\n \"outline-none focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n \"active:cursor-grabbing disabled:pointer-events-none disabled:opacity-50\",\n \"[&_svg]:size-4 [&_svg]:pointer-events-none\",\n disabled && \"invisible\",\n className,\n )}\n disabled={disabled}\n {...handleProps}\n {...props}\n >\n {children ?? <GripVertical aria-hidden />}\n </button>\n );\n}\n\nfunction SortableList<T>({\n items,\n getId,\n onReorder,\n renderItem,\n orientation = \"vertical\",\n handle = false,\n disabled = false,\n touchScroll = handle,\n itemClassName: itemClass,\n className,\n ...props\n}: SortableListProps<T>) {\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null);\n // Only a whole-row list needs the split sensors: in handle mode the row is\n // already scrollable because only the handle is touch-none, and swapping\n // sensors there would put a 250 ms delay on the handle for no gain.\n const delayTouch = touchScroll && !handle;\n // Every sensor is created on every render (they are hooks); which ones are\n // handed to DndContext is what changes.\n const pointerSensor = useSensor(PointerSensor, { activationConstraint: { distance: 4 } });\n const mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance: 4 } });\n const touchSensor = useSensor(TouchSensor, {\n activationConstraint: { delay: TOUCH_DELAY_MS, tolerance: TOUCH_TOLERANCE_PX },\n });\n const keyboardSensor = useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates });\n const pointerSensors = useSensors(pointerSensor, keyboardSensor);\n const splitSensors = useSensors(mouseSensor, touchSensor, keyboardSensor);\n const sensors = delayTouch ? splitSensors : pointerSensors;\n const ids = React.useMemo(() => items.map(getId), [items, getId]);\n const activeItem = activeId === null ? undefined : items[ids.indexOf(activeId)];\n\n const onDragStart = React.useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id);\n }, []);\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const from = ids.indexOf(active.id);\n const to = ids.indexOf(over.id);\n if (from < 0 || to < 0) return;\n onReorder(arrayMove([...items], from, to), {\n from,\n to,\n activeId: active.id,\n overId: over.id,\n });\n },\n [ids, items, onReorder],\n );\n const onDragCancel = React.useCallback(() => setActiveId(null), []);\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n >\n <SortableContext\n items={ids}\n strategy={orientation === \"horizontal\" ? horizontalListSortingStrategy : verticalListSortingStrategy}\n disabled={disabled}\n >\n <ul\n data-slot=\"sortable-list\"\n data-orientation={orientation}\n data-disabled={disabled || undefined}\n data-touch-scroll={touchScroll ? \"\" : undefined}\n className={cn(\n \"flex list-none gap-2 p-0\",\n orientation === \"horizontal\" ? \"flex-row flex-wrap\" : \"flex-col\",\n className,\n )}\n {...props}\n >\n {items.map((item, index) => (\n <SortableItem\n key={ids[index] ?? index}\n id={ids[index] ?? index}\n item={item}\n handle={handle}\n disabled={disabled}\n touchScroll={touchScroll}\n renderItem={renderItem}\n className={itemClass}\n />\n ))}\n </ul>\n </SortableContext>\n <DragOverlay>\n {activeItem === undefined ? null : (\n <SortableItemContext.Provider\n value={{ handleProps: inertHandle, isDragging: true, disabled: false }}\n >\n <div\n data-slot=\"sortable-overlay\"\n className={cn(\n \"cursor-grabbing rounded-[var(--ds-radius-md)] bg-[var(--ds-card)]\",\n \"shadow-[var(--ds-shadow-lg)] ring-1 ring-[var(--ds-ring)]\",\n itemClass,\n )}\n >\n {renderItem(activeItem, { handleProps: inertHandle, isDragging: true })}\n </div>\n </SortableItemContext.Provider>\n )}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport { SortableList, SortableHandle, arrayMove };\n","\"use client\";\n\nimport { Toast as ToastPrimitive } from \"@base-ui/react/toast\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Toast.\n *\n * Base UI toasts are imperative: `useToast().add({ title, description, type })`\n * from anywhere under the provider. `Toaster` mounts `Toast.Provider` and the\n * `Toast.Viewport`, and renders every toast the manager holds, so it must wrap\n * the part of the tree that calls `useToast` (usually the whole app).\n *\n * The `type` field on a toast picks the variant: `default`, `success`,\n * `warning` or `destructive`, painted from the semantic soft tokens. Anything\n * else falls back to `default`.\n *\n * sonner / Radix users: there is no `toast()` module singleton. Get the manager\n * from `useToast()` inside a component, or build one with\n * `createToastManager()` from `@base-ui/react/toast` and pass it as\n * `toastManager` to `Toaster` when you need to fire toasts outside React.\n */\nconst toastVariants = cva(\n [\n \"pointer-events-auto relative flex w-full items-start gap-3 p-4\",\n \"rounded-[var(--ds-radius-lg)] border shadow-[var(--ds-shadow-lg)]\",\n \"text-[length:var(--ds-text-caption-lg)]\",\n \"open:animate-in open:fade-in-0 open:slide-in-from-bottom-2\",\n \"closed:animate-out closed:fade-out-0 closed:slide-out-to-right-2\",\n \"duration-[var(--ds-duration-base)] ease-[var(--ds-ease-out)]\",\n \"data-[swiping]:transition-none data-[limited]:hidden\",\n ],\n {\n variants: {\n variant: {\n default:\n \"border-[var(--ds-border)] bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)]\",\n success:\n \"border-[var(--ds-success)]/30 bg-[var(--ds-success-soft)] text-[color:var(--ds-success)]\",\n warning:\n \"border-[var(--ds-warning)]/30 bg-[var(--ds-warning-soft)] text-[color:var(--ds-warning)]\",\n destructive:\n \"border-[var(--ds-destructive)]/30 bg-[var(--ds-destructive-soft)] text-[color:var(--ds-destructive)]\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\ntype ToastVariant = NonNullable<VariantProps<typeof toastVariants>[\"variant\"]>;\n\nconst VARIANTS: readonly ToastVariant[] = [\"default\", \"success\", \"warning\", \"destructive\"];\n\nfunction variantOf(type: string | undefined): ToastVariant {\n return (VARIANTS as readonly string[]).includes(type ?? \"\") ? (type as ToastVariant) : \"default\";\n}\n\n/** The Base UI toast manager: `{ toasts, add, close, update, promise }`. */\nconst useToast = ToastPrimitive.useToastManager;\n\nexport interface ToastProps extends Omit<ToastPrimitive.Root.Props, \"toast\">, VariantProps<typeof toastVariants> {\n toast: ToastPrimitive.Root.ToastObject;\n}\n\n/** One toast. Rendered by `Toaster`; exported for custom viewports. */\nfunction Toast({ className, variant, toast, ...props }: ToastProps) {\n return (\n <ToastPrimitive.Root\n data-slot=\"toast\"\n toast={toast}\n className={cn(toastVariants({ variant: variant ?? variantOf(toast.type) }), className)}\n {...props}\n >\n <ToastPrimitive.Content data-slot=\"toast-content\" className=\"flex min-w-0 flex-1 flex-col gap-1\">\n {toast.title ? (\n <ToastPrimitive.Title\n data-slot=\"toast-title\"\n className=\"text-[length:var(--ds-text-body-sm)] font-semibold leading-tight\"\n />\n ) : null}\n {toast.description ? (\n <ToastPrimitive.Description\n data-slot=\"toast-description\"\n className=\"text-[length:var(--ds-text-caption-lg)] opacity-90\"\n />\n ) : null}\n </ToastPrimitive.Content>\n <ToastPrimitive.Close\n data-slot=\"toast-close\"\n aria-label=\"Close\"\n className={cn(\n \"-mr-1 -mt-1 flex size-7 shrink-0 items-center justify-center rounded-[var(--ds-radius-sm)]\",\n \"opacity-70 outline-none transition-[opacity,background-color] duration-[var(--ds-duration-fast)]\",\n \"hover:bg-[var(--ds-hover)] hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-[var(--ds-ring)]/40\",\n )}\n >\n <X className=\"size-4\" />\n </ToastPrimitive.Close>\n </ToastPrimitive.Root>\n );\n}\n\nfunction ToastList() {\n const { toasts } = useToast();\n return toasts.map((toast) => <Toast key={toast.id} toast={toast} />);\n}\n\nexport interface ToasterProps extends ToastPrimitive.Provider.Props {\n /** Corner of the screen the stack grows from. */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n /** Extra classes on the viewport. */\n className?: string;\n children?: React.ReactNode;\n}\n\nconst positionClasses: Record<NonNullable<ToasterProps[\"position\"]>, string> = {\n \"bottom-right\": \"bottom-4 right-4 flex-col\",\n \"bottom-left\": \"bottom-4 left-4 flex-col\",\n \"top-right\": \"top-4 right-4 flex-col-reverse\",\n \"top-left\": \"top-4 left-4 flex-col-reverse\",\n};\n\n/**\n * Provider + viewport. Wrap the app in it once; `useToast()` works anywhere\n * beneath. Toasts render in a fixed corner as a flat stack (newest last).\n */\nfunction Toaster({ position = \"bottom-right\", className, children, ...props }: ToasterProps) {\n return (\n <ToastPrimitive.Provider {...props}>\n {children}\n <ToastPrimitive.Portal>\n <ToastPrimitive.Viewport\n data-slot=\"toast-viewport\"\n className={cn(\n \"pointer-events-none fixed z-50 flex w-[calc(100vw-2rem)] max-w-sm gap-2 outline-none\",\n positionClasses[position],\n className,\n )}\n >\n <ToastList />\n </ToastPrimitive.Viewport>\n </ToastPrimitive.Portal>\n </ToastPrimitive.Provider>\n );\n}\n\nexport { Toaster, Toast, useToast, toastVariants };\n","\"use client\";\n\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface ToolbarProps extends React.ComponentProps<\"div\"> {\n /** Draw a rule under the row, for a toolbar that sits above a table or list. */\n bordered?: boolean;\n}\n\n/**\n * Toolbar — a single flex row of controls above content. `ToolbarStart` and\n * `ToolbarEnd` group the two ends; `ToolbarSeparator` is a short vertical rule\n * between clusters of controls in the same group.\n */\nfunction Toolbar({ className, bordered, ...props }: ToolbarProps) {\n return (\n <div\n data-slot=\"toolbar\"\n role=\"toolbar\"\n className={cn(\n \"flex min-h-10 flex-wrap items-center gap-2 text-[color:var(--ds-foreground)]\",\n bordered && \"border-b border-[var(--ds-border-subtle)] pb-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ToolbarStart({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-start\"\n className={cn(\"flex min-w-0 flex-1 flex-wrap items-center gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ToolbarEnd({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-end\"\n className={cn(\"ml-auto flex shrink-0 flex-wrap items-center gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction ToolbarSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"toolbar-separator\"\n role=\"none\"\n aria-hidden\n className={cn(\"mx-1 h-5 w-px shrink-0 self-center bg-[var(--ds-border)]\", className)}\n {...props}\n />\n );\n}\n\nexport { Toolbar, ToolbarStart, ToolbarEnd, ToolbarSeparator };\n","\"use client\";\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * Tooltip.\n *\n * Base UI's Tooltip opens on hover and focus (never on click). Radix users:\n * `asChild` on the trigger becomes `render={<Button />}`, and the delay moves\n * from `delayDuration` on the Provider to `delay` on the Provider or Trigger.\n * `TooltipContent` composes Portal + Positioner + Popup so the consumer still\n * writes one element; `side`, `align` and `sideOffset` are forwarded to the\n * Positioner where Base UI expects them. Base UI sets no ARIA role on the\n * popup; `role=\"tooltip\"` is added here so it reads like the Radix version.\n */\nfunction TooltipProvider(props: TooltipPrimitive.Provider.Props) {\n return <TooltipPrimitive.Provider {...props} />;\n}\n\nfunction Tooltip(props: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root {...props} />;\n}\n\nfunction TooltipTrigger(props: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\ntype PositionerProps = Pick<\n TooltipPrimitive.Positioner.Props,\n | \"side\"\n | \"align\"\n | \"sideOffset\"\n | \"alignOffset\"\n | \"anchor\"\n | \"collisionBoundary\"\n | \"collisionPadding\"\n | \"collisionAvoidance\"\n | \"sticky\"\n | \"positionMethod\"\n>;\n\nexport interface TooltipContentProps extends TooltipPrimitive.Popup.Props, PositionerProps {\n /** Keep the popup mounted in the DOM while hidden. */\n keepMounted?: boolean;\n /** Where to portal the popup; defaults to `<body>`. */\n container?: TooltipPrimitive.Portal.Props[\"container\"];\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n align = \"center\",\n sideOffset = 4,\n alignOffset,\n anchor,\n collisionBoundary,\n collisionPadding,\n collisionAvoidance,\n sticky,\n positionMethod,\n keepMounted,\n container,\n ...props\n}: TooltipContentProps) {\n return (\n <TooltipPrimitive.Portal keepMounted={keepMounted} container={container}>\n <TooltipPrimitive.Positioner\n data-slot=\"tooltip-positioner\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n anchor={anchor}\n collisionBoundary={collisionBoundary}\n collisionPadding={collisionPadding}\n collisionAvoidance={collisionAvoidance}\n sticky={sticky}\n positionMethod={positionMethod}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n role=\"tooltip\"\n className={cn(\n \"overflow-hidden px-3 py-1.5\",\n \"rounded-[var(--ds-radius-sm)] border border-[var(--ds-border)]\",\n \"bg-[var(--ds-popover)] text-[color:var(--ds-popover-foreground)] shadow-[var(--ds-shadow-md)]\",\n \"text-[length:var(--ds-text-caption-lg)]\",\n \"open:animate-in open:fade-in-0 open:zoom-in-95\",\n \"closed:animate-out closed:fade-out-0 closed:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-[var(--ds-duration-fast)] ease-[var(--ds-ease-out)]\",\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport { useCallback, useEffect, useSyncExternalStore } from \"react\";\n\n/**\n * useCortenaTheme — the one theme bridge for every Cortena surface.\n *\n * cortena-design drives dark mode off `data-theme=\"light\" | \"dark\"` on <html>\n * and falls back to `prefers-color-scheme` when the attribute is absent. So the\n * hook has exactly three jobs, consolidated from the flux and engram copies:\n *\n * 1. Remember the last choice in localStorage and put it back before the\n * first paint (`applyStoredTheme`, or `themeInitScript` as a blocking\n * <script> for apps that cannot run a module that early).\n * 2. Listen for the message cortenaweb posts into an extension iframe on load\n * and on every theme change:\n *\n * iframe.contentWindow.postMessage({ type: \"cortena-theme\", colors }, \"*\")\n *\n * and apply the *mode* it implies. The host may say `mode` or `theme`\n * explicitly; otherwise the background colour's luminance decides.\n * 3. Expose `{ theme, resolvedTheme, setTheme }` so a settings toggle can\n * drive the same state.\n *\n * What it deliberately does NOT do is apply the individual colours in the\n * host's message. The palette comes from cortena-design tokens, the single\n * source of truth; writing the host's raw values onto `--ds-*` or `--color-*`\n * would silently override every token the design system publishes. The\n * `colors` object is read for its luminance only, never written to the DOM.\n */\n\nexport type CortenaTheme = \"light\" | \"dark\" | \"system\";\nexport type ResolvedCortenaTheme = \"light\" | \"dark\";\n\n/** The message cortenaweb posts into an embedded iframe. */\nexport interface CortenaThemeMessage {\n type: \"cortena-theme\";\n /** Explicit mode. Preferred when present. */\n theme?: CortenaTheme;\n /** Older name for `theme`, sent by some hosts. */\n mode?: CortenaTheme;\n /** Raw palette. Only `background` is read, and only to infer the mode. */\n colors?: Record<string, unknown>;\n}\n\nexport interface UseCortenaThemeOptions {\n /** localStorage key the choice persists under. Defaults to `\"cortena.theme\"`. */\n storageKey?: string;\n /**\n * Origins allowed to push a theme via postMessage. When omitted or empty,\n * every origin is accepted — matching cortenaweb, which posts with `\"*\"`\n * to cross-origin extensions. A same-origin embed should pass\n * `[window.location.origin]`.\n */\n allowedOrigins?: readonly string[];\n /** Set false to keep the state and DOM sync but ignore host messages. */\n listen?: boolean;\n}\n\nexport interface UseCortenaThemeResult {\n /** The stored choice; `\"system\"` when nothing has been chosen. */\n theme: CortenaTheme;\n /** What is actually painted: `theme`, or the OS scheme when `theme` is `\"system\"`. */\n resolvedTheme: ResolvedCortenaTheme;\n setTheme: (theme: CortenaTheme) => void;\n}\n\nexport const DEFAULT_THEME_STORAGE_KEY = \"cortena.theme\";\nexport const THEME_MESSAGE_TYPE = \"cortena-theme\";\nconst CHANGE_EVENT = \"cortena-theme-change\";\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\nfunction isTheme(value: unknown): value is CortenaTheme {\n return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\n/* ── DOM ─────────────────────────────────────────────────────────────────── */\n\n/**\n * Write the mode onto <html>. `\"system\"` removes the attribute so\n * cortena-design's `:root:not([data-theme])` fallback follows the OS.\n */\nexport function applyTheme(theme: CortenaTheme, root: HTMLElement = document.documentElement): void {\n if (theme === \"system\") {\n root.removeAttribute(\"data-theme\");\n } else {\n root.setAttribute(\"data-theme\", theme);\n }\n}\n\n/* ── storage ─────────────────────────────────────────────────────────────── */\n\nexport function readStoredTheme(storageKey: string = DEFAULT_THEME_STORAGE_KEY): CortenaTheme {\n try {\n const raw = window.localStorage.getItem(storageKey);\n return isTheme(raw) ? raw : \"system\";\n } catch {\n // Storage partitioned or blocked in a third-party iframe: the system\n // preference still applies, and the host will post the mode again.\n return \"system\";\n }\n}\n\nfunction writeStoredTheme(theme: CortenaTheme, storageKey: string): void {\n try {\n window.localStorage.setItem(storageKey, theme);\n } catch {\n /* cannot persist; the attribute is still applied for this document */\n }\n}\n\n/**\n * Put the remembered mode back on <html>. Tiny and synchronous on purpose:\n * call it at the top of the app entry, before `createRoot`, so a reload does\n * not flash the light palette at somebody reading in the dark. Returns what\n * it applied.\n */\nexport function applyStoredTheme(storageKey: string = DEFAULT_THEME_STORAGE_KEY): CortenaTheme {\n if (typeof document === \"undefined\") {\n return \"system\";\n }\n const theme = readStoredTheme(storageKey);\n applyTheme(theme);\n return theme;\n}\n\n/**\n * The same logic as `applyStoredTheme` as a self-contained IIFE string, for\n * consumers that inject a blocking `<script>` into <head> (Next.js\n * `dangerouslySetInnerHTML`, or a Vite index.html). It cannot import anything,\n * which is why it is duplicated rather than derived.\n */\nexport function getThemeInitScript(storageKey: string = DEFAULT_THEME_STORAGE_KEY): string {\n return `(function(){var k=${JSON.stringify(storageKey)};var d=document.documentElement;var v=null;try{v=localStorage.getItem(k)}catch(e){}if(v===\"light\"||v===\"dark\"){d.setAttribute(\"data-theme\",v)}else{d.removeAttribute(\"data-theme\")}})();`;\n}\n\n/** `getThemeInitScript()` for the default storage key. */\nexport const themeInitScript: string = getThemeInitScript();\n\n/* ── host message ────────────────────────────────────────────────────────── */\n\n/**\n * Infer the mode from a hex background colour by relative luminance. Any\n * other colour syntax is ignored, since the host only ever sends hex and a\n * wrong guess is worse than no change.\n */\nexport function themeFromBackground(background: unknown): ResolvedCortenaTheme | null {\n if (typeof background !== \"string\") {\n return null;\n }\n const match = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(background.trim());\n if (!match?.[1]) {\n return null;\n }\n const hex = match[1].length === 3 ? [...match[1]].map((c) => c + c).join(\"\") : match[1];\n const channel = (i: number) => {\n const c = parseInt(hex.slice(i, i + 2), 16) / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n const luminance = 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);\n return luminance < 0.5 ? \"dark\" : \"light\";\n}\n\nfunction isThemeMessage(data: unknown): data is CortenaThemeMessage {\n return (\n typeof data === \"object\" &&\n data !== null &&\n (data as { type?: unknown }).type === THEME_MESSAGE_TYPE\n );\n}\n\n/**\n * The mode a host message asks for, or null when it does not carry one.\n * Explicit `theme` / `mode` win; otherwise the background luminance decides.\n */\nexport function themeFromMessage(data: unknown): CortenaTheme | null {\n if (!isThemeMessage(data)) {\n return null;\n }\n if (isTheme(data.theme)) {\n return data.theme;\n }\n if (isTheme(data.mode)) {\n return data.mode;\n }\n return themeFromBackground(data.colors?.background);\n}\n\n/* ── store ───────────────────────────────────────────────────────────────── */\n\nfunction subscribeTheme(onChange: () => void): () => void {\n window.addEventListener(CHANGE_EVENT, onChange);\n window.addEventListener(\"storage\", onChange);\n return () => {\n window.removeEventListener(CHANGE_EVENT, onChange);\n window.removeEventListener(\"storage\", onChange);\n };\n}\n\n// jsdom (the extensions' test environment) has no matchMedia; treat its\n// absence as a light system scheme that never changes, rather than throwing.\nfunction schemeQuery(): MediaQueryList | null {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(DARK_QUERY)\n : null;\n}\n\nfunction subscribeScheme(onChange: () => void): () => void {\n const query = schemeQuery();\n query?.addEventListener(\"change\", onChange);\n const unsubscribeTheme = subscribeTheme(onChange);\n return () => {\n query?.removeEventListener(\"change\", onChange);\n unsubscribeTheme();\n };\n}\n\nfunction systemScheme(): ResolvedCortenaTheme {\n return schemeQuery()?.matches ? \"dark\" : \"light\";\n}\n\n/* ── hook ────────────────────────────────────────────────────────────────── */\n\nexport function useCortenaTheme(options: UseCortenaThemeOptions = {}): UseCortenaThemeResult {\n const { storageKey = DEFAULT_THEME_STORAGE_KEY, allowedOrigins, listen = true } = options;\n\n const theme = useSyncExternalStore(\n subscribeTheme,\n () => readStoredTheme(storageKey),\n () => \"system\" as const,\n );\n\n const resolvedTheme = useSyncExternalStore(\n subscribeScheme,\n () => (theme === \"system\" ? systemScheme() : theme),\n () => \"light\" as const,\n );\n\n const setTheme = useCallback(\n (next: CortenaTheme) => {\n writeStoredTheme(next, storageKey);\n applyTheme(next);\n window.dispatchEvent(new Event(CHANGE_EVENT));\n },\n [storageKey],\n );\n\n // Keep <html> in step with the store, including a change made in another tab.\n useEffect(() => {\n applyTheme(theme);\n }, [theme]);\n\n // Joined so a fresh array literal on every render does not re-subscribe.\n const originsKey = allowedOrigins?.join(\" \") ?? \"\";\n useEffect(() => {\n if (!listen) {\n return;\n }\n const origins = originsKey ? new Set(originsKey.split(\" \")) : null;\n const onMessage = (event: MessageEvent) => {\n if (origins && !origins.has(event.origin)) {\n return;\n }\n const next = themeFromMessage(event.data);\n if (next) {\n setTheme(next);\n }\n };\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n // A new array literal each render must not re-subscribe.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [listen, setTheme, allowedOrigins?.join(\"\u0000\")]);\n\n return { theme, resolvedTheme, setTheme };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAgB,GAAG,GAAG,QAA8B;CAClD,OAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;;;;;;;;;ACKA,MAAM,oBACJ;AAEF,MAAM,gBAAgB,IACpB;CACE;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,SACE;EACF,MAAM;EACN,aAAa;;EAEb,QAAQ;EACR,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAKA,SAAS,MAAM,EAAE,WAAW,SAAS,GAAG,SAAqB;CAC3D,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;CACvE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,yDAAyD,SAAS;EAChF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,8DAA8D,SAAS;EACrF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,6DAA6D,SAAS;EACpF,GAAI;CACL,CAAA;AAEL;;;;;;;;;ACzEA,MAAM,oBAAoB;AAE1B,MAAM,gBAAgB,IACpB;CACE;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,SAAS;EACT,SAAS;;EAET,MAAM;EACN,aAAa;;EAEb,QAAQ;EACR,MAAM;EACN,SAAS;EACT,WAAW;EACX,SACE;CACJ,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAKA,SAAS,MAAM,EAAE,WAAW,SAAS,GAAG,SAAqB;CAC3D,OACE,oBAAC,QAAD;EAAM,aAAU;EAAQ,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AAE9F;;;;;;;;;;;;;ACpCA,MAAM,iBAAiB,IACrB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,WACE;GACF,SACE;GACF,OACE;GACF,MACE;GACF,aACE;GACF,MAAM;EACR;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WAAW;EACb;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAKA,SAAS,OAAO,EAAE,WAAW,SAAS,MAAM,GAAG,SAAsB;CACnE,OACE,oBAACA,UAAD;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;EAAK,CAAC,GAAG,SAAS;EAC1D,GAAI;CACL,CAAA;AAEL;;;ACnDA,SAAgB,WACd,QACA,OACA,UACA,UACoB;CACpB,IAAI,CAAC,QAEH,OAAO,oBAACC,UAAD;EAAS,GAAI;EAAQ;CAAkB,CAAA;CAEhD,MAAM,UAAU,OAAO;CACvB,MAAM,QAAQ,OAAO;CACrB,OACE,oBAAC,SAAD;EAAS,GAAK,OAAO;EAAmC,GAAI;EACzD,UAAA,YAAY,MAAM;CACZ,CAAA;AAEb;;;ACTA,SAAS,WAAW,EAAE,WAAW,SAAS,MAAM,QAAQ,UAAU,UAAU,GAAG,SAA0B;CACvG,MAAM,UAAU,GAAG,eAAe;EAAE;EAAS;CAAK,CAAC,GAAG,YAAY,kCAAkC,SAAS;CAQ7G,OAAO,WAAW,QAAQ;EANxB,GAAG;EACH,aAAa;EACb,WAAW;EACX,iBAAiB,YAAY,KAAA;EAC7B,UAAU,WAAW,KAAK,MAAM;CAER,GAAQ,UAAU,GAAG;AACjD;;;;;;;ACbA,SAAS,KAAK,EAAE,WAAW,OAAO,QAAQ,QAAQ,UAAU,GAAG,SAAoB;CACjF,OAAO,WACL,QACA;EAEE,aAAa;EACb,eAAe,SAAS,KAAK,KAAA;EAC7B,GAAG;EACH,WAAW,GACT,4GACA,2GACA,SAAS,4BAA4B,oCACrC,SAAS,gEACT,SACF;CACF,GACA,UACA,KACF;AACF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,kCAAkC,SAAS;EACzD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;CACvE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,sDACA,yFACA,qCACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAsC;CAC7E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,mFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAe,WAAW,GAAG,YAAY,SAAS;EAAG,GAAI;CAAQ,CAAA;AACzF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,yEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;AC1FA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,eAAA;EACA,WAAW,GAAG,qEAAqE,SAAS;EAC5F,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;ACDA,MAAa,mBAAmB,UAAU;;AAG1C,SAAgB,OAAO,OAAuB;CAC5C,MAAM,IAAI;CACV,OAAO,iBAAmB,QAAQ,IAAK,KAAK,IAAK,EAAE;AACrD;;AAGA,MAAa,gBAAmC,MAAM,KAAK,EAAE,QAAQ,iBAAiB,IAAI,GAAG,MAC3F,OAAO,CAAC,CACV;AAEA,SAAS,SAAkB;CACzB,OAAO,OAAO,aAAa,eAAe,OAAO,qBAAqB;AACxE;;AAGA,SAAgB,UAAU,MAAc,IAA6B;CACnE,IAAI,CAAC,OAAO,GAAG,OAAO;CACtB,OAAO,iBAAiB,MAAM,SAAS,eAAe,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,KAAK;AACtF;;AAGA,SAAgB,QAAQ,MAAc,IAAyC;CAC7E,MAAM,MAAM,UAAU,MAAM,EAAE;CAC9B,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,MAAM,IAAI,OAAO,WAAW,GAAG;CAC/B,IAAI,OAAO,MAAM,CAAC,GAAG,OAAO,KAAA;CAC5B,IAAI,IAAI,SAAS,KAAK,GAEpB,OAAO,KADM,OAAO,WAAW,iBAAiB,SAAS,eAAe,CAAC,CAAC,QAAQ,KAAK;CAGzF,OAAO;AACT;AAEA,IAAI;AAEJ,SAAS,KAAK,GAAmB;CAC/B,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AACvC;;;;;;;AAQA,SAAgB,MAAM,KAAiC;CACrD,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,OAAO,KAAA;CAC9B,IAAI,UAAU,KAAA,GACZ,QAAQ,SAAS,cAAc,QAAQ,CAAC,CAAC,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;CAExF,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC;CAC1B,MAAM,YAAY;CAClB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC;CACzB,MAAM,IAAI,MAAM,aAAa,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;CACzC,OAAO,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC;AAC/D;;;;;AAMA,SAAgB,aAAa,OAAe,IAA6B;CACvE,OAAO,MAAM,UAAU,OAAO,EAAE,CAAC,KAAK,OAAO,MAAM;AACrD;;AAGA,SAAgB,iBAAiB,IAA+B;CAC9D,OAAO,cAAc,KAAK,GAAG,MAAM,aAAa,YAAY,IAAI,KAAK,EAAE,CAAC;AAC1E;;AAGA,SAAS,UAAU,KAAqB;CACtC,MAAM,KAAK,MAAc;EACvB,MAAM,IAAI,OAAO,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI;EACrD,OAAO,KAAK,SAAU,IAAI,UAAU,IAAI,QAAS,UAAU;CAC7D;CACA,OAAO,QAAS,EAAE,CAAC,IAAI,QAAS,EAAE,CAAC,IAAI,QAAS,EAAE,CAAC;AACrD;;;;;;AAOA,SAAgB,cAAc,IAA+C;CAC3E,MAAM,MAAM,aAAa,sBAAsB,EAAE;CACjD,MAAM,QAAQ,aAAa,mBAAmB,EAAE;CAChD,QAAQ,SAAiB;EACvB,MAAM,MAAM,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,OAAO,MAAM,IAAI;EACzE,OAAO,OAAO,UAAU,GAAG,IAAI,KAAM,QAAQ;CAC/C;AACF;;AAGA,SAAgB,cAAc,IAA8B;CAC1D,MAAM,KAAK,MAAM,UAAU,mBAAmB,EAAE,CAAC;CACjD,OAAO,KAAK,UAAU,EAAE,IAAI,KAAM;AACpC;;AAGA,SAAgB,aAAa,OAAwC;CACnE,MAAM,MAAM,MAAM,KAAK,MAAM;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,KAAK,MAAM,OAAO,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;CACzF,QAAQ,MAAc;EAEpB,MAAM,MADU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,CAC7C,KAAK,IAAI,SAAS;EACpC,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC;EAC/D,MAAM,IAAI,MAAM;EAChB,MAAM,IAAI,IAAI,MAAM;GAAC;GAAG;GAAG;EAAC;EAC5B,MAAM,IAAI,IAAI,IAAI,MAAM;EACxB,MAAM,OAAO,MAAc,KAAK,OAAO,EAAE,MAAM,OAAO,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,CAAC;EACnF,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;CACtD;AACF;;;;;;;;;;;;AA6BA,SAAgB,YAAY,IAAkC;CAC5D,MAAM,OAAO,cAAc,EAAE;CAI7B,MAAM,cAHY,OACd;EAAC;EAAoB;EAAoB;EAAoB;CAAkB,IAC/E;EAAC;EAAoB;EAAoB;EAAoB;CAAkB,EAAA,CACtD,KAAK,MAAM,aAAa,GAAG,EAAE,CAAC;CAC3D,MAAM,YAAY;EAAC;EAAc,OAAO,qBAAqB;EAAoB;CAAY,CAAC,CAAC,KAC5F,MAAM,aAAa,GAAG,EAAE,CAC3B;CACA,MAAM,yBAAyB,aAAa,UAAU;CAEtD,OAAO;EACL;EACA;EACA;EACA,uBAL4B,aAAa,SAKrB;EACpB,kBAAkB,MAChB,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,uBAAuB,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;EACvF,OAAO,aAAa,cAAc,EAAE;EACpC,SAAS,aAAa,mBAAmB,EAAE;CAC7C;AACF;;;;;;AAOA,SAAgB,kBAA0B;CACxC,MAAM,CAAC,SAAS,cAAc,SAAS,CAAC;CACxC,gBAAgB;EACd,IAAI,CAAC,OAAO,GAAG;EACf,MAAM,aAAa,YAAY,MAAM,IAAI,CAAC;EAC1C,MAAM,WAAW,IAAI,iBAAiB,IAAI;EAC1C,SAAS,QAAQ,SAAS,iBAAiB;GACzC,YAAY;GACZ,iBAAiB;IAAC;IAAc;IAAS;GAAO;EAClD,CAAC;EACD,MAAM,QAAQ,OAAO,aAAa,8BAA8B;EAChE,OAAO,mBAAmB,UAAU,IAAI;EACxC,aAAa;GACX,SAAS,WAAW;GACpB,OAAO,sBAAsB,UAAU,IAAI;EAC7C;CACF,GAAG,CAAC,CAAC;CACL,OAAO;AACT;;;ACxLA,MAAM,eAAe,MAAM,cAAwC,IAAI;;AAGvE,SAAgB,WAAqC;CACnD,OAAO,MAAM,WAAW,YAAY;AACtC;;;;;;;AAQA,SAAgB,YAAY,QAAiC,KAAa,OAAwB;CAChG,MAAM,QAAQ,SAAS;CACvB,IAAI,OAAO,OAAO,OAAO,MAAM;CAE/B,MAAM,YADO,SAAS,OAAO,KAAK,MAAM,IAAI,CAAC,EAAA,CACvB,QAAQ,GAAG;CACjC,OAAO,OAAO,YAAY,IAAI,WAAY,SAAS,CAAE;AACvD;;AAgCA,MAAM,aAAa;AACnB,MAAM,cAAc;;;;;;;;;AAUpB,SAAS,eAAe,EACtB,SAAS,CAAC,GACV,SAAS,KACT,aAAa,MACb,WAAW,OACX,WACA,OACA,UACA,GAAG,SACmB;CACtB,MAAM,CAAC,SAAS,cAAc,MAAM,SAAgC,IAAI;CACxE,MAAM,OAAO,MAAM,cAAc;EAC/B,MAAM,MAA8B,CAAC;EACrC,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,IAAI,WAAW,SAAS,YAAY,QAAQ,GAAG;EACtF,OAAO;CACT,GAAG,CAAC,MAAM,CAAC;CACX,MAAM,MAAM,MAAM,eAAe;EAAE;EAAQ;CAAQ,IAAI,CAAC,QAAQ,OAAO,CAAC;CAExE,OACE,oBAAC,aAAa,UAAd;EAAuB,OAAO;EAC5B,UAAA,oBAAC,OAAD;GACE,KAAK;GACL,aAAU;GACV,kBAAgB,WAAW,KAAK,KAAA;GAChC,WAAW,GACT,qHACA,aAAa,wBAAwB,uCACrC,6EACA,+EACA,gFACA,iFACA,+EACA,wEACA,gFACA,+EACA,+DACA,oEACA,qEACA,0EACA,gFACA,sEACA,qEACA,8EACA,+GACA,mDACA,SACF;GACA,OACE;IACE;IACA,GAAI,WAAW;KAAE,UAAU;KAAY,WAAW;IAAY,IAAI;IAClE,GAAG;IACH,GAAG;GACL;GAEF,GAAI;GAEH,UAAA,aACC,oBAACC,uBAAD;IACE,OAAM;IACN,QAAO;IACP,UAAU,WAAW,aAAa,KAAA;IAClC,WAAW,WAAW,cAAc,KAAA;IAEnC;GACkB,CAAA,IAErB;EAEC,CAAA;CACgB,CAAA;AAE3B;AAIA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,WAAW,GACT,sIACA,mFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,WAAW,EAAE,WAAW,WAAW,GAAG,SAAsC;CACnF,OACE,oBAAC,YAAD;EAAY,aAAU;EAAc,MAAK;EAAS,GAAI;EACnD;CACS,CAAA;AAEhB;;AAGA,SAAS,WAAW,EAAE,WAAW,WAAW,+BAA+B,GAAG,SAAsC;CAClH,OACE,oBAAC,YAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,qEAAqE,SAAS;EAC5F,GAAI;EAEH;CACS,CAAA;AAEhB;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EAAK,aAAU;EAAgB,WAAW,GAAG,iBAAiB,SAAS;EAAG,GAAI;EAC5E,UAAA,oBAAC,UAAD,EAAU,WAAU,8CAA+C,CAAA;CAChE,CAAA;AAET;AAiBA,SAAS,YAAY,OAAgB,WAAmD,OAAO,IAAqB;CAClH,IAAI,cAAc,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,UAAU,OAAO,IAAI;CACvG,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,eAAe;CAC3D,IAAI,SAAS,MAAM,OAAO;CAC1B,OAAO,OAAO,KAAK;AACrB;;;;;;AAOA,SAAS,oBAAoB,EAC3B,QACA,SACA,OACA,WACA,WACA,eACA,WACA,kBAC2B;CAC3B,MAAM,QAAQ,SAAS;CACvB,IAAI,CAAC,UAAU,CAAC,SAAS,QAAQ,OAAO;CACxC,MAAM,UAAU,iBAAiB,eAAe,KAAK,IAAI;CACzD,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,oIACA,+GACA,SACF;EANF,UAAA,CAQG,CAAC,aAAa,WAAW,QAAQ,YAAY,KAC5C,oBAAC,OAAD;GAAK,WAAU;GAAe,UAAA;EAAa,CAAA,IACzC,MACJ,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,QAAQ,KAAK,MAAM,MAAM;IACxB,MAAM,MAAM,OAAO,KAAK,WAAW,KAAK,QAAQ,CAAC;IACjD,MAAM,QAAQ,OAAO,OAAO;IAC5B,MAAM,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,UAAU,eAAe,IAAI;IAC5E,MAAM,OAAO,OAAO,SAAS,KAAK,QAAQ;IAC1C,OACE,qBAAC,OAAD;KAAe,WAAU;KAAzB,UAAA;MACG,gBAAgB,OACf,oBAAC,QAAD;OACE,eAAA;OACA,aAAU;OACV,WAAU;OACV,OAAO,EAAE,YAAY,OAAO;MAC7B,CAAA;MAEH,oBAAC,QAAD;OAAM,WAAU;OAAkD,UAAA;MAAW,CAAA;MAC7E,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,YAAY,KAAK,OAAO,WAAW,OAAO,IAAI,CAAC;MAC5C,CAAA;KACH;IAbK,GAAA,GAaL;GAET,CAAC;EACE,CAAA,CACF;;AAET;;AAGA,SAAS,aAAa,OAAqB;CACzC,OAAO,oBAACC,WAAD;EAAiB,SAAS,oBAAC,qBAAD,CAAsB,CAAA;EAAG,GAAI;CAAQ,CAAA;AACxE;;AAYA,SAAS,mBAAmB,EAAE,SAAS,gBAAgB,UAAU,WAAW,YAAqC;CAC/G,MAAM,QAAQ,SAAS;CACvB,IAAI,CAAC,SAAS,QAAQ,OAAO;CAC7B,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,8DACA,gFACA,kBAAkB,QAAQ,SAAS,QACnC,SACF;EAEC,UAAA,QAAQ,KAAK,MAAM,MAAM;GACxB,MAAM,MAAM,OAAO,KAAK,WAAW,KAAK,SAAS,CAAC;GAClD,MAAM,QAAQ,OAAO,OAAO;GAC5B,MAAM,OAAO,OAAO;GACpB,OACE,qBAAC,OAAD;IAAe,WAAU;IAAzB,UAAA,CACG,WAAW,OAAO,OACjB,oBAAC,MAAD,CAAO,CAAA,IAEP,oBAAC,QAAD;KACE,eAAA;KACA,WAAU;KACV,OAAO,EAAE,YAAY,KAAK,SAAS,eAAe,IAAI,GAAG;IAC1D,CAAA,GAEF,OAAO,SAAS,KAAK,KACnB;GAXK,GAAA,GAWL;EAET,CAAC;CACE,CAAA;AAET;;AAGA,SAAS,YAAY,OAAoB;CACvC,OAAO,oBAACC,QAAD;EAAgB,SAAS,oBAAC,oBAAD,CAAqB,CAAA;EAAG,GAAI;CAAQ,CAAA;AACtE;;;;ACnVA,SAAgB,cAAc,MAAsC;CAClE,OACE,MAAM,QAAQ,IAAI,KAClB,KAAK,SAAS,KACd,KAAK,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,MAAM,QAAS,EAAkB,IAAI,CAAC;AAE1F;;AAGA,SAAgB,SAAS,MAAoC;CAC3D,IAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG,OAAO;CACrE,MAAM,IAAI;CACV,OAAO,MAAM,QAAQ,EAAE,IAAI,KAAK,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAM,QAAQ,EAAE,MAAM;AACpF;;;;;;;AAQA,SAAgB,eAAe,QAAoC;CACjE,OAAO,OAAO,KAAK,KAAK,KAAK,OAAO;EAClC,IAAI;EACJ,MAAM,OAAO,QAAQ,KAAK,QAAQ,MAAM;GACtC,MAAM,QAAQ,OAAO,OAAO,EAAE,GAAG;GACjC,OAAO;IAAE,GAAG;IAAQ,GAAG,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;GAAK;EAC5F,CAAC;CACH,EAAE;AACJ;;;;;;AAOA,SAAgB,aAAa,MAAmE;CAC9F,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,QAAQ,OAAO;EAAE,SAAS,KAAA;EAAW,MAAM,CAAC;CAAE;CACnD,IAAI;CACJ,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,OAAO,UAAU,UAAU,KAAK,KAAK,GAAG;MACvC,IAAI,CAAC,WAAW,OAAO,UAAU,UAAU,UAAU;CAE5D,IAAI,CAAC,SAAS,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC;CAC5C,OAAO;EAAE;EAAS;CAAK;AACzB;;;;;;AAaA,SAAgB,OAAO,MAAkC,SAAkB,MAA0B;CACnG,IAAI,cAAc,IAAI,GAAG;EACvB,MAAM,QAAQ,WAAW;EACzB,MAAM,sBAAM,IAAI,IAA+B;EAC/C,MAAM,MAAgB,CAAC;EACvB,KAAK,MAAM,UAAU,MAAM;GACzB,MAAM,KAAK,OAAO,OAAO,EAAE;GAC3B,IAAI,KAAK,EAAE;GACX,KAAK,MAAM,SAAS,OAAO,MAAM;IAC/B,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC;IACzB,IAAI,CAAC,KAAK;KACR,MAAM,GAAG,QAAQ,MAAM,EAAE;KACzB,IAAI,IAAI,MAAM,GAAG,GAAG;IACtB;IACA,IAAI,MAAM,MAAM;GAClB;EACF;EACA,OAAO;GAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC;GAAG,SAAS;GAAO,MAAM,QAAQ;EAAI;CACtE;CACA,MAAM,OAAO;CACb,MAAM,WAAW,aAAa,IAAI;CAClC,OAAO;EACL;EACA,SAAS,WAAW,SAAS,WAAW;EACxC,MAAM,QAAQ,SAAS;CACzB;AACF;;AAGA,SAAgB,SAAS,MAAwE;CAC/F,OAAO,KAAK,KAAK,OAAO;EAAE,IAAI,OAAO,EAAE,EAAE;EAAG,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE;EAAG,OAAO,EAAE;CAAM,EAAE;AAC9F;;AAGA,SAAgB,UAAU,MAAgB,QAAmC;CAC3E,MAAM,MAAmB,CAAC;CAC1B,KAAK,MAAM,OAAO,MAAM,IAAI,OAAO;EAAE,OAAO;EAAK,GAAG,SAAS;CAAK;CAElE,KAAK,MAAM,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,MAAM,IAAI,OAAO,OAAQ;CACnF,OAAO;AACT;;AAGA,SAAgB,aAAa,MAAgC;CAC3D,OAAO,KAAK,OAAO,KAAA,KAAa,KAAK,SAAS,KAAA,IAAY,SAAS;AACrE;;AAGA,SAAgB,YAAY,MAAwB;CAClD,IAAI,QAAQ,MAAM,OAAO;CACzB,IAAI,SAAS,IAAI,GAAG,OAAO,KAAK,KAAK,WAAW,KAAK,KAAK,QAAQ,WAAW;CAC7E,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,IAAI,KAAK,WAAW,GAAG,OAAO;EAC9B,IAAI,cAAc,IAAI,GAAG,OAAO,KAAK,OAAO,MAAM,EAAE,KAAK,WAAW,CAAC;EACrE,OAAO;CACT;CACA,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,OAAO;EACb,OAAO,CAAC,KAAK,UAAU,UAAU,KAAK,UAAU,KAAA;CAClD;CACA,OAAO;AACT;;;;;;;;;;;;AC7DA,SAAgB,UAAU,IAAgC;CACxD,MAAM,aAAa,UAAU,kBAAkB,EAAE,KAAK;CACtD,MAAM,YAAY,QAAQ,wBAAwB,EAAE,KAAK;CACzD,MAAM,UAAU,QAAQ,qBAAqB,EAAE,KAAK;CACpD,MAAM,WAAW,QAAQ,kBAAkB,EAAE,KAAK;CAClD,MAAM,WAAW,QAAQ,kBAAkB,EAAE,KAAK;CAClD,MAAM,aAAa,aAAa,mBAAmB,EAAE;CACrD,MAAM,QAAQ,aAAa,yBAAyB,EAAE;CACtD,MAAM,SAAS,aAAa,eAAe,EAAE;CAC7C,MAAM,eAAe,aAAa,sBAAsB,EAAE;CAC1D,MAAM,eAAe,aAAa,sBAAsB,EAAE;CAC1D,MAAM,UAAU,aAAa,gBAAgB,EAAE;CAC/C,MAAM,oBAAoB,aAAa,2BAA2B,EAAE;CACpE,MAAM,OAAO,aAAa,aAAa,EAAE;CACzC,MAAM,SAAS,UAAU,kBAAkB,EAAE,KAAK;CAClD,MAAM,SAAS,UAAU,gBAAgB,EAAE,KAAK;CAChD,MAAM,SAAS,UAAU,gBAAgB,EAAE,KAAK;CAEhD,OAAO;EACL,YAAY;EACZ,MAAM;GAAE;GAAY,UAAU;GAAW,MAAM;EAAW;EAC1D,MAAM;GACJ,QAAQ,EAAE,MAAM;IAAE,QAAQ;IAAQ,aAAa;GAAE,EAAE;GACnD,OAAO;IACL,MAAM;KAAE,QAAQ;KAAQ,aAAa;IAAE;IACvC,MAAM;KAAE,MAAM;KAAO,UAAU;IAAU;GAC3C;GACA,QAAQ,EAAE,MAAM;IAAE,MAAM;IAAY,UAAU;IAAS,YAAY;GAAI,EAAE;EAC3E;EACA,MAAM,EAAE,MAAM;GAAE,QAAQ;GAAc,aAAa;EAAE,EAAE;EACvD,WAAW,EAAE,MAAM;GAAE,QAAQ;GAAc,aAAa;GAAG,eAAe;GAAG,iBAAiB;EAAM,EAAE;EACtG,SAAS;GACP,MAAM;IAAE,MAAM;IAAO,UAAU;GAAU;GACzC,OAAO,EAAE,MAAM;IAAE,MAAM;IAAY,UAAU;GAAQ,EAAE;GACvD,OAAO;IAAE,MAAM;KAAE,QAAQ;KAAQ,aAAa;IAAE;IAAG,MAAM;KAAE,MAAM;KAAO,UAAU;IAAU;GAAE;EAChG;EACA,QAAQ,EAAE,MAAM;GAAE,MAAM;GAAY,UAAU;GAAW,YAAY;EAAI,EAAE;EAC3E,MAAM,EAAE,MAAM;GAAE,MAAM;GAAY,UAAU;EAAU,EAAE;EACxD,SAAS;GAAE,WAAW;GAAc,iBAAiB;GAAG,MAAM;IAAE,MAAM;IAAO,UAAU;GAAU;EAAE;EACnG,aAAa;GACX,MAAM;IAAE,MAAM;IAAY,UAAU;IAAW,cAAc;IAAG,cAAc;GAAK;GACnF,MAAM;IAAE,QAAQ;IAAc,aAAa;IAAG,cAAc;IAAG,cAAc;GAAK;GAClF,SAAS;IAAE,QAAQ;IAAc,aAAa;IAAG,cAAc;IAAG,cAAc;GAAK;GACrF,QAAQ;IAAE,MAAM;IAAY,cAAc;IAAG,cAAc;GAAK;EAClE;EACA,SAAS;GACP,WAAW;IACT,YAAY;IACZ,OAAO;IACP,UAAU;IACV;IACA,cAAc;IACd,WAAW;IACX,QAAQ,aAAa;IACrB,SAAS,GAAG,OAAO,GAAG;GACxB;GACA,MAAM,EAAE,cAAc,SAAS;EACjC;CACF;AACF;;;;;;AAOA,SAAgB,eAA0B;CACxC,MAAM,UAAU,gBAAgB;CAEhC,MAAM,KADQ,SACC,CAAC,EAAE,WAAW;CAE7B,OAAO,cAAc,UAAU,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;AACnD;;;ACnHA,MAAM,UAAU;CACd,eAAe,aAAa,MAAM,OAAO,iBAAA,CAAkB;CAC3D,kBAAkB,aAAa,MAAM,OAAO,iBAAA,CAAkB;CAC9D,gBAAgB,aAAa,MAAM,OAAO,kBAAA,CAAmB;CAC7D,mBAAmB,aAChB,MAAM,OAAO,kBAAA,CAAmB;CACnC,eAAe,aAAa,MAAM,OAAO,iBAAA,CAAkB;CAC3D,kBAAkB,aAAa,MAAM,OAAO,iBAAA,CAAkB;CAC9D,gBAAgB,aAAa,MAAM,OAAO,kBAAA,CAAmB;AAC/D;AAYA,IAAI,yBAAS,IAAI,IAA6B;AAE9C,SAAS,MAAM,MAA+B;CAC5C,IAAI,YAAY,OAAO,IAAI,IAAI;CAC/B,IAAI,CAAC,WAAW;EACd,YAAY,MAAM,KAAK,aAAa,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,EAAE,EAAE;EACvE,OAAO,IAAI,MAAM,SAAS;CAC5B;CACA,OAAO;AACT;;AAGA,SAAgB,kBAAwB;CACtC,yBAAS,IAAI,IAAI;AACnB;;;;;;AAoBA,SAAS,cAAc,QAA+B;CACpD,MAAM,UAAU,gBAAgB;CAEhC,MAAM,KADQ,SACC,CAAC,EAAE,WAAW;CAE7B,OAAO,MAAM,cAAc;EACzB,MAAM,UAAU,iBAAiB,EAAE;EACnC,MAAM,OAAO,OAAO,KAAK,MAAM;EAC/B,IAAI,KAAK,WAAW,GAAG,OAAO;EAC9B,OAAO,KAAK,KAAK,KAAK,MAAM;GAC1B,MAAM,MAAM,OAAO,IAAI,EAAE;GACzB,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,QAAQ,IAAI,QAAQ;GAE5C,MAAM,QAAQ,SAAS,cAAc,MAAM;GAC3C,MAAM,MAAM,QAAQ;GACpB,GAAG,YAAY,KAAK;GACpB,MAAM,UAAU,iBAAiB,KAAK,CAAC,CAAC;GACxC,MAAM,OAAO;GACb,OAAO,WAAW,QAAQ,IAAI,QAAQ;EACxC,CAAC;CACH,GAAG;EAAC;EAAQ;EAAI;CAAO,CAAC;AAC1B;AAEA,SAAS,cAAc,MAAkB,MAAe,IAA2C;CACjG,MAAM,OAAO,KAAK,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK;CACzC,OAAO;EAAE,MAAM,QAAQ,KAAK,MAAM;EAAI,IAAI,MAAM,KAAK,KAAK,SAAS,MAAM;CAAG;AAC9E;;AAGA,SAAgB,UAAU,EAAE,MAAM,MAAM,QAAQ,UAAU,OAAO,QAAQ,gBAAgB,MAAM,MAAuB;CACpH,MAAM,QAAQ,aAAa;CAC3B,MAAM,SAAS,cAAc,MAAM;CACnC,MAAM,UAAU,gBAAgB;CAEhC,MAAM,KADQ,SACC,CAAC,EAAE,WAAW;CAE7B,MAAM,SAAS,MAAM,cAAc,YAAY,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;CAEjE,MAAM,SAAS,MAAM,cAAc,cAAc,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;CACnE,MAAM,SAAS,aAAa;CAC5B,MAAM,aAAa,MAAM,OAAO,KAAK;CACrC,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK;CACtC,MAAM,WAAW,MAAyB,OAAO,EAAE,KAAK;CAExD,QAAQ,MAAR;EACE,KAAK,WAAW;GACd,MAAM,YAAY,MAAM,SAAS,mBAAmB,aAAa;GAEjE,MAAM,OAAO,SAAS,IAAI,IAAI,eAAe,IAAmB,IAAK;GAErE,MAAM,QAAQ,KAAK,QAAQ,GAAG,MAAM,IAAI,EAAE,KAAK,QAAQ,CAAC;GACxD,MAAM,cACJ,UAAU,cACN;IAAE,MAAM;IAAsB,cAAc,OAAO;GAAsB,IACzE;IAAE,MAAM;IAAuB,cAAc,OAAO;GAAuB;GACjF,OACE,oBAAC,WAAD;IACE,MAAM;IACC;IACP,QAAQ;IACR,YAAY,OAAO;IACnB,aAAa;IACb,aAAa;IACb,cAAc,SAAS;IACvB,gBAAgB;IAChB,aAAa,kBAAkB,MAAc,eAAe,CAAC,IAAI,KAAA;IACjE,QAAQ;KAAE,KAAK;KAAG,OAAO,SAAS,KAAK;KAAG,QAAQ,SAAS,MAAM,KAAK;KAAG,MAAM,SAAS,MAAM,KAAK;IAAE;IACrG,SAAS;IACT,YAAY,SAAS,MAAM;KAAE,UAAU;KAAG,aAAa;IAAE,IAAI;IAC7D,UAAU,SAAS,MAAM;KAAE,UAAU;KAAG,aAAa;IAAE,IAAI;IAC3D,SACE,SACI,CACE;KACE,QAAQ;KACR,YAAY;KACZ,QAAQ;KACR,WAAW;KACX,WAAW;KACX,UAAU;KACV,aAAa;KACb,YAAY;IACd,CACF,IACA,CAAC;IAEP,SAAS,CAAC;GACX,CAAA;EAEL;EAEA,KAAK,YAAY;GACf,MAAM,YAAY,MAAM,SAAS,oBAAoB,cAAc;GACnE,MAAM,OAAO;GACb,MAAM,QAAQ,cAAc,MAAM,MAAM,EAAE;GAC1C,OACE,oBAAC,WAAD;IACE,MAAM;IACN,MAAM,MAAM;IACZ,IAAI,MAAM;IACH;IACP,QAAQ,OAAO,gBAAgB,CAAC;IAChC,YAAY,OAAO;IACnB,gBAAgB,OAAO;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,QAAQ;KAAE,KAAK;KAAI,OAAO;KAAI,QAAQ;KAAG,MAAM;IAAG;IAClD,aAAa,kBAAkB,MAAc,eAAe,CAAC,IAAI,KAAA;IACjE,SACE,SACI,CACE;KACE,QAAQ;KACR,WAAW;KACX,YAAY;KACZ,WAAW;KACX,WAAW;KACX,YAAY;KACZ,cAAc;KACd,eAAe;IACjB,CACF,IACA,CAAC;GAER,CAAA;EAEL;EAEA,KAAK,WAAW;GACd,MAAM,YAAY,MAAM,SAAS,mBAAmB,aAAa;GACjE,MAAM,OAAO;GACb,OACE,oBAAC,WAAD;IACE,MAAM;IACN,UAAU,aAAa,IAAI;IAC3B,OAAM;IACC;IACC;IACR,aAAa;IACb,aAAa,OAAO;IACpB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;IACtB,eAAe;IACf,YAAA;IACA,cAAc;IACd,QAAQ;KAAE,KAAK;KAAG,OAAO;KAAG,QAAQ;KAAG,MAAM;IAAE;IAC/C,aAAa,kBAAkB,MAAc,eAAe,CAAC,IAAI,KAAA;IACjE,SAAS,CAAC;GACX,CAAA;EAEL;EAEA,KAAK,YAAY;GAEf,MAAM,YAAY,MAAM,cAAc;GACtC,MAAM,OAAO;GACb,OACE,oBAAC,WAAD;IACE,MAAM;IACN,IAAI,aAAa,IAAI;IACrB,OAAM;IACC;IACC;IACR,wBAAA;IACA,YAAY;KAAE,MAAM;KAAS,WAAW,CAAC,CAAC,WAAW,GAAI,CAAC;IAAE;IAC5D,aAAa,OAAO;IACpB,aAAa;IACb,cAAc;IACd,iBAAA;IACA,UAAS;IACT,oBAAoB;IACpB,oBAAoB;IACpB,QAAQ;KAAE,KAAK;KAAG,OAAO;KAAG,QAAQ;KAAG,MAAM;IAAE;IAC/C,aAAa,kBAAkB,MAAc,eAAe,CAAC,IAAI,KAAA;GAClE,CAAA;EAEL;CACF;AACF;;;AC/MA,MAAM,SAAS;CAAE,KAAK;CAAG,OAAO;CAAG,QAAQ;CAAG,MAAM;AAAE;;;;;;;AAQtD,SAAgB,cAAc,EAC5B,MACA,MACA,QACA,SACA,MACA,SACA,QACA,MACA,SACA,kBAC0C;CAC1C,MAAM,MAAM,UACV,oBAAC,cAAD,EACE,WAAW,kBAAkB,UAAmB,eAAe,OAAO,KAAK,CAAC,IAAI,KAAA,EACjF,CAAA,IACC;CACJ,MAAM,MAAM,SAAS,oBAAC,aAAD,CAAc,CAAA,IAAI;CAEvC,QAAQ,MAAR;EACE,KAAK,OAAO;GACV,MAAM,EAAE,MAAM,SAAS,OAAO,MAAM,WAAW,OAAO,MAAoC,SAAS,IAAI;GACvG,OACE,qBAACC,YAAD;IAAU,MAAM;IAAM,QAAQ;IAA9B,UAAA;KACG,OAAO,oBAACC,iBAAD,EAAe,UAAU,MAAQ,CAAA,IAAI;KAC7C,oBAACC,SAAD;MAAO,SAAS;MAAO,UAAU;MAAO,UAAU;MAAO,YAAY;KAAI,CAAA;KACzE,oBAACC,SAAD;MAAO,UAAU;MAAO,UAAU;MAAO,eAAe;KAAiB,CAAA;KACxE;KACA;KACA,OAAO,KAAK,KAAK,MAChB,oBAACC,OAAD;MAEE,SAAS;MACT,MAAM;MACN,MAAM,YAAY,QAAQ,KAAK,CAAC;MAChC,SAAS,UAAU,UAAU,KAAA;MAC7B,QAAQ,UAAU,IAAI;OAAC;OAAG;OAAG;OAAG;MAAC;MACjC,YAAY;KACb,GAPM,GAON,CACF;IACO;;EAEd;EAEA,KAAK,QAAQ;GACX,MAAM,EAAE,MAAM,SAAS,OAAO,MAAM,WAAW,OAAO,MAAoC,SAAS,IAAI;GACvG,OACE,qBAACC,aAAD;IAAW,MAAM;IAAM,QAAQ;IAA/B,UAAA;KACG,OAAO,oBAACJ,iBAAD,EAAe,UAAU,MAAQ,CAAA,IAAI;KAC7C,oBAACC,SAAD;MAAO,SAAS;MAAO,UAAU;MAAO,UAAU;MAAO,YAAY;KAAI,CAAA;KACzE,oBAACC,SAAD;MAAO,UAAU;MAAO,UAAU;MAAO,eAAe;KAAiB,CAAA;KACxE;KACA;KACA,OAAO,KAAK,KAAK,MAChB,oBAACG,QAAD;MAEE,MAAK;MACL,SAAS;MACT,MAAM;MACN,QAAQ,YAAY,QAAQ,KAAK,CAAC;MAClC,aAAa;MACb,KAAK;MACL,WAAW,EAAE,GAAG,EAAE;KACnB,GARM,GAQN,CACF;IACQ;;EAEf;EAEA,KAAK,QAAQ;GACX,MAAM,EAAE,MAAM,SAAS,OAAO,MAAM,WAAW,OAAO,MAAoC,SAAS,IAAI;GACvG,OACE,qBAACC,aAAD;IAAW,MAAM;IAAM,QAAQ;IAA/B,UAAA;KACG,OAAO,oBAACN,iBAAD,EAAe,UAAU,MAAQ,CAAA,IAAI;KAC7C,oBAACC,SAAD;MAAO,SAAS;MAAO,UAAU;MAAO,UAAU;MAAO,YAAY;KAAI,CAAA;KACzE,oBAACC,SAAD;MAAO,UAAU;MAAO,UAAU;MAAO,eAAe;KAAiB,CAAA;KACxE;KACA;KACA,OAAO,KAAK,KAAK,MAChB,oBAACK,QAAD;MAEE,MAAK;MACL,SAAS;MACT,MAAM;MACN,QAAQ,YAAY,QAAQ,KAAK,CAAC;MAClC,MAAM,YAAY,QAAQ,KAAK,CAAC;MAChC,aAAa;MACb,aAAa;MACb,SAAS,UAAU,UAAU,KAAA;KAC9B,GATM,GASN,CACF;IACQ;;EAEf;EAEA,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,SAAS,SAAS,IAAoB;GAC5C,OACE,qBAACC,YAAD;IAAU,QAAQ;IAAlB,UAAA;KACG;KACA;KACD,oBAACC,OAAD;MACE,MAAM;MACN,SAAQ;MACR,SAAQ;MACR,aAAa,SAAS,UAAU,QAAQ;MACxC,aAAY;MACZ,cAAc,SAAS,UAAU,IAAI;MACrC,aAAa;MAEZ,UAAA,OAAO,KAAK,OAAO,MAClB,oBAACC,QAAD,EAAqB,MAAM,YAAY,QAAQ,MAAM,IAAI,CAAC,EAAI,GAAnD,MAAM,EAA6C,CAC/D;KACE,CAAA;IACG;;EAEd;EAEA,KAAK;EACL,KAAK,eAEH,OACE,qBAACC,gBAAD;GAAc,QAAQ;GAAtB,UAAA;IACG,OAAO,oBAACX,iBAAD,CAAgB,CAAA,IAAI;IAC5B,oBAACC,SAAD;KAAO,SAAQ;KAAI,MAAK;KAAS,MAAK;KAAI,UAAU;KAAO,UAAU;KAAO,YAAY;IAAI,CAAA;IAC5F,oBAACC,SAAD;KAAO,SAAQ;KAAI,MAAK;KAAS,MAAK;KAAI,UAAU;KAAO,UAAU;KAAO,eAAe;IAAiB,CAAA;IAC3G;IACA;IACAU,KAAO,KAAK,GAAG,MACd,oBAACC,WAAD;KAA4B,MAAM,OAAO,EAAE,EAAE;KAAG,MAAM,EAAE;KAAM,MAAM,YAAY,QAAQ,OAAO,EAAE,EAAE,GAAG,CAAC;IAAI,GAA7F,OAAO,EAAE,EAAE,CAAkF,CAC5G;GACW;;EAIlB,KAAK,SAAS;GACZ,MAAM,EAAE,MAAM,SAAS,OAAO,MAAM,WAAW,OAAO,MAAoC,SAAS,IAAI;GACvG,OACE,qBAACC,cAAD;IAAY,MAAM;IAAM,QAAQ;IAAhC,UAAA;KACG,OAAO,oBAACC,aAAD,CAAY,CAAA,IAAI;KACxB,oBAACC,kBAAD,EAAgB,SAAS,MAAQ,CAAA;KACjC,oBAACC,mBAAD;MAAiB,MAAM;MAAO,UAAU;KAAQ,CAAA;KAC/C;KACA;KACA,OAAO,KAAK,KAAK,MAChB,oBAACC,SAAD;MAEE,SAAS;MACT,MAAM;MACN,QAAQ,YAAY,QAAQ,KAAK,CAAC;MAClC,MAAM,YAAY,QAAQ,KAAK,CAAC;MAChC,aAAa;MACb,aAAa;KACd,GAPM,GAON,CACF;IACS;;EAEhB;EAEA,KAAK,UAAU;GACb,MAAM,SAAS,SAAS,IAAoB;GAC5C,OACE,qBAACC,eAAD;IAAa,QAAQ;IAArB,UAAA;KACG;KACA;KACD,oBAACC,UAAD;MAAQ,MAAM;MAAQ,SAAQ;MAAQ,SAAQ;MAC3C,UAAA,OAAO,KAAK,OAAO,MAClB,oBAACV,QAAD,EAAqB,MAAM,YAAY,QAAQ,MAAM,IAAI,CAAC,EAAI,GAAnD,MAAM,EAA6C,CAC/D;KACK,CAAA;IACG;;EAEjB;CACF;AACF;;;AC/FA,MAAa,iCAAyC,IAAI,IAAe;CACvE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,6BAAqC,IAAI,IAAe;CACnE;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAgB,YAAY,MAA8B;CACxD,OAAO,WAAW,IAAI,IAAI,IAAI,SAAS;AACzC;;;ACnGA,SAAS,WAAW,MAAiB,MAAe,SAAkB,MAA2B;CAC/F,QAAQ,MAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO,OAAO,MAAoC,SAAS,IAAI,CAAC,CAAC;EACnE,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO,SAAS,IAAoB,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;EACvD,KAAK;GACH,IAAI,SAAS,IAAI,GAAG,OAAO,KAAK,KAAK,IAAI,MAAM;GAC/C,OAAO,cAAc,IAAI,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;EAChE,KAAK;EACL,KAAK,eACH,OAAO,cAAc,IAAI,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;EAChE,KAAK;EACL,KAAK,YACH,QAAS,KAAmB,YAAY,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;EACrF,KAAK,YACH,OAAO,CAAC;CACZ;AACF;;;;;;;;AAgBA,IAAM,gBAAN,cAA4B,MAAM,UAAgE;CAChG,QAAQ;EAAE,QAAQ;EAAO,KAAK,KAAK,MAAM;CAAS;CAClD,OAAO,2BAA2B;EAChC,OAAO,EAAE,QAAQ,KAAK;CACxB;CACA,OAAO,yBAAyB,OAA2B,OAAyC;EAClG,OAAO,MAAM,aAAa,MAAM,MAAM,OAAO;GAAE,QAAQ;GAAO,KAAK,MAAM;EAAS;CACpF;CACA,cAAc;EACZ,gBAAgB;EAChB,KAAK,SAAS,EAAE,QAAQ,MAAM,CAAC;CACjC;CACA,SAAS;EACP,OAAO,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,IAAI,KAAK,MAAM;CAC1E;AACF;;;;;;;;;;;;;;;;;;;AAoBA,SAAS,MAA2B,EAClC,MACA,MACA,QACA,WAAW,OACX,SACA,MACA,SACA,QAAQ,cACR,QACA,OAAO,MACP,UAAU,MACV,gBACA,MACA,IACA,SACA,OACA,cACA,WACA,QACA,GAAG,SACa;CAChB,MAAM,SAAS,YAAY,IAAI;CAC/B,MAAM,QAAQ,YAAY,IAAI;CAC9B,MAAM,aAAa,MAAM,cACjB,UAAU,QAAQ,CAAC,IAAI,WAAW,MAAM,MAAM,SAAS,IAAI,GAAG,MAAM,GAC1E;EAAC;EAAM;EAAM;EAAS;EAAM;EAAQ;CAAK,CAC3C;CACA,MAAM,aAAa,UAAU,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS;CAC9D,MAAM,YAAY,iBAAiB,QAAQ,MAAM,UAAU;CAE3D,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI,SAAS,OAAO,oBAAC,cAAD,CAAe,CAAA;MAC9B,IAAI,WAAW,OAAO,oBAAC,YAAD,EAAA,UAAa,UAAsB,CAAA;MACzD,IAAI,OAAO,OAAO,oBAAC,YAAD,EAAA,UAAa,aAAyB,CAAA;MACxD,IAAI,WAAW,QAClB,OACE,oBAAC,eAAD;EACE,UAAU,GAAG,KAAK,GAAG;EACrB,WAAW,UACT,qBAAC,YAAD,EAAA,UAAA;GAAY;GACiB;GAC3B,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,SAAS;IACT,WAAU;IACX,UAAA;GAEO,CAAA;EACE,EAAA,CAAA;EAGd,UAAA,oBAAC,MAAM,UAAP;GAAgB,UAAU,oBAAC,cAAD,CAAe,CAAA;GACvC,UAAA,oBAAC,WAAD;IACQ;IACA;IACN,QAAQ;IACE;IACH;IACP,QAAQ;IACQ;IACV;IACF;GACL,CAAA;EACa,CAAA;CACH,CAAA;MAEZ;EACL,aAAa;EACb,OACE,oBAAC,eAAD;GACQ;GACA;GACN,QAAQ;GACC;GACH;GACG;GACT,QAAQ;GACF;GACG;GACO;EACjB,CAAA;CAEL;CAEA,OACE,oBAAC,gBAAD;EACE,aAAW;EACX,eAAa;EACb,iBAAe,WAAW,SAAS,WAAW;EAC9C,QAAQ;EACA;EACI;EACZ,WAAW,GAAG,SAAS;EACvB,GAAI;EAEH,UAAA;CACa,CAAA;AAEpB;;;ACtNA,SAAS,SAAS,EAAE,WAAW,eAAe,GAAG,SAAwB;CACvE,OACE,oBAACW,WAAa,MAAd;EACE,aAAU;EACK;EACf,WAAW,GACT,6GACA,sDACA,sHACA,gFACA,4IACA,8JACA,kEACA,oHACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,WAAa,WAAd;GACE,aAAU;GACV,WAAU;GAET,UAAA,gBAAgB,oBAAC,OAAD,EAAO,aAAa,EAAI,CAAA,IAAI,oBAAC,OAAD,EAAO,aAAa,EAAI,CAAA;EAC/C,CAAA;CACP,CAAA;AAEvB;;;AClCA,MAAM,cAAc,GAClB,6EACA,0EACA,uFACA,gFACF;;;;;;AAOA,SAAS,YAAY,EAAE,SAAS,WAAW,SAAS,WAAW,GAAG,SAA2B;CAC3F,IAAI,CAAC,SACH,OAAO;CAGT,OACE,qBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GACT,yEACA,qEACA,sFACA,sCACA,SACF;EACA,GAAI;EAVN,UAAA;GAYE,oBAAC,eAAD;IAAe,eAAA;IAAY,WAAU;GAA0B,CAAA;GAC/D,oBAAC,KAAD;IAAG,aAAU;IAAuB,WAAU;IAC3C,UAAA;GACA,CAAA;GACF,WAAW,YACV,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,UACC,oBAAC,UAAD;KAAQ,MAAK;KAAS,SAAS;KAAS,cAAW;KAAQ,WAAW;KACpE,UAAA,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA;IAC3B,CAAA,IACN,MACH,YACC,oBAAC,UAAD;KAAQ,MAAK;KAAS,SAAS;KAAW,cAAW;KAAU,WAAW;KACxE,UAAA,oBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;IACnB,CAAA,IACN,IACD;GACH,CAAA,IAAA;EACD;;AAET;;;;;;;;;;;ACjDA,MAAM,iBAAiB,GACrB,0HACA,8HACA,oDACA,qGACA,0CACA,sHACA,uIACA,mDACA,kHACF;AAIA,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAqB;CACxD,OAAO,oBAAC,SAAD;EAAa;EAAM,aAAU;EAAQ,WAAW,GAAG,gBAAgB,SAAS;EAAG,GAAI;CAAQ,CAAA;AACpG;;;;;;;;;;;;;ACDA,SAAS,QAAQ,EAAE,WAAW,OAAO,IAAI,OAAO,WAAW,OAAO,GAAG,SAAuB;CAC1F,OACE,oBAAC,QAAD;EACE,aAAU;EACV,aAAW;EACX,MAAK;EACL,cAAW;EACX,WAAW,GACT,+EACA,SAAS,YACL,qFACA,0DACJ,SACF;EACA,OAAO;GAAE,OAAO;GAAM,QAAQ;GAAM,GAAG;EAAM;EAC7C,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;;;;ACxBA,SAAS,aAAa,OAAiC;CACrD,OAAO,oBAACC,KAAc,MAAf,EAAoB,GAAI,MAAQ,CAAA;AACzC;AAEA,SAAS,oBAAoB,OAAoC;CAC/D,OAAO,oBAACA,KAAc,SAAf;EAAuB,aAAU;EAAwB,GAAI;CAAQ,CAAA;AAC9E;AAEA,SAAS,mBAAmB,OAAmC;CAC7D,OAAO,oBAACA,KAAc,QAAf;EAAsB,aAAU;EAAuB,GAAI;CAAQ,CAAA;AAC5E;AAEA,SAAS,kBAAkB,OAAkC;CAC3D,OAAO,oBAACA,KAAc,OAAf;EAAqB,aAAU;EAAsB,GAAI;CAAQ,CAAA;AAC1E;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,oBAACA,KAAc,aAAf,EAA2B,GAAI,MAAQ,CAAA;AAChD;AAEA,SAAS,uBAAuB,OAAuC;CACrE,OAAO,oBAACA,KAAc,YAAf;EAA0B,aAAU;EAA4B,GAAI;CAAQ,CAAA;AACrF;AAuBA,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,oBAAoB,EAC3B,WACA,MACA,OACA,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,aACA,WACA,GAAG,SACwB;CAC3B,OACE,oBAACA,KAAc,QAAf;EAAmC;EAAwB;EACzD,UAAA,oBAACA,KAAc,YAAf;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GAChB,WAAU;GAEV,UAAA,oBAACA,KAAc,OAAf;IACE,aAAU;IACV,WAAW,GAAG,gBAAgB,SAAS;IACvC,GAAI;GACL,CAAA;EACuB,CAAA;CACN,CAAA;AAE1B;AAEA,SAAS,uBAAuB,EAC9B,WACA,MACA,OACA,YACA,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,aACA,WACA,GAAG,SACwB;CAC3B,OACE,oBAACA,KAAc,QAAf;EAAmC;EAAwB;EACzD,UAAA,oBAACA,KAAc,YAAf;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GAChB,WAAU;GAEV,UAAA,oBAACA,KAAc,OAAf;IACE,aAAU;IACV,WAAW,GAAG,gBAAgB,SAAS;IACvC,GAAI;GACL,CAAA;EACuB,CAAA;CACN,CAAA;AAE1B;AAEA,MAAMC,kBAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;AACF;AAOA,SAAS,iBAAiB,EAAE,WAAW,OAAO,UAAU,WAAW,GAAG,SAAgC;CACpG,OACE,oBAACD,KAAc,MAAf;EACE,aAAU;EACV,cAAY,QAAQ,KAAK,KAAA;EACzB,gBAAc;EACd,WAAW,GACTC,iBACA,SAAS,QACT,YAAY,iBACV,+IACF,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,yBAAyB,EAAE,WAAW,UAAU,GAAG,SAA2C;CACrG,OACE,qBAACD,KAAc,cAAf;EACE,aAAU;EACV,WAAW,GAAGC,iBAAe,aAAa,SAAS;EACnD,GAAI;EAHN,UAAA,CAKE,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAACD,KAAc,uBAAf;IAAqC,aAAU;IAC7C,UAAA,oBAAC,OAAD,EAAO,WAAU,WAAY,CAAA;GACM,CAAA;EACjC,CAAA,GACL,QACyB;;AAEhC;AAEA,SAAS,sBAAsB,EAAE,WAAW,UAAU,GAAG,SAAwC;CAC/F,OACE,qBAACA,KAAc,WAAf;EACE,aAAU;EACV,WAAW,GAAGC,iBAAe,aAAa,SAAS;EACnD,GAAI;EAHN,UAAA,CAKE,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAACD,KAAc,oBAAf;IAAkC,aAAU;IAC1C,UAAA,oBAAC,QAAD,EAAQ,WAAU,sBAAuB,CAAA;GACT,CAAA;EAC9B,CAAA,GACL,QACsB;;AAE7B;AAMA,SAAS,kBAAkB,EAAE,WAAW,OAAO,GAAG,SAAiC;CACjF,OACE,oBAACA,KAAc,YAAf;EACE,aAAU;EACV,cAAY,QAAQ,KAAK,KAAA;EACzB,WAAW,GACT,6GACA,SAAS,QACT,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,sBAAsB,EAAE,WAAW,GAAG,SAAwC;CACrF,OACE,oBAACA,KAAc,WAAf;EACE,aAAU;EACV,WAAW,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAMA,SAAS,uBAAuB,EAC9B,WACA,OACA,UACA,GAAG,SAC2B;CAC9B,OACE,qBAACA,KAAc,gBAAf;EACE,aAAU;EACV,cAAY,QAAQ,KAAK,KAAA;EACzB,WAAW,GACTC,iBACA,gFACA,SAAS,QACT,SACF;EACA,GAAI;EATN,UAAA,CAWG,UACD,oBAAC,cAAD,EAAc,WAAU,UAAW,CAAA,CACP;;AAElC;AAEA,SAAS,qBAAqB,EAAE,WAAW,GAAG,SAAuC;CACnF,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GACT,wGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACrPA,SAAS,OACP,OACA;CACA,OAAO,oBAACC,SAAgB,MAAjB,EAAsB,GAAI,MAAQ,CAAA;AAC3C;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,iBAAiB,SAAS;EACxC,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAMA,SAAS,cAAc,EAAE,WAAW,OAAO,MAAM,UAAU,GAAG,SAA6B;CACzF,OACE,qBAACA,SAAgB,SAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,GACT,iFACA,SAAS,OAAO,6CAA6C,+CAC7D,iEACA,4FACA,sHACA,uDACA,yGACA,6CACA,kEACA,gGACA,qFACA,SACF;EACA,GAAI;EAjBN,UAAA,CAmBG,UACD,oBAACA,SAAgB,MAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,aAAD,CAAc,CAAA;EACM,CAAA,CACC;;AAE7B;AAsBA,SAAS,cAAc,EACrB,WACA,UACA,OAAO,UACP,QAAQ,SACR,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,uBAAuB,OACvB,WACA,GAAG,SACkB;CACrB,OACE,oBAACA,SAAgB,QAAjB;EAAmC;EACjC,UAAA,oBAACA,SAAgB,YAAjB;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GACM;GACtB,WAAU;GAEV,UAAA,oBAACA,SAAgB,OAAjB;IACE,aAAU;IACV,WAAW,GACT,wHACA,kEACA,iGACA,gBACA,kDACA,2DACA,+JACA,gEACA,SACF;IACA,GAAI;IAEH;GACoB,CAAA;EACG,CAAA;CACN,CAAA;AAE5B;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA2C;CAC9E,OACE,oBAACA,SAAgB,YAAjB;EACE,aAAU;EACV,WAAW,GACT,wGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAqC;CACjF,OACE,qBAACA,SAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GACT,uFACA,wHACA,gGACA,kEACA,qFACA,SACF;EACA,GAAI;EAVN,UAAA,CAYE,oBAACA,SAAgB,UAAjB;GAA0B,aAAU;GAAmB,WAAU;GAC9D;EACuB,CAAA,GAC1B,oBAACA,SAAgB,eAAjB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA;EACE,CAAA,CACX;;AAE1B;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAA0C;CACjF,OACE,oBAACA,SAAgB,WAAjB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,SAAS;EAChE,GAAI;CACL,CAAA;AAEL;;;;ACpOA,SAAgB,YAAiC,QAA2C;CAC1F,MAAM,MAAM,OAAO;CACnB,IAAI,IAAI,MAAM,OAAO,OAAO,IAAI,KAAK;CACrC,IAAI,OAAO,IAAI,WAAW,UAAU,OAAO,IAAI;CAC/C,OAAO,OAAO;AAChB;AAEA,SAAS,kBAAuC,OAA4B;CAC1E,OAAO,MACJ,sBAAsB,CAAC,CACvB,QAAQ,MAAM,EAAE,UAAU,MAAM,eAAe,UAAU,EAAE,cAAc,EAAE,UAAU,MAAM,YAAY;AAC5G;AAEA,SAAS,OAAO,OAA4B;CAC1C,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI,iBAAiB,MAAM,OAAO;CAClC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO;CACjG,OAAO,KAAK,UAAU,KAAK;AAC7B;;;;;;AAOA,SAAgB,WAAgC,OAAiD;CAC/F,OAAO,MAAM,wBAAwB,CAAC,CAAC;AACzC;AAEA,SAAgB,QACd,OACA,OAA4B,WAAW,KAAK,GAC/B;CACb,MAAM,UAAU,kBAAkB,KAAK;CACvC,OAAO;EACL,SAAS,QAAQ,IAAI,WAAW;EAChC,SAAS,KAAK,KAAK,QACjB,QAAQ,KAAK,WAAW;GACtB,MAAM,SAAS,OAAO,UAAU,MAAM;GACtC,OAAO,OAAO,SAAS,OAAO,IAAI,QAAQ,IAAI,IAAI,SAAS,OAAO,EAAE,CAAC;EACvE,CAAC,CACH;CACF;AACF;;;;;;;;;AAUA,MAAM,gBAAgB;AAEtB,SAAS,SAAS,OAA2B;CAC3C,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI,OAAO,iBAAiB,OAAO,MAAM,YAAY,IAAI,OAAO,KAAK;CAGrE,IAAI,OAAO,UAAU,YAAY,cAAc,KAAK,IAAI,GAAG,OAAO,IAAI;CACtE,OAAO,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,MAAM,MAAI,EAAE,KAAK;AACnE;;;;;AAMA,SAAgB,MACd,OACA,MACQ;CACR,MAAM,EAAE,SAAS,YAAY,QAAQ,OAAO,IAAI;CAChD,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,KAAK,SAAS,KAAK,IAAI,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM;AACtF;AAEA,SAAS,SAAS,MAAY,UAAwB;CACpD,MAAM,MAAM,IAAI,gBAAgB,IAAI;CACpC,MAAM,IAAI,SAAS,cAAc,GAAG;CACpC,EAAE,OAAO;CACT,EAAE,WAAW;CACb,EAAE,MAAM;CACR,SAAS,KAAK,YAAY,CAAC;CAC3B,EAAE,MAAM;CACR,EAAE,OAAO;CACT,iBAAiB,IAAI,gBAAgB,GAAG,GAAG,CAAC;AAC9C;AAEA,SAAgB,YACd,OACA,WAAW,UACX,MACM;CAEN,SACE,IAAI,KAAK,CAAC,KAAU,MAAM,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,yBAAyB,CAAC,GAC3E,GAAG,SAAS,KACd;AACF;;;;;AAMA,eAAsB,cACpB,OACA,WAAW,UACX,MACe;CACf,MAAM,EAAE,SAAS,YAAY,QAAQ,OAAO,IAAI;CAEhD,MAAM,WAAW,KAAI,OADC,OAAO,YAAA,CACA,SAAS;CACtC,MAAM,QAAQ,SAAS,aAAa,QAAQ;CAC5C,MAAM,UAAU,QAAQ,KAAK,QAAQ,OAAO;EAC1C;EACA,KAAK,OAAO,CAAC;EACb,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,SAAS,CAAC,CAAC;CACrD,EAAE;CACF,KAAK,MAAM,UAAU,SAAS,MAAM,OAAO,MAAM;CACjD,MAAM,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;CACpC,MAAM,SAAS,MAAM,SAAS,KAAK,YAAY;CAC/C,SACE,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,oEAAoE,CAAC,GAChG,GAAG,SAAS,MACd;AACF;;;;;;;;;AClFA,SAAS,sBAA2C,EAClD,QACA,OACA,WACA,GAAG,SAC+B;CAClC,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,SAAS,OAAO,YAAY;CAClC,MAAM,QAAQ,OAAO,UAAU,MAAM,SAAS;CAE9C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAC3B,OACE,oBAAC,OAAD;EAAK,aAAU;EAA2B,WAAW,GAAG,YAAY,SAAS;EAAG,GAAI;EACjF,UAAA;CACE,CAAA;CAIT,MAAM,QAAQ,OAAO,UAAU,WAAW,QAAQ,YAAY,MAAM;CAEpE,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,gDAGA,UAAU,QAAQ,sCAAsC,yBACxD,UAAU,YAAY,kBACtB,SACF;EACA,GAAI;EAVN,UAAA,CAYE,qBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,UAAU,CAAC;GACX,SAAS,UAAU,OAAO,wBAAwB,IAAI,KAAA;GACtD,WAAW,GACT,8FACA,qEACA,WAAW,sEACX,mEACA,yBACF;GAXF,UAAA,CAaE,oBAAC,QAAD;IAAM,WAAU;IAAY,UAAA;GAAY,CAAA,GACvC,UACC,WAAW,QACT,oBAAC,SAAD;IAAS,eAAA;IAAY,WAAU;GAAoD,CAAA,IACjF,WAAW,SACb,oBAAC,WAAD;IAAW,eAAA;IAAY,WAAU;GAAoD,CAAA,IAGrF,oBAAC,gBAAD;IACE,eAAA;IACA,WAAU;GACX,CAAA,IAED,IACE;EACR,CAAA,GAAA,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,qBAAD;GACE,cAAY,GAAG,MAAM;GACrB,WAAW,GAET,qIACA,UAAU,QAAQ,WAAW,WAC7B,wFACA,wFACA,4FACF;GAEA,UAAA,oBAAC,aAAD,EAAa,WAAU,WAAY,CAAA;EAChB,CAAA,GACrB,qBAAC,qBAAD;GAAqB,OAAO,UAAU,QAAQ,QAAQ;GAAtD,UAAA;IACG,UACC,qBAAC,mBAAD,EAAA,UAAA;KACE,qBAAC,kBAAD;MAAkB,eAAe,OAAO,cAAc,KAAK;MAA3D,UAAA,CACE,oBAAC,SAAD,CAAU,CAAA,GAAC,iBACK;;KAClB,qBAAC,kBAAD;MAAkB,eAAe,OAAO,cAAc,IAAI;MAA1D,UAAA,CACE,oBAAC,WAAD,CAAY,CAAA,GAAC,kBACG;;KACjB,SACC,qBAAC,kBAAD;MAAkB,eAAe,OAAO,aAAa;MAArD,UAAA,CACE,oBAAC,gBAAD,CAAiB,CAAA,GAAC,aACF;KAChB,CAAA,IAAA;IACa,EAAA,CAAA,IACjB;IACH,YAAY,UAAU,WAAW,oBAAC,uBAAD,CAAwB,CAAA,IAAI;IAC7D,SACC,qBAAC,mBAAD,EAAA,UAAA;KACE,qBAAC,kBAAD;MAAkB,eAAe,OAAO,IAAI,OAAO;MAAnD,UAAA,CACE,oBAAC,cAAD,CAAe,CAAA,GAAC,WACA;;KAClB,qBAAC,kBAAD;MAAkB,eAAe,OAAO,IAAI,KAAK;MAAjD,UAAA,CACE,oBAAC,eAAD,CAAgB,CAAA,GAAC,YACD;;KACjB,OAAO,YAAY,IAClB,qBAAC,kBAAD;MAAkB,eAAe,OAAO,IAAI,KAAK;MAAjD,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GAAC,QACM;KAChB,CAAA,IAAA;IACa,EAAA,CAAA,IACjB;IACH,UAAU,UAAU,oBAAC,uBAAD,CAAwB,CAAA,IAAI;IAChD,UACC,qBAAC,kBAAD;KAAkB,eAAe,OAAO,iBAAiB,KAAK;KAA9D,UAAA,CACE,oBAAC,QAAD,CAAS,CAAA,GAAC,cACM;IAChB,CAAA,IAAA;GACe;EACT,CAAA,CAAA,EAAA,CAAA,CACX;;AAET;;;;;;;AA0BA,SAAS,uBAA4C,EACnD,QACA,OACA,SACA,aACmC;CACnC,MAAM,MAAM,OAAO,eAAe;CAClC,MAAM,WAAW,IAAI,IAAa,MAAM,QAAQ,GAAG,IAAI,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;CACrF,MAAM,SAAS,UAAU,OAAO,OAAO,uBAAuB;CAC9D,MAAM,QACJ,WACA,OAAO,UAAU,MAAM,iBACvB,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAC7B,QAAQ,MAAsC,KAAK,QAAQ,OAAO,MAAM,QAAQ,CAAC,CACjF,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,CAAC,CAClD,KAAK,WAAW,EAAE,MAAM,EAAE;CAC/B,MAAM,QAAQ,SAAS,YAAY,MAAM;CAEzC,MAAM,UAAU,OAAgB,YAAqB;EACnD,MAAM,OAAO,IAAI,IAAI,QAAQ;EAC7B,IAAI,SAAS,KAAK,IAAI,KAAK;OACtB,KAAK,OAAO,KAAK;EACtB,OAAO,eAAe,KAAK,OAAO,MAAM,KAAK,IAAI,IAAI,KAAA,CAAS;CAChE;CAEA,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,qBAAC,qBAAD;EACE,aAAU;EACV,QAAQ,oBAAC,QAAD;GAAQ,SAAQ;GAAU,MAAK;GAAK,WAAW,GAAG,iBAAiB,SAAS;EAAI,CAAA;EAF1F,UAAA;GAIE,oBAAC,YAAD,CAAa,CAAA;GACZ;GACA,SAAS,OACR,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,GACT,iGACA,gIACF;IAEC,UAAA,SAAS;GACN,CAAA,IACJ;EACe;CACrB,CAAA,GAAA,qBAAC,qBAAD;EAAqB,OAAM;EAAQ,WAAU;EAA7C,UAAA,CACE,qBAAC,mBAAD,EAAA,UAAA;GACE,oBAAC,mBAAD,EAAA,UAAoB,MAAyB,CAAA;GAC5C,MAAM,WAAW,IAChB,oBAAC,OAAD;IAAK,WAAU;IAA8F,UAAA;GAExG,CAAA,IACH;GACH,MAAM,KAAK,SAAS;IACnB,MAAM,OAAO,KAAK;IAClB,MAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK;IACpC,OACE,qBAAC,0BAAD;KAEE,cAAc;KACd,SAAS,SAAS,IAAI,KAAK,KAAK;KAChC,kBAAkB,YAAY,OAAO,KAAK,OAAO,OAAO;KAJ1D,UAAA;MAMG,OAAO,oBAAC,MAAD,EAAM,WAAU,iDAAkD,CAAA,IAAI;MAC9E,oBAAC,QAAD;OAAM,WAAU;OAAmB,UAAA,KAAK,SAAS,OAAO,KAAK,KAAK;MAAQ,CAAA;MACzE,UAAU,KAAA,IACT,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA;MACG,CAAA,IACJ;KACoB;IAZnB,GAAA,OAAO,KAAK,KAAK,CAYE;GAE9B,CAAC;EACgB,EAAA,CAAA,GAClB,SAAS,OACR,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,uBAAD,CAAwB,CAAA,GACxB,oBAAC,kBAAD;GAAkB,eAAe,OAAO,eAAe,KAAA,CAAS;GAAG,WAAU;GAAiB,UAAA;EAE5E,CAAA,CAClB,EAAA,CAAA,IACA,IACe;CACT,CAAA,CAAA,EAAA,CAAA;AAElB;;AAYA,SAAS,qBAA0C,EAAE,OAAO,aAA6C;CACvG,MAAM,UAAU,MAAM,kBAAkB,CAAC,CAAC,QAAQ,MAAM,EAAE,WAAW,CAAC;CACtE,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,qBAAC,qBAAD;EACE,aAAU;EACV,cAAW;EACX,QAAQ,oBAAC,QAAD;GAAQ,SAAQ;GAAU,MAAK;GAAgB;EAAY,CAAA;EAHrE,UAAA,CAKE,oBAAC,WAAD,CAAY,CAAA,GAAC,MAEM;CACrB,CAAA,GAAA,qBAAC,qBAAD;EAAqB,OAAM;EAAM,WAAU;EAA3C,UAAA,CACE,qBAAC,mBAAD,EAAA,UAAA,CACE,oBAAC,mBAAD,EAAA,UAAmB,iBAAiC,CAAA,GACnD,QAAQ,KAAK,WACZ,oBAAC,0BAAD;GAEE,cAAc;GACd,SAAS,OAAO,aAAa;GAC7B,kBAAkB,YAAY,OAAO,iBAAiB,OAAO;GAE5D,UAAA,YAAY,MAAM;EACK,GANnB,OAAO,EAMY,CAC3B,CACgB,EAAA,CAAA,GAClB,CAAC,MAAM,uBAAuB,IAC7B,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,uBAAD,CAAwB,CAAA,GACxB,oBAAC,kBAAD;GAAkB,eAAe,MAAM,wBAAwB,IAAI;GAAG,UAAA;EAA0B,CAAA,CAChG,EAAA,CAAA,IACA,IACe;CACT,CAAA,CAAA,EAAA,CAAA;AAElB;AAYA,SAAS,oBAAyC,EAAE,OAAO,UAAU,aAA4C;CAC/G,MAAM,WAAW,MAAM,oBAAoB,CAAC,CAAC;CAC7C,OACE,qBAAC,cAAD,EAAA,UAAA,CACE,qBAAC,qBAAD;EACE,aAAU;EACV,cAAW;EACX,QAAQ,oBAAC,QAAD;GAAQ,SAAQ;GAAU,MAAK;GAAgB;EAAY,CAAA;EAHrE,UAAA,CAKE,oBAAC,UAAD,CAAW,CAAA,GAAC,QAEO;CACrB,CAAA,GAAA,qBAAC,qBAAD;EAAqB,OAAM;EAA3B,UAAA;GACE,oBAAC,kBAAD;IAAkB,eAAe,YAAY,OAAO,QAAQ;IAAG,UAAA;GAAqB,CAAA;GACpF,oBAAC,kBAAD;IAAkB,eAAe,KAAK,cAAc,OAAO,QAAQ;IAAG,UAAA;GAAuB,CAAA;GAC5F,SAAS,SACR,qBAAA,UAAA,EAAA,UAAA;IACE,oBAAC,uBAAD,CAAwB,CAAA;IACxB,qBAAC,kBAAD;KAAkB,eAAe,YAAY,OAAO,UAAU,QAAQ;KAAtE,UAAA;MAAyE;MAC/D,SAAS;MAAO;KACR;;IAClB,qBAAC,kBAAD;KAAkB,eAAe,KAAK,cAAc,OAAO,UAAU,QAAQ;KAA7E,UAAA;MAAgF;MACpE,SAAS;MAAO;KACV;;GAClB,EAAA,CAAA,IACA;EACe;CACT,CAAA,CAAA,EAAA,CAAA;AAElB;;;;;;AAyBA,SAAS,iBAAsC,EAC7C,OACA,oBAAoB,WACpB,aACA,UACA,eAAe,MACf,gBACA,WACA,GAAG,SAC0B;CAC7B,MAAM,eAAgB,MAAM,MAAM,gBAAuC;CACzE,MAAM,YAAY,MAAM,QAAQ,uBAAuB;CACvD,MAAM,iBAAiB,MACpB,kBAAkB,CAAC,CACnB,QAAQ,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,EAAE,aAAa,CAAC;CAC3E,MAAM,aAAa,MAAM,MAAM,cAAc,SAAS,KAAK,iBAAiB;CAC5E,MAAM,eAAe,MAAM,QAAQ,qBAAqB,MAAM,oBAAoB,CAAC,CAAC,OAAO,CAAC;CAE5F,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qCAAqC,SAAS;EAC5D,GAAI;EAHN,UAAA,CAKG,aAAa,SACZ,qBAAC,OAAD;GAAK,aAAU;GAA0B,WAAU;GAAnD,UAAA;IACE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAAiD,UAAA,aAAa;KAAa,CAAA,GAAC,WACxF;;IACL,cAAc;KAAE,MAAM,aAAa,KAAK,MAAM,EAAE,QAAQ;KAAG;IAAM,CAAC;IACnE,qBAAC,QAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAK,eAAe,MAAM,kBAAkB;KAAzE,UAAA,CAA4E,SAE1E,oBAAC,GAAD,CAAI,CAAA,CACE;;GACL;EAEL,CAAA,IAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG,YACC,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MACE,eAAA;MACA,WAAU;KACX,CAAA,GACD,oBAAC,OAAD;MACE,aAAU;MACV,MAAK;MACL,cAAW;MACX,aAAa;MACb,OAAO;MACP,WAAW,MAAM,MAAM,gBAAgB,EAAE,OAAO,KAAK;MACrD,WAAU;KACX,CAAA,CACE;IACH,CAAA,IAAA;IACH,eAAe,KAAK,WACnB,oBAAC,wBAAD,EAAgD,OAAS,GAA5B,OAAO,EAAqB,CAC1D;IACA,aACC,qBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;MACb,MAAM,mBAAmB;MACzB,MAAM,gBAAgB,EAAE;KAC1B;KANF,UAAA,CAOC,SAEC,oBAAC,GAAD,CAAI,CAAA,CACE;IACN,CAAA,IAAA;GACD;EAEP,CAAA,GAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG;IACD,oBAAC,sBAAD,EAA6B,MAAQ,CAAA;IACpC,eAAe,oBAAC,qBAAD;KAA4B;KAAO,UAAU;IAAiB,CAAA,IAAI;GAC/E;EACF,CAAA,CAAA;;AAET;AAYA,MAAM,qBAAqB;CAAC;CAAI;CAAI;CAAI;AAAG;AAE3C,SAAS,oBAAyC,EAChD,OACA,kBAAkB,oBAClB,WACA,GAAG,SAC6B;CAChC,MAAM,EAAE,WAAW,aAAa,MAAM,MAAM;CAC5C,MAAM,QAAQ,MAAM,YAAY;CAChC,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,OAAO,UAAU,IAAI,IAAI,YAAY,WAAW;CACtD,MAAM,KAAK,KAAK,IAAI,QAAQ,YAAY,KAAK,QAAQ;CAIrD,MAAM,aAHQ,gBAAgB,SAAS,QAAQ,IAC3C,kBACA,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAA,CAC/B,KAAK,OAAO;EAAE,OAAO,OAAO,CAAC;EAAG,OAAO,OAAO,CAAC;CAAE,EAAE;CAE3E,MAAM,aAAa,OAAe,MAAuB,SAAqB,aAC5E,oBAAC,QAAD;EAAQ,SAAQ;EAAU,MAAK;EAAU,cAAY;EAAgB;EAAmB;EACrF,UAAA;CACK,CAAA;CAGV,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,qDACA,mFACA,SACF;EACA,GAAI;EAPN,UAAA,CASE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,QAAD,EAAA,UAAM,gBAAmB,CAAA,GACzB,qBAAC,QAAD;IACE,OAAO;IACP,OAAO,OAAO,QAAQ;IACtB,gBAAgB,UAAU,MAAM,YAAY,OAAO,KAAK,CAAC;IAH3D,UAAA,CAKE,oBAAC,eAAD;KAAe,MAAK;KAAK,cAAW;KAAgB,WAAU;KAC5D,UAAA,oBAAC,aAAD,CAAc,CAAA;IACD,CAAA,GACf,oBAAC,eAAD,EAAA,UACG,UAAU,KAAK,SACd,oBAAC,YAAD;KAA6B,OAAO,KAAK;KACtC,UAAA,KAAK;IACI,GAFK,KAAK,KAEV,CACb,EACY,CAAA,CACT;GACL,CAAA,CAAA;EACL,CAAA,GAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,QAAD;IAAM,aAAU;IAAmB,aAAU;IAA7C,UAAA;KACG;KAAK;KAAE;KAAG;KAAK;IACZ;GACN,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,UAAU,cAAc,oBAAC,cAAD,CAAe,CAAA,SAAS,MAAM,UAAU,GAAG,CAAC,MAAM,mBAAmB,CAAC;KAC9F,UAAU,iBAAiB,oBAAC,aAAD,CAAc,CAAA,SAAS,MAAM,aAAa,GAAG,CAAC,MAAM,mBAAmB,CAAC;KACpG,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACG,cAAc,IAAI,IAAI,YAAY;OAAE;OAAI;MACrC;;KACL,UAAU,aAAa,oBAAC,cAAD,CAAe,CAAA,SAAS,MAAM,SAAS,GAAG,CAAC,MAAM,eAAe,CAAC;KACxF,UAAU,aAAa,oBAAC,eAAD,CAAgB,CAAA,SAAS,MAAM,SAAS,GAAG,CAAC,MAAM,eAAe,CAAC;IACvF;GACF,CAAA,CAAA;EACF,CAAA,CAAA;;AAET;;;;;;;;;;;;;;;AC3fA,MAAM,iBAAiB,kBAAkB;CACvC,SAAS,WAAoB,gBAC3B,MAAM,QAAQ,WAAW,IAAI,YAAY,SAAS,SAAS,IAAI,cAAc;CAC/E,aAAa,UACX,SAAS,QAAQ,UAAU,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAC/E,CAAC;AAED,MAAM,eAAe,cAAc;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,kBAAkB,uBAAuB;CACzC,gBAAgB,qBAAqB;CACrC,mBAAmB,wBAAwB;CAC3C,kBAAkB,uBAAuB;CACzC,iBAAiB,sBAAsB;CACvC,qBAAqB,0BAA0B;CAC/C,WAAW;EACT,gBAAgB;EAChB,QAAQ;EACR,cAAc;EACd,eAAe;EACf,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,YAAY;EACZ,OAAO;CACT;CACA,SAAS;EACP,cAAc;EACd,OAAO;EACP,UAAU;EACV,MAAM;CACR;CACA,YAAY,WAAqC;AACnD,CAAC;AAUD,SAAgB,oBAAiE;CAC/E,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAgB,qBAAqF;CACnG,OAAOC,qBAAwD;AACjE;;;;;;;;;AC3GA,SAAgB,aACd,QACkC;CAClC,OAAO,OAAO,QAAQ;EACpB,IAAI;EACJ,SAAS,EAAE,YAAY;GACrB,MAAM,MAAM,MAAM,yBAAyB;GAC3C,MAAM,OAAO,MAAM,0BAA0B,KAAK,CAAC;GACnD,OACE,oBAAC,UAAD;IACE,cAAW;IACX,SAAS;IACT,eAAe;IACf,kBAAkB,YAAY,MAAM,0BAA0B,QAAQ,OAAO,CAAC;GAC/E,CAAA;EAEL;EACA,OAAO,EAAE,UACP,oBAAC,UAAD;GACE,cAAW;GACX,SAAS,IAAI,cAAc;GAC3B,UAAU,CAAC,IAAI,aAAa;GAC5B,kBAAkB,YAAY,IAAI,eAAe,QAAQ,OAAO,CAAC;EAClE,CAAA;EAEH,MAAM;EACN,SAAS;EACT,SAAS;EACT,eAAe;EACf,cAAc;EACd,gBAAgB;EAChB,oBAAoB;EACpB,oBAAoB;EACpB,MAAM;GAAE,YAAY;GAAO,OAAO;GAAU,eAAe;GAAQ,iBAAiB;EAAO;CAC7F,CAAC;AACH;AAEA,SAAgB,aACd,QACkC;CAClC,OAAO,OAAO,QAAQ;EACpB,IAAI;EACJ,cAAc,oBAAC,QAAD;GAAM,WAAU;GAAU,UAAA;EAAY,CAAA;EACpD,OAAO,EAAE,UACP,IAAI,aAAa,IACf,oBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,cAAY,IAAI,cAAc,IAAI,iBAAiB;GACnD,iBAAe,IAAI,cAAc;GACjC,SAAS,IAAI,yBAAyB;GACtC,WAAW,GACT,gFACA,8GACA,8EACF;GAEA,UAAA,oBAAC,cAAD,EACE,WAAW,GACT,4FACA,IAAI,cAAc,KAAK,WACzB,EACD,CAAA;EACK,CAAA,IACN;EACN,MAAM;EACN,SAAS;EACT,SAAS;EACT,eAAe;EACf,cAAc;EACd,gBAAgB;EAChB,oBAAoB;EACpB,oBAAoB;EACpB,MAAM;GAAE,YAAY;GAAO,OAAO;GAAU,eAAe;GAAQ,iBAAiB;EAAO;CAC7F,CAAC;AACH;;;ACpEA,MAAM,QAAiB,CAAC;AAExB,SAAS,QAAQ,OAAuB;CACtC,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACjE;;AAGA,SAAS,QAAQ,OAA6C;CAC5D,MAAM,EAAE,MAAM,OAAO,GAAG,UAAU;CAClC,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAgB,gBACd,QACA,OACA,MACwB;CACxB,MAAM,SAAS,MAAM,WAAW,kBAAkB;CAClD,MAAM,CAAC,YAAY,MAAM,eAAmC,SAAS,UAAU,OAAQ;CAEvF,OAAO,aAAa,UAChB,iBAAiB,QAAQ,OAAO,IAAI,IACpC,iBAAiB,QAAQ,OAAO,IAAI;AAC1C;AAEA,SAAS,iBACP,QACA,OACA,MACwB;CACxB,MAAM,KAAK,MAAM,MAAM;CACvB,MAAM,OAAO,QAAQ,YAAY,CAAC,sBAAsB,EAAE;CAC1D,MAAM,WAAW,SAAS;CAC1B,MAAM,QAAQ,QAAQ;CAEtB,MAAM,OAAO,SAAS;EACpB,UAAU;GAAC,GAAG;GAAM;GAAQ;EAAK;EACjC,UAAU,EAAE,aAAa,MAAO,OAAO,MAAM;EAC7C,SAAS,QAAQ,KAAK,KAAK,CAAC;EAC5B,iBAAiB;CACnB,CAAC;CAED,MAAM,QAAQ,QAAQ,KAAK;CAC3B,MAAM,QAAQ,iBAAiB;EAC7B,UAAU;GAAC,GAAG;GAAM;GAAY;EAAK;EACrC,UAAU,EAAE,WAAW,aAAa,MAAO;GAAE,GAAG;GAAO,MAAM;EAAU,GAAG,MAAM;EAChF,kBAAkB;EAClB,mBAAmB,MAAwB,QAA4B;GAErE,OADe,IAAI,QAAQ,GAAG,MAAM,IAAI,EAAE,KAAK,QAAQ,CAC3C,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI,IAAI,SAAS,KAAA;EACpE;EACA,SAAS,QAAQ,KAAK,KAAK;EAC3B,iBAAiB;CACnB,CAAC;CAED,MAAM,WAAW,MAAM,cACd,MAAM,OAAO,MAAM,KAAK,MAAM,SAAS,MAAM,EAAE,IAAI,IAAI,OAC9D,CAAC,MAAM,IAAI,CACb;CAEA,IAAI,CAAC,OACH,OAAO;EACL,MAAM;EACN,OAAO,KAAA;EACP,WAAW;EACX,YAAY;EACZ,OAAO;EACP,eAAe,CAAC;EAChB,qBAAqB,CAAC;EACtB,aAAa;CACf;CAGF,IAAI,UACF,OAAO;EACL,MAAM;EACN,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE;EACjC,WAAW,MAAM;EACjB,YAAY,MAAM;EAClB,OAAO,MAAM,QAAQ,QAAQ,MAAM,KAAK,IAAI;EAC5C,eAAe,KAAK,MAAM,QAAQ;EAClC,qBAAqB;GACnB,IAAI,MAAM,eAAe,CAAC,MAAM,oBAAoB,MAAW,cAAc;EAC/E;EACA,aAAa,MAAM;CACrB;CAGF,OAAO;EACL,MAAM,KAAK,MAAM,QAAQ;EACzB,OAAO,KAAK,MAAM;EAClB,WAAW,KAAK;EAChB,YAAY,KAAK;EACjB,OAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK,IAAI;EAC1C,eAAe,KAAK,KAAK,QAAQ;EACjC,qBAAqB,CAAC;EACtB,aAAa;CACf;AACF;AAUA,SAAS,iBACP,QACA,OACA,MACwB;CACxB,MAAM,WAAW,SAAS;CAC1B,MAAM,QAAQ,QAAQ;CACtB,MAAM,QAAQ,QAAQ,KAAK;CAC3B,MAAM,WAAW,KAAK,UAAU,KAAK;CACrC,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,CAAC;CAExC,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS;EAAE;EAAU,GAAG;CAAE,CAAC;CAC7D,MAAM,cAAc,OAAO,aAAa,WAAW,OAAO,IAAI;CAC9D,MAAM,CAAC,OAAO,YAAY,MAAM,SAA0B;EACxD,OAAO,CAAC;EACR;EACA,MAAM;EACN,YAAY;EACZ,OAAO;CACT,CAAC;CAED,MAAM,iBAAiB,MAAM,aAAa,WAAW,MAAM,QAAQ;CACnE,MAAM,aAAa,WAAW,eAAe,SAAS,MAAM;CAC5D,MAAM,QAAQ,WACV,eAAe,SAAS,cACxB,EAAE,MAAM,aAAa,YAAY,MAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,SAAS;CACvF,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG;CAMhD,MAAM,WAAW,MAAM,OAAO,KAAK;CACnC,MAAM,gBAAgB;EACpB,SAAS,UAAU;CACrB,CAAC;CAED,MAAM,WAAW,QAAQ,KAAK;CAE9B,MAAM,gBAAgB;EACpB,MAAM,MAAM,SAAS;EACrB,IAAI,CAAC,OAAO,CAAC,OAAO;EACpB,MAAM,aAAa,IAAI,gBAAgB;EACvC,UAAU,OAAO;GAAE,GAAG;GAAG,YAAY;EAAK,EAAE;EAC5C,IAAI;GAAE,GAAG;GAAO,MAAM;EAAW,GAAG,WAAW,MAAM,CAAC,CAAC,MACpD,WAAW;GACV,IAAI,WAAW,OAAO,SAAS;GAC/B,UAAU,OAAO;IACf,OAAO,YAAY,EAAE,aAAa,WAAW,CAAC,GAAG,EAAE,OAAO,MAAM,IAAI,CAAC,MAAM;IAC3E;IACA,MAAM;IACN,YAAY;IACZ,OAAO;GACT,EAAE;EACJ,IACC,QAAiB;GAChB,IAAI,WAAW,OAAO,SAAS;GAC/B,UAAU,OAAO;IAAE,GAAG;IAAG,YAAY;IAAO,OAAO,QAAQ,GAAG;GAAE,EAAE;EACpE,CACF;EACA,aAAa,WAAW,MAAM;CAIhC,GAAG;EAAC;EAAU;EAAY;CAAK,CAAC;CAGhC,MAAM,OAAO,MAAM,cACV,WAAW,MAAM,MAAM,SAAS,MAAM,EAAE,IAAI,IAAK,MAAM,MAAM,EAAE,EAAE,QAAQ,OAChF,CAAC,MAAM,OAAO,QAAQ,CACxB;CACA,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE;CAClC,MAAM,cAAc,YAAY,UAAU,KAAA,KAAa,KAAK,SAAS;CAErE,IAAI,CAAC,OACH,OAAO;EACL,MAAM;EACN,OAAO,KAAA;EACP,WAAW;EACX,YAAY;EACZ,OAAO;EACP,eAAe,CAAC;EAChB,qBAAqB,CAAC;EACtB,aAAa;CACf;CAGF,OAAO;EACL;EACA;EACA,WAAW,MAAM,MAAM,WAAW,KAAK,CAAC,MAAM;EAC9C,YAAY,MAAM;EAClB,OAAO,MAAM;EACb,eAAe;GACb,UAAU,OAAO;IAAE,GAAG;IAAG,OAAO,CAAC;IAAG,MAAM;IAAI,OAAO;GAAK,EAAE;GAC5D,SAAS,MAAM,IAAI,CAAC;EACtB;EACA,qBAAqB;GACnB,IAAI,eAAe,CAAC,MAAM,YAAY,UAAU;IAAE;IAAU,GAAG,eAAe,SAAS;GAAE,CAAC;EAC5F;EACA;CACF;AACF;;;AC5NA,MAAM,aAAsB,CAAC;AAE7B,SAAS,aAAgB,OAAU,IAAe;CAChD,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,KAAK;CACtD,MAAM,gBAAgB;EACpB,IAAI,MAAM,GAAG;GACX,aAAa,KAAK;GAClB;EACF;EACA,MAAM,KAAK,iBAAiB,aAAa,KAAK,GAAG,EAAE;EACnD,aAAa,aAAa,EAAE;CAC9B,GAAG,CAAC,OAAO,EAAE,CAAC;CACd,OAAO,MAAM,IAAI,QAAQ;AAC3B;;;;;;;;;;;;;AAcA,SAAgB,aACd,SACwB;CACxB,MAAM,EACJ,SACA,YACA,UACA,YACA,YAAY,iBAAiB,SAC7B,WAAW,IACX,qBAAqB,OACrB,kBAAkB,OAClB,iBACA,gBAAgB,MAChB,kBAAkB,OAClB,qBAAqB,MACrB,sBAAsB,MACtB,eAAe,MACf,sBAAsB,MACtB,uBAAuB,OACvB,cACA,cACA,sBACA,mBAAmB,QACjB;CAEJ,MAAM,WAAW,WAAW,SAAS;CAIrC,MAAM,CAAC,cAAc,mBAAmB,MAAM,SAC3C,cAAc,gBAAuC,EACxD;CACA,MAAM,CAAC,eAAe,oBAAoB,MAAM,SAC9C,cAAc,iBAAiB,CAAC,CAClC;CACA,MAAM,CAAC,SAAS,cAAc,MAAM,SAAuB,cAAc,WAAW,CAAC,CAAC;CACtF,MAAM,CAAC,YAAY,iBAAiB,MAAM,SACxC,cAAc,cAAc;EAAE,WAAW;EAAG;CAAS,CACvD;CAEA,MAAM,cAAc,aAAa,cAAc,WAAW,mBAAmB,CAAC;CAI9E,MAAM,WAAW,KAAK,UAAU;EAAC;EAAa;EAAe;CAAO,CAAC;CACrE,MAAM,YAAY,MAAM,OAAO,QAAQ;CACvC,MAAM,gBAAgB;EACpB,IAAI,UAAU,YAAY,UAAU;EACpC,UAAU,UAAU;EACpB,eAAe,MAAO,EAAE,cAAc,IAAI,IAAI;GAAE,GAAG;GAAG,WAAW;EAAE,CAAE;CACvE,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,QAAQ,MAAM,eACX;EACL,GAAG,eAAe,KAAA;EAClB,SAAS,cAAc,SAAS,gBAAgB,KAAA;EAChD,MAAM,QAAQ,SAAS,UAAU,KAAA;EACjC,MAAM,WAAW;EACjB,UAAU,WAAW;CACvB,IACA;EAAC;EAAa;EAAe;EAAS,WAAW;EAAW,WAAW;CAAQ,CACjF;CAEA,MAAM,SAAS,gBAAqB,WAAW,aAAa,KAAA,GAAW,OAAO,cAAc;CAE5F,MAAM,OAA2B,WAAW,OAAO,OAAO,WAAW;CAIrE,MAAM,kBAAkB,MAAM,cAAc;EAC1C,MAAM,SAAS,mBAAwB;EACvC,MAAM,MAAsC,CAAC;EAC7C,IAAI,sBAAsB,CAAC,QAAQ,MAAM,MAAM,EAAE,OAAO,QAAQ,GAAG,IAAI,KAAK,aAAa,MAAM,CAAC;EAChG,IAAI,mBAAmB,CAAC,QAAQ,MAAM,MAAM,EAAE,OAAO,QAAQ,GAAG,IAAI,KAAK,aAAa,MAAM,CAAC;EAC7F,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,SAAS,OAAO,MAAM;GAC5B,IAAI,WAAW,aAAa,OAAO,aAAa,KAAA,GAC9C,IAAI,KAAK;IAAE,GAAG;IAAQ,UAAU;GAAQ,CAAC;QACpC,IAAI,WAAW,UAAU,OAAO,aAAa,KAAA,GAClD,IAAI,KAAK;IAAE,GAAG;IAAQ,UAAU;GAAiB,CAAC;QAElD,IAAI,KAAK,MAAM;EAEnB;EACA,OAAO;CACT,GAAG;EAAC;EAAS;EAAoB;CAAe,CAAC;CAEjD,MAAM,QAA6B,SAAS;EAC1C,UAAU,kBAAuB;EACjC,SAAS;EACT,MAAM,KAAK,SAAS,OAAO;EAC3B;EACA;EACA;EACA,OAAO;GAAE;GAAc;GAAe;GAAS;EAAW;EAC1D,sBAAsB;EACtB,uBAAuB;EACvB,iBAAiB;EACjB,oBAAoB;EACpB,iBAAiB;EACjB,eAAe;EACf,kBAAkB,YAAY,mBAAmB;EACjD,UAAU,WAAW,OAAO,QAAQ,KAAA;EACpC;EACA;EACA,iBAAiB,oBAAoB,wBAAwB,OAAO,KAAA;EACpE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB;EAClB,gBAAgB;CAClB,CAAC;CAGD,MAAM,eAAe,MAAM,MAAM;CACjC,MAAM,iBAAiB,MAAM,OAAO,oBAAoB;CACxD,eAAe,UAAU;CACzB,MAAM,iBAAiB,MAAM,OAAO,IAAI;CACxC,MAAM,gBAAgB;EACpB,IAAI,eAAe,SAAS;GAC1B,eAAe,UAAU;GACzB;EACF;EACA,eAAe,UAAU,MAAM,oBAAoB,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,QAAQ,CAAC;CAElF,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,CAAC,aAAa,kBAAkB,MAAM,SAAsC,IAAI;CACtF,MAAM,SAAS,MAAM,YACnB,OAAO,KAAwB,UAAkB,UAAmB;EAGlE,QAFa,MAAM,UAAU,QAAQ,CAAC,EAAE,UAAU,KAAA,EAC5B,YAAY,aAAA,GAClB,IAAI,UAAU,UAAU,KAAK;CAC/C,GACA,CAAC,OAAO,YAAY,CACtB;CACA,MAAM,UAAU,MAAM,eACb;EACL,MAAM;EACN,QAAQ,SAA+B,eAAe,IAAI;EAC1D,YAAY,eAAe,IAAI;EAC/B;CACF,IACA,CAAC,aAAa,MAAM,CACtB;CAQA,OAAO;EACL;EACY;EACZ;EACA,MAAM;EACN,OAXY,WACT,OAAO,SAAS,IACjB,mBAAmB,UACjB,MAAM,wBAAwB,CAAC,CAAC,KAAK,SACrC,MAAM,YAAY,CAAC,CAAC,KAAK;EAQ7B,WAAW,OAAO;EAClB,YAAY,OAAO;EACnB,OAAO,OAAO;EACd,SAAS,OAAO;EAChB,eAAe,OAAO;EACtB,aAAa,OAAO;EACpB;EACA;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;ACrLA,MAAM,mBAAmB;AACzB,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAmD9B,SAAS,UAA+B,OAA4B;CAClE,IAAI,cAAc,OAAO;EACvB,MAAM,EAAE,UAAU,GAAG,SAAS;EAC9B,OAAO,oBAAC,eAAD;GAAyB;GAAU,GAAI;EAAO,CAAA;CACvD;CACA,OAAO,oBAAC,gBAAD,EAAgB,GAAI,MAAQ,CAAA;AACrC;AAEA,SAAS,eAAoC,OAA2D;CACtG,MAAM,EACJ,WACA,WACA,YACA,WACA,cACA,SACA,oBACA,SACA,aACA,gBACA,mBACA,YACA,cACA,iBACA,cACA,gBACA,SACA,OACA,YACA,aACA,cACA,GAAG,YACD;CACJ,MAAM,WAAW,aAAkB;EACjC,GAAG;EACH,iBAAiB,QAAQ,mBAAmB,QAAQ,kBAAkB;CACxE,CAAC;CACD,OACE,oBAAC,eAAD;EACY;EACC;EACA;EACC;EACD;EACG;EACL;EACW;EACX;EACI;EACG;EACG;EACP;EACE;EACG;EACH;EACE;EACP;EACF;EACK;EACC;EACC;CACf,CAAA;AAEL;AAMA,SAAS,SACP,QACA,OACoF;CACpF,MAAM,SAAS,OAAO,YAAY;CAClC,IAAI,CAAC,QAAQ,OAAO;EAAE,OAAO,CAAC;EAAG,QAAQ,KAAA;EAAW,MAAM;CAAM;CAChE,IAAI,WAAW,SAAS;EACtB,MAAM,OAAO,MAAM,2BAA2B,CAAC,CAAC,GAAG,EAAE;EACrD,OAAO;GACL,OAAO;IAAE,UAAU;IAAU,MAAM,OAAO,SAAS,OAAO;GAAE;GAC5D;GACA,MAAM,MAAM,OAAO,OAAO;EAC5B;CACF;CACA,MAAM,QAAQ,MAAM,yBAAyB,CAAC,CAAC;CAC/C,OAAO;EACL,OAAO;GAAE,UAAU;GAAU,OAAO,OAAO,SAAS,KAAK;EAAE;EAC3D;EACA,MAAM,OAAO,OAAO,OAAO;CAC7B;AACF;AAEA,MAAM,aAAa;CAAE,OAAO;CAAa,QAAQ;CAAe,KAAK;AAAa;AAMlF,SAAS,aAAkC,EACzC,MACA,UACA,UAKC;CACD,MAAM,WAAW,KAAK,OAAO,UAAU,MAAM;CAC7C,MAAM,SAAS,OAAO,aAAa,WAAW,WAAW,CAAC;CAC1D,MAAM,UAAU,KAAK,SAAS;CAC9B,MAAM,CAAC,OAAO,YAAY,MAAM,SAAS,WAAW,OAAO,KAAK,OAAO,OAAO,CAAC;CAC/E,MAAM,OAAO,MAAM,OAAO,KAAK;CAE/B,MAAM,eAAe;EACnB,KAAK,UAAU;EACf,SAAS,QAAQ,KAAK;EACtB,OAAO;CACT;CACA,MAAM,eAAe;EACnB,IAAI,KAAK,SAAS;EAClB,MAAM,QAAQ,OAAO,QAAQ,OAAO,MAAM,KAAK,IAAI,OAAO,SAAS,WAAW,OAAO,KAAK,IAAI;EAC9F,SAAc,QAAQ,OAAO,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK;EAC5D,OAAO;CACT;CACA,MAAM,eAAe;EACnB,IAAI,KAAK,SAAS;EAClB,OAAO;CACT;CAEA,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAA;EACA,MAAM,OAAO,SAAS,WAAW,WAAW;EAC5C,OAAO;EACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACxC,UAAU,MAAM,EAAE,OAAO,OAAO;EAChC,QAAQ;EACR,YAAY,MAAM;GAEhB,EAAE,gBAAgB;GAClB,IAAI,EAAE,QAAQ,SAAS;IACrB,EAAE,eAAe;IACjB,OAAO;GACT,OAAO,IAAI,EAAE,QAAQ,UAAU;IAC7B,EAAE,eAAe;IACjB,OAAO;GACT;EACF;EACA,WAAU;CACX,CAAA;AAEL;AAQA,SAAS,cAAmC,EAC1C,UACA,WACA,WACA,YACA,YAAY,IACZ,eAAe,MACf,UAAU,WACV,oBACA,UAAU,MACV,aACA,gBACA,mBACA,YACA,eAAe,cACf,iBACA,eAAe,MACf,iBAAiB,UACjB,SACA,OACA,YACA,aACA,gBACiE;CACjE,MAAM,EAAE,OAAO,mBAAmB;CAClC,MAAM,OAAO,MAAM,YAAY,CAAC,CAAC;CACjC,MAAM,cAAc,MAAM,sBAAsB;CAChD,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,YAAY,cAAc,KAAK,SAAS;CAC9C,MAAM,YAAY,WAAW,SAAS;CACtC,MAAM,eAAe,aAAa,KAAK,WAAW;CAClD,MAAM,YAAY,CAAC,aAAa,KAAK,WAAW;CAChD,MAAM,iBAAiB,cAAc,YAAY,yBAAyB,KAAA;CAC1E,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAW,SAAS,SAAS,OAAO,WAAW;CAEnG,MAAM,YAAY,MAAM,OAAuB,IAAI;CACnD,MAAM,WAAW,MAAM,OAAyB,IAAI;CAIpD,MAAM,cAAc,eAAoD;EACtE,OAAO,KAAK;EACZ,SAAS;EACT,wBAAwB,UAAU;EAClC,oBAAoB;EACpB,UAAU;EACV,aAAa,UAAU,KAAK,MAAM,EAAE,MAAM;EAE1C,iBAAiB,YAAY;GAC3B,IAAI,SAAS,QAAQ,sBAAsB,CAAC,CAAC;GAC7C,MAAM,OAAO,QAAQ;GACrB,IAAI,MAAM,QAAQ,SAAS,qBAAqB,UAAU,KAAK,sBAAsB,CAAC,CAAC;GACvF,OAAO;EACT;CACF,CAAC;CACD,MAAM,eAAe,YAAY,YAAY,gBAAgB,IAAI;CACjE,MAAM,aAAa,cAAc,SAAS,aAAa,EAAE,CAAE,QAAQ;CACnE,MAAM,gBAAgB,cAAc,SAChC,YAAY,aAAa,IAAI,aAAa,aAAa,SAAS,EAAE,CAAE,MACpE;CAIJ,MAAM,WAAW,MAAM,aACpB,UAAyC;EACxC,IAAI,mBAAmB,cAAc,CAAC,SAAS,eAAe,SAAS,YAAY;EACnF,MAAM,KAAK,MAAM;EACjB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,eAAe,uBAAuB,SAAS,cAAc;CACvG,GACA,CAAC,gBAAgB,QAAQ,CAC3B;CAIA,MAAM,CAAC,SAAS,cAAc,MAAM,SAAoB;EAAE,GAAG;EAAI,GAAG;CAAE,CAAC;CACvE,MAAM,eAAe,MAAM,OAAyB,IAAI;CAExD,MAAM,eAAe,UACnB,SAAS,SAAS,cAChB,oBAAoB,MAAM,EAAE,qBAAqB,MAAM,EAAE,GAC3D,KAAK;CAEP,MAAM,YAAY,MAAM,aACrB,UAAqB;EACpB,MAAM,KAAK,YAAY,KAAK;EAC5B,IAAI,IAAI;GACN,WAAW,KAAK;GAChB,GAAG,MAAM;GACT;EACF;EACA,IAAI,aAAa,MAAM,KAAK,GAAG;GAC7B,aAAa,UAAU;GACvB,WAAW,KAAK;GAChB,YAAY,cAAc,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;EACtD;CACF,GAEA,CAAC,WAAW,WAAW,CACzB;CAEA,MAAM,gBAAgB;EACpB,MAAM,QAAQ,aAAa;EAC3B,IAAI,CAAC,OAAO;EACZ,MAAM,KAAK,YAAY,KAAK;EAC5B,IAAI,IAAI;GACN,aAAa,UAAU;GACvB,GAAG,MAAM;EACX;CACF,CAAC;CAED,MAAM,aAAa,UAAiD;EAClE,MAAM,SAAS,MAAM;EAErB,IAAI,CAAC,SAAS,SAAS,SAAS,MAAM,GAAG;EACzC,IAAI,SAAS,QAAQ,MAAM;EAC3B,MAAM,OAAO,OAAO,QAAqB,kCAAkC;EAC3E,IAAI,CAAC,MAAM;EACX,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;EACtC,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;EACtC,MAAM,UAAU,KAAK,SAAS;EAC9B,MAAM,UAAU,WAAW;EAC3B,MAAM,eAAe,WAAW;EAEhC,QAAQ,MAAM,KAAd;GACE,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE,GAAG,KAAK,IAAI,SAAS,IAAI,CAAC;KAAG;IAAE,CAAC;IAC5C;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC;KAAG;IAAE,CAAC;IACvC;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE;KAAG,GAAG,KAAK,IAAI,SAAS,IAAI,CAAC;IAAE,CAAC;IAC5C;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE;KAAG,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAAE,CAAC;IACtC;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU,MAAM,UAAU;KAAE,GAAG;KAAI,GAAG;IAAE,IAAI;KAAE;KAAG,GAAG;IAAE,CAAC;IACvD;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU,MAAM,UAAU;KAAE,GAAG;KAAS,GAAG;IAAQ,IAAI;KAAE;KAAG,GAAG;IAAQ,CAAC;IACxE;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE,GAAG,KAAK,IAAI,SAAS,IAAI,EAAE;KAAG;IAAE,CAAC;IAC7C;GACF,KAAK;IACH,MAAM,eAAe;IACrB,UAAU;KAAE,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE;KAAG;IAAE,CAAC;IACxC;GACF,KAAK,SAAS;IACZ,IAAI,CAAC,cAAc;IACnB,IAAI,MAAM,IAAI;KACZ,MAAM,SAAS,YAAY;KAC3B,IAAI,QAAQ,WAAW,GAAG;MACxB,MAAM,eAAe;MACrB,OAAO,cAAc,KAAA,GAAW,MAAM,QAAQ;KAChD;KACA;IACF;IACA,MAAM,MAAM,KAAK;IACjB,MAAM,SAAS,YAAY;IAC3B,IAAI,OAAO,UAAU,OAAO,UAAU,MAAM,UAAU;KACpD,MAAM,eAAe;KACrB,SAAS,QAAQ,MAAM;MAAE,OAAO,IAAI;MAAI,UAAU,OAAO;KAAG,CAAC;IAC/D;IACA;GACF;GACA,KAAK,KAAK;IACR,IAAI,CAAC,gBAAgB,MAAM,IAAI;IAC/B,MAAM,MAAM,KAAK;IACjB,IAAI,KAAK,aAAa,GAAG;KACvB,MAAM,eAAe;KACrB,IAAI,eAAe;IACrB;IACA;GACF;GACA,SACE;EACJ;CACF;CAEA,MAAM,WAAW,UAA8C;EAC7D,MAAM,OAAQ,MAAM,OAAuB,QAAqB,kCAAkC;EAClG,IAAI,CAAC,QAAQ,CAAC,SAAS,SAAS,SAAS,IAAI,GAAG;EAChD,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;EACtC,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;EACtC,YAAY,MAAO,EAAE,MAAM,KAAK,EAAE,MAAM,IAAI,IAAI;GAAE;GAAG;EAAE,CAAE;CAC3D;CAEA,MAAM,eAAe,GAAW,MAAe,QAAQ,MAAM,KAAK,QAAQ,MAAM,IAAI,IAAI;CAIxF,MAAM,cAAc,YAAY,YAAY,gBAAgB;CAC5D,MAAM,cAAc,YAAY,YAAY,gBAAgB;CAC5D,MAAM,cAAc,SAAS,QAAQ;CAErC,MAAM,aAAa,KAAwB,OAAe,iBAA0B;EAClF,MAAM,QAAQ,IAAI,gBAAgB;EAClC,MAAM,WAAW,MAAM,WAAW,SAAS,KAAK,OAAO,YAAY,MAAM,KAAK;EAC9E,MAAM,UAAU,aAAa,KAAK,MAAM,SAAS;EACjD,MAAM,WAAW,IAAI,cAAc;EACnC,MAAM,SAAS,eAAe,QAAQ,IAAI,OAAO;EACjD,MAAM,WAAW,sBAAsB,IAAI,cAAc;EAEzD,MAAM,cAAc,MAA+B,MAAc;GAC/D,MAAM,SAAS,KAAK;GACpB,MAAM,OAAO,OAAO,UAAU;GAC9B,MAAM,MAAM,SAAS,QAAQ,KAAK;GAClC,MAAM,YAAY,aAAa,UAAU,IAAI,MAAM,YAAY,aAAa,OAAO;GACnF,MAAM,UAAU,QAAQ,MAAM,QAAQ;GACtC,OACE,oBAAC,MAAD;IAEE,MAAK;IACL,aAAU;IACV,kBAAgB;IAChB,kBAAgB;IAChB,eAAa,IAAI;IACjB,oBAAkB,IAAI,OAAO,KAAK,KAAA;IAClC,iBAAe,UAAU,KAAK,KAAA;IAC9B,gBAAc,YAAY,KAAK,KAAA;IAC/B,iBAAe,IAAI;IACnB,UAAU,YAAY,OAAO,CAAC;IAC9B,OAAO;KAAE,OAAO,OAAO,QAAQ;KAAG,GAAG,IAAI;IAAM;IAC/C,eACE,WAAW,CAAC,kBACF,SAAS,QAAQ,MAAM;KAAE,OAAO,IAAI;KAAI,UAAU,OAAO;IAAG,CAAC,IACnE,KAAA;IAEN,WAAW,GACT,sCACA,YAAY,gBAAgB,aAC5B,WAAW,MAAM,SAAS,UAC1B,yFAGA,IAAI,UACF,6RACF,IAAI,WAAW,WAAW,IAAI,QAAQ,4CACtC,IAAI,WAAW,SAAS,IAAI,QAAQ,2CACpC,CAAC,aAAa,YACd,MAAM,aACR;IAEC,UAAA,YACC,oBAAC,cAAD;KACQ;KACI;KACV,cAAc;MACZ,aAAa,UAAU;OAAE,GAAG;OAAO;MAAE;KACvC;IACD,CAAA,IAED,oBAAC,MAAM,YAAP,EAAwB,KAAO,CAAA;GAE/B,GA3CG,KAAK,EA2CR;EAER;EAEA,OACE,qBAAC,MAAM,UAAP,EAAA,UAAA,CACE,qBAAC,MAAD;GACE,MAAK;GACL,aAAU;GACV,cAAY;GACZ,iBAAe,WAAW,KAAK,KAAA;GAC/B,eAAa,SAAS,KAAK,KAAA;GAC3B,iBAAe,WAAW,KAAK,KAAA;GAC/B,iBAAe,QAAQ;GACvB,iBAAe,MAAM,QAAQ,qBAAqB,WAAW,KAAA;GAC7D,KAAK,YAAY,YAAY,iBAAiB,KAAA;GAC9C,SAAS,cAAc,MAAM,WAAW,IAAI,UAAU,CAAC,IAAI,KAAA;GAC3D,WAAW,GACT,4GACA,0EAGA,6CACA,cAAc,kBACd,eAAe,IAAI,QAAQ,CAC7B;GAnBF,UAAA;IAqBG,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,MAAM,MAAM,WAAW,MAAM,CAAC,CAAC;IAC7D,oBAAC,MAAD;KAAI,eAAA;KAAY,aAAU;KAAoB,WAAU;IAAO,CAAA;IAC9D,MAAM,MAAM,OAAO,CAAC,CAAC,KAAK,MAAM,MAAM,WAAW,MAAM,UAAU,CAAC,CAAC;GAClE;EACH,CAAA,GAAA,WACC,oBAAC,MAAD;GAAI,MAAK;GAAM,aAAU;GAAoB,WAAU;GACrD,UAAA,oBAAC,MAAD;IACE,MAAK;IACL,SAAS,WAAW;IACpB,WAAU;IAET,UAAA,mBAAmB,GAAG;GACrB,CAAA;EACF,CAAA,IACF,IACU,EAAA,GArCK,IAAI,EAqCT;CAEpB;CAEA,MAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,MAAM,WAAW,QAAQ,EAAE,IAAI,GAAG,MAC5F,qBAAC,MAAD;EAA0B,eAAA;EAAY,aAAU;EAA0B,WAAU;EAApF,UAAA,CACG,YAAY,KAAK,WAChB,oBAAC,MAAD;GAAoB,WAAW;GAAa,OAAO,EAAE,OAAO,OAAO,QAAQ,EAAE;GAC3E,UAAA,oBAAC,UAAD,EAAU,WAAU,cAAe,CAAA;EACjC,GAFK,OAAO,EAEZ,CACL,GACD,oBAAC,MAAD,EAAI,WAAU,MAAO,CAAA,CACnB;CAPK,GAAA,YAAY,GAOjB,CACL;CAED,OACE,qBAAC,OAAD;EAAK,aAAU;EAAa,WAAW,GAAG,+BAA+B,SAAS;EAAlF,UAAA;GACG,eACC,oBAAC,aAAD;IAAa,SAAS;IAAc,SAAS,SAAS,QAAQ,SAAS,UAAU,KAAA;GAAY,CAAA,IAC3F;GACH,YAAY,QAAQ,OAAO,OAAO,YAAY,aAC7C,QAAQ,EAAE,SAAS,CAAC,IAEpB,oBAAC,kBAAD;IACS;IACM;IACM;IACL;IACE;IAEf,UAAA;GACe,CAAA;GAEpB,qBAAC,OAAD;IACE,KAAK;IACL,aAAU;IACA;IACV,OAAO,EAAE,WAAW,eAAe;IACnC,WAAW,GACT,kHACF;IAPF,UAAA,CASE,qBAAC,SAAD;KACE,KAAK;KACL,MAAK;KACL,aAAU;KACV,oBAAkB,YAAY,KAAK,KAAA;KACnC,iBAAe,KAAK,SAAS;KAC7B,iBAAe;KACf,aAAW,SAAS,cAAc,KAAA;KAClC,wBAAsB,MAAM,QAAQ,qBAAqB,OAAO,KAAA;KACrD;KACF;KACT,OAAO,EAAE,UAAU,MAAM,aAAa,EAAE;KACxC,WAAW,GACT,qDACA,sHACF;KAfF,UAAA,CAiBE,oBAAC,SAAD;MAAO,aAAU;MAAoB,WAAW,GAAG,gBAAgB,oBAAoB;MACpF,UAAA,aAAa,KAAK,UAAU;OAC3B,MAAM,WAAW,MAAM,QAAQ,WAAW,MAAM,EAAE,OAAO,YAAY,MAAM,KAAK;OAChF,MAAM,UAAU,aAAa,KAAK,MAAM,QAAQ,SAAS;OACzD,MAAM,cAAc,QAAwC,MAAc;QACxE,MAAM,SAAS,OAAO;QACtB,MAAM,OAAO,OAAO,UAAU;QAC9B,MAAM,MAAM,SAAS,QAAQ,KAAK;QAClC,MAAM,SAAS,OAAO,YAAY;QAClC,MAAM,MAAM,OAAO;QACnB,OACE,qBAAC,MAAD;SAEE,MAAK;SACL,OAAM;SACN,aAAU;SACV,kBAAgB;SAChB,kBAAgB;SAChB,eAAa,IAAI;SACjB,oBAAkB,IAAI,OAAO,KAAK,KAAA;SAClC,iBAAe,IAAI;SACnB,aACE,WAAW,QACP,cACA,WAAW,SACT,eACA,OAAO,WAAW,IAChB,SACA,KAAA;SAEV,SAAS,OAAO;SAChB,UAAU,YAAY,IAAI,CAAC;SAC3B,OAAO;UAAE,OAAO,OAAO,QAAQ;UAAG,GAAG,IAAI;SAAM;SAC/C,WAAW,GACT,kEACA,aACA,wGACA,sCACA,WAAW,MAAM,SAAS,UAC1B,yFACA,IAAI,UAAU,SACd,IAAI,WAAW,WAAW,IAAI,QAAQ,4CACtC,IAAI,WAAW,SAAS,IAAI,QAAQ,2CACpC,MAAM,eACR;SAjCF,UAAA,CAmCG,OAAO,gBAAgB,OAAO,OAAO,IAAI,WAAW,WACnD,oBAAC,uBAAD;UAA+B;UAAQ,OAAO,IAAI;SAAS,CAAA,IAE3D,oBAAC,MAAM,YAAP,EAA0B,OAAS,CAAA,GAEpC,OAAO,aAAa,IACnB,oBAAC,OAAD;UACE,aAAU;UACV,iBAAe,OAAO,cAAc,IAAI,KAAK,KAAA;UAC7C,aAAa,OAAO,iBAAiB;UACrC,cAAc,OAAO,iBAAiB;UACtC,qBAAqB,OAAO,UAAU;UACtC,WAAW,GACT,8EACA,iHACA,qBACF;SACD,CAAA,IACC,IACF;QArDG,GAAA,OAAO,EAqDV;OAER;OACA,OACE,qBAAC,MAAD;QAAmB,MAAK;QAAM,iBAAe;QAA7C,UAAA;SACG,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM,WAAW,QAAQ,CAAC,CAAC;SACzE,oBAAC,MAAD;UAAI,eAAA;UAAY,WAAU;SAA+D,CAAA;SACxF,MAAM,QAAQ,MAAM,OAAO,CAAC,CAAC,KAAK,QAAQ,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;QAC9E;OAJK,GAAA,MAAM,EAIX;MAER,CAAC;KACI,CAAA,GACP,qBAAC,SAAD;MAAO,aAAU;MAAjB,UAAA;OACG,eAAe,eAAe;OAC9B,YACC,oBAAC,MAAD;QAAI,MAAK;QAAM,aAAU;QACvB,UAAA,oBAAC,MAAD;SAAI,MAAK;SAAW,SAAS,WAAW;SAAG,WAAU;SAClD,UAAA,cACC,qBAAC,OAAD;UAAK,WAAU;UAAf,UAAA,CACE,oBAAC,OAAD;WAAO,eAAA;WAAY,WAAU;UAA+C,CAAA,GAC5E,oBAAC,KAAD;WAAG,WAAU;WAAwC,UAAA;UAAgB,CAAA,CAClE;;QAEL,CAAA;OACF,CAAA,IACF;OACH,eACC,qBAAA,UAAA,EAAA,UAAA;QACG,aAAa,IACZ,oBAAC,MAAD;SAAI,eAAA;SAAY,aAAU;SAAoB,OAAO,EAAE,QAAQ,WAAW;SACxE,UAAA,oBAAC,MAAD;UAAI,SAAS,WAAW;UAAG,WAAU;SAAO,CAAA;QAC1C,CAAA,IACF;QACH,aAAa,KAAK,SAAS;SAC1B,MAAM,MAAM,KAAK,KAAK;SACtB,OAAO,MAAM,UAAU,KAAK,KAAK,OAAO,KAAK,KAAK,IAAI;QACxD,CAAC;QACA,gBAAgB,IACf,oBAAC,MAAD;SAAI,eAAA;SAAY,aAAU;SAAoB,OAAO,EAAE,QAAQ,cAAc;SAC3E,UAAA,oBAAC,MAAD;UAAI,SAAS,WAAW;UAAG,WAAU;SAAO,CAAA;QAC1C,CAAA,IACF;OACJ,EAAA,CAAA,IAEF,KAAK,KAAK,KAAK,UAAU,UAAU,KAAK,KAAK,CAAC;MAE3C;KACF,CAAA,CAAA;IACN,CAAA,GAAA,mBAAmB,cAAc,SAAS,cAAc,KAAK,SAAS,IACrE,qBAAC,OAAD;KACE,aAAU;KACV,WAAU;KAFZ,UAAA,CAIE,oBAAC,SAAD,EAAS,MAAM,GAAK,CAAA,GAAC,eAClB;IACH,CAAA,IAAA,IACD;;GACJ,mBAAmB,UAClB,oBAAC,qBAAD;IAA4B;IAAwB;GAAkB,CAAA,IACpE,mBAAmB,aACrB,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,KAAK;KAAO;KAAK,SAAS;IACxB;GACH,CAAA,IAAA;EACD;;AAET;;;AC/sBA,SAAS,aAAa,EAAE,WAAW,SAAS,GAAG,SAAoB;CACjE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAW,KAAK;EAAoB;EAAW,GAAI;CAAQ,CAAA;AACnF;AAEA,SAAS,gBAAgB,EAAE,WAAW,aAAa,MAAM,OAAO,UAAU,GAAG,SAAuB;CASlG,OACE,oBARA,gBAAgB,SACZ,cACA,gBAAgB,UACd,eACA,gBAAgB,OACd,YACA,aAER;EACE,aAAU;EACV,eAAA;EACA,WAAW,GAAG,UAAU,YAAY,cAAc,SAAS;EAC3D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,4BAA4B,OAAiC;CACpE,OAAO,oBAAC,QAAD;EAAQ,aAAU;EAA0B,SAAQ;EAAU,MAAK;EAAU,GAAI;CAAQ,CAAA;AAClG;AAEA,SAAS,wBAAwB,OAA6B;CAC5D,OAAO,oBAAC,QAAD;EAAQ,aAAU;EAAsB,SAAQ;EAAU,MAAK;EAAU,GAAI;CAAQ,CAAA;AAC9F;;;;;;;AAQA,SAAS,kBAAkB,EAAE,WAAW,KAAK,WAAW,GAAG,SAAyB;CAClF,MAAM,MAAM,MAAM,OAA0B,IAAI;CAChD,MAAM,gBAAgB;EACpB,IAAI,UAAU,SAAS,IAAI,SAAS,MAAM;CAC5C,GAAG,CAAC,UAAU,OAAO,CAAC;CAEtB,MAAM,UAAU,UAAU,eAAe,UAAU,aAAa,UAAU;CAC1E,MAAM,iBAAiB,UAAU,YAAY,CAAC;CAC9C,MAAM,SAAS,kBAAkB,UAAU,eAAe,UAAU;CAEpE,OACE,oBAAC,QAAD;EACO;EACL,aAAU;EACV,YAAU,IAAI;EACd,wBAAsB,kBAAkB,KAAA;EACxC,oBAAkB,UAAU,eAAe,KAAA;EAC3C,kBAAgB,UAAU,aAAa,KAAA;EACvC,qBAAoB,UAAU,gBAAgB,CAAC,UAAW,KAAA;EAC1D,cAAa,UAAU,SAAS,CAAC,UAAU,YAAa,KAAA;EACxD,SAAQ;EACR,MAAK;EACL,WAAW,GACT,gGACA,8CAEA,wGAEA,qPAEA,mPACA,mOACA,2NAEA,iEACA,uGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,SAAS,EAChB,WACA,YACA,YACA,kBAAkB,MAClB,gBAAgB,SAChB,YACA,GAAG,SACa;CAChB,MAAM,WAAW,qBAAqB;CACtC,OACE,oBAAC,WAAD;EACmB;EACF;EACf,WAAW,GAAG,+CAA+C,SAAS;EACtE,YAAY;GACV,sBAAsB,SAAS,KAAK,eAAe,WAAW,EAAE,OAAO,QAAQ,CAAC;GAChF,GAAG;EACL;EACA,YAAY;GACV,MAAM,GAAG,SAAS,SAAS,IAAI;GAC/B,QAAQ,GAAG,4CAA4C,SAAS,MAAM;GACtE,OAAO,GAAG,8BAA8B,SAAS,KAAK;GACtD,KAAK,GAAG,2EAA2E,SAAS,GAAG;GAC/F,iBAAiB,GAAG,8DAA8D,SAAS,eAAe;GAC1G,aAAa,GAAG,8DAA8D,SAAS,WAAW;GAClG,eAAe,GAAG,oDAAoD,SAAS,aAAa;GAC5F,eAAe,GACb,kGACA,kBAAkB,WAChB,wIACF,SAAS,aACX;GACA,WAAW,GACT,wGACA,SAAS,SACX;GACA,eAAe,GACb,gGACA,qHACA,SAAS,aACX;GACA,UAAU,GAAG,6CAA6C,SAAS,QAAQ;GAC3E,YAAY,GAAG,0BAA0B,SAAS,UAAU;GAC5D,UAAU,GAAG,QAAQ,SAAS,QAAQ;GACtC,SAAS,GACP,+GACA,SAAS,OACX;GACA,MAAM,GAAG,oBAAoB,SAAS,IAAI;GAC1C,oBAAoB,GAAG,mBAAmB,SAAS,kBAAkB;GACrE,aAAa,GACX,4FACA,SAAS,WACX;GACA,KAAK,GACH,uEACA,SAAS,GACX;GACA,aAAa,GAAG,+DAA+D,SAAS,WAAW;GACnG,cAAc,GAAG,4CAA4C,SAAS,YAAY;GAClF,WAAW,GAAG,+DAA+D,SAAS,SAAS;GAC/F,OAAO,SAAS;GAChB,SAAS,SAAS;GAClB,UAAU,SAAS;GACnB,QAAQ,GAAG,aAAa,SAAS,MAAM;GACvC,GAAG;EACL;EACA,YAAY;GACV,MAAM;GACN,SAAS;GACT,qBAAqB;GACrB,iBAAiB;GACjB,WAAW;GACX,GAAG;EACL;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;AC/KA,SAAS,QAAQ,OAAoC;CACnD,OAAO,oBAACC,UAAiB,MAAlB,EAAuB,GAAI,MAAQ,CAAA;AAC5C;AAEA,SAAS,eAAe,OAAuC;CAC7D,OAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,oBAACA,UAAiB,OAAlB;EAAwB,aAAU;EAAgB,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAuC;CAC3E,OACE,oBAACA,UAAiB,OAAlB;EACE,aAAU;EACV,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAA6C;CACvF,OACE,oBAACA,UAAiB,aAAlB;EACE,aAAU;EACV,WAAW,GACT,mFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAuBA,SAAS,eAAe,EACtB,WACA,OAAO,UACP,QAAQ,UACR,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,aACA,WACA,GAAG,SACmB;CACtB,OACE,oBAACA,UAAiB,QAAlB;EAAsC;EAAwB;EAC5D,UAAA,oBAACA,UAAiB,YAAlB;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GAChB,WAAU;GAEV,UAAA,oBAACA,UAAiB,OAAlB;IACE,aAAU;IACV,WAAW,GACT,yBACA,kEACA,iGACA,kDACA,2DACA,+JACA,gEACA,SACF;IACA,GAAI;GACL,CAAA;EAC0B,CAAA;CACN,CAAA;AAE7B;;;;;;;;;;;;;;;;;;AChGA,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,eAAe,YAAY,KAAK,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;AAEzD,MAAM,OAAO,MAAc,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AAEpD,MAAM,QAAQ,WAAmB,cAAc,KAAK,MAAM;;AAG1D,SAAS,cAAc,MAAoB;CACzC,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,GAAG,IAAI,KAAK,QAAQ,CAAC;AAChF;;AAGA,SAAS,gBAAgB,MAAY,SAAS,SAAiB;CAC7D,IAAI,KAAK,MAAM,GACb,OAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAS,GAAG,GAAG,KAAK,YAAY;CAEhF,OAAO,IAAI,KAAK,eAAe,QAAQ;EAAE,KAAK;EAAW,OAAO;EAAS,MAAM;CAAU,CAAC,CAAC,CAAC,OAC1F,IACF;AACF;;AAGA,SAAS,eAAe,MAAY,SAAS,SAAiB;CAC5D,IAAI,KAAK,MAAM,GACb,OAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAS,GAAG,GAAG,KAAK,YAAY;CAE/E,OAAO,IAAI,KAAK,eAAe,QAAQ;EAAE,KAAK;EAAW,OAAO;EAAQ,MAAM;CAAU,CAAC,CAAC,CAAC,OACzF,IACF;AACF;AAEA,MAAM,SAAS;AAEf,SAAS,WAAW,MAAoB;CACtC,OAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;AAC/E;;;;;;;AAQA,SAAS,eAAe,MAAY,UAA2C,CAAC,GAAW;CACzF,MAAM,EAAE,sBAAM,IAAI,KAAK,GAAG,SAAS,YAAY;CAC/C,MAAM,OAAO,KAAK,OAAO,WAAW,IAAI,IAAI,WAAW,GAAG,KAAK,MAAM;CACrE,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI;CACJ,IAAI;CACJ,IAAI,MAAM,GAAG;EACX,OAAO;EACP,QAAQ;CACV,OAAO,IAAI,MAAM,IAAI;EACnB,OAAO;EACP,QAAQ,KAAK,MAAM,OAAO,CAAC;CAC7B,OAAO,IAAI,MAAM,KAAK;EACpB,OAAO;EACP,QAAQ,KAAK,MAAM,OAAO,EAAE;CAC9B,OAAO;EACL,OAAO;EACP,QAAQ,KAAK,MAAM,OAAO,GAAG;CAC/B;CACA,IAAI,CAAC,KAAK,MAAM,GACd,OAAO,IAAI,KAAK,mBAAmB,QAAQ,EAAE,SAAS,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,IAAI;CAEpF,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,SAAS,IAAI,OAAO;CACxB,IAAI,SAAS,GAAG,OAAO;CACvB,MAAM,IAAI,KAAK,IAAI,KAAK;CACxB,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,MAAM,IAAI,KAAK;CAC5C,OAAO,QAAQ,IAAI,GAAG,MAAM,QAAQ,MAAM;AAC5C;AAEA,SAAS,SAAS,MAAc,OAAe,KAA+B;CAC5E,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;CAC1C,IAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,KACrF;CAEF,OAAO;AACT;;AAGA,SAAS,aAAa,MAAgC;CACpD,MAAM,IAAI,gCAAgC,KAAK,KAAK,KAAK,CAAC;CAC1D,IAAI,CAAC,GAAG,OAAO,KAAA;CACf,OAAO,SAAS,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;AAC1D;;AAGA,SAAS,iBAAiB,MAAgC;CACxD,MAAM,MAAM,aAAa,IAAI;CAC7B,IAAI,KAAK,OAAO;CAChB,MAAM,IAAI,oCAAoC,KAAK,KAAK,KAAK,CAAC;CAC9D,IAAI,CAAC,GAAG,OAAO,KAAA;CACf,MAAM,QAAQ,EAAE,MAAM,GAAA,CAAI,YAAY;CACtC,MAAM,QAAQ,YAAY,WACvB,SAAS,KAAK,YAAY,MAAM,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY,MAAM,IAC9E;CACA,IAAI,QAAQ,GAAG,OAAO,KAAA;CACtB,OAAO,SAAS,OAAO,EAAE,EAAE,GAAG,QAAQ,GAAG,OAAO,EAAE,EAAE,CAAC;AACvD;AAEA,SAAS,QAAQ,GAAqB,GAA8B;CAClE,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,MAAM;CAC3B,OAAO,WAAW,CAAC,MAAM,WAAW,CAAC;AACvC;AAEA,SAAS,QAAQ,MAAY,KAAuB,KAAgC;CAClF,MAAM,IAAI,WAAW,IAAI;CACzB,IAAI,OAAO,IAAI,WAAW,GAAG,GAAG,OAAO;CACvC,IAAI,OAAO,IAAI,WAAW,GAAG,GAAG,OAAO;CACvC,OAAO;AACT;AAoCA,SAAS,UAAU,OAAuB;CACxC,MAAM,EACJ,OACA,cACA,eACA,cAAc,cACd,aAAa,eACb,YAAY,kBACZ,KACA,KACA,UACA,SACA,eACA,kBACA,WACA,QACA,GAAG,eACD;CACJ,MAAM,aAAa,WAAW;CAC9B,MAAM,CAAC,OAAO,YAAY,MAAM,SAA2B,YAAY;CACvE,MAAM,OAAO,aAAa,QAAQ;CAElC,MAAM,CAAC,MAAM,WAAW,MAAM,eAAgB,OAAO,WAAW,IAAI,IAAI,EAAG;CAC3E,MAAM,CAAC,aAAa,kBAAkB,MAAM,SAAS,KAAK;CAC1D,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,KAAK;CAC5C,MAAM,YAAY,MAAM,OAAyB,IAAI;CAErD,MAAM,SAAS,MAAM,aAClB,SAA2B;EAC1B,UAAU,UAAU;EACpB,IAAI,CAAC,YAAY,SAAS,IAAI;EAC9B,gBAAgB,IAAI;CACtB,GACA,CAAC,YAAY,aAAa,CAC5B;CAIA,MAAM,gBAAgB;EACpB,IAAI,QAAQ,MAAM,UAAU,OAAO,GAAG;EACtC,UAAU,UAAU;EACpB,QAAQ,OAAO,WAAW,IAAI,IAAI,EAAE;EACpC,eAAe,KAAK;CACtB,GAAG,CAAC,MAAM,UAAU,CAAC;CAErB,MAAM,YAAY,UAA+C;EAC/D,MAAM,OAAO,MAAM,OAAO;EAC1B,QAAQ,IAAI;EACZ,IAAI,KAAK,KAAK,MAAM,IAAI;GACtB,eAAe,KAAK;GACpB,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA,CAAS;GACxC;EACF;EACA,MAAM,SAAS,UAAU,IAAI;EAC7B,MAAM,KAAK,WAAW,KAAA,KAAa,QAAQ,QAAQ,KAAK,GAAG;EAC3D,eAAe,CAAC,EAAE;EAClB,IAAI,IACE;OAAA,CAAC,QAAQ,QAAQ,IAAI,GAAG,OAAO,MAAM;EAAA,OACpC,IAAI,SAAS,KAAA,GAClB,OAAO,KAAA,CAAS;CAEpB;CAEA,MAAM,QAAQ,SAA2B;EACvC,QAAQ,KAAK;EACb,eAAe,KAAK;EACpB,QAAQ,OAAO,WAAW,IAAI,IAAI,EAAE;EACpC,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG,OAAO,IAAI;CACvC;CAEA,MAAM,WAAsB,CAAC;CAC7B,IAAI,KAAK,SAAS,KAAK,EAAE,QAAQ,IAAI,CAAC;CACtC,IAAI,KAAK,SAAS,KAAK,EAAE,OAAO,IAAI,CAAC;CACrC,MAAM,YAAY,WAAW;CAE7B,OACE,qBAAC,OAAD;EACE,aAAU;EACV,gBAAc,aAAa,KAAA;EAC3B,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAG,iBAAiB,gBAAgB;EAJjD,UAAA,CAME,oBAAC,OAAD;GACE,MAAK;GACL,WAAU;GACV,cAAa;GACb,aAAU;GACV,OAAO;GACM;GACH;GACV,gBAAc,aAAa,KAAA;GACjB;GACV,SAAS,UAAU;IACjB,IAAI,QAAQ,CAAC,aAAa,QAAQ,WAAW,IAAI,CAAC;IAClD,SAAS,KAAK;GAChB;GACA,WAAW,GAAG,SAAS,SAAS;GAChC,GAAI;EACL,CAAA,GACD,qBAAC,SAAD;GAAe;GAAM,cAAc;GAAnC,UAAA,CACE,oBAAC,gBAAD;IACE,aAAU;IACV,QAAQ,oBAAC,QAAD;KAAQ,SAAQ;KAAQ,MAAK;IAAW,CAAA;IAChD,cAAW;IACD;IACV,WAAW,GACT,6CACA,iFACF;IAEA,UAAA,oBAAC,cAAD,CAAe,CAAA;GACD,CAAA,GAChB,oBAAC,gBAAD;IAAgB,aAAU;IAAqB,OAAM;IAAM,WAAU;IACnE,UAAA,oBAAC,UAAD;KACE,GAAI;KACJ,MAAK;KACL,cAAc,eAAe,gBAAgB;KAC7C,UAAU;KACV,UAAU;KACV,UAAU,SAAS,SAAS,IAAI,WAAW,KAAA;KAC3C,YAAY,eAAe,cAAc;KACzC,UAAU,eAAe,YAAY;IACtC,CAAA;GACa,CAAA,CACT;EACN,CAAA,CAAA;;AAET;;;;;;;;ACvSA,SAAS,WAAW,EAClB,WACA,MACA,OACA,aACA,QACA,OAAO,WACP,UACA,GAAG,SACe;CAClB,OACE,qBAAC,OAAD;EACE,aAAU;EACV,aAAW;EACX,WAAW,GACT,yDACA,SAAS,YAAY,oBAAoB,oBACzC,2CACA,SACF;EACA,GAAI;EATN,UAAA;GAWG,OACC,oBAAC,OAAD;IACE,aAAU;IACV,eAAA;IACA,WAAW,GACT,yEACA,6DACA,SAAS,YAAY,2BAA2B,wBAClD;IAEC,UAAA;GACE,CAAA,IACH;GACJ,oBAAC,KAAD;IACE,aAAU;IACV,WAAW,GACT,mDACA,SAAS,YACL,uFACA,oFACN;IAEC,UAAA;GACA,CAAA;GACF,cACC,oBAAC,KAAD;IACE,aAAU;IACV,WAAW,GACT,yBACA,SAAS,YACL,6FACA,oFACN;IAEC,UAAA;GACA,CAAA,IACD;GACH;GACA,SACC,oBAAC,OAAD;IAAK,aAAU;IAAqB,WAAU;IAC3C,UAAA;GACE,CAAA,IACH;EACD;;AAET;;;;;;;AC9EA,MAAM,gBAAgB,IAAI;CACxB;CACA;CACA;CACA;CACA;AACF,CAAC;AAKD,SAAS,MAAM,EAAE,WAAW,GAAG,SAAqB;CAClD,OAAO,oBAAC,SAAD;EAAO,aAAU;EAAQ,WAAW,GAAG,cAAc,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AACzF;;;;;;;;;;;;;;;;;;;;;;ACMA,MAAM,gBAAgB,IAAI,iCAAiC;CACzD,UAAU,EACR,aAAa;EACX,UAAU;EACV,YAAY,CACV,+DACA,8CACF;CACF,EACF;CACA,iBAAiB,EAAE,aAAa,WAAW;AAC7C,CAAC;AASD,MAAM,sBAAsB,MAAM,cAAc,KAAK;AAErD,SAAS,MAAM,EAAE,WAAW,cAAc,YAAY,SAAS,GAAG,SAAqB;CACrF,OACE,oBAAC,oBAAoB,UAArB;EAA8B,OAAO,YAAY;EAC/C,UAAA,oBAACC,QAAe,MAAhB;GACE,aAAU;GACV,oBAAkB;GACT;GACT,WAAW,GAAG,cAAc,EAAE,YAAY,CAAC,GAAG,SAAS;GACvD,GAAI;EACL,CAAA;CAC2B,CAAA;AAElC;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,+DAA+D,SAAS;EACtF,GAAI;CACL,CAAA;AAEL;AAIA,SAAS,WAAW,EAAE,WAAW,GAAG,SAA0B;CAC5D,OACE,oBAACA,QAAe,OAAhB;EACE,aAAU;EACV,WAAW,GACT,cAAc,GACd,SACA,kEACA,qDACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;AASA,SAAS,aAAa,EAAE,WAAW,GAAG,SAA4B;CAChE,OACE,oBAACA,QAAe,SAAhB;EACE,aAAU;EACV,WAAW,GACT,gBACA,0HACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAKA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAgC;CACxE,OACE,oBAACA,QAAe,aAAhB;EACE,aAAU;EACV,WAAW,GACT,0IACA,uFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAeA,SAAS,WAAW,EAAE,WAAW,UAAU,QAAQ,OAAO,GAAG,SAA0B;CACrF,MAAM,eAAe,MAAM,WAAW,mBAAmB;CACzD,MAAM,UAAU,MAAM,cAAc;EAClC,IAAI,UACF,OAAO;EAET,IAAI,CAAC,QAAQ,QACX,OAAO;EAET,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QACtE,MAA2B,QAAQ,GAAG,OAAO,CAChD;EACA,IAAI,OAAO,WAAW,GACpB,OAAO;EAET,IAAI,OAAO,WAAW,GACpB,OAAO,OAAO,EAAE,EAAE;EAEpB,OACE,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,OAAO,KAAK,MACX,oBAAC,MAAD,EAAA,UAAqB,EAAE,QAAY,GAA1B,EAAE,OAAwB,CACpC;EACC,CAAA;CAER,GAAG,CAAC,UAAU,MAAM,CAAC;CAErB,IAAI,WAAW,KAAA,KAAa,YAAY,MACtC,OAAO;CAGT,OACE,oBAACA,QAAe,OAAhB;EACE,MAAK;EACL,aAAU;EACV,OAAO,UAAU,WAAW,KAAA,KAAa,eAAe,OAAO,KAAA;EAC/D,WAAW,GACT,qIACA,SACF;EACA,GAAI;EAEH,UAAA;CACmB,CAAA;AAE1B;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAwB;CACxD,OACE,oBAACC,WAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,uBACA,gFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAIA,SAAS,eAAe,EAAE,WAAW,GAAG,SAA8B;CACpE,OACE,oBAACA,WAAkB,QAAnB;EACE,aAAU;EACV,WAAW,GACT,mGACA,8BACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,kFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACjNA,SAAS,SAAS,MAAoC;CACpD,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK;CACtC,IAAI,cAAc,MAAM,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE;CAClE,OAAO;AACT;;AAGA,MAAM,yBAAyC;CAC7C,GAAG;CACH,YAAY;EACV,GAAG,cAAc;EACjB,MAAM,CAAC,GAAI,cAAc,YAAY,QAAQ,CAAC,GAAI,CAAC,aAAa,aAAa,CAAC;EAC9E,OAAO,CAAC,GAAI,cAAc,YAAY,SAAS,CAAC,GAAI,SAAS;CAC/D;AACF;;AAUA,SAAS,IAAsB,OAA0B;CACvD,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;CACjC,OAAO;AACT;AAEA,MAAM,QAAQ;AAEd,MAAM,OAAO,GACX,sHACF;AAEA,MAAM,UAAU,GACd,+EACA,4FACF;AAEA,MAAM,gBAAgB;AAEtB,SAAS,WAAW,EAAE,QAA0B;CAC9C,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,KAAK;CAChD,MAAM,gBAAgB;EACpB,IAAI,CAAC,QAAQ;EACb,MAAM,KAAK,OAAO,iBAAiB,UAAU,KAAK,GAAG,IAAI;EACzD,aAAa,OAAO,aAAa,EAAE;CACrC,GAAG,CAAC,MAAM,CAAC;CACX,OACE,oBAAC,UAAD;EACE,MAAK;EACL,aAAU;EACV,eAAa,UAAU,KAAA;EACvB,cAAY,SAAS,WAAW;EAChC,eAAe;GACb,UAAe,WAAW,UAAU,IAAI,CAAC,CAAC,WAAW,UAAU,IAAI,CAAC;EACtE;EACA,WAAW,GACT,6EACA,yEACA,6FACA,mFACA,sEACA,gFACA,gDACA,kBACF;EAEC,UAAA,SAAS,oBAAC,OAAD,EAAO,eAAA,KAAa,CAAA,IAAI,oBAAC,MAAD,EAAM,eAAA,KAAa,CAAA;CAC/C,CAAA;AAEZ;AAEA,SAAS,gBAAgB,cAAyD;CAChF,OAAO;EACL,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,uIACA,sIACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,mIACA,gJACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,0FACA,gJACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,yIACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,mIACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,SACA,6OACF;EACD,CAAA;EAEH,IAAI,MAAM,oBAAC,KAAD;GAAG,GAAI,IAAI,CAAC;GAAG,WAAW,GAAG,OAAO,IAAI;EAAI,CAAA;EACtD,IAAI,MAAM;GACR,MAAM,EAAE,MAAM,GAAG,SAAS,IAAI,CAAC;GAC/B,MAAM,WAAW,OAAO,SAAS,YAAY,eAAe,KAAK,IAAI;GACrE,OACE,oBAAC,KAAD;IACE,GAAI;IACE;IACN,QAAQ,WAAW,WAAW,KAAA;IAC9B,KAAK,WAAW,wBAAwB,KAAA;IACxC,WAAW,GACT,uGACA,+FACA,4GACF;GACD,CAAA;EAEL;EACA,SAAS,MAAM,oBAAC,UAAD;GAAQ,GAAI,IAAI,CAAC;GAAG,WAAU;EAAmD,CAAA;EAChG,KAAK,MAAM,oBAAC,MAAD;GAAI,GAAI,IAAI,CAAC;GAAG,WAAU;EAAU,CAAA;EAC/C,MAAM,MAAM,oBAAC,OAAD;GAAK,GAAI,IAAI,CAAC;GAAG,WAAU;EAAwD,CAAA;EAC/F,OAAO,MACL,oBAAC,QAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,kEACA,oHACA,yCACF;EACD,CAAA;EAEH,MAAM,MAAM;GACV,MAAM,WAAW,EAAE,MAAM,SAAS,MAC/B,MAAqB,EAAE,SAAS,aAAa,EAAE,YAAY,MAC9D;GAEA,MAAM,QADS,WAAW,SAAS,QAAQ,IAAI,SAAS,EAAE,QAAQ;IAAE,MAAM;IAAQ,OAAO;GAAG,CAAC,EAAA,CACzE,QAAQ,OAAO,EAAE;GACrC,MAAM,UAAU,UAAU,WAAW;GACrC,MAAM,YAAY,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,EAAA,CAC1D,IAAI,MAAM,CAAC,CACX,MAAM,MAAM,EAAE,WAAW,WAAW,CAAC,CAAC,EACrC,MAAM,CAAkB;GAC5B,OACE,qBAAC,OAAD;IACE,aAAU;IACV,iBAAe;IACf,WAAW,GACT,OACA,sCACA,4FACF;IAPF,UAAA,CASG,eACC,aAAa;KAAE;KAAM;IAAS,CAAC,IAE/B,oBAAC,OAAD;KACE,WAAW,GACT,6BACA,mKACF;KAEA,UAAA,oBAAC,QAAD;MAAM,iBAAe;MAAW,UAAA;KAAW,CAAA;IACxC,CAAA,GAEP,oBAAC,YAAD,EAAY,MAAM,KAAO,CAAA,CACtB;;EAET;EACA,aAAa,MACX,oBAAC,cAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,OACA,4FACA,4BACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,OACA,MACA,8DACA,yBACF;EACD,CAAA;EAEH,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GACT,OACA,MACA,iEACA,yBACF;EACD,CAAA;EAEH,KAAK,MAAM;GACT,MAAM,OAAO,IAAI,CAAC;GAClB,MAAM,OAAO,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,SAAS,gBAAgB;GAC3F,OACE,oBAAC,MAAD;IACE,GAAI;IACJ,aAAW,QAAQ,KAAA;IACnB,WAAW,GAAG,6CAA6C,QAAQ,iBAAiB;GACrF,CAAA;EAEL;EACA,QAAQ,MAAM;GACZ,MAAM,OAAO,IAAI,CAAC;GAClB,OACE,oBAAC,SAAD;IACE,GAAI;IACJ,UAAA;IACA,WAAW,GACT,0EACA,+BACF;GACD,CAAA;EAEL;EACA,QAAQ,MACN,oBAAC,OAAD;GAAK,aAAU;GAAiB,WAAW,GAAG,OAAO,wBAAwB;GAC3E,UAAA,oBAAC,SAAD;IACE,GAAI,IAAI,CAAC;IACT,WAAW,GACT,mJACF;GACD,CAAA;EACE,CAAA;EAEP,QAAQ,MAAM,oBAAC,SAAD;GAAO,GAAI,IAAI,CAAC;GAAG,WAAU;EAAwB,CAAA;EACnE,QAAQ,MAAM,oBAAC,SAAD;GAAO,GAAI,IAAI,CAAC;GAAG,WAAU;EAA+C,CAAA;EAC1F,KAAK,MAAM,oBAAC,MAAD,EAAI,GAAI,IAAI,CAAC,EAAI,CAAA;EAC5B,KAAK,MACH,oBAAC,MAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAW,GAAG,eAAe,2DAA2D;EACzF,CAAA;EAEH,KAAK,MAAM,oBAAC,MAAD;GAAI,GAAI,IAAI,CAAC;GAAG,WAAW;EAAgB,CAAA;EACtD,KAAK,MACH,oBAAC,MAAD;GAAI,GAAI,IAAI,CAAC;GAAG,WAAU;EAAuF,CAAA;EAEnH,MAAM,MACJ,oBAAC,OAAD;GACE,GAAI,IAAI,CAAC;GACT,WAAU;EACX,CAAA;CAEL;AACF;AA8BA,SAAS,SAAS,EAChB,UACA,UAAU,OACV,cACA,YACA,eACA,eACA,6BACA,iBAAiB,wBACjB,cACA,WACA,GAAG,SACa;CAChB,MAAM,MAAM,MAAM,eACT;EAAE,GAAG,gBAAgB,YAAY;EAAG,GAAG;CAAW,IACzD,CAAC,cAAc,UAAU,CAC3B;CACA,MAAM,SAAS,MAAM,cAAc,CAAC,WAAW,GAAI,iBAAiB,CAAC,CAAE,GAAG,CAAC,aAAa,CAAC;CACzF,MAAM,SAAS,MAAM,cACb;EAAC,GAAI,+BAA+B,CAAC;EAAI,CAAC,gBAAgB,cAAc;EAAY,GAAI,iBAAiB,CAAC;CAAE,GAClH;EAAC;EAA6B;EAAe;CAAc,CAC7D;CACA,OACE,oBAAC,OAAD;EACE,aAAU;EACV,gBAAc,WAAW,KAAA;EACzB,WAAW,GAAG,wEAAwE,SAAS;EAC/F,GAAI;EAEJ,UAAA,oBAAC,eAAD;GACE,eAAe;GACf,eAAe;GACf,YAAY;GACE;GAEb,UAAA,YAAY;EACA,CAAA;CACZ,CAAA;AAET;;;AC9WA,SAAS,SAAS,EAAE,WAAW,UAAU,GAAG,SAAwB;CAClE,OACE,qBAACC,WAAa,MAAd;EAAmB,aAAU;EAAW,WAAW,GAAG,8BAA8B,SAAS;EAAG,GAAI;EAApG,UAAA,CACG,WAAW,oBAAC,OAAD;GAAK,WAAU;GAA2C;EAAc,CAAA,IAAI,MACxF,oBAAC,eAAD,EAAA,UACE,oBAAC,mBAAD,CAAoB,CAAA,EACP,CAAA,CACE;;AAEvB;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAA0D;CAC/F,OACE,oBAACA,WAAa,OAAd;EACE,aAAU;EACV,WAAW,GACT,6FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAA8D;CACvG,OACE,oBAACA,WAAa,WAAd;EACE,aAAU;EACV,WAAW,GACT,iEACA,mFACA,iEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAA0D;CAC/F,OACE,oBAACA,WAAa,OAAd;EACE,aAAU;EACV,WAAW,GACT,yFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAA0D;CAC/F,OACE,oBAACA,WAAa,OAAd;EACE,aAAU;EACV,WAAW,GACT,gGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;AC/DA,SAAS,WAAW,EAAE,WAAW,GAAG,SAA0B;CAC5D,OAAO,oBAACC,cAAD;EAAgB,aAAU;EAAc,WAAW,GAAG,cAAc,SAAS;EAAG,GAAI;CAAQ,CAAA;AACrG;AAIA,SAAS,eAAe,EAAE,WAAW,GAAG,SAA8B;CACpE,OACE,oBAAC,MAAM,MAAP;EACE,aAAU;EACV,WAAW,GACT,qHACA,qFACA,qGACA,gFACA,6CACA,kEACA,oHACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAAC,MAAM,WAAP;GACE,aAAU;GACV,WAAU;EACX,CAAA;CACS,CAAA;AAEhB;;;;;;;;;;;;ACTA,SAAS,YAAY,EACnB,OACA,aACA,SACA,QACA,OACA,eACA,UACA,GAAG,SACgB;CACnB,OACE,qBAAC,MAAD;EAAM,aAAU;EAAe,GAAI;EAAnC,UAAA;GACE,qBAAC,YAAD;IACE,aAAU;IACV,WAAU;IAFZ,UAAA,CAIE,qBAAC,OAAD;KAAK,aAAU;KAAuB,WAAU;KAAhD,UAAA,CACE,oBAAC,WAAD;MAAW,aAAU;MAAsB,UAAA;KAAiB,CAAA,GAC3D,cACC,oBAAC,iBAAD;MAAiB,aAAU;MAA4B,UAAA;KAA6B,CAAA,IAClF,IACD;IACJ,CAAA,GAAA,UACC,oBAAC,OAAD;KACE,aAAU;KACV,WAAU;KAET,UAAA;IACE,CAAA,IACH,IACM;;GACZ,oBAAC,aAAD;IACE,aAAU;IACV,WAAW,GAAG,QAAQ,QAAQ,OAAO,aAAa;IAEjD;GACU,CAAA;GACZ,SAAS,oBAAC,YAAD;IAAY,aAAU;IAAuB,UAAA;GAAmB,CAAA,IAAI;EAC1E;;AAEV;;;;;;;AC1DA,SAAS,UAAU,EACjB,WACA,cAAc,cACd,aAAa,MACb,GAAG,SACc;CACjB,OACE,oBAACC,aAAD;EACE,aAAU;EACG;EAEb,GAAK,aAAa,EAAE,MAAM,OAAO,IAAI,CAAC;EACtC,WAAW,GACT,kCACA,gBAAgB,eAAe,gBAAgB,oCAC/C,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACnBA,MAAM,aAA4C;CAChD,QAAQ;CACR,SAAS;CACT,SAAS;CACT,aAAa;CACb,QAAQ;CACR,MAAM;CACN,SAAS;AACX;;;;;AAeA,SAAS,UAAU,EACjB,WACA,OAAO,UACP,MACA,OACA,OAAO,GACP,OACA,GAAG,SACc;CACjB,OACE,qBAAC,QAAD;EACE,aAAU;EACV,aAAW;EACX,WAAW,GACT,oCACA,gFACA,SACF;EACA,GAAI;EARN,UAAA,CAUE,qBAAC,QAAD;GACE,eAAA;GACA,aAAU;GACV,WAAU;GACV,OAAO;IAAE,OAAO;IAAM,QAAQ;IAAM,GAAG;GAAM;GAJ/C,UAAA,CAMG,OACC,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,GACT,4EACA,WAAW,KACb;GACD,CAAA,IACC,MACJ,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,GACT,mEACA,WAAW,KACb;GACD,CAAA,CACG;EACL,CAAA,GAAA,KACG;;AAEV;;;ACpEA,SAAS,OAAO,EAAE,WAAW,GAAG,SAAsB;CACpD,OACE,oBAACC,SAAW,MAAZ;EACE,aAAU;EACV,WAAW,GACT,6FACA,sHACA,gFACA,oFACA,mFACA,kEACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,SAAW,OAAZ;GACE,aAAU;GACV,WAAW,GACT,wGACA,qFACA,iEACF;EACD,CAAA;CACc,CAAA;AAErB;;;;;;;;;;;;;;;;AC3BA,SAAS,KAAK,EAAE,WAAW,GAAG,SAAmC;CAC/D,OACE,oBAACC,OAAc,MAAf;EACE,aAAU;EACV,WAAW,GAAG,sDAAsD,SAAS;EAC7E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,SAAS,EAChB,WACA,UACA,kBAAkB,MAClB,GAAG,SACwB;CAC3B,OACE,qBAACA,OAAc,MAAf;EACE,aAAU;EACO;EACjB,WAAW,GACT,wDACA,4EACA,0CACA,uHACA,SACF;EACA,GAAI;EAVN,UAAA,CAYG,UACD,oBAAC,eAAD,CAAgB,CAAA,CACE;;AAExB;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;CAC7E,OACE,oBAACA,OAAc,WAAf;EACE,aAAU;EACV,WAAW,GACT,mEACA,oGAEA,qHACA,wIAEA,6GACA,oIACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAkC;CACrE,OACE,oBAACA,OAAc,KAAf;EACE,aAAU;EACV,WAAW,GACT,2EACA,+FACA,8CACA,kFACA,2CACA,mEACA,gDACA,kEACA,+DACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAoC;CACvE,OACE,oBAACA,OAAc,OAAf;EACE,aAAU;EACV,WAAW,GACT,0DACA,mEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;;;AC9FA,MAAM,oBAAoB,GACxB,8HACA,8HACA,oDACA,qGACA,0CACA,sHACA,mDACA,kHACF;AAOA,SAAS,SAAS,EAAE,WAAW,WAAW,OAAO,UAAU,KAAK,GAAG,SAAwB;CACzF,MAAM,cAAc,MAAM,OAAmC,IAAI;CAEjE,MAAM,UAAU,MAAM,aACnB,SAAqC;EACpC,YAAY,UAAU;EACtB,IAAI,OAAO,QAAQ,YACjB,IAAI,IAAI;OACH,IAAI,KACT,IAAI,UAAU;CAElB,GACA,CAAC,GAAG,CACN;CAEA,MAAM,eAAe,MAAM,kBAAkB;EAC3C,MAAM,KAAK,YAAY;EACvB,IAAI,MAAM,UAAU;GAClB,GAAG,MAAM,SAAS;GAClB,GAAG,MAAM,SAAS,GAAG,GAAG,aAAa;EACvC;CACF,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,gBAAgB;EACpB,aAAa;CACf,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,eAAe,MAAM,aACxB,UAAkD;EACjD,WAAW,KAAK;EAChB,aAAa;CACf,GACA,CAAC,UAAU,YAAY,CACzB;CAEA,OACE,oBAAC,YAAD;EACE,aAAU;EACV,WAAW,GAAG,mBAAmB,YAAY,+BAA+B,SAAS;EACrF,KAAK;EACL,UAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;ACiCA,MAAM,MAA8B;CAClC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,UAAkC;CACtC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,SAAiC;CACrC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL;AAEA,MAAM,QAAgC;CACpC,OAAO;CACP,QAAQ;CACR,KAAK;CACL,SAAS;CACT,UAAU;AACZ;AAEA,MAAM,UAAkC;CACtC,OAAO;CACP,QAAQ;CACR,KAAK;CACL,SAAS;AACX;AAEA,MAAM,aAAqC;CACzC,OAAO;CACP,QAAQ;CACR,KAAK;AACP;AAEA,MAAM,YAAoC;CACxC,SACE;CACF,YACE;CACF,MAAM;CACN,SAAS;CACT,SACE;AACJ;AAEA,MAAM,YAAoC;CACxC,SAAS;CACT,OAAO;CACP,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;AACR;;;;;;;;;AAUA,MAAM,SAAS;AAEf,MAAM,aAA8C;CAClD,SAAS,oBAAC,UAAD,CAAW,CAAA;CACpB,SAAS,oBAAC,cAAD,CAAe,CAAA;CACxB,MAAM,oBAAC,eAAD,CAAgB,CAAA;CACtB,QAAQ,oBAAC,cAAD,CAAe,CAAA;CACvB,MAAM,oBAAC,MAAD,CAAO,CAAA;AACf;;;;;AAMA,SAAS,iBACP,MACA,OAC0B;CAC1B,MAAM,SAAS,MAAM,OAAO,IAAI;CAChC,OAAO,UAAU;CACjB,MAAM,QAAQ,MAAM,OAAkD,KAAA,CAAS;CAC/E,MAAM,sBACQ;EACV,IAAI,MAAM,YAAY,KAAA,GACpB,aAAa,MAAM,OAAO;CAE9B,GACA,CAAC,CACH;CACA,OAAO,MAAM,aACV,UAAmB;EAClB,IAAI,MAAM,YAAY,KAAA,GACpB,aAAa,MAAM,OAAO;EAE5B,MAAM,UAAU,iBAAiB,OAAO,QAAQ,KAAK,GAAG,KAAK;CAC/D,GACA,CAAC,KAAK,CACR;AACF;;;;;;;;;;;;AAaA,SAAS,SAAY,OAAU,MAAe,OAA+B;CAC3E,MAAM,CAAC,OAAO,YAAY,MAAM,SAAY,KAAK;CACjD,MAAM,WAAW,MAAM,OAAO,GAAG;CACjC,IAAI,CAAC,OAAO,GAAG,SAAS,SAAS,GAAG,GAAG;EACrC,SAAS,UAAU;EACnB,SAAS,KAAK;CAChB;CACA,OAAO,CAAC,OAAO,QAAQ;AACzB;AAaA,MAAa,cAAqC,EAAE,OAAO,eACzD,oBAAC,OAAD;CACE,aAAU;CACV,WAAW,GACT,yBACA,IAAI,MAAM,OAAO,IACjB,MAAM,YAAY,KAAA,IAAY,QAAQ,MAAM,WAAW,KAAA,GACvD,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAA,GACnC,MAAM,UAAU,QAAQ,MAAM,WAAW,KAAA,CAC3C;CAEC;AACE,CAAA;AAOP,MAAa,WAA+B,EAAE,OAAO,eACnD,oBAAC,OAAD;CACE,aAAU;CACV,WAAW,GACT,yBACA,MAAM,SAAS,QAAQ,gBAAgB,aACvC,IAAI,MAAM,OAAO,IACjB,MAAM,YAAY,KAAA,IAAY,QAAQ,MAAM,WAAW,KAAA,GACvD,MAAM,MAAM,SAAS,WACrB,MAAM,UAAU,QAAQ,MAAM,WAAW,KAAA,CAC3C;CAEC;AACE,CAAA;AAQP,MAAa,YAAqC,EAAE,OAAO,eACzD,oBAAC,MAAD;CAAM,aAAU;CAAY,QAAQ,MAAM;CACvC,UAAA,MAAM,QACL,oBAAC,OAAD;EAAK,WAAU;EAAuB;CAAc,CAAA,IAEpD,oBAAC,aAAD;EAAa,WAAU;EAA2B;CAAsB,CAAA;AAEtE,CAAA;AASR,MAAa,mBAAmD,EAAE,OAAO,eACvE,oBAAC,aAAD;CACE,aAAU;CACV,OAAO,MAAM;CACb,aAAa,MAAM;CACnB,OAAO,MAAM;CAEb,UAAA,oBAAC,OAAD;EAAK,WAAU;EAAuB;CAAc,CAAA;AACzC,CAAA;AAOf,MAAa,eAAuC,EAAE,YACpD,oBAAC,WAAD;CAAW,aAAU;CAAe,aAAa,MAAM,eAAe;AAAe,CAAA;AAOvF,MAAa,cAAqC,EAAE,YAClD,oBAAC,OAAD;CAAK,aAAU;CAAc,eAAA;CAAY,WAAW,GAAG,UAAU,OAAO,MAAM,QAAQ,EAAE;AAAI,CAAA;AAe9F,MAAa,YAAiC,EAAE,YAC9C,oBAAC,KAAD;CACE,aAAU;CACV,aAAW,MAAM,QAAQ;CACzB,WAAW,GACT,uBACA,UAAU,MAAM,QAAQ,SACxB,UAAU,MAAM,QAAQ,YACxB,MAAM,QAAQ,WAAW,MAAM,SAAS,KAAA,GACxC,MAAM,OAAO,2CAA2C,KAAA,CAC1D;CAEC,UAAA,MAAM;AACN,CAAA;AAQL,MAAa,gBAA6C,EAAE,YAC1D,oBAAC,UAAD;CAAU,aAAU;CAAgB,SAAS,MAAM;CAChD,UAAA,MAAM;AACC,CAAA;AAsBZ,SAAS,WAAW,EAClB,OACA,aACA,OACA,UACA,MACA,aACA,aACkB;CAClB,OACE,qBAAC,OAAD;EAAO,aAAW;EAAM,aAAa,eAAe;EAAY,SAAS,QAAQ,KAAK;EAAtF,UAAA;GACG,QAAQ,oBAAC,YAAD;IAAY,SAAS;IAAY,UAAA;GAAkB,CAAA,IAAI;GAC/D;GACA,cAAc,oBAAC,kBAAD,EAAA,UAAmB,YAA8B,CAAA,IAAI;GACnE,QAAQ,oBAAC,YAAD,EAAA,UAAa,MAAkB,CAAA,IAAI;EACvC;;AAEX;AAcA,MAAa,iBAA2C,EACtD,OACA,MACA,WACA,iBACI;CACJ,MAAM,KAAK,MAAM,MAAM;CACvB,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,SAAS,EAAE;CACpD,MAAM,OAAO,kBACV,UAAU,KAAK,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC,GACnD,UACF;CACA,OACE,oBAAC,YAAD;EACE,MAAK;EACL,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,OAAO,MAAM;EACb,WAAW;EAEX,UAAA,oBAAC,OAAD;GACM;GACJ,MAAM,MAAM,QAAQ;GACpB,OAAO;GACP,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,cAAY,MAAM,QAAQ,KAAA,IAAa,MAAM,eAAe;GAC5D,WAAW,UAAU;IACnB,MAAM,OAAO,MAAM,OAAO;IAC1B,SAAS,IAAI;IACb,UAAU,SAAS,IAAI;IACvB,KAAK,IAAI;GACX;EACD,CAAA;CACS,CAAA;AAEhB;AAcA,MAAa,gBAAyC,EAAE,OAAO,MAAM,WAAW,iBAAiB;CAC/F,MAAM,KAAK,MAAM,MAAM;CACvB,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,SAAS,EAAE;CACpD,MAAM,OAAO,kBAAkB,UAAU,KAAK,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC,GAAG,UAAU;CAC9F,OACE,oBAAC,YAAD;EACE,MAAK;EACL,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,OAAO,MAAM;EACb,WAAW;EAEX,UAAA,oBAAC,UAAD;GACM;GACJ,OAAO;GACP,MAAM,MAAM,QAAQ;GACpB,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,cAAY,MAAM,QAAQ,KAAA,IAAa,MAAM,eAAe;GAC5D,WAAW,UAAU;IACnB,MAAM,OAAO,MAAM,OAAO;IAC1B,SAAS,IAAI;IACb,UAAU,SAAS,IAAI;IACvB,KAAK,IAAI;GACX;EACD,CAAA;CACS,CAAA;AAEhB;AAmBA,MAAa,cAAyC,EAAE,OAAO,MAAM,gBAAgB;CACnF,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,SAAS,IAAI;CACtD,MAAM,QAAQ,MAAM,cACZ,MAAM,QAAQ,KAAK,YAAY;EAAE,OAAO,OAAO;EAAO,OAAO,OAAO,SAAS,OAAO;CAAM,EAAE,GAClG,CAAC,MAAM,OAAO,CAChB;CACA,OACE,oBAAC,YAAD;EACE,MAAK;EACL,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,OAAO,MAAM;EAEb,UAAA,qBAAC,QAAD;GACS;GACP,OAAO;GACP,UAAU,MAAM;GAChB,gBAAgB,SAAS;IACvB,MAAM,QAAQ,SAAS,OAAO,KAAK,OAAO,IAAI;IAC9C,SAAS,KAAK;IACd,UAAU,SAAS,KAAK;IACxB,KAAK,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC;GAC1C;GATF,UAAA,CAWE,oBAAC,eAAD;IAAe,cAAY,MAAM,SAAS,MAAM,eAAe;IAC7D,UAAA,oBAAC,aAAD,EAAa,aAAa,MAAM,eAAe,UAAY,CAAA;GAC9C,CAAA,GACf,oBAAC,eAAD,EAAA,UACG,MAAM,QAAQ,KAAK,WAClB,oBAAC,YAAD;IAA+B,OAAO,OAAO;IAAO,UAAU,OAAO;IAClE,UAAA,OAAO,SAAS,OAAO;GACd,GAFK,OAAO,KAEZ,CACb,EACY,CAAA,CACT;;CACE,CAAA;AAEhB;AAUA,MAAa,gBAA6C,EAAE,OAAO,MAAM,gBAAgB;CACvF,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,WAAW,KAAK;CACzD,OACE,oBAAC,YAAD;EACE,MAAK;EACL,aAAa,MAAM;EACnB,aAAY;EAEZ,UAAA,qBAAC,SAAD;GAAO,WAAU;GAAjB,UAAA,CACE,oBAAC,QAAD;IAAM,WAAU;IACd,UAAA,oBAAC,UAAD;KACE,SAAS;KACT,UAAU,MAAM;KAChB,cAAY,MAAM,SAAS;KAC3B,kBAAkB,YAAY;MAC5B,SAAS,OAAO;MAChB,UAAU,WAAW,OAAO;MAC5B,KAAK,MAAM,UAAU,UAAU,EAAE,QAAQ,CAAC;KAC5C;IACD,CAAA;GACG,CAAA,GACN,oBAAC,QAAD,EAAA,UAAO,MAAM,MAAY,CAAA,CACpB;;CACG,CAAA;AAEhB;AAIA,MAAa,cAAyC,EAAE,OAAO,MAAM,gBAAgB;CACnF,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,WAAW,KAAK;CACzD,OACE,oBAAC,YAAD;EAAY,MAAK;EAAc,aAAa,MAAM;EAAa,aAAY;EACzE,UAAA,qBAAC,SAAD;GAAO,WAAU;GAAjB,UAAA,CACE,oBAAC,QAAD;IACE,SAAS;IACT,UAAU,MAAM;IAChB,cAAY,MAAM,SAAS;IAC3B,kBAAkB,YAAY;KAC5B,SAAS,OAAO;KAChB,UAAU,WAAW,OAAO;KAC5B,KAAK,MAAM,UAAU,UAAU,EAAE,QAAQ,CAAC;IAC5C;GACD,CAAA,GACD,oBAAC,QAAD,EAAA,UAAO,MAAM,MAAY,CAAA,CACpB;;CACG,CAAA;AAEhB;AAWA,MAAa,kBAAiD,EAAE,OAAO,MAAM,gBAAgB;CAC3F,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,SAAS,EAAE;CACpD,OACE,oBAAC,YAAD;EACE,MAAK;EACL,OAAO,MAAM;EACb,aAAa,MAAM;EAEnB,UAAA,oBAAC,YAAD;GACE,cAAY,MAAM,SAAS;GAC3B,OAAO;GACP,UAAU,MAAM;GAChB,gBAAgB,SAAS;IACvB,MAAM,QAAQ,OAAO,IAAI;IACzB,SAAS,KAAK;IACd,UAAU,SAAS,KAAK;IACxB,KAAK,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC;GAC1C;GAEC,UAAA,MAAM,QAAQ,KAAK,WAClB,qBAAC,SAAD;IAEE,WAAU;IAFZ,UAAA,CAIE,oBAAC,QAAD;KAAM,WAAU;KACd,UAAA,oBAAC,gBAAD;MAAgB,OAAO,OAAO;MAAO,UAAU,OAAO;KAAW,CAAA;IAC7D,CAAA,GACN,oBAAC,QAAD,EAAA,UAAO,OAAO,SAAS,OAAO,MAAY,CAAA,CACrC;GAPA,GAAA,OAAO,KAOP,CACR;EACS,CAAA;CACF,CAAA;AAEhB;AAcA,MAAa,iBAA+C,EAAE,OAAO,MAAM,gBAAgB;CACzF,MAAM,KAAK,MAAM,MAAM;CAEvB,MAAM,CAAC,OAAO,YAAY,SADZ,MAAM,QAAQ,aAAa,MAAM,KAAK,IAAI,KAAA,GACI,MAAM,SAAS,EAAE;CAC7E,OACE,oBAAC,YAAD;EACE,MAAK;EACL,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,OAAO,MAAM;EACb,WAAW;EAEX,UAAA,oBAAC,WAAD;GACM;GACJ,OAAO;GACP,KAAK,MAAM,MAAM,aAAa,MAAM,GAAG,IAAI,KAAA;GAC3C,KAAK,MAAM,MAAM,aAAa,MAAM,GAAG,IAAI,KAAA;GAC3C,UAAU,MAAM;GAChB,SAAS,QAAQ,MAAM,KAAK;GAC5B,cAAY,MAAM,SAAS;GAC3B,gBAAgB,SAAS;IACvB,SAAS,IAAI;IACb,MAAM,QAAQ,OAAO,cAAc,IAAI,IAAI;IAC3C,UAAU,SAAS,KAAK;IACxB,KAAK,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC;GAC1C;EACD,CAAA;CACS,CAAA;AAEhB;AAYA,MAAa,cAAyC,EAAE,OAAO,MAAM,gBACnE,oBAAC,QAAD;CACE,aAAU;CACV,WAAW;CACX,SAAS,MAAM,WAAW;CAC1B,MAAM,MAAM,QAAQ;CACpB,UAAU,MAAM;CAChB,eACE,KACE,MAAM,SACN,MAAM,SAAS,WAAW,SAC1B,MAAM,SAAS,EAAE,MAAM,UAAU,IAAI,CAAC,CACxC;CAGD,UAAA,MAAM;AACD,CAAA;AAaV,MAAa,kBAAiD,EAAE,YAC9D,oBAAC,QAAD;CAAM,aAAU;CAAmB,WAAW,GAAG,eAAe,MAAM;CACpE,UAAA,oBAAC,YAAD;EACE,SAAS,MAAM,WAAW;EAC1B,MAAM,MAAM,QAAQ;EACpB,MAAM,MAAM;EACZ,QAAQ,MAAM;EACd,KAAK,MAAM,WAAW,WAAW,wBAAwB,KAAA;EAExD,UAAA,MAAM;CACG,CAAA;AACR,CAAA;AASR,MAAa,YAAqC,EAAE,YAClD,oBAAC,KAAD;CACE,aAAU;CACV,MAAM,MAAM;CACZ,QAAQ,MAAM;CACd,KAAK,MAAM,WAAW,WAAW,wBAAwB,KAAA;CACzD,WAAW,GACT,QACA,oGACA,4CACF;CAEC,UAAA,MAAM;AACN,CAAA;AAYL,MAAa,aAAuC,EAAE,YACpD,oBAAC,OAAD;CAAO,aAAU;CAAa,WAAW;CAAQ,SAAS,MAAM,WAAW;CACxE,UAAA,MAAM;AACF,CAAA;AAST,MAAa,aAAuC,EAAE,YAAY;CAChE,MAAM,UAAU,MAAM,WAAW;CACjC,OACE,qBAAC,OAAD;EAAO,aAAU;EAAsB;EAAvC,UAAA,CACE,oBAAC,WAAD,EAAA,UAAY,WAAW,SAAoB,CAAA,GAC3C,qBAAC,OAAD,EAAA,UAAA,CACG,MAAM,QAAQ,oBAAC,YAAD,EAAA,UAAa,MAAM,MAAkB,CAAA,IAAI,MACvD,MAAM,cAAc,oBAAC,kBAAD,EAAA,UAAmB,MAAM,YAA8B,CAAA,IAAI,IAC7E,EAAA,CAAA,CACA;;AAEX;AAUA,MAAa,yBAAsD,EAAE,YACnE,qBAAC,UAAD;CACE,aAAU;CACV,OAAO,MAAM,UAAU,KAAA,IAAY,OAAO,MAAM;CAChD,KAAK,MAAM;CACX,cAAY,MAAM,SAAS;CAJ7B,UAAA,CAMG,MAAM,QAAQ,oBAAC,eAAD,EAAA,UAAgB,MAAM,MAAqB,CAAA,IAAI,MAC7D,MAAM,cAAc,QAAQ,OAAO,oBAAC,eAAD,CAAgB,CAAA,CAC5C;;AASZ,MAAa,iBAA+C,EAAE,YAC5D,oBAAC,WAAD;CACE,aAAU;CACV,WAAW;CACX,MAAM,MAAM,QAAQ;CACpB,MAAM,MAAM;CACZ,OAAO,MAAM;AACd,CAAA;AASH,MAAa,kBAAiD,EAAE,OAAO,eACrE,oBAAC,YAAD;CACE,aAAU;CACV,OAAO,MAAM;CACb,aAAa,MAAM;CACnB,MAAM,MAAM,QAAQ;CACpB,QAAQ,SAAS,SAAS,IAAI,oBAAC,OAAD;EAAK,WAAU;EAAc;CAAc,CAAA,IAAI,KAAA;AAC9E,CAAA;AAuCH,MAAaC,mBAA+C,EAC1D,OACA,MACA,wBACI;CACJ,MAAM,UAAU,MAAM,cAElB,MAAM,QAAQ,KAAK,YAAY;EAC7B,IAAI,OAAO;EACX,aAAa,OAAO;EACpB,QAAQ,OAAO,SAAS,OAAO;EAC/B,MAAM,OAAO;EACb,MAAM;GACJ,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,OAAO,OAAO,SAAS,OAAO;EAChC;CACF,EAAE,GACJ,CAAC,MAAM,OAAO,CAChB;CAEA,MAAM,SAAS,MAAM;CACrB,MAAM,WACJ,OAAO,SAAS,WAAW;EAAE,MAAM;EAAU,MAAM,OAAO;CAAK,IAAI,kBAAkB,OAAO,QAAQ;CAEtG,IAAI,CAAC,UACH,OACE,oBAAC,eAAD;EACE,OAAM;EACN,QAAQ,qCAAsC,OAAgC,SAAS;CACxF,CAAA;CAIL,OACE,oBAAC,OAAD;EAAK,aAAU;EACb,UAAA,oBAAC,WAAD;GACW;GACT,YAAY;GACZ,UAAU,MAAM,YAAY;GAC5B,SAAS,MAAM,WAAW;GAC1B,WAAW,MAAM;GACjB,mBAAmB,MAAM;GACzB,cAAc,MAAM;GACpB,aAAa,QAAQ,KAAK,MAAM,YAAY,YAAY,EAAE,IAAI,CAAC;EAChE,CAAA;CACE,CAAA;AAET;AAkBA,MAAa,aAAuC,EAAE,YACpD,qBAAC,OAAD;CAAK,aAAU;CAAa,WAAU;CAAtC,UAAA,CACG,MAAM,QACL,oBAAC,KAAD;EAAG,WAAU;EACV,UAAA,MAAM;CACN,CAAA,IACD,MACJ,oBAAC,OAAD;EACE,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,QAAQ,MAAM,UAAU;EACxB,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,OAAO,MAAM;EACb,SAAS,MAAM;EACf,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,IAAI,MAAM;EACV,cAAc,MAAM;CACrB,CAAA,CACE;;AAkBP,MAAa,YAAqC,EAAE,OAAO,UAAU,MAAM,gBAAgB;CACzF,MAAM,QAAQ,MAAM,KAAK,EAAE,EAAE,SAAS;CACtC,MAAM,CAAC,OAAO,YAAY,SAAS,MAAM,SAAS,KAAK;CACvD,OACE,qBAAC,MAAD;EACE,aAAU;EACV,OAAO;EACP,gBAAgB,SAAS;GACvB,MAAM,QAAQ,OAAO,IAAI;GACzB,SAAS,KAAK;GACd,UAAU,SAAS,KAAK;GACxB,KAAK,MAAM,UAAU,aAAa,EAAE,MAAM,CAAC;EAC7C;EARF,UAAA,CAUE,oBAAC,UAAD,EAAA,UACG,MAAM,KAAK,KAAK,QACf,oBAAC,aAAD;GAA6B,OAAO,IAAI;GACrC,UAAA,IAAI;EACM,GAFK,IAAI,KAET,CACd,EACO,CAAA,GACT,MAAM,KAAK,KAAK,KAAK,UACpB,oBAAC,aAAD;GAA6B,OAAO,IAAI;GACrC,UAAA,SAAS,UAAU;EACT,GAFK,IAAI,KAET,CACd,CACG;;AAEV;AAWA,MAAa,aAAuC,EAAE,YACpD,oBAAC,OAAD;CACE,aAAU;CACV,KAAK,MAAM;CACX,KAAK,MAAM;CACX,OAAO,MAAM;CACb,QAAQ,MAAM;CACd,WAAW,GACT,QACA,cACA,MAAM,QAAQ,UAAU,iBAAiB,kBACzC,MAAM,YAAY,QAAQ,KAAA,IAAY,iCACtC,yCACF;AACD,CAAA;;;;;;;;AAcH,SAAgB,cAAc,EAC5B,OACA,QACA,eAKC;CACD,OACE,qBAAC,OAAD;EAAO,aAAU;EAAa,SAAQ;EAAS,MAAK;EAApD,UAAA,CACE,oBAAC,WAAD,EAAA,UACE,oBAAC,cAAD,CAAe,CAAA,EACN,CAAA,GACX,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,YAAD,EAAA,UAAa,MAAkB,CAAA;IAC9B,SACC,oBAAC,kBAAD;KAAkB,WAAU;KACzB,UAAA;IACe,CAAA,IAChB;IACH,cACC,qBAAC,kBAAD;KAAkB,WAAU;KAA5B,UAAA,CAA8G,kBAC7F,WACC;IAChB,CAAA,IAAA;GACD;EACA,CAAA,CAAA;;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxhCA,SAAS,MAAS,YAA8D;CAC9E,OAAO;AACT;;;;;;;;AAaA,MAAM,SAAS,EACZ,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,oCAAoC;CAC9D,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAC/B,SAAS,CAAC,CACV,SAAS,8CAA8C;AAC5D,CAAC,CAAC,CACD,SAAS,0DAA0D;AAEtE,MAAM,SAAS,EAAE,OAAO;CACtB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,kCAAkC;CAC7D,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,gDAAgD;CACtF,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;AACjC,CAAC;AAED,MAAM,MAAM,EACT,MAAM;CAAC,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;AAAC,CAAC,CAAC,CACzG,SAAS,gCAAgC;AAE5C,MAAM,UAAU,EACb,MAAM;CAAC,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;CAAG,EAAE,QAAQ,CAAC;AAAC,CAAC,CAAC,CACzG,SAAS,qBAAqB;AAEjC,MAAM,YAAY,EACf,KAAK;CAAC;CAAS;CAAU;CAAO;CAAW;AAAU,CAAC,CAAC,CACvD,SAAS,uBAAuB;AAEnC,MAAM,gBAAgB,EACnB,KAAK;CAAC;CAAS;CAAU;CAAO;AAAS,CAAC,CAAC,CAC3C,SAAS,yBAAyB;AAErC,MAAM,cAAc;CAClB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,cAAc;CACpD,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,gCAAgC;CAC5E,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,mDAAmD;CACzF,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;AACjC;AAEA,MAAM,gBAAgB,EACnB,KAAK;CAAC;CAAW;CAAa;CAAW;CAAS;CAAQ;CAAe;AAAM,CAAC,CAAC,CACjF,SAAS,gBAAgB;AAE5B,MAAM,aAAa,EAAE,KAAK;CAAC;CAAM;CAAM;AAAI,CAAC,CAAC,CAAC,SAAS,eAAe;;;;;;;AAQtE,MAAM,gBAAgB,UACpB,MAAM,WAAW,GAAG,KAAK,MAAM,OAAO,OAAO,MAAM,OAAO;;;;;;;;AAS5D,MAAM,UAAU,EACb,OAAO,CAAC,CACR,QACE,UAAU,gBAAgB,KAAK,KAAK,KAAK,aAAa,KAAK,KAAK,MAAM,WAAW,GAAG,GACrF,oDACF,CAAC,CACA,SAAS,2DAA2D;AAEvE,MAAM,WAAW,EACd,OAAO,CAAC,CACR,QACE,UAAU,gBAAgB,KAAK,KAAK,KAAK,iBAAiB,KAAK,KAAK,KAAK,aAAa,KAAK,GAC5F,sDACF,CAAC,CACA,SAAS,uDAAuD;;AAGnE,MAAM,YAAY,EACf,KAAK;CACJ;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,CACD,SAAS,wDAAwD;;;;;;;;;AAUpE,MAAM,cAAc,EACjB,MAAM,CACL,EAAE,OAAO;CACP,MAAM,EAAE,QAAQ,QAAQ;CACxB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,mBAAmB;AAC/E,CAAC,GACD,EAAE,OAAO;CACP,MAAM,EAAE,QAAQ,QAAQ;CACxB,UAAU,EACP,OAAO,CAAC,CACR,SAAS,uEAAuE;AACrF,CAAC,CACH,CAAC,CAAC,CACD,SAAS,mCAAmC;AAM/C,MAAM,SAAS;CACb,QAAQ,MAAyB;EAC/B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GAAE,KAAK,IAAI,SAAS;GAAG,SAAS,QAAQ,SAAS;GAAG,OAAO,UAAU,SAAS;GAAG,SAAS,cAAc,SAAS;EAAE,CAAC;EACpI,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY;GACV;IAAE,IAAI;IAAO,WAAW;IAAU,KAAK;IAAG,UAAU,CAAC,SAAS,OAAO;GAAE;GACvE;IAAE,IAAI;IAAS,WAAW;IAAQ,MAAM;IAAS,MAAM;GAAO;GAC9D;IAAE,IAAI;IAAS,WAAW;IAAQ,MAAM;IAAU,MAAM;GAAO;EACjE,EACF;EACA,MAAMC;CACR,CAAC;CAED,KAAK,MAAsB;EACzB,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,KAAK,IAAI,SAAS;GAClB,SAAS,QAAQ,SAAS;GAC1B,OAAO,UAAU,SAAS;GAC1B,SAAS,cAAc,SAAS;GAChC,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6BAA6B;EACrE,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY;GACV;IAAE,IAAI;IAAO,WAAW;IAAO,KAAK;IAAG,UAAU,CAAC,SAAS,OAAO;GAAE;GACpE;IAAE,IAAI;IAAS,WAAW;IAAS,OAAO;IAAQ,SAAS;GAAO;GAClE;IAAE,IAAI;IAAS,WAAW;IAAS,OAAO;IAAU,SAAS;GAAU;EACzE,EACF;EACA,MAAMC;CACR,CAAC;CAED,MAAM,MAA2B;EAC/B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,qCAAqC;GAC7E,OAAO,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,0BAA0B;EACnE,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GAAE,IAAI;GAAQ,WAAW;GAAQ,UAAU,CAAC,WAAW;EAAE,GACzD;GAAE,IAAI;GAAa,WAAW;GAAQ,MAAM;GAAkB,MAAM;EAAO,CAC7E,EACF;EACA,MAAMC;CACR,CAAC;CAED,aAAa,MAAkC;EAC7C,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,eAAe;GAC1C,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,qBAAqB;GACjE,OAAO,EAAE,QAAQ,CAAC,CAAC,SAAS;EAC9B,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,aAAa;GACb,UAAU,CAAC,cAAc;EAC3B,GACA;GAAE,IAAI;GAAgB,WAAW;GAAQ,MAAM;GAAsB,MAAM;EAAO,CACpF,EACF;EACA,MAAMC;CACR,CAAC;CAED,SAAS,MAA0B;EACjC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;EAC9E,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EAAE,YAAY,CAAC;GAAE,IAAI;GAAW,WAAW;EAAU,CAAC,EAAE;EACjE,MAAMC;CACR,CAAC;CAED,QAAQ,MAAyB;EAC/B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC,SAAS,yBAAyB,EAAE,CAAC;EAC5E,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EAAE,YAAY,CAAC;GAAE,IAAI;GAAU,WAAW;GAAU,MAAM;EAAE,CAAC,EAAE;EACxE,MAAMC;CACR,CAAC;AACH;AAEA,MAAM,OAAO;CACX,MAAM,MAAuB;EAC3B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,mBAAmB;GAC7C,MAAM,EACH,KAAK;IAAC;IAAW;IAAc;IAAQ;IAAW;GAAS,CAAC,CAAC,CAC7D,SAAS,CAAC,CACV,SAAS,gCAAgC;GAC5C,MAAM,EACH,KAAK;IAAC;IAAW;IAAS;IAAW;IAAW;IAAU;GAAM,CAAC,CAAC,CAClE,SAAS,CAAC,CACV,SAAS,sCAAsC;GAClD,OAAO,EAAE,KAAK;IAAC;IAAS;IAAU;GAAK,CAAC,CAAC,CAAC,SAAS;GACnD,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+CAA+C;EACvF,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GAAE,IAAI;GAAW,WAAW;GAAQ,MAAM;GAAoB,MAAM;EAAU,CAChF,EACF;EACA,MAAMC;CACR,CAAC;CAED,UAAU,MAA+B;EACvC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,kBAAkB;GAC5C,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,mCAAmC;EAC9E,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,MAAM;GACN,SAAS;EACX,CACF,EACF;EACA,MAAMC;CACR,CAAC;AACH;AAEA,MAAM,QAAQ;CACZ,WAAW,MAA4B;EACrC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,GAAG;GACH,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2CAA2C;GACjF,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,MAAM,EACH,KAAK;IAAC;IAAQ;IAAS;IAAO;IAAO;IAAU;IAAY;GAAQ,CAAC,CAAC,CACrE,SAAS,CAAC,CACV,SAAS,2BAA2B;GACvC,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC/B,UAAU,OAAO,SAAS,CAAC,CAAC,SAAS,qCAAqC;EAC5E,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE;GAC3B,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,OAAO,EAAE,MAAM,aAAa;IAC5B,aAAa;IACb,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,EAAE;GAC7C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,UAAU,MAA2B;EACnC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,GAAG;GACH,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,0BAA0B;GACpF,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wBAAwB;GAClE,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE;GAC5B,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,OAAO,EAAE,MAAM,cAAc;IAC7B,MAAM;IACN,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,EAAE;GAC9C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,QAAQ,MAA6B;EACnC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,GAAG;GACH,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,6BAA6B;GACtE,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,QAAQ,aAAa,EAAE;GACvC,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,OAAO,EAAE,MAAM,eAAe;IAC9B,SAAS,CACP;KAAE,OAAO;KAAc,OAAO;IAAS,GACvC;KAAE,OAAO;KAAa,OAAO;IAAU,CACzC;IACA,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,EAAE;GAC/C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,UAAU,MAA+B;EACvC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,sBAAsB;GAC5D,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC/B,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC9B,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,OAAO,MAAM,EAAE;GAC/B,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,SAAS,EAAE,MAAM,cAAc;IAC/B,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,EAAE;GAC9C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,QAAQ,MAA6B;EACnC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC/B,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC9B,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE;GAC/B,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,SAAS,EAAE,MAAM,eAAe;IAChC,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,EAAE;GAC/C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,YAAY,MAAiC;EAC3C,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC/B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,sBAAsB;GAC/D,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE;GAC9B,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,OAAO,EAAE,MAAM,aAAa;IAC5B,SAAS,CACP;KAAE,OAAO;KAAQ,OAAO;IAAO,GAC/B;KAAE,OAAO;KAAO,OAAO;IAAM,CAC/B;IACA,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,EAAE;GAC7C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,WAAW,MAAgC;EACzC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,GAAG;GACH,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;GAC7D,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+BAA+B;GACnE,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6BAA6B;GACjE,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,QAAQ;EACjB,UAAU;EACV,SAAS;GACP,MAAM,EAAE,MAAM,EAAE,OAAO,aAAa,EAAE;GACtC,YAAY,CACV;IACE,IAAI;IACJ,WAAW;IACX,OAAO;IACP,OAAO,EAAE,MAAM,cAAc;IAC7B,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,EAAE;GAC9C,CACF;EACF;EACA,MAAMC;CACR,CAAC;CAED,QAAQ,MAA6B;EACnC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,cAAc;GACzC,SAAS,cAAc,SAAS,CAAC,CAAC,SAAS,iCAAiC;GAC5E,MAAM,WAAW,SAAS;GAC1B,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC/B,QAAQ,EACL,QAAQ,CAAC,CACT,SAAS,CAAC,CACV,SAAS,0EAA0E;GACtF,SAAS,OAAO,SAAS,CAAC,CAAC,SAAS,0CAA0C;EAChF,CAAC;EACD,QAAQ,CAAC,SAAS,QAAQ;EAC1B,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,SAAS;GACT,QAAQ;GACR,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,EAAE;EAC5C,CACF,EACF;EACA,MAAMC;CACR,CAAC;CAED,YAAY,MAAiC;EAC3C,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO;GAChB,MAAM;GACN,SAAS,cAAc,SAAS,CAAC,CAAC,SAAS,mCAAmC;GAC9E,MAAM,WAAW,SAAS;GAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,SAAS;EAC/C,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,MAAM;GACN,QAAQ;EACV,CACF,EACF;EACA,MAAMC;CACR,CAAC;AACH;AAEA,MAAM,WAAW;CACf,OAAO,MAA4B;EACjC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO;GAChB,SAAS,EACN,KAAK;IAAC;IAAW;IAAW;IAAW;IAAU;IAAQ;IAAW;GAAS,CAAC,CAAC,CAC/E,SAAS;EACd,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CAAC;GAAE,IAAI;GAAS,WAAW;GAAS,OAAO;GAAU,SAAS;EAAU,CAAC,EACvF;EACA,MAAMC;CACR,CAAC;CAED,OAAO,MAA4B;EACjC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,SAAS,EAAE,KAAK;IAAC;IAAW;IAAW;IAAQ;IAAU;GAAM,CAAC,CAAC,CAAC,SAAS;EAC7E,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,SAAS;GACT,OAAO;GACP,aAAa;EACf,CACF,EACF;EACA,MAAMC;CACR,CAAC;CAED,UAAU,MAA+B;EACvC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,qCAAqC;GACtF,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;GAC3D,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wCAAwC;EACrF,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GAAE,IAAI;GAAY,WAAW;GAAY,OAAO;GAAY,OAAO;EAAG,CACxE,EACF;EACA,MAAMC;CACR,CAAC;CAED,WAAW,MAAgC;EACzC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,MAAM,EAAE,KAAK;IAAC;IAAU;IAAW;IAAW;IAAU;IAAQ;GAAS,CAAC,CAAC,CAAC,SAAS;GACrF,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,yCAAyC;EACjF,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GAAE,IAAI;GAAU,WAAW;GAAa,OAAO;GAAW,MAAM;GAAW,MAAM;EAAK,CACxF,EACF;EACA,MAAMC;CACR,CAAC;CAED,YAAY,MAAiC;EAC3C,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO;GAChB,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;GACjC,MAAM,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC,SAAS;EAChD,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,aAAa;GACb,UAAU,CAAC,cAAc;EAC3B,GACA;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,SAAS;GACT,SAAS,EAAE,OAAO,EAAE,MAAM,eAAe,EAAE;EAC7C,CACF,EACF;EACA,MAAMC;CACR,CAAC;AACH;AAEA,MAAM,OAAO;CACX,WAAW,MAAgC;EACzC,MAAM;EACN,OAAO;EACP,SACE;EACF,OAAO,EAAE,OAAO;GACd,SAAS,EACN,MACC,EAAE,OAAO;IACP,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,iCAAiC;IACzD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,kCAAkC;IACxE,OAAO,EAAE,KAAK;KAAC;KAAS;KAAU;IAAK,CAAC,CAAC,CAAC,SAAS;IACnD,QAAQ,EACL,KAAK,CAAC,WAAW,MAAM,CAAC,CAAC,CACzB,SAAS,CAAC,CACV,SAAS,uCAAuC;IACnD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC7B,CAAC,CACH,CAAC,CACA,IAAI,CAAC;GACR,YAAY;GACZ,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,4BAA4B;GAC3F,SAAS,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC,SAAS;GACjD,mBAAmB,EAAE,OAAO,CAAC,CAAC,SAAS;GACvC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;GAClC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,8BAA8B;GACxE,YAAY,OAAO,SAAS,CAAC,CAAC,SAAS,8BAA8B;EACvE,CAAC;EACD,QAAQ,CAAC,UAAU;EACnB,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,SAAS;IACP;KAAE,IAAI;KAAQ,OAAO;IAAO;IAC5B;KAAE,IAAI;KAAU,OAAO;KAAU,QAAQ;IAAU;IACnD;KAAE,IAAI;KAAS,OAAO;KAAS,OAAO;IAAM;GAC9C;GACA,YAAY;IACV,MAAM;IACN,MAAM,CACJ;KAAE,MAAM;KAAgB,QAAQ;KAAU,OAAO;IAAG,GACpD;KAAE,MAAM;KAAgB,QAAQ;KAAW,OAAO;IAAE,CACtD;GACF;GACA,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,EAAE;EAC/C,CACF,EACF;EACA,MAAMC;CACR,CAAC;CAED,OAAO,MAA4B;EACjC,MAAM;EACN,OAAO;EACP,SACE;EACF,OAAO,EAAE,OAAO;GACd,MAAM;GACN,MAAM,EACH,QAAQ,CAAC,CACT,SACC,6NACF;GACF,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,0BAA0B;GAChE,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;GACtF,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC9B,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC7B,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS;GAC3B,OAAO,EAAE,KAAK,CAAC,cAAc,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6BAA6B;GAC5F,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,4BAA4B;GACpE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2BAA2B;GACzE,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,iCAAiC;GACtE,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+BAA+B;GAClE,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;EACpC,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,MAAM;GACN,OAAO;GACP,MAAM,CACJ;IAAE,OAAO;IAAO,SAAS;IAAI,MAAM;GAAG,GACtC;IAAE,OAAO;IAAO,SAAS;IAAI,MAAM;GAAG,CACxC;EACF,CACF,EACF;EACA,MAAMC;CACR,CAAC;AACH;AAEA,MAAM,QAAQ;CACZ,MAAM,MAA2B;EAC/B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,MAAM,EACH,MAAM,EAAE,OAAO;IAAE,OAAO,EAAE,OAAO;IAAG,OAAO,EAAE,OAAO;GAAE,CAAC,CAAC,CAAC,CACzD,IAAI,CAAC,CAAC,CACN,SAAS,oBAAoB;GAChC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,sCAAsC;GAC5E,UAAU,OAAO,SAAS;EAC5B,CAAC;EACD,QAAQ,CAAC,WAAW;EACpB,UAAU;EACV,SAAS,EACP,YAAY;GACV;IACE,IAAI;IACJ,WAAW;IACX,MAAM,CACJ;KAAE,OAAO;KAAW,OAAO;IAAU,GACrC;KAAE,OAAO;KAAU,OAAO;IAAS,CACrC;IACA,UAAU,CAAC,eAAe,YAAY;IACtC,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,EAAE;GAC5C;GACA;IAAE,IAAI;IAAe,WAAW;IAAQ,MAAM;IAAuB,MAAM;GAAO;GAClF;IAAE,IAAI;IAAc,WAAW;IAAQ,MAAM;IAAmB,MAAM;GAAO;EAC/E,EACF;EACA,MAAMC;CACR,CAAC;CAED,OAAO,MAA4B;EACjC,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,KAAK;GACL,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,6BAA6B;GACtD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;GAC3B,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;GAC5B,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+BAA+B;GACxE,KAAK,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,SAAS;EAC7C,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,KAAK;GACL,KAAK;GACL,QAAQ;EACV,CACF,EACF;EACA,MAAMC;CACR,CAAC;CAED,MAAM,MAA2B;EAC/B,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,OAAO;GAChB,MAAM;GACN,QAAQ,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,SAAS;EAC/C,CAAC;EACD,QAAQ,CAAC;EACT,UAAU;EACV,SAAS,EACP,YAAY,CACV;GACE,IAAI;GACJ,WAAW;GACX,OAAO;GACP,MAAM;GACN,QAAQ;EACV,CACF,EACF;EACA,MAAMC;CACR,CAAC;AACH;;;;;;;;AASA,MAAa,mBAAkC,OAAO,OAAO;CAC3D,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL,CAAC;;AAGD,MAAa,oBAAoB;;AAGjC,SAAgB,eAAe,YAA2B,kBAA4B;CACpF,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,KAAK;AACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACl6BA,MAAa,0BAA0B;;AAGvC,MAAa,eAAe;AA2H5B,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;AAGA,SAAgB,cAAc,OAA0C;CACtE,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,KAAK,KAAK,CAAC,CAAC,WAAW;AAC5F;;;;;;;;;AAUA,SAAgB,kBAAkB,OAGhC;CACA,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;EAAE,UAAU,CAAC;EAAG,QAAQ,CAAC;CAAE;CAEpC,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,UAAU,MAAM,KAAK;EAC3B,IAAI,CAAC,SACH,OAAO;GAAE,UAAU,CAAC;GAAG,QAAQ,CAAC;EAAE;EAEpC,IAAI,QAAQ,WAAW,GAAG,GACxB,IAAI;GACF,MAAM,SAAkB,KAAK,MAAM,OAAO;GAC1C,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO,QAAQ,MAAM;GAEvB,OAAO;IAAE,UAAU,CAAC;IAAG,QAAQ,CAAC,qCAAqC;GAAE;EACzE,SAAS,OAAO;GACd,OAAO;IAAE,UAAU,CAAC;IAAG,QAAQ,CAAC,mBAAmB,UAAU,KAAK,GAAG;GAAE;EACzE;EAEF,MAAM,WAA0B,CAAC;EACjC,MAAM,SAAmB,CAAC;EAC1B,MAAM,QAAQ,QAAQ,MAAM,IAAI;EAChC,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;GACpD,MAAM,QAAQ,MAAM,UAAU,GAAA,CAAI,KAAK;GACvC,IAAI,CAAC,MACH;GAEF,IAAI;IAEF,MAAM,MAAM,QAAQ,CADI,KAAK,MAAM,IACT,CAAC,CAAC;IAC5B,SAAS,KAAK,GAAG,IAAI,QAAQ;IAC7B,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,SAAS,QAAQ,QAAQ,EAAE,IAAI,MAAM,CAAC;GACvE,SAAS,OAAO;IACd,OAAO,KAAK,QAAQ,QAAQ,EAAE,oBAAoB,UAAU,KAAK,EAAE,GAAG;GACxE;EACF;EACA,OAAO;GAAE;GAAU;EAAO;CAC5B;CACA,OAAO,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;AACvD;AAEA,SAAS,QAAQ,QAA2E;CAC1F,MAAM,WAA0B,CAAC;CACjC,MAAM,SAAmB,CAAC;CAC1B,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;EACrD,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,SAAS,KAAK,GAAG;GACpB,OAAO,KAAK,WAAW,QAAQ,EAAE,mBAAmB;GACpD;EACF;EACA,SAAS,KAAK,KAAoB;CACpC;CACA,OAAO;EAAE;EAAU;CAAO;AAC5B;AAEA,SAAS,UAAU,OAAwB;CACzC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;;;;;;;;AAmBA,SAAgB,aAAa,OAAyC;CACpE,MAAM,EAAE,UAAU,WAAW,kBAAkB,KAAK;CACpD,MAAM,2BAAW,IAAI,IAA4B;CACjD,MAAM,QAAkB,CAAC;CAEzB,MAAM,cAAc,OAA2C;EAC7D,MAAM,MAAM,MAAM,GAAG,KAAK,IAAI,KAAK;EACnC,IAAI,UAAU,SAAS,IAAI,GAAG;EAC9B,IAAI,CAAC,SAAS;GACZ,UAAU;IAAE,IAAI;IAAK,MAAM,KAAA;IAAW,4BAAY,IAAI,IAAI;IAAG,WAAW,CAAC;IAAG,QAAQ,CAAC;GAAE;GACvF,SAAS,IAAI,KAAK,OAAO;GACzB,MAAM,KAAK,GAAG;EAChB;EACA,OAAO;CACT;CAEA,MAAM,mBAAmB,SAA2C,UAAwB;EAC1F,IAAI,CAAC,SACH;EAEF,MAAM,UAAU,WAAW,QAAQ,SAAS;EAC5C,IAAI,CAAC,MAAM,QAAQ,QAAQ,UAAU,GAAG;GACtC,OAAO,KAAK,WAAW,QAAQ,EAAE,+BAA+B;GAChE;EACF;EACA,KAAK,MAAM,QAAQ,QAAQ,YAAY;GACrC,IAAI,CAAC,SAAS,IAAI,KAAK,OAAO,KAAK,OAAO,YAAY,CAAC,KAAK,IAAI;IAC9D,OAAO,KAAK,WAAW,QAAQ,EAAE,sCAAsC;IACvE;GACF;GACA,QAAQ,WAAW,IAAI,KAAK,IAAI,IAAyB;EAC3D;EACA,IAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,MAC9C,QAAQ,OAAO,QAAQ;CAE3B;CAEA,MAAM,aAAa,YAAmD;EACpE,IAAI,CAAC,SACH;EAEF,MAAM,UAAU,WAAW,QAAQ,SAAS;EAC5C,MAAM,QAAQ,QAAQ,UAAU,KAAA,IAAY,QAAQ,QAAQ,QAAQ;EACpE,MAAM,OAAO,QAAQ,QAAQ,QAAQ,KAAK,KAAK,IAAI,QAAQ,OAAO;EAClE,QAAQ,YAAY,aAAa,QAAQ,WAAW,MAAM,KAAK;CACjE;CAEA,KAAK,IAAI,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;EACvD,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SACH;EAEF,IAAI,QAAQ,eAAe;GACzB,MAAM,UAAU,WAAW,QAAQ,cAAc,SAAS;GAC1D,IAAI,OAAO,QAAQ,cAAc,SAAS,YAAY,QAAQ,cAAc,MAC1E,QAAQ,OAAO,QAAQ,cAAc;EAEzC;EACA,IAAI,QAAQ,gBAAgB;GAC1B,MAAM,UAAU,WAAW,QAAQ,eAAe,SAAS;GAC3D,IAAI,OAAO,QAAQ,eAAe,SAAS,YAAY,QAAQ,eAAe,MAC5E,QAAQ,OAAO,QAAQ,eAAe;GAExC,IAAI,SAAS,QAAQ,eAAe,MAAM,GACxC,QAAQ,SAAS;IAAE,GAAG,QAAQ;IAAQ,GAAG,QAAQ,eAAe;GAAO;EAE3E;EACA,gBAAgB,QAAQ,kBAAkB,KAAK;EAC/C,gBAAgB,QAAQ,eAAe,KAAK;EAC5C,UAAU,QAAQ,eAAe;EACjC,UAAU,QAAQ,eAAe;EACjC,IAAI,QAAQ,eAAe;GACzB,MAAM,MAAM,QAAQ,cAAc,aAAA;GAClC,SAAS,OAAO,GAAG;GACnB,MAAM,KAAK,MAAM,QAAQ,GAAG;GAC5B,IAAI,OAAO,IACT,MAAM,OAAO,IAAI,CAAC;EAEtB;EASA,IAAI,EAPF,QAAQ,iBACR,QAAQ,oBACR,QAAQ,mBACR,QAAQ,iBACR,QAAQ,kBACR,QAAQ,iBACR,QAAQ,kBAER,OAAO,KACL,WAAW,QAAQ,EAAE,wIACvB;CAEJ;CAEA,MAAM,SAAwB,CAAC;CAC/B,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,UAAU,SAAS,IAAI,GAAG;EAChC,IAAI,CAAC,SACH;EAEF,OAAO,KAAK;GACV,IAAI,QAAQ;GACZ,MAAM,QAAQ,QAAQ,YAAY,QAAQ,UAAU;GACpD,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,QAAQ,QAAQ;EAClB,CAAC;CACH;CACA,OAAO;EAAE,UAAU;EAAQ;CAAO;AACpC;;AAGA,SAAS,YAAY,YAAwE;CAC3F,IAAI,WAAW,IAAI,MAAM,GACvB,OAAO;CAET,KAAK,MAAM,MAAM,WAAW,KAAK,GAC/B,OAAO;AAGX;;AAGA,SAAgB,gBAAgB,SAA2B;CACzD,MAAM,UAAU,QAAQ,KAAK;CAC7B,IAAI,CAAC,WAAW,YAAY,OAAO,YAAY,KAC7C,OAAO,CAAC;CAGV,QADa,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI,QAAA,CAEvD,MAAM,GAAG,CAAC,CACV,QAAQ,YAAY,YAAY,EAAE,CAAC,CACnC,KAAK,YAAY,QAAQ,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC;AACrE;;AAGA,SAAgB,eAAe,MAAc,aAA6B;CACxE,IAAI,KAAK,WAAW,GAAG,GACrB,OAAO;CAET,MAAM,WAAW,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK,QAAQ,UAAU,EAAE;CAC7E,MAAM,OAAO,gBAAgB,OAAO,CAAC,cAAc,KAAK,YAAY,QAAQ,OAAO,EAAE;CACrF,IAAI,CAAC,UACH,OAAO,QAAQ;CAEjB,OAAO,GAAG,KAAK,GAAG;AACpB;;AAGA,SAAgB,aAAa,OAAgB,SAA0B;CACrE,IAAI,UAAmB;CACvB,KAAK,MAAM,WAAW,gBAAgB,OAAO,GAAG;EAC9C,IAAI,MAAM,QAAQ,OAAO,GAAG;GAC1B,MAAM,QAAQ,OAAO,OAAO;GAC5B,UAAU,OAAO,UAAU,KAAK,IAAI,QAAQ,SAAS,KAAA;EACvD,OAAO,IAAI,SAAS,OAAO,GACzB,UAAU,QAAQ;OAElB;EAEF,IAAI,YAAY,KAAA,GACd;CAEJ;CACA,OAAO;AACT;;;;;;;;AASA,SAAgB,aACd,OACA,SACA,OACyB;CACzB,MAAM,WAAW,gBAAgB,OAAO;CACxC,IAAI,SAAS,WAAW,GACtB,OAAO,SAAS,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC;CAE3C,MAAM,QAAiC,EAAE,GAAG,MAAM;CAClD,IAAI,SAA8C;CAClD,KAAK,IAAI,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG;EAC3D,MAAM,UAAU,SAAS,UAAU;EACnC,MAAM,cAAc,SAAS,QAAQ,MAAM;EAC3C,MAAM,aAAa,QAAQ,KAAK,WAAW;EAC3C,MAAM,WAAoB,MAAM,QAAQ,MAAM,IAC1C,OAAO,OAAO,OAAO,KACpB,OAAmC;EACxC,IAAI;EACJ,IAAI,MAAM,QAAQ,QAAQ,GACxB,OAAO,CAAC,GAAG,QAAQ;OACd,IAAI,SAAS,QAAQ,GAC1B,OAAO,EAAE,GAAG,SAAS;OAErB,OAAO,aAAa,CAAC,IAAI,CAAC;EAE5B,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO,OAAO,OAAO,KAAK;OAE1B,OAAoC,WAAW;EAEjD,SAAS;CACX;CACA,MAAM,OAAO,SAAS,SAAS,SAAS,MAAM;CAC9C,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO,OAAO,IAAI,KAAK;MAEvB,OAAoC,QAAQ;CAE9C,OAAO;AACT;AAQA,SAAgB,aAAa,MAAyB,YAAmD;CACvG,MAAM,MAAO,KAAK,YAAY,WAAW;CACzC,IAAI,CAAC,KACH,OAAO,EAAE,MAAM,OAAO;CAExB,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO;EAAE,MAAM;EAAQ,KAAK,IAAI,QAAQ,OAAqB,OAAO,OAAO,QAAQ;CAAE;CAEvF,IAAI,SAAS,GAAG,GAAG;EACjB,MAAM,SAAkC;EACxC,MAAM,eAAe,OAAO;EAC5B,IAAI,MAAM,QAAQ,YAAY,GAC5B,OAAO;GACL,MAAM;GACN,KAAK,aAAa,QAAQ,OAAqB,OAAO,OAAO,QAAQ;EACvE;EAEF,MAAM,WAAW,OAAO;EACxB,IAAI,SAAS,QAAQ,GAAG;GACtB,MAAM,EAAE,aAAa,gBAAgB;GACrC,IAAI,OAAO,gBAAgB,YAAY,OAAO,gBAAgB,UAC5D,OAAO;IAAE,MAAM;IAAY;IAAa,MAAM;GAAY;EAE9D;EACA,IAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,OAAO,SAAS,UACnE,OAAO;GAAE,MAAM;GAAY,aAAa,OAAO;GAAa,MAAM,OAAO;EAAK;CAElF;CACA,OAAO,EAAE,MAAM,OAAO;AACxB;;;;;AAMA,SAAgB,cACd,MACmE;CACnE,IAAI,OAAO,KAAK,cAAc,UAAU;EACtC,MAAM,EAAE,IAAI,KAAK,WAAW,YAAY,UAAU,WAAW,QAAQ,SAAS,GAAG,SAAS;EAC1F,OAAO;GAAE,MAAM,KAAK;GAAW,YAAY;EAAK;CAClD;CACA,IAAI,SAAS,KAAK,SAAS,GAAG;EAC5B,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC;EACzC,IAAI,CAAC,MACH;EAEF,MAAM,aAAc,KAAK,UAAsC;EAC/D,OAAO;GAAE;GAAM,YAAY,SAAS,UAAU,IAAI,aAAa,CAAC;EAAE;CACpE;AAEF;;;;;;;;AASA,SAAgB,aACd,OACA,OACA,aACS;CACT,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAK,SAAS,aAAa,MAAM,OAAO,WAAW,CAAC;CAEnE,IAAI,SAAS,KAAK,GAAG;EACnB,IAAI,cAAc,KAAK,GACrB,OAAO,aAAa,OAAO,eAAe,MAAM,MAAM,WAAW,CAAC;EAEpE,IAAI,mBAAmB,SAAS,OAAO,MAAM,kBAAkB,UAC7D,OAAO,MAAM;EAEf,IAAI,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,WAAW,GACtD,OAAO,MAAM;EAEf,MAAM,MAA+B,CAAC;EACtC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAC5C,IAAI,OAAO,aAAa,MAAM,OAAO,WAAW;EAElD,OAAO;CACT;CACA,OAAO;AACT;;;;;;;AAgBA,SAAgB,WACd,OACgE;CAChE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAC1C,OAAO;EAAE,MAAM;EAAO,SAAS,CAAC;CAAE;CAEpC,IAAI,CAAC,SAAS,KAAK,GACjB;CAEF,MAAM,QAAQ,SAAS,MAAM,KAAK,IAAI,MAAM,QAAQ;CACpD,MAAM,OAAO,MAAM;CACnB,IAAI,OAAO,SAAS,YAAY,CAAC,MAC/B;CAEF,OAAO;EAAE;EAAM,SAAS,SAAS,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;CAAE;AACvE;;;;;;;;;;;;;;;;;;;;;;;;;;ACvhBA,SAAS,aAAa,QAAwC;CAC5D,MAAM,YAAa,EAChB;CACH,IAAI,OAAO,cAAc,YACvB,MAAM,IAAI,MACR,2FACF;CAEF,OAAO,UAAU,QAAQ;EAAE,IAAI;EAAS,iBAAiB;CAAM,CAAC;AAClE;;AAGA,SAAgB,kBAAkB,YAA2B,kBAAoC;CAC/F,MAAM,aAAa,OAAO,OAAO,SAAS,CAAC,CACxC,KAAK,UAA4B;EAChC,MAAM,SAAS,aAAa,MAAM,KAAsC;EACxE,MAAM,aAAc,OAAO,cAAc,CAAC;EAC1C,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAK,OAAO,WAAwB,CAAC;EACnF,OAAO;GACL,MAAM,MAAM;GACZ,OAAO,MAAM;GACb,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,QAAQ,CAAC,GAAG,MAAM,MAAM;GACxB,OAAO;GACP;GACA,SAAS;IACP,YAAY,MAAM,QAAQ;IAC1B,GAAI,MAAM,QAAQ,OAAO,EAAE,MAAM,MAAM,QAAQ,KAAK,IAAI,CAAC;GAC3D;EACF;CACF,CAAC,CAAC,CACD,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;CAE9C,OAAO;EACL,aAAa;EACb,UAAU;EACV,WAAW;EACX;CACF;AACF;AAEA,MAAM,cAA2B;CAAC;CAAU;CAAQ;CAAS;CAAY;AAAM;AAE/E,MAAM,cAAyC;CAC7C,QAAQ;CACR,MAAM;CACN,OAAO;CACP,UAAU;CACV,MAAM;AACR;;AAGA,SAAS,aAAa,QAAyB;CAC7C,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAET,MAAM,OAAO;CACb,IAAI,MAAM,QAAQ,KAAK,IAAI,GACzB,OAAO,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO;CAErE,IAAI,MAAM,QAAQ,KAAK,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK,GAEvD,QADiB,KAAK,SAAS,KAAK,MAAA,CACrB,KAAK,WAAW,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO;CAEnE,IAAI,KAAK,UAAU,KAAA,GACjB,OAAO,KAAK,UAAU,KAAK,KAAK;CAElC,IAAI,KAAK,SAAS,SAChB,OAAO,GAAG,aAAa,KAAK,KAAK,EAAE;CAErC,IAAI,OAAO,KAAK,SAAS,UACvB,OAAO,KAAK;CAEd,IAAI,MAAM,QAAQ,KAAK,IAAI,GACzB,OAAO,KAAK,KAAK,KAAK,OAAO;CAE/B,OAAO;AACT;AAEA,SAAS,WAAW,MAAsB;CACxC,OAAO,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;AAC9D;;;;;;;;AASA,SAAgB,kBAAkB,MAAwB,kBAAkB,GAAW;CACrF,MAAM,QAAkB,CAAC;CACzB,MAAM,KAAK,+BAA+B;CAC1C,MAAM,KAAK,EAAE;CACb,MAAM,KACJ,cAAc,IAAI,SAAS,kBAAkB,IAAI,YAAY,oFAC/D;CACA,MAAM,KAAK,EAAE;CACb,MAAM,KACJ,ibACF;CACA,MAAM,KAAK,EAAE;CACb,MAAM,KAAK,GAAG,IAAI,WAAW,OAAO,aAAa;CACjD,MAAM,KAAK,EAAE;CAEb,KAAK,MAAM,SAAS,aAAa;EAC/B,MAAM,UAAU,IAAI,WAAW,QAAQ,cAAc,UAAU,UAAU,KAAK;EAC9E,IAAI,QAAQ,WAAW,GACrB;EAEF,MAAM,KAAK,MAAM,YAAY,QAAQ;EACrC,MAAM,KAAK,EAAE;EACb,KAAK,MAAM,aAAa,SAAS;GAC/B,MAAM,KAAK,OAAO,UAAU,MAAM;GAClC,MAAM,KAAK,EAAE;GACb,MAAM,KAAK,UAAU,OAAO;GAC5B,MAAM,KAAK,EAAE;GACb,MAAM,KACJ,aAAa,UAAU,aAAa,SAAS,QAAQ,KAAK,YACxD,UAAU,OAAO,SAAS,IAAI,UAAU,OAAO,KAAK,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,OACpF,EACH;GACA,MAAM,KAAK,EAAE;GACb,MAAM,gBAAgB,OAAO,KAAK,UAAU,KAAK;GACjD,IAAI,cAAc,SAAS,GAAG;IAC5B,MAAM,KAAK,8CAA8C;IACzD,MAAM,KAAK,2BAA2B;IACtC,KAAK,MAAM,QAAQ,eAAe;KAChC,MAAM,SAAS,UAAU,MAAM;KAC/B,MAAM,cACJ,OAAO,QAAQ,gBAAgB,WAAW,OAAO,cAAc;KACjE,MAAM,KACJ,OAAO,KAAK,OAAO,WAAW,aAAa,MAAM,CAAC,EAAE,KAClD,UAAU,SAAS,SAAS,IAAI,IAAI,QAAQ,KAC7C,KAAK,WAAW,WAAW,EAAE,GAChC;IACF;IACA,MAAM,KAAK,EAAE;GACf;GACA,MAAM,KAAK,SAAS;GACpB,MAAM,KAAK,KAAK,UAAU,gBAAgB,SAAS,GAAG,MAAM,CAAC,CAAC;GAC9D,MAAM,KAAK,KAAK;GAChB,MAAM,KAAK,EAAE;EACf;CACF;CACA,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE;AACvC;;AAGA,SAAgB,gBAAgB,WAAwC;CAEtE,MAAM,WAAsB,CAC1B;EAAE,SAAS;EAAQ,eAAe;GAAE,WAAW;GAAQ,MAF5C,UAAU,QAAQ,WAAW,EAAE,EAAE,MAAM;EAEU;CAAE,GAC9D;EAAE,SAAS;EAAQ,kBAAkB;GAAE,WAAW;GAAQ,YAAY,UAAU,QAAQ;EAAW;CAAE,CACvG;CACA,IAAI,UAAU,QAAQ,MACpB,SAAS,KAAK;EACZ,SAAS;EACT,iBAAiB;GAAE,WAAW;GAAQ,MAAM;GAAK,OAAO,UAAU,QAAQ;EAAK;CACjF,CAAC;CAEH,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjIA,MAAM,YAAY;;;;;;;;;;;;;AAwBlB,SAAgB,aAAa,EAC3B,SACA,YAAY,kBACZ,UACA,mBACA,WACA,aAAa,KACb,aACoB;CACpB,MAAM,OAAO,MAAM,cAAc,aAAa,OAAO,GAAG,CAAC,OAAO,CAAC;CAKjE,MAAM,CAAC,QAAQ,aAAa,MAAM,eAChC,WAAW,KAAK,QAAQ,CAC1B;CACA,MAAM,WAAW,MAAM,OAAO,IAAI;CAClC,IAAI,SAAS,YAAY,MAAM;EAC7B,SAAS,UAAU;EACnB,UAAU,WAAW,KAAK,QAAQ,CAAC;CACrC;CAEA,MAAM,UAAU,MAAM,aACnB,aAAqB,oBAAoB,QAAQ,GAClD,CAAC,iBAAiB,CACpB;CAEA,MAAM,WAAW,YACb,KAAK,SAAS,QAAQ,YAAY,QAAQ,OAAO,SAAS,IAC1D,KAAK;CAET,MAAM,iBAAiB,QAAQ,SAAS,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,SAAS;CAE7F,OACE,qBAAC,OAAD;EAAK,aAAU;EAAgB,WAAW,GAAG,+BAA+B,SAAS;EAArF,UAAA;GACG,KAAK,OAAO,SAAS,IACpB,oBAAC,eAAD;IACE,OAAM;IACN,QAAQ,KAAK,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;GACzC,CAAA,IACC;GACH,iBACC,oBAAC,eAAD;IACE,OAAM;IACN,QAAQ,eAAe,UAAU;GAClC,CAAA,IACC;GACH,SAAS,KAAK,YACb,oBAAC,iBAAD;IAEW;IACE;IACX,OAAO,OAAO,QAAQ,OAAO,QAAQ;IACrC,WAAW,YACT,WAAW,aAAa;KACtB,GAAG;MACF,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,SAAS;IAChE,EAAE;IAEM;IACV,mBAAmB;IACP;GACb,GAbM,QAAQ,EAad,CACF;EACE;;AAET;AAEA,SAAS,WAAW,UAA2E;CAC7F,MAAM,SAAkD,CAAC;CACzD,KAAK,MAAM,WAAW,UACpB,OAAO,QAAQ,MAAM,QAAQ;CAE/B,OAAO;AACT;AAEA,SAAS,gBAAgB,EACvB,SACA,WACA,OACA,UACA,UACA,mBACA,cASC;CACD,MAAM,UAAuB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,IAAI,CAAC,QAAQ,MACX,OACE,oBAAC,OAAD;EAAK,aAAU;EAAe,mBAAiB,QAAQ;EACrD,UAAA,oBAAC,eAAD;GACE,OAAM;GACN,QAAQ,YAAY,QAAQ,GAAG;EAChC,CAAA;CACE,CAAA;CAIT,OACE,oBAAC,OAAD;EAAK,aAAU;EAAe,mBAAiB,QAAQ;EAAI,WAAU;EACnE,UAAA,oBAAC,UAAD;GAAmB;GAAS,IAAI,QAAQ;GAAM,aAAY;GAAI,WAAW,CAAC;GAAG,OAAO;EAAI,CAAA;CACrF,CAAA;AAET;AAEA,SAAS,SAAS,EAChB,SACA,IACA,aACA,WACA,SAOC;CACD,MAAM,OAAO,QAAQ,QAAQ,WAAW,IAAI,EAAE;CAE9C,IAAI,CAAC,MACH,OAAO,oBAAC,eAAD;EAAe,OAAM;EAAuB,QAAQ,iBAAiB,GAAG;CAAsB,CAAA;CAEvG,IAAI,UAAU,SAAS,EAAE,GACvB,OACE,oBAAC,eAAD;EACE,OAAM;EACN,QAAQ,IAAI,GAAG,sCAAsC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE;EACpF,aAAa;CACd,CAAA;CAGL,IAAI,QAAQ,WACV,OACE,oBAAC,eAAD;EACE,OAAM;EACN,QAAQ,aAAa,UAAU;EAC/B,aAAa;CACd,CAAA;CAIL,MAAM,cAAc,cAAc,IAAI;CACtC,IAAI,CAAC,aACH,OACE,oBAAC,eAAD;EACE,OAAM;EACN,QAAO;EACP,aAAa;CACd,CAAA;CAIL,MAAM,QAAQ,QAAQ,UAAU,YAAY;CAC5C,IAAI,CAAC,OACH,OACE,oBAAC,eAAD;EACE,OAAO,sBAAsB,YAAY,KAAK;EAC9C,QAAQ,sBAAsB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE;EAC/E,aAAa;CACd,CAAA;CAML,MAAM,MAAM,YAAY;CACxB,MAAM,WAAmC,CAAC;CAC1C,MAAM,WAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;EAC9C,IAAI,QAAQ,YACV;EAEF,IAAI,cAAc,KAAK,GACrB,SAAS,OAAO,eAAe,MAAM,MAAM,WAAW;EAExD,MAAM,OAAO,aAAa,OAAO,QAAQ,OAAO,WAAW;EAC3D,SAAS,OAAO,IAAI,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI;CAC5D;CAEA,MAAM,SAAS,MAAM,MAAM,UAAU,QAAQ;CAC7C,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,SAAS,OAAO,MAAM,OACzB,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,UAAU,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,SAAS,IAAI,MAAM,SAAS,CAAC,CACvE,KAAK,IAAI;EACZ,OACE,oBAAC,eAAD;GACE,OAAO,qBAAqB,YAAY;GACxC,QAAQ;GACR,aAAa;EACd,CAAA;CAEL;CAEA,MAAM,OAAqB;EACzB,WAAW,QAAQ,QAAQ;EAC3B,aAAa;EACb,iBAAiB;CACnB;CAEA,MAAM,WACJ,MAAM,aAAa,SACf,eAAe,SAAS,MAAM,KAAK,aAAa,CAAC,GAAG,WAAW,EAAE,GAAG,KAAK,IACzE,CAAC;CAEP,MAAM,QACJ,QACA,cACA,YACG;EACH,QAAQ,WAAW;GACjB,WAAW,QAAQ,QAAQ;GAC3B,aAAa;GACb,MAAM,QAAQ,QAAQ;GACtB,SAAS;IAAE,GAAI,QAAQ,WAAW,CAAC;IAAI,GAAI,WAAW,CAAC;GAAG;EAC5D,CAAC;CACH;CAEA,MAAM,aAAa,UAAkB,UAAmB;EACtD,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SACH;EAEF,QAAQ,UAAU,UAAU,aAAa,OAAO,SAAS,KAAK,CAAC;CACjE;CAEA,MAAM,OAAO,MAAM;CAWnB,OACE,oBAAC,MAAD;EACE,OAAO,OAAO;EACR;EACN,WAAW,QAAQ;EACb;EACK;EACX,mBAAmB,QAAQ;EAC3B,YAAY,QAAQ;EAEnB;CACG,CAAA;AAEV;;;;;;;;;AAUA,SAAS,eACP,SACA,MACA,YACA,aACA,WACA,OACmB;CACnB,MAAM,WAAW,aAAa,MAAM,UAAU;CAC9C,IAAI,SAAS,SAAS,QACpB,OAAO,CAAC;CAEV,IAAI,SAAS,SAAS,QACpB,OAAO,SAAS,IAAI,KAAK,YACvB,oBAAC,UAAD;EAEW;EACT,IAAI;EACS;EACF;EACX,OAAO,QAAQ;CAChB,GANM,OAMN,CACF;CAEH,MAAM,UAAU,eAAe,SAAS,MAAM,WAAW;CACzD,MAAM,QAAQ,aAAa,EAAE,MAAM,SAAS,KAAK,GAAG,QAAQ,OAAO,WAAW;CAC9E,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CACL,oBAAC,eAAD;EAEE,OAAM;EACN,QAAQ,IAAI,QAAQ;CACrB,GAHK,gBAGL,CACH;CAEF,OAAO,MAAM,KAAK,OAAO,UACvB,oBAAC,UAAD;EAEW;EACT,IAAI,SAAS;EACb,aAAa,GAAG,YAAY,MAAM,KAAK,QAAQ,GAAG;EACvC;EACX,OAAO,QAAQ;CAChB,GANM,GAAG,SAAS,YAAY,GAAG,OAMjC,CACF;AACH;;;;;;;;;;;;;;;ACjaA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAwC;CACzE,OACE,oBAACC,YAAmB,MAApB;EACE,aAAU;EACV,WAAW,GAAG,wBAAwB,SAAS;EAC/C,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;CAC7E,OACE,oBAACA,YAAmB,MAApB;EACE,aAAU;EACV,WAAW,GAAG,sDAAsD,SAAS;EAC7E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,UAAU,GAAG,SAA2C;CAC7F,OACE,oBAACA,YAAmB,QAApB;EAA2B,aAAU;EAAmB,WAAU;EAChE,UAAA,qBAACA,YAAmB,SAApB;GACE,aAAU;GACV,WAAW,GACT,gEACA,sFACA,8CACA,kFACA,mFACA,kEACA,uCACA,SACF;GACA,GAAI;GAZN,UAAA,CAcG,UACD,oBAAC,aAAD;IACE,eAAA;IACA,WAAW,GACT,+FACA,mFACF;GACD,CAAA,CACyB;;CACH,CAAA;AAE/B;AAEA,SAAS,iBAAiB,EAAE,WAAW,UAAU,GAAG,SAAyC;CAC3F,OACE,oBAACA,YAAmB,OAApB;EACE,aAAU;EACV,WAAW,GACT,0DACA,gFACA,oFACA,mDACF;EACA,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAW,GAAG,aAAa,SAAS;GAAI;EAAc,CAAA;CACnC,CAAA;AAE9B;;;;;;;;;;;;ACrEA,SAAS,OAAO,EAAE,WAAW,GAAG,SAAqC;CACnE,OACE,oBAACC,SAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GACT,iFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,wCAAwC,SAAS;EAC/D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAyC;CAC/E,OACE,oBAACA,SAAgB,UAAjB;EACE,aAAU;EACV,WAAW,GACT,0FACA,oEACA,wEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,cAAW;EACX,WAAW,GAAG,WAAW,SAAS;EAClC,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAqC;CAC3E,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,gEACA,qDACA,4FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAqC;CAC3E,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GAAG,4CAA4C,SAAS;EACnE,GAAI;CACL,CAAA;AAEL;AAOA,SAAS,eAAe,EAAE,WAAW,QAAQ,UAAU,GAAG,SAA8B;CAatF,OAAO,WAAW,QAAQ;EAXxB,GAAG;EACH,aAAa;EACb,WAAW,GACT,+FACA,kFACA,8EACA,gFACA,qCACA,SACF;CAEwB,GAAQ,UAAU,GAAG;AACjD;;;;;;;;;AAUA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAuC;CAC7E,OACE,oBAAC,QAAD;EACE,aAAU;EACV,gBAAa;EACb,WAAW,GAAG,0DAA0D,SAAS;EACjF,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,oBAAoB,EAAE,WAAW,UAAU,GAAG,SAAqC;CAC1F,OACE,oBAAC,MAAD;EACE,aAAU;EACV,MAAK;EACL,eAAY;EACZ,WAAW,GACT,2FACA,SACF;EACA,GAAI;EAEH,UAAA,YAAY,oBAAC,cAAD,CAAe,CAAA;CAC1B,CAAA;AAER;;;;;;AAOA,SAAS,mBAAmB,EAAE,WAAW,UAAU,GAAG,SAAuC;CAC3F,OACE,qBAAC,QAAD;EACE,aAAU;EACV,WAAW,GACT,uFACA,oBACA,SACF;EACA,GAAI;EAPN,UAAA,CASE,oBAAC,gBAAD,EAAgB,eAAA,KAAa,CAAA,GAC7B,oBAAC,QAAD;GAAM,WAAU;GAAW,UAAA,YAAY;EAAoB,CAAA,CACvD;;AAEV;;;;;;;ACtJA,MAAM,eAAe,IACnB;CACE;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,QAAQ;GACR,SACE;EACJ;EACA,MAAM;GACJ,SAAS;GACT,IAAI;EACN;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAKA,SAAS,KAAK,EAAE,WAAW,SAAS,MAAM,GAAG,SAAoB;CAC/D,OACE,oBAAC,QAAD;EAAM,aAAU;EAAO,WAAW,GAAG,aAAa;GAAE;GAAS;EAAK,CAAC,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AAElG;;;;;;;;;;;;;;;;;;;;;;;;;AChBA,SAAS,SACP,OACA;CACA,OAAO,oBAACC,WAAkB,MAAnB,EAAwB,GAAI,MAAQ,CAAA;AAC7C;AAEA,MAAM,qBAAqB,cAAc,KAAK;AAE9C,MAAM,yBAAyB,GAC7B,kFACA,wDACA,oGACA,sEACA,mEACA,kEACA,6DACF;AAEA,SAAS,gBAAgB,EAAE,WAAW,UAAU,GAAG,SAA0C;CAC3F,OACE,oBAACA,WAAkB,SAAnB;EACE,aAAU;EACV,cAAW;EACX,WAAW,GAAG,wBAAwB,SAAS;EAC/C,GAAI;EAEH,UAAA,YACC,oBAACA,WAAkB,MAAnB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,aAAD,CAAc,CAAA;EACQ,CAAA;CAED,CAAA;AAE/B;AAEA,SAAS,cAAc,EAAE,WAAW,UAAU,GAAG,SAAwC;CACvF,OACE,oBAACA,WAAkB,OAAnB;EACE,aAAU;EACV,cAAW;EACX,WAAW,GAAG,wBAAwB,SAAS;EAC/C,GAAI;EAEH,UAAA,YAAY,oBAAC,GAAD,CAAI,CAAA;CACM,CAAA;AAE7B;AASA,SAAS,cAAc,EAAE,WAAW,YAAY,OAAO,kBAAkB,GAAG,SAA6B;CAEvG,IADoB,WAAW,kBACjB,GACZ,OACE,oBAACA,WAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,mDACA,8HACA,oDACA,+BACA,SACF;EACA,GAAI;CACL,CAAA;CAGL,OACE,qBAACA,WAAkB,YAAnB;EACE,aAAU;EACV,WAAW,GAAG,qCAAqC,gBAAgB;EAFrE,UAAA,CAIE,oBAACA,WAAkB,OAAnB;GACE,aAAU;GACV,WAAW,GAAG,gBAAgB,YAAY,UAAU,QAAQ,SAAS;GACrE,GAAI;EACL,CAAA,GACD,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACG,YAAY,oBAAC,eAAD,CAAgB,CAAA,IAAI,MACjC,oBAAC,iBAAD,CAAkB,CAAA,CACf;EACuB,CAAA,CAAA;;AAElC;AAEA,SAAS,cAAc,OAAsC;CAC3D,OAAO,oBAACA,WAAkB,OAAnB,EAAyB,GAAI,MAAQ,CAAA;AAC9C;AAOA,SAAS,cAAc,EAAE,WAAW,gBAAgB,UAAU,GAAG,SAA6B;CAC5F,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAA;EAC3B,UAAA,qBAACA,WAAkB,YAAnB;GACE,aAAU;GACV,WAAW,GACT,yJACA,qGACA,0CACA,sGACA,iEACA,0HACA,SACF;GAVF,UAAA,CAYE,oBAACA,WAAkB,OAAnB;IACE,aAAU;IACV,WAAW,GAAG,iEAAiE,cAAc;IAC7F,GAAI;IAEH;GACsB,CAAA,GACzB,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA,CACT;;CACH,CAAA;AAEjC;AAOA,SAAS,aAAa,EAAE,WAAW,UAAU,YAAY,MAAM,GAAG,SAA4B;CAC5F,OACE,qBAACA,WAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,6GACA,YAAY,SAAS,UACrB,yFACA,4FACA,gIACA,8BACA,SACF;EACA,GAAI;EAXN,UAAA,CAaE,oBAAC,QAAD;GAAM,WAAU;GAAY;EAAe,CAAA,GAC1C,YACC,oBAACA,WAAkB,YAAnB;GACE,aAAU;GACV,cAAW;GACX,WAAW,GACT,iGACA,0EACA,uEACA,gBACF;GAEA,UAAA,oBAAC,GAAD,CAAI,CAAA;EACwB,CAAA,IAC5B,IACkB;;AAE5B;AAkCA,SAAS,gBAAgB,EACvB,WACA,UACA,OACA,eACA,OAAO,UACP,QAAQ,SACR,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,aACA,WACA,GAAG,SACoB;CACvB,OACE,oBAACA,WAAkB,QAAnB;EAAuC;EAAwB;EAC7D,UAAA,oBAACA,WAAkB,YAAnB;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GAChB,WAAU;GAEV,UAAA,qBAACA,WAAkB,OAAnB;IACE,aAAU;IACV,WAAW,GACT,+IACA,kEACA,iGACA,gBACA,kDACA,2DACA,+JACA,gEACA,SACF;IACA,GAAI;IAbN,UAAA,CAeG,UAAU,KAAA,IAAY,oBAAC,eAAD,EAAA,UAAgB,MAAqB,CAAA,IAAI,MAChE,oBAACA,WAAkB,MAAnB;KACE,aAAU;KACV,WAAW,GAAG,oEAAoE,aAAa;KAE9F;IACqB,CAAA,CACD;;EACG,CAAA;CACN,CAAA;AAE9B;AAEA,SAAS,aAAa,EAAE,WAAW,UAAU,GAAG,SAAuC;CACrF,OACE,qBAACA,WAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,uFACA,wHACA,gGACA,kEACA,qFACA,SACF;EACA,GAAI;EAVN,UAAA,CAYE,oBAAC,QAAD;GAAM,aAAU;GAAqB,WAAU;GAC5C;EACG,CAAA,GACN,oBAACA,WAAkB,eAAnB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA;EACI,CAAA,CACX;;AAE5B;;AAGA,SAAS,mBAAmB,OAA2C;CACrE,OAAO,oBAACA,WAAkB,YAAnB,EAA8B,GAAI,MAAQ,CAAA;AACnD;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;CAC7E,OACE,oBAACA,WAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,mHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,SAAyC;CAC/E,OACE,oBAACA,WAAkB,QAAnB;EACE,aAAU;EACV,WAAW,GACT,mHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;CAC7E,OACE,oBAACA,WAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GAAG,iBAAiB,SAAS;EACxC,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAA6C;CACvF,OACE,oBAACA,WAAkB,YAAnB;EACE,aAAU;EACV,WAAW,GACT,wGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAA4C;CACrF,OACE,oBAACA,WAAkB,WAAnB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,SAAS;EAChE,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,oBAAoBA,WAAkB;;;;;;;;;;;;;;;AC/W5C,SAAS,OAAO,OAAmC;CACjD,OAAO,oBAACC,SAAgB,MAAjB,EAAsB,GAAI,MAAQ,CAAA;AAC3C;AAEA,SAAS,cAAc,OAAsC;CAC3D,OAAO,oBAACA,SAAgB,SAAjB;EAAyB,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACzE;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,oBAACA,SAAgB,QAAjB;EAAwB,aAAU;EAAgB,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,YAAY,OAAoC;CACvD,OAAO,oBAACA,SAAgB,OAAjB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAyC;CAC9E,OACE,oBAACA,SAAgB,UAAjB;EACE,aAAU;EACV,WAAW,GACT,0CACA,8DACA,uEACA,gEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AASA,SAAS,cAAc,EAAE,WAAW,UAAU,aAAa,WAAW,GAAG,SAA6B;CACpG,OACE,qBAAC,cAAD;EAA2B;EAAwB;EAAnD,UAAA,CACE,oBAAC,eAAD,CAAgB,CAAA,GAChB,oBAACA,SAAgB,OAAjB;GACE,aAAU;GACV,WAAW,GACT,wHACA,kEACA,iGACA,kDACA,2DACA,gEACA,SACF;GACA,GAAI;GAEH;EACoB,CAAA,CACX;;AAElB;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,kDAAkD,SAAS;EACzE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAc,WAAW,GAAG,kBAAkB,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC9F;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,oIACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GACT,wHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAA4C;CACrF,OACE,oBAACA,SAAgB,aAAjB;EACE,aAAU;EACV,WAAW,GACT,mFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;ACzGA,SAAS,QAAQ,EAAE,WAAW,GAAG,SAAwD;CACvF,OACE,oBAACC,WAAD;EACE,aAAU;EACV,WAAW,GACT,4DACA,kGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAoBA,SAAS,cAAc,EACrB,QAAQ,mBACR,cAAc,+BACd,WACA,kBACA,WACA,aACA,cACA,UACA,GAAG,SACkB;CACrB,OACE,oBAAC,QAAD;EAAQ,GAAI;EACV,UAAA,qBAAC,eAAD;GACE,aAAU;GACC;GACE;GACb,WAAW,GAAG,gCAAgC,SAAS;GAJzD,UAAA;IAME,oBAAC,aAAD;KAAa,WAAU;KAAW,UAAA;IAAmB,CAAA;IACrD,oBAAC,mBAAD;KAAmB,WAAU;KAAW,UAAA;IAA+B,CAAA;IACvE,oBAAC,SAAD;KACE,WAAW,GACT,gBACA,+FACA,yGACA,yCACA,6EACA,gBACF;KACA,GAAI;KAEH;IACM,CAAA;GACI;;CACT,CAAA;AAEZ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAA8D;CAClG,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAU;EAFZ,UAAA,CAIE,oBAAC,QAAD,EAAQ,WAAU,0DAA2D,CAAA,GAC7E,oBAACA,UAAiB,OAAlB;GACE,aAAU;GACV,WAAW,GACT,6DACA,6EACA,oDACA,mDACA,SACF;GACA,GAAI;EACL,CAAA,CACE;;AAET;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,UAAiB,MAAlB;EACE,aAAU;EACV,WAAW,GACT,2EACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAA8D;CAClG,OACE,oBAACA,UAAiB,OAAlB;EACE,aAAU;EACV,WAAW,GACT,oGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAA8D;CAClG,OACE,oBAACA,UAAiB,OAAlB;EACE,aAAU;EACV,WAAW,GACT,qDACA,iEACA,sGACA,oEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAkE;CAC1G,OACE,oBAACA,UAAiB,WAAlB;EACE,aAAU;EACV,WAAW,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAMA,SAAS,YAAY,EAAE,WAAW,UAAU,WAAW,GAAG,SAA2B;CACnF,OACE,oBAACA,UAAiB,MAAlB;EACE,aAAU;EACV,gBAAc;EACd,WAAW,GACT,wFACA,wGACA,wDACA,oGACA,4EACA,qFACA,YAAY,iBACV,mJACF,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAuC;CAC9E,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GACT,wGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,eAAe,OAA8D;CACpF,OAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;;;;;;;;;;;;;;;AC5LA,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,SAAS,kBAAkB,MAAoB;CAC7C,OAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,OAAO,KAAK,SAAS,GAAG,GAAG,KAAK,YAAY;AAC1E;AAEA,SAAS,gBACP,YACA,OACA,cACA,UACoC;CACpC,MAAM,CAAC,OAAO,YAAY,MAAM,SAAwB,YAAY;CASpE,OAAO,CARS,aAAa,QAAQ,OACzB,MAAM,aACf,SAAY;EACX,IAAI,CAAC,YAAY,SAAS,IAAI;EAC9B,WAAW,IAAI;CACjB,GACA,CAAC,YAAY,QAAQ,CAEJ,CAAC;AACtB;AAgBA,SAAS,cAAc,EAAE,MAAM,aAAa,OAAO,WAAW,GAAG,SAA6B;CAC5F,OACE,qBAAC,gBAAD;EACE,aAAW;EACX,cAAY,QAAQ,KAAA,IAAY;EAChC,QAAQ,oBAAC,QAAD,EAAQ,SAAQ,UAAW,CAAA;EACnC,WAAW,GACT,kCACA,wDACA,mDACA,SACF;EACA,GAAI;EAVN,UAAA,CAYE,oBAAC,cAAD,CAAe,CAAA,GACf,oBAAC,QAAD;GAAM,aAAW,GAAG,KAAK;GAAS,WAAU;GACzC,UAAA,SAAS;EACN,CAAA,CACQ;;AAEpB;AAuBA,SAAS,WAAW,OAAwB;CAC1C,MAAM,EACJ,OACA,cACA,eACA,cAAc,eACd,aAAa,mBACb,UACA,WACA,eACA,GAAG,SACD;CACJ,MAAM,CAAC,MAAM,WAAW,gBACtB,WAAW,OACX,OACA,cACA,aACF;CACA,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,KAAK;CAE5C,OACE,qBAAC,SAAD;EAAe;EAAM,cAAc;EAAnC,UAAA,CACE,oBAAC,eAAD;GACE,MAAK;GACQ;GACb,OAAO,OAAO,WAAW,IAAI,IAAI,KAAA;GACvB;GACC;GACX,GAAI;EACL,CAAA,GACD,oBAAC,gBAAD;GAAgB,aAAU;GAAsB,OAAM;GAAQ,WAAU;GACtE,UAAA,oBAAC,UAAD;IACE,GAAI;IACJ,MAAK;IACL,cAAc,eAAe,gBAAgB;IAC7C,UAAU;IACV,WAAW,SAAS;KAClB,QAAQ,IAAI;KACZ,QAAQ,KAAK;IACf;GACD,CAAA;EACa,CAAA,CACT;;AAEb;AAaA,SAAS,YACP,OACA,YACA,WACoB;CACpB,IAAI,CAAC,OAAO,MAAM,OAAO,KAAA;CACzB,IAAI,CAAC,MAAM,MAAM,MAAM,GAAG,QAAQ,MAAM,MAAM,KAAK,QAAQ,GAAG,OAAO,WAAW,MAAM,IAAI;CAC1F,OAAO,GAAG,WAAW,MAAM,IAAI,IAAI,YAAY,WAAW,MAAM,EAAE;AACpE;AAEA,SAAS,gBAAgB,OAA6B;CACpD,MAAM,EACJ,OACA,cACA,eACA,cAAc,qBACd,aAAa,mBACb,YAAY,OACZ,UACA,WACA,eACA,GAAG,SACD;CACJ,MAAM,CAAC,OAAO,YAAY,gBACxB,WAAW,OACX,OACA,cACA,aACF;CAEA,OACE,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,eAAD;EACE,MAAK;EACQ;EACb,OAAO,YAAY,OAAO,YAAY,SAAS;EACrC;EACV,WAAW,GAAG,QAAQ,SAAS;EAC/B,GAAI;CACL,CAAA,GACD,oBAAC,gBAAD;EAAgB,aAAU;EAA4B,OAAM;EAAQ,WAAU;EAC5E,UAAA,oBAAC,UAAD;GACE,gBAAgB;GAChB,GAAI;GACJ,MAAK;GACL,cAAc,eAAe,gBAAgB,OAAO;GACpD,UAAU;GACV,UAAU;EACX,CAAA;CACa,CAAA,CACT,EAAA,CAAA;AAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClLA,MAAM,QAAQ;CAAC;CAAK;CAAM;CAAM;CAAM;AAAI;;AAG1C,SAAS,eAAe,OAAuB;CAC7C,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG,OAAO;CACjD,IAAI,QAAQ;CACZ,IAAI,OAAO;CACX,OAAO,SAAS,QAAQ,OAAO,MAAM,SAAS,GAAG;EAC/C,SAAS;EACT,QAAQ;CACV;CAEA,OAAO,GADS,SAAS,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,EAAE,IAAI,GACxD,GAAG,MAAM;AAC7B;;AAGA,SAAS,eAAe,QAAgD;CACtE,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,MAAM,GAAG;EACjD,MAAM,QAAQ,OAAO,SAAS,WAAW,CAAC,IAAI,IAAI;EAClD,IAAI,MAAM,SAAS,GACjB,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;OACjE;GACL,MAAM,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;GAC5B,IAAI,OAAO,QAAQ,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC;EACpD;CACF;CACA,OAAO,KAAK,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,KAAA;AAChD;AA+BA,SAAS,SAAS,EAChB,SACA,UACA,QACA,WAAW,MACX,SACA,UACA,WAAW,OACX,UAAU,OACV,aAAa,OACb,OACA,MACA,UACA,WACA,KACA,GAAG,SACa;CAChB,MAAM,QAAQ,YAAY;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB,UAAU,QAAQ,KAAK;EACxC,iBAAiB,eAAe,WAAW,UAAU;CACvD,CAAC;CACD,MAAM,EAAE,cAAc,eAAe,cAAc,cAAc,cAAc,WAAW,YACxF;CAEF,MAAM,WAAW,SAAgC;EAC/C,QAAwD,UAAU;EAClE,IAAI,OAAO,QAAQ,YAAY,IAAI,IAAI;OAClC,IAAI,KAAK,IAAI,UAAU;CAC9B;CAEA,MAAM,cACJ,QACA,CAAC,eAAe,MAAM,GAAG,UAAU,SAAS,eAAe,OAAO,MAAM,KAAA,CAAS,CAAC,CAC/E,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEb,MAAM,OACJ,OAAO,aAAa,aAClB,SAAS,KAAK,IACZ,aAAa,KAAA,IACf,WAEA,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,QAAD;GACE,aAAU;GACV,WAAW,GACT,4EACA,gEACA,wHACA,8HACF;GAEA,UAAA,oBAAC,QAAD;IAAQ,eAAA;IAAY,WAAU;GAAU,CAAA;EACpC,CAAA;EACN,oBAAC,QAAD;GACE,aAAU;GACV,WAAU;GAET,UAAA,UACE,eACG,wCACA,eACE,mBACA,WACE,wCACA;EACN,CAAA;EACL,cACC,oBAAC,QAAD;GACE,aAAU;GACV,WAAU;GAET,UAAA;EACG,CAAA,IACJ;CACJ,EAAA,CAAA;CAGN,OACE,qBAAC,OAAD;EACE,GAAI,aAAa;GACf,GAAG;GACH,KAAK;GACL,WAAW,GACT,kFACA,oGACA,UAAU,6BAA6B,2CACvC,2GACA,qEACA,yGACA,sFACA,8FACA,kEACA,SACF;EACF,CAAC;EACD,aAAU;EACV,eAAa,gBAAgB,KAAA;EAC7B,eAAc,gBAAgB,gBAAiB,KAAA;EAC/C,eAAa,gBAAgB,KAAA;EAC7B,gBAAc,aAAa,KAAA;EAC3B,iBAAe,YAAY,KAAA;EAC3B,iBAAe,WAAW,KAAA;EAC1B,oBAAkB,cAAc,KAAA;EAxBlC,UAAA,CA0BE,oBAAC,SAAD;GAAO,aAAU;GAAiB,GAAI,cAAc;EAAI,CAAA,GACvD,IACE;;AAET;;;;;;AAeA,SAAS,SAAS,EAAE,OAAO,UAAU,aAAa,gBAAgB,WAAW,GAAG,SAAwB;CACtG,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,OACE,oBAAC,MAAD;EAAI,aAAU;EAAY,WAAW,GAAG,uCAAuC,SAAS;EAAG,GAAI;EAC5F,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,MAAD;GAEE,aAAU;GACV,WAAW,GACT,qCACA,2FACF;GANF,UAAA;IAQE,oBAAC,UAAD;KACE,eAAA;KACA,WAAU;IACX,CAAA;IACD,oBAAC,QAAD;KACE,aAAU;KACV,WAAU;KACV,OAAO,KAAK;KAEX,UAAA,KAAK;IACF,CAAA;IACN,oBAAC,QAAD;KACE,aAAU;KACV,WAAU;KAET,UAAA,WAAW,KAAK,IAAI;IACjB,CAAA;IACL,WACC,oBAAC,UAAD;KACE,MAAK;KACL,aAAU;KACV,cAAY,UAAU,KAAK;KAC3B,eAAe,SAAS,MAAM,KAAK;KACnC,WAAW,GACT,yFACA,8GACA,gFACA,kBACF;KAEA,UAAA,oBAAC,GAAD,EAAG,eAAA,KAAa,CAAA;IACV,CAAA,IACN;GACF;EAxCG,GAAA,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,cAwCrC,CACL;CACC,CAAA;AAER;;;ACvOA,MAAM,OAAO;AASb,MAAM,mBAAmB,MAAM,cAA4C,IAAI;AAE/E,SAAS,UAIP,OAAiE;CACjE,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO,EAAE,MAAM,MAAM,KAAK;EACnD,UAAA,oBAAC,YAAD,EAAY,GAAI,MAAQ,CAAA;CACC,CAAA;AAE/B;AAMA,MAAM,kBAAkB,MAAM,cAA2C,IAAI;AAE7E,SAAS,oBAAoB;CAC3B,MAAM,eAAe,MAAM,WAAW,gBAAgB;CACtD,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,8CAA8C;CAEhE,MAAM,EAAE,kBAAkB,eAAe;CACzC,MAAM,YAAY,aAAa,EAAE,MAAM,aAAa,KAAK,CAAC;CAC1D,MAAM,aAAa,cAAc,aAAa,MAAM,SAAS;CAC7D,OAAO;EAAE,MAAM,aAAa;EAAM,GAAG;CAAW;AAClD;AAeA,SAAS,eAAmC;CAC1C,MAAM,aAAa,kBAAkB;CACrC,MAAM,cAAc,MAAM,WAAW,eAAe;CACpD,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,6CAA6C;CAE/D,MAAM,EAAE,OAAO;CACf,OAAO;EACL;EACA,YAAY,GAAG,GAAG;EAClB,mBAAmB,GAAG,GAAG;EACzB,eAAe,GAAG,GAAG;EACrB,GAAG;CACL;AACF;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAwB;CACxD,MAAM,KAAK,MAAM,MAAM;CACvB,MAAM,EAAE,MAAM,UAAU,kBAAkB;CAC1C,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO,EAAE,GAAG;EACpC,UAAA,oBAAC,OAAD;GACE,aAAU;GACJ;GACN,SAAS,QAAQ,KAAK;GACX;GACX,GAAI;EACL,CAAA;CACuB,CAAA;AAE9B;AAIA,SAAS,UAAU,EAAE,WAAW,GAAG,SAAyB;CAC1D,MAAM,EAAE,eAAe,aAAa;CACpC,OACE,oBAAC,YAAD;EAAY,aAAU;EAAa,SAAS;EAAuB;EAAW,GAAI;CAAQ,CAAA;AAE9F;AAOA,SAAS,YAAY,EAAE,UAAU,GAAG,SAA2B;CAC7D,MAAM,EAAE,OAAO,YAAY,mBAAmB,kBAAkB,aAAa;CAC7E,OAAO,UAAU;EACf,QAAQ;EACR,OAAO;GACL,IAAI;GACJ,oBAAoB,QAAQ,GAAG,kBAAkB,GAAG,kBAAkB;GACtE,gBAAgB,QAAQ,OAAO,KAAA;GAC/B,GAAG;EACL;CACF,CAAC;AACH;AAIA,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAA+B;CACtE,MAAM,EAAE,sBAAsB,aAAa;CAC3C,OACE,oBAAC,kBAAD;EACE,aAAU;EACV,IAAI;EACO;EACX,GAAI;CACL,CAAA;AAEL;AAIA,SAAS,YAAY,EAAE,WAAW,UAAU,GAAG,SAA2B;CACxE,MAAM,EAAE,OAAO,kBAAkB,aAAa;CAC9C,MAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,EAAE,IAAI;CACnD,IAAI,CAAC,MACH,OAAO;CAET,OACE,oBAAC,YAAD;EAAY,aAAU;EAAe,IAAI;EAAe,OAAA;EAAiB;EAAW,GAAI;EACrF,UAAA;CACS,CAAA;AAEhB;;;;;;;AC/LA,SAAS,IAAI,EAAE,WAAW,GAAG,SAAsC;CACjE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,0CACA,+FACA,gEACA,6EACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACNA,MAAM,eAAsD;CAC1D,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;AACR;AAEA,MAAM,kBAAyD;CAC7D,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;AACR;AAGA,MAAM,cAAc;CAAC;CAAS;CAAS;CAAS;CAAS;AAAO;AAChE,MAAM,SAAS,MAAc,YAAY,IAAI,YAAY;AAEzD,SAAS,aAAa,EAAE,QAA0B;CAChD,OACE,oBAAC,OAAD;EAAK,aAAU;EAAwB,WAAU;EAC9C,UAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,qBAAC,OAAD;GAAa,aAAU;GAAuB,WAAU;GAAxD,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,kDAAmD,CAAA,GACvE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,UAAD,EAAU,WAAW,GAAG,SAAS,MAAM,CAAC,CAAC,EAAI,CAAA,GAC7C,oBAAC,UAAD,EAAU,WAAW,GAAG,OAAO,MAAM,IAAI,CAAC,CAAC,EAAI,CAAA,CAC5C;GACF,CAAA,CAAA;EANK,GAAA,CAML,CACN;CACE,CAAA;AAET;AAEA,SAAS,cAAc,EAAE,MAAM,WAA8C;CAC3E,MAAM,OAAO,EAAE,qBAAqB,UAAU,QAAQ,mBAAmB;CACzE,OACE,qBAAC,OAAD;EAAK,aAAU;EAAyB,WAAU;EAAlD,UAAA,CACE,oBAAC,OAAD;GACE,aAAU;GACV,WAAU;GACV,OAAO;GAEN,UAAA,MAAM,KAAK,EAAE,QAAQ,QAAQ,IAAI,GAAG,MACnC,oBAAC,UAAD,EAAkB,WAAU,YAAa,GAA1B,CAA0B,CAC1C;EACE,CAAA,GACJ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,oBAAC,OAAD;GAEE,aAAU;GACV,WAAU;GACV,OAAO;GAEN,UAAA,MAAM,KAAK,EAAE,QAAQ,QAAQ,IAAI,GAAG,MACnC,oBAAC,UAAD,EAAkB,WAAW,GAAG,SAAS,MAAM,IAAI,CAAC,CAAC,EAAI,GAA1C,CAA0C,CAC1D;EACE,GARE,CAQF,CACN,CACE;;AAET;AAEA,SAAS,aAAa,EAAE,MAAM,WAA8C;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAU;EACV,OAAO,EAAE,qBAAqB,UAAU,QAAQ,mBAAmB;EAElE,UAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,qBAAC,OAAD;GAEE,aAAU;GACV,WAAU;GAHZ,UAAA;IAKE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA;IACjC,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA;IACjC,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,GAClC,oBAAC,UAAD,EAAU,WAAW,GAAG,OAAO,MAAM,CAAC,CAAC,EAAI,CAAA,CACxC;;GACF;EAVE,GAAA,CAUF,CACN;CACE,CAAA;AAET;AAEA,SAAS,aAAa,EAAE,QAA0B;CAChD,OACE,qBAAC,OAAD;EAAK,aAAU;EAAwB,WAAU;EAAjD,UAAA,CACG,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAChC,qBAAC,OAAD;GAAa,aAAU;GAAyB,WAAU;GAA1D,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,WAAY,CAAA,GAChC,oBAAC,UAAD,EAAU,WAAU,2CAA4C,CAAA,CAC7D;EAHK,GAAA,CAGL,CACN,GACD,oBAAC,UAAD,EAAU,WAAU,8CAA+C,CAAA,CAChE;;AAET;;;;;;;AAQA,SAAS,gBAAgB,EACvB,WACA,SAAS,QACT,MACA,SACA,GAAG,SACoB;CACvB,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,aAAa,OAAO;CACtD,MAAM,OAAO,KAAK,IAAI,GAAG,WAAW,gBAAgB,OAAO;CAC3D,OACE,qBAAC,OAAD;EACE,aAAU;EACV,eAAa;EACb,MAAK;EACL,aAAU;EACV,cAAW;EACX,WAAW,GAAG,UAAU,SAAS;EACjC,GAAI;EAPN,UAAA;GASG,WAAW,SAAS,oBAAC,cAAD,EAAc,MAAM,MAAQ,CAAA,IAAI;GACpD,WAAW,UAAU,oBAAC,eAAD;IAAe,MAAM;IAAO,SAAS;GAAO,CAAA,IAAI;GACrE,WAAW,SAAS,oBAAC,cAAD;IAAc,MAAM;IAAO,SAAS;GAAO,CAAA,IAAI;GACnE,WAAW,SAAS,oBAAC,cAAD,EAAc,MAAM,MAAQ,CAAA,IAAI;EAClD;;AAET;;;;;;;;;AC7HA,SAAS,WAAW,EAClB,WACA,OACA,aACA,SACA,SACA,YACA,SAAS,QAAQ,MACjB,UACA,GAAG,SACe;CAClB,OACE,qBAAC,UAAD;EACE,aAAU;EACV,WAAW,GACT,qGACA,SACF;EACA,GAAI;EANN,UAAA,CAQE,qBAAC,OAAD;GAAK,aAAU;GAAsB,WAAU;GAA/C,UAAA;IACG,aACC,oBAAC,OAAD;KAAK,aAAU;KAAyB,WAAU;KAC/C,UAAA;IACE,CAAA,IACH;IACH,UACC,oBAAC,QAAD;KACE,aAAU;KACV,WAAW,GACT,iEACA,mGACA,gCACF;KAEC,UAAA;IACG,CAAA,IACJ;IACJ,oBAAC,OAAD;KACE,aAAU;KACV,WAAW,GACT,uEACA,yFACA,mCACF;KAEC,UAAA;IACI,CAAA;IACN,cACC,oBAAC,KAAD;KACE,aAAU;KACV,WAAW,GACT,kGACA,yCACF;KAEC,UAAA;IACA,CAAA,IACD;IACH;GACE;EACJ,CAAA,GAAA,UACC,oBAAC,OAAD;GACE,aAAU;GACV,WAAU;GAET,UAAA;EACE,CAAA,IACH,IACE;;AAEZ;;;ACzEA,SAAS,WAAW,EAAE,WAAW,UAAU,cAAc,YAAY,GAAG,SAA0B;CAChG,OACE,qBAACC,aAAoB,MAArB;EACE,aAAU;EACV,WAAW,GAAG,4BAA4B,SAAS;EACnD,GAAI;EAHN,UAAA;GAKE,oBAACA,aAAoB,UAArB;IACE,aAAU;IACV,WAAU;IAET;GAC2B,CAAA;GAC7B,gBAAgB,gBAAgB,oBAAC,WAAD,EAAW,aAAY,WAAY,CAAA;GACnE,gBAAgB,cAAc,oBAAC,WAAD,EAAW,aAAY,aAAc,CAAA;GACpE,oBAACA,aAAoB,QAArB,EAA4B,aAAU,qBAAsB,CAAA;EACpC;;AAE9B;AAEA,SAAS,UAAU,EACjB,WACA,cAAc,YACd,GAAG,SACmC;CACtC,OACE,oBAACA,aAAoB,WAArB;EACE,aAAU;EACG;EACb,WAAW,GACT,oCACA,6FACA,4DACA,gBAAgB,cAAc,kBAC9B,gBAAgB,gBAAgB,kBAChC,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,aAAoB,OAArB;GACE,aAAU;GACV,WAAW,GACT,gFACA,gBAAgB,aAAa,WAAW,QAC1C;EACD,CAAA;CAC4B,CAAA;AAEnC;;;AC3CA,SAAS,UAAqC,EAC5C,WACA,OACA,eACA,SACA,cAAc,WACd,GAAG,SACiB;CACpB,OACE,oBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,aAAU;EACV,WAAW,GACT,sHACA,SACF;EACA,GAAI;EAEH,UAAA,QAAQ,KAAK,QAAQ;GACpB,MAAM,SAAS,IAAI,UAAU;GAC7B,OACE,qBAAC,UAAD;IAEE,MAAK;IACL,MAAK;IACL,gBAAc;IACd,UAAU,IAAI;IACd,aAAU;IACV,cAAY,SAAS,OAAO;IAC5B,eAAe,cAAc,IAAI,KAAK;IACtC,WAAW,GACT,wFACA,wCACA,+GACA,SACI,0FACA,mFACJ,gFACA,oDACA,+DACF;IAnBF,UAAA,CAqBG,IAAI,MACJ,IAAI,KACC;GAtBD,GAAA,IAAI,KAsBH;EAEZ,CAAC;CACE,CAAA;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5CA,MAAM,oBAAoB,MAAM,cAAsC,IAAI;AAW1E,SAAS,MAAM,EAAE,QAAQ,MAAM,GAAG,SAAqB;CACrD,OACE,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;EACjC,UAAA,oBAACC,SAAe,MAAhB;GAA4B;GAAO,GAAI;EAAQ,CAAA;CACrB,CAAA;AAEhC;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,oBAACA,SAAe,SAAhB;EAAwB,aAAU;EAAgB,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,WAAW,OAAmC;CACrD,OAAO,oBAACA,SAAe,OAAhB;EAAsB,aAAU;EAAc,GAAI;CAAQ,CAAA;AACnE;AAEA,SAAS,YAAY,OAAoC;CACvD,OAAO,oBAACA,SAAe,QAAhB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAwC;CAC5E,OACE,oBAACA,SAAe,UAAhB;EACE,aAAU;EACV,WAAW,GACT,sBACA,8DACA,uEACA,gEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,MAAM,gBAAgB,IACpB;CACE;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,MAAM;EACJ,KAAK;EACL,QACE;EACF,MAAM;EACN,OACE;CACJ,EACF;CACA,iBAAiB,EACf,MAAM,QACR;AACF,CACF;AAUA,SAAS,aAAa,EACpB,OAAO,SACP,WACA,UACA,aACA,WACA,GAAG,SACiB;CACpB,MAAM,QAAQ,MAAM,WAAW,iBAAiB;CAChD,OACE,qBAAC,aAAD;EAA0B;EAAwB;EAAlD,UAAA,CACG,UAAU,QAAQ,OAAO,oBAAC,cAAD,CAAe,CAAA,GACzC,oBAACA,SAAe,OAAhB;GACE,aAAU;GACV,aAAW;GACX,cAAY,UAAU,QAAQ,KAAA,IAAY,UAAU,OAAO,KAAK;GAChE,WAAW,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,SAAS;GAChD,GAAI;GAEH;EACmB,CAAA,CACX;;AAEjB;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,kEAAkE,SAAS;EACzF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAqC;CACvE,OACE,oBAACA,SAAe,OAAhB;EACE,aAAU;EACV,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAA2C;CACnF,OACE,oBAACA,SAAe,aAAhB;EACE,aAAU;EACV,WAAW,GACT,gFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvHA,MAAM,iBAAiB;;AAEvB,MAAM,qBAAqB;;AAY3B,SAAS,WAAW,WAAsE;CACxF,OAAQ,aAAa,CAAC;AACxB;AAuDA,MAAM,gBAAgB,CAAC;AACvB,MAAM,cAAmC,EAAE,KAAK,QAAQ;AAExD,MAAM,sBAAsB,MAAM,cAAgC;CAChE,aAAa;CACb,YAAY;CACZ,UAAU;AACZ,CAAC;AAED,MAAM,gBAAgB,GACpB,uDACA,mEACA,yFACF;AAYA,SAAS,aAAgB,EAAE,IAAI,MAAM,QAAQ,UAAU,aAAa,YAAY,aAAmC;CACjH,MAAM,EAAE,YAAY,WAAW,YAAY,qBAAqB,WAAW,YAAY,eACrF,YAAY;EAAE;EAAI;CAAS,CAAC;CAE9B,MAAM,cAAc,MAAM,eACjB;EAAE,GAAG;EAAY,GAAG,WAAW,SAAS;EAAG,KAAK;CAAoB,IAC3E;EAAC;EAAY;EAAW;CAAmB,CAC7C;CACA,MAAM,UAAU,MAAM,eACb;EAAE;EAAa;EAAY;CAAS,IAC3C;EAAC;EAAa;EAAY;CAAQ,CACpC;CACA,MAAM,eAAe,SAAS,KAAA,IAAY;EAAE,GAAG;EAAY,GAAG,WAAW,SAAS;CAAE;CAEpF,OACE,oBAAC,oBAAoB,UAArB;EAA8B,OAAO;EACnC,UAAA,oBAAC,MAAD;GACE,KAAK;GACL,aAAU;GACV,iBAAe,cAAc,KAAA;GAC7B,iBAAe,YAAY,KAAA;GAC3B,OAAO;IAAE,WAAW,IAAI,UAAU,SAAS,SAAS;IAAG;GAAW;GAClE,WAAW,GACT,eACA,CAAC,UAAU,CAAC,YAAY,+CAExB,CAAC,eAAe,CAAC,YAAY,cAC7B,SACF;GACA,GAAI;GAEH,UAAA,WAAW,MAAM;IAAE;IAAa;GAAW,CAAC;EAC3C,CAAA;CACwB,CAAA;AAElC;;;;;;AAOA,SAAS,eAAe,EAAE,WAAW,UAAU,GAAG,SAAyC;CACzF,MAAM,EAAE,aAAa,aAAa,MAAM,WAAW,mBAAmB;CACtE,OACE,oBAAC,UAAD;EACE,MAAK;EACL,aAAU;EACV,cAAW;EACX,WAAW,GACT,kFACA,sEACA,4EACA,gFACA,2EACA,8CACA,YAAY,aACZ,SACF;EACU;EACV,GAAI;EACJ,GAAI;EAEH,UAAA,YAAY,oBAAC,cAAD,EAAc,eAAA,KAAa,CAAA;CAClC,CAAA;AAEZ;AAEA,SAAS,aAAgB,EACvB,OACA,OACA,WACA,YACA,cAAc,YACd,SAAS,OACT,WAAW,OACX,cAAc,QACd,eAAe,WACf,WACA,GAAG,SACoB;CACvB,MAAM,CAAC,UAAU,eAAe,MAAM,SAAkC,IAAI;CAI5E,MAAM,aAAa,eAAe,CAAC;CAGnC,MAAM,gBAAgB,UAAU,eAAe,EAAE,sBAAsB,EAAE,UAAU,EAAE,EAAE,CAAC;CACxF,MAAM,cAAc,UAAU,aAAa,EAAE,sBAAsB,EAAE,UAAU,EAAE,EAAE,CAAC;CACpF,MAAM,cAAc,UAAU,aAAa,EACzC,sBAAsB;EAAE,OAAO;EAAgB,WAAW;CAAmB,EAC/E,CAAC;CACD,MAAM,iBAAiB,UAAU,gBAAgB,EAAE,kBAAkB,4BAA4B,CAAC;CAClG,MAAM,iBAAiB,WAAW,eAAe,cAAc;CAC/D,MAAM,eAAe,WAAW,aAAa,aAAa,cAAc;CACxE,MAAM,UAAU,aAAa,eAAe;CAC5C,MAAM,MAAM,MAAM,cAAc,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC;CAChE,MAAM,aAAa,aAAa,OAAO,KAAA,IAAY,MAAM,IAAI,QAAQ,QAAQ;CAE7E,MAAM,cAAc,MAAM,aAAa,UAA0B;EAC/D,YAAY,MAAM,OAAO,EAAE;CAC7B,GAAG,CAAC,CAAC;CACL,MAAM,YAAY,MAAM,aACrB,UAAwB;EACvB,YAAY,IAAI;EAChB,MAAM,EAAE,QAAQ,SAAS;EACzB,IAAI,CAAC,QAAQ,OAAO,OAAO,KAAK,IAAI;EACpC,MAAM,OAAO,IAAI,QAAQ,OAAO,EAAE;EAClC,MAAM,KAAK,IAAI,QAAQ,KAAK,EAAE;EAC9B,IAAI,OAAO,KAAK,KAAK,GAAG;EACxB,UAAU,UAAU,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,GAAG;GACzC;GACA;GACA,UAAU,OAAO;GACjB,QAAQ,KAAK;EACf,CAAC;CACH,GACA;EAAC;EAAK;EAAO;CAAS,CACxB;CACA,MAAM,eAAe,MAAM,kBAAkB,YAAY,IAAI,GAAG,CAAC,CAAC;CAElE,OACE,qBAAC,YAAD;EACW;EACT,oBAAoB;EACP;EACF;EACG;EALhB,UAAA,CAOE,oBAAC,iBAAD;GACE,OAAO;GACP,UAAU,gBAAgB,eAAe,gCAAgC;GAC/D;GAEV,UAAA,oBAAC,MAAD;IACE,aAAU;IACV,oBAAkB;IAClB,iBAAe,YAAY,KAAA;IAC3B,qBAAmB,cAAc,KAAK,KAAA;IACtC,WAAW,GACT,4BACA,gBAAgB,eAAe,uBAAuB,YACtD,SACF;IACA,GAAI;IAEH,UAAA,MAAM,KAAK,MAAM,UAChB,oBAAC,cAAD;KAEE,IAAI,IAAI,UAAU;KACZ;KACE;KACE;KACG;KACD;KACZ,WAAW;IACZ,GARM,IAAI,UAAU,KAQpB,CACF;GACC,CAAA;EACW,CAAA,GACjB,oBAAC,aAAD,EAAA,UACG,eAAe,KAAA,IAAY,OAC1B,oBAAC,oBAAoB,UAArB;GACE,OAAO;IAAE,aAAa;IAAa,YAAY;IAAM,UAAU;GAAM;GAErE,UAAA,oBAAC,OAAD;IACE,aAAU;IACV,WAAW,GACT,qEACA,6DACA,SACF;IAEC,UAAA,WAAW,YAAY;KAAE,aAAa;KAAa,YAAY;IAAK,CAAC;GACnE,CAAA;EACuB,CAAA,EAErB,CAAA,CACH;;AAEhB;;;;;;;;;;;;;;;;;;;;AC3TA,MAAM,gBAAgB,IACpB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,SACE;EACF,SACE;EACF,aACE;CACJ,EACF;CACA,iBAAiB,EAAE,SAAS,UAAU;AACxC,CACF;AAIA,MAAM,WAAoC;CAAC;CAAW;CAAW;CAAW;AAAa;AAEzF,SAAS,UAAU,MAAwC;CACzD,OAAQ,SAA+B,SAAS,QAAQ,EAAE,IAAK,OAAwB;AACzF;;AAGA,MAAM,WAAWC,QAAe;;AAOhC,SAAS,MAAM,EAAE,WAAW,SAAS,OAAO,GAAG,SAAqB;CAClE,OACE,qBAACA,QAAe,MAAhB;EACE,aAAU;EACH;EACP,WAAW,GAAG,cAAc,EAAE,SAAS,WAAW,UAAU,MAAM,IAAI,EAAE,CAAC,GAAG,SAAS;EACrF,GAAI;EAJN,UAAA,CAME,qBAACA,QAAe,SAAhB;GAAwB,aAAU;GAAgB,WAAU;GAA5D,UAAA,CACG,MAAM,QACL,oBAACA,QAAe,OAAhB;IACE,aAAU;IACV,WAAU;GACX,CAAA,IACC,MACH,MAAM,cACL,oBAACA,QAAe,aAAhB;IACE,aAAU;IACV,WAAU;GACX,CAAA,IACC,IACkB;EACxB,CAAA,GAAA,oBAACA,QAAe,OAAhB;GACE,aAAU;GACV,cAAW;GACX,WAAW,GACT,8FACA,oGACA,8GACF;GAEA,UAAA,oBAAC,GAAD,EAAG,WAAU,SAAU,CAAA;EACH,CAAA,CACH;;AAEzB;AAEA,SAAS,YAAY;CACnB,MAAM,EAAE,WAAW,SAAS;CAC5B,OAAO,OAAO,KAAK,UAAU,oBAAC,OAAD,EAA6B,MAAQ,GAAzB,MAAM,EAAmB,CAAC;AACrE;AAUA,MAAM,kBAAyE;CAC7E,gBAAgB;CAChB,eAAe;CACf,aAAa;CACb,YAAY;AACd;;;;;AAMA,SAAS,QAAQ,EAAE,WAAW,gBAAgB,WAAW,UAAU,GAAG,SAAuB;CAC3F,OACE,qBAACA,QAAe,UAAhB;EAAyB,GAAI;EAA7B,UAAA,CACG,UACD,oBAACA,QAAe,QAAhB,EAAA,UACE,oBAACA,QAAe,UAAhB;GACE,aAAU;GACV,WAAW,GACT,wFACA,gBAAgB,WAChB,SACF;GAEA,UAAA,oBAAC,WAAD,CAAY,CAAA;EACW,CAAA,EACJ,CAAA,CACA;;AAE7B;;;;;;;;ACpIA,SAAS,QAAQ,EAAE,WAAW,UAAU,GAAG,SAAuB;CAChE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GACT,gFACA,YAAY,kDACZ,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,oDAAoD,SAAS;EAC3E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;CACxE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,sDAAsD,SAAS;EAC7E,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,eAAA;EACA,WAAW,GAAG,4DAA4D,SAAS;EACnF,GAAI;CACL,CAAA;AAEL;;;;;;;;;;;;;;AC5CA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,oBAACC,UAAiB,UAAlB,EAA2B,GAAI,MAAQ,CAAA;AAChD;AAEA,SAAS,QAAQ,OAAoC;CACnD,OAAO,oBAACA,UAAiB,MAAlB,EAAuB,GAAI,MAAQ,CAAA;AAC5C;AAEA,SAAS,eAAe,OAAuC;CAC7D,OAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;AAuBA,SAAS,eAAe,EACtB,WACA,OAAO,OACP,QAAQ,UACR,aAAa,GACb,aACA,QACA,mBACA,kBACA,oBACA,QACA,gBACA,aACA,WACA,GAAG,SACmB;CACtB,OACE,oBAACA,UAAiB,QAAlB;EAAsC;EAAwB;EAC5D,UAAA,oBAACA,UAAiB,YAAlB;GACE,aAAU;GACJ;GACC;GACK;GACC;GACL;GACW;GACD;GACE;GACZ;GACQ;GAChB,WAAU;GAEV,UAAA,oBAACA,UAAiB,OAAlB;IACE,aAAU;IACV,MAAK;IACL,WAAW,GACT,+BACA,kEACA,iGACA,2CACA,kDACA,2DACA,+JACA,gEACA,SACF;IACA,GAAI;GACL,CAAA;EAC0B,CAAA;CACN,CAAA;AAE7B;;;ACjCA,MAAa,4BAA4B;AACzC,MAAa,qBAAqB;AAClC,MAAM,eAAe;AACrB,MAAM,aAAa;AAEnB,SAAS,QAAQ,OAAuC;CACtD,OAAO,UAAU,WAAW,UAAU,UAAU,UAAU;AAC5D;;;;;AAQA,SAAgB,WAAW,OAAqB,OAAoB,SAAS,iBAAuB;CAClG,IAAI,UAAU,UACZ,KAAK,gBAAgB,YAAY;MAEjC,KAAK,aAAa,cAAc,KAAK;AAEzC;AAIA,SAAgB,gBAAgB,aAAqB,2BAAyC;CAC5F,IAAI;EACF,MAAM,MAAM,OAAO,aAAa,QAAQ,UAAU;EAClD,OAAO,QAAQ,GAAG,IAAI,MAAM;CAC9B,QAAQ;EAGN,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB,OAAqB,YAA0B;CACvE,IAAI;EACF,OAAO,aAAa,QAAQ,YAAY,KAAK;CAC/C,QAAQ,CAER;AACF;;;;;;;AAQA,SAAgB,iBAAiB,aAAqB,2BAAyC;CAC7F,IAAI,OAAO,aAAa,aACtB,OAAO;CAET,MAAM,QAAQ,gBAAgB,UAAU;CACxC,WAAW,KAAK;CAChB,OAAO;AACT;;;;;;;AAQA,SAAgB,mBAAmB,aAAqB,2BAAmC;CACzF,OAAO,qBAAqB,KAAK,UAAU,UAAU,EAAE;AACzD;;AAGA,MAAa,kBAA0B,mBAAmB;;;;;;AAS1D,SAAgB,oBAAoB,YAAkD;CACpF,IAAI,OAAO,eAAe,UACxB,OAAO;CAET,MAAM,QAAQ,gCAAgC,KAAK,WAAW,KAAK,CAAC;CACpE,IAAI,CAAC,QAAQ,IACX,OAAO;CAET,MAAM,MAAM,MAAM,EAAE,CAAC,WAAW,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM;CACrF,MAAM,WAAW,MAAc;EAC7B,MAAM,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI;EAC9C,OAAO,KAAK,SAAU,IAAI,UAAU,IAAI,QAAS,UAAU;CAC7D;CAEA,OADkB,QAAS,QAAQ,CAAC,IAAI,QAAS,QAAQ,CAAC,IAAI,QAAS,QAAQ,CAAC,IAC7D,KAAM,SAAS;AACpC;AAEA,SAAS,eAAe,MAA4C;CAClE,OACE,OAAO,SAAS,YAChB,SAAS,QACR,KAA4B,SAAA;AAEjC;;;;;AAMA,SAAgB,iBAAiB,MAAoC;CACnE,IAAI,CAAC,eAAe,IAAI,GACtB,OAAO;CAET,IAAI,QAAQ,KAAK,KAAK,GACpB,OAAO,KAAK;CAEd,IAAI,QAAQ,KAAK,IAAI,GACnB,OAAO,KAAK;CAEd,OAAO,oBAAoB,KAAK,QAAQ,UAAU;AACpD;AAIA,SAAS,eAAe,UAAkC;CACxD,OAAO,iBAAiB,cAAc,QAAQ;CAC9C,OAAO,iBAAiB,WAAW,QAAQ;CAC3C,aAAa;EACX,OAAO,oBAAoB,cAAc,QAAQ;EACjD,OAAO,oBAAoB,WAAW,QAAQ;CAChD;AACF;AAIA,SAAS,cAAqC;CAC5C,OAAO,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,aACjE,OAAO,WAAW,UAAU,IAC5B;AACN;AAEA,SAAS,gBAAgB,UAAkC;CACzD,MAAM,QAAQ,YAAY;CAC1B,OAAO,iBAAiB,UAAU,QAAQ;CAC1C,MAAM,mBAAmB,eAAe,QAAQ;CAChD,aAAa;EACX,OAAO,oBAAoB,UAAU,QAAQ;EAC7C,iBAAiB;CACnB;AACF;AAEA,SAAS,eAAqC;CAC5C,OAAO,YAAY,CAAC,EAAE,UAAU,SAAS;AAC3C;AAIA,SAAgB,gBAAgB,UAAkC,CAAC,GAA0B;CAC3F,MAAM,EAAE,aAAa,2BAA2B,gBAAgB,SAAS,SAAS;CAElF,MAAM,QAAQ,qBACZ,sBACM,gBAAgB,UAAU,SAC1B,QACR;CAEA,MAAM,gBAAgB,qBACpB,uBACO,UAAU,WAAW,aAAa,IAAI,aACvC,OACR;CAEA,MAAM,WAAW,aACd,SAAuB;EACtB,iBAAiB,MAAM,UAAU;EACjC,WAAW,IAAI;EACf,OAAO,cAAc,IAAI,MAAM,YAAY,CAAC;CAC9C,GACA,CAAC,UAAU,CACb;CAGA,gBAAgB;EACd,WAAW,KAAK;CAClB,GAAG,CAAC,KAAK,CAAC;CAGV,MAAM,aAAa,gBAAgB,KAAK,GAAG,KAAK;CAChD,gBAAgB;EACd,IAAI,CAAC,QACH;EAEF,MAAM,UAAU,aAAa,IAAI,IAAI,WAAW,MAAM,GAAG,CAAC,IAAI;EAC9D,MAAM,aAAa,UAAwB;GACzC,IAAI,WAAW,CAAC,QAAQ,IAAI,MAAM,MAAM,GACtC;GAEF,MAAM,OAAO,iBAAiB,MAAM,IAAI;GACxC,IAAI,MACF,SAAS,IAAI;EAEjB;EACA,OAAO,iBAAiB,WAAW,SAAS;EAC5C,aAAa,OAAO,oBAAoB,WAAW,SAAS;CAG9D,GAAG;EAAC;EAAQ;EAAU,gBAAgB,KAAK,IAAG;CAAC,CAAC;CAEhD,OAAO;EAAE;EAAO;EAAe;CAAS;AAC1C"}