@labpane/ui 0.0.0-stage → 1.0.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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../dialog.tsx", "../menu.tsx", "../app-menu.tsx", "../form-fields.tsx", "../table.tsx"],
4
+ "sourcesContent": ["import * as React from \"react\";\nimport * as AlertDialog from \"@radix-ui/react-alert-dialog\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { CircleAlertIcon, XIcon } from \"lucide-react\";\nimport { Button, cn, CopyButton, Input, Spinner } from \"./primitives.js\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n }\n>(function DialogContent(\n { className, children, showCloseButton = true, ...props },\n ref,\n) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className=\"labui:fixed labui:inset-0 labui:z-50 labui:bg-overlay\" />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n \"labui:fixed labui:top-1/2 labui:left-1/2 labui:z-50 labui:-translate-x-1/2 labui:-translate-y-1/2\",\n \"labui:grid labui:max-h-[calc(100dvh-2rem)] labui:w-full labui:max-w-[calc(100%-2rem)] labui:sm:max-w-lg labui:gap-6 labui:overflow-y-auto\",\n \"labui:rounded-(--labui-radius-dialog) labui:border labui:bg-popover labui:p-6 labui:text-popover-foreground labui:shadow-sm labui:outline-none\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className={cn(\n \"labui:absolute labui:top-4 labui:right-4 labui:inline-flex labui:size-8 labui:items-center labui:justify-center labui:rounded-md\",\n \"labui:text-muted-foreground labui:transition-colors labui:hover:bg-accent labui:hover:text-foreground\",\n \"labui:focus-visible:ring-[3px] labui:focus-visible:ring-ring/50 labui:focus-visible:outline-none labui:disabled:pointer-events-none\",\n \"labui:[&_svg]:pointer-events-none labui:[&_svg]:size-4 labui:[&_svg]:shrink-0\",\n )}\n >\n <XIcon />\n <span className=\"labui:sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\nconst DialogHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<\"div\">\n>(function DialogHeader({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"dialog-header\"\n className={cn(\n \"labui:flex labui:min-w-0 labui:flex-col labui:gap-2 labui:text-left\",\n className,\n )}\n {...props}\n />\n );\n});\n\nconst DialogFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<\"div\">\n>(function DialogFooter({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"dialog-footer\"\n className={cn(\n \"labui:flex labui:flex-wrap labui:items-center labui:justify-end labui:gap-2\",\n className,\n )}\n {...props}\n />\n );\n});\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(\n \"labui:pr-8 labui:text-lg labui:leading-7 labui:font-semibold labui:break-words\",\n className,\n )}\n {...props}\n />\n );\n});\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(function DialogDescription({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(\"labui:text-sm labui:text-muted-foreground\", className)}\n {...props}\n />\n );\n});\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n};\n\nexport function ConfirmDialog({\n trigger,\n title,\n name,\n confirmLabel,\n typeToConfirm,\n onConfirm,\n}: {\n trigger: React.ReactElement;\n title: string;\n name: string;\n confirmLabel: string;\n typeToConfirm?: boolean;\n onConfirm: () => Promise<void>;\n}) {\n const [open, setOpen] = React.useState(false);\n const [value, setValue] = React.useState(\"\");\n const [busy, setBusy] = React.useState(false);\n const [error, setError] = React.useState<string>();\n\n function change(next: boolean) {\n if (busy) return;\n setOpen(next);\n setValue(\"\");\n setError(undefined);\n }\n\n async function submit(event: React.FormEvent) {\n event.preventDefault();\n setBusy(true);\n setError(undefined);\n try {\n await onConfirm();\n setOpen(false);\n } catch (err) {\n setError((err as Error).message);\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={change}>\n <DialogTrigger asChild>{trigger}</DialogTrigger>\n <DialogContent\n role=\"alertdialog\"\n aria-describedby={undefined}\n className=\"labui:p-0\"\n showCloseButton={!busy}\n onOpenAutoFocus={(event) => {\n const input = (event.target as HTMLElement).querySelector(\"input\");\n if (!input) return;\n event.preventDefault();\n input.focus();\n }}\n >\n <form\n className=\"labui:flex labui:min-w-0 labui:flex-col\"\n onSubmit={submit}\n >\n <div className=\"labui:flex labui:min-w-0 labui:flex-col labui:gap-4 labui:p-6\">\n <div className=\"labui:flex labui:items-center labui:gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"labui:flex labui:size-9 labui:shrink-0 labui:items-center labui:justify-center labui:rounded-xl labui:bg-destructive-muted labui:text-destructive\"\n >\n <CircleAlertIcon className=\"labui:size-5\" />\n </span>\n <DialogTitle>\n {title}{\" \"}\n <span className=\"labui:inline-flex labui:items-center labui:gap-1 labui:rounded-md labui:border labui:bg-muted/50 labui:py-0.5 labui:pr-0.5 labui:pl-2 labui:align-middle labui:font-mono labui:text-base labui:break-all\">\n {name}\n <CopyButton value={name} label=\"Copy name\" />\n </span>\n ?\n </DialogTitle>\n </div>\n {typeToConfirm && (\n <Input\n aria-label=\"Name\"\n autoComplete=\"off\"\n spellCheck=\"false\"\n placeholder={name}\n value={value}\n disabled={busy}\n onChange={(event) => setValue(event.target.value)}\n />\n )}\n {error && (\n <p role=\"alert\" className=\"labui:text-sm labui:text-destructive\">\n {error}\n </p>\n )}\n </div>\n <DialogFooter className=\"labui:justify-between labui:border-t labui:bg-muted/40 labui:px-6 labui:py-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={busy}\n onClick={() => change(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"destructive\"\n disabled={busy || (typeToConfirm && value !== name)}\n >\n {busy && <Spinner />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nconst dialogAction =\n \"labui:inline-flex labui:shrink-0 labui:items-center labui:justify-center labui:rounded-md labui:text-sm labui:font-medium labui:outline-none labui:transition-colors labui:hover:bg-accent labui:focus-visible:ring-2 labui:focus-visible:ring-ring labui:px-4 labui:py-2\";\n\nexport function DiscardDialog({\n label,\n onCancel,\n onConfirm,\n onCloseAutoFocus,\n}: {\n label?: string;\n onCancel: () => void;\n onConfirm: () => void;\n onCloseAutoFocus?: (event: Event) => void;\n}) {\n return (\n <AlertDialog.Root\n open={label !== undefined}\n onOpenChange={(open) => !open && onCancel()}\n >\n <AlertDialog.Portal>\n <AlertDialog.Overlay className=\"labui:fixed labui:inset-0 labui:z-50 labui:font-sans labui:text-sm labui:leading-normal labui:bg-overlay\" />\n <AlertDialog.Content\n className={cn(\n \"labui:fixed labui:top-1/2 labui:left-1/2 labui:z-50 labui:-translate-x-1/2 labui:-translate-y-1/2\",\n \"labui:w-[calc(100%-2rem)] labui:max-w-lg labui:rounded-[1.25rem] labui:border labui:border-border labui:bg-popover labui:p-6\",\n \"labui:font-sans labui:text-sm labui:leading-normal labui:text-popover-foreground labui:shadow-sm labui:outline-none\",\n )}\n onCloseAutoFocus={onCloseAutoFocus}\n >\n <AlertDialog.Title className=\"labui:m-0 labui:text-lg labui:font-semibold\">\n Discard changes in {label}?\n </AlertDialog.Title>\n <AlertDialog.Description className=\"labui:mt-2 labui:text-muted-foreground\">\n Closing the tab discards its unsaved changes.\n </AlertDialog.Description>\n <div className=\"labui:mt-6 labui:flex labui:flex-wrap labui:justify-end labui:gap-2\">\n <AlertDialog.Cancel\n className={dialogAction + \" labui:border labui:border-border\"}\n >\n Keep tab\n </AlertDialog.Cancel>\n <AlertDialog.Action\n className={\n dialogAction +\n \" labui:bg-destructive-muted labui:text-destructive\"\n }\n onClick={onConfirm}\n >\n Discard and close\n </AlertDialog.Action>\n </div>\n </AlertDialog.Content>\n </AlertDialog.Portal>\n </AlertDialog.Root>\n );\n}\n", "import * as React from \"react\";\nimport * as ContextMenu from \"@radix-ui/react-context-menu\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\";\n\nexport type MenuAction =\n | {\n label: string;\n onSelect: () => void;\n disabled?: boolean;\n checked?: boolean;\n }\n | { label: string; items: MenuAction[] }\n | null;\nexport type MenuOption = {\n id: string;\n label: string;\n group?: string;\n icon?: React.ReactNode;\n};\n\nconst panel =\n \"labui:z-50 labui:rounded-lg labui:border labui:border-border labui:bg-popover labui:p-1 labui:font-sans labui:text-sm labui:leading-normal labui:text-popover-foreground labui:shadow-sm\";\nconst menuItem =\n \"labui:flex labui:min-h-9 labui:cursor-default labui:items-center labui:gap-3 labui:rounded-md labui:px-3 labui:text-sm labui:outline-none labui:data-highlighted:bg-accent labui:data-disabled:opacity-50 labui:[@media(pointer:coarse)]:min-h-11\";\nconst optionPanel =\n panel +\n \" labui:min-w-40 labui:max-h-[var(--radix-dropdown-menu-content-available-height)] labui:overflow-auto\";\n\nexport function MenuContent({\n children,\n className = \"labui:w-56\",\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n className={\n \"labui:z-50 labui:max-h-[var(--radix-dropdown-menu-content-available-height)] labui:overflow-auto labui:rounded-lg labui:border labui:bg-popover labui:p-1 labui:text-popover-foreground labui:shadow-sm \" +\n className\n }\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction contextItem(action: MenuAction, index: number): React.ReactNode {\n if (!action)\n return (\n <ContextMenu.Separator\n key={index}\n className=\"labui:my-1 labui:border-t labui:border-border\"\n />\n );\n if (\"items\" in action)\n return (\n <ContextMenu.Sub key={action.label}>\n <ContextMenu.SubTrigger\n className={\n menuItem +\n \" labui:justify-between labui:data-[state=open]:bg-accent\"\n }\n >\n {action.label}\n <ChevronRightIcon className=\"labui:size-4\" />\n </ContextMenu.SubTrigger>\n <ContextMenu.Portal>\n <ContextMenu.SubContent\n className={panel + \" labui:min-w-40\"}\n sideOffset={4}\n collisionPadding={8}\n >\n {action.items.map(contextItem)}\n </ContextMenu.SubContent>\n </ContextMenu.Portal>\n </ContextMenu.Sub>\n );\n if (action.checked !== undefined)\n return (\n <ContextMenu.CheckboxItem\n key={action.label}\n className={menuItem}\n checked={action.checked}\n disabled={action.disabled}\n onSelect={action.onSelect}\n >\n <span className=\"labui:grid labui:size-4 labui:place-items-center\">\n <ContextMenu.ItemIndicator>\n <CheckIcon className=\"labui:size-4\" />\n </ContextMenu.ItemIndicator>\n </span>\n {action.label}\n </ContextMenu.CheckboxItem>\n );\n return (\n <ContextMenu.Item\n key={action.label}\n className={menuItem}\n disabled={action.disabled}\n onSelect={action.onSelect}\n >\n {action.label}\n </ContextMenu.Item>\n );\n}\n\nexport function ActionMenu({\n children,\n actions,\n onCloseAutoFocus,\n}: {\n children: React.ReactElement;\n actions: MenuAction[];\n onCloseAutoFocus?: (event: Event) => void;\n}) {\n return (\n <ContextMenu.Root modal={false}>\n <ContextMenu.Trigger asChild>{children}</ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content\n className={panel + \" labui:min-w-44\"}\n onCloseAutoFocus={onCloseAutoFocus}\n >\n {actions.map(contextItem)}\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n}\n\nexport function OptionMenu({\n trigger,\n options,\n onSelect,\n open,\n onOpenChange,\n onCloseAutoFocus,\n}: {\n trigger: React.ReactElement;\n options: readonly MenuOption[];\n onSelect: (id: string) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n onCloseAutoFocus?: (event: Event) => void;\n}) {\n const groups = [\n ...new Set(\n options.flatMap((option) => (option.group ? [option.group] : [])),\n ),\n ];\n const item = (option: MenuOption) => (\n <DropdownMenu.Item\n key={option.id}\n className={menuItem}\n onSelect={() => onSelect(option.id)}\n >\n {option.icon}\n {option.label}\n </DropdownMenu.Item>\n );\n return (\n <DropdownMenu.Root modal={false} open={open} onOpenChange={onOpenChange}>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n className={optionPanel}\n onCloseAutoFocus={onCloseAutoFocus}\n >\n {options.filter((option) => !option.group).map(item)}\n {groups.map((group) => (\n <DropdownMenu.Sub key={group}>\n <DropdownMenu.SubTrigger\n className={\n menuItem +\n \" labui:justify-between labui:data-[state=open]:bg-accent\"\n }\n >\n {group}\n <ChevronRightIcon className=\"labui:size-4\" />\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n className={optionPanel}\n sideOffset={4}\n collisionPadding={8}\n >\n {options.filter((option) => option.group === group).map(item)}\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n}\n", "import * as Popover from \"@radix-ui/react-popover\";\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { MaximizeIcon, MinimizeIcon, MoonIcon, SunIcon } from \"lucide-react\";\nimport { ActionMenu } from \"./menu.js\";\nimport { Button } from \"./primitives.js\";\n\nconst round = \"labui:rounded-full labui:border labui:border-border\";\n\nexport function AppMenu({\n name,\n logo,\n version,\n dark = false,\n onThemeChange,\n size = 100,\n align = \"start\",\n onSizeChange,\n onSizeReset,\n fullscreen = false,\n onFullscreenChange,\n}: {\n name: string;\n logo: ReactNode;\n version?: ReactNode;\n dark?: boolean;\n onThemeChange?: (dark: boolean) => void;\n size?: number;\n onSizeChange?: (size: number) => void;\n // onSizeReset is offered when the size button is right-clicked\n onSizeReset?: () => void;\n fullscreen?: boolean;\n onFullscreenChange?: (fullscreen: boolean) => void;\n align?: \"start\" | \"end\";\n}) {\n const trigger = useRef<HTMLButtonElement>(null);\n const sizePanel = useRef<HTMLDivElement>(null);\n const [anchor, setAnchor] = useState<number>();\n const level = Math.max(0, Math.min(100, size));\n const ThemeIcon = dark ? SunIcon : MoonIcon;\n const theme = dark ? \"dark \" : \"\";\n return (\n <Popover.Root\n onOpenChange={(open) => {\n if (open) setAnchor(trigger.current?.offsetHeight);\n }}\n >\n <Popover.Trigger asChild>\n <button\n ref={trigger}\n type=\"button\"\n aria-label={name}\n title={`${name} menu`}\n className=\"labui:group labui:relative labui:grid labui:size-[var(--lab-tab-height,2.75rem)] labui:shrink-0 labui:cursor-pointer labui:place-items-center labui:rounded-full labui:outline-none labui:focus-visible:outline-2 labui:focus-visible:outline-ring\"\n >\n <span className=\"labui:grid labui:size-[var(--lab-logo-size,1.5rem)] labui:transition-[filter,translate] labui:duration-150 labui:motion-safe:group-hover:-translate-y-0.5 labui:group-hover:drop-shadow-[0_3px_2px_#00000035] labui:group-active:translate-y-0 labui:dark:group-hover:drop-shadow-[0_3px_3px_#00000090]\">\n {logo}\n </span>\n <Popover.Anchor asChild>\n <span\n className=\"labui:absolute labui:inset-x-0 labui:top-0\"\n style={{ height: anchor ?? \"100%\" }}\n />\n </Popover.Anchor>\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align={align}\n sideOffset={4}\n collisionPadding={8}\n aria-label={`${name} menu`}\n onInteractOutside={(event) => {\n if (sizePanel.current?.contains(event.target as Node))\n event.preventDefault();\n }}\n className={\n theme +\n (align === \"start\"\n ? \"labui:ml-1 labui:sm:-ml-1 \"\n : \"labui:mr-1 labui:sm:-mr-1 \") +\n \"labui:z-50 labui:flex labui:w-max labui:max-h-[var(--radix-popover-content-available-height)] labui:flex-col labui:items-center labui:gap-3 labui:overflow-auto labui:rounded-lg labui:border labui:bg-popover labui:p-4 labui:text-center labui:text-popover-foreground labui:shadow-sm\"\n }\n >\n <div className=\"labui:flex labui:items-center labui:gap-2 labui:text-2xl\">\n <span className=\"labui:grid labui:size-6 labui:shrink-0\">\n {logo}\n </span>\n <span className=\"labui:font-display labui:font-bold labui:tracking-tight\">\n {name}\n </span>\n </div>\n {version != null && (\n <div className=\"labui:text-xs labui:text-muted-foreground\">\n <span className=\"labui:font-mono\">{version}</span>\n </div>\n )}\n <div className=\"labui:flex labui:items-center labui:justify-center labui:gap-2\">\n {onThemeChange && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={round}\n aria-label=\"Toggle theme\"\n aria-pressed={dark}\n onClick={() => onThemeChange(!dark)}\n title=\"Toggle theme\"\n >\n <ThemeIcon className=\"labui:size-4\" />\n </Button>\n )}\n {onSizeChange && (\n <Popover.Root>\n <ActionMenu\n actions={\n onSizeReset\n ? [{ label: \"Reset\", onSelect: onSizeReset }]\n : []\n }\n >\n <Popover.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={round}\n aria-label=\"Workspace size\"\n title=\"Workspace size\"\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"labui:size-4 labui:[&_rect]:transition-[fill-opacity]\"\n >\n {[0, 1, 2].map((row) => (\n <rect\n key={row}\n x=\"4\"\n y={3 + row * 7}\n width=\"16\"\n height=\"4\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"currentColor\"\n fillOpacity={Math.max(\n 0,\n Math.min(1, (level / 100) * 3 - (2 - row)),\n )}\n />\n ))}\n </svg>\n </Button>\n </Popover.Trigger>\n </ActionMenu>\n <Popover.Portal>\n <Popover.Content\n ref={sizePanel}\n side=\"bottom\"\n align=\"center\"\n sideOffset={8}\n collisionPadding={8}\n aria-label=\"Workspace size\"\n className={\n theme +\n \"labui:z-[60] labui:origin-(--radix-popover-content-transform-origin) labui:animate-pop labui:rounded-xl labui:border labui:bg-popover labui:p-2 labui:shadow-md labui:data-[state=closed]:animate-[labui-pop_120ms_ease-in_reverse]\"\n }\n >\n <div className=\"labui:relative labui:h-28 labui:w-7 labui:overflow-hidden labui:rounded-full labui:border labui:bg-secondary labui:shadow-inner labui:has-focus-visible:outline-2 labui:has-focus-visible:outline-offset-2 labui:has-focus-visible:outline-ring\">\n <div\n className=\"labui:pointer-events-none labui:absolute labui:inset-x-0 labui:bottom-0 labui:bg-white labui:shadow-[0_-1px_4px_#00000014] labui:[transition:height_100ms_ease-out] labui:forced-colors:hidden\"\n style={{ height: `${level}%` }}\n />\n <input\n type=\"range\"\n min={0}\n max={100}\n step=\"any\"\n value={level}\n aria-label=\"Workspace size\"\n aria-orientation=\"vertical\"\n aria-valuetext={`${Math.round(level)}%`}\n className=\"labui:range-overlay\"\n onChange={(event) =>\n onSizeChange(event.currentTarget.valueAsNumber)\n }\n />\n </div>\n <Popover.Arrow asChild width={16} height={8}>\n <svg\n viewBox=\"0 0 16 8\"\n className=\"labui:fill-popover labui:stroke-border\"\n >\n <path d=\"M0 0 C3 0 5 6 7 7 Q8 8 9 7 C11 6 13 0 16 0\" />\n </svg>\n </Popover.Arrow>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )}\n {onFullscreenChange && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className={round}\n aria-label=\"Full screen\"\n aria-pressed={fullscreen}\n title={fullscreen ? \"Exit full screen\" : \"Full screen\"}\n onClick={() => onFullscreenChange(!fullscreen)}\n >\n {fullscreen ? (\n <MinimizeIcon className=\"labui:size-4\" />\n ) : (\n <MaximizeIcon className=\"labui:size-4\" />\n )}\n </Button>\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n", "import { useId, type ReactNode } from \"react\";\nimport { PlusIcon } from \"lucide-react\";\nimport {\n Button,\n Field,\n FieldLabel,\n Input,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from \"./primitives.js\";\n\ntype TextProps = {\n label: string;\n value: string;\n onChange: (value: string) => void;\n} & Omit<React.ComponentProps<typeof Input>, \"value\" | \"onChange\">;\n\nexport function TextField({ label, value, onChange, ...props }: TextProps) {\n const id = useId();\n return (\n <Field data-invalid={props[\"aria-invalid\"] || undefined}>\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <Input\n id={id}\n autoComplete=\"off\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n {...props}\n />\n </Field>\n );\n}\n\nexport function SelectField({\n label,\n value,\n onChange,\n options,\n children,\n}: Pick<TextProps, \"label\" | \"value\" | \"onChange\"> & {\n options: { id: string; name: string; disabled?: boolean }[];\n children?: ReactNode;\n}) {\n const id = useId();\n return (\n <Field>\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <div className=\"labui:flex labui:items-center labui:gap-2\">\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger id={id} className=\"labui:flex-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.id} value={o.id} disabled={o.disabled}>\n {o.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {children}\n </div>\n </Field>\n );\n}\n\nexport function AddButton({\n children,\n onClick,\n}: {\n children: ReactNode;\n onClick: () => void;\n}) {\n return (\n <Button type=\"button\" variant=\"secondary\" onClick={onClick}>\n <PlusIcon />\n {children}\n </Button>\n );\n}\n", "import * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from \"lucide-react\";\nconst show = (value: unknown) => (value == null ? \"\" : String(value));\nimport { Button, cn, Skeleton } from \"./primitives.js\";\n\nexport type TableColumn<T> = {\n id: string;\n header: string;\n headerDetail?: string;\n rowHeader?: boolean;\n numeric?: boolean;\n cell: (row: T) => React.ReactNode;\n sortValue: (row: T) => string | number | null | undefined;\n};\n\ntype Sort = { column: string; direction: \"asc\" | \"desc\" };\n\nconst cellClass = \"labui:px-3 labui:py-(--labui-row-py) labui:align-middle\";\n\nexport function Table<T>({\n label,\n columns,\n rows,\n rowKey,\n loading,\n empty = \"No rows to display.\",\n defaultSort = null,\n onRowActivate,\n rowLabel,\n}: {\n label: string;\n columns: TableColumn<T>[];\n rows: readonly T[];\n rowKey: (row: T, index: number) => string;\n loading?: boolean;\n empty?: React.ReactNode;\n defaultSort?: Sort | null;\n onRowActivate?: (row: T) => void;\n rowLabel?: (row: T) => string;\n}) {\n const [sort, setSort] = React.useState(defaultSort);\n const sortBy = columns.find((c) => c.id === sort?.column)?.sortValue;\n const sorted =\n sort && sortBy\n ? [...rows].sort((x, y) => {\n const a = sortBy(x);\n const b = sortBy(y);\n if (a == null || b == null)\n return Number(a == null) - Number(b == null);\n const order =\n typeof a === \"number\" && typeof b === \"number\"\n ? a - b\n : String(a).localeCompare(String(b), undefined, {\n numeric: true,\n });\n return sort.direction === \"asc\" ? order : -order;\n })\n : rows;\n\n function toggle(column: TableColumn<T>) {\n setSort(\n sort?.column === column.id\n ? {\n column: column.id,\n direction: sort.direction === \"asc\" ? \"desc\" : \"asc\",\n }\n : { column: column.id, direction: column.numeric ? \"desc\" : \"asc\" },\n );\n }\n\n return (\n <div className=\"labui:min-w-0 labui:overflow-auto labui:rounded-lg labui:border\">\n <table\n aria-label={label}\n aria-busy={loading || undefined}\n className=\"labui:w-full labui:text-xs labui:tabular-nums\"\n >\n <thead>\n <tr>\n {columns.map((column) => {\n const direction =\n sort?.column === column.id ? sort.direction : null;\n const Marker =\n direction === \"asc\"\n ? ArrowUpIcon\n : direction === \"desc\"\n ? ArrowDownIcon\n : ArrowUpDownIcon;\n return (\n <th\n key={column.id}\n scope=\"col\"\n aria-sort={\n direction\n ? direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : undefined\n }\n className={cn(\n \"labui:sticky labui:top-0 labui:z-10 labui:h-8 labui:bg-card labui:px-3 labui:text-left labui:font-medium labui:whitespace-nowrap labui:text-muted-foreground labui:shadow-[inset_0_-1px_var(--labui-border)]\",\n column.numeric && \"labui:text-right\",\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"labui:-mx-2 labui:h-7 labui:gap-1 labui:px-2 labui:text-xs labui:font-medium labui:hover:bg-transparent\"\n disabled={loading}\n onClick={() => toggle(column)}\n >\n {column.header}\n {column.headerDetail && (\n <span className=\"labui:text-[10px] labui:font-normal\">\n {column.headerDetail}\n </span>\n )}\n <Marker\n aria-hidden=\"true\"\n className={cn(\n \"labui:size-3.5\",\n !direction && \"labui:opacity-40\",\n )}\n />\n </Button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"labui:[&_tr:last-child]:border-0\">\n {loading ? (\n Array.from({ length: 6 }, (_, index) => (\n <tr key={index} aria-hidden=\"true\" className=\"labui:border-b\">\n {columns.map((column, at) => (\n <td key={column.id} className={cellClass}>\n <Skeleton\n className={cn(\n \"labui:h-3\",\n at % 2 ? \"labui:w-1/2\" : \"labui:w-3/4\",\n )}\n />\n </td>\n ))}\n </tr>\n ))\n ) : sorted.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"labui:p-4 labui:text-muted-foreground\"\n >\n {empty}\n </td>\n </tr>\n ) : (\n sorted.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n \"labui:border-b labui:transition-colors labui:hover:bg-muted/50\",\n onRowActivate && \"labui:cursor-pointer\",\n )}\n onClick={(event) => {\n if (!(event.target as Element).closest(\"a, button\"))\n onRowActivate?.(row);\n }}\n >\n {columns.map((column, at) => {\n const Cell = column.rowHeader ? \"th\" : \"td\";\n return (\n <Cell\n key={column.id}\n scope={column.rowHeader ? \"row\" : undefined}\n className={cn(\n cellClass,\n column.rowHeader && \"labui:text-left labui:font-medium\",\n column.numeric && \"labui:text-right\",\n )}\n >\n {at === 0 && onRowActivate ? (\n <button\n type=\"button\"\n aria-label={rowLabel?.(row)}\n className=\"labui:-m-1 labui:min-h-6 labui:rounded labui:p-1 labui:text-left labui:whitespace-nowrap labui:focus-visible:outline-2 labui:focus-visible:outline-ring\"\n onClick={() => onRowActivate(row)}\n >\n {column.cell(row)}\n </button>\n ) : (\n column.cell(row)\n )}\n </Cell>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function column<T>(\n id: string,\n header: string,\n value: (row: T) => string | number | null | undefined,\n cell: (row: T) => ReactNode = (row) => show(value(row)),\n): TableColumn<T> {\n return { id, header, sortValue: value, cell };\n}\n\nexport const mono = <T,>(\n id: string,\n header: string,\n value: (row: T) => unknown,\n) =>\n column<T>(\n id,\n header,\n (row) => show(value(row)),\n (row) => <span className=\"labui:font-mono\">{show(value(row))}</span>,\n );\n\nexport const num = <T,>(\n id: string,\n header: string,\n value: (row: T) => number,\n digits = 0,\n headerDetail?: string,\n): TableColumn<T> => ({\n ...column(id, header, value, (row) =>\n value(row).toLocaleString(\"en-US\", {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n }),\n ),\n numeric: true,\n headerDetail,\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DialogContent", "DialogHeader", "DialogFooter", "DialogTitle", "DialogDescription", "jsx", "jsxs", "useState", "jsx", "jsxs", "useState", "jsx", "jsxs", "React", "jsx", "jsxs", "column"]
7
+ }
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-outline-style:solid}}}:root,:host{--labui-color-white:#fff;--labui-spacing:.25rem;--labui-container-lg:32rem;--labui-text-xs:.75rem;--labui-text-xs--line-height:calc(1 / .75);--labui-text-sm:.875rem;--labui-text-sm--line-height:calc(1.25 / .875);--labui-text-base:1rem;--labui-text-base--line-height:calc(1.5 / 1);--labui-text-lg:1.125rem;--labui-text-lg--line-height:calc(1.75 / 1.125);--labui-text-2xl:1.5rem;--labui-text-2xl--line-height:calc(2 / 1.5);--labui-font-weight-normal:400;--labui-font-weight-medium:500;--labui-font-weight-semibold:600;--labui-font-weight-bold:700;--labui-tracking-tight:-.025em;--labui-leading-snug:1.375;--labui-leading-normal:1.5;--labui-leading-relaxed:1.625;--labui-animate-spin:labui-spin 1s linear infinite;--labui-animate-pulse:labui-pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--labui-blur-xl:24px;--labui-default-transition-duration:.15s;--labui-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--labui-animate-pop:labui-pop .16s ease-out}:where([class*=labui\:]){box-sizing:border-box;border:0 solid var(--labui-border);outline-color:var(--labui-ring);margin:0;padding:0}@supports (color:color-mix(in lab, red, red)){:where([class*=labui\:]){outline-color:color-mix(in oklab, var(--labui-ring) 50%, transparent)}}:where(button,input,select,textarea,a)[class*=labui\:]{font:inherit;font-feature-settings:inherit;letter-spacing:inherit;color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;background-color:#0000;border-radius:0}:where(input,textarea)[class*=labui\:]::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab, red, red)){:where(input,textarea)[class*=labui\:]::placeholder{color:color-mix(in srgb, currentcolor 50%, transparent)}}:where(table[class*=labui\:]){border-collapse:collapse;text-indent:0}:where(h1,h2,h3,h4,h5,h6)[class*=labui\:]{font-size:inherit;font-weight:inherit}:where(svg[class*=labui\:]){vertical-align:middle;display:block}@media (prefers-reduced-motion:reduce){:where([class*=labui\:]){scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.labui\:pointer-events-none{pointer-events:none}.labui\:range-overlay{cursor:ns-resize;appearance:none;opacity:0;writing-mode:vertical-lr;direction:rtl;width:100%;height:100%;position:absolute;inset:0}.labui\:range-overlay::-webkit-slider-thumb{appearance:none;width:100%;height:0}.labui\:range-overlay::-moz-range-thumb{border:0;width:100%;height:0}@media (forced-colors:active){.labui\:range-overlay{appearance:auto;opacity:1}.labui\:range-overlay::-webkit-slider-thumb{appearance:auto;width:auto;height:auto}.labui\:range-overlay::-moz-range-thumb{border:1px solid buttontext;width:1rem;height:1rem}}.labui\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.labui\:absolute{position:absolute}.labui\:fixed{position:fixed}.labui\:relative{position:relative}.labui\:sticky{position:sticky}.labui\:inset-0{inset:0}.labui\:inset-x-0{inset-inline:0}.labui\:top-0{top:0}.labui\:top-1\/2{top:50%}.labui\:top-2{top:calc(var(--labui-spacing) * 2)}.labui\:top-4{top:calc(var(--labui-spacing) * 4)}.labui\:right-2{right:calc(var(--labui-spacing) * 2)}.labui\:right-4{right:calc(var(--labui-spacing) * 4)}.labui\:bottom-0{bottom:0}.labui\:left-1\/2{left:50%}.labui\:z-10{z-index:10}.labui\:z-50{z-index:50}.labui\:z-\[60\]{z-index:60}.labui\:col-start-2{grid-column-start:2}.labui\:-m-1{margin:calc(var(--labui-spacing) * -1)}.labui\:m-0{margin:0}.labui\:-mx-2{margin-inline:calc(var(--labui-spacing) * -2)}.labui\:my-1{margin-block:var(--labui-spacing)}.labui\:mt-2{margin-top:calc(var(--labui-spacing) * 2)}.labui\:mt-6{margin-top:calc(var(--labui-spacing) * 6)}.labui\:mr-1{margin-right:var(--labui-spacing)}.labui\:-ml-2\.5{margin-left:calc(var(--labui-spacing) * -2.5)}.labui\:ml-1{margin-left:var(--labui-spacing)}.labui\:ml-auto{margin-left:auto}.labui\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.labui\:flex{display:flex}.labui\:grid{display:grid}.labui\:inline-flex{display:inline-flex}.labui\:size-\(--labui-control-height-sm\){width:var(--labui-control-height-sm);height:var(--labui-control-height-sm)}.labui\:size-3\.5{width:calc(var(--labui-spacing) * 3.5);height:calc(var(--labui-spacing) * 3.5)}.labui\:size-4{width:calc(var(--labui-spacing) * 4);height:calc(var(--labui-spacing) * 4)}.labui\:size-5{width:calc(var(--labui-spacing) * 5);height:calc(var(--labui-spacing) * 5)}.labui\:size-6{width:calc(var(--labui-spacing) * 6);height:calc(var(--labui-spacing) * 6)}.labui\:size-8{width:calc(var(--labui-spacing) * 8);height:calc(var(--labui-spacing) * 8)}.labui\:size-9{width:calc(var(--labui-spacing) * 9);height:calc(var(--labui-spacing) * 9)}.labui\:size-\[var\(--lab-logo-size\,1\.5rem\)\]{width:var(--lab-logo-size,1.5rem);height:var(--lab-logo-size,1.5rem)}.labui\:size-\[var\(--lab-tab-height\,2\.75rem\)\]{width:var(--lab-tab-height,2.75rem);height:var(--lab-tab-height,2.75rem)}.labui\:size-full{width:100%;height:100%}.labui\:h-\(--labui-control-height\){height:var(--labui-control-height)}.labui\:h-\(--labui-control-height-sm\){height:var(--labui-control-height-sm)}.labui\:h-3{height:calc(var(--labui-spacing) * 3)}.labui\:h-7{height:calc(var(--labui-spacing) * 7)}.labui\:h-8{height:calc(var(--labui-spacing) * 8)}.labui\:h-10{height:calc(var(--labui-spacing) * 10)}.labui\:h-28{height:calc(var(--labui-spacing) * 28)}.labui\:h-full{height:100%}.labui\:max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.labui\:max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.labui\:max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.labui\:max-h-\[var\(--radix-popover-content-available-height\)\]{max-height:var(--radix-popover-content-available-height)}.labui\:max-h-none{max-height:none}.labui\:min-h-0{min-height:0}.labui\:min-h-4{min-height:calc(var(--labui-spacing) * 4)}.labui\:min-h-6{min-height:calc(var(--labui-spacing) * 6)}.labui\:min-h-9{min-height:calc(var(--labui-spacing) * 9)}.labui\:w-1\/2{width:50%}.labui\:w-3\/4{width:75%}.labui\:w-7{width:calc(var(--labui-spacing) * 7)}.labui\:w-56{width:calc(var(--labui-spacing) * 56)}.labui\:w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.labui\:w-fit{width:fit-content}.labui\:w-full{width:100%}.labui\:w-max{width:max-content}.labui\:max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.labui\:max-w-full{max-width:100%}.labui\:max-w-lg{max-width:var(--labui-container-lg)}.labui\:max-w-none{max-width:none}.labui\:min-w-\(--radix-select-trigger-width\){min-width:var(--radix-select-trigger-width)}.labui\:min-w-0{min-width:0}.labui\:min-w-40{min-width:calc(var(--labui-spacing) * 40)}.labui\:min-w-44{min-width:calc(var(--labui-spacing) * 44)}.labui\:flex-1{flex:1}.labui\:shrink-0{flex-shrink:0}.labui\:origin-\(--radix-popover-content-transform-origin\){transform-origin:var(--radix-popover-content-transform-origin)}.labui\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.labui\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.labui\:animate-pop{animation:var(--labui-animate-pop)}.labui\:animate-pulse{animation:var(--labui-animate-pulse)}.labui\:animate-spin{animation:var(--labui-animate-spin)}.labui\:cursor-default{cursor:default}.labui\:cursor-pointer{cursor:pointer}.labui\:grid-cols-\[0_1fr\]{grid-template-columns:0 1fr}.labui\:flex-col{flex-direction:column}.labui\:flex-wrap{flex-wrap:wrap}.labui\:place-content-center{place-content:center}.labui\:place-items-center{place-items:center}.labui\:items-center{align-items:center}.labui\:items-start{align-items:flex-start}.labui\:justify-between{justify-content:space-between}.labui\:justify-center{justify-content:center}.labui\:justify-end{justify-content:flex-end}.labui\:justify-items-start{justify-items:start}.labui\:gap-1{gap:var(--labui-spacing)}.labui\:gap-1\.5{gap:calc(var(--labui-spacing) * 1.5)}.labui\:gap-2{gap:calc(var(--labui-spacing) * 2)}.labui\:gap-3{gap:calc(var(--labui-spacing) * 3)}.labui\:gap-4{gap:calc(var(--labui-spacing) * 4)}.labui\:gap-6{gap:calc(var(--labui-spacing) * 6)}.labui\:gap-y-0\.5{row-gap:calc(var(--labui-spacing) * .5)}.labui\:self-start{align-self:flex-start}.labui\:overflow-auto{overflow:auto}.labui\:overflow-hidden{overflow:hidden}.labui\:overflow-x-hidden{overflow-x:hidden}.labui\:overflow-y-auto{overflow-y:auto}.labui\:rounded{border-radius:.25rem}.labui\:rounded-\(--labui-radius-dialog\){border-radius:var(--labui-radius-dialog)}.labui\:rounded-\[1\.25rem\]{border-radius:1.25rem}.labui\:rounded-\[4px\]{border-radius:4px}.labui\:rounded-full{border-radius:3.40282e38px}.labui\:rounded-lg{border-radius:var(--labui-radius)}.labui\:rounded-md{border-radius:calc(var(--labui-radius) - 2px)}.labui\:rounded-xl{border-radius:calc(var(--labui-radius) + 4px)}.labui\:border{border-style:var(--tw-border-style);border-width:1px}.labui\:border-0{border-style:var(--tw-border-style);border-width:0}.labui\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.labui\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.labui\:border-border{border-color:var(--labui-border)}.labui\:border-destructive\/30{border-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:border-destructive\/30{border-color:color-mix(in oklab, var(--labui-destructive) 30%, transparent)}}.labui\:border-destructive\/40{border-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:border-destructive\/40{border-color:color-mix(in oklab, var(--labui-destructive) 40%, transparent)}}.labui\:border-input{border-color:var(--labui-input)}.labui\:border-success\/30{border-color:var(--labui-success)}@supports (color:color-mix(in lab, red, red)){.labui\:border-success\/30{border-color:color-mix(in oklab, var(--labui-success) 30%, transparent)}}.labui\:border-transparent{border-color:#0000}.labui\:border-warning\/30{border-color:var(--labui-warning)}@supports (color:color-mix(in lab, red, red)){.labui\:border-warning\/30{border-color:color-mix(in oklab, var(--labui-warning) 30%, transparent)}}.labui\:border-warning\/40{border-color:var(--labui-warning)}@supports (color:color-mix(in lab, red, red)){.labui\:border-warning\/40{border-color:color-mix(in oklab, var(--labui-warning) 40%, transparent)}}.labui\:border-b-input{border-bottom-color:var(--labui-input)}.labui\:bg-accent{background-color:var(--labui-accent)}.labui\:bg-background{background-color:var(--labui-background)}.labui\:bg-card{background-color:var(--labui-card)}.labui\:bg-destructive-muted{background-color:var(--labui-destructive-muted)}.labui\:bg-destructive\/15{background-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-destructive\/15{background-color:color-mix(in oklab, var(--labui-destructive) 15%, transparent)}}.labui\:bg-input-background{background-color:var(--labui-input-background)}.labui\:bg-muted,.labui\:bg-muted\/40{background-color:var(--labui-muted)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-muted\/40{background-color:color-mix(in oklab, var(--labui-muted) 40%, transparent)}}.labui\:bg-muted\/50{background-color:var(--labui-muted)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-muted\/50{background-color:color-mix(in oklab, var(--labui-muted) 50%, transparent)}}.labui\:bg-overlay{background-color:var(--labui-overlay)}.labui\:bg-popover,.labui\:bg-popover\/90{background-color:var(--labui-popover)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-popover\/90{background-color:color-mix(in oklab, var(--labui-popover) 90%, transparent)}}.labui\:bg-primary{background-color:var(--labui-primary)}.labui\:bg-secondary{background-color:var(--labui-secondary)}.labui\:bg-success\/15{background-color:var(--labui-success)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-success\/15{background-color:color-mix(in oklab, var(--labui-success) 15%, transparent)}}.labui\:bg-warning\/15{background-color:var(--labui-warning)}@supports (color:color-mix(in lab, red, red)){.labui\:bg-warning\/15{background-color:color-mix(in oklab, var(--labui-warning) 15%, transparent)}}.labui\:bg-white{background-color:var(--labui-color-white)}.labui\:bg-linear-to-b{--tw-gradient-position:to bottom}@supports (background-image:linear-gradient(in lab, red, red)){.labui\:bg-linear-to-b{--tw-gradient-position:to bottom in oklab}}.labui\:bg-linear-to-b{background-image:linear-gradient(var(--tw-gradient-stops))}.labui\:from-card{--tw-gradient-from:var(--labui-card);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:to-muted{--tw-gradient-to:var(--labui-muted);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:fill-popover{fill:var(--labui-popover)}.labui\:stroke-border{stroke:var(--labui-border)}.labui\:p-0{padding:0}.labui\:p-1{padding:var(--labui-spacing)}.labui\:p-2{padding:calc(var(--labui-spacing) * 2)}.labui\:p-4{padding:calc(var(--labui-spacing) * 4)}.labui\:p-6{padding:calc(var(--labui-spacing) * 6)}.labui\:px-\(--labui-control-px\){padding-inline:var(--labui-control-px)}.labui\:px-2{padding-inline:calc(var(--labui-spacing) * 2)}.labui\:px-3{padding-inline:calc(var(--labui-spacing) * 3)}.labui\:px-4{padding-inline:calc(var(--labui-spacing) * 4)}.labui\:px-6{padding-inline:calc(var(--labui-spacing) * 6)}.labui\:py-\(--labui-row-py\){padding-block:var(--labui-row-py)}.labui\:py-0\.5{padding-block:calc(var(--labui-spacing) * .5)}.labui\:py-1{padding-block:var(--labui-spacing)}.labui\:py-1\.5{padding-block:calc(var(--labui-spacing) * 1.5)}.labui\:py-2{padding-block:calc(var(--labui-spacing) * 2)}.labui\:py-3{padding-block:calc(var(--labui-spacing) * 3)}.labui\:py-4{padding-block:calc(var(--labui-spacing) * 4)}.labui\:pr-0\.5{padding-right:calc(var(--labui-spacing) * .5)}.labui\:pr-8{padding-right:calc(var(--labui-spacing) * 8)}.labui\:pl-2{padding-left:calc(var(--labui-spacing) * 2)}.labui\:text-center{text-align:center}.labui\:text-left{text-align:left}.labui\:text-right{text-align:right}.labui\:align-middle{vertical-align:middle}.labui\:font-display{font-family:var(--labui-font-display)}.labui\:font-mono{font-family:var(--labui-font-mono)}.labui\:font-sans{font-family:var(--labui-font-sans)}.labui\:text-2xl{font-size:var(--labui-text-2xl);line-height:var(--tw-leading,var(--labui-text-2xl--line-height))}.labui\:text-base{font-size:var(--labui-text-base);line-height:var(--tw-leading,var(--labui-text-base--line-height))}.labui\:text-lg{font-size:var(--labui-text-lg);line-height:var(--tw-leading,var(--labui-text-lg--line-height))}.labui\:text-sm{font-size:var(--labui-text-sm);line-height:var(--tw-leading,var(--labui-text-sm--line-height))}.labui\:text-xs{font-size:var(--labui-text-xs);line-height:var(--tw-leading,var(--labui-text-xs--line-height))}.labui\:text-\[10px\]{font-size:10px}.labui\:leading-7{--tw-leading:calc(var(--labui-spacing) * 7);line-height:calc(var(--labui-spacing) * 7)}.labui\:leading-normal{--tw-leading:var(--labui-leading-normal);line-height:var(--labui-leading-normal)}.labui\:leading-snug{--tw-leading:var(--labui-leading-snug);line-height:var(--labui-leading-snug)}.labui\:font-bold{--tw-font-weight:var(--labui-font-weight-bold);font-weight:var(--labui-font-weight-bold)}.labui\:font-medium{--tw-font-weight:var(--labui-font-weight-medium);font-weight:var(--labui-font-weight-medium)}.labui\:font-normal{--tw-font-weight:var(--labui-font-weight-normal);font-weight:var(--labui-font-weight-normal)}.labui\:font-semibold{--tw-font-weight:var(--labui-font-weight-semibold);font-weight:var(--labui-font-weight-semibold)}.labui\:tracking-tight{--tw-tracking:var(--labui-tracking-tight);letter-spacing:var(--labui-tracking-tight)}.labui\:break-words{overflow-wrap:break-word}.labui\:break-all{word-break:break-all}.labui\:whitespace-nowrap{white-space:nowrap}.labui\:text-current{color:currentColor}.labui\:text-destructive{color:var(--labui-destructive)}.labui\:text-foreground{color:var(--labui-foreground)}.labui\:text-link{color:var(--labui-link)}.labui\:text-muted-foreground{color:var(--labui-muted-foreground)}.labui\:text-popover-foreground{color:var(--labui-popover-foreground)}.labui\:text-primary{color:var(--labui-primary)}.labui\:text-primary-foreground{color:var(--labui-primary-foreground)}.labui\:text-success{color:var(--labui-success)}.labui\:text-warning{color:var(--labui-warning)}.labui\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.labui\:underline-offset-4{text-underline-offset:4px}.labui\:opacity-0{opacity:0}.labui\:opacity-40{opacity:.4}.labui\:shadow-\[0_-1px_4px_\#00000014\]{--tw-shadow:0 -1px 4px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-\[inset_0_-1px_var\(--labui-border\)\]{--tw-shadow:inset 0 -1px var(--tw-shadow-color,var(--labui-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-\[inset_0_1px_0_\#ffffff\,0_1px_1px_\#00000014\,0_3px_4px_\#0000000d\]{--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#fff), 0 1px 1px var(--tw-shadow-color,#00000014), 0 3px 4px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:backdrop-blur-xl{--tw-backdrop-blur:blur(var(--labui-blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.labui\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.labui\:transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-\[filter\,translate\]{transition-property:filter,translate;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:transition-none{transition-property:none}.labui\:duration-150{--tw-duration:.15s;transition-duration:.15s}.labui\:outline-none{--tw-outline-style:none;outline-style:none}.labui\:select-none{-webkit-user-select:none;user-select:none}.labui\:\[--labui-control-height\:2\.25rem\]{--labui-control-height:2.25rem}.labui\:\[transition\:height_100ms_ease-out\]{transition:height .1s ease-out}@media (hover:hover){.labui\:group-hover\:opacity-100:is(:where(.labui\:group):hover *){opacity:1}.labui\:group-hover\:drop-shadow-\[0_3px_2px_\#00000035\]:is(:where(.labui\:group):hover *){--tw-drop-shadow-size:drop-shadow(0 3px 2px var(--tw-drop-shadow-color,#00000035));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.labui\:group-active\:translate-y-0:is(:where(.labui\:group):active *){--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.labui\:selection\:bg-primary ::selection{background-color:var(--labui-primary)}.labui\:selection\:bg-primary::selection{background-color:var(--labui-primary)}.labui\:selection\:text-primary-foreground ::selection{color:var(--labui-primary-foreground)}.labui\:selection\:text-primary-foreground::selection{color:var(--labui-primary-foreground)}.labui\:file\:me-3::file-selector-button{margin-inline-end:calc(var(--labui-spacing) * 3)}.labui\:file\:inline-flex::file-selector-button{display:inline-flex}.labui\:file\:h-7::file-selector-button{height:calc(var(--labui-spacing) * 7)}.labui\:file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.labui\:file\:bg-transparent::file-selector-button{background-color:#0000}.labui\:file\:text-sm::file-selector-button{font-size:var(--labui-text-sm);line-height:var(--tw-leading,var(--labui-text-sm--line-height))}.labui\:file\:font-medium::file-selector-button{--tw-font-weight:var(--labui-font-weight-medium);font-weight:var(--labui-font-weight-medium)}.labui\:file\:text-foreground::file-selector-button{color:var(--labui-foreground)}.labui\:placeholder\:text-muted-foreground::placeholder{color:var(--labui-muted-foreground)}.labui\:empty\:hidden:empty{display:none}@media (hover:hover){.labui\:hover\:border-destructive\/20:hover{border-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:hover\:border-destructive\/20:hover{border-color:color-mix(in oklab, var(--labui-destructive) 20%, transparent)}}.labui\:hover\:bg-accent:hover{background-color:var(--labui-accent)}.labui\:hover\:bg-destructive\/15:hover{background-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:hover\:bg-destructive\/15:hover{background-color:color-mix(in oklab, var(--labui-destructive) 15%, transparent)}}.labui\:hover\:bg-muted\/50:hover{background-color:var(--labui-muted)}@supports (color:color-mix(in lab, red, red)){.labui\:hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--labui-muted) 50%, transparent)}}.labui\:hover\:bg-primary\/90:hover{background-color:var(--labui-primary)}@supports (color:color-mix(in lab, red, red)){.labui\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--labui-primary) 90%, transparent)}}.labui\:hover\:bg-transparent:hover{background-color:#0000}.labui\:hover\:to-background:hover{--tw-gradient-to:var(--labui-background);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:hover\:text-accent-foreground:hover{color:var(--labui-accent-foreground)}.labui\:hover\:text-foreground:hover{color:var(--labui-foreground)}.labui\:hover\:underline:hover{text-decoration-line:underline}.labui\:hover\:shadow-\[inset_0_1px_0_\#ffffff\,0_2px_3px_\#0000001a\,0_4px_6px_\#0000000d\]:hover{--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#fff), 0 2px 3px var(--tw-shadow-color,#0000001a), 0 4px 6px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.labui\:focus-visible\:border-ring:focus-visible{border-color:var(--labui-ring)}.labui\:focus-visible\:opacity-100:focus-visible{opacity:1}.labui\:focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--labui-destructive) 20%, transparent)}}.labui\:focus-visible\:ring-ring:focus-visible,.labui\:focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--labui-ring)}@supports (color:color-mix(in lab, red, red)){.labui\:focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--labui-ring) 50%, transparent)}}.labui\:focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.labui\:focus-visible\:outline-ring:focus-visible{outline-color:var(--labui-ring)}.labui\:focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.labui\:active\:translate-y-px:active{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.labui\:active\:from-muted:active{--tw-gradient-from:var(--labui-muted);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:active\:to-card:active{--tw-gradient-to:var(--labui-card);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:active\:shadow-\[inset_0_1px_2px_\#0000001a\,0_1px_0_\#ffffff80\]:active{--tw-shadow:inset 0 1px 2px var(--tw-shadow-color,#0000001a), 0 1px 0 var(--tw-shadow-color,#ffffff80);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:disabled\:pointer-events-none:disabled{pointer-events:none}.labui\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.labui\:disabled\:bg-secondary:disabled{background-color:var(--labui-secondary)}.labui\:disabled\:bg-none:disabled{background-image:none}.labui\:disabled\:opacity-50:disabled{opacity:.5}.labui\:disabled\:shadow-none:disabled{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:has-focus-visible\:outline-2:has(:focus-visible){outline-style:var(--tw-outline-style);outline-width:2px}.labui\:has-focus-visible\:outline-offset-2:has(:focus-visible){outline-offset:2px}.labui\:has-focus-visible\:outline-ring:has(:focus-visible){outline-color:var(--labui-ring)}.labui\:has-\[\>svg\]\:grid-cols-\[--spacing\(4\)_1fr\]:has(>svg){grid-template-columns:calc(var(--labui-spacing) * 4) 1fr}.labui\:has-\[\>svg\]\:gap-x-3:has(>svg){column-gap:calc(var(--labui-spacing) * 3)}.labui\:has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--labui-spacing) * 2.5)}.labui\:has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--labui-spacing) * 3)}.labui\:aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--labui-destructive)}.labui\:aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--labui-destructive) 20%, transparent)}}.labui\:data-disabled\:opacity-50[data-disabled]{opacity:.5}.labui\:data-highlighted\:bg-accent[data-highlighted]{background-color:var(--labui-accent)}.labui\:data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.labui\:data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.labui\:data-\[highlighted\]\:bg-accent[data-highlighted]{background-color:var(--labui-accent)}.labui\:data-\[highlighted\]\:text-accent-foreground[data-highlighted]{color:var(--labui-accent-foreground)}.labui\:data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:var(--labui-destructive)}.labui\:data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--labui-muted-foreground)}.labui\:data-\[size\=sm\]\:h-\(--labui-control-height-sm\)[data-size=sm]{height:var(--labui-control-height-sm)}.labui\:data-\[size\=sm\]\:px-2[data-size=sm]{padding-inline:calc(var(--labui-spacing) * 2)}.labui\:data-\[size\=sm\]\:text-xs[data-size=sm]{font-size:var(--labui-text-xs);line-height:var(--tw-leading,var(--labui-text-xs--line-height))}:is(.labui\:\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){:is(.labui\:\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--labui-destructive) 90%, transparent)}}:is(.labui\:\*\:data-\[slot\=select-value\]\:truncate>*)[data-slot=select-value]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.labui\:data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--labui-primary)}.labui\:data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--labui-primary)}.labui\:data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--labui-primary-foreground)}.labui\:data-\[state\=closed\]\:animate-\[labui-pop_120ms_ease-in_reverse\][data-state=closed]{animation:.12s ease-in reverse labui-pop}.labui\:data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--labui-accent)}@media (prefers-reduced-motion:no-preference){@media (hover:hover){.labui\:motion-safe\:group-hover\:-translate-y-0\.5:is(:where(.labui\:group):hover *){--tw-translate-y:calc(var(--labui-spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}}}@media (min-width:40rem){.labui\:sm\:-mr-1{margin-right:calc(var(--labui-spacing) * -1)}.labui\:sm\:-ml-1{margin-left:calc(var(--labui-spacing) * -1)}.labui\:sm\:max-w-lg{max-width:var(--labui-container-lg)}}@media (min-width:48rem){.labui\:md\:text-sm{font-size:var(--labui-text-sm);line-height:var(--tw-leading,var(--labui-text-sm--line-height))}}.labui\:dark\:border-foreground\/15:is(.dark *){border-color:var(--labui-foreground)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:border-foreground\/15:is(.dark *){border-color:color-mix(in oklab, var(--labui-foreground) 15%, transparent)}}.labui\:dark\:border-b-foreground\/10:is(.dark *){border-bottom-color:var(--labui-foreground)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:border-b-foreground\/10:is(.dark *){border-bottom-color:color-mix(in oklab, var(--labui-foreground) 10%, transparent)}}.labui\:dark\:bg-input\/30:is(.dark *){background-color:var(--labui-input)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--labui-input) 30%, transparent)}}.labui\:dark\:bg-secondary:is(.dark *){background-color:var(--labui-secondary)}.labui\:dark\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_88\%\,var\(--labui-foreground\)\)\]:is(.dark *){--tw-gradient-from:var(--labui-secondary)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_88\%\,var\(--labui-foreground\)\)\]:is(.dark *){--tw-gradient-from:color-mix(in srgb,var(--labui-secondary) 88%,var(--labui-foreground))}}.labui\:dark\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_88\%\,var\(--labui-foreground\)\)\]:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:to-secondary:is(.dark *){--tw-gradient-to:var(--labui-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:text-popover-foreground:is(.dark *){color:var(--labui-popover-foreground)}.labui\:dark\:shadow-\[inset_0_1px_0_\#ffffff14\,0_1px_2px_\#00000026\]:is(.dark *){--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#ffffff14), 0 1px 2px var(--tw-shadow-color,#00000026);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.labui\:dark\:group-hover\:drop-shadow-\[0_3px_3px_\#00000090\]:is(.dark *):is(:where(.labui\:group):hover *){--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#00000090));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.labui\:dark\:hover\:border-foreground\/25:is(.dark *):hover{border-color:var(--labui-foreground)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:hover\:border-foreground\/25:is(.dark *):hover{border-color:color-mix(in oklab, var(--labui-foreground) 25%, transparent)}}.labui\:dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--labui-accent)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--labui-accent) 50%, transparent)}}.labui\:dark\:hover\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_82\%\,var\(--labui-foreground\)\)\]:is(.dark *):hover{--tw-gradient-from:var(--labui-secondary)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:hover\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_82\%\,var\(--labui-foreground\)\)\]:is(.dark *):hover{--tw-gradient-from:color-mix(in srgb,var(--labui-secondary) 82%,var(--labui-foreground))}}.labui\:dark\:hover\:from-\[color-mix\(in_srgb\,var\(--labui-secondary\)_82\%\,var\(--labui-foreground\)\)\]:is(.dark *):hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:hover\:to-secondary:is(.dark *):hover{--tw-gradient-to:var(--labui-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:hover\:shadow-\[inset_0_1px_0_\#ffffff1f\,0_2px_4px_\#00000033\]:is(.dark *):hover{--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#ffffff1f), 0 2px 4px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.labui\:dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--labui-destructive) 40%, transparent)}}.labui\:dark\:active\:from-secondary:is(.dark *):active{--tw-gradient-from:var(--labui-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:active\:to-secondary:is(.dark *):active{--tw-gradient-to:var(--labui-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.labui\:dark\:active\:shadow-\[inset_0_1px_2px_\#00000033\,0_1px_0_\#ffffff0a\]:is(.dark *):active{--tw-shadow:inset 0 1px 2px var(--tw-shadow-color,#0003), 0 1px 0 var(--tw-shadow-color,#ffffff0a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:dark\:disabled\:shadow-none:is(.dark *):disabled{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.labui\:dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){.labui\:dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--labui-destructive) 40%, transparent)}}.labui\:dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--labui-primary)}@media (forced-colors:active){.labui\:forced-colors\:hidden{display:none}}.labui\:\[\&_p\]\:leading-relaxed p{--tw-leading:var(--labui-leading-relaxed);line-height:var(--labui-leading-relaxed)}.labui\:\[\&_rect\]\:transition-\[fill-opacity\] rect{transition-property:fill-opacity;transition-timing-function:var(--tw-ease,var(--labui-default-transition-timing-function));transition-duration:var(--tw-duration,var(--labui-default-transition-duration))}.labui\:\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.labui\:\[\&_svg\]\:size-4 svg{width:calc(var(--labui-spacing) * 4);height:calc(var(--labui-spacing) * 4)}.labui\:\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.labui\:\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--labui-spacing) * 3);height:calc(var(--labui-spacing) * 3)}.labui\:\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--labui-spacing) * 4);height:calc(var(--labui-spacing) * 4)}.labui\:\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.labui\:\[\&\:\:-webkit-calendar-picker-indicator\]\:opacity-60::-webkit-calendar-picker-indicator{opacity:.6}.labui\:\[\&\:\:-webkit-datetime-edit\]\:leading-none::-webkit-datetime-edit{--tw-leading:1;line-height:1}.labui\:\[\&\:\:-webkit-search-cancel-button\]\:appearance-none::-webkit-search-cancel-button{appearance:none}.labui\:\[\&\:\:-webkit-search-decoration\]\:appearance-none::-webkit-search-decoration{appearance:none}.labui\:\[\&\:\:-webkit-search-results-button\]\:appearance-none::-webkit-search-results-button{appearance:none}.labui\:\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.labui\:\[\&\>svg\]\:size-3>svg{width:calc(var(--labui-spacing) * 3);height:calc(var(--labui-spacing) * 3)}.labui\:\[\&\>svg\]\:size-4>svg{width:calc(var(--labui-spacing) * 4);height:calc(var(--labui-spacing) * 4)}.labui\:\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--labui-spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.labui\:\[\&\>svg\]\:text-current>svg{color:currentColor}.labui\:\[\&\>svg\]\:text-warning>svg{color:var(--labui-warning)}@media (pointer:coarse){.labui\:\[\@media\(pointer\:coarse\)\]\:min-h-11{min-height:calc(var(--labui-spacing) * 11)}.labui\:\[\@media\(pointer\:coarse\)\]\:\[--labui-control-height\:2\.75rem\]{--labui-control-height:2.75rem}}@media (hover:hover){a.labui\:\[a\&\]\:hover\:bg-destructive\/25:hover{background-color:var(--labui-destructive)}@supports (color:color-mix(in lab, red, red)){a.labui\:\[a\&\]\:hover\:bg-destructive\/25:hover{background-color:color-mix(in oklab, var(--labui-destructive) 25%, transparent)}}a.labui\:\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--labui-primary)}@supports (color:color-mix(in lab, red, red)){a.labui\:\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--labui-primary) 90%, transparent)}}a.labui\:\[a\&\]\:hover\:bg-success\/25:hover{background-color:var(--labui-success)}@supports (color:color-mix(in lab, red, red)){a.labui\:\[a\&\]\:hover\:bg-success\/25:hover{background-color:color-mix(in oklab, var(--labui-success) 25%, transparent)}}a.labui\:\[a\&\]\:hover\:bg-warning\/25:hover{background-color:var(--labui-warning)}@supports (color:color-mix(in lab, red, red)){a.labui\:\[a\&\]\:hover\:bg-warning\/25:hover{background-color:color-mix(in oklab, var(--labui-warning) 25%, transparent)}}}:where(:root){--labui-font-sans:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Text", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--labui-font-mono:ui-monospace, "SFMono-Regular", "SF Mono", "Cascadia Mono", Menlo, Consolas, "Liberation Mono", monospace;--labui-font-display:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--labui-radius:.75rem;--labui-radius-dialog:1.25rem;--labui-control-height:2.5rem;--labui-control-height-sm:2.25rem;--labui-control-px:.75rem;--labui-row-py:.625rem;--labui-background:#eee;--labui-foreground:#242424;--labui-card:#fff;--labui-card-foreground:#242424;--labui-popover:#fcfcfc;--labui-popover-foreground:#242424;--labui-primary:#05697a;--labui-primary-foreground:#fff;--labui-link:#05697a;--labui-secondary:#e6e6e6;--labui-secondary-foreground:#626262;--labui-muted:#eee;--labui-muted-foreground:#626262;--labui-accent:#e6e6e6;--labui-accent-foreground:#242424;--labui-destructive:#b12637;--labui-destructive-foreground:#fff;--labui-destructive-muted:#fff0f1;--labui-success:#116d3b;--labui-success-foreground:#fff;--labui-warning:oklch(47.3% .137 46.201);--labui-warning-foreground:#fff;--labui-border:#d6d6d6;--labui-input:#858585;--labui-input-background:#eee;--labui-ring:#1d9db4;--labui-overlay:#2424242e}:where(.dark){--labui-background:#1c1c1c;--labui-foreground:#e8e8e8;--labui-card:#242424;--labui-card-foreground:#e8e8e8;--labui-popover:#2d2d2d;--labui-popover-foreground:#f3f3f3;--labui-primary:#68bccf;--labui-primary-foreground:#1c1c1c;--labui-link:#68bccf;--labui-secondary:#363636;--labui-secondary-foreground:#e8e8e8;--labui-muted:#2d2d2d;--labui-muted-foreground:#a3a3a3;--labui-accent:#363636;--labui-accent-foreground:#f3f3f3;--labui-destructive:#f0808c;--labui-destructive-foreground:#fff;--labui-destructive-muted:#3c2f30;--labui-success:#3ddc84;--labui-success-foreground:#06271a;--labui-warning:oklch(87.9% .169 91.605);--labui-warning-foreground:oklch(27.9% .077 45.635);--labui-border:#363636;--labui-input:#858585;--labui-input-background:#242424;--labui-ring:#68bccf;--labui-overlay:#00000080}@media (forced-colors:active){:root,.dark{--labui-background:Canvas!important;--labui-card:Canvas!important;--labui-border:CanvasText!important;--labui-foreground:CanvasText!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes labui-spin{to{transform:rotate(360deg)}}@keyframes labui-pulse{50%{opacity:.5}}@keyframes labui-pop{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,369 @@
1
+ import {
2
+ Button,
3
+ cn
4
+ } from "./chunk-3ZY2AVB4.js";
5
+
6
+ // terminal.tsx
7
+ import {
8
+ forwardRef,
9
+ useEffect,
10
+ useImperativeHandle,
11
+ useLayoutEffect,
12
+ useRef,
13
+ useState
14
+ } from "react";
15
+ import { WTerm } from "@wterm/dom";
16
+ import {
17
+ Maximize2Icon,
18
+ Minimize2Icon,
19
+ RotateCwIcon,
20
+ XIcon
21
+ } from "lucide-react";
22
+ import { jsx, jsxs } from "react/jsx-runtime";
23
+ var terminalThemes = {
24
+ dark: {
25
+ foreground: 15066597,
26
+ background: 2500134,
27
+ cursor: 15066597,
28
+ palette: [
29
+ 1973790,
30
+ 16009031,
31
+ 6986069,
32
+ 14137981,
33
+ 5676246,
34
+ 12945088,
35
+ 5163440,
36
+ 13948116,
37
+ 8421504,
38
+ 16739179,
39
+ 9355388,
40
+ 16767078,
41
+ 8563455,
42
+ 14131671,
43
+ 8379338,
44
+ 16777215
45
+ ]
46
+ },
47
+ light: {
48
+ foreground: 2500134,
49
+ background: 16777215,
50
+ cursor: 2500134,
51
+ palette: [
52
+ 2500134,
53
+ 11805464,
54
+ 2325046,
55
+ 8871936,
56
+ 2382528,
57
+ 9125792,
58
+ 28282,
59
+ 13948116,
60
+ 6381921,
61
+ 12858150,
62
+ 2653500,
63
+ 9069824,
64
+ 2450375,
65
+ 9781930,
66
+ 31882,
67
+ 16777215
68
+ ]
69
+ },
70
+ solarized: {
71
+ foreground: 8623254,
72
+ background: 11062,
73
+ cursor: 9675169,
74
+ palette: [
75
+ 472642,
76
+ 14430767,
77
+ 8755456,
78
+ 11897088,
79
+ 2526162,
80
+ 13842050,
81
+ 2793880,
82
+ 15657173,
83
+ 5795445,
84
+ 13323030,
85
+ 5795445,
86
+ 6650755,
87
+ 8623254,
88
+ 7107012,
89
+ 9675169,
90
+ 16643811
91
+ ]
92
+ },
93
+ monokai: {
94
+ foreground: 16316658,
95
+ background: 2566178,
96
+ cursor: 16316656,
97
+ palette: [
98
+ 2566178,
99
+ 16328306,
100
+ 10936878,
101
+ 16039797,
102
+ 6740463,
103
+ 11436543,
104
+ 10612708,
105
+ 16316658,
106
+ 7696734,
107
+ 16328306,
108
+ 10936878,
109
+ 16039797,
110
+ 6740463,
111
+ 11436543,
112
+ 10612708,
113
+ 16382197
114
+ ]
115
+ }
116
+ };
117
+ var Terminal = forwardRef(
118
+ function Terminal2({ connect, shell, core, theme = "auto", expandable, className }, ref) {
119
+ const reconnect = useRef(() => {
120
+ });
121
+ const terminal = useRef(void 0);
122
+ const [status, setStatus] = useState("Connecting\u2026");
123
+ const [error, setError] = useState("");
124
+ const [full, setFull] = useState(false);
125
+ const frame = useRef(null);
126
+ const host = useRef(null);
127
+ const chosen = useRef(theme);
128
+ chosen.current = theme;
129
+ const applyTheme = useRef(() => {
130
+ });
131
+ useImperativeHandle(ref, () => ({
132
+ reconnect: () => reconnect.current(),
133
+ focus: () => terminal.current?.focus()
134
+ }));
135
+ useEffect(() => applyTheme.current(), [theme]);
136
+ useLayoutEffect(() => {
137
+ const element = frame.current;
138
+ if (!full || !element || !("showPopover" in element)) return;
139
+ element.setAttribute("popover", "manual");
140
+ element.showPopover();
141
+ return () => {
142
+ if (element.matches(":popover-open")) element.hidePopover();
143
+ element.removeAttribute("popover");
144
+ };
145
+ }, [full]);
146
+ useEffect(() => {
147
+ let disposed = false, term, loaded, ws, input = () => {
148
+ }, initialized, retryTimer, generation = 0, sessions = 0;
149
+ const observers = [];
150
+ const disconnect = () => {
151
+ clearTimeout(retryTimer);
152
+ input = () => {
153
+ };
154
+ if (ws) {
155
+ ws.onopen = ws.onmessage = ws.onclose = ws.onerror = null;
156
+ ws.close();
157
+ ws = void 0;
158
+ }
159
+ };
160
+ const send = (bytes) => {
161
+ if (ws?.readyState !== WebSocket.OPEN) return;
162
+ if (ws.bufferedAmount + bytes.length > 1024 * 1024) {
163
+ setError("Terminal input buffer is full; input was not sent");
164
+ return;
165
+ }
166
+ for (let i = 0; i < bytes.length; i += 16384)
167
+ ws.send(bytes.slice(i, i + 16384));
168
+ };
169
+ const resize = (cols, rows) => {
170
+ if (ws?.readyState === WebSocket.OPEN)
171
+ ws.send(JSON.stringify({ cols, rows }));
172
+ };
173
+ const updateTheme = () => {
174
+ if (!host.current || !term) return;
175
+ const name = chosen.current;
176
+ term.setThemeColors(
177
+ typeof name === "object" ? name : name !== "auto" ? terminalThemes[name] : getComputedStyle(host.current).colorScheme === "dark" ? terminalThemes.dark : terminalThemes.light
178
+ );
179
+ };
180
+ const open = async (canRetry = true) => {
181
+ const attempt = ++generation;
182
+ const stale = () => disposed || attempt !== generation;
183
+ disconnect();
184
+ setError("");
185
+ setStatus(canRetry ? "Connecting\u2026" : "Reconnecting\u2026");
186
+ const failed = (message) => {
187
+ if (stale()) return;
188
+ if (canRetry) {
189
+ setStatus("Reconnecting\u2026");
190
+ retryTimer = setTimeout(() => void open(false), 1e3);
191
+ } else {
192
+ setStatus("Disconnected");
193
+ setError(message);
194
+ }
195
+ };
196
+ try {
197
+ if (shell) {
198
+ const session = await shell();
199
+ if (stale()) return;
200
+ await (initialized ??= term.init());
201
+ if (stale()) return;
202
+ if (sessions++) term.write("\x1Bc");
203
+ input = (text) => void session.handleInput(text);
204
+ await session.attach((data) => {
205
+ if (!stale()) term.write(data);
206
+ });
207
+ if (!stale()) setStatus("Connected");
208
+ return;
209
+ }
210
+ const target = await connect();
211
+ if (stale()) return;
212
+ await (initialized ??= term.init());
213
+ if (stale()) return;
214
+ const address = new URL(target, document.baseURI);
215
+ address.protocol = address.protocol.replace(/^http/, "ws");
216
+ ws = new WebSocket(address);
217
+ ws.binaryType = "arraybuffer";
218
+ input = (text) => send(new TextEncoder().encode(text));
219
+ let connectionError = "";
220
+ ws.onopen = () => {
221
+ setStatus("Connected");
222
+ resize(term.cols, term.rows);
223
+ };
224
+ ws.onmessage = (event) => {
225
+ if (typeof event.data === "string") connectionError = event.data;
226
+ else {
227
+ canRetry = true;
228
+ term.write(new Uint8Array(event.data));
229
+ }
230
+ };
231
+ ws.onerror = () => {
232
+ connectionError = "Could not connect to the terminal";
233
+ };
234
+ ws.onclose = (event) => {
235
+ if (event.code === 1e3 && !connectionError)
236
+ setStatus("Disconnected");
237
+ else failed(connectionError || event.reason || "Connection lost");
238
+ };
239
+ } catch (err) {
240
+ failed(err instanceof Error ? err.message : String(err));
241
+ }
242
+ };
243
+ void (async () => {
244
+ try {
245
+ loaded = await core?.();
246
+ } catch (err) {
247
+ console.warn("Using the built-in terminal core:", err);
248
+ }
249
+ if (disposed) return loaded?.dispose?.();
250
+ term = new WTerm(host.current, {
251
+ core: loaded,
252
+ onData: (text) => input(text),
253
+ onBinary: send,
254
+ onResize: resize,
255
+ announceOutput: true
256
+ });
257
+ terminal.current = term;
258
+ const themeObserver = new MutationObserver(updateTheme);
259
+ for (let parent = host.current.parentElement; parent; parent = parent.parentElement)
260
+ themeObserver.observe(parent, {
261
+ attributes: true,
262
+ attributeFilter: ["class", "style"]
263
+ });
264
+ const preferred = matchMedia("(prefers-color-scheme: dark)");
265
+ preferred.addEventListener("change", updateTheme);
266
+ const visible = new ResizeObserver(
267
+ () => term.setRenderingPaused(!host.current?.clientHeight)
268
+ );
269
+ visible.observe(host.current);
270
+ observers.push(themeObserver, visible, {
271
+ disconnect: () => preferred.removeEventListener("change", updateTheme)
272
+ });
273
+ applyTheme.current = updateTheme;
274
+ updateTheme();
275
+ reconnect.current = () => {
276
+ void open();
277
+ term.focus();
278
+ };
279
+ void open();
280
+ })();
281
+ return () => {
282
+ disposed = true;
283
+ reconnect.current = applyTheme.current = () => {
284
+ };
285
+ terminal.current = void 0;
286
+ disconnect();
287
+ for (const observer of observers) observer.disconnect();
288
+ term?.destroy();
289
+ loaded?.dispose?.();
290
+ };
291
+ }, [connect, shell, core]);
292
+ return /* @__PURE__ */ jsxs(
293
+ "div",
294
+ {
295
+ ref: frame,
296
+ "data-slot": "terminal",
297
+ className: cn(
298
+ "labui:flex labui:h-full labui:min-h-0 labui:flex-col",
299
+ full && "labui:fixed labui:inset-0 labui:z-50 labui:m-0 labui:size-full labui:max-h-none labui:max-w-none labui:border-0 labui:bg-background labui:p-0 labui:text-foreground",
300
+ className
301
+ ),
302
+ children: [
303
+ /* @__PURE__ */ jsx("span", { role: "status", className: "labui:sr-only", children: status }),
304
+ (status === "Disconnected" || error) && /* @__PURE__ */ jsxs(
305
+ "div",
306
+ {
307
+ role: "alert",
308
+ className: "labui:flex labui:shrink-0 labui:items-center labui:gap-2 labui:border-b labui:bg-muted labui:px-3 labui:py-1 labui:text-xs",
309
+ children: [
310
+ /* @__PURE__ */ jsx("span", { className: "labui:min-w-0 labui:flex-1", children: error || "Terminal disconnected" }),
311
+ /* @__PURE__ */ jsx(
312
+ Button,
313
+ {
314
+ variant: "ghost",
315
+ size: "icon-xs",
316
+ "aria-label": status === "Connected" ? "Dismiss terminal message" : "Reconnect terminal",
317
+ title: status === "Connected" ? "Dismiss" : "Reconnect terminal",
318
+ onClick: () => status === "Connected" ? setError("") : reconnect.current(),
319
+ children: status === "Connected" ? /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(RotateCwIcon, { "aria-hidden": "true" })
320
+ }
321
+ )
322
+ ]
323
+ },
324
+ "banner"
325
+ ),
326
+ /* @__PURE__ */ jsxs(
327
+ "div",
328
+ {
329
+ className: "labui:group labui:relative labui:min-h-0 labui:flex-1",
330
+ children: [
331
+ /* @__PURE__ */ jsx(
332
+ "div",
333
+ {
334
+ ref: host,
335
+ "aria-label": "Terminal input",
336
+ className: "labui:h-full",
337
+ style: { borderRadius: 0, boxShadow: "none" }
338
+ }
339
+ ),
340
+ expandable && /* @__PURE__ */ jsx(
341
+ Button,
342
+ {
343
+ variant: "secondary",
344
+ size: "icon-xs",
345
+ "aria-label": "Full screen",
346
+ "aria-pressed": full,
347
+ title: full ? "Exit full screen" : "Full screen",
348
+ className: "labui:absolute labui:top-2 labui:right-2 labui:opacity-0 labui:transition-opacity labui:group-hover:opacity-100 labui:focus-visible:opacity-100",
349
+ onClick: () => {
350
+ setFull(!full);
351
+ requestAnimationFrame(() => terminal.current?.focus());
352
+ },
353
+ children: full ? /* @__PURE__ */ jsx(Minimize2Icon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Maximize2Icon, { "aria-hidden": "true" })
354
+ }
355
+ )
356
+ ]
357
+ },
358
+ "terminal"
359
+ )
360
+ ]
361
+ }
362
+ );
363
+ }
364
+ );
365
+ export {
366
+ Terminal,
367
+ terminalThemes
368
+ };
369
+ //# sourceMappingURL=terminal.js.map