@holaboss/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["ButtonPrimitive","MenuPrimitive","InputPrimitive","PopoverPrimitive","SelectPrimitive","SwitchPrimitive","TabsPrimitive","TooltipPrimitive"],"sources":["../src/lib/utils.ts","../src/primitives/alert.tsx","../src/primitives/badge.tsx","../src/primitives/button.tsx","../src/primitives/card.tsx","../src/primitives/dropdown-menu.tsx","../src/primitives/empty-state.tsx","../src/primitives/input.tsx","../src/primitives/kbd.tsx","../src/primitives/label.tsx","../src/primitives/popover.tsx","../src/primitives/select.tsx","../src/primitives/status-dot.tsx","../src/primitives/switch.tsx","../src/primitives/tabs.tsx","../src/primitives/tooltip.tsx","../src/layouts/dashboard-shell.tsx","../src/layouts/loading-state.tsx","../src/layouts/data-table.tsx","../src/layouts/error-state.tsx","../src/layouts/filter-bar.tsx","../src/layouts/page-header.tsx","../src/layouts/section.tsx","../src/layouts/stat-pill.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst alertVariants = cva(\n \"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), 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(\n \"font-heading font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-2 right-2\", className)}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction }\n","import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg text-sm font-medium whitespace-nowrap transition-colors duration-150 ease-out outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary/90 [a]:hover:bg-primary/90\",\n bordered:\n \"border border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground\",\n outline:\n \"border border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n // Hairline edge driven by shadow-sm (the new unified token —\n // 1px oklch-from-foreground ring with --hairline-alpha tuned per\n // mode). Replaces the explicit ring-1 ring-border so cards inherit\n // the same edge treatment as inputs/popovers/menus.\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground shadow-sm has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\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 \"font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\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(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\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 rounded-b-xl border-t bg-muted p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","import * as React from \"react\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\n\nimport { cn } from \"../lib/utils\";\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\";\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuContent({\n align = \"start\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n className,\n ...props\n}: MenuPrimitive.Popup.Props &\n Pick<\n MenuPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(\n \"dark z-50 max-h-(--available-height) w-(--anchor-width) min-w-44 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg p-1 text-popover-foreground shadow-md ring-1 ring-border duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:not-data-[variant=destructive]:focus:bg-foreground/10 **:data-[slot$=-item]:not-data-[variant=destructive]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10!\",\n className,\n )}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-2.5 py-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n align = \"start\",\n alignOffset = -3,\n side = \"right\",\n sideOffset = 0,\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"dark w-auto min-w-[96px] rounded-lg p-1 text-popover-foreground shadow-lg ring-1 ring-border duration-100 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-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:not-data-[variant=destructive]:focus:bg-foreground/10 **:data-[slot$=-item]:not-data-[variant=destructive]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10!\",\n className,\n )}\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n return (\n <MenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","\nimport type { LucideIcon } from \"lucide-react\"\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\n/**\n * EmptyState — centered icon + title + optional description + optional\n * action. Replaces the multiple hand-rolled placeholder variants\n * scattered across panes (sidebar empties, dashboard \"no rows\",\n * automations \"no schedules\", etc.).\n *\n * Two visual presentations driven by `size`:\n *\n * - `sm` (compact, default in dashboard panels) — small unframed icon\n * at low opacity, `text-xs` copy. Good when the empty state shares\n * a tight pane with chrome; was the original dashboard EmptyState.\n *\n * - `md` (roomier, default for sidebar / list empties) — icon wrapped\n * in a chip background, `text-sm` title + `text-xs` description.\n * More presence for full-pane empties.\n *\n * Pass `action` to surface a CTA below the description.\n *\n * `minHeight` forces a min-height (used by chart panels so the panel\n * doesn't collapse when there's no data).\n */\nexport interface EmptyStateProps {\n icon?: LucideIcon\n title: string\n description?: ReactNode\n action?: ReactNode\n size?: \"sm\" | \"md\"\n /** Force min-height (px). Useful for chart cells that shouldn't collapse. */\n minHeight?: number\n /**\n * Wrap the icon in a card-on-card chip framed by an Attio-style wide\n * hairline grid backdrop that fades to transparent at the outer\n * edges. Use for full-pane empties that need real presence\n * (Automations, primary list views). Default off so compact in-card\n * empties stay flat. Only applies when `size=\"md\"`.\n */\n decorated?: boolean\n /** Extra classes on the outer wrapper. */\n className?: string\n}\n\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n size = \"sm\",\n minHeight,\n decorated = false,\n className,\n}: EmptyStateProps) {\n const isMd = size === \"md\"\n const wrapperClass = cn(\n \"flex flex-col items-center justify-center text-center\",\n isMd ? \"gap-3 px-4 py-14\" : \"gap-2 py-10 text-muted-foreground\",\n className,\n )\n const titleClass = isMd\n ? \"text-sm font-medium text-foreground\"\n : \"text-xs\"\n const descriptionClass = isMd\n ? \"max-w-xs text-xs leading-5 text-muted-foreground\"\n : \"text-[11px] opacity-70\"\n\n return (\n <div\n className={wrapperClass}\n style={minHeight ? { minHeight } : undefined}\n >\n {Icon ? (\n isMd ? (\n decorated ? (\n <div className=\"relative flex h-24 w-72 items-center justify-center overflow-hidden\">\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0\"\n style={{\n backgroundImage:\n \"linear-gradient(to right, var(--color-fg-8) 1px, transparent 1px), linear-gradient(to bottom, var(--color-fg-8) 1px, transparent 1px)\",\n backgroundSize: \"32px 32px\",\n backgroundPosition: \"center center\",\n maskImage:\n \"radial-gradient(ellipse at center, black 0%, black 38%, transparent 80%)\",\n WebkitMaskImage:\n \"radial-gradient(ellipse at center, black 0%, black 38%, transparent 80%)\",\n }}\n />\n <div className=\"relative grid size-12 place-items-center rounded-xl border border-border bg-card text-muted-foreground shadow-xs\">\n <Icon className=\"size-[18px]\" strokeWidth={1.6} />\n </div>\n </div>\n ) : (\n <div className=\"grid size-10 place-items-center rounded-xl bg-muted text-muted-foreground\">\n <Icon className=\"size-4\" strokeWidth={1.6} />\n </div>\n )\n ) : (\n <Icon size={22} strokeWidth={1.5} className=\"opacity-45\" />\n )\n ) : null}\n <p className={titleClass}>{title}</p>\n {description ? <p className={descriptionClass}>{description}</p> : null}\n {action ? <div className={isMd ? \"mt-2\" : \"mt-1.5\"}>{action}</div> : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Kbd — keyboard shortcut hint. Inline `<kbd>` styled as a tiny pill.\n * Use in tooltip footers, menu trailing slots, and help text to teach\n * keyboard grammar continuously.\n *\n * Single-key glyphs (⌘, ⇧, ↑, K) auto-center via the square sizing.\n * For multi-key sequences, render multiple <Kbd> with a separator:\n * <Kbd>⌘</Kbd><Kbd>K</Kbd>\n */\nconst kbdVariants = cva(\n \"inline-flex items-center justify-center rounded border border-border bg-fg-2 font-mono text-[10px] font-medium text-muted-foreground tabular-nums\",\n {\n variants: {\n size: {\n sm: \"h-4 min-w-4 px-1\",\n md: \"h-5 min-w-5 px-1.5 text-[11px]\",\n },\n },\n defaultVariants: { size: \"sm\" },\n },\n);\n\nexport type KbdProps = ComponentProps<\"kbd\"> & VariantProps<typeof kbdVariants>;\n\nexport function Kbd({ className, size, ...props }: KbdProps) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(kbdVariants({ size }), className)}\n {...props}\n />\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { cn } from \"../lib/utils\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n className,\n positionerClassName,\n align = \"center\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 6,\n ...props\n}: PopoverPrimitive.Popup.Props &\n Pick<\n PopoverPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n > & {\n /** Override classes on the Positioner — needed when stacking above\n portals that already sit at high z-index (e.g. the workspace\n switcher pop-out at z-[80]). */\n positionerClassName?: string;\n }) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className={cn(\"isolate z-50\", positionerClassName)}\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"z-50 flex w-72 origin-(--transform-origin) flex-col gap-3 rounded-xl border border-border bg-popover p-4 text-sm text-popover-foreground shadow-2xl ring-0 ring-border outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"flex flex-col gap-1\", className)} {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\"text-base font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n};\n","import * as React from \"react\"\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\"\n\nimport { cn } from \"../lib/utils\"\nimport { ChevronDownIcon, CheckIcon, ChevronUpIcon } from \"lucide-react\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", 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(\"flex flex-1 text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_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 render={\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n }\n />\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n data-align-trigger={alignItemWithTrigger}\n className={cn(\n \"dark isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg text-popover-foreground shadow-md ring-1 ring-border duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!\",\n className\n )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List>{children}</SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 shrink-0 items-center gap-2 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon\n />\n </SelectPrimitive.ScrollUpArrow>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon\n />\n </SelectPrimitive.ScrollDownArrow>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\n/**\n * StatusDot — small colored dot signalling a state (running, error,\n * working, idle, etc.). Replaces ~18 hand-rolled\n * `<span className=\"size-X rounded-full bg-X\" />` instances across the\n * shell so a single change here propagates everywhere.\n *\n * Default size = `sm` (6px) which matches the dominant existing usage\n * (status pip alongside text). Use `md` (8px) for slightly more\n * presence (sidebar entry status), `lg` (10px) for stand-alone\n * notification-style indicators.\n *\n * `withRing` adds a card-colored ring — used for badge dots that sit on\n * top of an icon and need to read against the underlying surface.\n */\nconst statusDotVariants = cva(\"inline-block shrink-0 rounded-full\", {\n variants: {\n variant: {\n success: \"bg-success\",\n destructive: \"bg-destructive\",\n warning: \"bg-warning\",\n info: \"bg-info\",\n primary: \"bg-primary\",\n muted: \"bg-muted-foreground\",\n neutral: \"bg-fg-24\",\n },\n size: {\n sm: \"size-1.5\",\n md: \"size-2\",\n lg: \"size-2.5\",\n },\n withRing: {\n true: \"border-2 border-card\",\n false: \"\",\n },\n pulse: {\n true: \"animate-pulse\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"info\",\n size: \"sm\",\n withRing: false,\n pulse: false,\n },\n})\n\nexport type StatusDotProps = useRender.ComponentProps<\"span\"> &\n VariantProps<typeof statusDotVariants>\n\nexport function StatusDot({\n className,\n variant,\n size,\n withRing,\n pulse,\n render,\n ...props\n}: StatusDotProps) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(\n statusDotVariants({ variant, size, withRing, pulse }),\n className,\n ),\n \"aria-hidden\": true,\n },\n props,\n ),\n render,\n state: {\n slot: \"status-dot\",\n variant,\n size,\n },\n })\n}\n","import { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Switch({ className, ...props }: SwitchPrimitive.Root.Props) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n \"group/switch inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-input transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-primary\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb className=\"pointer-events-none block size-4 rounded-full bg-background shadow-sm ring-0 transition-transform data-[checked]:translate-x-4 data-[unchecked]:translate-x-0\" />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\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 h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground transition-colors group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\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(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };\n","import { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n )\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<\n TooltipPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Canonical chrome for a workspace-pane dashboard. Two slots: a top bar\n * (header, actions) and a scrollable content region underneath. Apps\n * should wrap their dashboard root with this so density, padding, and\n * scroll behavior stay consistent across the workspace.\n *\n * The shell does not manage its own width; it fills its parent (the\n * pane). Vertical scroll lives on `content` so the header stays pinned.\n */\nexport interface DashboardShellProps {\n /** Sticky top region. Typically a `<PageHeader>`. */\n header?: ReactNode;\n /** Main scrollable content. */\n children: ReactNode;\n /** Extra class on the outer flex container. */\n className?: string;\n /** Extra class on the scrollable content region. */\n contentClassName?: string;\n}\n\nexport function DashboardShell({\n header,\n children,\n className,\n contentClassName,\n}: DashboardShellProps) {\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {header ? (\n <div className=\"shrink-0 border-b border-border bg-background\">\n {header}\n </div>\n ) : null}\n <div className={cn(\"min-h-0 flex-1 overflow-y-auto\", contentClassName)}>\n {children}\n </div>\n </div>\n );\n}\n","import { cn } from \"../lib/utils.js\";\n\n/**\n * Skeleton-style loading placeholder. Use for the body of a pane while\n * data is fetching. The default presentation is a vertical stack of\n * pulsing bars; `variant=\"list\"` mimics a row list and `variant=\"card\"`\n * mimics card-grid loading.\n *\n * Solid backgrounds + subtle pulse only. No shimmer gradients.\n */\nexport interface LoadingStateProps {\n variant?: \"rows\" | \"list\" | \"card\";\n /** How many placeholder elements to render. Default 4. */\n count?: number;\n className?: string;\n}\n\nexport function LoadingState({\n variant = \"rows\",\n count = 4,\n className,\n}: LoadingStateProps) {\n const items = Array.from({ length: count }, (_, i) => i);\n if (variant === \"card\") {\n return (\n <div\n className={cn(\n \"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2 lg:grid-cols-3\",\n className,\n )}\n >\n {items.map((i) => (\n <div\n key={i}\n className=\"h-24 animate-pulse rounded-xl border border-border bg-muted\"\n />\n ))}\n </div>\n );\n }\n if (variant === \"list\") {\n return (\n <div className={cn(\"flex flex-col divide-y divide-border\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"size-8 shrink-0 animate-pulse rounded-full bg-muted\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div className=\"h-3 w-1/3 animate-pulse rounded bg-muted\" />\n <div className=\"h-2.5 w-2/3 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n return (\n <div className={cn(\"flex flex-col gap-2 p-4\", className)}>\n {items.map((i) => (\n <div\n key={i}\n className=\"h-4 animate-pulse rounded bg-muted\"\n style={{ width: `${100 - i * 8}%` }}\n />\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils.js\";\nimport { LoadingState } from \"./loading-state.js\";\nimport { EmptyState } from \"../primitives/empty-state.js\";\n\nexport interface DataTableColumn<Row> {\n /** Column key — must be unique within a table. */\n id: string;\n /** Header label. */\n header: ReactNode;\n /** Cell content; receives the full row. */\n cell: (row: Row) => ReactNode;\n /**\n * Cell alignment. `right` for numeric / monetary columns; `center`\n * for icons / status badges.\n */\n align?: \"left\" | \"right\" | \"center\";\n /** Hide on small viewports (< sm). */\n hideOnSmall?: boolean;\n /** Width hint in CSS units (e.g. `120px`, `20%`). */\n width?: string;\n}\n\nexport interface DataTableProps<Row> {\n columns: DataTableColumn<Row>[];\n rows: Row[];\n /** Stable key per row. */\n rowKey: (row: Row) => string;\n /** Per-row click handler. Renders rows with hover affordance. */\n onRowClick?: (row: Row) => void;\n /** When true, body is replaced with a <LoadingState>. */\n isLoading?: boolean;\n /** Empty-state title (shown when not loading and rows is empty). */\n emptyTitle?: string;\n emptyDescription?: ReactNode;\n className?: string;\n}\n\nconst alignClass: Record<NonNullable<DataTableColumn<unknown>[\"align\"]>, string> = {\n left: \"text-left\",\n right: \"text-right\",\n center: \"text-center\",\n};\n\nexport function DataTable<Row>({\n columns,\n rows,\n rowKey,\n onRowClick,\n isLoading,\n emptyTitle = \"No data yet\",\n emptyDescription,\n className,\n}: DataTableProps<Row>) {\n if (isLoading) {\n return <LoadingState variant=\"list\" />;\n }\n if (rows.length === 0) {\n return <EmptyState title={emptyTitle} description={emptyDescription} />;\n }\n return (\n <div className={cn(\"w-full overflow-x-auto\", className)}>\n <table className=\"w-full table-fixed border-collapse text-sm\">\n <thead className=\"border-b border-border bg-background\">\n <tr>\n {columns.map((col) => (\n <th\n key={col.id}\n className={cn(\n \"px-3 py-2 text-xs font-medium text-muted-foreground\",\n alignClass[col.align ?? \"left\"],\n col.hideOnSmall && \"hidden sm:table-cell\",\n )}\n style={col.width ? { width: col.width } : undefined}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={rowKey(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n \"border-b border-border last:border-b-0 transition-colors\",\n onRowClick && \"cursor-pointer hover:bg-accent\",\n )}\n >\n {columns.map((col) => (\n <td\n key={col.id}\n className={cn(\n \"truncate px-3 py-2 text-sm text-foreground\",\n alignClass[col.align ?? \"left\"],\n col.hideOnSmall && \"hidden sm:table-cell\",\n )}\n >\n {col.cell(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button.js\";\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Centered error display with an optional retry action. Use for the\n * body of a pane when data fetch / mutation fails. Title is short, the\n * `detail` is the developer-relevant message (truncate-friendly).\n */\nexport interface ErrorStateProps {\n title?: string;\n /** Concrete error description — the API error text, etc. */\n detail?: ReactNode;\n /** Click handler for the retry button. Omit to skip the button. */\n onRetry?: () => void;\n retryLabel?: string;\n className?: string;\n}\n\nexport function ErrorState({\n title = \"Something went wrong\",\n detail,\n onRetry,\n retryLabel = \"Try again\",\n className,\n}: ErrorStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-3 px-4 py-14 text-center\",\n className,\n )}\n >\n <div className=\"grid size-10 place-items-center rounded-xl bg-destructive/10 text-destructive\">\n <AlertTriangle className=\"size-4\" strokeWidth={1.6} />\n </div>\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {detail ? (\n <p className=\"max-w-md text-xs leading-5 text-muted-foreground\">\n {detail}\n </p>\n ) : null}\n {onRetry ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onRetry}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n );\n}\n","import { Search } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { Input } from \"../primitives/input.js\";\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Search input + filter chip slot + right-aligned actions. Sits at the\n * top of a list / table to provide a consistent control row across\n * apps.\n */\nexport interface FilterBarProps {\n /** Search input value (controlled). */\n search?: string;\n onSearchChange?: (value: string) => void;\n searchPlaceholder?: string;\n /** Filter chips / selects / segmented controls. */\n filters?: ReactNode;\n /** Right-aligned actions (e.g. \"New\", \"Refresh\"). */\n actions?: ReactNode;\n className?: string;\n}\n\nexport function FilterBar({\n search,\n onSearchChange,\n searchPlaceholder = \"Search…\",\n filters,\n actions,\n className,\n}: FilterBarProps) {\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-2 border-b border-border px-4 py-2\",\n className,\n )}\n >\n {onSearchChange ? (\n <div className=\"relative min-w-[180px] flex-1\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n className=\"h-7 pl-7 text-sm\"\n value={search ?? \"\"}\n placeholder={searchPlaceholder}\n onChange={(event) => onSearchChange(event.target.value)}\n />\n </div>\n ) : null}\n {filters ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">{filters}</div>\n ) : null}\n {actions ? (\n <div className=\"ml-auto flex items-center gap-1.5\">{actions}</div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Title + optional subtitle + optional right-aligned actions. The\n * canonical first child of `<DashboardShell header={...}>`. Density and\n * weight stay consistent regardless of which app drops it in.\n */\nexport interface PageHeaderProps {\n title: ReactNode;\n description?: ReactNode;\n /** Right-aligned action slot (typically buttons). */\n actions?: ReactNode;\n className?: string;\n}\n\nexport function PageHeader({\n title,\n description,\n actions,\n className,\n}: PageHeaderProps) {\n return (\n <div\n className={cn(\n \"flex items-start justify-between gap-4 px-4 py-3\",\n className,\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"truncate text-base font-semibold text-foreground\">\n {title}\n </h1>\n {description ? (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-1.5\">{actions}</div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Title + optional description over a content block. Use to group\n * related controls or stats inside a pane.\n */\nexport interface SectionProps {\n title?: ReactNode;\n description?: ReactNode;\n /** Right-aligned action slot next to the title. */\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n}\n\nexport function Section({\n title,\n description,\n actions,\n children,\n className,\n contentClassName,\n}: SectionProps) {\n return (\n <section className={cn(\"px-4 py-3\", className)}>\n {title || description || actions ? (\n <header className=\"mb-2 flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n {title ? (\n <h2 className=\"text-sm font-medium text-foreground\">{title}</h2>\n ) : null}\n {description ? (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-1.5\">{actions}</div>\n ) : null}\n </header>\n ) : null}\n <div className={contentClassName}>{children}</div>\n </section>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils.js\";\n\n/**\n * Small metric display — label on top, value below, optional icon and\n * trend chip. Use in a grid at the top of a dashboard. Stays tight; no\n * shadows or gradients.\n */\nexport interface StatPillProps {\n label: ReactNode;\n value: ReactNode;\n icon?: LucideIcon;\n /** Optional trend / hint chip rendered next to the value. */\n trend?: ReactNode;\n /** Visual tone for the value. Default `neutral` (foreground). */\n tone?: \"neutral\" | \"positive\" | \"negative\";\n className?: string;\n}\n\nconst toneClass: Record<NonNullable<StatPillProps[\"tone\"]>, string> = {\n neutral: \"text-foreground\",\n positive: \"text-emerald-600 dark:text-emerald-400\",\n negative: \"text-destructive\",\n};\n\nexport function StatPill({\n label,\n value,\n icon: Icon,\n trend,\n tone = \"neutral\",\n className,\n}: StatPillProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-1 rounded-lg border border-border bg-card px-3 py-2\",\n className,\n )}\n >\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {Icon ? <Icon className=\"size-3\" strokeWidth={1.6} /> : null}\n <span className=\"truncate\">{label}</span>\n </div>\n <div className=\"flex items-baseline gap-2\">\n <span className={cn(\"text-lg font-semibold\", toneClass[tone])}>\n {value}\n </span>\n {trend ? (\n <span className=\"text-xs text-muted-foreground\">{trend}</span>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAGA,SAAgB,GAAG,GAAG,QAAsB;AAC1C,QAAO,QAAQ,KAAK,OAAO,CAAC;;;;ACC9B,MAAM,gBAAgB,IACpB,6TACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,MAAM,EACb,WACA,SACA,GAAG,SACgE;AACnE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,EAAE,UAAU;EACpD,GAAI;EACJ,CAAA;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,oIACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,iBAAiB,EACxB,WACA,GAAG,SAC2B;AAC9B,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,8JACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,0BAA0B,UAAU;EAClD,GAAI;EACJ,CAAA;;;;ACjEN,MAAM,gBAAgB,IACpB,ifACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,WACE;EACF,aACE;EACF,SACE;EACF,OACE;EACF,MAAM;EACP,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,MAAM,EACb,WACA,UAAU,WACV,QACA,GAAG,SACqE;AACxE,QAAO,UAAU;EACf,gBAAgB;EAChB,OAAO,WACL,EACE,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,EAAE,UAAU,EACrD,EACD,MACD;EACD;EACA,OAAO;GACL,MAAM;GACN;GACD;EACF,CAAC;;;;AC3CJ,MAAM,iBAAiB,IACrB,icACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,UACE;GACF,SACE;GACF,WACE;GACF,OACE;GACF,aACE;GACF,MAAM;GACP;EACD,MAAM;GACJ,SACE;GACF,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WACE;GACF,WACE;GACF,WAAW;GACZ;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAED,SAAS,OAAO,EACd,WACA,UAAU,WACV,OAAO,WACP,GAAG,SAC2D;AAC9D,QACE,oBAACA,UAAD;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EAC3D,GAAI;EACJ,CAAA;;;;ACpDN,SAAS,KAAK,EACZ,WACA,OAAO,WACP,GAAG,SACyD;AAC5D,QACE,oBAAC,OAAD;EACE,aAAU;EACV,aAAW;EACX,WAAW,GAKT,wUACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,sSACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAsC;AACvE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,qFACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,gBAAgB,EAAE,WAAW,GAAG,SAAsC;AAC7E,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,iCAAiC,UAAU;EACzD,GAAI;EACJ,CAAA;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,kEACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,uCAAuC,UAAU;EAC/D,GAAI;EACJ,CAAA;;AAIN,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GACT,sFACA,UACD;EACD,GAAI;EACJ,CAAA;;;;ACxFN,SAAS,aAAa,EAAE,GAAG,SAAmC;AAC5D,QAAO,oBAACC,KAAc,MAAf;EAAoB,aAAU;EAAgB,GAAI;EAAS,CAAA;;AAGpE,SAAS,mBAAmB,EAAE,GAAG,SAAqC;AACpE,QAAO,oBAACA,KAAc,QAAf;EAAsB,aAAU;EAAuB,GAAI;EAAS,CAAA;;AAG7E,SAAS,oBAAoB,EAAE,GAAG,SAAsC;AACtE,QAAO,oBAACA,KAAc,SAAf;EAAuB,aAAU;EAAwB,GAAI;EAAS,CAAA;;AAG/E,SAAS,oBAAoB,EAC3B,QAAQ,SACR,cAAc,GACd,OAAO,UACP,aAAa,GACb,WACA,GAAG,SAKA;AACH,QACE,oBAACA,KAAc,QAAf,EAAA,UACE,oBAACA,KAAc,YAAf;EACE,WAAU;EACH;EACM;EACP;EACM;YAEZ,oBAACA,KAAc,OAAf;GACE,aAAU;GACV,WAAW,GACT,imCACA,UACD;GACD,GAAI;GACJ,CAAA;EACuB,CAAA,EACN,CAAA;;AAI3B,SAAS,kBAAkB,EAAE,GAAG,SAAoC;AAClE,QAAO,oBAACA,KAAc,OAAf;EAAqB,aAAU;EAAsB,GAAI;EAAS,CAAA;;AAG3E,SAAS,kBAAkB,EACzB,WACA,OACA,GAAG,SAGF;AACD,QACE,oBAACA,KAAc,YAAf;EACE,aAAU;EACV,cAAY;EACZ,WAAW,GACT,yEACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,iBAAiB,EACxB,WACA,OACA,UAAU,WACV,GAAG,SAIF;AACD,QACE,oBAACA,KAAc,MAAf;EACE,aAAU;EACV,cAAY;EACZ,gBAAc;EACd,WAAW,GACT,8oBACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,gBAAgB,EAAE,GAAG,SAA0C;AACtE,QAAO,oBAACA,KAAc,aAAf;EAA2B,aAAU;EAAoB,GAAI;EAAS,CAAA;;AAG/E,SAAS,uBAAuB,EAC9B,WACA,OACA,UACA,GAAG,SAGF;AACD,QACE,qBAACA,KAAc,gBAAf;EACE,aAAU;EACV,cAAY;EACZ,WAAW,GACT,0aACA,UACD;EACD,GAAI;YAPN,CASG,UACD,oBAAC,kBAAD,EAAkB,WAAU,WAAY,CAAA,CACX;;;AAInC,SAAS,uBAAuB,EAC9B,QAAQ,SACR,cAAc,IACd,OAAO,SACP,aAAa,GACb,WACA,GAAG,SACgD;AACnD,QACE,oBAAC,qBAAD;EACE,aAAU;EACV,WAAW,GACT,u3BACA,UACD;EACM;EACM;EACP;EACM;EACZ,GAAI;EACJ,CAAA;;AAIN,SAAS,yBAAyB,EAChC,WACA,UACA,SACA,OACA,GAAG,SAGF;AACD,QACE,qBAACA,KAAc,cAAf;EACE,aAAU;EACV,cAAY;EACZ,WAAW,GACT,8VACA,UACD;EACQ;EACT,GAAI;YARN,CAUE,oBAAC,QAAD;GACE,WAAU;GACV,aAAU;aAEV,oBAACA,KAAc,uBAAf,EAAA,UACE,oBAAC,WAAD,EAAa,CAAA,EACuB,CAAA;GACjC,CAAA,EACN,SAC0B;;;AAIjC,SAAS,uBAAuB,EAAE,GAAG,SAAyC;AAC5E,QACE,oBAACA,KAAc,YAAf;EACE,aAAU;EACV,GAAI;EACJ,CAAA;;AAIN,SAAS,sBAAsB,EAC7B,WACA,UACA,OACA,GAAG,SAGF;AACD,QACE,qBAACA,KAAc,WAAf;EACE,aAAU;EACV,cAAY;EACZ,WAAW,GACT,8VACA,UACD;EACD,GAAI;YAPN,CASE,oBAAC,QAAD;GACE,WAAU;GACV,aAAU;aAEV,oBAACA,KAAc,oBAAf,EAAA,UACE,oBAAC,WAAD,EAAa,CAAA,EACoB,CAAA;GAC9B,CAAA,EACN,SACuB;;;AAI9B,SAAS,sBAAsB,EAC7B,WACA,GAAG,SAC6B;AAChC,QACE,oBAACA,KAAc,WAAf;EACE,aAAU;EACV,WAAW,GAAG,6BAA6B,UAAU;EACrD,GAAI;EACJ,CAAA;;AAIN,SAAS,qBAAqB,EAC5B,WACA,GAAG,SAC4B;AAC/B,QACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GACT,+GACA,UACD;EACD,GAAI;EACJ,CAAA;;;;AC1MN,SAAgB,WAAW,EACzB,MAAM,MACN,OACA,aACA,QACA,OAAO,MACP,WACA,YAAY,OACZ,aACkB;CAClB,MAAM,OAAO,SAAS;AAatB,QACE,qBAAC,OAAD;EACE,WAdiB,GACnB,yDACA,OAAO,qBAAqB,qCAC5B,UAWyB;EACvB,OAAO,YAAY,EAAE,WAAW,GAAG,KAAA;YAFrC;GAIG,OACC,OACE,YACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD;KACE,eAAY;KACZ,WAAU;KACV,OAAO;MACL,iBACE;MACF,gBAAgB;MAChB,oBAAoB;MACpB,WACE;MACF,iBACE;MACH;KACD,CAAA,EACF,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,MAAD;MAAM,WAAU;MAAc,aAAa;MAAO,CAAA;KAC9C,CAAA,CACF;QAEN,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,MAAD;KAAM,WAAU;KAAS,aAAa;KAAO,CAAA;IACzC,CAAA,GAGR,oBAAC,MAAD;IAAM,MAAM;IAAI,aAAa;IAAK,WAAU;IAAe,CAAA,GAE3D;GACJ,oBAAC,KAAD;IAAG,WA3CY,OACf,wCACA;cAyC2B;IAAU,CAAA;GACpC,cAAc,oBAAC,KAAD;IAAG,WAzCG,OACrB,qDACA;cAuCgD;IAAgB,CAAA,GAAG;GAClE,SAAS,oBAAC,OAAD;IAAK,WAAW,OAAO,SAAS;cAAW;IAAa,CAAA,GAAG;GACjE;;;;;ACxGV,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;AAC3E,QACE,oBAACC,SAAD;EACQ;EACN,aAAU;EACV,WAAW,GACT,+oBACA,UACD;EACD,GAAI;EACJ,CAAA;;;;;;;;;;;;;ACDN,MAAM,cAAc,IAClB,qJACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EAAE,MAAM,MAAM;CAChC,CACF;AAID,SAAgB,IAAI,EAAE,WAAW,MAAM,GAAG,SAAmB;AAC3D,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU;EAC/C,GAAI;EACJ,CAAA;;;;AC7BN,SAAS,MAAM,EAAE,WAAW,GAAG,SAAwC;AACrE,QACE,oBAAC,SAAD;EACE,aAAU;EACV,WAAW,GACT,uNACA,UACD;EACD,GAAI;EACJ,CAAA;;;;ACXN,SAAS,QAAQ,EAAE,GAAG,SAAsC;AAC1D,QAAO,oBAACC,UAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;EAAS,CAAA;;AAGjE,SAAS,eAAe,EAAE,GAAG,SAAyC;AACpE,QAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;EAAS,CAAA;;AAG5E,SAAS,eAAe,EACtB,WACA,qBACA,QAAQ,UACR,cAAc,GACd,OAAO,UACP,aAAa,GACb,GAAG,SAUA;AACH,QACE,oBAACA,UAAiB,QAAlB,EAAA,UACE,oBAACA,UAAiB,YAAlB;EACS;EACM;EACP;EACM;EACZ,WAAW,GAAG,gBAAgB,oBAAoB;YAElD,oBAACA,UAAiB,OAAlB;GACE,aAAU;GACV,WAAW,GACT,kkBACA,UACD;GACD,GAAI;GACJ,CAAA;EAC0B,CAAA,EACN,CAAA;;AAI9B,SAAS,cAAc,EAAE,WAAW,GAAG,SAAsC;AAC3E,QAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,uBAAuB,UAAU;EAAE,GAAI;EAAS,CAAA;;AAG5E,SAAS,aAAa,EAAE,WAAW,GAAG,SAAuC;AAC3E,QACE,oBAACA,UAAiB,OAAlB;EACE,aAAU;EACV,WAAW,GAAG,2BAA2B,UAAU;EACnD,GAAI;EACJ,CAAA;;AAIN,SAAS,mBAAmB,EAC1B,WACA,GAAG,SACkC;AACrC,QACE,oBAACA,UAAiB,aAAlB;EACE,aAAU;EACV,WAAW,GAAG,yBAAyB,UAAU;EACjD,GAAI;EACJ,CAAA;;;;ACrEN,MAAM,SAASC,SAAgB;AAE/B,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,mBAAmB,UAAU;EAC3C,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;AACzE,QACE,oBAACA,SAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,yBAAyB,UAAU;EACjD,GAAI;EACJ,CAAA;;AAIN,SAAS,cAAc,EACrB,WACA,OAAO,WACP,UACA,GAAG,SAGF;AACD,QACE,qBAACA,SAAgB,SAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,GACT,u2BACA,UACD;EACD,GAAI;YAPN,CASG,UACD,oBAACA,SAAgB,MAAjB,EACE,QACE,oBAAC,iBAAD,EAAiB,WAAU,oDAAqD,CAAA,EAElF,CAAA,CACsB;;;AAI9B,SAAS,cAAc,EACrB,WACA,UACA,OAAO,UACP,aAAa,GACb,QAAQ,UACR,cAAc,GACd,uBAAuB,MACvB,GAAG,SAKA;AACH,QACE,oBAACA,SAAgB,QAAjB,EAAA,UACE,oBAACA,SAAgB,YAAjB;EACQ;EACM;EACL;EACM;EACS;EACtB,WAAU;YAEV,qBAACA,SAAgB,OAAjB;GACE,aAAU;GACV,sBAAoB;GACpB,WAAW,GACuB,0sCACA,UACD;GACjC,GAAI;aAPN;IASE,oBAAC,sBAAD,EAAwB,CAAA;IACxB,oBAACA,SAAgB,MAAjB,EAAuB,UAAgC,CAAA;IACvD,oBAAC,wBAAD,EAA0B,CAAA;IACJ;;EACG,CAAA,EACN,CAAA;;AAI7B,SAAS,YAAY,EACnB,WACA,GAAG,SACgC;AACnC,QACE,oBAACA,SAAgB,YAAjB;EACE,aAAU;EACV,WAAW,GAAG,6CAA6C,UAAU;EACrE,GAAI;EACJ,CAAA;;AAIN,SAAS,WAAW,EAClB,WACA,UACA,GAAG,SAC0B;AAC7B,QACE,qBAACA,SAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GACT,sbACA,UACD;EACD,GAAI;YANN,CAQE,oBAACA,SAAgB,UAAjB;GAA0B,WAAU;GACjC;GACwB,CAAA,EAC3B,oBAACA,SAAgB,eAAjB;GACE,QACE,oBAAC,QAAD,EAAM,WAAU,gFAAiF,CAAA;aAGnG,oBAAC,WAAD,EAAW,WAAU,uBAAwB,CAAA;GACf,CAAA,CACX;;;AAI3B,SAAS,gBAAgB,EACvB,WACA,GAAG,SAC+B;AAClC,QACE,oBAACA,SAAgB,WAAjB;EACE,aAAU;EACV,WAAW,GAAG,iDAAiD,UAAU;EACzE,GAAI;EACJ,CAAA;;AAIN,SAAS,qBAAqB,EAC5B,WACA,GAAG,SAC0D;AAC7D,QACE,oBAACA,SAAgB,eAAjB;EACE,aAAU;EACV,WAAW,GACT,0HACA,UACD;EACD,GAAI;YAEJ,oBAAC,eAAD,EACE,CAAA;EAC4B,CAAA;;AAIpC,SAAS,uBAAuB,EAC9B,WACA,GAAG,SAC4D;AAC/D,QACE,oBAACA,SAAgB,iBAAjB;EACE,aAAU;EACV,WAAW,GACT,6HACA,UACD;EACD,GAAI;YAEJ,oBAAC,iBAAD,EACE,CAAA;EAC8B,CAAA;;;;;;;;;;;;;;;;;;ACtKtC,MAAM,oBAAoB,IAAI,sCAAsC;CAClE,UAAU;EACR,SAAS;GACP,SAAS;GACT,aAAa;GACb,SAAS;GACT,MAAM;GACN,SAAS;GACT,OAAO;GACP,SAAS;GACV;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACD,UAAU;GACR,MAAM;GACN,OAAO;GACR;EACD,OAAO;GACL,MAAM;GACN,OAAO;GACR;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACF,CAAC;AAKF,SAAgB,UAAU,EACxB,WACA,SACA,MACA,UACA,OACA,QACA,GAAG,SACc;AACjB,QAAO,UAAU;EACf,gBAAgB;EAChB,OAAO,WACL;GACE,WAAW,GACT,kBAAkB;IAAE;IAAS;IAAM;IAAU;IAAO,CAAC,EACrD,UACD;GACD,eAAe;GAChB,EACD,MACD;EACD;EACA,OAAO;GACL,MAAM;GACN;GACA;GACD;EACF,CAAC;;;;AC/EJ,SAAS,OAAO,EAAE,WAAW,GAAG,SAAqC;AACnE,QACE,oBAACC,SAAgB,MAAjB;EACE,WAAW,GACT,8VACA,UACD;EACD,GAAI;YAEJ,oBAACA,SAAgB,OAAjB,EAAuB,WAAU,iKAAkK,CAAA;EAC9K,CAAA;;;;ACT3B,SAAS,KAAK,EACZ,WACA,cAAc,cACd,GAAG,SACwB;AAC3B,QACE,oBAACC,OAAc,MAAf;EACE,aAAU;EACV,oBAAkB;EAClB,WAAW,GACT,kDACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,MAAM,mBAAmB,IACvB,2OACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;EACP,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;AAED,SAAS,SAAS,EAChB,WACA,UAAU,WACV,GAAG,SACgE;AACnE,QACE,oBAACA,OAAc,MAAf;EACE,aAAU;EACV,gBAAc;EACd,WAAW,GAAG,iBAAiB,EAAE,SAAS,CAAC,EAAE,UAAU;EACvD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAkC;AACrE,QACE,oBAACA,OAAc,KAAf;EACE,aAAU;EACV,WAAW,GACT,81BACA,iQACA,qJACA,wYACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAoC;AACvE,QACE,oBAACA,OAAc,OAAf;EACE,aAAU;EACV,WAAW,GAAG,+BAA+B,UAAU;EACvD,GAAI;EACJ,CAAA;;;;ACvEN,SAAS,gBAAgB,EACvB,QAAQ,GACR,GAAG,SAC+B;AAClC,QACE,oBAACC,UAAiB,UAAlB;EACE,aAAU;EACH;EACP,GAAI;EACJ,CAAA;;AAIN,SAAS,QAAQ,EAAE,GAAG,SAAsC;AAC1D,QAAO,oBAACA,UAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;EAAS,CAAA;;AAGjE,SAAS,eAAe,EAAE,GAAG,SAAyC;AACpE,QAAO,oBAACA,UAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;EAAS,CAAA;;AAG5E,SAAS,eAAe,EACtB,WACA,OAAO,OACP,aAAa,GACb,QAAQ,UACR,cAAc,GACd,UACA,GAAG,SAKA;AACH,QACE,oBAACA,UAAiB,QAAlB,EAAA,UACE,oBAACA,UAAiB,YAAlB;EACS;EACM;EACP;EACM;EACZ,WAAU;YAEV,qBAACA,UAAiB,OAAlB;GACE,aAAU;GACV,WAAW,GACT,mwBACA,UACD;GACD,GAAI;aANN,CAQG,UACD,oBAACA,UAAiB,OAAlB,EAAwB,WAAU,4hBAA6hB,CAAA,CACxiB;;EACG,CAAA,EACN,CAAA;;;;ACnC9B,SAAgB,eAAe,EAC7B,QACA,UACA,WACA,oBACsB;AACtB,QACE,qBAAC,OAAD;EAAK,WAAW,GAAG,8CAA8C,UAAU;YAA3E,CACG,SACC,oBAAC,OAAD;GAAK,WAAU;aACZ;GACG,CAAA,GACJ,MACJ,oBAAC,OAAD;GAAK,WAAW,GAAG,kCAAkC,iBAAiB;GACnE;GACG,CAAA,CACF;;;;;ACvBV,SAAgB,aAAa,EAC3B,UAAU,QACV,QAAQ,GACR,aACoB;CACpB,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,GAAG,MAAM,EAAE;AACxD,KAAI,YAAY,OACd,QACE,oBAAC,OAAD;EACE,WAAW,GACT,4DACA,UACD;YAEA,MAAM,KAAK,MACV,oBAAC,OAAD,EAEE,WAAU,+DACV,EAFK,EAEL,CACF;EACE,CAAA;AAGV,KAAI,YAAY,OACd,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,wCAAwC,UAAU;YAClE,MAAM,KAAK,MACV,qBAAC,OAAD;GAAa,WAAU;aAAvB,CACE,oBAAC,OAAD,EAAK,WAAU,uDAAwD,CAAA,EACvE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD,EAAK,WAAU,4CAA6C,CAAA,EAC5D,oBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA,CAC1D;MACF;KANI,EAMJ,CACN;EACE,CAAA;AAGV,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,2BAA2B,UAAU;YACrD,MAAM,KAAK,MACV,oBAAC,OAAD;GAEE,WAAU;GACV,OAAO,EAAE,OAAO,GAAG,MAAM,IAAI,EAAE,IAAI;GACnC,EAHK,EAGL,CACF;EACE,CAAA;;;;ACzBV,MAAM,aAA6E;CACjF,MAAM;CACN,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,UAAe,EAC7B,SACA,MACA,QACA,YACA,WACA,aAAa,eACb,kBACA,aACsB;AACtB,KAAI,UACF,QAAO,oBAAC,cAAD,EAAc,SAAQ,QAAS,CAAA;AAExC,KAAI,KAAK,WAAW,EAClB,QAAO,oBAAC,YAAD;EAAY,OAAO;EAAY,aAAa;EAAoB,CAAA;AAEzE,QACE,oBAAC,OAAD;EAAK,WAAW,GAAG,0BAA0B,UAAU;YACrD,qBAAC,SAAD;GAAO,WAAU;aAAjB,CACE,oBAAC,SAAD;IAAO,WAAU;cACf,oBAAC,MAAD,EAAA,UACG,QAAQ,KAAK,QACZ,oBAAC,MAAD;KAEE,WAAW,GACT,uDACA,WAAW,IAAI,SAAS,SACxB,IAAI,eAAe,uBACpB;KACD,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,OAAO,GAAG,KAAA;eAEzC,IAAI;KACF,EATE,IAAI,GASN,CACL,EACC,CAAA;IACC,CAAA,EACR,oBAAC,SAAD,EAAA,UACG,KAAK,KAAK,QACT,oBAAC,MAAD;IAEE,SAAS,mBAAmB,WAAW,IAAI,GAAG,KAAA;IAC9C,WAAW,GACT,4DACA,cAAc,iCACf;cAEA,QAAQ,KAAK,QACZ,oBAAC,MAAD;KAEE,WAAW,GACT,8CACA,WAAW,IAAI,SAAS,SACxB,IAAI,eAAe,uBACpB;eAEA,IAAI,KAAK,IAAI;KACX,EARE,IAAI,GAQN,CACL;IACC,EAnBE,OAAO,IAAI,CAmBb,CACL,EACI,CAAA,CACF;;EACJ,CAAA;;;;ACtFV,SAAgB,WAAW,EACzB,QAAQ,wBACR,QACA,SACA,aAAa,aACb,aACkB;AAClB,QACE,qBAAC,OAAD;EACE,WAAW,GACT,0EACA,UACD;YAJH;GAME,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,eAAD;KAAe,WAAU;KAAS,aAAa;KAAO,CAAA;IAClD,CAAA;GACN,oBAAC,KAAD;IAAG,WAAU;cAAuC;IAAU,CAAA;GAC7D,SACC,oBAAC,KAAD;IAAG,WAAU;cACV;IACC,CAAA,GACF;GACH,UACC,oBAAC,QAAD;IAAQ,MAAK;IAAK,SAAQ;IAAU,SAAS;cAC1C;IACM,CAAA,GACP;GACA;;;;;AC1BV,SAAgB,UAAU,EACxB,QACA,gBACA,oBAAoB,WACpB,SACA,SACA,aACiB;AACjB,QACE,qBAAC,OAAD;EACE,WAAW,GACT,sEACA,UACD;YAJH;GAMG,iBACC,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD,EAAQ,WAAU,+FAAgG,CAAA,EAClH,oBAAC,OAAD;KACE,WAAU;KACV,OAAO,UAAU;KACjB,aAAa;KACb,WAAW,UAAU,eAAe,MAAM,OAAO,MAAM;KACvD,CAAA,CACE;QACJ;GACH,UACC,oBAAC,OAAD;IAAK,WAAU;cAAuC;IAAc,CAAA,GAClE;GACH,UACC,oBAAC,OAAD;IAAK,WAAU;cAAqC;IAAc,CAAA,GAChE;GACA;;;;;ACtCV,SAAgB,WAAW,EACzB,OACA,aACA,SACA,aACkB;AAClB,QACE,qBAAC,OAAD;EACE,WAAW,GACT,oDACA,UACD;YAJH,CAME,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,MAAD;IAAI,WAAU;cACX;IACE,CAAA,EACJ,cACC,oBAAC,KAAD;IAAG,WAAU;cAAwC;IAAgB,CAAA,GACnE,KACA;MACL,UACC,oBAAC,OAAD;GAAK,WAAU;aAAsC;GAAc,CAAA,GACjE,KACA;;;;;ACvBV,SAAgB,QAAQ,EACtB,OACA,aACA,SACA,UACA,WACA,oBACe;AACf,QACE,qBAAC,WAAD;EAAS,WAAW,GAAG,aAAa,UAAU;YAA9C,CACG,SAAS,eAAe,UACvB,qBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,QACC,oBAAC,MAAD;KAAI,WAAU;eAAuC;KAAW,CAAA,GAC9D,MACH,cACC,oBAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,GACF,KACA;OACL,UACC,oBAAC,OAAD;IAAK,WAAU;cAAsC;IAAc,CAAA,GACjE,KACG;OACP,MACJ,oBAAC,OAAD;GAAK,WAAW;GAAmB;GAAe,CAAA,CAC1C;;;;;ACzBd,MAAM,YAAgE;CACpE,SAAS;CACT,UAAU;CACV,UAAU;CACX;AAED,SAAgB,SAAS,EACvB,OACA,OACA,MAAM,MACN,OACA,OAAO,WACP,aACgB;AAChB,QACE,qBAAC,OAAD;EACE,WAAW,GACT,yEACA,UACD;YAJH,CAME,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,OAAO,oBAAC,MAAD;IAAM,WAAU;IAAS,aAAa;IAAO,CAAA,GAAG,MACxD,oBAAC,QAAD;IAAM,WAAU;cAAY;IAAa,CAAA,CACrC;MACN,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAM,WAAW,GAAG,yBAAyB,UAAU,MAAM;cAC1D;IACI,CAAA,EACN,QACC,oBAAC,QAAD;IAAM,WAAU;cAAiC;IAAa,CAAA,GAC5D,KACA;KACF"}
@@ -0,0 +1,121 @@
1
+ /* holaOS — the brand-native theme. Quiet near-neutral grays with a cool
2
+ undertone and the holaboss orange reserved for brand/CTA. Hairlines read
3
+ as page rhythm, not cell walls; surfaces (card, muted, accent) sit close
4
+ enough to background that elevation comes from structure rather than tint. */
5
+
6
+ /* Light mode */
7
+ [data-theme="holaos-light"] {
8
+ --background: oklch(1 0 0);
9
+ --foreground: oklch(0.18 0.003 250);
10
+ --card: oklch(0.985 0.002 250);
11
+ --card-foreground: oklch(0.18 0.003 250);
12
+ --popover: oklch(1 0 0);
13
+ --popover-foreground: oklch(0.18 0.003 250);
14
+ --primary: oklch(0.624 0.229 32);
15
+ --primary-foreground: oklch(0.98 0.01 32);
16
+ --secondary: oklch(0.97 0.002 250);
17
+ --secondary-foreground: oklch(0.21 0.003 250);
18
+ --muted: oklch(0.97 0.002 250);
19
+ --muted-foreground: oklch(0.56 0.005 250);
20
+ --accent: oklch(0.95 0.002 250);
21
+ --accent-foreground: oklch(0.18 0.003 250);
22
+ --destructive: oklch(0.577 0.245 27.325);
23
+ --destructive-foreground: oklch(1 0 0);
24
+ --border: oklch(0.92 0.003 250);
25
+ --input: oklch(0.92 0.003 250);
26
+ --ring: oklch(0.624 0.229 32);
27
+ --chart-1: oklch(0.646 0.222 41.116);
28
+ --chart-2: oklch(0.6 0.118 184.704);
29
+ --chart-3: oklch(0.398 0.07 227.392);
30
+ --chart-4: oklch(0.828 0.189 84.429);
31
+ --chart-5: oklch(0.769 0.188 70.08);
32
+ --radius: 0.675rem;
33
+ --sidebar: oklch(0.945 0.002 250);
34
+ --sidebar-foreground: oklch(0.18 0.003 250);
35
+ --sidebar-primary: oklch(0.624 0.229 32);
36
+ --sidebar-primary-foreground: oklch(0.98 0.01 32);
37
+ --sidebar-accent: oklch(0.92 0.002 250);
38
+ --sidebar-accent-foreground: oklch(0.21 0.003 250);
39
+ --sidebar-border: oklch(0.9 0.003 250);
40
+ --sidebar-ring: oklch(0.624 0.229 32);
41
+ --font-sans: 'Inter Variable', sans-serif;
42
+ --font-serif: Source Serif 4, serif;
43
+ --font-mono: JetBrains Mono, monospace;
44
+ --spacing: 0.25rem;
45
+ --shadow-2xs:
46
+ inset 0 0.5px 1px #ffffff30, 0 0.5px 1px #0000000a, 0 1px 2px #00000006;
47
+ --shadow-xs:
48
+ inset 0 0.5px 1px #ffffff35, 0 0.5px 1px #0000000c, 0 1px 2px #00000008;
49
+ --shadow-sm:
50
+ inset 0 1px 2px #ffffff40, 0 1px 2px #00000012, 0 2px 4px #0000000a;
51
+ --shadow: inset 0 1px 2px #ffffff50, 0 2px 4px #00000014, 0 4px 6px #0000000c;
52
+ --shadow-md:
53
+ inset 0 1px 2px #ffffff55, 0 3px 6px #00000016, 0 6px 10px #0000000d;
54
+ --shadow-lg:
55
+ inset 0 1px 2px #ffffff60, 0 4px 8px #00000018, 0 8px 15px #00000010;
56
+ --shadow-xl:
57
+ inset 0 1px 2px #ffffff65, 0 6px 12px #0000001a, 0 12px 20px #00000012;
58
+ --shadow-2xl:
59
+ inset 0 1px 2px #ffffff70, 0 8px 15px #0000001c, 0 18px 28px #00000014;
60
+ }
61
+
62
+ /* Dark mode */
63
+ [data-theme="holaos-dark"] {
64
+ --background: oklch(0.16 0.003 250);
65
+ --foreground: oklch(0.97 0.002 250);
66
+ --card: oklch(0.235 0.003 250);
67
+ --card-foreground: oklch(0.97 0.002 250);
68
+ --popover: oklch(0.235 0.003 250);
69
+ --popover-foreground: oklch(0.97 0.002 250);
70
+ --primary: oklch(0.624 0.229 32);
71
+ --primary-foreground: oklch(0.98 0.01 32);
72
+ --secondary: oklch(0.27 0.003 250);
73
+ --secondary-foreground: oklch(0.97 0.002 250);
74
+ /* Muted reads as a soft mid-tone above background so surfaces using
75
+ bg-muted — tab list rails, code blocks, disabled fields, the user
76
+ chat bubble base mix — actually read on a dark page. */
77
+ --muted: oklch(0.205 0.003 250);
78
+ --muted-foreground: oklch(0.66 0.005 250);
79
+ --accent: oklch(0.30 0.003 250);
80
+ --accent-foreground: oklch(0.97 0.002 250);
81
+ --destructive: oklch(0.653 0.232 25.964);
82
+ --destructive-foreground: oklch(1 0 0);
83
+ /* Border sits clearly above card (0.235) so hairlines on cards are
84
+ visible without being loud against the page surface. */
85
+ --border: oklch(0.32 0.003 250);
86
+ --input: oklch(0.32 0.003 250);
87
+ --ring: oklch(0.624 0.229 32);
88
+ --chart-1: oklch(0.44 0.004 250);
89
+ --chart-2: oklch(0.56 0.004 250);
90
+ --chart-3: oklch(0.71 0.004 250);
91
+ --chart-4: oklch(0.87 0.004 250);
92
+ --chart-5: oklch(0.92 0.004 250);
93
+ --radius: 0.675rem;
94
+ --sidebar: oklch(0.125 0.003 250);
95
+ --sidebar-foreground: oklch(0.97 0.002 250);
96
+ --sidebar-primary: oklch(0.624 0.229 32);
97
+ --sidebar-primary-foreground: oklch(0.97 0.002 250);
98
+ --sidebar-accent: oklch(0.20 0.003 250);
99
+ --sidebar-accent-foreground: oklch(0.97 0.002 250);
100
+ --sidebar-border: oklch(0.24 0.003 250);
101
+ --sidebar-ring: oklch(0.624 0.229 32);
102
+ --font-sans: 'Inter Variable', sans-serif;
103
+ --font-serif: Source Serif 4, serif;
104
+ --font-mono: JetBrains Mono, monospace;
105
+ --spacing: 0.25rem;
106
+ --shadow-2xs:
107
+ inset 0 0.5px 1px #ffffff0a, 0 0.5px 1px #00000050, 0 1px 2px #00000030;
108
+ --shadow-xs:
109
+ inset 0 0.5px 1px #ffffff0d, 0 0.5px 1px #00000050, 0 1px 2px #00000030;
110
+ --shadow-sm:
111
+ inset 0 1px 2px #ffffff15, 0 1px 2px #00000040, 0 2px 4px #00000025;
112
+ --shadow: inset 0 1px 2px #ffffff18, 0 1px 3px #00000045, 0 3px 6px #00000030;
113
+ --shadow-md:
114
+ inset 0 1px 2px #ffffff1a, 0 2px 4px #00000045, 0 4px 8px #00000028;
115
+ --shadow-lg:
116
+ inset 0 1px 2px #ffffff1c, 0 4px 6px #00000045, 0 6px 10px #00000030;
117
+ --shadow-xl:
118
+ inset 0 1px 2px #ffffff20, 0 6px 10px #00000045, 0 8px 15px #00000032;
119
+ --shadow-2xl:
120
+ inset 0 1px 2px #ffffff22, 0 10px 15px #00000045, 0 15px 25px #00000030;
121
+ }