@mirror-physics/fractal-ui 0.2.0-next.8 → 0.2.0-next.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/chunk-UNMOINWV.js +339 -0
- package/dist/chunk-UNMOINWV.js.map +1 -0
- package/dist/column-editor.cjs +377 -0
- package/dist/column-editor.cjs.map +1 -0
- package/dist/column-editor.css +36 -0
- package/dist/column-editor.css.map +1 -0
- package/dist/column-editor.d.cts +20 -0
- package/dist/column-editor.d.ts +20 -0
- package/dist/column-editor.js +7 -0
- package/dist/column-editor.js.map +1 -0
- package/dist/index.cjs +2685 -385
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +2517 -190
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +461 -22
- package/dist/index.d.ts +461 -22
- package/dist/index.js +2445 -512
- package/dist/index.js.map +1 -1
- package/dist/lattice-FAYE5KWW.svg +3 -0
- package/dist/tokens.css +114 -9
- package/package.json +16 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Button/Button.tsx","../src/utils/cn.ts","../src/components/Card/Card.tsx","../src/components/PromptCard/PromptCard.tsx","../src/components/Input/Input.tsx","../src/components/Label/Label.tsx","../src/components/Alert/Alert.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Modal/Modal.tsx","../src/hooks/useEscapeDismiss.ts","../src/components/DataTable/DataTable.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Link/Link.tsx","../src/components/Chip/Chip.tsx","../src/components/SortableTable/SortableTable.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Disclosure/Disclosure.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/SidePanel/SidePanel.tsx","../src/components/Textarea/Textarea.tsx"],"sourcesContent":["// Components\nexport { Button } from './components/Button'\nexport type { ButtonProps, ButtonType, ButtonSize, ButtonColor } from './components/Button'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, FeatureCard, FolderCard } from './components/Card'\nexport type { FeatureCardProps, FolderCardProps } from './components/Card'\n\nexport { PromptCard, PromptGrid } from './components/PromptCard'\nexport type { PromptCardProps, PromptCardTone, PromptGridProps } from './components/PromptCard'\n\nexport { Input } from './components/Input'\nexport type { InputProps } from './components/Input'\n\nexport { Label } from './components/Label'\nexport type { LabelProps } from './components/Label'\n\nexport { Alert, AlertTitle, AlertDescription } from './components/Alert'\n\nexport { Toggle } from './components/Toggle'\nexport type { ToggleProps } from './components/Toggle'\n\nexport { Modal } from './components/Modal'\nexport type { ModalProps } from './components/Modal'\n\nexport { DataTable } from './components/DataTable'\nexport type { DataTableProps, DataTableColumn } from './components/DataTable'\n\nexport { Dropdown } from './components/Dropdown'\nexport type { DropdownProps, DropdownItem } from './components/Dropdown'\n\nexport { Link } from './components/Link'\nexport type { LinkProps, LinkTheme, LinkSize } from './components/Link'\n\nexport { Chip } from './components/Chip'\nexport type { ChipProps, ChipTone } from './components/Chip'\n\nexport { SortableTable } from './components/SortableTable'\nexport type { SortableTableProps, SortableTableColumn, SortDirection } from './components/SortableTable'\n\nexport { Tabs } from './components/Tabs'\nexport type { TabsProps, TabItem } from './components/Tabs'\n\nexport { Disclosure } from './components/Disclosure'\nexport type { DisclosureProps } from './components/Disclosure'\n\nexport { Sidebar, SidebarHeader, SidebarBrand, SidebarNav, SidebarSection, SidebarNavItem, SidebarFooter } from './components/Sidebar'\nexport type { SidebarProps, SidebarNavItemProps } from './components/Sidebar'\n\nexport { SidePanel } from './components/SidePanel'\nexport type { SidePanelProps } from './components/SidePanel'\n\nexport { Textarea } from './components/Textarea'\nexport type { TextareaProps } from './components/Textarea'\n\n\n// Hooks\nexport { useEscapeDismiss } from './hooks'\n\n// Utilities\nexport { cn } from './utils'\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Button.css'\n\nexport type ButtonType = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type ButtonColor = 'blue' | 'pink' | 'orange' | 'green'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual hierarchy. Primary = strongest action, Secondary = neutral bordered, Ghost = minimal, Danger = destructive. */\n buttonType?: ButtonType\n /** Size preset matching the component height scale. */\n buttonSize?: ButtonSize\n /** Color theme — maps to the design system's color scales. */\n color?: ButtonColor\n /** Icon element. */\n icon?: React.ReactNode\n /** Whether the button displays only an icon (no text). Must include aria-label. */\n hasIconOnly?: boolean\n /** Position of the icon relative to the label. */\n iconPosition?: 'left' | 'right'\n}\n\n/*\n * Color palette mapping per the color guide's semantic stop roles:\n * 0 = bg (non-interactive reading surfaces)\n * 50 = surface (tertiary button fill — interactive)\n * 100 = surface-hover (tertiary button hover — darken)\n * 200 = surface-stroke (tertiary pressed, borders)\n * 500 = md-stroke (strong chromatic hover — lighten from 600)\n * 600 = strong (strong chromatic fill — rest)\n * 700 = strong-pressed (strong chromatic pressed — darken)\n */\nconst colorPalette = {\n blue: {\n 0: 'var(--blue-0)',\n 50: 'var(--blue-50)',\n 100: 'var(--blue-100)',\n 200: 'var(--blue-200)',\n 500: 'var(--blue-500)',\n 600: 'var(--blue-600)',\n 700: 'var(--blue-700)',\n },\n pink: {\n 0: 'var(--pink-0)',\n 50: 'var(--pink-50)',\n 100: 'var(--pink-100)',\n 200: 'var(--pink-200)',\n 500: 'var(--pink-500)',\n 600: 'var(--pink-600)',\n 700: 'var(--pink-700)',\n },\n orange: {\n 0: 'var(--orange-0)',\n 50: 'var(--orange-50)',\n 100: 'var(--orange-100)',\n 200: 'var(--orange-200)',\n 500: 'var(--orange-500)',\n 600: 'var(--orange-600)',\n 700: 'var(--orange-700)',\n },\n green: {\n 0: 'var(--green-0)',\n 50: 'var(--green-50)',\n 100: 'var(--green-100)',\n 200: 'var(--green-200)',\n 500: 'var(--green-500)',\n 600: 'var(--green-600)',\n 700: 'var(--green-700)',\n },\n}\n\n/*\n * Component height scale from component-guide.md.\n * Heights + padding. Horizontal padding = 2× vertical padding.\n */\nconst sizeConfig = {\n xs: { height: '28px', padding: '4px 8px', iconOnly: '28px', fontSize: '0.75rem' },\n sm: { height: '32px', padding: '6px 12px', iconOnly: '32px', fontSize: '0.75rem' },\n md: { height: '40px', padding: '8px 16px', iconOnly: '40px', fontSize: '0.875rem' },\n lg: { height: '44px', padding: '10px 20px', iconOnly: '44px', fontSize: '1rem' },\n xl: { height: '56px', padding: '14px 28px', iconOnly: '56px', fontSize: '1rem' },\n}\n\nfunction getButtonStyles(\n buttonType: ButtonType,\n isHovered: boolean,\n isActive: boolean,\n buttonSize: ButtonSize,\n disabled: boolean,\n color: ButtonColor,\n hasIconOnly: boolean | undefined,\n): React.CSSProperties {\n const palette = colorPalette[color]\n const size = sizeConfig[buttonSize]\n\n const base: React.CSSProperties = {\n height: size.height,\n padding: hasIconOnly ? '0' : size.padding,\n borderRadius: hasIconOnly ? 'var(--radius-lg, 8px)' : 'var(--radius-full, 9999px)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontSize: size.fontSize,\n transition: 'background-color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease',\n }\n\n if (hasIconOnly) {\n base.width = size.iconOnly\n base.justifyContent = 'center'\n }\n\n // Disabled: bordered buttons get transparent bg + disabled border + disabled text.\n // Others just get opacity: 0.5 (handled by CSS).\n // Per principles.md Interaction States > Disabled\n if (disabled) {\n if (buttonType === 'ghost') {\n return { ...base, backgroundColor: 'transparent', border: 'none', color: 'var(--fg-disabled)' }\n }\n return { ...base, backgroundColor: 'transparent', border: '1px solid var(--fg-disabled)', color: 'var(--fg-disabled)' }\n }\n\n switch (buttonType) {\n // Primary with text: dark pill. Icon-only: color palette (Synapse style).\n case 'primary':\n if (hasIconOnly) {\n return {\n ...base,\n backgroundColor: isActive ? palette[700] : isHovered ? palette[500] : palette[600],\n border: 'none',\n color: 'var(--fg-inverse)',\n }\n }\n return {\n ...base,\n backgroundColor: 'var(--fg-primary)',\n border: '1px solid var(--fg-primary)',\n color: 'var(--fg-inverse)',\n ...(isHovered || isActive ? { opacity: 0.85 } : {}),\n }\n\n // Secondary: neutral. Rest=canvas, hover=surface-1 (darken), pressed=surface-2. Subtle border, dark text.\n case 'secondary':\n return {\n ...base,\n backgroundColor: isActive ? 'var(--bg-surface-2)' : isHovered ? 'var(--bg-surface-1)' : 'var(--bg-canvas)',\n border: '1px solid var(--border-subtle)',\n color: 'var(--fg-primary)',\n }\n\n // Ghost: no border. Rest=transparent, hover/press=surface-1.\n case 'ghost':\n return {\n ...base,\n backgroundColor: isHovered || isActive ? 'var(--bg-surface-1)' : 'transparent',\n border: 'none',\n color: 'var(--fg-primary)',\n }\n\n // Danger: low-intensity destructive action. Text stays steady; hover deepens the light red surface.\n case 'danger':\n return {\n ...base,\n backgroundColor: isHovered || isActive ? 'var(--danger-button-surface-hover)' : 'var(--danger-button-surface)',\n border: 'none',\n color: 'var(--danger-button-fg)',\n }\n\n default:\n return base\n }\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, buttonType = 'primary', buttonSize = 'md', color = 'blue', icon, hasIconOnly, iconPosition = 'left', style, disabled, children, ...props }, ref) => {\n const [isHovered, setIsHovered] = React.useState(false)\n const [isActive, setIsActive] = React.useState(false)\n\n const typeStyles = getButtonStyles(buttonType, isHovered, isActive, buttonSize, !!disabled, color, hasIconOnly)\n const hasIconAndText = icon && children && !hasIconOnly\n const finalStyles = hasIconAndText\n ? { ...typeStyles, gap: 'var(--space-2, 8px)', ...style }\n : { ...typeStyles, ...style }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn('fractal-button', `fractal-button--${buttonType}`, className)}\n style={finalStyles}\n disabled={disabled}\n onMouseEnter={(e) => { setIsHovered(true); props.onMouseEnter?.(e) }}\n onMouseLeave={(e) => { setIsHovered(false); setIsActive(false); props.onMouseLeave?.(e) }}\n onMouseDown={(e) => { setIsActive(true); props.onMouseDown?.(e) }}\n onMouseUp={(e) => { setIsActive(false); props.onMouseUp?.(e) }}\n {...props}\n >\n {iconPosition !== 'right' && icon}\n {!hasIconOnly && children}\n {iconPosition === 'right' && icon}\n </button>\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n","import { clsx, type ClassValue } from 'clsx'\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs)\n}\n","import * as React from 'react'\nimport { Folder as FolderIcon } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Card.css'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card', className)} {...props} />\n )\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-header', className)} {...props} />\n )\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('fractal-card-title', className)} {...props} />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('fractal-card-description', className)} {...props} />\n )\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-content', className)} {...props} />\n )\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-footer', className)} {...props} />\n )\n)\nCardFooter.displayName = 'CardFooter'\n\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: React.ReactNode\n title: string\n description: string\n}\n\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ icon, title, description, className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-feature-card', className)} {...props}>\n {icon && <div className=\"fractal-feature-card__icon\">{icon}</div>}\n <h3 className=\"fractal-feature-card__title\">{title}</h3>\n <p className=\"fractal-feature-card__description\">{description}</p>\n </div>\n )\n)\nFeatureCard.displayName = 'FeatureCard'\n\nexport interface FolderCardProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string\n sessionCount?: number\n selected?: boolean\n}\n\nconst FolderCard = React.forwardRef<HTMLDivElement, FolderCardProps>(\n ({ name, sessionCount, selected, className, onClick, ...props }, ref) => (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>)\n }\n }}\n className={cn('fractal-folder-card', selected && 'fractal-folder-card--selected', className)}\n {...props}\n >\n <div className=\"fractal-folder-card__header\">\n <FolderIcon size={16} className=\"fractal-folder-card__icon\" aria-hidden />\n <span className=\"fractal-folder-card__name\">{name}</span>\n </div>\n {sessionCount !== undefined && (\n <div className=\"fractal-folder-card__footer\">\n <span className=\"fractal-folder-card__sessions\">{sessionCount} {sessionCount === 1 ? 'session' : 'sessions'}</span>\n </div>\n )}\n </div>\n )\n)\nFolderCard.displayName = 'FolderCard'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, FeatureCard, FolderCard }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './PromptCard.css'\n\nexport type PromptCardTone =\n | 'blue'\n | 'pink'\n | 'orange'\n | 'green'\n | 'purple'\n | 'red'\n | 'yellow'\n | 'neutral'\n\nexport interface PromptCardProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'title'> {\n title: React.ReactNode\n icon?: React.ReactNode\n prompt?: string\n tone?: PromptCardTone\n highlighted?: boolean\n onPromptSelect?: (prompt: string) => void\n}\n\nconst titleToPrompt = (title: React.ReactNode) =>\n typeof title === 'string' || typeof title === 'number' ? String(title) : ''\n\nconst PromptCard = React.forwardRef<HTMLButtonElement, PromptCardProps>(\n (\n {\n title,\n icon,\n prompt,\n tone = 'blue',\n highlighted,\n disabled,\n className,\n onClick,\n onPromptSelect,\n ...props\n },\n ref,\n ) => {\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (!event.defaultPrevented) {\n onPromptSelect?.(prompt ?? titleToPrompt(title))\n }\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'fractal-prompt-card',\n `fractal-prompt-card--${tone}`,\n highlighted && 'fractal-prompt-card--highlighted',\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {icon && (\n <span className=\"fractal-prompt-card__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"fractal-prompt-card__title\">{title}</span>\n </button>\n )\n },\n)\nPromptCard.displayName = 'PromptCard'\n\nexport interface PromptGridProps extends React.HTMLAttributes<HTMLDivElement> {\n compact?: boolean\n padded?: boolean\n}\n\nconst PromptGrid = React.forwardRef<HTMLDivElement, PromptGridProps>(\n ({ compact, padded, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fractal-prompt-grid',\n compact && 'fractal-prompt-grid--compact',\n padded && 'fractal-prompt-grid--padded',\n className,\n )}\n {...props}\n />\n ),\n)\nPromptGrid.displayName = 'PromptGrid'\n\nexport { PromptCard, PromptGrid }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Input.css'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => (\n <input\n type={type}\n ref={ref}\n className={cn('fractal-input', className)}\n {...props}\n />\n )\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Label.css'\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn('fractal-label', className)}\n {...props}\n />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Alert.css'\n\nexport type AlertVariant = 'default' | 'info' | 'success' | 'warning' | 'error'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant\n icon?: React.ReactNode\n}\n\nconst defaultIcons: Record<AlertVariant, string> = {\n default: 'ℹ',\n info: 'ℹ',\n success: '✓',\n warning: '⚠',\n error: '✕',\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = 'default', icon, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn('fractal-alert', `fractal-alert--${variant}`, className)}\n {...props}\n >\n <span className=\"fractal-alert-icon\" aria-hidden>\n {icon ?? defaultIcons[variant]}\n </span>\n <div className=\"fractal-alert-content\">{children}</div>\n </div>\n )\n)\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h5 ref={ref} className={cn('fractal-alert-title', className)} {...props} />\n )\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-alert-description', className)} {...props} />\n )\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import { cn } from '../../utils/cn'\nimport './Toggle.css'\n\nexport interface ToggleProps {\n checked: boolean\n onChange: (checked: boolean) => void\n label?: string\n className?: string\n}\n\nexport function Toggle({ checked, onChange, label, className }: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={cn('fractal-toggle', className)}\n onClick={() => onChange(!checked)}\n >\n <span className={cn('fractal-toggle-track', checked && 'fractal-toggle-track--checked')}>\n <span className={cn('fractal-toggle-thumb', checked && 'fractal-toggle-thumb--checked')} />\n </span>\n {label && <span className=\"fractal-toggle-label\">{label}</span>}\n </button>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\nimport { cn } from '../../utils/cn'\nimport './Modal.css'\n\nexport interface ModalProps {\n open: boolean\n onClose: () => void\n title: React.ReactNode\n children: React.ReactNode\n /** When true, uses red accent for destructive actions. */\n danger?: boolean\n /** When true, uses yellow/warning accent. */\n warn?: boolean\n /** Optional footer content (e.g. action buttons). */\n footer?: React.ReactNode\n /** When true, prevents closing via overlay click or Escape. */\n noClose?: boolean\n /** Modal width: 'sm' (420px), 'md' (756px), 'lg' (near-fullscreen). */\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nexport function Modal({ open, onClose, title, children, danger, warn, footer, noClose, size = 'sm', className }: ModalProps) {\n useEscapeDismiss(80, onClose, open && !noClose)\n\n if (!open) return null\n\n const sizeClass = `fractal-modal-panel--${size}`\n const accentClass = danger ? 'fractal-modal-panel--danger' : warn ? 'fractal-modal-panel--warn' : ''\n\n return createPortal(\n <div className=\"fractal-modal-overlay\" onClick={noClose ? undefined : onClose}>\n <div\n className={cn('fractal-modal-panel', sizeClass, accentClass, className)}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"fractal-modal-title-row\">\n <h3 className={cn('fractal-modal-title', danger && 'fractal-modal-title--danger', warn && 'fractal-modal-title--warn')}>\n {title}\n </h3>\n {!noClose && (\n <button type=\"button\" onClick={onClose} title=\"Close\" className=\"fractal-modal-close\">\n <CloseIcon />\n </button>\n )}\n </div>\n <div className={cn('fractal-modal-body', size === 'lg' && 'fractal-modal-body--lg')}>\n {children}\n </div>\n {footer && <div className=\"fractal-modal-footer\">{footer}</div>}\n </div>\n </div>,\n document.body,\n )\n}\n","import { useEffect, useRef } from 'react'\n\n/**\n * Centralized Escape-key dismiss system with priority ordering.\n *\n * Components register a handler via `useEscapeDismiss(priority, handler)`.\n * When the user presses Escape, only the highest-priority active handler fires.\n * If two handlers share the same priority, the most recently registered one wins.\n *\n * Priority guidelines (higher = dismissed first):\n * 120 Sidebar search filter\n * 100 Context menus, tooltips\n * 80 Modals / dialogs\n * 60 Search overlay, drawers\n * 40 Inline editors\n */\n\ninterface EscapeEntry {\n id: number\n priority: number\n handler: () => void\n}\n\nlet nextId = 0\nconst stack: EscapeEntry[] = []\n\nfunction insertSorted(entry: EscapeEntry): void {\n let i = 0\n while (i < stack.length && stack[i].priority >= entry.priority) {\n if (stack[i].priority === entry.priority) break\n i++\n }\n stack.splice(i, 0, entry)\n}\n\nfunction remove(id: number): void {\n const idx = stack.findIndex((e) => e.id === id)\n if (idx >= 0) stack.splice(idx, 1)\n}\n\nlet listenerInstalled = false\n\nfunction ensureGlobalListener(): void {\n if (listenerInstalled) return\n listenerInstalled = true\n\n window.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n if (stack.length === 0) return\n\n e.preventDefault()\n e.stopImmediatePropagation()\n\n const top = stack[0]\n top.handler()\n },\n { capture: true },\n )\n}\n\n/**\n * Register an Escape-key dismiss handler with the global priority stack.\n *\n * @param priority Higher values are dismissed first. See header for guidelines.\n * @param handler Called when this entry is the top-of-stack and Escape is pressed.\n * @param enabled When false the handler is not registered.\n */\nexport function useEscapeDismiss(\n priority: number,\n handler: () => void,\n enabled = true,\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (!enabled) return\n\n ensureGlobalListener()\n\n const id = nextId++\n const entry: EscapeEntry = {\n id,\n priority,\n handler: () => handlerRef.current(),\n }\n insertSorted(entry)\n\n return () => remove(id)\n }, [priority, enabled])\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '../../utils/cn'\nimport './DataTable.css'\n\nexport interface DataTableColumn<T> {\n key: string\n header: string\n width?: string\n render: (row: T, index: number) => ReactNode\n}\n\nexport interface DataTableProps<T> {\n columns: DataTableColumn<T>[]\n data: T[]\n emptyMessage?: string\n header?: ReactNode\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport function DataTable<T>({ columns, data, emptyMessage, header, size = 'md', className }: DataTableProps<T>) {\n return (\n <div className={cn('fractal-datatable', `fractal-datatable--${size}`, className)}>\n <div className=\"fractal-datatable-surface\">\n {header && (\n <div className=\"fractal-datatable-header\">\n {header}\n </div>\n )}\n\n {data.length === 0 ? (\n <div className=\"fractal-datatable-empty\">\n {emptyMessage || 'No data'}\n </div>\n ) : (\n <table className=\"fractal-datatable-table\">\n <thead>\n <tr className=\"fractal-datatable-thead-row\">\n {columns.map((col) => (\n <th key={col.key} className=\"fractal-datatable-th\" style={{ width: col.width }}>\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n className=\"fractal-datatable-row\"\n >\n {columns.map((col) => (\n <td key={col.key} className=\"fractal-datatable-td\" style={{ width: col.width }}>\n {col.render(row, rowIndex)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown, ChevronUp } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Dropdown.css'\n\nexport interface DropdownItem {\n value: string\n icon?: React.ReactNode\n description?: string | React.ReactNode\n border?: 'top' | 'bottom'\n kind?: 'item' | 'header'\n trailing?: React.ReactNode\n}\n\nexport interface DropdownProps {\n items: DropdownItem[]\n selectedValue: string\n onSelect: (value: string) => void\n triggerLabel?: string\n direction?: 'up' | 'down'\n align?: 'left' | 'right'\n triggerContent?: React.ReactNode\n label?: React.ReactNode\n noChevron?: boolean\n size?: 'sm' | 'md'\n triggerVariant?: 'outline' | 'tertiary'\n className?: string\n triggerClassName?: string\n panelClassName?: string\n closeOnSelect?: boolean\n}\n\nconst MARGIN = 4\n\nexport function Dropdown({\n items,\n selectedValue,\n onSelect,\n triggerLabel = 'Options',\n direction = 'down',\n align = 'left',\n triggerContent,\n label,\n noChevron = false,\n size = 'md',\n triggerVariant = 'outline',\n className,\n triggerClassName,\n panelClassName,\n closeOnSelect = true,\n}: DropdownProps) {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [panelStyle, setPanelStyle] = React.useState<React.CSSProperties>({})\n\n const visibleItems = items.filter(\n (item) =>\n item.icon != null ||\n (item.description != null &&\n (typeof item.description === 'string' ? item.description !== '' : true))\n )\n if (visibleItems.length === 0) return null\n\n const selectableItems = visibleItems.filter((i) => i.kind !== 'header')\n const selected = items.find((i) => i.value === selectedValue && i.kind !== 'header') ?? selectableItems[0] ?? visibleItems[0]\n const isUp = direction === 'up'\n const ChevronIcon = isUp ? ChevronUp : ChevronDown\n\n React.useLayoutEffect(() => {\n if (!open || !triggerRef.current || !panelRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const panelRect = panelRef.current.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const spaceBelow = vh - triggerRect.bottom - MARGIN\n const spaceAbove = triggerRect.top - MARGIN\n let placeAbove = isUp\n\n if (placeAbove && panelRect.height > spaceAbove && spaceBelow > spaceAbove) {\n placeAbove = false\n } else if (!placeAbove && panelRect.height > spaceBelow && spaceAbove > spaceBelow) {\n placeAbove = true\n }\n\n const top = placeAbove\n ? -(panelRect.height + MARGIN)\n : triggerRect.height + MARGIN\n\n let left: number | undefined\n let right: number | undefined\n\n if (align === 'right') {\n right = 0\n const panelLeft = triggerRect.right - panelRect.width\n if (panelLeft < 0) {\n right = undefined\n left = 0\n }\n } else {\n left = 0\n const panelRight = triggerRect.left + panelRect.width\n if (panelRight > vw) {\n left = undefined\n right = 0\n }\n }\n\n setPanelStyle({ top, left, right })\n }, [open, isUp, align])\n\n React.useEffect(() => {\n if (!open) return\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [open])\n\n return (\n <div className={cn('fractal-dropdown', className)}>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-label={triggerLabel}\n onClick={() => setOpen((o) => !o)}\n className={cn(\n 'fractal-dropdown-trigger',\n `fractal-dropdown-trigger--${size}`,\n `fractal-dropdown-trigger--${triggerVariant}`,\n triggerClassName,\n )}\n >\n {triggerContent != null ? (\n triggerContent\n ) : (\n <>\n {selected.icon != null && (\n <span className=\"fractal-dropdown-icon fractal-dropdown-icon--trigger\">{selected.icon}</span>\n )}\n {selected.description != null &&\n (typeof selected.description !== 'string' || selected.description !== '') && (\n <span className=\"fractal-dropdown-selected-text\">{selected.description}</span>\n )}\n </>\n )}\n {!noChevron && (\n <span className=\"fractal-dropdown-chevron\" aria-hidden>\n <ChevronIcon size={size === 'sm' ? 14 : 16} />\n </span>\n )}\n </button>\n\n {open && (\n <div\n ref={panelRef}\n role=\"listbox\"\n aria-label={triggerLabel}\n className={cn('fractal-dropdown-panel', `fractal-dropdown-panel--${size}`, panelClassName)}\n style={panelStyle}\n >\n {label != null && (\n <div className=\"fractal-dropdown-label\">{label}</div>\n )}\n {visibleItems.map((item, index) => {\n const topDivider = item.border === 'top' ? <div className=\"fractal-dropdown-separator\" /> : null\n const bottomDivider = item.border === 'bottom' ? <div className=\"fractal-dropdown-separator\" /> : null\n if (item.kind === 'header') {\n return (\n <React.Fragment key={`header-${index}`}>\n {topDivider}\n <div role=\"presentation\" className=\"fractal-dropdown-label\">\n {item.description}\n </div>\n {bottomDivider}\n </React.Fragment>\n )\n }\n const isSelected = item.value === selectedValue\n return (\n <React.Fragment key={item.value}>\n {topDivider}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n onSelect(item.value)\n if (closeOnSelect) setOpen(false)\n }}\n className=\"fractal-dropdown-option\"\n >\n {item.icon != null && (\n <span className=\"fractal-dropdown-icon\">{item.icon}</span>\n )}\n {item.description != null &&\n (typeof item.description !== 'string' || item.description !== '') && (\n <span className=\"fractal-dropdown-option-text\">\n {item.description}\n </span>\n )}\n {item.trailing != null && (\n <span className=\"fractal-dropdown-trailing\">{item.trailing}</span>\n )}\n </button>\n {bottomDivider}\n </React.Fragment>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Link.css'\n\nexport type LinkTheme = 'default' | 'muted' | 'accent'\nexport type LinkSize = 'sm' | 'md' | 'lg'\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n theme?: LinkTheme\n size?: LinkSize\n}\n\nconst Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n ({ className, theme = 'default', size = 'md', ...props }, ref) => (\n <a\n ref={ref}\n className={cn('fractal-link', `fractal-link--${theme}`, `fractal-link--${size}`, className)}\n {...props}\n />\n )\n)\nLink.displayName = 'Link'\n\nexport { Link }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Chip.css'\n\nexport type ChipTone = 'neutral' | 'success' | 'warning' | 'error' | 'info'\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: ChipTone\n}\n\nconst Chip = React.forwardRef<HTMLSpanElement, ChipProps>(\n ({ className, tone = 'neutral', ...props }, ref) => (\n <span\n ref={ref}\n className={cn('fractal-chip', `fractal-chip--${tone}`, className)}\n {...props}\n />\n )\n)\nChip.displayName = 'Chip'\n\nexport { Chip }\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { ArrowUp, ArrowDown, ArrowsUpDown } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './SortableTable.css'\n\nexport type SortDirection = 'asc' | 'desc' | null\n\nexport interface SortableTableColumn<T> {\n key: string\n header: string\n width?: string\n sortable?: boolean\n sortAccessor?: (row: T) => string | number | null | undefined\n render: (row: T, index: number) => ReactNode\n align?: 'left' | 'right'\n}\n\nexport interface SortableTableProps<T> {\n columns: SortableTableColumn<T>[]\n data: T[]\n emptyMessage?: string\n header?: ReactNode\n size?: 'sm' | 'md' | 'lg'\n className?: string\n defaultSortKey?: string\n defaultSortDirection?: SortDirection\n sortKey?: string | null\n sortDirection?: SortDirection\n onSortChange?: (key: string | null, direction: SortDirection) => void\n highlightRow?: (row: T, index: number) => boolean\n /** Invoked when a row is selected. Enables pointer and keyboard row activation. */\n onRowClick?: (row: T, index: number) => void\n}\n\nexport function SortableTable<T>({\n columns,\n data,\n emptyMessage,\n header,\n size = 'md',\n className,\n defaultSortKey = undefined,\n defaultSortDirection = null,\n sortKey: controlledKey,\n sortDirection: controlledDirection,\n onSortChange,\n highlightRow,\n onRowClick,\n}: SortableTableProps<T>) {\n const [internalKey, setInternalKey] = useState<string | null>(defaultSortKey ?? null)\n const [internalDirection, setInternalDirection] = useState<SortDirection>(defaultSortDirection)\n\n const isControlled = controlledKey !== undefined && controlledDirection !== undefined\n const activeKey = isControlled ? controlledKey : internalKey\n const activeDirection = isControlled ? controlledDirection : internalDirection\n\n const sorted = useMemo(() => {\n if (!activeKey || !activeDirection) return data\n const col = columns.find((c) => c.key === activeKey)\n if (!col) return data\n const accessor =\n col.sortAccessor ??\n ((row: T) => {\n const value = (row as Record<string, unknown>)[activeKey]\n return typeof value === 'string' || typeof value === 'number' ? value : null\n })\n const copy = [...data]\n copy.sort((a, b) => {\n const av = accessor(a)\n const bv = accessor(b)\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n if (typeof av === 'number' && typeof bv === 'number') {\n return activeDirection === 'asc' ? av - bv : bv - av\n }\n const as = String(av).toLowerCase()\n const bs = String(bv).toLowerCase()\n if (as < bs) return activeDirection === 'asc' ? -1 : 1\n if (as > bs) return activeDirection === 'asc' ? 1 : -1\n return 0\n })\n return copy\n }, [data, columns, activeKey, activeDirection])\n\n const handleSortClick = (key: string) => {\n let nextDirection: SortDirection\n if (activeKey !== key) {\n nextDirection = 'asc'\n } else if (activeDirection === 'asc') {\n nextDirection = 'desc'\n } else if (activeDirection === 'desc') {\n nextDirection = null\n } else {\n nextDirection = 'asc'\n }\n const nextKey = nextDirection === null ? null : key\n\n if (isControlled) {\n onSortChange?.(nextKey, nextDirection)\n } else {\n setInternalKey(nextKey)\n setInternalDirection(nextDirection)\n onSortChange?.(nextKey, nextDirection)\n }\n }\n\n return (\n <div className={cn('fractal-sortable-table', `fractal-sortable-table--${size}`, className)}>\n <div className=\"fractal-sortable-table-surface\">\n {header && <div className=\"fractal-sortable-table-header\">{header}</div>}\n\n {sorted.length === 0 ? (\n <div className=\"fractal-sortable-table-empty\">{emptyMessage || 'No data'}</div>\n ) : (\n <table className=\"fractal-sortable-table-table\">\n <thead>\n <tr className=\"fractal-sortable-table-thead-row\">\n {columns.map((col) => {\n const isActive = activeKey === col.key && activeDirection !== null\n if (!col.sortable) {\n return (\n <th\n key={col.key}\n className=\"fractal-sortable-table-th\"\n style={{ width: col.width }}\n >\n {col.header}\n </th>\n )\n }\n return (\n <th\n key={col.key}\n className=\"fractal-sortable-table-th fractal-sortable-table-th--sortable\"\n style={{ width: col.width }}\n >\n <button\n type=\"button\"\n className={cn(\n 'fractal-sortable-table-sort-button',\n isActive && 'fractal-sortable-table-sort-button--active',\n )}\n onClick={() => handleSortClick(col.key)}\n aria-sort={\n isActive\n ? activeDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n }\n >\n <span>{col.header}</span>\n <span className=\"fractal-sortable-table-sort-icon\" aria-hidden=\"true\">\n {isActive && activeDirection === 'asc' ? (\n <ArrowUp size={14} />\n ) : isActive && activeDirection === 'desc' ? (\n <ArrowDown size={14} />\n ) : (\n <ArrowsUpDown size={14} />\n )}\n </span>\n </button>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {sorted.map((row, rowIndex) => {\n const highlighted = highlightRow?.(row, rowIndex) ?? false\n return (\n <tr\n key={rowIndex}\n className={cn(\n 'fractal-sortable-table-row',\n highlighted && 'fractal-sortable-table-row--highlighted',\n onRowClick && 'fractal-sortable-table-row--interactive',\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n onKeyDown={onRowClick ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onRowClick(row, rowIndex)\n }\n } : undefined}\n role={onRowClick ? 'button' : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"fractal-sortable-table-td\"\n style={{ width: col.width, textAlign: col.align ?? 'left' }}\n >\n {col.render(row, rowIndex)}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n )}\n </div>\n </div>\n )\n}\n","import { useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react'\nimport { cn } from '../../utils/cn'\nimport './Tabs.css'\n\nexport interface TabItem {\n id: string\n label: ReactNode\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface TabsProps {\n items: TabItem[]\n defaultValue?: string\n value?: string\n onValueChange?: (id: string) => void\n className?: string\n ariaLabel?: string\n}\n\nexport function Tabs({\n items,\n defaultValue,\n value: controlledValue,\n onValueChange,\n className,\n ariaLabel,\n}: TabsProps) {\n const reactId = useId()\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? items.find((i) => !i.disabled)?.id ?? items[0]?.id ?? '',\n )\n const isControlled = controlledValue !== undefined\n const activeId = isControlled ? controlledValue : internalValue\n\n const tabRefs = useRef<Record<string, HTMLButtonElement | null>>({})\n\n const selectTab = (id: string) => {\n if (isControlled) {\n onValueChange?.(id)\n } else {\n setInternalValue(id)\n onValueChange?.(id)\n }\n }\n\n const focusable = items.filter((i) => !i.disabled)\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n const currentIndex = focusable.findIndex((i) => i.id === activeId)\n if (currentIndex === -1) return\n let nextIndex = currentIndex\n switch (event.key) {\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % focusable.length\n break\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + focusable.length) % focusable.length\n break\n case 'Home':\n nextIndex = 0\n break\n case 'End':\n nextIndex = focusable.length - 1\n break\n default:\n return\n }\n event.preventDefault()\n const nextId = focusable[nextIndex].id\n selectTab(nextId)\n requestAnimationFrame(() => tabRefs.current[nextId]?.focus())\n }\n\n return (\n <div className={cn('fractal-tabs', className)}>\n <div role=\"tablist\" aria-label={ariaLabel} className=\"fractal-tabs-list\">\n {items.map((item) => {\n const isActive = item.id === activeId\n const tabId = `${reactId}-tab-${item.id}`\n const panelId = `${reactId}-panel-${item.id}`\n return (\n <button\n key={item.id}\n ref={(el) => {\n tabRefs.current[item.id] = el\n }}\n id={tabId}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn(\n 'fractal-tabs-trigger',\n isActive && 'fractal-tabs-trigger--active',\n item.disabled && 'fractal-tabs-trigger--disabled',\n )}\n onClick={() => !item.disabled && selectTab(item.id)}\n onKeyDown={onKeyDown}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n {items.map((item) => {\n const tabId = `${reactId}-tab-${item.id}`\n const panelId = `${reactId}-panel-${item.id}`\n const isActive = item.id === activeId\n return (\n <div\n key={item.id}\n id={panelId}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n hidden={!isActive}\n className=\"fractal-tabs-panel\"\n >\n {isActive && item.content}\n </div>\n )\n })}\n </div>\n )\n}\n","import { useId, useState, type ReactNode } from 'react'\nimport { ChevronRight, ChevronDown } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Disclosure.css'\n\nexport interface DisclosureProps {\n title: ReactNode\n meta?: ReactNode\n children: ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n className?: string\n variant?: 'card' | 'plain'\n}\n\nexport function Disclosure({\n title,\n meta,\n children,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n className,\n variant = 'card',\n}: DisclosureProps) {\n const reactId = useId()\n const headerId = `${reactId}-header`\n const panelId = `${reactId}-panel`\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const toggle = () => {\n const next = !isOpen\n if (isControlled) {\n onOpenChange?.(next)\n } else {\n setInternalOpen(next)\n onOpenChange?.(next)\n }\n }\n\n return (\n <div\n className={cn(\n 'fractal-disclosure',\n variant === 'card' && 'fractal-disclosure--card',\n isOpen && 'fractal-disclosure--open',\n className,\n )}\n >\n <button\n type=\"button\"\n id={headerId}\n className=\"fractal-disclosure-trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={toggle}\n >\n <span className=\"fractal-disclosure-icon\" aria-hidden=\"true\">\n {isOpen ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n </span>\n <span className=\"fractal-disclosure-title\">{title}</span>\n {meta && <span className=\"fractal-disclosure-meta\">{meta}</span>}\n </button>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className=\"fractal-disclosure-panel\"\n hidden={!isOpen}\n >\n <div className=\"fractal-disclosure-panel-inner\">{children}</div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Sidebar.css'\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n /** Fixed sidebar width. Defaults to the standard application width. */\n width?: string\n}\n\nconst Sidebar = React.forwardRef<HTMLElement, SidebarProps>(\n ({ className, width, style, ...props }, ref) => (\n <aside\n ref={ref}\n className={cn('fractal-sidebar', className)}\n style={{ ...style, ...(width ? { '--fractal-sidebar-width': width } : {}) } as React.CSSProperties}\n {...props}\n />\n ),\n)\nSidebar.displayName = 'Sidebar'\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__header', className)} {...props} />\n ),\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\nconst SidebarBrand = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, type = 'button', ...props }, ref) => (\n <button ref={ref} type={type} className={cn('fractal-sidebar__brand', className)} {...props} />\n ),\n)\nSidebarBrand.displayName = 'SidebarBrand'\n\nconst SidebarNav = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(\n ({ className, ...props }, ref) => (\n <nav ref={ref} className={cn('fractal-sidebar__nav', className)} {...props} />\n ),\n)\nSidebarNav.displayName = 'SidebarNav'\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__section', className)} {...props} />\n ),\n)\nSidebarSection.displayName = 'SidebarSection'\n\nexport interface SidebarNavItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Marks the current destination. */\n active?: boolean\n /** Leading visual identifier. */\n icon?: React.ReactNode\n /** Optional right-aligned metadata or status. */\n endAdornment?: React.ReactNode\n}\n\nconst SidebarNavItem = React.forwardRef<HTMLButtonElement, SidebarNavItemProps>(\n ({ active = false, icon, endAdornment, className, type = 'button', children, ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn('fractal-sidebar__nav-item', className)}\n data-active={active || undefined}\n aria-current={active ? 'page' : undefined}\n {...props}\n >\n {icon && <span className=\"fractal-sidebar__nav-item-icon\" aria-hidden=\"true\">{icon}</span>}\n <span className=\"fractal-sidebar__nav-item-label\">{children}</span>\n {endAdornment && <span className=\"fractal-sidebar__nav-item-end\">{endAdornment}</span>}\n </button>\n ),\n)\nSidebarNavItem.displayName = 'SidebarNavItem'\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__footer', className)} {...props} />\n ),\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nexport {\n Sidebar,\n SidebarHeader,\n SidebarBrand,\n SidebarNav,\n SidebarSection,\n SidebarNavItem,\n SidebarFooter,\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Close } from '@mirror-physics/fractal-icons'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\nimport { cn } from '../../utils/cn'\nimport './SidePanel.css'\n\nexport interface SidePanelProps {\n open: boolean\n onClose: () => void\n title: React.ReactNode\n description?: React.ReactNode\n children: React.ReactNode\n footer?: React.ReactNode\n /** Panel width: sm (420px), md (540px), or lg (680px). */\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport function SidePanel({ open, onClose, title, description, children, footer, size = 'md', className }: SidePanelProps) {\n useEscapeDismiss(80, onClose, open)\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fractal-side-panel-overlay\" onMouseDown={onClose}>\n <aside\n className={cn('fractal-side-panel', `fractal-side-panel--${size}`, className)}\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : 'Side panel'}\n role=\"dialog\"\n onMouseDown={(event) => event.stopPropagation()}\n >\n <header className=\"fractal-side-panel__header\">\n <div className=\"fractal-side-panel__heading\">\n <h2 className=\"fractal-side-panel__title\">{title}</h2>\n {description && <p className=\"fractal-side-panel__description\">{description}</p>}\n </div>\n <button type=\"button\" className=\"fractal-side-panel__close\" aria-label=\"Close panel\" onClick={onClose}>\n <Close size={18} />\n </button>\n </header>\n <div className=\"fractal-side-panel__body\">{children}</div>\n {footer && <footer className=\"fractal-side-panel__footer\">{footer}</footer>}\n </aside>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Textarea.css'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => <textarea ref={ref} className={cn('fractal-textarea', className)} {...props} />,\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n"],"mappings":"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","names":["React","import_jsx_runtime","FolderIcon","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_fractal_icons","import_jsx_runtime","import_react","import_jsx_runtime","nextId","import_react","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime","import_react_dom","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Button/Button.tsx","../src/utils/cn.ts","../src/components/CodeBlock/CodeBlock.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Card/Card.tsx","../src/components/PromptCard/PromptCard.tsx","../src/components/Input/Input.tsx","../src/components/TableSearch/TableSearch.tsx","../src/components/NumberInput/NumberInput.tsx","../src/components/Slider/Slider.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/Label/Label.tsx","../src/components/Alert/Alert.tsx","../src/components/Toast/Toast.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Modal/Modal.tsx","../src/hooks/useEscapeDismiss.ts","../src/components/UILoader/UILoader.tsx","../src/components/TableLayout/TableOverflowMenu.tsx","../src/components/TableLayout/TableLayout.tsx","../src/components/DataTable/DataTable.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Dropdown/position.ts","../src/components/Link/Link.tsx","../src/components/Chip/Chip.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Radio/Radio.tsx","../src/components/SortableTable/SortableTable.tsx","../src/components/Tabs/Tabs.tsx","../src/components/ContentSwitcher/ContentSwitcher.tsx","../src/components/Disclosure/Disclosure.tsx","../src/components/LatticeLoader/LatticeLoader.tsx","../src/components/Ghost/Ghost.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/SidePanel/SidePanel.tsx","../src/components/Textarea/Textarea.tsx","../src/components/TextButton/TextButton.tsx","../src/components/FileDropzone/FileDropzone.tsx","../src/components/Pagination/Pagination.tsx","../src/components/ColumnEditor/ColumnEditor.tsx"],"sourcesContent":["export type { ControlSize } from './utils/control-size'\n\n// Components\nexport { Button } from './components/Button'\nexport type { ButtonProps, ButtonType, ButtonSize, ButtonColor } from './components/Button'\n\nexport { CodeBlock } from './components/CodeBlock'\nexport type { CodeBlockProps } from './components/CodeBlock'\n\nexport { Breadcrumbs } from './components/Breadcrumbs'\nexport type { BreadcrumbItem, BreadcrumbsProps } from './components/Breadcrumbs'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, FeatureCard, FolderCard } from './components/Card'\nexport type { FeatureCardProps, FolderCardProps } from './components/Card'\n\nexport { PromptCard, PromptGrid } from './components/PromptCard'\nexport type { PromptCardProps, PromptCardTone, PromptGridProps } from './components/PromptCard'\n\nexport { Input } from './components/Input'\nexport type { InputProps } from './components/Input'\n\nexport { TableSearch } from './components/TableSearch'\nexport type { TableSearchProps, TableSearchType } from './components/TableSearch'\n\nexport { NumberInput } from './components/NumberInput'\nexport type { NumberInputProps } from './components/NumberInput'\n\nexport { Slider } from './components/Slider'\nexport type { SliderProps, SingleSliderProps, RangeSliderProps } from './components/Slider'\n\nexport { PasswordInput } from './components/PasswordInput'\nexport type { PasswordInputProps } from './components/PasswordInput'\n\nexport { Label } from './components/Label'\nexport type { LabelProps } from './components/Label'\n\nexport { Alert, AlertTitle, AlertDescription } from './components/Alert'\n\nexport { Toast, ToastViewport } from './components/Toast'\nexport type { ToastPosition, ToastProps, ToastVariant, ToastViewportProps } from './components/Toast'\n\nexport { Toggle } from './components/Toggle'\nexport type { ToggleProps } from './components/Toggle'\n\nexport { Modal } from './components/Modal'\nexport type { ModalProps } from './components/Modal'\n\nexport { DataTable } from './components/DataTable'\nexport type { DataTableProps, DataTableColumn } from './components/DataTable'\n\nexport { Dropdown } from './components/Dropdown'\nexport type { DropdownProps, DropdownItem } from './components/Dropdown'\n\nexport { Link } from './components/Link'\nexport type { LinkProps, LinkTheme, LinkSize } from './components/Link'\n\nexport { Chip } from './components/Chip'\nexport type { ChipProps, ChipTone } from './components/Chip'\n\nexport { Checkbox } from './components/Checkbox'\nexport type { CheckboxProps } from './components/Checkbox'\n\nexport { Radio } from './components/Radio'\nexport type { RadioProps } from './components/Radio'\n\nexport { SortableTable } from './components/SortableTable'\nexport type { SortableTableProps, SortableTableColumn, SortableTableDefaultSort, SortableTablePagination, SortableTableRowAction, SortableTableSelection, SortDirection } from './components/SortableTable'\n\nexport { Tabs } from './components/Tabs'\nexport type { TabsProps, TabsVariant, TabItem } from './components/Tabs'\n\nexport { ContentSwitcher } from './components/ContentSwitcher'\nexport type { ContentSwitcherProps, ContentSwitcherItem } from './components/ContentSwitcher'\n\nexport { Disclosure } from './components/Disclosure'\nexport type { DisclosureProps } from './components/Disclosure'\n\nexport { LatticeLoader } from './components/LatticeLoader'\nexport type { LatticeLoaderProps } from './components/LatticeLoader'\n\nexport { UILoader } from './components/UILoader'\nexport type { UILoaderProps, UILoaderTone } from './components/UILoader'\n\nexport {\n AlertGhost,\n ButtonGhost,\n CardGhost,\n CheckboxGhost,\n ChipGhost,\n ConversationGhost,\n ContentSwitcherGhost,\n DataTableGhost,\n DisclosureGhost,\n DropdownGhost,\n FileDropzoneGhost,\n Ghost,\n GhostLine,\n InputGhost,\n LabelGhost,\n LinkGhost,\n ModalGhost,\n PaginationGhost,\n PromptCardGhost,\n SidebarGhost,\n SidePanelGhost,\n SortableTableGhost,\n TabsGhost,\n TextareaGhost,\n TextButtonGhost,\n ToggleGhost,\n} from './components/Ghost'\nexport type {\n ButtonGhostProps,\n CardGhostProps,\n ConversationGhostProps,\n DataTableGhostProps,\n FormFieldGhostProps,\n GhostLineProps,\n GhostProps,\n SidebarGhostProps,\n SurfaceGhostProps,\n} from './components/Ghost'\n\nexport { Sidebar, SidebarHeader, SidebarBrand, SidebarAccountMenu, SidebarNav, SidebarSection, SidebarNavItem, SidebarFooter } from './components/Sidebar'\nexport type { SidebarProps, SidebarAccountMenuProps, SidebarNavItemProps } from './components/Sidebar'\n\nexport { SidePanel } from './components/SidePanel'\nexport type { SidePanelProps } from './components/SidePanel'\n\nexport { Textarea } from './components/Textarea'\nexport type { TextareaProps } from './components/Textarea'\n\nexport { TextButton } from './components/TextButton'\nexport type { TextButtonProps, TextButtonSize, TextButtonIconPosition, TextButtonTone } from './components/TextButton'\n\nexport { FileDropzone } from './components/FileDropzone'\nexport type { FileDropzoneProps } from './components/FileDropzone'\n\nexport { Pagination } from './components/Pagination'\nexport type { PaginationProps } from './components/Pagination'\n\n\n// Hooks\nexport { useEscapeDismiss } from './hooks'\n\n// Utilities\nexport { cn } from './utils'\n\nexport type { TableColumnSizing, TableLayoutProps } from './components/TableLayout/TableLayout'\n\nexport type { TableOverflowMenuConfig, TableOverflowMenuItem } from './components/TableLayout/TableOverflowMenu'\n\nexport { ColumnEditor } from './components/ColumnEditor'\nexport type { ColumnEditorItem, ColumnEditorProps } from './components/ColumnEditor'\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport type { ControlSize } from '../../utils/control-size'\nimport '../../styles/control.css'\nimport './Button.css'\n\nexport type ButtonType = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = ControlSize\nexport type ButtonColor = 'blue' | 'pink' | 'orange' | 'green'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual hierarchy. Primary = strongest action, Secondary = neutral bordered, Ghost = minimal, Danger = destructive. */\n buttonType?: ButtonType\n /** Shared visual density; takes precedence over the buttonSize alias. */\n controlSize?: ControlSize\n /** Backward-compatible alias for controlSize. */\n buttonSize?: ButtonSize\n /** Explicit primary color preset. Omit to inherit the application's primary tokens. */\n color?: ButtonColor\n /** Icon element. */\n icon?: React.ReactNode\n /** Whether the button displays only an icon (no text). Must include aria-label. */\n hasIconOnly?: boolean\n /** Position of the icon relative to the label. */\n iconPosition?: 'left' | 'right'\n}\n\n/*\n * Color palette mapping per the color guide's semantic stop roles:\n * 0 = bg (non-interactive reading surfaces)\n * 50 = surface (tertiary button fill — interactive)\n * 100 = surface-hover (tertiary button hover — darken)\n * 200 = surface-stroke (tertiary pressed, borders)\n * 500 = md-stroke (strong chromatic hover — lighten from 600)\n * 600 = strong (strong chromatic fill — rest)\n * 700 = strong-pressed (strong chromatic pressed — darken)\n */\nconst colorPalette = {\n blue: {\n 0: 'var(--blue-0)',\n 50: 'var(--blue-50)',\n 100: 'var(--blue-100)',\n 200: 'var(--blue-200)',\n 500: 'var(--blue-500)',\n 600: 'var(--blue-600)',\n 700: 'var(--blue-700)',\n },\n pink: {\n 0: 'var(--pink-0)',\n 50: 'var(--pink-50)',\n 100: 'var(--pink-100)',\n 200: 'var(--pink-200)',\n 500: 'var(--pink-500)',\n 600: 'var(--pink-600)',\n 700: 'var(--pink-700)',\n },\n orange: {\n 0: 'var(--orange-0)',\n 50: 'var(--orange-50)',\n 100: 'var(--orange-100)',\n 200: 'var(--orange-200)',\n 500: 'var(--orange-500)',\n 600: 'var(--orange-600)',\n 700: 'var(--orange-700)',\n },\n green: {\n 0: 'var(--green-0)',\n 50: 'var(--green-50)',\n 100: 'var(--green-100)',\n 200: 'var(--green-200)',\n 500: 'var(--green-500)',\n 600: 'var(--green-600)',\n 700: 'var(--green-700)',\n },\n}\n\nfunction getButtonStyles(\n buttonType: ButtonType,\n isHovered: boolean,\n isActive: boolean,\n disabled: boolean,\n color: ButtonColor | undefined,\n hasIconOnly: boolean | undefined,\n): React.CSSProperties {\n const palette = color ? colorPalette[color] : undefined\n\n const base: React.CSSProperties = {\n borderRadius: 'var(--radius-sm, 4px)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease',\n }\n\n if (hasIconOnly) {\n base.justifyContent = 'center'\n }\n\n // Disabled: bordered buttons get transparent bg + disabled border + disabled text.\n // Others just get opacity: 0.5 (handled by CSS).\n // Per principles.md Interaction States > Disabled\n if (disabled) {\n if (buttonType === 'ghost') {\n return { ...base, backgroundColor: 'transparent', border: '1px solid transparent', color: 'var(--fg-disabled)' }\n }\n return { ...base, backgroundColor: 'transparent', border: '1px solid var(--fg-disabled)', color: 'var(--fg-disabled)' }\n }\n\n switch (buttonType) {\n // Text and icon-only primary actions inherit the same scoped theme.\n case 'primary':\n return {\n ...base,\n border: '1px solid transparent',\n ...(palette ? {\n '--button-primary-bg': palette[600],\n '--button-primary-hover': palette[500],\n '--button-primary-active': palette[700],\n '--button-primary-fg': 'var(--grey-0)',\n } : {}),\n } as React.CSSProperties\n\n // Secondary: neutral. Rest=canvas, hover=surface-1 (darken), pressed=surface-2. Subtle border, dark text.\n case 'secondary':\n return {\n ...base,\n backgroundColor: isActive ? 'var(--bg-surface-2)' : isHovered ? 'var(--bg-surface-1)' : 'var(--bg-canvas)',\n border: '1px solid var(--border-subtle)',\n color: 'var(--fg-primary)',\n }\n\n // Ghost: no border. Rest=transparent, hover/press=surface-1.\n case 'ghost':\n return {\n ...base,\n backgroundColor: isHovered || isActive ? 'var(--bg-surface-1)' : 'transparent',\n border: '1px solid transparent',\n color: 'var(--fg-primary)',\n }\n\n // Danger: low-intensity destructive action. Text stays steady; hover deepens the light red surface.\n case 'danger':\n return {\n ...base,\n backgroundColor: isHovered || isActive ? 'var(--danger-button-surface-hover)' : 'var(--danger-button-surface)',\n border: '1px solid transparent',\n color: 'var(--danger-button-fg)',\n }\n\n default:\n return base\n }\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, buttonType = 'primary', buttonSize = 'lg', controlSize, color, icon, hasIconOnly, iconPosition = 'left', style, disabled, children, ...props }, ref) => {\n const [isHovered, setIsHovered] = React.useState(false)\n const [isActive, setIsActive] = React.useState(false)\n\n const typeStyles = getButtonStyles(buttonType, isHovered, isActive, !!disabled, color, hasIconOnly)\n const hasIconAndText = icon && children && !hasIconOnly\n const finalStyles = hasIconAndText\n ? { ...typeStyles, gap: 'var(--space-2, 8px)', ...style }\n : { ...typeStyles, ...style }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-control-size={controlSize ?? buttonSize}\n data-icon-only={hasIconOnly || undefined}\n className={cn('fractal-control', 'fractal-button', `fractal-button--${buttonType}`, className)}\n style={finalStyles}\n disabled={disabled}\n onMouseEnter={(e) => { setIsHovered(true); props.onMouseEnter?.(e) }}\n onMouseLeave={(e) => { setIsHovered(false); setIsActive(false); props.onMouseLeave?.(e) }}\n onMouseDown={(e) => { setIsActive(true); props.onMouseDown?.(e) }}\n onMouseUp={(e) => { setIsActive(false); props.onMouseUp?.(e) }}\n {...props}\n >\n {iconPosition !== 'right' && icon}\n {!hasIconOnly && children}\n {iconPosition === 'right' && icon}\n </button>\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n","import { clsx, type ClassValue } from 'clsx'\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs)\n}\n","import { useEffect, useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from 'react'\nimport CodeMirror from '@uiw/react-codemirror'\nimport { HighlightStyle, foldGutter, foldService, type LanguageSupport, syntaxHighlighting } from '@codemirror/language'\nimport { json } from '@codemirror/lang-json'\nimport {\n Decoration,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n lineNumbers as lineNumberGutter,\n type DecorationSet,\n type ViewUpdate,\n} from '@codemirror/view'\nimport { tags } from '@lezer/highlight'\nimport { Check, Copy } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './CodeBlock.css'\n\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> {\n /** Code or structured text displayed by the component. */\n value: string\n /** Language name or common alias, such as `json`, `typescript`, `python`, or `bash`. */\n language?: string\n /** Optional file name. Used for display and language detection when `language` is omitted. */\n fileName?: string\n /** Optional title shown in the toolbar. */\n label?: ReactNode\n /** Enables editing. Read-only viewer mode is the default. */\n editable?: boolean\n /** Called when an editable block changes. */\n onChange?: (value: string) => void\n /** Shows line numbers and a fold gutter. */\n lineNumbers?: boolean\n /** Wraps long lines instead of requiring horizontal scrolling. */\n wrap?: boolean\n /** Shows a copy action in the toolbar. */\n copyable?: boolean\n /** Accessible name for the editing or viewing surface. */\n ariaLabel?: string\n /** CodeMirror height constraints. Any valid CSS length is accepted. */\n height?: string\n minHeight?: string\n maxHeight?: string\n placeholder?: string\n autoFocus?: boolean\n}\n\nconst codeTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--fg-primary)',\n fontSize: '0.75rem',\n },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n fontFamily: 'var(--font-mono)',\n lineHeight: '1.55',\n overscrollBehavior: 'none',\n },\n '.cm-content': { padding: '10px 0' },\n '.cm-line': {\n padding: '0 12px 0 calc(12px + var(--fractal-code-wrap-indent, 0ch))',\n textIndent: 'calc(0px - var(--fractal-code-wrap-indent, 0ch))',\n },\n '.cm-cursor, .cm-dropCursor': { borderLeftColor: 'var(--fg-primary)' },\n '.cm-gutters': {\n backgroundColor: 'var(--bg-canvas)',\n borderRight: '1px solid var(--border-subtle)',\n color: 'var(--fg-tertiary)',\n },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 10px 0 4px' },\n '.cm-foldGutter': { width: '14px' },\n '.cm-foldGutter .cm-gutterElement': {\n position: 'relative',\n display: 'block',\n width: '14px',\n padding: '0',\n },\n '.cm-foldGutter .cm-gutterElement > span': {\n position: 'absolute',\n top: '2px',\n left: '0',\n display: 'inline-flex',\n width: '14px',\n height: '14px',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0',\n color: 'var(--fg-tertiary)',\n lineHeight: '14px',\n transition: 'color 120ms ease',\n },\n '.cm-foldGutter .cm-gutterElement > span[title=\"Fold line\"]': { transform: 'translateY(-3px)' },\n '.cm-foldGutter .cm-gutterElement > span:hover': { color: 'var(--fg-secondary)' },\n '.fractal-code-block__escape': { color: 'var(--fg-secondary)' },\n '.cm-activeLine, .cm-activeLineGutter': { backgroundColor: 'var(--bg-surface-1)' },\n '.cm-selectionBackground, &.cm-focused .cm-selectionBackground, ::selection': {\n backgroundColor: 'var(--accent-surface-stroke) !important',\n },\n '.cm-searchMatch': {\n backgroundColor: 'var(--warning-surface)',\n outline: '1px solid var(--warning-surface-stroke)',\n },\n '.cm-searchMatch.cm-searchMatch-selected': { backgroundColor: 'var(--warning-subtle)' },\n '.cm-panels': { backgroundColor: 'var(--bg-surface-1)', color: 'var(--fg-primary)' },\n '.cm-tooltip': {\n borderColor: 'var(--border-subtle)',\n backgroundColor: 'var(--bg-canvas)',\n color: 'var(--fg-primary)',\n },\n})\n\nconst fractalHighlightStyle = HighlightStyle.define([\n { tag: tags.comment, color: 'var(--fg-tertiary)', fontStyle: 'italic' },\n { tag: [tags.keyword, tags.controlKeyword, tags.operatorKeyword], color: 'var(--purple-default)' },\n { tag: [tags.string, tags.special(tags.string)], color: 'var(--purple-default)' },\n { tag: [tags.number, tags.bool, tags.null], color: 'var(--orange-default)' },\n { tag: [tags.function(tags.variableName), tags.labelName], color: 'var(--accent-default)' },\n { tag: [tags.typeName, tags.className, tags.namespace], color: 'var(--pink-default)' },\n { tag: [tags.propertyName, tags.attributeName], color: 'var(--success-default)' },\n { tag: [tags.operator, tags.punctuation], color: 'var(--fg-secondary)' },\n { tag: tags.bracket, color: 'var(--accent-default)' },\n { tag: [tags.heading, tags.strong], color: 'var(--fg-primary)', fontWeight: '600' },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.link, color: 'var(--accent-default)', textDecoration: 'underline' },\n { tag: tags.invalid, color: 'var(--error-default)', textDecoration: 'underline wavy' },\n])\n\nconst jsonSupport = json()\nconst JSON_LANGUAGE_NAMES = new Set(['json', 'jsonl', 'ndjson', 'geojson'])\nconst JSON_LINES_LANGUAGE_NAMES = new Set(['jsonl', 'ndjson'])\nconst JSON_LINES_PRETTY_PRINT_THRESHOLD = 160\nconst JSON_PROPERTY_PREFIX = /^(\\s*\"(?:\\\\.|[^\"\\\\])*\"\\s*:\\s*)/\n\nfunction countVisualColumns(value: string) {\n let columns = 0\n for (const character of value) columns += character === '\\t' ? 2 : 1\n return columns\n}\n\nfunction getWrappedLineIndent(line: string) {\n const leadingWhitespace = line.match(/^\\s*/)?.[0] ?? ''\n if (JSON_PROPERTY_PREFIX.test(line)) return Math.min(countVisualColumns(leadingWhitespace), 24)\n return Math.min(countVisualColumns(leadingWhitespace) + 2, 12)\n}\n\nfunction buildWrappedLineIndentation(view: EditorView): DecorationSet {\n const decorations = []\n const decoratedLines = new Set<number>()\n\n for (const visibleRange of view.visibleRanges) {\n let position = visibleRange.from\n while (position <= visibleRange.to) {\n const line = view.state.doc.lineAt(position)\n if (!decoratedLines.has(line.from)) {\n const indent = getWrappedLineIndent(line.text)\n decorations.push(Decoration.line({\n attributes: { style: `--fractal-code-wrap-indent: ${indent}ch` },\n }).range(line.from))\n decoratedLines.add(line.from)\n }\n if (line.to >= visibleRange.to) break\n position = line.to + 1\n }\n }\n\n return Decoration.set(decorations, true)\n}\n\nconst wrappedLineIndentation = ViewPlugin.fromClass(class {\n decorations: DecorationSet\n\n constructor(view: EditorView) {\n this.decorations = buildWrappedLineIndentation(view)\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildWrappedLineIndentation(update.view)\n }\n}, {\n decorations: (plugin) => plugin.decorations,\n})\n\nconst jsonEscapeMatcher = new MatchDecorator({\n regexp: /\\\\(?:[\"\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n decoration: Decoration.mark({ class: 'fractal-code-block__escape' }),\n})\n\nconst jsonEscapeHighlighting = ViewPlugin.fromClass(class {\n decorations: DecorationSet\n\n constructor(view: EditorView) {\n this.decorations = jsonEscapeMatcher.createDeco(view)\n }\n\n update(update: ViewUpdate) {\n this.decorations = jsonEscapeMatcher.updateDeco(update, this.decorations)\n }\n}, {\n decorations: (plugin) => plugin.decorations,\n})\n\nfunction formatJsonLinesForDisplay(value: string) {\n return value.split(/\\r?\\n/).map((line) => {\n const firstContentIndex = line.search(/\\S/)\n if (firstContentIndex < 0 || line.length - firstContentIndex <= JSON_LINES_PRETTY_PRINT_THRESHOLD) return line\n\n const indentation = line.slice(0, firstContentIndex)\n try {\n const parsed: unknown = JSON.parse(line.slice(firstContentIndex))\n if (parsed === null || typeof parsed !== 'object') return line\n return JSON.stringify(parsed, null, 2)\n .split('\\n')\n .map((formattedLine) => `${indentation}${formattedLine}`)\n .join('\\n')\n } catch {\n return line\n }\n }).join('\\n')\n}\n\nfunction findJsonContainerEnd(document: string, start: number) {\n const openingCharacter = document[start]\n if (openingCharacter !== '{' && openingCharacter !== '[') return null\n\n const closingCharacters: string[] = []\n let isInsideString = false\n let isEscaped = false\n\n for (let index = start; index < document.length; index += 1) {\n const character = document[index]\n if (isInsideString) {\n if (isEscaped) {\n isEscaped = false\n } else if (character === '\\\\') {\n isEscaped = true\n } else if (character === '\"') {\n isInsideString = false\n }\n continue\n }\n\n if (character === '\"') {\n isInsideString = true\n } else if (character === '{') {\n closingCharacters.push('}')\n } else if (character === '[') {\n closingCharacters.push(']')\n } else if (character === '}' || character === ']') {\n if (closingCharacters.pop() !== character) return null\n if (closingCharacters.length === 0) return index\n }\n }\n\n return null\n}\n\nconst jsonLinesFoldSupport = foldService.of((state, lineStart, lineEnd) => {\n const line = state.doc.sliceString(lineStart, lineEnd)\n const firstContentIndex = line.search(/\\S/)\n if (firstContentIndex < 0) return null\n\n const containerStart = lineStart + firstContentIndex\n const openingCharacter = line[firstContentIndex]\n if (openingCharacter !== '{' && openingCharacter !== '[') return null\n\n const document = state.doc.toString()\n const containerEnd = findJsonContainerEnd(document, containerStart)\n if (containerEnd === null || containerEnd - containerStart < 2) return null\n\n try {\n const parsed: unknown = JSON.parse(document.slice(containerStart, containerEnd + 1))\n if (parsed === null || typeof parsed !== 'object') return null\n } catch {\n return null\n }\n\n return {\n from: containerStart + 1,\n to: containerEnd,\n }\n})\n\nfunction resolveLanguage(language?: string, fileName?: string): {\n label?: string\n support: LanguageSupport | null\n isJsonLines: boolean\n} {\n const normalized = language?.trim().toLowerCase()\n const extension = fileName?.split(/[?#]/, 1)[0].split('.').pop()?.toLowerCase()\n if ((normalized && JSON_LANGUAGE_NAMES.has(normalized)) || (extension && JSON_LANGUAGE_NAMES.has(extension))) {\n const isJsonLines = Boolean(\n (normalized && JSON_LINES_LANGUAGE_NAMES.has(normalized))\n || (extension && JSON_LINES_LANGUAGE_NAMES.has(extension)),\n )\n return { label: isJsonLines ? 'JSONL' : 'JSON', support: jsonSupport, isJsonLines }\n }\n if (normalized && !['text', 'txt', 'plaintext', 'plain'].includes(normalized)) {\n return { label: language?.trim(), support: null, isJsonLines: false }\n }\n return { support: null, isJsonLines: false }\n}\n\nexport function CodeBlock({\n value,\n language,\n fileName,\n label,\n editable = false,\n onChange,\n lineNumbers = true,\n wrap = true,\n copyable = true,\n ariaLabel,\n height,\n minHeight,\n maxHeight = '28rem',\n placeholder,\n autoFocus,\n className,\n ...props\n}: CodeBlockProps) {\n const resolvedLanguage = useMemo(() => resolveLanguage(language, fileName), [fileName, language])\n const displayValue = useMemo(\n () => !editable && resolvedLanguage.isJsonLines ? formatJsonLinesForDisplay(value) : value,\n [editable, resolvedLanguage.isJsonLines, value],\n )\n const [copyStatus, setCopyStatus] = useState<'idle' | 'copied' | 'error'>('idle')\n const copyResetTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => () => {\n if (copyResetTimer.current) clearTimeout(copyResetTimer.current)\n }, [])\n\n const extensions = useMemo(() => [\n codeTheme,\n syntaxHighlighting(fractalHighlightStyle),\n ...(resolvedLanguage.support ? [resolvedLanguage.support] : []),\n ...(resolvedLanguage.support ? [jsonEscapeHighlighting] : []),\n ...(resolvedLanguage.isJsonLines ? [jsonLinesFoldSupport] : []),\n ...(lineNumbers ? [foldGutter(), lineNumberGutter()] : []),\n ...(wrap ? [EditorView.lineWrapping, wrappedLineIndentation] : []),\n ], [lineNumbers, resolvedLanguage.isJsonLines, resolvedLanguage.support, wrap])\n\n const languageLabel = resolvedLanguage.label\n const toolbarLabel = label ?? fileName ?? languageLabel\n const surfaceLabel = ariaLabel\n ?? (fileName ? `${fileName} ${editable ? 'editor' : 'viewer'}` : `Code ${editable ? 'editor' : 'viewer'}`)\n\n const copyCode = async () => {\n try {\n await navigator.clipboard.writeText(value)\n setCopyStatus('copied')\n } catch {\n setCopyStatus('error')\n }\n if (copyResetTimer.current) clearTimeout(copyResetTimer.current)\n copyResetTimer.current = setTimeout(() => setCopyStatus('idle'), 1800)\n }\n\n const showToolbar = toolbarLabel !== undefined || copyable || editable\n\n return (\n <div\n className={cn(\n 'fractal-code-block',\n editable && 'fractal-code-block--editable',\n !lineNumbers && 'fractal-code-block--no-line-numbers',\n className,\n )}\n {...props}\n >\n {showToolbar && (\n <div className=\"fractal-code-block__toolbar\">\n <div className=\"fractal-code-block__identity\">\n {toolbarLabel !== undefined && (\n <span className=\"fractal-code-block__label\" title={typeof toolbarLabel === 'string' ? toolbarLabel : undefined}>\n {toolbarLabel}\n </span>\n )}\n {fileName && languageLabel && <span className=\"fractal-code-block__language\">{languageLabel}</span>}\n {editable && <span className=\"fractal-code-block__mode\">Editing</span>}\n </div>\n {copyable && (\n <button\n type=\"button\"\n className=\"fractal-code-block__copy\"\n aria-label={copyStatus === 'copied' ? 'Code copied' : 'Copy code'}\n onClick={() => void copyCode()}\n >\n {copyStatus === 'copied' ? <Check size={14} /> : <Copy size={14} />}\n <span>{copyStatus === 'copied' ? 'Copied' : copyStatus === 'error' ? 'Copy failed' : 'Copy'}</span>\n </button>\n )}\n </div>\n )}\n <div className=\"fractal-code-block__surface\">\n <CodeMirror\n aria-label={surfaceLabel}\n value={displayValue}\n editable={editable}\n readOnly={!editable}\n onChange={onChange}\n extensions={extensions}\n theme=\"none\"\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n drawSelection: editable,\n highlightActiveLine: editable,\n highlightActiveLineGutter: editable,\n highlightSelectionMatches: editable,\n autocompletion: editable,\n history: editable,\n }}\n indentWithTab={editable}\n height={height}\n minHeight={minHeight}\n maxHeight={maxHeight}\n placeholder={placeholder}\n autoFocus={autoFocus}\n />\n </div>\n <span className=\"fractal-code-block__status\" aria-live=\"polite\">\n {copyStatus === 'copied' ? 'Code copied to clipboard.' : copyStatus === 'error' ? 'Code could not be copied.' : ''}\n </span>\n </div>\n )\n}\n","import * as React from 'react'\nimport { ChevronRight } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Breadcrumbs.css'\n\nexport interface BreadcrumbItem {\n label: React.ReactNode\n href?: string\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n}\n\nexport interface BreadcrumbsProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {\n items: BreadcrumbItem[]\n ariaLabel?: string\n separator?: React.ReactNode\n}\n\nexport function Breadcrumbs({\n items,\n ariaLabel = 'Breadcrumbs',\n separator = <ChevronRight aria-hidden=\"true\" size={14} />,\n className,\n ...props\n}: BreadcrumbsProps) {\n if (items.length === 0) return null\n\n return (\n <nav aria-label={ariaLabel} className={cn('fractal-breadcrumbs', className)} {...props}>\n <ol className=\"fractal-breadcrumbs__list\">\n {items.map((item, index) => {\n const isCurrent = index === items.length - 1\n const content = isCurrent ? (\n <span aria-current=\"page\" className=\"fractal-breadcrumbs__current\">{item.label}</span>\n ) : (\n <a className=\"fractal-breadcrumbs__link\" href={item.href ?? '#'} onClick={item.onClick}>\n {item.label}\n </a>\n )\n\n return (\n <li className=\"fractal-breadcrumbs__item\" key={index}>\n {index > 0 && <span aria-hidden=\"true\" className=\"fractal-breadcrumbs__separator\">{separator}</span>}\n {content}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import * as React from 'react'\nimport { Folder as FolderIcon } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Card.css'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-fractal-border-surface=\"surface-1\" className={cn('fractal-card', className)} {...props} />\n )\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-header', className)} {...props} />\n )\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('fractal-card-title', className)} {...props} />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('fractal-card-description', className)} {...props} />\n )\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-content', className)} {...props} />\n )\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-card-footer', className)} {...props} />\n )\n)\nCardFooter.displayName = 'CardFooter'\n\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: React.ReactNode\n title: string\n description: string\n}\n\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ icon, title, description, className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-feature-card', className)} {...props}>\n {icon && <div className=\"fractal-feature-card__icon\">{icon}</div>}\n <h3 className=\"fractal-feature-card__title\">{title}</h3>\n <p className=\"fractal-feature-card__description\">{description}</p>\n </div>\n )\n)\nFeatureCard.displayName = 'FeatureCard'\n\nexport interface FolderCardProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string\n sessionCount?: number\n selected?: boolean\n}\n\nconst FolderCard = React.forwardRef<HTMLDivElement, FolderCardProps>(\n ({ name, sessionCount, selected, className, onClick, ...props }, ref) => (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>)\n }\n }}\n className={cn('fractal-folder-card', selected && 'fractal-folder-card--selected', className)}\n {...props}\n >\n <div className=\"fractal-folder-card__header\">\n <FolderIcon size={16} className=\"fractal-folder-card__icon\" aria-hidden />\n <span className=\"fractal-folder-card__name\">{name}</span>\n </div>\n {sessionCount !== undefined && (\n <div className=\"fractal-folder-card__footer\">\n <span className=\"fractal-folder-card__sessions\">{sessionCount} {sessionCount === 1 ? 'session' : 'sessions'}</span>\n </div>\n )}\n </div>\n )\n)\nFolderCard.displayName = 'FolderCard'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, FeatureCard, FolderCard }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './PromptCard.css'\n\nexport type PromptCardTone =\n | 'blue'\n | 'pink'\n | 'orange'\n | 'green'\n | 'purple'\n | 'red'\n | 'yellow'\n | 'neutral'\n\nexport interface PromptCardProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'title'> {\n title: React.ReactNode\n icon?: React.ReactNode\n prompt?: string\n tone?: PromptCardTone\n highlighted?: boolean\n onPromptSelect?: (prompt: string) => void\n}\n\nconst titleToPrompt = (title: React.ReactNode) =>\n typeof title === 'string' || typeof title === 'number' ? String(title) : ''\n\nconst PromptCard = React.forwardRef<HTMLButtonElement, PromptCardProps>(\n (\n {\n title,\n icon,\n prompt,\n tone = 'blue',\n highlighted,\n disabled,\n className,\n onClick,\n onPromptSelect,\n ...props\n },\n ref,\n ) => {\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (!event.defaultPrevented) {\n onPromptSelect?.(prompt ?? titleToPrompt(title))\n }\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n className={cn(\n 'fractal-prompt-card',\n `fractal-prompt-card--${tone}`,\n highlighted && 'fractal-prompt-card--highlighted',\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {icon && (\n <span className=\"fractal-prompt-card__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"fractal-prompt-card__title\">{title}</span>\n </button>\n )\n },\n)\nPromptCard.displayName = 'PromptCard'\n\nexport interface PromptGridProps extends React.HTMLAttributes<HTMLDivElement> {\n compact?: boolean\n padded?: boolean\n}\n\nconst PromptGrid = React.forwardRef<HTMLDivElement, PromptGridProps>(\n ({ compact, padded, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fractal-prompt-grid',\n compact && 'fractal-prompt-grid--compact',\n padded && 'fractal-prompt-grid--padded',\n className,\n )}\n {...props}\n />\n ),\n)\nPromptGrid.displayName = 'PromptGrid'\n\nexport { PromptCard, PromptGrid }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport type { ControlSize } from '../../utils/control-size'\nimport '../../styles/control.css'\nimport './Input.css'\nimport '../../styles/floating-field.css'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /** Visual density; native `size` still controls the character-width hint. */\n controlSize?: ControlSize\n /** Persistent title that floats into the border on focus or when filled. Search uses it only as an accessible name. */\n fieldLabel?: string\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, controlSize = 'lg', fieldLabel, id, placeholder, ...props }, ref) => {\n const generatedId = React.useId()\n const fieldId = id ?? generatedId\n const floatingLabel = type === 'search' ? undefined : fieldLabel\n const input = <input\n type={type}\n ref={ref}\n id={floatingLabel ? fieldId : id}\n placeholder={floatingLabel ? (placeholder || ' ') : placeholder}\n data-control-size={controlSize}\n className={cn('fractal-control', 'fractal-input', className)}\n {...props}\n aria-label={props['aria-label'] ?? (type === 'search' && !props['aria-labelledby'] ? fieldLabel ?? 'Search' : undefined)}\n />\n if (!floatingLabel) return input\n return <div className=\"fractal-floating-field\" data-control-size={controlSize}\n data-always-float={['date', 'datetime-local', 'time', 'month', 'week', 'color', 'file', 'range'].includes(type ?? '') || undefined}>\n {input}\n <label className=\"fractal-floating-field__label\" htmlFor={fieldId}>{fieldLabel}</label>\n </div>\n }\n\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { MagnifyingGlass, MagnifyingGlassLines } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport { Input, type InputProps } from '../Input'\nimport './TableSearch.css'\n\nexport type TableSearchType = 'text' | 'glob'\n\nexport interface TableSearchProps extends Omit<InputProps, 'type'> {\n /** Controls the search affordance. Filtering remains controlled by the table's data owner. */\n searchType?: TableSearchType\n inputClassName?: string\n}\n\nexport const TableSearch = React.forwardRef<HTMLInputElement, TableSearchProps>(\n ({\n searchType = 'text',\n controlSize = 'lg',\n className,\n inputClassName,\n placeholder,\n title,\n ...props\n }, ref) => {\n const isGlob = searchType === 'glob'\n const SearchIcon = isGlob ? MagnifyingGlassLines : MagnifyingGlass\n\n return (\n <div\n className={cn('fractal-table-search', className)}\n data-search-type={searchType}\n data-control-size={controlSize}\n >\n <SearchIcon className=\"fractal-table-search__icon\" size={17} aria-hidden=\"true\" />\n <Input\n {...props}\n controlSize={controlSize}\n ref={ref}\n type=\"search\"\n className={cn('fractal-table-search__input', inputClassName)}\n placeholder={placeholder ?? (isGlob ? 'Glob search — use *, ?, or [a-z]' : 'Search')}\n title={title ?? (isGlob ? 'Glob pattern: *, **, ?, [abc], [a-z], and [!abc]' : undefined)}\n />\n </div>\n )\n },\n)\nTableSearch.displayName = 'TableSearch'\n","import * as React from 'react'\nimport { Minus, Plus } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport { Input, type InputProps } from '../Input'\nimport './NumberInput.css'\n\nexport interface NumberInputProps extends Omit<InputProps, 'type'> {\n unit?: string\n}\n\nexport function NumberInput({\n unit,\n controlSize = 'lg',\n className,\n value,\n defaultValue,\n disabled,\n readOnly,\n min,\n max,\n ...props\n}: NumberInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const numericValue = Number(value ?? defaultValue)\n const characterCount = Math.max(String(value ?? defaultValue ?? '').length, 1)\n const controlLabel = typeof props['aria-label'] === 'string' ? props['aria-label'] : props.fieldLabel ?? 'value'\n const decrementDisabled = disabled\n || readOnly\n || (Number.isFinite(numericValue) && min !== undefined && numericValue <= Number(min))\n const incrementDisabled = disabled\n || readOnly\n || (Number.isFinite(numericValue) && max !== undefined && numericValue >= Number(max))\n\n const changeByStep = (direction: -1 | 1) => {\n const input = inputRef.current\n if (!input) return\n if (direction === -1) input.stepDown()\n else input.stepUp()\n input.dispatchEvent(new Event('input', { bubbles: true }))\n input.focus()\n }\n\n return (\n <div data-control-size={controlSize} className={cn('fractal-number-input', unit && 'fractal-number-input--with-unit', className)}>\n <Input\n ref={inputRef}\n controlSize={controlSize}\n type=\"number\"\n value={value}\n defaultValue={defaultValue}\n disabled={disabled}\n readOnly={readOnly}\n min={min}\n max={max}\n {...props}\n />\n {unit && (\n <span\n className=\"fractal-number-input-unit\"\n style={{ left: `calc(var(--control-padding-inline) + ${characterCount}ch)` }}\n aria-hidden=\"true\"\n >\n {unit}\n </span>\n )}\n <div className=\"fractal-number-input-controls\">\n <button\n type=\"button\"\n className=\"fractal-number-input-step\"\n aria-label={`Decrease ${controlLabel}`}\n disabled={decrementDisabled}\n onClick={() => changeByStep(-1)}\n >\n <Minus aria-hidden=\"true\" size={16} />\n </button>\n <button\n type=\"button\"\n className=\"fractal-number-input-step\"\n aria-label={`Increase ${controlLabel}`}\n disabled={incrementDisabled}\n onClick={() => changeByStep(1)}\n >\n <Plus aria-hidden=\"true\" size={16} />\n </button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Slider.css'\n\ntype SliderBaseProps = {\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n className?: string\n showValues?: boolean\n formatValue?: (value: number) => React.ReactNode\n}\n\nexport type SingleSliderProps = SliderBaseProps & {\n knobs?: 1\n value: number\n onValueChange: (value: number) => void\n ariaLabel?: string\n}\n\nexport type RangeSliderProps = SliderBaseProps & {\n knobs: 2\n value: [number, number]\n onValueChange: (value: [number, number]) => void\n lowerAriaLabel?: string\n upperAriaLabel?: string\n}\n\nexport type SliderProps = SingleSliderProps | RangeSliderProps\n\nexport function Slider(props: SliderProps) {\n const {\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n className,\n showValues = true,\n formatValue = (value) => value,\n knobs = 1,\n } = props\n const span = Math.max(max - min, 1)\n const rawValues = knobs === 2\n ? (props as RangeSliderProps).value\n : [(props as SingleSliderProps).value]\n const firstValue = clamp(rawValues[0], min, max)\n const secondValue = knobs === 2 ? clamp(rawValues[1], firstValue, max) : firstValue\n const selectionStart = knobs === 2 ? firstValue : min\n const selectionEnd = secondValue\n const selectionStartPercent = ((selectionStart - min) / span) * 100\n const selectionEndPercent = ((selectionEnd - min) / span) * 100\n\n const changeSingleValue = (value: number) => {\n ;(props as SingleSliderProps).onValueChange(clamp(value, min, max))\n }\n const changeRangeValue = (nextLower: number, nextUpper: number) => {\n ;(props as RangeSliderProps).onValueChange([\n clamp(nextLower, min, nextUpper),\n clamp(nextUpper, nextLower, max),\n ])\n }\n const getKeyboardValue = (event: React.KeyboardEvent<HTMLInputElement>, value: number) => {\n const pageStep = step * 10\n const adjustments: Record<string, number> = {\n ArrowDown: -step,\n ArrowLeft: -step,\n ArrowRight: step,\n ArrowUp: step,\n PageDown: -pageStep,\n PageUp: pageStep,\n }\n\n if (event.key === 'Home') return min\n if (event.key === 'End') return max\n if (!(event.key in adjustments)) return null\n return value + adjustments[event.key]\n }\n\n return (\n <div\n className={cn('fractal-slider', disabled && 'fractal-slider--disabled', className)}\n data-disabled={disabled || undefined}\n data-knobs={knobs}\n >\n {showValues && (\n <div className=\"fractal-slider-values\" aria-hidden=\"true\">\n <output>{formatValue(firstValue)}</output>\n {knobs === 2 && <output>{formatValue(secondValue)}</output>}\n </div>\n )}\n <div\n className=\"fractal-slider-control\"\n style={{\n '--fractal-slider-selection-start': `${selectionStartPercent}%`,\n '--fractal-slider-selection-end': `${selectionEndPercent}%`,\n } as React.CSSProperties}\n >\n <span className=\"fractal-slider-track\" aria-hidden=\"true\" />\n <span className=\"fractal-slider-selection\" aria-hidden=\"true\" />\n <input\n aria-label={knobs === 2\n ? (props as RangeSliderProps).lowerAriaLabel ?? 'Lower value'\n : (props as SingleSliderProps).ariaLabel ?? 'Slider value'}\n disabled={disabled}\n max={max}\n min={min}\n onChange={(event) => {\n const nextValue = event.currentTarget.valueAsNumber\n if (knobs === 2) changeRangeValue(Math.min(nextValue, secondValue), secondValue)\n else changeSingleValue(nextValue)\n }}\n onKeyDown={(event) => {\n const nextValue = getKeyboardValue(event, firstValue)\n if (nextValue === null) return\n event.preventDefault()\n if (knobs === 2) changeRangeValue(Math.min(nextValue, secondValue), secondValue)\n else changeSingleValue(nextValue)\n }}\n step={step}\n type=\"range\"\n value={firstValue}\n />\n {knobs === 2 && (\n <input\n aria-label={(props as RangeSliderProps).upperAriaLabel ?? 'Upper value'}\n disabled={disabled}\n max={max}\n min={min}\n onChange={(event) => {\n const nextValue = event.currentTarget.valueAsNumber\n changeRangeValue(firstValue, Math.max(nextValue, firstValue))\n }}\n onKeyDown={(event) => {\n const nextValue = getKeyboardValue(event, secondValue)\n if (nextValue === null) return\n event.preventDefault()\n changeRangeValue(firstValue, Math.max(nextValue, firstValue))\n }}\n step={step}\n type=\"range\"\n value={secondValue}\n />\n )}\n </div>\n </div>\n )\n}\n\nfunction clamp(value: number, minimum: number, maximum: number) {\n return Math.min(maximum, Math.max(minimum, value))\n}\n","import * as React from 'react'\nimport { Eye, EyeSlash } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport { Input, type InputProps } from '../Input'\nimport './PasswordInput.css'\n\nexport interface PasswordInputProps extends Omit<InputProps, 'type'> {\n showPasswordLabel?: string\n hidePasswordLabel?: string\n}\n\nconst PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(\n (\n {\n className,\n controlSize = 'lg',\n disabled,\n showPasswordLabel = 'Show password',\n hidePasswordLabel = 'Hide password',\n ...props\n },\n ref,\n ) => {\n const [passwordVisible, setPasswordVisible] = React.useState(false)\n const toggleLabel = passwordVisible ? hidePasswordLabel : showPasswordLabel\n\n return (\n <div\n className={cn('fractal-password-input', className)}\n data-control-size={controlSize}\n data-password-visible={passwordVisible ? '' : undefined}\n >\n <Input\n {...props}\n controlSize={controlSize}\n ref={ref}\n className=\"fractal-password-input-field\"\n disabled={disabled}\n type={passwordVisible ? 'text' : 'password'}\n />\n <button\n type=\"button\"\n className=\"fractal-password-input-toggle\"\n aria-label={toggleLabel}\n aria-pressed={passwordVisible}\n disabled={disabled}\n title={toggleLabel}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n {passwordVisible\n ? <EyeSlash aria-hidden=\"true\" size={18} />\n : <Eye aria-hidden=\"true\" size={18} />}\n </button>\n </div>\n )\n },\n)\nPasswordInput.displayName = 'PasswordInput'\n\nexport { PasswordInput }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport type { ControlSize } from '../../utils/control-size'\nimport '../../styles/control.css'\nimport './Label.css'\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n controlSize?: ControlSize\n}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, controlSize = 'lg', ...props }, ref) => (\n <label\n ref={ref}\n data-control-size={controlSize}\n className={cn('fractal-label', className)}\n {...props}\n />\n )\n)\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport { CircleCheck, CircleClose, CircleInfo, Warning } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Alert.css'\n\nexport type AlertVariant = 'default' | 'info' | 'success' | 'warning' | 'error'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant\n icon?: React.ReactNode\n}\n\nconst defaultIcons = {\n default: CircleInfo,\n info: CircleInfo,\n success: CircleCheck,\n warning: Warning,\n error: CircleClose,\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = 'default', icon, children, ...props }, ref) => {\n const DefaultIcon = defaultIcons[variant]\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn('fractal-alert', `fractal-alert--${variant}`, className)}\n {...props}\n >\n <span className=\"fractal-alert-icon\" aria-hidden>\n {icon ?? <DefaultIcon size={18} />}\n </span>\n <div className=\"fractal-alert-content\">{children}</div>\n </div>\n )\n }\n)\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h5 ref={ref} className={cn('fractal-alert-title', className)} {...props} />\n )\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-alert-description', className)} {...props} />\n )\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { CircleCheck, CircleClose, CircleInfo, Close, Warning } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Toast.css'\n\nexport type ToastVariant = 'default' | 'info' | 'success' | 'warning' | 'error'\nexport type ToastPosition = 'top-center' | 'top-right' | 'bottom-center'\n\nexport interface ToastProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Semantic tone. Error toasts announce assertively; all other tones announce politely. */\n variant?: ToastVariant\n /** Replaces the default semantic icon. */\n icon?: React.ReactNode\n /** Optional action control, such as an Undo or View button. */\n action?: React.ReactNode\n /** Called by the close control or after the auto-dismiss duration. */\n onDismiss: () => void\n /** Accessible label for the close control. */\n dismissLabel?: string\n /** Auto-dismiss delay in milliseconds. Pass null to keep the toast open. Defaults to 5 seconds, except errors, which persist. */\n duration?: number | null\n}\n\nexport interface ToastViewportProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Screen edge used for the toast stack. */\n position?: ToastPosition\n /** Render into document.body so the stack is not clipped by product layout. */\n portal?: boolean\n}\n\nconst defaultIcons = {\n default: CircleInfo,\n info: CircleInfo,\n success: CircleCheck,\n warning: Warning,\n error: CircleClose,\n}\n\nexport const Toast = React.forwardRef<HTMLDivElement, ToastProps>(function Toast(\n {\n action,\n children,\n className,\n dismissLabel = 'Dismiss notification',\n duration,\n icon,\n onBlurCapture,\n onDismiss,\n onFocusCapture,\n onPointerEnter,\n onPointerLeave,\n role,\n variant = 'default',\n ...props\n },\n ref,\n) {\n const [paused, setPaused] = React.useState(false)\n const dismissRef = React.useRef(onDismiss)\n const DefaultIcon = defaultIcons[variant]\n const resolvedDuration = duration === undefined\n ? (variant === 'error' ? null : 5000)\n : duration\n\n React.useEffect(() => {\n dismissRef.current = onDismiss\n }, [onDismiss])\n\n React.useEffect(() => {\n if (!dismissRef.current || paused || resolvedDuration === null || resolvedDuration <= 0) return\n const timeout = window.setTimeout(() => dismissRef.current?.(), resolvedDuration)\n return () => window.clearTimeout(timeout)\n }, [paused, resolvedDuration])\n\n const announcementRole = role ?? (variant === 'error' ? 'alert' : 'status')\n\n return (\n <div\n ref={ref}\n aria-atomic=\"true\"\n aria-live={announcementRole === 'alert' ? 'assertive' : 'polite'}\n className={cn('fractal-toast', `fractal-toast--${variant}`, className)}\n role={announcementRole}\n onBlurCapture={(event) => {\n onBlurCapture?.(event)\n if (!event.currentTarget.contains(event.relatedTarget)) setPaused(false)\n }}\n onFocusCapture={(event) => {\n onFocusCapture?.(event)\n setPaused(true)\n }}\n onPointerEnter={(event) => {\n onPointerEnter?.(event)\n setPaused(true)\n }}\n onPointerLeave={(event) => {\n onPointerLeave?.(event)\n setPaused(false)\n }}\n {...props}\n >\n <span aria-hidden=\"true\" className=\"fractal-toast__icon\">\n {icon ?? <DefaultIcon size={18} />}\n </span>\n <div className=\"fractal-toast__content\">{children}</div>\n {action && <div className=\"fractal-toast__action\">{action}</div>}\n <button\n aria-label={dismissLabel}\n className=\"fractal-toast__dismiss\"\n onClick={onDismiss}\n type=\"button\"\n >\n <Close aria-hidden=\"true\" size={14} />\n </button>\n </div>\n )\n})\n\nexport const ToastViewport = React.forwardRef<HTMLDivElement, ToastViewportProps>(function ToastViewport(\n { children, className, portal = true, position = 'top-center', ...props },\n ref,\n) {\n const viewport = (\n <div\n ref={ref}\n className={cn('fractal-toast-viewport', `fractal-toast-viewport--${position}`, className)}\n data-position={position}\n {...props}\n >\n {children}\n </div>\n )\n\n if (!portal || typeof document === 'undefined') return viewport\n return createPortal(viewport, document.body)\n})\n","import { cn } from '../../utils/cn'\nimport './Toggle.css'\n\nexport interface ToggleProps {\n checked: boolean\n onChange: (checked: boolean) => void\n label?: string\n className?: string\n}\n\nexport function Toggle({ checked, onChange, label, className }: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={cn('fractal-toggle', className)}\n onClick={() => onChange(!checked)}\n >\n <span className={cn('fractal-toggle-track', checked && 'fractal-toggle-track--checked')}>\n <span className={cn('fractal-toggle-thumb', checked && 'fractal-toggle-thumb--checked')} />\n </span>\n {label && <span className=\"fractal-toggle-label\">{label}</span>}\n </button>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\nimport { cn } from '../../utils/cn'\nimport { UILoader } from '../UILoader'\nimport './Modal.css'\n\nexport interface ModalProps {\n open: boolean\n onClose: () => void\n title: React.ReactNode\n children: React.ReactNode\n /** When true, uses red accent for destructive actions. */\n danger?: boolean\n /** When true, uses yellow/warning accent. */\n warn?: boolean\n /** Optional footer content (e.g. action buttons). */\n footer?: React.ReactNode\n /** When true, prevents closing via overlay click or Escape. */\n noClose?: boolean\n /** Keeps the close control visible but disables every dismissal route. */\n closeDisabled?: boolean\n /** Modal width: 'sm' (420px), 'md' (756px), 'lg' (near-fullscreen). */\n size?: 'sm' | 'md' | 'lg'\n /** Replaces the body with a whole-surface loading state while retaining the modal chrome. */\n loading?: boolean\n loadingLabel?: string\n /** Constrains the modal to the viewport, scrolls the body, and separates the fixed footer with a full-width divider. */\n scrollable?: boolean\n className?: string\n}\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nexport function Modal({ open, onClose, title, children, danger, warn, footer, noClose, closeDisabled = false, size = 'sm', loading = false, loadingLabel = 'Loading', scrollable = false, className }: ModalProps) {\n const [bodyScrolled, setBodyScrolled] = React.useState(false)\n useEscapeDismiss(80, onClose, open && !noClose && !closeDisabled)\n\n React.useEffect(() => {\n if (open) setBodyScrolled(false)\n }, [open])\n\n if (!open) return null\n\n const sizeClass = `fractal-modal-panel--${size}`\n const accentClass = danger ? 'fractal-modal-panel--danger' : warn ? 'fractal-modal-panel--warn' : ''\n\n return createPortal(\n <div className=\"fractal-modal-overlay\" onClick={noClose || closeDisabled ? undefined : onClose}>\n <div\n className={cn('fractal-modal-panel', sizeClass, accentClass, scrollable && 'fractal-modal-panel--scrollable', className)}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={cn(\n 'fractal-modal-title-row',\n scrollable && 'fractal-modal-title-row--scrollable',\n scrollable && bodyScrolled && 'fractal-modal-title-row--scrolled',\n )}\n >\n <h3 className={cn('fractal-modal-title', danger && 'fractal-modal-title--danger', warn && 'fractal-modal-title--warn')}>\n {title}\n </h3>\n {!noClose && (\n <button type=\"button\" onClick={onClose} title=\"Close\" disabled={closeDisabled} className=\"fractal-modal-close\">\n <CloseIcon />\n </button>\n )}\n </div>\n <div\n aria-busy={loading || undefined}\n className={cn(\n 'fractal-modal-body',\n size === 'lg' && 'fractal-modal-body--lg',\n loading && 'fractal-modal-body--loading',\n scrollable && 'fractal-modal-body--scrollable',\n )}\n onScroll={scrollable ? (event) => setBodyScrolled(event.currentTarget.scrollTop > 0) : undefined}\n >\n {loading ? <UILoader label={loadingLabel} /> : children}\n </div>\n {footer && (\n <div className={cn('fractal-modal-footer', scrollable && 'fractal-modal-footer--divided')}>\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )\n}\n","import { useEffect, useRef } from 'react'\n\n/**\n * Centralized Escape-key dismiss system with priority ordering.\n *\n * Components register a handler via `useEscapeDismiss(priority, handler)`.\n * When the user presses Escape, only the highest-priority active handler fires.\n * If two handlers share the same priority, the most recently registered one wins.\n *\n * Priority guidelines (higher = dismissed first):\n * 120 Sidebar search filter\n * 100 Context menus, tooltips\n * 80 Modals / dialogs\n * 60 Search overlay, drawers\n * 40 Inline editors\n */\n\ninterface EscapeEntry {\n id: number\n priority: number\n handler: () => void\n}\n\nlet nextId = 0\nconst stack: EscapeEntry[] = []\n\nfunction insertSorted(entry: EscapeEntry): void {\n let i = 0\n while (i < stack.length && stack[i].priority >= entry.priority) {\n if (stack[i].priority === entry.priority) break\n i++\n }\n stack.splice(i, 0, entry)\n}\n\nfunction remove(id: number): void {\n const idx = stack.findIndex((e) => e.id === id)\n if (idx >= 0) stack.splice(idx, 1)\n}\n\nlet listenerInstalled = false\n\nfunction ensureGlobalListener(): void {\n if (listenerInstalled) return\n listenerInstalled = true\n\n window.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n if (stack.length === 0) return\n\n e.preventDefault()\n e.stopImmediatePropagation()\n\n const top = stack[0]\n top.handler()\n },\n { capture: true },\n )\n}\n\n/**\n * Register an Escape-key dismiss handler with the global priority stack.\n *\n * @param priority Higher values are dismissed first. See header for guidelines.\n * @param handler Called when this entry is the top-of-stack and Escape is pressed.\n * @param enabled When false the handler is not registered.\n */\nexport function useEscapeDismiss(\n priority: number,\n handler: () => void,\n enabled = true,\n): void {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (!enabled) return\n\n ensureGlobalListener()\n\n const id = nextId++\n const entry: EscapeEntry = {\n id,\n priority,\n handler: () => handlerRef.current(),\n }\n insertSorted(entry)\n\n return () => remove(id)\n }, [priority, enabled])\n}\n","import { useId, type CSSProperties } from 'react'\nimport { cn } from '../../utils/cn'\nimport './UILoader.css'\n\nexport type UILoaderTone = 'neutral' | 'blue' | 'green'\n\nexport interface UILoaderProps {\n /** Visual height. Width follows the mark's aspect ratio. */\n size?: number | string\n tone?: UILoaderTone\n className?: string\n style?: CSSProperties\n label?: string\n /** Use when another nearby element already announces loading. */\n ariaHidden?: boolean\n}\n\nconst LEFT = 'M0 53C0 51 1.6 49.5 3.6 49.5h16.5c1 0 1.9.4 2.5 1L42.1 69.6c.7.7 1.1 1.6 1.1 2.5v16.2c0 2-1.6 3.5-3.6 3.5H23.1c-1 0-1.9-.4-2.5-1L1.1 71.7C.4 71 0 70.1 0 69.2V53Z'\nconst CENTER = 'M0 3.5C0 1.6 1.6 0 3.6 0h16.5c1 0 1.9.4 2.5 1L92.5 69.6c.7.7 1 1.6 1 2.5v16.2c0 2-1.6 3.5-3.6 3.5H73.4c-1 0-1.9-.4-2.5-1L1.1 22.2C.4 21.6 0 20.7 0 19.7V3.5Z'\nconst RIGHT = 'M50.4 3.5C50.4 1.6 52 0 54 0h16.5c1 0 1.9.4 2.5 1l69.8 68.6c.7.7 1.1 1.6 1.1 2.5v16.2c0 2-1.6 3.5-3.6 3.5h-16.5c-1 0-1.9-.4-2.5-1L51.4 22.2c-.7-.6-1-1.5-1-2.5V3.5Z'\n\n/** A branded shine loader for whole UI surfaces, not component-level content. */\nexport function UILoader({ size = 48, tone = 'neutral', className, style, label = 'Loading', ariaHidden = false }: UILoaderProps) {\n const rawId = useId().replace(/[^a-zA-Z0-9_-]/g, '')\n const clipId = `fractal-ui-loader-clip-${rawId}`\n const gradientId = `fractal-ui-loader-gradient-${rawId}`\n const height = typeof size === 'number' ? `${size}px` : size\n\n return (\n <span\n aria-hidden={ariaHidden || undefined}\n aria-label={ariaHidden ? undefined : label}\n className={cn('fractal-ui-loader', `fractal-ui-loader--${tone}`, className)}\n role={ariaHidden ? undefined : 'status'}\n style={style}\n >\n <svg aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 144 92\" style={{ height, width: 'auto' }}>\n <defs>\n <linearGradient id={gradientId} x1=\"59\" x2=\"94.3\" y1=\"0\" y2=\"89.1\" gradientUnits=\"userSpaceOnUse\">\n <stop className=\"fractal-ui-loader__stop-start\" offset=\"0\" />\n <stop className=\"fractal-ui-loader__stop-end\" offset=\"1\" />\n </linearGradient>\n <linearGradient id={`${gradientId}-shine`} x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset=\"0.4\" stopColor=\"white\" stopOpacity=\"0\" />\n <stop offset=\"0.5\" stopColor=\"white\" stopOpacity=\"0.62\" />\n <stop offset=\"0.6\" stopColor=\"white\" stopOpacity=\"0\" />\n </linearGradient>\n <clipPath id={clipId}><path d={LEFT} /><path d={CENTER} /><path d={RIGHT} /></clipPath>\n </defs>\n <path d={CENTER} fill={`url(#${gradientId})`} />\n <path d={RIGHT} fill={`url(#${gradientId})`} />\n <path d={LEFT} fill={`url(#${gradientId})`} />\n <g clipPath={`url(#${clipId})`}>\n <g className=\"fractal-ui-loader__shine-axis\" transform=\"translate(72 46) rotate(68.4)\">\n <rect className=\"fractal-ui-loader__shine\" x=\"-160\" y=\"-100\" width=\"320\" height=\"200\" fill={`url(#${gradientId}-shine)`} />\n </g>\n </g>\n </svg>\n </span>\n )\n}\n","import { useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Ellipsis } from '@mirror-physics/fractal-icons'\nimport { Button } from '../Button'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\n\nexport interface TableOverflowMenuItem {\n value: string\n label: string\n icon?: ReactNode\n disabled?: boolean\n}\nexport interface TableOverflowMenuConfig<T> {\n items: (row: T, index: number) => TableOverflowMenuItem[]\n onSelect: (value: string, row: T, index: number) => void\n getLabel?: (row: T, index: number) => string\n isDisabled?: (row: T, index: number) => boolean\n}\n\n/** Portal-backed actions so a frozen table edge never clips its menu. */\nexport function TableOverflowMenu({ items, label, disabled, onSelect }: { items: TableOverflowMenuItem[]; label: string; disabled?: boolean; onSelect: (value: string) => void }) {\n const id = useId()\n const trigger = useRef<HTMLButtonElement>(null)\n const panel = useRef<HTMLDivElement>(null)\n const initialLast = useRef(false)\n const [open, setOpen] = useState(false)\n const [position, setPosition] = useState({ top: 0, left: 0 })\n const buttons = () => [...(panel.current?.querySelectorAll<HTMLButtonElement>('button:not(:disabled)') ?? [])]\n const close = (restore = true) => { setOpen(false); if (restore) trigger.current?.focus({ preventScroll: true }) }\n\n useEscapeDismiss(100, () => close(), open)\n\n useLayoutEffect(() => {\n if (!open || !trigger.current || !panel.current) return\n const place = () => {\n const anchor = trigger.current!.getBoundingClientRect()\n const menu = panel.current!.getBoundingClientRect()\n const above = window.innerHeight - anchor.bottom < menu.height + 8 && anchor.top > window.innerHeight - anchor.bottom\n setPosition({\n top: Math.max(8, Math.min(above ? anchor.top - menu.height - 4 : anchor.bottom + 4, window.innerHeight - menu.height - 8)),\n left: Math.max(8, Math.min(anchor.right - menu.width, window.innerWidth - menu.width - 8)),\n })\n }\n place()\n const enabled = buttons()\n ;(initialLast.current ? enabled[enabled.length - 1] : enabled[0])?.focus({ preventScroll: true })\n if (enabled.length === 0) panel.current.focus({ preventScroll: true })\n const outside = (event: PointerEvent) => {\n if (!panel.current?.contains(event.target as Node) && !trigger.current?.contains(event.target as Node)) setOpen(false)\n }\n const scroll = (event: Event) => { if (!panel.current?.contains(event.target as Node)) setOpen(false) }\n const observer = new ResizeObserver(place)\n observer.observe(panel.current)\n document.addEventListener('pointerdown', outside)\n window.addEventListener('scroll', scroll, true)\n window.addEventListener('resize', place)\n return () => {\n observer.disconnect()\n document.removeEventListener('pointerdown', outside)\n window.removeEventListener('scroll', scroll, true)\n window.removeEventListener('resize', place)\n }\n }, [open])\n useLayoutEffect(() => { if (disabled || items.length === 0) setOpen(false) }, [disabled, items.length])\n\n if (items.length === 0) return null\n return <div className=\"fractal-table-overflow-trigger\">\n <Button ref={trigger} buttonType=\"ghost\" controlSize=\"sm\" hasIconOnly icon={<Ellipsis aria-hidden />}\n aria-label={label} aria-haspopup=\"menu\" aria-expanded={open} aria-controls={open ? id : undefined} disabled={disabled}\n onClick={() => { initialLast.current = false; setOpen(!open) }}\n onKeyDown={event => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault(); initialLast.current = event.key === 'ArrowUp'; setOpen(true)\n }\n }} />\n {open && createPortal(<div ref={panel} id={id} role=\"menu\" tabIndex={-1} aria-label={label}\n className=\"fractal-table-overflow-menu\" style={position}\n onClick={event => event.stopPropagation()}\n onKeyDown={event => {\n event.stopPropagation()\n const enabled = buttons(), index = enabled.indexOf(document.activeElement as HTMLButtonElement)\n if (event.key === 'Escape') { event.preventDefault(); close() }\n else if (event.key === 'Tab') { close() }\n else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n event.preventDefault()\n const next = event.key === 'Home' ? 0 : event.key === 'End' ? enabled.length - 1 : (index + (event.key === 'ArrowDown' ? 1 : -1) + enabled.length) % enabled.length\n enabled[next]?.focus()\n } else if (event.key.length === 1 && /\\S/.test(event.key)) {\n const ordered = [...enabled.slice(index + 1), ...enabled.slice(0, index + 1)]\n ordered.find(button => button.textContent?.trim().toLocaleLowerCase().startsWith(event.key.toLocaleLowerCase()))?.focus()\n }\n }}>\n {items.map(item => <button key={item.value} type=\"button\" role=\"menuitem\" tabIndex={-1} disabled={item.disabled}\n onClick={() => { onSelect(item.value); close() }}>\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}{item.label}\n </button>)}\n </div>, document.body)}\n </div>\n}\n","import { useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport './TableLayout.css'\n\nexport interface TableColumnSizing {\n /** Preferred column width. Percentage widths require layout=\"fill\". */\n width?: string\n /** Minimum content width, including cell padding. */\n minWidth?: number | string\n /** Maximum content width, including cell padding. Defaults adapt to the table container. */\n maxWidth?: number | string\n}\nexport interface TableLayoutProps {\n /** Defaults to fill: distribute spare width across content-sized columns; overflow at their preferred widths. Content opts out of expansion. */\n layout?: 'content' | 'fill'\n /** Keeps column headers at the top of this table's scroll viewport. */\n stickyHeader?: boolean\n /** Keeps the first data column (and selection column, if present) visible. */\n stickyFirstColumn?: boolean\n /** Bounds vertical scrolling. Required for sticky headers during vertical scrolling. */\n maxHeight?: number | string\n}\nconst length = (value: number | string | undefined) => typeof value === 'number' ? `${value}px` : value\nexport function columnStyle(column: TableColumnSizing): CSSProperties {\n return {\n width: column.width,\n '--table-column-width': !column.width || column.width.includes('%') ? undefined : `calc(${column.width} - 1px)`,\n '--table-column-min': length(column.minWidth),\n '--table-column-max': length(column.maxWidth),\n } as CSSProperties\n}\n\n/** Only overflowing regions enter the tab order. Observe content as well as its viewport. */\nfunction useOverflow() {\n const ref = useRef<HTMLDivElement>(null)\n const [overflow, setOverflow] = useState(false)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const measure = () => setOverflow(el.scrollWidth > el.clientWidth + 1 || el.scrollHeight > el.clientHeight + 1)\n const resize = new ResizeObserver(measure)\n const observe = () => {\n resize.disconnect()\n resize.observe(el)\n for (const child of el.children) resize.observe(child)\n measure()\n }\n const mutation = new MutationObserver(observe)\n mutation.observe(el, { childList: true, subtree: true, characterData: true })\n observe()\n return () => { resize.disconnect(); mutation.disconnect() }\n }, [])\n return { ref, overflow }\n}\n\nexport function TableViewport({ children, maxHeight, label }: { children: ReactNode; maxHeight?: number | string; label: string }) {\n const { ref, overflow } = useOverflow()\n return <div ref={ref} className=\"fractal-table-viewport\" style={{ maxHeight }} tabIndex={overflow ? 0 : undefined} role={overflow ? 'region' : undefined} aria-label={overflow ? `${label}, scrollable table` : undefined}>{children}</div>\n}\n\nexport function TableCellContent({ children, label }: { children: ReactNode; label: string }) {\n const { ref, overflow } = useOverflow()\n useLayoutEffect(() => {\n const cell = ref.current\n if (!cell) return\n // Browsers can latch an ongoing trackpad gesture to its initial scroller.\n // At an edge, explicitly pass horizontal wheel motion to the table.\n const wheel = (event: WheelEvent) => {\n if (event.defaultPrevented || event.ctrlKey || !event.cancelable || Math.abs(event.deltaX) <= Math.abs(event.deltaY)) return\n const range = cell.scrollWidth - cell.clientWidth\n if (range <= 1) return\n const rtl = getComputedStyle(cell).direction === 'rtl'\n const left = rtl ? -range : 0, right = rtl ? 0 : range\n if (event.deltaX > 0 ? cell.scrollLeft < right - 1 : cell.scrollLeft > left + 1) return\n const table = cell.closest<HTMLElement>('.fractal-table-viewport')\n if (!table) return\n const tableRange = table.scrollWidth - table.clientWidth\n const tableRtl = getComputedStyle(table).direction === 'rtl'\n const tableLeft = tableRtl ? -tableRange : 0, tableRight = tableRtl ? 0 : tableRange\n if (event.deltaX > 0 ? table.scrollLeft >= tableRight - 1 : table.scrollLeft <= tableLeft + 1) return\n const unit = event.deltaMode === 1 ? parseFloat(getComputedStyle(cell).lineHeight) || 16 : event.deltaMode === 2 ? table.clientWidth : 1\n event.preventDefault()\n table.scrollLeft += event.deltaX * unit\n }\n cell.addEventListener('wheel', wheel, { passive: false })\n return () => cell.removeEventListener('wheel', wheel)\n }, [ref])\n return <div ref={ref} className=\"fractal-table-cell-scroll\" data-overflow={overflow || undefined}\n tabIndex={overflow ? 0 : undefined} role={overflow ? 'region' : undefined} aria-label={overflow ? `${label}, scroll horizontally for full content` : undefined}\n onKeyDown={event => {\n if (!overflow || event.target !== event.currentTarget) return\n // Keep cell navigation separate from table scroll and row activation.\n if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n event.preventDefault(); event.stopPropagation()\n const el = event.currentTarget\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') el.scrollBy({ left: event.key === 'ArrowLeft' ? -40 : 40 })\n else el.scrollLeft = event.key === 'Home' ? 0 : el.scrollWidth * (getComputedStyle(el).direction === 'rtl' ? -1 : 1)\n } else if (event.key === ' ' || event.key === 'Enter') event.stopPropagation()\n }}>\n <div className=\"fractal-table-cell-content\">{children}</div>\n </div>\n}\n","import { TableOverflowMenu, type TableOverflowMenuConfig } from '../TableLayout/TableOverflowMenu'\nimport { TableViewport, TableCellContent, columnStyle, type TableColumnSizing, type TableLayoutProps } from '../TableLayout/TableLayout'\nimport type { ReactNode } from 'react'\nimport { cn } from '../../utils/cn'\nimport './DataTable.css'\n\nexport interface DataTableColumn<T> extends TableColumnSizing {\n key: string\n header: string\n width?: string\n render: (row: T, index: number) => ReactNode\n}\n\nexport interface DataTableProps<T> extends TableLayoutProps {\n 'aria-label'?: string\n /** Adds a trailing, sticky row-actions column with an overflow menu. */\n overflowMenu?: TableOverflowMenuConfig<T>\n columns: DataTableColumn<T>[]\n data: T[]\n emptyMessage?: string\n header?: ReactNode\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport function DataTable<T>({ columns, data, emptyMessage, header, size = 'md', className, overflowMenu, layout = 'fill', stickyHeader = false, stickyFirstColumn = false, maxHeight, 'aria-label': ariaLabel = 'Data table' }: DataTableProps<T>) {\n return (\n <div className={cn('fractal-table-layout', 'fractal-datatable', `fractal-datatable--${size}`, className)} data-overflow-menu={Boolean(overflowMenu)} data-table-layout={layout} data-sticky-first={stickyFirstColumn} data-sticky-header={stickyHeader}>\n <div className=\"fractal-datatable-surface\">\n {header && (\n <div className=\"fractal-datatable-header\">\n {header}\n </div>\n )}\n\n {data.length === 0 ? (\n <div className=\"fractal-datatable-empty\">\n {emptyMessage || 'No data'}\n </div>\n ) : (\n <TableViewport maxHeight={maxHeight} label={ariaLabel}><table aria-label={ariaLabel} className=\"fractal-datatable-table\">\n <thead>\n <tr className=\"fractal-datatable-thead-row\">\n {columns.map((col, columnIndex) => (\n <th scope=\"col\" key={col.key} className=\"fractal-datatable-th\" style={columnStyle(col)} data-pinned-column={columnIndex === 0 ? 'data' : undefined}>\n <TableCellContent label={`${col.header} column`}>{col.header}</TableCellContent>\n </th>\n ))}\n {overflowMenu && <th scope=\"col\" aria-label=\"Row actions\" className=\"fractal-datatable-th fractal-table-overflow-cell\" data-pinned-column=\"overflow\" />}\n </tr>\n </thead>\n <tbody>\n {data.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n className=\"fractal-datatable-row\"\n >\n {columns.map((col, columnIndex) => (\n <td key={col.key} className=\"fractal-datatable-td\" style={columnStyle(col)} data-pinned-column={columnIndex === 0 ? 'data' : undefined}>\n <TableCellContent label={`${col.header || 'Value'}, row ${rowIndex + 1}`}>{col.render(row, rowIndex)}</TableCellContent>\n </td>\n ))}\n {overflowMenu && <td className=\"fractal-datatable-td fractal-table-overflow-cell\" data-pinned-column=\"overflow\">\n <TableOverflowMenu items={overflowMenu.items(row, rowIndex)} label={overflowMenu.getLabel?.(row, rowIndex) ?? `Actions for row ${rowIndex + 1}`} disabled={overflowMenu.isDisabled?.(row, rowIndex)} onSelect={value => overflowMenu.onSelect(value, row, rowIndex)} />\n </td>}\n </tr>\n ))}\n </tbody>\n </table></TableViewport>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check, MagnifyingGlass, ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\nimport { positionDropdown } from './position'\nimport type { ControlSize } from '../../utils/control-size'\nimport '../../styles/control.css'\nimport './Dropdown.css'\nimport '../../styles/floating-field.css'\n\nexport interface DropdownItem {\n value: string\n icon?: React.ReactNode\n description?: string | React.ReactNode\n border?: 'top' | 'bottom'\n kind?: 'item' | 'header'\n trailing?: React.ReactNode\n}\n\nexport interface DropdownProps {\n items: DropdownItem[]\n selectedValue?: string\n onSelect?: (value: string) => void\n /** Checkbox-style options that remain open after selection. */\n multiple?: boolean\n selectedValues?: string[]\n onSelectionChange?: (values: string[]) => void\n searchable?: boolean\n searchPlaceholder?: string\n emptyMessage?: string\n triggerLabel?: string\n /** Floating field title. Empty selectedValue is the unfilled state. */\n fieldLabel?: string\n direction?: 'up' | 'down' | 'left' | 'right'\n /** Preferred alignment; shifted as needed to stay inside visible bounds. */\n align?: 'left' | 'right'\n /** Maximum menu height in pixels, further limited by available space. Default: 320. */\n maxHeight?: number\n /** Minimum inset from the viewport and clipping ancestors in pixels. Default: 8. */\n collisionPadding?: number\n /** Arranges the trigger content vertically without rotating the dropdown panel. */\n triggerOrientation?: 'horizontal' | 'vertical'\n triggerContent?: React.ReactNode\n label?: React.ReactNode\n /** Renders the trigger as a square icon button. Requires an accessible triggerLabel. */\n iconOnly?: boolean\n noChevron?: boolean\n /** Shared visual density; takes precedence over size. */\n controlSize?: ControlSize\n /** Backward-compatible size alias. */\n size?: ControlSize\n /** Connect a persistent Label with htmlFor to the trigger. */\n triggerId?: string\n triggerVariant?: 'outline' | 'tertiary'\n className?: string\n triggerClassName?: string\n panelClassName?: string\n closeOnSelect?: boolean\n disabled?: boolean\n}\n\nexport function Dropdown({\n items,\n selectedValue = '',\n onSelect,\n multiple = false,\n selectedValues = [],\n onSelectionChange,\n searchable = false,\n searchPlaceholder = 'Find an option',\n emptyMessage = 'No matching options.',\n triggerLabel,\n fieldLabel,\n direction = 'down',\n align = 'left',\n maxHeight = 320,\n collisionPadding = 8,\n triggerOrientation = 'horizontal',\n triggerContent,\n label,\n iconOnly = false,\n noChevron = false,\n size: sizeAlias = 'lg',\n controlSize,\n triggerId,\n triggerVariant = 'outline',\n className,\n triggerClassName,\n panelClassName,\n closeOnSelect = true,\n disabled = false,\n}: DropdownProps) {\n const [query, setQuery] = React.useState('')\n const searchRef = React.useRef<HTMLInputElement>(null)\n\n const accessibleLabel = triggerLabel ?? fieldLabel ?? 'Options'\n const size = controlSize ?? sizeAlias\n const [open, setOpen] = React.useState(false)\n React.useEffect(() => { if (!open) setQuery('') }, [open])\n const rootRef = React.useRef<HTMLDivElement>(null)\n const menuId = React.useId()\n const focusOnOpen = React.useRef(false)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [panelStyle, setPanelStyle] = React.useState<React.CSSProperties>({})\n\n const renderableItems = items.filter(\n (item) =>\n item.icon != null ||\n (item.description != null &&\n (typeof item.description === 'string' ? item.description !== '' : true))\n )\n\n const normalizedQuery = query.trim().toLocaleLowerCase()\n let groupTitle = ''\n const matching = new Set(renderableItems.filter(item => {\n if (item.kind === 'header') { groupTitle = String(item.description ?? ''); return false }\n return `${groupTitle} ${typeof item.description === 'string' ? item.description : item.value}`.toLocaleLowerCase().includes(normalizedQuery)\n }).map(item => item.value))\n const visibleItems = renderableItems.filter((item, index) => {\n if (item.kind !== 'header') return matching.has(item.value)\n const nextHeader = renderableItems.findIndex((next, i) => i > index && next.kind === 'header')\n return renderableItems.slice(index + 1, nextHeader < 0 ? undefined : nextHeader).some(next => matching.has(next.value))\n })\n const selectableItems = visibleItems.filter((i) => i.kind !== 'header')\n const selected = items.find((i) => i.value === selectedValue && i.kind !== 'header') ?? selectableItems[0] ?? visibleItems[0]\n const ChevronIcon = direction === 'up'\n ? ChevronUp\n : direction === 'left'\n ? ChevronLeft\n : direction === 'right'\n ? ChevronRight\n : ChevronDown\n\n useEscapeDismiss(100, () => {\n setOpen(false)\n triggerRef.current?.focus()\n }, open)\n\n React.useLayoutEffect(() => {\n const root = rootRef.current\n const trigger = triggerRef.current\n const panel = panelRef.current\n if (!open || !root || !trigger || !panel) return\n\n const updatePosition = () => {\n const viewport = window.visualViewport\n const bounds = {\n left: viewport?.offsetLeft ?? 0,\n top: viewport?.offsetTop ?? 0,\n right: (viewport?.offsetLeft ?? 0) + (viewport?.width ?? document.documentElement.clientWidth),\n bottom: (viewport?.offsetTop ?? 0) + (viewport?.height ?? document.documentElement.clientHeight),\n }\n // Respect scroll containers too, so an absolute menu cannot be clipped by them.\n for (let ancestor = root.parentElement; ancestor; ancestor = ancestor.parentElement) {\n const style = getComputedStyle(ancestor)\n const rect = ancestor.getBoundingClientRect()\n if (/(auto|scroll|hidden|clip)/.test(style.overflowX)) {\n bounds.left = Math.max(bounds.left, rect.left + ancestor.clientLeft)\n bounds.right = Math.min(bounds.right, rect.left + ancestor.clientLeft + ancestor.clientWidth)\n }\n if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {\n bounds.top = Math.max(bounds.top, rect.top + ancestor.clientTop)\n bounds.bottom = Math.min(bounds.bottom, rect.top + ancestor.clientTop + ancestor.clientHeight)\n }\n }\n const padding = Math.max(0, collisionPadding)\n bounds.left += padding\n bounds.right = Math.max(bounds.left, bounds.right - padding)\n bounds.top += padding\n bounds.bottom = Math.max(bounds.top, bounds.bottom - padding)\n const triggerRect = trigger.getBoundingClientRect()\n const rootRect = root.getBoundingClientRect()\n const availableWidth = bounds.right - bounds.left\n const heightLimit = Math.max(0, maxHeight)\n // Measure the full scroll content without expanding the scroll viewport.\n // Temporarily lifting max-height would reset scrollTop near the last option.\n panel.style.maxWidth = `${availableWidth}px`\n panel.style.minWidth = `${Math.min(triggerRect.width, availableWidth)}px`\n const panelRect = panel.getBoundingClientRect()\n const desiredHeight = Math.min(heightLimit, panel.scrollHeight + panel.offsetHeight - panel.clientHeight)\n const position = positionDropdown(triggerRect, { width: panelRect.width, height: desiredHeight }, bounds, direction, align)\n const nextStyle = {\n left: position.left - rootRect.left - root.clientLeft + root.scrollLeft,\n top: position.top - rootRect.top - root.clientTop + root.scrollTop,\n minWidth: Math.min(triggerRect.width, availableWidth),\n maxWidth: availableWidth,\n maxHeight: Math.min(heightLimit, position.maxHeight),\n }\n // Apply the final constraints synchronously, including ResizeObserver callbacks.\n for (const key of Object.keys(nextStyle) as (keyof typeof nextStyle)[]) {\n panel.style[key] = `${nextStyle[key]}px`\n }\n setPanelStyle(previous => Object.entries(nextStyle).every(([key, value]) => previous[key as keyof React.CSSProperties] === value)\n ? previous : nextStyle)\n }\n\n updatePosition()\n if (searchable && !panel.contains(document.activeElement)) searchRef.current?.focus({ preventScroll: true })\n if (focusOnOpen.current) {\n focusOnOpen.current = false\n const option = panel.querySelector<HTMLButtonElement>('[aria-selected=\"true\"]')\n ?? panel.querySelector<HTMLButtonElement>('[role=\"option\"]')\n option?.focus({ preventScroll: true })\n option?.scrollIntoView({ block: 'nearest' })\n }\n const resize = new ResizeObserver(updatePosition)\n resize.observe(root)\n resize.observe(panel)\n for (let ancestor = root.parentElement; ancestor; ancestor = ancestor.parentElement) {\n resize.observe(ancestor)\n }\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition, true)\n window.visualViewport?.addEventListener('resize', updatePosition)\n window.visualViewport?.addEventListener('scroll', updatePosition)\n return () => {\n resize.disconnect()\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition, true)\n window.visualViewport?.removeEventListener('resize', updatePosition)\n window.visualViewport?.removeEventListener('scroll', updatePosition)\n }\n }, [open, direction, align, maxHeight, collisionPadding, items, label, query, searchable])\n\n React.useEffect(() => {\n if (!open) return\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node\n if (triggerRef.current?.contains(target) || panelRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [open])\n\n if (renderableItems.length === 0) return null\n\n return (\n <div ref={rootRef} data-control-size={size} data-filled={multiple ? selectedValues.length > 0 : Boolean(selectedValue)} data-open={open} className={cn('fractal-dropdown', fieldLabel && 'fractal-floating-field fractal-floating-field--dropdown', className)}>\n <button\n ref={triggerRef}\n id={triggerId ?? `${menuId}-trigger`}\n data-control-size={size}\n type=\"button\"\n disabled={disabled}\n aria-haspopup={searchable ? \"dialog\" : \"listbox\"}\n aria-expanded={open}\n aria-controls={open ? (searchable ? menuId : `${menuId}-options`) : undefined}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault()\n if (open) {\n const option = panelRef.current?.querySelector<HTMLButtonElement>('[aria-selected=\"true\"]')\n ?? panelRef.current?.querySelector<HTMLButtonElement>('[role=\"option\"]')\n option?.focus({ preventScroll: true })\n option?.scrollIntoView({ block: 'nearest' })\n } else {\n focusOnOpen.current = true\n setOpen(true)\n }\n }\n }}\n aria-label={accessibleLabel}\n onClick={() => setOpen((o) => !o)}\n className={cn(\n 'fractal-control',\n 'fractal-dropdown-trigger',\n `fractal-dropdown-trigger--${size}`,\n `fractal-dropdown-trigger--${triggerVariant}`,\n `fractal-dropdown-trigger--${triggerOrientation}`,\n iconOnly && 'fractal-dropdown-trigger--icon-only',\n triggerClassName,\n )}\n >\n <span className={fieldLabel ? \"fractal-dropdown-field-value\" : undefined} style={fieldLabel ? undefined : { display: \"contents\" }}>\n {triggerContent != null ? (\n triggerContent\n ) : (\n <>\n {selected?.icon != null && (\n <span className=\"fractal-dropdown-icon fractal-dropdown-icon--trigger\">{selected?.icon}</span>\n )}\n {selected?.description != null &&\n (typeof selected?.description !== 'string' || selected?.description !== '') && (\n <span className=\"fractal-dropdown-selected-text\">{selected?.description}</span>\n )}\n </>\n )}\n </span>\n {!noChevron && !iconOnly && (\n <span className=\"fractal-dropdown-chevron\" aria-hidden>\n <ChevronIcon size={size === 'sm' ? 14 : 16} />\n </span>\n )}\n </button>\n {fieldLabel ? <label className=\"fractal-floating-field__label\" htmlFor={triggerId ?? `${menuId}-trigger`}>{fieldLabel}</label> : null}\n\n {open && (\n <div\n ref={panelRef}\n id={menuId}\n onKeyDown={(event) => {\n if (event.target === searchRef.current && event.key !== \"ArrowDown\") return\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return\n event.preventDefault()\n const options = Array.from(panelRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]') ?? [])\n const current = options.indexOf(document.activeElement as HTMLButtonElement)\n const index = event.key === \"Home\" ? 0 : event.key === \"End\" ? options.length - 1\n : (current + (event.key === \"ArrowDown\" ? 1 : -1) + options.length) % options.length\n options[index]?.focus({ preventScroll: true })\n options[index]?.scrollIntoView({ block: \"nearest\" })\n }}\n role={searchable ? \"dialog\" : undefined}\n aria-label={accessibleLabel}\n className={cn('fractal-dropdown-panel', `fractal-dropdown-panel--${size}`, panelClassName)}\n style={panelStyle}\n >\n {searchable && <div className=\"fractal-dropdown-search\">\n <MagnifyingGlass aria-hidden=\"true\" />\n <input ref={searchRef} type=\"search\" aria-label={searchPlaceholder} placeholder={searchPlaceholder} value={query} onChange={event => setQuery(event.target.value)} />\n </div>}\n <div role=\"listbox\" id={`${menuId}-options`} aria-label={accessibleLabel} aria-multiselectable={multiple || undefined}>\n {label != null && (\n <div className=\"fractal-dropdown-label\">{label}</div>\n )}\n {visibleItems.map((item, index) => {\n const topDivider = item.border === 'top' ? <div className=\"fractal-dropdown-separator\" /> : null\n const bottomDivider = item.border === 'bottom' ? <div className=\"fractal-dropdown-separator\" /> : null\n if (item.kind === 'header') {\n return (\n <React.Fragment key={`header-${index}`}>\n {topDivider}\n <div role=\"presentation\" className=\"fractal-dropdown-label\">\n {item.description}\n </div>\n {bottomDivider}\n </React.Fragment>\n )\n }\n const isSelected = multiple ? selectedValues.includes(item.value) : item.value === selectedValue\n return (\n <React.Fragment key={item.value}>\n {topDivider}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n if (multiple) onSelectionChange?.(isSelected ? selectedValues.filter(value => value !== item.value) : [...selectedValues, item.value])\n else onSelect?.(item.value)\n if (!multiple && closeOnSelect) {\n setOpen(false)\n triggerRef.current?.focus()\n }\n }}\n className=\"fractal-dropdown-option\"\n >\n {multiple && <span className=\"fractal-dropdown-checkbox\" data-checked={isSelected} aria-hidden=\"true\">{isSelected && <Check />}</span>}\n {item.icon != null && (\n <span className=\"fractal-dropdown-icon\">{item.icon}</span>\n )}\n {item.description != null &&\n (typeof item.description !== 'string' || item.description !== '') && (\n <span className=\"fractal-dropdown-option-text\">\n {item.description}\n </span>\n )}\n {item.trailing != null && (\n <span className=\"fractal-dropdown-trailing\">{item.trailing}</span>\n )}\n </button>\n {bottomDivider}\n </React.Fragment>\n )\n })}\n </div>\n {!selectableItems.length && <p role=\"status\" className=\"fractal-dropdown-label\">{emptyMessage}</p>}\n </div>\n )}\n </div>\n )\n}\n","interface Bounds {\n left: number\n right: number\n top: number\n bottom: number\n}\n\n/** Coordinates are in viewport pixels; the caller converts to its containing block. */\nexport function positionDropdown(\n trigger: Bounds,\n panel: { width: number; height: number },\n bounds: Bounds,\n direction: 'up' | 'down' | 'left' | 'right',\n align: 'left' | 'right',\n) {\n const gap = 4\n const width = Math.min(panel.width, Math.max(0, bounds.right - bounds.left))\n let maxHeight = Math.max(0, bounds.bottom - bounds.top)\n let left: number\n let top: number\n\n if (direction === 'left' || direction === 'right') {\n const after = bounds.right - trigger.right - gap\n const before = trigger.left - bounds.left - gap\n let placeRight = direction === 'right'\n if (width > (placeRight ? after : before) && (placeRight ? before > after : after > before)) {\n placeRight = !placeRight\n }\n left = placeRight ? trigger.right + gap : trigger.left - width - gap\n top = trigger.top\n } else {\n const below = Math.max(0, bounds.bottom - trigger.bottom - gap)\n const above = Math.max(0, trigger.top - bounds.top - gap)\n let placeAbove = direction === 'up'\n if (panel.height > (placeAbove ? above : below) && (placeAbove ? below > above : above > below)) {\n placeAbove = !placeAbove\n }\n maxHeight = Math.min(maxHeight, placeAbove ? above : below)\n top = placeAbove ? trigger.top - Math.min(panel.height, maxHeight) - gap : trigger.bottom + gap\n left = align === 'right' ? trigger.right - width : trigger.left\n }\n\n const height = Math.min(panel.height, maxHeight)\n return {\n left: Math.max(bounds.left, Math.min(left, bounds.right - width)),\n top: Math.max(bounds.top, Math.min(top, bounds.bottom - height)),\n maxHeight,\n }\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Link.css'\n\nexport type LinkTheme = 'default' | 'muted' | 'accent'\nexport type LinkSize = 'sm' | 'md' | 'lg'\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n theme?: LinkTheme\n size?: LinkSize\n}\n\nconst Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n ({ className, theme = 'default', size = 'md', ...props }, ref) => (\n <a\n ref={ref}\n className={cn('fractal-link', `fractal-link--${theme}`, `fractal-link--${size}`, className)}\n {...props}\n />\n )\n)\nLink.displayName = 'Link'\n\nexport { Link }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Chip.css'\n\nexport type ChipTone = 'neutral' | 'success' | 'warning' | 'error' | 'info'\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: ChipTone\n}\n\nconst Chip = React.forwardRef<HTMLSpanElement, ChipProps>(\n ({ className, tone = 'neutral', ...props }, ref) => (\n <span\n ref={ref}\n className={cn('fractal-chip', `fractal-chip--${tone}`, className)}\n {...props}\n />\n )\n)\nChip.displayName = 'Chip'\n\nexport { Chip }\n","import * as React from 'react'\nimport { Checkbox as CheckboxIcon, CheckboxChecked, Minus } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Checkbox.css'\n\nexport interface CheckboxProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n indeterminate?: boolean\n onCheckedChange: (checked: boolean) => void\n}\n\nexport function Checkbox({\n checked,\n indeterminate = false,\n onCheckedChange,\n className,\n disabled,\n onClick,\n onKeyDown,\n ...props\n}: CheckboxProps) {\n return (\n <button\n {...props}\n className={cn(\n 'fractal-checkbox',\n (checked || indeterminate) && 'fractal-checkbox--checked',\n indeterminate && 'fractal-checkbox--indeterminate',\n className,\n )}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n disabled={disabled}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) onCheckedChange(indeterminate || !checked)\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event)\n if (event.key === ' ' || event.key === 'Enter') event.stopPropagation()\n }}\n >\n {indeterminate ? (\n <span className=\"fractal-checkbox__indeterminate-icon\" aria-hidden=\"true\">\n <CheckboxIcon size={18} />\n <Minus className=\"fractal-checkbox__indeterminate-mark\" size={12} />\n </span>\n ) : checked ? (\n <CheckboxChecked aria-hidden=\"true\" size={18} />\n ) : (\n <CheckboxIcon aria-hidden=\"true\" size={18} />\n )}\n </button>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Radio.css'\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'children' | 'onChange' | 'type'> {\n label: React.ReactNode\n description?: React.ReactNode\n onCheckedChange?: (checked: boolean) => void\n}\n\nexport function Radio({\n checked,\n className,\n description,\n disabled,\n label,\n onCheckedChange,\n ...props\n}: RadioProps) {\n return (\n <label className={cn('fractal-radio', disabled && 'fractal-radio--disabled', className)}>\n <input\n {...props}\n checked={checked}\n className=\"fractal-radio__input\"\n disabled={disabled}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n type=\"radio\"\n />\n <span aria-hidden=\"true\" className=\"fractal-radio__control\">\n <span className=\"fractal-radio__dot\" />\n </span>\n <span className=\"fractal-radio__content\">\n <span className=\"fractal-radio__label\">{label}</span>\n {description && <span className=\"fractal-radio__description\">{description}</span>}\n </span>\n </label>\n )\n}\n","import { TableOverflowMenu, type TableOverflowMenuConfig } from '../TableLayout/TableOverflowMenu'\nimport { TableViewport, TableCellContent, columnStyle, type TableColumnSizing, type TableLayoutProps } from '../TableLayout/TableLayout'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { ArrowUp, ArrowDown, ArrowsUpDown } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport { Checkbox } from '../Checkbox'\nimport './SortableTable.css'\n\nexport type SortDirection = 'asc' | 'desc' | null\n\nexport interface SortableTableDefaultSort {\n key: string\n direction: Exclude<SortDirection, null>\n}\n\nexport interface SortableTableColumn<T> extends TableColumnSizing {\n key: string\n header: string\n width?: string\n sortable?: boolean\n sortAccessor?: (row: T) => string | number | null | undefined\n render: (row: T, index: number) => ReactNode\n align?: 'left' | 'right'\n}\n\nexport interface SortableTableRowAction<T> {\n label: (row: T, index: number) => string\n icon: (row: T, index: number) => ReactNode\n}\n\nexport interface SortableTableSelection<T> {\n /** Returns whether a row is selected. Selection is controlled by the consumer. */\n isSelected: (row: T) => boolean\n /** Called when an individual row changes selection. */\n onSelectedChange: (row: T, selected: boolean) => void\n /**\n * Handles the complete selectable row set in one update when the header\n * checkbox changes. Falls back to `onSelectedChange` for each row when omitted.\n */\n onSelectAllChange?: (rows: T[], selected: boolean) => void\n /** Accessible name for an individual row's checkbox. */\n getRowLabel: (row: T) => string\n /** Accessible name for the header checkbox. */\n selectAllLabel?: string\n}\n\nexport interface SortableTablePagination {\n page: number\n pageSize: number\n}\n\nexport interface SortableTableProps<T> extends TableLayoutProps {\n /** Adds a trailing, sticky row-actions column with an overflow menu. */\n overflowMenu?: TableOverflowMenuConfig<T>\n columns: SortableTableColumn<T>[]\n data: T[]\n /** Accessible name applied to the underlying table element. */\n 'aria-label'?: string\n emptyMessage?: string\n header?: ReactNode\n size?: 'sm' | 'md' | 'lg'\n /** Removes the table's outer border and radius for use inside another framed surface. */\n embedded?: boolean\n className?: string\n /** Required baseline row ordering that does not appear as an active user sort. */\n defaultSort: SortableTableDefaultSort\n /** Initial visible user sort state. */\n defaultSortKey?: string\n defaultSortDirection?: SortDirection\n sortKey?: string | null\n sortDirection?: SortDirection\n onSortChange?: (key: string | null, direction: SortDirection) => void\n /**\n * Slices the globally sorted dataset for display. Always pass the complete\n * filtered dataset in `data`; sorting is applied before pagination.\n */\n pagination?: SortableTablePagination\n highlightRow?: (row: T, index: number) => boolean\n /** Adds a leading checkbox column with controlled row selection. */\n selection?: SortableTableSelection<T>\n /** Disabled rows remain visible but cannot be selected or activated. */\n isRowDisabled?: (row: T) => boolean\n /** Disables only a row's selection control while preserving row activation. */\n isRowSelectionDisabled?: (row: T) => boolean\n /** Invoked when a row is selected. Enables pointer and keyboard row activation. */\n onRowClick?: (row: T, index: number) => void\n /** Invoked when a row is double-clicked. */\n onRowDoubleClick?: (row: T, index: number) => void\n /** Directional affordance displayed over the right edge of an interactive row. */\n rowAction?: SortableTableRowAction<T>\n}\n\nexport function SortableTable<T>({\n columns,\n data,\n 'aria-label': ariaLabel,\n emptyMessage,\n header,\n size = 'md',\n embedded = false,\n layout = 'fill',\n stickyHeader = false,\n stickyFirstColumn = false,\n maxHeight,\n overflowMenu,\n className,\n defaultSort,\n defaultSortKey = undefined,\n defaultSortDirection = null,\n sortKey: controlledKey,\n sortDirection: controlledDirection,\n onSortChange,\n pagination,\n highlightRow,\n selection,\n isRowDisabled,\n isRowSelectionDisabled,\n onRowClick,\n onRowDoubleClick,\n rowAction,\n}: SortableTableProps<T>) {\n const [internalKey, setInternalKey] = useState<string | null>(defaultSortKey ?? null)\n const [internalDirection, setInternalDirection] = useState<SortDirection>(defaultSortDirection)\n\n const isControlled = controlledKey !== undefined && controlledDirection !== undefined\n const activeKey = isControlled ? controlledKey : internalKey\n const activeDirection = isControlled ? controlledDirection : internalDirection\n const baselineKey = defaultSort?.key ?? null\n const baselineDirection = defaultSort?.direction ?? null\n const effectiveKey = activeKey && activeDirection ? activeKey : baselineKey\n const effectiveDirection = activeKey && activeDirection ? activeDirection : baselineDirection\n\n const sorted = useMemo(() => {\n if (!effectiveKey || !effectiveDirection) return data\n const col = columns.find((c) => c.key === effectiveKey)\n if (!col) return data\n const accessor =\n col.sortAccessor ??\n ((row: T) => {\n const value = (row as Record<string, unknown>)[effectiveKey]\n return typeof value === 'string' || typeof value === 'number' ? value : null\n })\n const copy = [...data]\n copy.sort((a, b) => {\n const av = accessor(a)\n const bv = accessor(b)\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n if (typeof av === 'number' && typeof bv === 'number') {\n return effectiveDirection === 'asc' ? av - bv : bv - av\n }\n const as = String(av).toLowerCase()\n const bs = String(bv).toLowerCase()\n if (as < bs) return effectiveDirection === 'asc' ? -1 : 1\n if (as > bs) return effectiveDirection === 'asc' ? 1 : -1\n return 0\n })\n return copy\n }, [data, columns, effectiveKey, effectiveDirection])\n\n const visibleRows = useMemo(() => {\n if (!pagination) return sorted\n\n const pageSize = Math.max(1, pagination.pageSize)\n const totalPages = Math.max(1, Math.ceil(sorted.length / pageSize))\n const page = Math.min(Math.max(1, pagination.page), totalPages)\n const startIndex = (page - 1) * pageSize\n return sorted.slice(startIndex, startIndex + pageSize)\n }, [pagination, sorted])\n\n const selectedRows = selection ? sorted.filter(selection.isSelected) : []\n const selectableRows = selection\n ? sorted.filter((row) => !isRowDisabled?.(row) && !isRowSelectionDisabled?.(row))\n : []\n const selectedRowCount = selection\n ? selectableRows.filter(selection.isSelected).length\n : 0\n const allRowsSelected = selectableRows.length > 0 && selectedRowCount === selectableRows.length\n const someRowsSelected = selectedRows.length > 0 && !allRowsSelected\n\n const handleSortClick = (key: string) => {\n let nextDirection: SortDirection\n if (!activeKey || !activeDirection) {\n nextDirection = baselineKey === key && baselineDirection ? baselineDirection : 'asc'\n } else if (activeKey !== key) {\n nextDirection = 'asc'\n } else if (baselineKey === key && baselineDirection) {\n nextDirection = activeDirection === baselineDirection\n ? baselineDirection === 'asc' ? 'desc' : 'asc'\n : null\n } else if (activeDirection === 'asc') {\n nextDirection = 'desc'\n } else {\n nextDirection = null\n }\n const nextKey = nextDirection === null ? null : key\n\n if (isControlled) {\n onSortChange?.(nextKey, nextDirection)\n } else {\n setInternalKey(nextKey)\n setInternalDirection(nextDirection)\n onSortChange?.(nextKey, nextDirection)\n }\n }\n\n return (\n <div className={cn('fractal-table-layout', 'fractal-sortable-table', `fractal-sortable-table--${size}`, embedded && 'fractal-sortable-table--embedded', className)} data-overflow-menu={Boolean(overflowMenu)} data-table-layout={layout} data-sticky-first={stickyFirstColumn} data-sticky-header={stickyHeader} data-table-selection={Boolean(selection)}>\n <div className=\"fractal-sortable-table-surface\">\n {header && <div className=\"fractal-sortable-table-header\">{header}</div>}\n\n {visibleRows.length === 0 ? (\n <div className=\"fractal-sortable-table-empty\">{emptyMessage || 'No data'}</div>\n ) : (\n <TableViewport maxHeight={maxHeight} label={ariaLabel || 'Data table'}><table aria-label={ariaLabel} className=\"fractal-sortable-table-table\">\n <thead>\n <tr className=\"fractal-sortable-table-thead-row\">\n {selection && (\n <th\n className=\"fractal-sortable-table-th fractal-sortable-table-selection-cell\" data-pinned-column=\"selection\"\n scope=\"col\"\n >\n <Checkbox\n aria-label={selection.selectAllLabel ?? 'Select all rows'}\n checked={allRowsSelected}\n disabled={selectableRows.length === 0 && selectedRows.length === 0}\n indeterminate={someRowsSelected}\n onCheckedChange={(checked) => {\n const rows = checked ? selectableRows : selectedRows\n if (selection.onSelectAllChange) {\n selection.onSelectAllChange(rows, checked)\n return\n }\n rows.forEach((row) => {\n if (selection.isSelected(row) !== checked) {\n selection.onSelectedChange(row, checked)\n }\n })\n }}\n />\n </th>\n )}\n {columns.map((col, columnIndex) => {\n const isActive = activeKey === col.key && activeDirection !== null\n if (!col.sortable) {\n return (\n <th\n key={col.key}\n className=\"fractal-sortable-table-th\"\n scope=\"col\"\n style={columnStyle(col)} data-pinned-column={columnIndex === 0 ? 'data' : undefined}\n >\n <TableCellContent label={`${col.header} column`}>{col.header}</TableCellContent>\n </th>\n )\n }\n return (\n <th\n key={col.key}\n className=\"fractal-sortable-table-th fractal-sortable-table-th--sortable\"\n scope=\"col\"\n style={columnStyle(col)} data-pinned-column={columnIndex === 0 ? 'data' : undefined}\n >\n <TableCellContent label={`${col.header} column`}><button\n type=\"button\"\n className={cn(\n 'fractal-sortable-table-sort-button',\n isActive && 'fractal-sortable-table-sort-button--active',\n )}\n onClick={() => handleSortClick(col.key)}\n aria-sort={\n isActive\n ? activeDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n }\n >\n <span>{col.header}</span>\n <span className=\"fractal-sortable-table-sort-icon\" aria-hidden=\"true\">\n {isActive && activeDirection === 'asc' ? (\n <ArrowUp size={14} />\n ) : isActive && activeDirection === 'desc' ? (\n <ArrowDown size={14} />\n ) : (\n <ArrowsUpDown size={14} />\n )}\n </span>\n </button></TableCellContent>\n </th>\n )\n })}\n {overflowMenu && <th scope=\"col\" aria-label=\"Row actions\" className=\"fractal-sortable-table-th fractal-table-overflow-cell\" data-pinned-column=\"overflow\" />}\n </tr>\n </thead>\n <tbody>\n {visibleRows.map((row, rowIndex) => {\n const highlighted = highlightRow?.(row, rowIndex) ?? false\n const disabled = isRowDisabled?.(row) ?? false\n const selectionDisabled = disabled || (isRowSelectionDisabled?.(row) ?? false)\n const interactive = !disabled && Boolean(onRowClick || onRowDoubleClick)\n const action = !disabled && rowAction ? {\n label: rowAction.label(row, rowIndex),\n icon: rowAction.icon(row, rowIndex),\n } : null\n return (\n <tr\n key={rowIndex}\n className={cn(\n 'fractal-sortable-table-row',\n highlighted && 'fractal-sortable-table-row--highlighted',\n interactive && 'fractal-sortable-table-row--interactive',\n disabled && 'fractal-sortable-table-row--disabled',\n )}\n data-disabled={disabled || undefined}\n onClick={!disabled && onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n onDoubleClick={!disabled && onRowDoubleClick ? () => onRowDoubleClick(row, rowIndex) : undefined}\n onKeyDown={interactive ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n const activateRow = onRowClick ?? onRowDoubleClick\n activateRow?.(row, rowIndex)\n }\n } : undefined}\n aria-label={action?.label}\n aria-disabled={disabled || undefined}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n >\n {selection && (\n <td className=\"fractal-sortable-table-td fractal-sortable-table-selection-cell\" data-pinned-column=\"selection\">\n <Checkbox\n aria-label={selection.getRowLabel(row)}\n checked={!selectionDisabled && selection.isSelected(row)}\n disabled={selectionDisabled}\n onClick={(event) => event.stopPropagation()}\n onCheckedChange={(checked) => {\n if (!selectionDisabled) selection.onSelectedChange(row, checked)\n }}\n />\n </td>\n )}\n {columns.map((col, columnIndex) => (\n <td\n key={col.key}\n className={cn(\n 'fractal-sortable-table-td',\n action && columnIndex === columns.length - 1 && 'fractal-sortable-table-td--row-action',\n )}\n style={{ ...columnStyle(col), textAlign: col.align ?? 'left' }} data-column-align={col.align} data-pinned-column={columnIndex === 0 ? 'data' : undefined}\n >\n <TableCellContent label={`${col.header || 'Value'}, row ${rowIndex + 1}`}>{col.render(row, rowIndex)}</TableCellContent>\n {action && columnIndex === columns.length - 1 && (\n <span className=\"fractal-sortable-table-row-action\" aria-hidden=\"true\">\n <span className=\"fractal-sortable-table-row-action__icon\">{action.icon}</span>\n </span>\n )}\n </td>\n ))}\n {overflowMenu && <td className=\"fractal-sortable-table-td fractal-table-overflow-cell\" data-pinned-column=\"overflow\"\n onClick={event => event.stopPropagation()} onDoubleClick={event => event.stopPropagation()} onKeyDown={event => event.stopPropagation()}>\n <TableOverflowMenu items={overflowMenu.items(row, rowIndex)} label={overflowMenu.getLabel?.(row, rowIndex) ?? `Actions for row ${rowIndex + 1}`} disabled={disabled || overflowMenu.isDisabled?.(row, rowIndex)} onSelect={value => overflowMenu.onSelect(value, row, rowIndex)} />\n </td>}\n </tr>\n )\n })}\n </tbody>\n </table></TableViewport>\n )}\n </div>\n </div>\n )\n}\n","import { useId, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from 'react'\nimport { cn } from '../../utils/cn'\nimport './Tabs.css'\n\nexport interface TabItem {\n id: string\n label: ReactNode\n content: ReactNode\n disabled?: boolean\n}\n\nexport type TabsVariant = 'line' | 'surface'\n\nexport interface TabsProps {\n items: TabItem[]\n defaultValue?: string\n value?: string\n onValueChange?: (id: string) => void\n className?: string\n ariaLabel?: string\n /** Extends a subtle divider across the entire tab list. */\n divider?: boolean\n /** Visual treatment. Surface tabs sit on a full-width secondary surface with the active tab connected to its panel. */\n variant?: TabsVariant\n}\n\nexport function Tabs({\n items,\n defaultValue,\n value: controlledValue,\n onValueChange,\n className,\n ariaLabel,\n divider = false,\n variant = 'line',\n}: TabsProps) {\n const reactId = useId()\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? items.find((i) => !i.disabled)?.id ?? items[0]?.id ?? '',\n )\n const isControlled = controlledValue !== undefined\n const activeId = isControlled ? controlledValue : internalValue\n\n const tabListRef = useRef<HTMLDivElement | null>(null)\n const tabRefs = useRef<Record<string, HTMLButtonElement | null>>({})\n const [indicator, setIndicator] = useState<{ offset: number; width: number } | null>(null)\n\n useLayoutEffect(() => {\n const updateIndicator = () => {\n const activeTab = tabRefs.current[activeId]\n if (!activeTab) return\n setIndicator({ offset: activeTab.offsetLeft, width: activeTab.offsetWidth })\n }\n\n updateIndicator()\n const list = tabListRef.current\n if (!list || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(updateIndicator)\n observer.observe(list)\n return () => observer.disconnect()\n }, [activeId, items.length])\n\n const selectTab = (id: string) => {\n if (isControlled) {\n onValueChange?.(id)\n } else {\n setInternalValue(id)\n onValueChange?.(id)\n }\n }\n\n const focusable = items.filter((i) => !i.disabled)\n const indicatorStyle = indicator\n ? {\n '--fractal-tabs-indicator-offset': `${indicator.offset}px`,\n '--fractal-tabs-indicator-width': `${indicator.width}px`,\n } as CSSProperties\n : undefined\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n const currentIndex = focusable.findIndex((i) => i.id === activeId)\n if (currentIndex === -1) return\n let nextIndex = currentIndex\n switch (event.key) {\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % focusable.length\n break\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + focusable.length) % focusable.length\n break\n case 'Home':\n nextIndex = 0\n break\n case 'End':\n nextIndex = focusable.length - 1\n break\n default:\n return\n }\n event.preventDefault()\n const nextId = focusable[nextIndex].id\n selectTab(nextId)\n requestAnimationFrame(() => tabRefs.current[nextId]?.focus())\n }\n\n return (\n <div className={cn('fractal-tabs', `fractal-tabs--${variant}`, divider && 'fractal-tabs--divider', className)}>\n <div\n ref={tabListRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n className=\"fractal-tabs-list\"\n data-indicator-ready={indicator ? 'true' : undefined}\n style={indicatorStyle}\n >\n {items.map((item) => {\n const isActive = item.id === activeId\n const tabId = `${reactId}-tab-${item.id}`\n const panelId = `${reactId}-panel-${item.id}`\n return (\n <button\n key={item.id}\n ref={(el) => {\n tabRefs.current[item.id] = el\n }}\n id={tabId}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n className={cn(\n 'fractal-tabs-trigger',\n isActive && 'fractal-tabs-trigger--active',\n item.disabled && 'fractal-tabs-trigger--disabled',\n )}\n onClick={() => !item.disabled && selectTab(item.id)}\n onKeyDown={onKeyDown}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n {items.map((item) => {\n const tabId = `${reactId}-tab-${item.id}`\n const panelId = `${reactId}-panel-${item.id}`\n const isActive = item.id === activeId\n return (\n <div\n key={item.id}\n id={panelId}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n hidden={!isActive}\n className=\"fractal-tabs-panel\"\n >\n {isActive && item.content}\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './ContentSwitcher.css'\n\nexport interface ContentSwitcherItem {\n value: string\n label: React.ReactNode\n disabled?: boolean\n}\n\nexport interface ContentSwitcherProps {\n items: ContentSwitcherItem[]\n value: string\n onValueChange: (value: string) => void\n ariaLabel: string\n fullWidth?: boolean\n className?: string\n}\n\nexport function ContentSwitcher({ items, value, onValueChange, ariaLabel, fullWidth = false, className }: ContentSwitcherProps) {\n const switcherRef = React.useRef<HTMLDivElement>(null)\n const buttonRefs = React.useRef<Array<HTMLButtonElement | null>>([])\n const indicatorMotionReadyRef = React.useRef(false)\n const activeIndex = items.findIndex((item) => item.value === value)\n\n React.useLayoutEffect(() => {\n const switcher = switcherRef.current\n const activeButton = buttonRefs.current[activeIndex]\n let motionFrame = 0\n\n if (!switcher || !activeButton) {\n switcher?.removeAttribute('data-indicator-ready')\n switcher?.removeAttribute('data-indicator-animate')\n indicatorMotionReadyRef.current = false\n return\n }\n\n const updateIndicator = () => {\n const switcherRect = switcher.getBoundingClientRect()\n const activeButtonRect = activeButton.getBoundingClientRect()\n\n switcher.style.setProperty('--fractal-content-switcher-indicator-x', `${activeButtonRect.left - switcherRect.left - switcher.clientLeft}px`)\n switcher.style.setProperty('--fractal-content-switcher-indicator-y', `${activeButtonRect.top - switcherRect.top - switcher.clientTop}px`)\n switcher.style.setProperty('--fractal-content-switcher-indicator-width', `${activeButtonRect.width}px`)\n switcher.style.setProperty('--fractal-content-switcher-indicator-height', `${activeButtonRect.height}px`)\n switcher.setAttribute('data-indicator-ready', 'true')\n\n if (!indicatorMotionReadyRef.current && motionFrame === 0) {\n motionFrame = window.requestAnimationFrame(() => {\n indicatorMotionReadyRef.current = true\n switcher.setAttribute('data-indicator-animate', 'true')\n motionFrame = 0\n })\n }\n }\n\n updateIndicator()\n\n if (typeof ResizeObserver === 'undefined') {\n return () => {\n if (motionFrame !== 0) window.cancelAnimationFrame(motionFrame)\n }\n }\n\n const resizeObserver = new ResizeObserver(updateIndicator)\n resizeObserver.observe(switcher)\n buttonRefs.current.forEach((button) => {\n if (button) resizeObserver.observe(button)\n })\n\n return () => {\n resizeObserver.disconnect()\n if (motionFrame !== 0) window.cancelAnimationFrame(motionFrame)\n }\n }, [activeIndex, items.length])\n\n const moveFocus = (index: number, direction: 1 | -1) => {\n let nextIndex = index\n do {\n nextIndex = (nextIndex + direction + items.length) % items.length\n } while (items[nextIndex]?.disabled && nextIndex !== index)\n\n if (!items[nextIndex]?.disabled) {\n buttonRefs.current[nextIndex]?.focus()\n onValueChange(items[nextIndex].value)\n }\n }\n\n return (\n <div\n className={cn('fractal-content-switcher', fullWidth && 'fractal-content-switcher--full-width', className)}\n role=\"group\"\n aria-label={ariaLabel}\n ref={switcherRef}\n >\n <span className=\"fractal-content-switcher__indicator\" aria-hidden />\n {items.map((item, index) => {\n const active = item.value === value\n return (\n <button\n className={cn('fractal-content-switcher__item', active && 'fractal-content-switcher__item--active')}\n key={item.value}\n type=\"button\"\n aria-pressed={active}\n disabled={item.disabled}\n onClick={() => onValueChange(item.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n moveFocus(index, 1)\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n moveFocus(index, -1)\n }\n }}\n ref={(element) => { buttonRefs.current[index] = element }}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n","import { useId, useState, type ReactNode } from 'react'\nimport { ChevronRight, ChevronDown } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './Disclosure.css'\n\nexport interface DisclosureProps {\n title: ReactNode\n meta?: ReactNode\n children: ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n disabled?: boolean\n className?: string\n variant?: 'card' | 'plain'\n}\n\nexport function Disclosure({\n title,\n meta,\n children,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n className,\n variant = 'card',\n}: DisclosureProps) {\n const reactId = useId()\n const headerId = `${reactId}-header`\n const panelId = `${reactId}-panel`\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const toggle = () => {\n if (disabled) return\n const next = !isOpen\n if (isControlled) {\n onOpenChange?.(next)\n } else {\n setInternalOpen(next)\n onOpenChange?.(next)\n }\n }\n\n return (\n <div\n className={cn(\n 'fractal-disclosure',\n variant === 'card' && 'fractal-disclosure--card',\n isOpen && 'fractal-disclosure--open',\n disabled && 'fractal-disclosure--disabled',\n className,\n )}\n >\n <button\n type=\"button\"\n id={headerId}\n className=\"fractal-disclosure-trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={disabled}\n onClick={toggle}\n >\n <span className=\"fractal-disclosure-icon\" aria-hidden=\"true\">\n {isOpen ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n </span>\n <span className=\"fractal-disclosure-title\">{title}</span>\n {meta && <span className=\"fractal-disclosure-meta\">{meta}</span>}\n </button>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className=\"fractal-disclosure-panel\"\n hidden={!isOpen}\n >\n <div className=\"fractal-disclosure-panel-inner\">{children}</div>\n </div>\n </div>\n )\n}\n","import type { CSSProperties, HTMLAttributes } from 'react'\nimport { cn } from '../../utils/cn'\nimport './LatticeLoader.css'\n\nconst LATTICE_COUNT = 160\nconst WAVE_PERIOD = 80\n\nexport interface LatticeLoaderProps extends HTMLAttributes<HTMLSpanElement> {\n label?: string\n}\n\nexport function LatticeLoader({ className, label = 'Loading', ...props }: LatticeLoaderProps) {\n return (\n <span\n aria-label={label}\n className={cn('fractal-lattice-loader', className)}\n role=\"progressbar\"\n {...props}\n >\n {Array.from({ length: LATTICE_COUNT }, (_, index) => (\n <span\n aria-hidden=\"true\"\n className=\"fractal-lattice-loader__cell\"\n key={index}\n style={{ '--fractal-lattice-index': index % WAVE_PERIOD } as CSSProperties}\n />\n ))}\n </span>\n )\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '../../utils/cn'\nimport type { ControlSize } from '../../utils/control-size'\nimport '../../styles/control.css'\nimport './Ghost.css'\n\ntype GhostLength = number | string\n\nexport interface GhostProps extends HTMLAttributes<HTMLDivElement> {\n /** Width of the placeholder. Numbers are interpreted as pixels. */\n width?: GhostLength\n /** Height of the placeholder. Numbers are interpreted as pixels. */\n height?: GhostLength\n /** Border radius override. */\n radius?: GhostLength\n}\n\nexport interface GhostLineProps extends Omit<GhostProps, 'height'> {\n /** Text-line size. */\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst toCssLength = (value: GhostLength | undefined) => (\n typeof value === 'number' ? `${value}px` : value\n)\n\n/**\n * An intentionally content-free, shimmering placeholder. Use the composed\n * ghosts below for standard Fractal components; use this primitive for custom\n * product layouts.\n */\nexport function Ghost({ className, width, height, radius, style, ...props }: GhostProps) {\n return (\n <div\n aria-hidden=\"true\"\n className={cn('fractal-ghost', className)}\n style={{\n width: toCssLength(width),\n height: toCssLength(height),\n borderRadius: toCssLength(radius),\n ...style,\n }}\n {...props}\n />\n )\n}\n\nexport function GhostLine({ className, size = 'md', width = '100%', ...props }: GhostLineProps) {\n return <Ghost className={cn('fractal-ghost-line', `fractal-ghost-line--${size}`, className)} width={width} {...props} />\n}\n\nexport interface ButtonGhostProps extends Omit<GhostProps, 'height'> {\n size?: ControlSize\n controlSize?: ControlSize\n iconOnly?: boolean\n}\n\nexport function ButtonGhost({ className, size = 'lg', controlSize, iconOnly = false, width, ...props }: ButtonGhostProps) {\n return <Ghost data-control-size={controlSize ?? size} className={cn('fractal-ghost-button', `fractal-ghost-button--${size}`, iconOnly && 'fractal-ghost-button--icon-only', className)} width={width} {...props} />\n}\n\nexport interface CardGhostProps extends HTMLAttributes<HTMLDivElement> {\n lines?: number\n showHeader?: boolean\n}\n\nexport function CardGhost({ className, lines = 3, showHeader = true, ...props }: CardGhostProps) {\n return (\n <div aria-hidden=\"true\" className={cn('fractal-ghost-card', className)} {...props}>\n {showHeader && <GhostLine width=\"38%\" />}\n <div className=\"fractal-ghost-stack\">\n {Array.from({ length: lines }, (_, index) => <GhostLine key={index} width={index === lines - 1 ? '62%' : '100%'} />)}\n </div>\n </div>\n )\n}\n\nexport interface DataTableGhostProps extends HTMLAttributes<HTMLDivElement> {\n /** Display placeholder cells for a header that is itself still loading. */\n showHeader?: boolean\n /** Static header labels to retain while only rows are loading. */\n headers?: ReactNode[]\n /** Number of column placeholders. */\n columns?: number\n /** Number of data row placeholders. */\n rows?: number\n /** Optional CSS widths mirroring the eventual table columns. */\n columnWidths?: string[]\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport function DataTableGhost({\n className,\n showHeader = true,\n headers,\n columns = 4,\n rows = 5,\n columnWidths,\n size = 'md',\n ...props\n}: DataTableGhostProps) {\n const cells = Array.from({ length: columns }, (_, index) => index)\n return (\n <div aria-busy=\"true\" aria-label=\"Loading table\" className={cn('fractal-ghost-table', `fractal-ghost-table--${size}`, className)} role=\"status\" {...props}>\n <table className=\"fractal-ghost-table__table\">\n {(showHeader || headers) && (\n <thead>\n <tr className=\"fractal-ghost-table__head-row\">\n {cells.map((index) => (\n <th key={index} style={{ width: columnWidths?.[index] }}>\n {headers?.[index] ?? <GhostLine size=\"sm\" width={index === columns - 1 ? '62%' : '76%'} />}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {Array.from({ length: rows }, (_, rowIndex) => (\n <tr className=\"fractal-ghost-table__row\" key={rowIndex}>\n {cells.map((columnIndex) => (\n <td key={columnIndex} style={{ width: columnWidths?.[columnIndex] }}>\n <GhostLine width={`${[72, 54, 82, 63, 46][(rowIndex + columnIndex) % 5]}%`} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nexport interface FormFieldGhostProps extends HTMLAttributes<HTMLDivElement> {\n labelWidth?: GhostLength\n controlSize?: ControlSize\n multiline?: boolean\n}\n\nexport function InputGhost({ className, labelWidth = '26%', ...props }: FormFieldGhostProps) {\n return <FormFieldGhost className={className} labelWidth={labelWidth} {...props} />\n}\n\nexport function TextareaGhost({ className, labelWidth = '26%', ...props }: FormFieldGhostProps) {\n return <FormFieldGhost className={className} labelWidth={labelWidth} multiline {...props} />\n}\n\nexport function LabelGhost({ className, width = '26%', ...props }: Omit<GhostLineProps, 'size'>) {\n return <GhostLine className={cn('fractal-ghost-label', className)} size=\"sm\" width={width} {...props} />\n}\n\nfunction FormFieldGhost({ className, labelWidth = '26%', multiline = false, controlSize = 'lg', ...props }: FormFieldGhostProps) {\n return (\n <div aria-hidden=\"true\" data-control-size={controlSize} className={cn('fractal-ghost-field', className)} {...props}>\n <LabelGhost width={labelWidth} />\n <Ghost className={cn('fractal-ghost-field__control', multiline && 'fractal-ghost-field__control--multiline')} />\n </div>\n )\n}\n\nexport function AlertGhost({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-alert', className)} {...props}><GhostLine width=\"30%\" /><GhostLine size=\"sm\" width=\"78%\" /></div>\n}\n\nexport function CheckboxGhost({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-choice', className)} {...props}><Ghost className=\"fractal-ghost-choice__control\" /><GhostLine width=\"42%\" /></div>\n}\n\nexport const ToggleGhost = CheckboxGhost\n\nexport function ChipGhost({ className, width = 74, ...props }: Omit<GhostProps, 'height'>) {\n return <Ghost className={cn('fractal-ghost-chip', className)} height={24} width={width} {...props} />\n}\n\nexport function LinkGhost({ className, width = 96, ...props }: Omit<GhostLineProps, 'size'>) {\n return <GhostLine className={cn('fractal-ghost-link', className)} size=\"sm\" width={width} {...props} />\n}\n\nexport const TextButtonGhost = LinkGhost\n\nexport function DropdownGhost({ className, controlSize = 'lg', ...props }: HTMLAttributes<HTMLDivElement> & { controlSize?: ControlSize }) {\n return <div aria-hidden=\"true\" data-control-size={controlSize} className={cn('fractal-ghost-dropdown', className)} {...props}><GhostLine width=\"38%\" /><Ghost className=\"fractal-ghost-dropdown__chevron\" /></div>\n}\n\nexport function ContentSwitcherGhost({ className, options = 3, ...props }: HTMLAttributes<HTMLDivElement> & { options?: number }) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-switcher', className)} {...props}>{Array.from({ length: options }, (_, index) => <Ghost key={index} />)}</div>\n}\n\nexport const TabsGhost = ContentSwitcherGhost\n\nexport function DisclosureGhost({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-disclosure', className)} {...props}><Ghost className=\"fractal-ghost-disclosure__icon\" /><GhostLine width=\"42%\" /></div>\n}\n\nexport function PaginationGhost({ className, pages = 5, ...props }: HTMLAttributes<HTMLDivElement> & { pages?: number }) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-pagination', className)} {...props}>{Array.from({ length: pages }, (_, index) => <Ghost key={index} />)}</div>\n}\n\nexport function FileDropzoneGhost({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" className={cn('fractal-ghost-dropzone', className)} {...props}><Ghost className=\"fractal-ghost-dropzone__icon\" /><GhostLine width=\"26%\" /><GhostLine size=\"sm\" width=\"46%\" /></div>\n}\n\nexport function PromptCardGhost({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <CardGhost className={cn('fractal-ghost-prompt-card', className)} lines={4} {...props} />\n}\n\nexport type ConversationGhostProps = HTMLAttributes<HTMLDivElement>\n\nexport function ConversationGhost({\n className,\n 'aria-label': ariaLabel = 'Loading conversation',\n ...props\n}: ConversationGhostProps) {\n return (\n <div\n aria-busy=\"true\"\n aria-label={ariaLabel}\n className={cn('fractal-ghost-conversation', className)}\n role=\"status\"\n {...props}\n >\n <div aria-hidden=\"true\" className=\"fractal-ghost-conversation__message fractal-ghost-conversation__message--user\">\n <div className=\"fractal-ghost-conversation__bubble\">\n <GhostLine width=\"100%\" />\n <GhostLine width=\"86%\" />\n <GhostLine width=\"64%\" />\n </div>\n </div>\n <div aria-hidden=\"true\" className=\"fractal-ghost-conversation__message fractal-ghost-conversation__message--assistant\">\n <GhostLine width=\"92%\" />\n <GhostLine width=\"78%\" />\n <GhostLine width=\"58%\" />\n </div>\n </div>\n )\n}\n\nexport function SortableTableGhost(props: DataTableGhostProps) {\n return <DataTableGhost {...props} />\n}\n\nexport interface SidebarGhostProps extends HTMLAttributes<HTMLDivElement> {\n items?: number\n}\n\nexport function SidebarGhost({ className, items = 6, ...props }: SidebarGhostProps) {\n return (\n <aside aria-hidden=\"true\" className={cn('fractal-ghost-sidebar', className)} {...props}>\n <Ghost className=\"fractal-ghost-sidebar__brand\" />\n <div className=\"fractal-ghost-sidebar__items\">\n {Array.from({ length: items }, (_, index) => <div className=\"fractal-ghost-sidebar__item\" key={index}><Ghost /><GhostLine width={`${[54, 68, 44, 61][index % 4]}%`} /></div>)}\n </div>\n </aside>\n )\n}\n\nexport interface SurfaceGhostProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: ReactNode\n lines?: number\n}\n\nexport function ModalGhost({ className, title, lines = 3, ...props }: SurfaceGhostProps) {\n return <SurfaceGhost className={cn('fractal-ghost-modal', className)} title={title} lines={lines} {...props} />\n}\n\nexport function SidePanelGhost({ className, title, lines = 5, ...props }: SurfaceGhostProps) {\n return <SurfaceGhost className={cn('fractal-ghost-side-panel', className)} title={title} lines={lines} {...props} />\n}\n\nfunction SurfaceGhost({ className, title, lines = 3, ...props }: SurfaceGhostProps) {\n return (\n <div aria-hidden=\"true\" className={cn('fractal-ghost-surface', className)} {...props}>\n <div className=\"fractal-ghost-surface__header\"><GhostLine width=\"42%\" /><Ghost className=\"fractal-ghost-surface__close\" /></div>\n {title && <div className=\"fractal-ghost-surface__title\">{title}</div>}\n <div className=\"fractal-ghost-stack\">{Array.from({ length: lines }, (_, index) => <GhostLine key={index} width={index === lines - 1 ? '64%' : '100%'} />)}</div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Dropdown, type DropdownItem } from '../Dropdown'\nimport { cn } from '../../utils/cn'\nimport './Sidebar.css'\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n /** Fixed sidebar width. Defaults to the standard application width. */\n width?: string\n /** Collapses the sidebar to an icon rail until it is hovered or receives focus. */\n compact?: boolean\n}\n\nconst Sidebar = React.forwardRef<HTMLElement, SidebarProps>(\n ({ className, width, compact = false, style, ...props }, ref) => (\n <aside\n ref={ref}\n className={cn('fractal-sidebar', className)}\n data-compact={compact || undefined}\n style={{ ...style, ...(width ? { '--fractal-sidebar-width': width } : {}) } as React.CSSProperties}\n {...props}\n />\n ),\n)\nSidebar.displayName = 'Sidebar'\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__header', className)} {...props} />\n ),\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\nconst SidebarBrand = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, type = 'button', ...props }, ref) => (\n <button ref={ref} type={type} className={cn('fractal-sidebar__brand', className)} {...props} />\n ),\n)\nSidebarBrand.displayName = 'SidebarBrand'\n\nexport interface SidebarAccountMenuProps {\n /** Person or workspace label shown in the sidebar header. */\n name: string\n /** Available account actions. */\n items: DropdownItem[]\n /** Invoked when an account action is selected. */\n onSelect: (value: string) => void\n /** Accessible label for the account actions menu. */\n triggerLabel?: string\n /** Leading profile or workspace mark. */\n icon?: React.ReactNode\n className?: string\n}\n\nfunction SidebarAccountMenu({\n name,\n items,\n onSelect,\n triggerLabel = 'Account menu',\n icon,\n className,\n}: SidebarAccountMenuProps) {\n return (\n <Dropdown\n align=\"left\"\n className={cn('fractal-sidebar__account', className)}\n items={items}\n onSelect={onSelect}\n panelClassName=\"fractal-sidebar__account-panel\"\n selectedValue=\"\"\n triggerClassName=\"fractal-sidebar__account-trigger\"\n triggerContent={(\n <>\n {icon && <span className=\"fractal-sidebar__account-icon\" aria-hidden=\"true\">{icon}</span>}\n <span className=\"fractal-sidebar__account-name\">{name}</span>\n </>\n )}\n triggerLabel={triggerLabel}\n triggerVariant=\"tertiary\"\n />\n )\n}\n\nconst SidebarNav = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(\n ({ className, ...props }, ref) => (\n <nav ref={ref} className={cn('fractal-sidebar__nav', className)} {...props} />\n ),\n)\nSidebarNav.displayName = 'SidebarNav'\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__section', className)} {...props} />\n ),\n)\nSidebarSection.displayName = 'SidebarSection'\n\nexport interface SidebarNavItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Marks the current destination. */\n active?: boolean\n /** Leading visual identifier. */\n icon?: React.ReactNode\n /** Optional right-aligned metadata or status. */\n endAdornment?: React.ReactNode\n}\n\nconst SidebarNavItem = React.forwardRef<HTMLButtonElement, SidebarNavItemProps>(\n ({ active = false, icon, endAdornment, className, type = 'button', children, ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn('fractal-sidebar__nav-item', className)}\n data-active={active || undefined}\n aria-current={active ? 'page' : undefined}\n {...props}\n >\n {icon && <span className=\"fractal-sidebar__nav-item-icon\" aria-hidden=\"true\">{icon}</span>}\n <span className=\"fractal-sidebar__nav-item-label\">{children}</span>\n {endAdornment && <span className=\"fractal-sidebar__nav-item-end\">{endAdornment}</span>}\n </button>\n ),\n)\nSidebarNavItem.displayName = 'SidebarNavItem'\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-sidebar__footer', className)} {...props} />\n ),\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nexport {\n Sidebar,\n SidebarHeader,\n SidebarBrand,\n SidebarAccountMenu,\n SidebarNav,\n SidebarSection,\n SidebarNavItem,\n SidebarFooter,\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Close } from '@mirror-physics/fractal-icons'\nimport { useEscapeDismiss } from '../../hooks/useEscapeDismiss'\nimport { cn } from '../../utils/cn'\nimport { UILoader } from '../UILoader'\nimport './SidePanel.css'\n\nexport interface SidePanelProps {\n open: boolean\n onClose: () => void\n title: React.ReactNode\n description?: React.ReactNode\n children: React.ReactNode\n footer?: React.ReactNode\n /** Panel width: sm (420px), md (540px), lg (680px), or xl (960px). */\n size?: 'sm' | 'md' | 'lg' | 'xl'\n /** Replaces the body with a whole-surface loading state while retaining the panel header. */\n loading?: boolean\n loadingLabel?: string\n className?: string\n}\n\nexport function SidePanel({ open, onClose, title, description, children, footer, size = 'md', loading = false, loadingLabel = 'Loading', className }: SidePanelProps) {\n useEscapeDismiss(80, onClose, open)\n\n const bodyRef = React.useRef<HTMLDivElement>(null)\n const [scrollEdges, setScrollEdges] = React.useState({ above: false, below: false })\n\n React.useLayoutEffect(() => {\n const body = bodyRef.current\n if (!open || !body) return\n\n const measure = () => {\n // scrollTop can be fractional or overscroll; scrollHeight/clientHeight are rounded.\n const maxScroll = Math.max(0, body.scrollHeight - body.clientHeight)\n const top = Math.max(0, Math.min(body.scrollTop, maxScroll))\n const above = maxScroll > 1 && top > 0\n const below = maxScroll - top > 1\n setScrollEdges(previous => previous.above === above && previous.below === below\n ? previous : { above, below })\n }\n const resize = new ResizeObserver(measure)\n const observeContent = () => {\n resize.disconnect()\n resize.observe(body)\n // Observe content size too: the viewport need not resize when content grows.\n for (const child of body.children) resize.observe(child)\n measure()\n }\n const mutations = new MutationObserver(observeContent)\n mutations.observe(body, { childList: true, subtree: true, characterData: true, attributes: true })\n body.addEventListener('scroll', measure, { passive: true })\n body.addEventListener('load', measure, true)\n observeContent()\n return () => {\n resize.disconnect()\n mutations.disconnect()\n body.removeEventListener('scroll', measure)\n body.removeEventListener('load', measure, true)\n }\n }, [open, loading])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fractal-side-panel-overlay\" onMouseDown={onClose}>\n <aside\n className={cn('fractal-side-panel', `fractal-side-panel--${size}`, className)}\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : 'Side panel'}\n role=\"dialog\"\n onMouseDown={(event) => event.stopPropagation()}\n >\n <header className=\"fractal-side-panel__header\" data-scroll-divider={scrollEdges.above}>\n <div className=\"fractal-side-panel__heading\">\n {typeof title === 'string'\n ? <h2 className=\"fractal-side-panel__title\">{title}</h2>\n : <div className=\"fractal-side-panel__title\">{title}</div>}\n {description && <p className=\"fractal-side-panel__description\">{description}</p>}\n </div>\n <button type=\"button\" className=\"fractal-side-panel__close\" aria-label=\"Close panel\" onClick={onClose}>\n <Close size={18} />\n </button>\n </header>\n <div ref={bodyRef} aria-busy={loading || undefined} className={cn('fractal-side-panel__body', loading && 'fractal-side-panel__body--loading')}>\n {loading ? <UILoader label={loadingLabel} /> : children}\n </div>\n {footer && <footer className=\"fractal-side-panel__footer\" data-scroll-divider={scrollEdges.below}>{footer}</footer>}\n </aside>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './Textarea.css'\nimport '../../styles/control.css'\nimport '../../styles/floating-field.css'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Persistent title: starts on the first line, floats into the border on focus or when filled. */\n fieldLabel?: string\n /** Prose uses the input font; source preserves the existing monospace treatment. */\n textStyle?: 'prose' | 'source'\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, fieldLabel, textStyle = 'source', id, placeholder, ...props }, ref) => {\n const generatedId = React.useId()\n const fieldId = id ?? generatedId\n const input = <textarea\n ref={ref}\n id={fieldLabel ? fieldId : id}\n placeholder={fieldLabel ? (placeholder || ' ') : placeholder}\n className={cn('fractal-textarea', className)}\n data-text-style={textStyle}\n {...props}\n />\n return fieldLabel ? <div className=\"fractal-floating-field fractal-floating-field--textarea\" data-control-size=\"md\">\n {input}\n <label className=\"fractal-floating-field__label\" htmlFor={fieldId}>{fieldLabel}</label>\n </div> : input\n },\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","import * as React from 'react'\nimport { cn } from '../../utils/cn'\nimport './TextButton.css'\n\nexport type TextButtonSize = 'sm' | 'md'\nexport type TextButtonIconPosition = 'start' | 'end'\nexport type TextButtonTone = 'primary' | 'secondary'\n\nexport interface TextButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n iconPosition?: TextButtonIconPosition\n size?: TextButtonSize\n tone?: TextButtonTone\n}\n\nconst TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>(\n ({ className, icon, iconPosition = 'start', size = 'md', tone = 'primary', children, ...props }, ref) => (\n <button\n ref={ref}\n className={cn('fractal-text-button', `fractal-text-button--${size}`, `fractal-text-button--${tone}`, className)}\n type=\"button\"\n {...props}\n >\n {icon && iconPosition === 'start' && <span className=\"fractal-text-button__icon\" aria-hidden=\"true\">{icon}</span>}\n <span>{children}</span>\n {icon && iconPosition === 'end' && <span className=\"fractal-text-button__icon\" aria-hidden=\"true\">{icon}</span>}\n </button>\n ),\n)\nTextButton.displayName = 'TextButton'\n\nexport { TextButton }\n","import * as React from 'react'\nimport { Close, FileArrowUp } from '@mirror-physics/fractal-icons'\nimport { cn } from '../../utils/cn'\nimport './FileDropzone.css'\n\nexport interface FileDropzoneProps {\n files: File[]\n onFilesChange: (files: File[]) => void\n accept?: string\n multiple?: boolean\n disabled?: boolean\n title?: React.ReactNode\n description?: React.ReactNode\n className?: string\n}\n\nexport function FileDropzone({\n files,\n onFilesChange,\n accept,\n multiple = true,\n disabled = false,\n title = 'Drop files here or click to browse',\n description = 'Files stay attached to this record.',\n className,\n}: FileDropzoneProps) {\n const inputId = React.useId()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const addFiles = (nextFiles: FileList | File[]) => {\n if (disabled) return\n const additions = Array.from(nextFiles)\n if (additions.length === 0) return\n onFilesChange(multiple ? [...files, ...additions] : additions.slice(0, 1))\n }\n\n return (\n <div className={cn('fractal-file-dropzone', className)}>\n <input\n ref={inputRef}\n id={inputId}\n className=\"fractal-file-dropzone__input\"\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={(event) => {\n if (event.target.files) addFiles(event.target.files)\n event.target.value = ''\n }}\n />\n <button\n className=\"fractal-file-dropzone__target\"\n data-dragging={isDragging || undefined}\n type=\"button\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n onDragEnter={(event) => {\n event.preventDefault()\n if (!disabled) setIsDragging(true)\n }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={(event) => {\n event.preventDefault()\n setIsDragging(false)\n }}\n onDrop={(event) => {\n event.preventDefault()\n setIsDragging(false)\n addFiles(event.dataTransfer.files)\n }}\n >\n <FileArrowUp aria-hidden=\"true\" size={20} />\n <span className=\"fractal-file-dropzone__copy\">\n <span className=\"fractal-file-dropzone__title\">{title}</span>\n {description && <span className=\"fractal-file-dropzone__description\">{description}</span>}\n </span>\n </button>\n {files.length > 0 && (\n <ul className=\"fractal-file-dropzone__files\" aria-label=\"Attached files\">\n {files.map((file, index) => (\n <li className=\"fractal-file-dropzone__file\" key={`${file.name}-${file.size}-${index}`}>\n <span className=\"fractal-file-dropzone__file-name\">{file.name}</span>\n <span className=\"fractal-file-dropzone__file-meta\">{formatFileSize(file.size)}</span>\n <button\n className=\"fractal-file-dropzone__remove\"\n type=\"button\"\n aria-label={`Remove ${file.name}`}\n disabled={disabled}\n onClick={() => onFilesChange(files.filter((_, fileIndex) => fileIndex !== index))}\n >\n <Close aria-hidden=\"true\" size={14} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction formatFileSize(bytes: number) {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","import { ArrowLeft, ArrowRight } from '@mirror-physics/fractal-icons'\nimport { Dropdown } from '../Dropdown'\nimport { cn } from '../../utils/cn'\nimport './Pagination.css'\n\nexport interface PaginationProps {\n /** One-based active page. */\n page: number\n pageSize: number\n totalItems: number\n onPageChange: (page: number) => void\n /** Optional page sizes, rendered as an unframed selector in the pagination footer. */\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n ariaLabel?: string\n className?: string\n}\n\nexport function Pagination({\n page,\n pageSize,\n totalItems,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n ariaLabel = 'Pagination',\n className,\n}: PaginationProps) {\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize))\n const currentPage = Math.min(Math.max(page, 1), totalPages)\n const start = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1\n const end = Math.min(currentPage * pageSize, totalItems)\n const canChangePageSize = pageSizeOptions != null && pageSizeOptions.length > 0 && onPageSizeChange != null\n\n return (\n <nav className={cn('fractal-pagination', className)} aria-label={ariaLabel}>\n <span className=\"fractal-pagination__summary\">\n {totalItems === 0 ? 'No results' : `${start}-${end} of ${totalItems}`}\n </span>\n <div className=\"fractal-pagination__controls\">\n {canChangePageSize && (\n <Dropdown\n align=\"right\"\n className=\"fractal-pagination__page-size\"\n direction=\"up\"\n items={pageSizeOptions.map((option) => ({\n value: String(option),\n description: `${option} per page`,\n }))}\n onSelect={(value) => onPageSizeChange(Number(value))}\n selectedValue={String(pageSize)}\n size=\"sm\"\n triggerLabel=\"Results per page\"\n triggerVariant=\"tertiary\"\n />\n )}\n <button\n className=\"fractal-pagination__button\"\n type=\"button\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n disabled={currentPage === 1 || totalItems === 0}\n onClick={() => onPageChange(currentPage - 1)}\n >\n <ArrowLeft aria-hidden=\"true\" size={16} />\n </button>\n <span className=\"fractal-pagination__page\" aria-current=\"page\">{currentPage} of {totalPages}</span>\n <button\n className=\"fractal-pagination__button\"\n type=\"button\"\n aria-label=\"Next page\"\n title=\"Next page\"\n disabled={currentPage === totalPages || totalItems === 0}\n onClick={() => onPageChange(currentPage + 1)}\n >\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n </nav>\n )\n}\n","import * as React from 'react'\nimport { ArrowUp, ArrowDown, DotsSixVertical, Eye, EyeSlash, Gear } from '@mirror-physics/fractal-icons'\nimport { Button } from '../Button'\nimport { cn } from '../../utils/cn'\nimport './ColumnEditor.css'\n\nexport interface ColumnEditorItem { id: string; label: string; required?: boolean }\nexport interface ColumnEditorProps {\n items: ColumnEditorItem[]\n /** Visible column IDs in display order. Required items cannot be hidden. */\n value: string[]\n onChange: (value: string[]) => void\n label?: string\n hiddenLabel?: string\n className?: string\n}\ninterface DragState {\n id: string; pointerId: number; x: number; y: number; active: boolean\n visible: string[]; hidden: string[]\n}\nconst equal = (a: string[], b: string[]) => a.length === b.length && a.every((id, index) => id === b[index])\n\n/** Reorderable visible/hidden columns, with pointer preview and keyboard actions. */\nexport function ColumnEditor({ items, value, onChange, label = 'Edit columns', hiddenLabel = 'Hidden columns', className }: ColumnEditorProps) {\n const [open, setOpen] = React.useState(false)\n const [preview, setPreview] = React.useState<{ visible: string[]; hidden: string[]; active: string } | null>(null)\n const [announcement, setAnnouncement] = React.useState('')\n const root = React.useRef<HTMLDivElement>(null)\n const trigger = React.useRef<HTMLButtonElement>(null)\n const panel = React.useRef<HTMLDivElement>(null)\n const drag = React.useRef<DragState | null>(null)\n const positions = React.useRef<Map<string, DOMRect> | null>(null)\n const id = React.useId()\n function capturePositions() {\n positions.current = new Map(Array.from(panel.current?.querySelectorAll<HTMLElement>('[data-column-editor-item]') ?? []).map(row => [row.dataset.columnEditorItem!, row.getBoundingClientRect()]))\n }\n // FLIP from each row's current visual position, including interrupted animations.\n React.useLayoutEffect(() => {\n const before = positions.current\n positions.current = null\n if (!before || !panel.current || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return\n const styles = getComputedStyle(panel.current)\n const token = styles.getPropertyValue('--duration-normal').trim()\n const duration = parseFloat(token) * (token.endsWith('ms') ? 1 : 1000)\n const easing = styles.getPropertyValue('--ease-out').trim()\n for (const row of panel.current.querySelectorAll<HTMLElement>('[data-column-editor-item]')) {\n const previous = before.get(row.dataset.columnEditorItem!)\n row.getAnimations().filter(animation => animation.id === 'fractal-column-position').forEach(animation => animation.cancel())\n if (!previous) continue\n const next = row.getBoundingClientRect()\n const x = previous.left - next.left, y = previous.top - next.top\n if (Math.abs(x) < 1 && Math.abs(y) < 1) continue\n row.animate([{ transform: `translate(${x}px, ${y}px)` }, { transform: 'translate(0, 0)' }], { duration, easing, id: 'fractal-column-position' })\n }\n })\n const valid = [...new Set(value)].filter(key => items.some(item => item.id === key))\n const committed = [...valid, ...items.filter(item => item.required && !valid.includes(item.id)).map(item => item.id)]\n const visible = preview?.visible ?? committed\n const hidden = preview?.hidden ?? items.filter(item => !committed.includes(item.id)).map(item => item.id)\n\n function cancel() { capturePositions(); drag.current = null; setPreview(null) }\n React.useEffect(() => {\n if (!open) return\n panel.current?.focus()\n function outside(event: PointerEvent) { if (!drag.current && !root.current?.contains(event.target as Node)) setOpen(false) }\n function escape(event: KeyboardEvent) {\n if (event.key !== 'Escape') return\n event.preventDefault()\n if (drag.current) { capturePositions(); drag.current = null; setPreview(null); setAnnouncement('Reordering cancelled') }\n else { setOpen(false); trigger.current?.focus() }\n }\n function blur(event: FocusEvent) { if (event.relatedTarget instanceof Node && !root.current?.contains(event.relatedTarget)) setOpen(false) }\n const element = root.current\n document.addEventListener('pointerdown', outside); document.addEventListener('keydown', escape); element?.addEventListener('focusout', blur)\n return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape); element?.removeEventListener('focusout', blur) }\n }, [open])\n\n function commit(next: string[], message: string) { capturePositions(); onChange(next); setAnnouncement(message) }\n function move(key: string, offset: number) {\n const index = committed.indexOf(key)\n const next = committed.filter(item => item !== key)\n if (offset > 0 && index === committed.length - 1 && !items.find(item => item.id === key)?.required) {\n commit(next, `${items.find(item => item.id === key)?.label} hidden`); return\n }\n next.splice(Math.max(0, Math.min(next.length, index + offset)), 0, key)\n commit(next, `${items.find(item => item.id === key)?.label} moved ${offset < 0 ? 'up' : 'down'}`)\n }\n function start(event: React.PointerEvent<HTMLLIElement>, key: string) {\n if (event.button !== 0 || (event.target as Element).closest('button')) return\n drag.current = { id: key, pointerId: event.pointerId, x: event.clientX, y: event.clientY, active: false, visible: [...committed], hidden: [...hidden] }\n panel.current?.setPointerCapture(event.pointerId)\n event.preventDefault()\n }\n function update(event: React.PointerEvent<HTMLDivElement>) {\n const current = drag.current\n if (!current || event.pointerId !== current.pointerId) return\n if (!current.active && Math.hypot(event.clientX - current.x, event.clientY - current.y) < 4) return\n current.active = true\n const container = panel.current\n if (!container) return\n const bounds = container.getBoundingClientRect()\n const hiddenGroup = container.querySelector<HTMLElement>('[data-column-editor-group=\"hidden\"]')!\n const inside = event.clientX >= bounds.left && event.clientX <= bounds.right && event.clientY >= bounds.top && event.clientY <= bounds.bottom\n if (!inside) return\n const destination = event.clientY >= hiddenGroup.getBoundingClientRect().top ? 'hidden' : 'visible'\n if (destination === 'hidden' && items.find(item => item.id === current.id)?.required) return\n // Hit-test layout slots, not animated row positions, so moving rows cannot flicker back and forth.\n const slots = Array.from(container.querySelectorAll<HTMLElement>(`[data-column-editor-group=\"${destination}\"] [data-column-editor-item]`))\n const localY = event.clientY - bounds.top + container.scrollTop - container.clientTop\n const ownSlot = slots.find(row => row.dataset.columnEditorItem === current.id)\n if (ownSlot && localY >= ownSlot.offsetTop && localY <= ownSlot.offsetTop + ownSlot.offsetHeight) return\n const nextVisible = current.visible.filter(key => key !== current.id)\n let nextHidden = current.hidden.filter(key => key !== current.id)\n if (destination === 'visible') {\n const index = slots.filter(row => row.dataset.columnEditorItem !== current.id && localY > row.offsetTop + row.offsetHeight / 2).length\n nextVisible.splice(index, 0, current.id)\n } else {\n nextHidden.push(current.id)\n nextHidden = items.filter(item => nextHidden.includes(item.id)).map(item => item.id)\n }\n if (!equal(nextVisible, current.visible) || !equal(nextHidden, current.hidden)) {\n capturePositions()\n current.visible = nextVisible; current.hidden = nextHidden\n }\n setPreview({ visible: current.visible, hidden: current.hidden, active: current.id })\n // Scroll the popover when dragging near its visible edges.\n if (event.clientY < bounds.top + 32) container.scrollTop -= 12\n else if (event.clientY > bounds.bottom - 32) container.scrollTop += 12\n }\n function finish(event: React.PointerEvent<HTMLDivElement>) {\n const current = drag.current\n if (!current || current.pointerId !== event.pointerId) return\n const hit = document.elementFromPoint(event.clientX, event.clientY)\n if (current.active && hit && panel.current?.contains(hit)) commit(current.visible, 'Column order updated')\n cancel()\n if (panel.current?.hasPointerCapture(event.pointerId)) panel.current.releasePointerCapture(event.pointerId)\n }\n function row(key: string, isHidden: boolean, index: number) {\n const item = items.find(item => item.id === key)!\n return <li key={key} className=\"fractal-column-editor__row\" data-column-editor-item={key} data-hidden={isHidden || undefined} data-dragging={preview?.active === key || undefined}\n onPointerDown={event => start(event, key)}>\n <DotsSixVertical className=\"fractal-column-editor__grip\" aria-hidden=\"true\" />\n <span className=\"fractal-column-editor__name\">{item.label}</span>\n <div className=\"fractal-column-editor__actions\" onPointerDown={event => event.stopPropagation()}>\n {isHidden ? <Button buttonType=\"ghost\" controlSize=\"sm\" hasIconOnly icon={<Eye aria-hidden=\"true\" />} aria-label={`Show ${item.label} column`} onClick={() => commit([...committed, key], `${item.label} shown`)} /> : <>\n <Button buttonType=\"ghost\" controlSize=\"sm\" hasIconOnly icon={<ArrowUp aria-hidden=\"true\" />} aria-label={`Move ${item.label} up`} disabled={index === 0} onClick={() => move(key, -1)} />\n <Button buttonType=\"ghost\" controlSize=\"sm\" hasIconOnly icon={index === visible.length - 1 && !item.required ? <EyeSlash aria-hidden=\"true\" /> : <ArrowDown aria-hidden=\"true\" />} aria-label={index === visible.length - 1 && !item.required ? `Hide ${item.label} column` : `Move ${item.label} down`} disabled={index === visible.length - 1 && item.required} onClick={() => move(key, 1)} />\n </>}\n </div>\n </li>\n }\n return <div className={cn('fractal-column-editor', className)} ref={root}>\n <Button ref={trigger} controlSize=\"lg\" buttonType=\"secondary\" icon={<Gear aria-hidden=\"true\" />} iconPosition=\"right\" aria-haspopup=\"dialog\" aria-expanded={open} aria-controls={id} onClick={() => { cancel(); setOpen(current => !current) }}>{label}</Button>\n {open ? <div id={id} className=\"fractal-column-editor__panel\" ref={panel} role=\"dialog\" data-dragging={Boolean(preview) || undefined} aria-label={label} tabIndex={-1} onPointerMove={update} onPointerUp={finish} onPointerCancel={cancel} onLostPointerCapture={cancel}>\n <ol className=\"fractal-column-editor__list\" data-column-editor-group=\"visible\" aria-label=\"Visible columns\">{visible.map((key, index) => row(key, false, index))}</ol>\n <section data-column-editor-group=\"hidden\" className=\"fractal-column-editor__hidden\" aria-label={hiddenLabel}>\n <div className=\"fractal-column-editor__divider\"><span>{hiddenLabel}<EyeSlash aria-hidden=\"true\" /></span></div>\n <ol className=\"fractal-column-editor__list\">{hidden.map((key, index) => row(key, true, index))}</ol>\n {!hidden.length ? <p className=\"fractal-column-editor__empty\">Drag columns here to hide them.</p> : null}\n </section>\n <span className=\"fractal-column-editor__announcement\" role=\"status\" aria-live=\"polite\">{announcement}</span>\n </div> : null}\n </div>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;;;ACAvB,kBAAsC;AAE/B,SAAS,MAAM,QAAsB;AAC1C,aAAO,kBAAK,MAAM;AACpB;;;ADgKM;AA/HN,IAAM,eAAe;AAAA,EACnB,MAAM;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,MAAM;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,IACN,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEA,SAAS,gBACP,YACA,WACA,UACA,UACA,OACA,aACqB;AACrB,QAAM,UAAU,QAAQ,aAAa,KAAK,IAAI;AAE9C,QAAM,OAA4B;AAAA,IAChC,cAAc;AAAA,IACd,QAAQ,WAAW,gBAAgB;AAAA,IACnC,YAAY;AAAA,EACd;AAEA,MAAI,aAAa;AACf,SAAK,iBAAiB;AAAA,EACxB;AAKA,MAAI,UAAU;AACZ,QAAI,eAAe,SAAS;AAC1B,aAAO,EAAE,GAAG,MAAM,iBAAiB,eAAe,QAAQ,yBAAyB,OAAO,qBAAqB;AAAA,IACjH;AACA,WAAO,EAAE,GAAG,MAAM,iBAAiB,eAAe,QAAQ,gCAAgC,OAAO,qBAAqB;AAAA,EACxH;AAEA,UAAQ,YAAY;AAAA;AAAA,IAElB,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,GAAI,UAAU;AAAA,UACZ,uBAAuB,QAAQ,GAAG;AAAA,UAClC,0BAA0B,QAAQ,GAAG;AAAA,UACrC,2BAA2B,QAAQ,GAAG;AAAA,UACtC,uBAAuB;AAAA,QACzB,IAAI,CAAC;AAAA,MACP;AAAA;AAAA,IAGF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,WAAW,wBAAwB,YAAY,wBAAwB;AAAA,QACxF,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA;AAAA,IAGF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,aAAa,WAAW,wBAAwB;AAAA,QACjE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA;AAAA,IAGF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,aAAa,WAAW,uCAAuC;AAAA,QAChF,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IAEF;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,aAAa,WAAW,aAAa,MAAM,aAAa,OAAO,MAAM,aAAa,eAAe,QAAQ,OAAO,UAAU,UAAU,GAAG,MAAM,GAAG,QAAQ;AACpK,UAAM,CAAC,WAAW,YAAY,IAAU,eAAS,KAAK;AACtD,UAAM,CAAC,UAAU,WAAW,IAAU,eAAS,KAAK;AAEpD,UAAM,aAAa,gBAAgB,YAAY,WAAW,UAAU,CAAC,CAAC,UAAU,OAAO,WAAW;AAClG,UAAM,iBAAiB,QAAQ,YAAY,CAAC;AAC5C,UAAM,cAAc,iBAChB,EAAE,GAAG,YAAY,KAAK,uBAAuB,GAAG,MAAM,IACtD,EAAE,GAAG,YAAY,GAAG,MAAM;AAE9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,qBAAmB,eAAe;AAAA,QAClC,kBAAgB,eAAe;AAAA,QAC/B,WAAW,GAAG,mBAAmB,kBAAkB,mBAAmB,UAAU,IAAI,SAAS;AAAA,QAC7F,OAAO;AAAA,QACP;AAAA,QACA,cAAc,CAAC,MAAM;AAAE,uBAAa,IAAI;AAAG,gBAAM,eAAe,CAAC;AAAA,QAAE;AAAA,QACnE,cAAc,CAAC,MAAM;AAAE,uBAAa,KAAK;AAAG,sBAAY,KAAK;AAAG,gBAAM,eAAe,CAAC;AAAA,QAAE;AAAA,QACxF,aAAa,CAAC,MAAM;AAAE,sBAAY,IAAI;AAAG,gBAAM,cAAc,CAAC;AAAA,QAAE;AAAA,QAChE,WAAW,CAAC,MAAM;AAAE,sBAAY,KAAK;AAAG,gBAAM,YAAY,CAAC;AAAA,QAAE;AAAA,QAC5D,GAAG;AAAA,QAEH;AAAA,2BAAiB,WAAW;AAAA,UAC5B,CAAC,eAAe;AAAA,UAChB,iBAAiB,WAAW;AAAA;AAAA;AAAA,IAC/B;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;AEzLrB,mBAA0F;AAC1F,8BAAuB;AACvB,sBAAkG;AAClG,uBAAqB;AACrB,kBAQO;AACP,uBAAqB;AACrB,2BAA4B;AAwWlB,IAAAA,sBAAA;AAvUV,IAAM,YAAY,uBAAW,MAAM;AAAA,EACjC,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,gBAAgB,EAAE,SAAS,OAAO;AAAA,EAClC,gBAAgB;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,oBAAoB;AAAA,EACtB;AAAA,EACA,eAAe,EAAE,SAAS,SAAS;AAAA,EACnC,YAAY;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,8BAA8B,EAAE,iBAAiB,oBAAoB;AAAA,EACrE,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,qCAAqC,EAAE,SAAS,eAAe;AAAA,EAC/D,kBAAkB,EAAE,OAAO,OAAO;AAAA,EAClC,oCAAoC;AAAA,IAClC,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,2CAA2C;AAAA,IACzC,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA,EACA,8DAA8D,EAAE,WAAW,mBAAmB;AAAA,EAC9F,iDAAiD,EAAE,OAAO,sBAAsB;AAAA,EAChF,+BAA+B,EAAE,OAAO,sBAAsB;AAAA,EAC9D,wCAAwC,EAAE,iBAAiB,sBAAsB;AAAA,EACjF,8EAA8E;AAAA,IAC5E,iBAAiB;AAAA,EACnB;AAAA,EACA,mBAAmB;AAAA,IACjB,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACX;AAAA,EACA,2CAA2C,EAAE,iBAAiB,wBAAwB;AAAA,EACtF,cAAc,EAAE,iBAAiB,uBAAuB,OAAO,oBAAoB;AAAA,EACnF,eAAe;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,wBAAwB,+BAAe,OAAO;AAAA,EAClD,EAAE,KAAK,sBAAK,SAAS,OAAO,sBAAsB,WAAW,SAAS;AAAA,EACtE,EAAE,KAAK,CAAC,sBAAK,SAAS,sBAAK,gBAAgB,sBAAK,eAAe,GAAG,OAAO,wBAAwB;AAAA,EACjG,EAAE,KAAK,CAAC,sBAAK,QAAQ,sBAAK,QAAQ,sBAAK,MAAM,CAAC,GAAG,OAAO,wBAAwB;AAAA,EAChF,EAAE,KAAK,CAAC,sBAAK,QAAQ,sBAAK,MAAM,sBAAK,IAAI,GAAG,OAAO,wBAAwB;AAAA,EAC3E,EAAE,KAAK,CAAC,sBAAK,SAAS,sBAAK,YAAY,GAAG,sBAAK,SAAS,GAAG,OAAO,wBAAwB;AAAA,EAC1F,EAAE,KAAK,CAAC,sBAAK,UAAU,sBAAK,WAAW,sBAAK,SAAS,GAAG,OAAO,sBAAsB;AAAA,EACrF,EAAE,KAAK,CAAC,sBAAK,cAAc,sBAAK,aAAa,GAAG,OAAO,yBAAyB;AAAA,EAChF,EAAE,KAAK,CAAC,sBAAK,UAAU,sBAAK,WAAW,GAAG,OAAO,sBAAsB;AAAA,EACvE,EAAE,KAAK,sBAAK,SAAS,OAAO,wBAAwB;AAAA,EACpD,EAAE,KAAK,CAAC,sBAAK,SAAS,sBAAK,MAAM,GAAG,OAAO,qBAAqB,YAAY,MAAM;AAAA,EAClF,EAAE,KAAK,sBAAK,UAAU,WAAW,SAAS;AAAA,EAC1C,EAAE,KAAK,sBAAK,MAAM,OAAO,yBAAyB,gBAAgB,YAAY;AAAA,EAC9E,EAAE,KAAK,sBAAK,SAAS,OAAO,wBAAwB,gBAAgB,iBAAiB;AACvF,CAAC;AAED,IAAM,kBAAc,uBAAK;AACzB,IAAM,sBAAsB,oBAAI,IAAI,CAAC,QAAQ,SAAS,UAAU,SAAS,CAAC;AAC1E,IAAM,4BAA4B,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAC7D,IAAM,oCAAoC;AAC1C,IAAM,uBAAuB;AAE7B,SAAS,mBAAmB,OAAe;AACzC,MAAI,UAAU;AACd,aAAW,aAAa,MAAO,YAAW,cAAc,MAAO,IAAI;AACnE,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAc;AAC1C,QAAM,oBAAoB,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK;AACrD,MAAI,qBAAqB,KAAK,IAAI,EAAG,QAAO,KAAK,IAAI,mBAAmB,iBAAiB,GAAG,EAAE;AAC9F,SAAO,KAAK,IAAI,mBAAmB,iBAAiB,IAAI,GAAG,EAAE;AAC/D;AAEA,SAAS,4BAA4B,MAAiC;AACpE,QAAM,cAAc,CAAC;AACrB,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,aAAW,gBAAgB,KAAK,eAAe;AAC7C,QAAI,WAAW,aAAa;AAC5B,WAAO,YAAY,aAAa,IAAI;AAClC,YAAM,OAAO,KAAK,MAAM,IAAI,OAAO,QAAQ;AAC3C,UAAI,CAAC,eAAe,IAAI,KAAK,IAAI,GAAG;AAClC,cAAM,SAAS,qBAAqB,KAAK,IAAI;AAC7C,oBAAY,KAAK,uBAAW,KAAK;AAAA,UAC/B,YAAY,EAAE,OAAO,+BAA+B,MAAM,KAAK;AAAA,QACjE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AACnB,uBAAe,IAAI,KAAK,IAAI;AAAA,MAC9B;AACA,UAAI,KAAK,MAAM,aAAa,GAAI;AAChC,iBAAW,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,uBAAW,IAAI,aAAa,IAAI;AACzC;AAEA,IAAM,yBAAyB,uBAAW,UAAU,MAAM;AAAA,EAGxD,YAAY,MAAkB;AAC5B,SAAK,cAAc,4BAA4B,IAAI;AAAA,EACrD;AAAA,EAEA,OAAO,QAAoB;AACzB,SAAK,cAAc,4BAA4B,OAAO,IAAI;AAAA,EAC5D;AACF,GAAG;AAAA,EACD,aAAa,CAAC,WAAW,OAAO;AAClC,CAAC;AAED,IAAM,oBAAoB,IAAI,2BAAe;AAAA,EAC3C,QAAQ;AAAA,EACR,YAAY,uBAAW,KAAK,EAAE,OAAO,6BAA6B,CAAC;AACrE,CAAC;AAED,IAAM,yBAAyB,uBAAW,UAAU,MAAM;AAAA,EAGxD,YAAY,MAAkB;AAC5B,SAAK,cAAc,kBAAkB,WAAW,IAAI;AAAA,EACtD;AAAA,EAEA,OAAO,QAAoB;AACzB,SAAK,cAAc,kBAAkB,WAAW,QAAQ,KAAK,WAAW;AAAA,EAC1E;AACF,GAAG;AAAA,EACD,aAAa,CAAC,WAAW,OAAO;AAClC,CAAC;AAED,SAAS,0BAA0B,OAAe;AAChD,SAAO,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS;AACxC,UAAM,oBAAoB,KAAK,OAAO,IAAI;AAC1C,QAAI,oBAAoB,KAAK,KAAK,SAAS,qBAAqB,kCAAmC,QAAO;AAE1G,UAAM,cAAc,KAAK,MAAM,GAAG,iBAAiB;AACnD,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,KAAK,MAAM,iBAAiB,CAAC;AAChE,UAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAC1D,aAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,EAClC,MAAM,IAAI,EACV,IAAI,CAAC,kBAAkB,GAAG,WAAW,GAAG,aAAa,EAAE,EACvD,KAAK,IAAI;AAAA,IACd,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EAAE,KAAK,IAAI;AACd;AAEA,SAAS,qBAAqBC,WAAkB,OAAe;AAC7D,QAAM,mBAAmBA,UAAS,KAAK;AACvC,MAAI,qBAAqB,OAAO,qBAAqB,IAAK,QAAO;AAEjE,QAAM,oBAA8B,CAAC;AACrC,MAAI,iBAAiB;AACrB,MAAI,YAAY;AAEhB,WAAS,QAAQ,OAAO,QAAQA,UAAS,QAAQ,SAAS,GAAG;AAC3D,UAAM,YAAYA,UAAS,KAAK;AAChC,QAAI,gBAAgB;AAClB,UAAI,WAAW;AACb,oBAAY;AAAA,MACd,WAAW,cAAc,MAAM;AAC7B,oBAAY;AAAA,MACd,WAAW,cAAc,KAAK;AAC5B,yBAAiB;AAAA,MACnB;AACA;AAAA,IACF;AAEA,QAAI,cAAc,KAAK;AACrB,uBAAiB;AAAA,IACnB,WAAW,cAAc,KAAK;AAC5B,wBAAkB,KAAK,GAAG;AAAA,IAC5B,WAAW,cAAc,KAAK;AAC5B,wBAAkB,KAAK,GAAG;AAAA,IAC5B,WAAW,cAAc,OAAO,cAAc,KAAK;AACjD,UAAI,kBAAkB,IAAI,MAAM,UAAW,QAAO;AAClD,UAAI,kBAAkB,WAAW,EAAG,QAAO;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,uBAAuB,4BAAY,GAAG,CAAC,OAAO,WAAW,YAAY;AACzE,QAAM,OAAO,MAAM,IAAI,YAAY,WAAW,OAAO;AACrD,QAAM,oBAAoB,KAAK,OAAO,IAAI;AAC1C,MAAI,oBAAoB,EAAG,QAAO;AAElC,QAAM,iBAAiB,YAAY;AACnC,QAAM,mBAAmB,KAAK,iBAAiB;AAC/C,MAAI,qBAAqB,OAAO,qBAAqB,IAAK,QAAO;AAEjE,QAAMA,YAAW,MAAM,IAAI,SAAS;AACpC,QAAM,eAAe,qBAAqBA,WAAU,cAAc;AAClE,MAAI,iBAAiB,QAAQ,eAAe,iBAAiB,EAAG,QAAO;AAEvE,MAAI;AACF,UAAM,SAAkB,KAAK,MAAMA,UAAS,MAAM,gBAAgB,eAAe,CAAC,CAAC;AACnF,QAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,iBAAiB;AAAA,IACvB,IAAI;AAAA,EACN;AACF,CAAC;AAED,SAAS,gBAAgB,UAAmB,UAI1C;AACA,QAAM,aAAa,UAAU,KAAK,EAAE,YAAY;AAChD,QAAM,YAAY,UAAU,MAAM,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAC9E,MAAK,cAAc,oBAAoB,IAAI,UAAU,KAAO,aAAa,oBAAoB,IAAI,SAAS,GAAI;AAC5G,UAAM,cAAc;AAAA,MACjB,cAAc,0BAA0B,IAAI,UAAU,KACnD,aAAa,0BAA0B,IAAI,SAAS;AAAA,IAC1D;AACA,WAAO,EAAE,OAAO,cAAc,UAAU,QAAQ,SAAS,aAAa,YAAY;AAAA,EACpF;AACA,MAAI,cAAc,CAAC,CAAC,QAAQ,OAAO,aAAa,OAAO,EAAE,SAAS,UAAU,GAAG;AAC7E,WAAO,EAAE,OAAO,UAAU,KAAK,GAAG,SAAS,MAAM,aAAa,MAAM;AAAA,EACtE;AACA,SAAO,EAAE,SAAS,MAAM,aAAa,MAAM;AAC7C;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,cAAc;AAAA,EACd,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,uBAAmB,sBAAQ,MAAM,gBAAgB,UAAU,QAAQ,GAAG,CAAC,UAAU,QAAQ,CAAC;AAChG,QAAM,mBAAe;AAAA,IACnB,MAAM,CAAC,YAAY,iBAAiB,cAAc,0BAA0B,KAAK,IAAI;AAAA,IACrF,CAAC,UAAU,iBAAiB,aAAa,KAAK;AAAA,EAChD;AACA,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAsC,MAAM;AAChF,QAAM,qBAAiB,qBAA6C,IAAI;AAExE,8BAAU,MAAM,MAAM;AACpB,QAAI,eAAe,QAAS,cAAa,eAAe,OAAO;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,sBAAQ,MAAM;AAAA,IAC/B;AAAA,QACA,oCAAmB,qBAAqB;AAAA,IACxC,GAAI,iBAAiB,UAAU,CAAC,iBAAiB,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAI,iBAAiB,UAAU,CAAC,sBAAsB,IAAI,CAAC;AAAA,IAC3D,GAAI,iBAAiB,cAAc,CAAC,oBAAoB,IAAI,CAAC;AAAA,IAC7D,GAAI,cAAc,KAAC,4BAAW,OAAG,YAAAC,aAAiB,CAAC,IAAI,CAAC;AAAA,IACxD,GAAI,OAAO,CAAC,uBAAW,cAAc,sBAAsB,IAAI,CAAC;AAAA,EAClE,GAAG,CAAC,aAAa,iBAAiB,aAAa,iBAAiB,SAAS,IAAI,CAAC;AAE9E,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,eAAe,SAAS,YAAY;AAC1C,QAAM,eAAe,cACf,WAAW,GAAG,QAAQ,IAAI,WAAW,WAAW,QAAQ,KAAK,QAAQ,WAAW,WAAW,QAAQ;AAEzG,QAAM,WAAW,YAAY;AAC3B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,oBAAc,QAAQ;AAAA,IACxB,QAAQ;AACN,oBAAc,OAAO;AAAA,IACvB;AACA,QAAI,eAAe,QAAS,cAAa,eAAe,OAAO;AAC/D,mBAAe,UAAU,WAAW,MAAM,cAAc,MAAM,GAAG,IAAI;AAAA,EACvE;AAEA,QAAM,cAAc,iBAAiB,UAAa,YAAY;AAE9D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,CAAC,eAAe;AAAA,QAChB;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,uBACC,8CAAC,SAAI,WAAU,+BACb;AAAA,wDAAC,SAAI,WAAU,gCACZ;AAAA,6BAAiB,UAChB,6CAAC,UAAK,WAAU,6BAA4B,OAAO,OAAO,iBAAiB,WAAW,eAAe,QAClG,wBACH;AAAA,YAED,YAAY,iBAAiB,6CAAC,UAAK,WAAU,gCAAgC,yBAAc;AAAA,YAC3F,YAAY,6CAAC,UAAK,WAAU,4BAA2B,qBAAO;AAAA,aACjE;AAAA,UACC,YACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY,eAAe,WAAW,gBAAgB;AAAA,cACtD,SAAS,MAAM,KAAK,SAAS;AAAA,cAE5B;AAAA,+BAAe,WAAW,6CAAC,8BAAM,MAAM,IAAI,IAAK,6CAAC,6BAAK,MAAM,IAAI;AAAA,gBACjE,6CAAC,UAAM,yBAAe,WAAW,WAAW,eAAe,UAAU,gBAAgB,QAAO;AAAA;AAAA;AAAA,UAC9F;AAAA,WAEJ;AAAA,QAEF,6CAAC,SAAI,WAAU,+BACb;AAAA,UAAC,wBAAAC;AAAA,UAAA;AAAA,YACC,cAAY;AAAA,YACZ,OAAO;AAAA,YACP;AAAA,YACA,UAAU,CAAC;AAAA,YACX;AAAA,YACA;AAAA,YACA,OAAM;AAAA,YACN,YAAY;AAAA,cACV,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,qBAAqB;AAAA,cACrB,2BAA2B;AAAA,cAC3B,2BAA2B;AAAA,cAC3B,gBAAgB;AAAA,cAChB,SAAS;AAAA,YACX;AAAA,YACA,eAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA,QACA,6CAAC,UAAK,WAAU,8BAA6B,aAAU,UACpD,yBAAe,WAAW,8BAA8B,eAAe,UAAU,8BAA8B,IAClH;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC3aA,IAAAC,wBAA6B;AAmBf,IAAAC,sBAAA;AAHP,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,YAAY;AAAA,EACZ,YAAY,6CAAC,sCAAa,eAAY,QAAO,MAAM,IAAI;AAAA,EACvD;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE,6CAAC,SAAI,cAAY,WAAW,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAC/E,uDAAC,QAAG,WAAU,6BACX,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,YAAY,UAAU,MAAM,SAAS;AAC3C,UAAM,UAAU,YACd,6CAAC,UAAK,gBAAa,QAAO,WAAU,gCAAgC,eAAK,OAAM,IAE/E,6CAAC,OAAE,WAAU,6BAA4B,MAAM,KAAK,QAAQ,KAAK,SAAS,KAAK,SAC5E,eAAK,OACR;AAGF,WACE,8CAAC,QAAG,WAAU,6BACX;AAAA,cAAQ,KAAK,6CAAC,UAAK,eAAY,QAAO,WAAU,kCAAkC,qBAAU;AAAA,MAC5F;AAAA,SAF4C,KAG/C;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;;;ACjDA,IAAAC,SAAuB;AACvB,IAAAC,wBAAqC;AAMjC,IAAAC,sBAAA;AAFJ,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,SAAI,KAAU,+BAA4B,aAAY,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,OAAO;AAEhH;AACA,KAAK,cAAc;AAEnB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,SAAI,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AAE/E;AACA,WAAW,cAAc;AAEzB,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,QAAG,KAAU,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,OAAO;AAE7E;AACA,UAAU,cAAc;AAExB,IAAM,kBAAwB;AAAA,EAC5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,OAAE,KAAU,WAAW,GAAG,4BAA4B,SAAS,GAAI,GAAG,OAAO;AAElF;AACA,gBAAgB,cAAc;AAE9B,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,SAAI,KAAU,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,OAAO;AAEhF;AACA,YAAY,cAAc;AAE1B,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,6CAAC,SAAI,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AAE/E;AACA,WAAW,cAAc;AAQzB,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,MAAM,OAAO,aAAa,WAAW,GAAG,MAAM,GAAG,QAClD,8CAAC,SAAI,KAAU,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,OAClE;AAAA,YAAQ,6CAAC,SAAI,WAAU,8BAA8B,gBAAK;AAAA,IAC3D,6CAAC,QAAG,WAAU,+BAA+B,iBAAM;AAAA,IACnD,6CAAC,OAAE,WAAU,qCAAqC,uBAAY;AAAA,KAChE;AAEJ;AACA,YAAY,cAAc;AAQ1B,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,MAAM,cAAc,UAAU,WAAW,SAAS,GAAG,MAAM,GAAG,QAC/D;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,oBAAU,CAAgD;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,WAAW,GAAG,uBAAuB,YAAY,iCAAiC,SAAS;AAAA,MAC1F,GAAG;AAAA,MAEJ;AAAA,sDAAC,SAAI,WAAU,+BACb;AAAA,uDAAC,sBAAAC,QAAA,EAAW,MAAM,IAAI,WAAU,6BAA4B,eAAW,MAAC;AAAA,UACxE,6CAAC,UAAK,WAAU,6BAA6B,gBAAK;AAAA,WACpD;AAAA,QACC,iBAAiB,UAChB,6CAAC,SAAI,WAAU,+BACb,wDAAC,UAAK,WAAU,iCAAiC;AAAA;AAAA,UAAa;AAAA,UAAE,iBAAiB,IAAI,YAAY;AAAA,WAAW,GAC9G;AAAA;AAAA;AAAA,EAEJ;AAEJ;AACA,WAAW,cAAc;;;AClGzB,IAAAC,SAAuB;AAkDjB,IAAAC,sBAAA;AA3BN,IAAM,gBAAgB,CAAC,UACrB,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAE3E,IAAM,aAAmB;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,CAAC,UAA+C;AAClE,gBAAU,KAAK;AACf,UAAI,CAAC,MAAM,kBAAkB;AAC3B,yBAAiB,UAAU,cAAc,KAAK,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,wBAAwB,IAAI;AAAA,UAC5B,eAAe;AAAA,UACf;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACR,GAAG;AAAA,QAEH;AAAA,kBACC,6CAAC,UAAK,WAAU,6BAA4B,eAAY,QACrD,gBACH;AAAA,UAEF,6CAAC,UAAK,WAAU,8BAA8B,iBAAM;AAAA;AAAA;AAAA,IACtD;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;AAOzB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,SAAS,QAAQ,WAAW,GAAG,MAAM,GAAG,QACzC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,WAAW,cAAc;;;AC9FzB,IAAAC,SAAuB;AAmBL,IAAAC,sBAAA;AALlB,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,cAAc,MAAM,YAAY,IAAI,aAAa,GAAG,MAAM,GAAG,QAAQ;AACvF,UAAM,cAAoB,aAAM;AAChC,UAAM,UAAU,MAAM;AACtB,UAAM,gBAAgB,SAAS,WAAW,SAAY;AACtD,UAAM,QAAQ;AAAA,MAAC;AAAA;AAAA,QACb;AAAA,QACA;AAAA,QACA,IAAI,gBAAgB,UAAU;AAAA,QAC9B,aAAa,gBAAiB,eAAe,MAAO;AAAA,QACpD,qBAAmB;AAAA,QACnB,WAAW,GAAG,mBAAmB,iBAAiB,SAAS;AAAA,QAC1D,GAAG;AAAA,QACJ,cAAY,MAAM,YAAY,MAAM,SAAS,YAAY,CAAC,MAAM,iBAAiB,IAAI,cAAc,WAAW;AAAA;AAAA,IAChH;AACA,QAAI,CAAC,cAAe,QAAO;AAC3B,WAAO;AAAA,MAAC;AAAA;AAAA,QAAI,WAAU;AAAA,QAAyB,qBAAmB;AAAA,QAChE,qBAAmB,CAAC,QAAQ,kBAAkB,QAAQ,SAAS,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,QAAQ,EAAE,KAAK;AAAA,QACxH;AAAA;AAAA,UACD,6CAAC,WAAM,WAAU,iCAAgC,SAAS,SAAU,sBAAW;AAAA;AAAA;AAAA,IACjF;AAAA,EACF;AAEF;AACA,MAAM,cAAc;;;ACtCpB,IAAAC,SAAuB;AACvB,IAAAC,wBAAsD;AA2BhD,IAAAC,sBAAA;AAdC,IAAM,cAAoB;AAAA,EAC/B,CAAC;AAAA,IACC,aAAa;AAAA,IACb,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,SAAS,eAAe;AAC9B,UAAM,aAAa,SAAS,6CAAuB;AAEnD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,wBAAwB,SAAS;AAAA,QAC/C,oBAAkB;AAAA,QAClB,qBAAmB;AAAA,QAEnB;AAAA,uDAAC,cAAW,WAAU,8BAA6B,MAAM,IAAI,eAAY,QAAO;AAAA,UAChF;AAAA,YAAC;AAAA;AAAA,cACE,GAAG;AAAA,cACJ;AAAA,cACA;AAAA,cACA,MAAK;AAAA,cACL,WAAW,GAAG,+BAA+B,cAAc;AAAA,cAC3D,aAAa,gBAAgB,SAAS,0CAAqC;AAAA,cAC3E,OAAO,UAAU,SAAS,qDAAqD;AAAA;AAAA,UACjF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;;;AC/C1B,IAAAC,SAAuB;AACvB,IAAAC,wBAA4B;AA2CtB,IAAAC,sBAAA;AAlCC,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,WAAiB,cAAyB,IAAI;AACpD,QAAM,eAAe,OAAO,SAAS,YAAY;AACjD,QAAM,iBAAiB,KAAK,IAAI,OAAO,SAAS,gBAAgB,EAAE,EAAE,QAAQ,CAAC;AAC7E,QAAM,eAAe,OAAO,MAAM,YAAY,MAAM,WAAW,MAAM,YAAY,IAAI,MAAM,cAAc;AACzG,QAAM,oBAAoB,YACrB,YACC,OAAO,SAAS,YAAY,KAAK,QAAQ,UAAa,gBAAgB,OAAO,GAAG;AACtF,QAAM,oBAAoB,YACrB,YACC,OAAO,SAAS,YAAY,KAAK,QAAQ,UAAa,gBAAgB,OAAO,GAAG;AAEtF,QAAM,eAAe,CAAC,cAAsB;AAC1C,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AACZ,QAAI,cAAc,GAAI,OAAM,SAAS;AAAA,QAChC,OAAM,OAAO;AAClB,UAAM,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACzD,UAAM,MAAM;AAAA,EACd;AAEA,SACE,8CAAC,SAAI,qBAAmB,aAAa,WAAW,GAAG,wBAAwB,QAAQ,mCAAmC,SAAS,GAC7H;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IACC,QACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,MAAM,wCAAwC,cAAc,MAAM;AAAA,QAC3E,eAAY;AAAA,QAEX;AAAA;AAAA,IACH;AAAA,IAEF,8CAAC,SAAI,WAAU,iCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY,YAAY,YAAY;AAAA,UACpC,UAAU;AAAA,UACV,SAAS,MAAM,aAAa,EAAE;AAAA,UAE9B,uDAAC,+BAAM,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,MACtC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY,YAAY,YAAY;AAAA,UACpC,UAAU;AAAA,UACV,SAAS,MAAM,aAAa,CAAC;AAAA,UAE7B,uDAAC,8BAAK,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,MACrC;AAAA,OACF;AAAA,KACF;AAEJ;;;ACDQ,IAAAC,sBAAA;AAvDD,SAAS,OAAO,OAAoB;AACzC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb,cAAc,CAAC,UAAU;AAAA,IACzB,QAAQ;AAAA,EACV,IAAI;AACJ,QAAM,OAAO,KAAK,IAAI,MAAM,KAAK,CAAC;AAClC,QAAM,YAAY,UAAU,IACvB,MAA2B,QAC5B,CAAE,MAA4B,KAAK;AACvC,QAAM,aAAa,MAAM,UAAU,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,cAAc,UAAU,IAAI,MAAM,UAAU,CAAC,GAAG,YAAY,GAAG,IAAI;AACzE,QAAM,iBAAiB,UAAU,IAAI,aAAa;AAClD,QAAM,eAAe;AACrB,QAAM,yBAA0B,iBAAiB,OAAO,OAAQ;AAChE,QAAM,uBAAwB,eAAe,OAAO,OAAQ;AAE5D,QAAM,oBAAoB,CAAC,UAAkB;AAC3C;AAAC,IAAC,MAA4B,cAAc,MAAM,OAAO,KAAK,GAAG,CAAC;AAAA,EACpE;AACA,QAAM,mBAAmB,CAAC,WAAmB,cAAsB;AACjE;AAAC,IAAC,MAA2B,cAAc;AAAA,MACzC,MAAM,WAAW,KAAK,SAAS;AAAA,MAC/B,MAAM,WAAW,WAAW,GAAG;AAAA,IACjC,CAAC;AAAA,EACH;AACA,QAAM,mBAAmB,CAAC,OAA8C,UAAkB;AACxF,UAAM,WAAW,OAAO;AACxB,UAAM,cAAsC;AAAA,MAC1C,WAAW,CAAC;AAAA,MACZ,WAAW,CAAC;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,IACV;AAEA,QAAI,MAAM,QAAQ,OAAQ,QAAO;AACjC,QAAI,MAAM,QAAQ,MAAO,QAAO;AAChC,QAAI,EAAE,MAAM,OAAO,aAAc,QAAO;AACxC,WAAO,QAAQ,YAAY,MAAM,GAAG;AAAA,EACtC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,YAAY,4BAA4B,SAAS;AAAA,MACjF,iBAAe,YAAY;AAAA,MAC3B,cAAY;AAAA,MAEX;AAAA,sBACC,8CAAC,SAAI,WAAU,yBAAwB,eAAY,QACjD;AAAA,uDAAC,YAAQ,sBAAY,UAAU,GAAE;AAAA,UAChC,UAAU,KAAK,6CAAC,YAAQ,sBAAY,WAAW,GAAE;AAAA,WACpD;AAAA,QAEF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,oCAAoC,GAAG,qBAAqB;AAAA,cAC5D,kCAAkC,GAAG,mBAAmB;AAAA,YAC1D;AAAA,YAEA;AAAA,2DAAC,UAAK,WAAU,wBAAuB,eAAY,QAAO;AAAA,cAC1D,6CAAC,UAAK,WAAU,4BAA2B,eAAY,QAAO;AAAA,cAC9D;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAY,UAAU,IACjB,MAA2B,kBAAkB,gBAC7C,MAA4B,aAAa;AAAA,kBAC9C;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UAAU,CAAC,UAAU;AACnB,0BAAM,YAAY,MAAM,cAAc;AACtC,wBAAI,UAAU,EAAG,kBAAiB,KAAK,IAAI,WAAW,WAAW,GAAG,WAAW;AAAA,wBAC1E,mBAAkB,SAAS;AAAA,kBAClC;AAAA,kBACA,WAAW,CAAC,UAAU;AACpB,0BAAM,YAAY,iBAAiB,OAAO,UAAU;AACpD,wBAAI,cAAc,KAAM;AACxB,0BAAM,eAAe;AACrB,wBAAI,UAAU,EAAG,kBAAiB,KAAK,IAAI,WAAW,WAAW,GAAG,WAAW;AAAA,wBAC1E,mBAAkB,SAAS;AAAA,kBAClC;AAAA,kBACA;AAAA,kBACA,MAAK;AAAA,kBACL,OAAO;AAAA;AAAA,cACT;AAAA,cACC,UAAU,KACT;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAa,MAA2B,kBAAkB;AAAA,kBAC1D;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UAAU,CAAC,UAAU;AACnB,0BAAM,YAAY,MAAM,cAAc;AACtC,qCAAiB,YAAY,KAAK,IAAI,WAAW,UAAU,CAAC;AAAA,kBAC9D;AAAA,kBACA,WAAW,CAAC,UAAU;AACpB,0BAAM,YAAY,iBAAiB,OAAO,WAAW;AACrD,wBAAI,cAAc,KAAM;AACxB,0BAAM,eAAe;AACrB,qCAAiB,YAAY,KAAK,IAAI,WAAW,UAAU,CAAC;AAAA,kBAC9D;AAAA,kBACA;AAAA,kBACA,MAAK;AAAA,kBACL,OAAO;AAAA;AAAA,cACT;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,MAAM,OAAe,SAAiB,SAAiB;AAC9D,SAAO,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,CAAC;AACnD;;;ACvJA,IAAAC,SAAuB;AACvB,IAAAC,wBAA8B;AA0BxB,IAAAC,uBAAA;AAhBN,IAAM,gBAAsB;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,iBAAiB,kBAAkB,IAAU,gBAAS,KAAK;AAClE,UAAM,cAAc,kBAAkB,oBAAoB;AAE1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,0BAA0B,SAAS;AAAA,QACjD,qBAAmB;AAAA,QACnB,yBAAuB,kBAAkB,KAAK;AAAA,QAE9C;AAAA;AAAA,YAAC;AAAA;AAAA,cACE,GAAG;AAAA,cACJ;AAAA,cACA;AAAA,cACA,WAAU;AAAA,cACV;AAAA,cACA,MAAM,kBAAkB,SAAS;AAAA;AAAA,UACnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY;AAAA,cACZ,gBAAc;AAAA,cACd;AAAA,cACA,OAAO;AAAA,cACP,SAAS,MAAM,mBAAmB,CAAC,YAAY,CAAC,OAAO;AAAA,cAEtD,4BACG,8CAAC,kCAAS,eAAY,QAAO,MAAM,IAAI,IACvC,8CAAC,6BAAI,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,UACxC;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;;;ACzD5B,IAAAC,SAAuB;AAYnB,IAAAC,uBAAA;AAFJ,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,cAAc,MAAM,GAAG,MAAM,GAAG,QAC5C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,qBAAmB;AAAA,MACnB,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACvC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,MAAM,cAAc;;;ACpBpB,IAAAC,SAAuB;AACvB,IAAAC,wBAA8D;AAwBxD,IAAAC,uBAAA;AAbN,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,UAAU,WAAW,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ;AACrE,UAAM,cAAc,aAAa,OAAO;AAExC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW,GAAG,iBAAiB,kBAAkB,OAAO,IAAI,SAAS;AAAA,QACpE,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,sBAAqB,eAAW,MAC7C,kBAAQ,8CAAC,eAAY,MAAM,IAAI,GAClC;AAAA,UACA,8CAAC,SAAI,WAAU,yBAAyB,UAAS;AAAA;AAAA;AAAA,IACnD;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;AAEpB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,QAAG,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AAE9E;AACA,WAAW,cAAc;AAEzB,IAAM,mBAAyB;AAAA,EAC7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,6BAA6B,SAAS,GAAI,GAAG,OAAO;AAErF;AACA,iBAAiB,cAAc;;;ACrD/B,IAAAC,UAAuB;AACvB,uBAA6B;AAC7B,IAAAC,wBAAqE;AA4EjE,IAAAC,uBAAA;AA/CJ,IAAMC,gBAAe;AAAA,EACnB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,QAAc,mBAAuC,SAASC,OACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,KAAK;AAChD,QAAM,aAAmB,eAAO,SAAS;AACzC,QAAM,cAAcD,cAAa,OAAO;AACxC,QAAM,mBAAmB,aAAa,SACjC,YAAY,UAAU,OAAO,MAC9B;AAEJ,EAAM,kBAAU,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,SAAS,CAAC;AAEd,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,WAAW,WAAW,UAAU,qBAAqB,QAAQ,oBAAoB,EAAG;AACzF,UAAM,UAAU,OAAO,WAAW,MAAM,WAAW,UAAU,GAAG,gBAAgB;AAChF,WAAO,MAAM,OAAO,aAAa,OAAO;AAAA,EAC1C,GAAG,CAAC,QAAQ,gBAAgB,CAAC;AAE7B,QAAM,mBAAmB,SAAS,YAAY,UAAU,UAAU;AAElE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAY;AAAA,MACZ,aAAW,qBAAqB,UAAU,cAAc;AAAA,MACxD,WAAW,GAAG,iBAAiB,kBAAkB,OAAO,IAAI,SAAS;AAAA,MACrE,MAAM;AAAA,MACN,eAAe,CAAC,UAAU;AACxB,wBAAgB,KAAK;AACrB,YAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,EAAG,WAAU,KAAK;AAAA,MACzE;AAAA,MACA,gBAAgB,CAAC,UAAU;AACzB,yBAAiB,KAAK;AACtB,kBAAU,IAAI;AAAA,MAChB;AAAA,MACA,gBAAgB,CAAC,UAAU;AACzB,yBAAiB,KAAK;AACtB,kBAAU,IAAI;AAAA,MAChB;AAAA,MACA,gBAAgB,CAAC,UAAU;AACzB,yBAAiB,KAAK;AACtB,kBAAU,KAAK;AAAA,MACjB;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,eAAY,QAAO,WAAU,uBAChC,kBAAQ,8CAAC,eAAY,MAAM,IAAI,GAClC;AAAA,QACA,8CAAC,SAAI,WAAU,0BAA0B,UAAS;AAAA,QACjD,UAAU,8CAAC,SAAI,WAAU,yBAAyB,kBAAO;AAAA,QAC1D;AAAA,UAAC;AAAA;AAAA,YACC,cAAY;AAAA,YACZ,WAAU;AAAA,YACV,SAAS;AAAA,YACT,MAAK;AAAA,YAEL,wDAAC,+BAAM,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,QACtC;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAEM,IAAM,gBAAsB,mBAA+C,SAASE,eACzF,EAAE,UAAU,WAAW,SAAS,MAAM,WAAW,cAAc,GAAG,MAAM,GACxE,KACA;AACA,QAAM,WACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,0BAA0B,2BAA2B,QAAQ,IAAI,SAAS;AAAA,MACxF,iBAAe;AAAA,MACd,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAGF,MAAI,CAAC,UAAU,OAAO,aAAa,YAAa,QAAO;AACvD,aAAO,+BAAa,UAAU,SAAS,IAAI;AAC7C,CAAC;;;AC5HG,IAAAC,uBAAA;AAFG,SAAS,OAAO,EAAE,SAAS,UAAU,OAAO,UAAU,GAAgB;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACzC,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAEhC;AAAA,sDAAC,UAAK,WAAW,GAAG,wBAAwB,WAAW,+BAA+B,GACpF,wDAAC,UAAK,WAAW,GAAG,wBAAwB,WAAW,+BAA+B,GAAG,GAC3F;AAAA,QACC,SAAS,8CAAC,UAAK,WAAU,wBAAwB,iBAAM;AAAA;AAAA;AAAA,EAC1D;AAEJ;;;ACzBA,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;;;ACD7B,IAAAC,gBAAkC;AAuBlC,IAAI,SAAS;AACb,IAAM,QAAuB,CAAC;AAE9B,SAAS,aAAa,OAA0B;AAC9C,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,YAAY,MAAM,UAAU;AAC9D,QAAI,MAAM,CAAC,EAAE,aAAa,MAAM,SAAU;AAC1C;AAAA,EACF;AACA,QAAM,OAAO,GAAG,GAAG,KAAK;AAC1B;AAEA,SAAS,OAAO,IAAkB;AAChC,QAAM,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAC9C,MAAI,OAAO,EAAG,OAAM,OAAO,KAAK,CAAC;AACnC;AAEA,IAAI,oBAAoB;AAExB,SAAS,uBAA6B;AACpC,MAAI,kBAAmB;AACvB,sBAAoB;AAEpB,SAAO;AAAA,IACL;AAAA,IACA,CAAC,MAAqB;AACpB,UAAI,EAAE,QAAQ,SAAU;AACxB,UAAI,MAAM,WAAW,EAAG;AAExB,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAE3B,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,QAAQ;AAAA,IACd;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AACF;AASO,SAAS,iBACd,UACA,SACA,UAAU,MACJ;AACN,QAAM,iBAAa,sBAAO,OAAO;AACjC,aAAW,UAAU;AAErB,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,yBAAqB;AAErB,UAAM,KAAK;AACX,UAAM,QAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,SAAS,MAAM,WAAW,QAAQ;AAAA,IACpC;AACA,iBAAa,KAAK;AAElB,WAAO,MAAM,OAAO,EAAE;AAAA,EACxB,GAAG,CAAC,UAAU,OAAO,CAAC;AACxB;;;AC5FA,IAAAC,gBAA0C;AAsChC,IAAAC,uBAAA;AArBV,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,QAAQ;AAGP,SAAS,SAAS,EAAE,OAAO,IAAI,OAAO,WAAW,WAAW,OAAO,QAAQ,WAAW,aAAa,MAAM,GAAkB;AAChI,QAAM,YAAQ,qBAAM,EAAE,QAAQ,mBAAmB,EAAE;AACnD,QAAM,SAAS,0BAA0B,KAAK;AAC9C,QAAM,aAAa,8BAA8B,KAAK;AACtD,QAAM,SAAS,OAAO,SAAS,WAAW,GAAG,IAAI,OAAO;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,cAAc;AAAA,MAC3B,cAAY,aAAa,SAAY;AAAA,MACrC,WAAW,GAAG,qBAAqB,sBAAsB,IAAI,IAAI,SAAS;AAAA,MAC1E,MAAM,aAAa,SAAY;AAAA,MAC/B;AAAA,MAEA,yDAAC,SAAI,eAAY,QAAO,MAAK,QAAO,SAAQ,cAAa,OAAO,EAAE,QAAQ,OAAO,OAAO,GACtF;AAAA,uDAAC,UACC;AAAA,yDAAC,oBAAe,IAAI,YAAY,IAAG,MAAK,IAAG,QAAO,IAAG,KAAI,IAAG,QAAO,eAAc,kBAC/E;AAAA,0DAAC,UAAK,WAAU,iCAAgC,QAAO,KAAI;AAAA,YAC3D,8CAAC,UAAK,WAAU,+BAA8B,QAAO,KAAI;AAAA,aAC3D;AAAA,UACA,+CAAC,oBAAe,IAAI,GAAG,UAAU,UAAU,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACjE;AAAA,0DAAC,UAAK,QAAO,OAAM,WAAU,SAAQ,aAAY,KAAI;AAAA,YACrD,8CAAC,UAAK,QAAO,OAAM,WAAU,SAAQ,aAAY,QAAO;AAAA,YACxD,8CAAC,UAAK,QAAO,OAAM,WAAU,SAAQ,aAAY,KAAI;AAAA,aACvD;AAAA,UACA,+CAAC,cAAS,IAAI,QAAQ;AAAA,0DAAC,UAAK,GAAG,MAAM;AAAA,YAAE,8CAAC,UAAK,GAAG,QAAQ;AAAA,YAAE,8CAAC,UAAK,GAAG,OAAO;AAAA,aAAE;AAAA,WAC9E;AAAA,QACA,8CAAC,UAAK,GAAG,QAAQ,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC9C,8CAAC,UAAK,GAAG,OAAO,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC7C,8CAAC,UAAK,GAAG,MAAM,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC5C,8CAAC,OAAE,UAAU,QAAQ,MAAM,KACzB,wDAAC,OAAE,WAAU,iCAAgC,WAAU,iCACrD,wDAAC,UAAK,WAAU,4BAA2B,GAAE,QAAO,GAAE,QAAO,OAAM,OAAM,QAAO,OAAM,MAAM,QAAQ,UAAU,WAAW,GAC3H,GACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AF1BI,IAAAC,uBAAA;AAFJ,IAAM,YAAY,MAChB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAChE,wDAAC,UAAK,GAAE,wBAAuB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GACtH;AAGK,SAAS,MAAM,EAAE,MAAM,SAAS,OAAO,UAAU,QAAQ,MAAM,QAAQ,SAAS,gBAAgB,OAAO,OAAO,MAAM,UAAU,OAAO,eAAe,WAAW,aAAa,OAAO,UAAU,GAAe;AACjN,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,KAAK;AAC5D,mBAAiB,IAAI,SAAS,QAAQ,CAAC,WAAW,CAAC,aAAa;AAEhE,EAAM,kBAAU,MAAM;AACpB,QAAI,KAAM,iBAAgB,KAAK;AAAA,EACjC,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,wBAAwB,IAAI;AAC9C,QAAM,cAAc,SAAS,gCAAgC,OAAO,8BAA8B;AAElG,aAAO;AAAA,IACL,8CAAC,SAAI,WAAU,yBAAwB,SAAS,WAAW,gBAAgB,SAAY,SACrF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,uBAAuB,WAAW,aAAa,cAAc,mCAAmC,SAAS;AAAA,QACvH,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAElC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,cAAc;AAAA,gBACd,cAAc,gBAAgB;AAAA,cAChC;AAAA,cAEA;AAAA,8DAAC,QAAG,WAAW,GAAG,uBAAuB,UAAU,+BAA+B,QAAQ,2BAA2B,GAClH,iBACH;AAAA,gBACC,CAAC,WACA,8CAAC,YAAO,MAAK,UAAS,SAAS,SAAS,OAAM,SAAQ,UAAU,eAAe,WAAU,uBACvF,wDAAC,aAAU,GACb;AAAA;AAAA;AAAA,UAEJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,aAAW,WAAW;AAAA,cACtB,WAAW;AAAA,gBACT;AAAA,gBACA,SAAS,QAAQ;AAAA,gBACjB,WAAW;AAAA,gBACX,cAAc;AAAA,cAChB;AAAA,cACA,UAAU,aAAa,CAAC,UAAU,gBAAgB,MAAM,cAAc,YAAY,CAAC,IAAI;AAAA,cAEtF,oBAAU,8CAAC,YAAS,OAAO,cAAc,IAAK;AAAA;AAAA,UACjD;AAAA,UACC,UACC,8CAAC,SAAI,WAAW,GAAG,wBAAwB,cAAc,+BAA+B,GACrF,kBACH;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AG9FA,IAAAC,gBAAyE;AACzE,IAAAC,oBAA6B;AAC7B,IAAAC,wBAAyB;AAiEuD,IAAAC,uBAAA;AA/CzE,SAAS,kBAAkB,EAAE,OAAO,OAAO,UAAU,SAAS,GAA6G;AAChL,QAAM,SAAK,qBAAM;AACjB,QAAM,cAAU,sBAA0B,IAAI;AAC9C,QAAM,YAAQ,sBAAuB,IAAI;AACzC,QAAM,kBAAc,sBAAO,KAAK;AAChC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AAC5D,QAAM,UAAU,MAAM,CAAC,GAAI,MAAM,SAAS,iBAAoC,uBAAuB,KAAK,CAAC,CAAE;AAC7G,QAAM,QAAQ,CAAC,UAAU,SAAS;AAAE,YAAQ,KAAK;AAAG,QAAI,QAAS,SAAQ,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAAE;AAEjH,mBAAiB,KAAK,MAAM,MAAM,GAAG,IAAI;AAEzC,qCAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,QAAQ,WAAW,CAAC,MAAM,QAAS;AACjD,UAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,QAAQ,QAAS,sBAAsB;AACtD,YAAM,OAAO,MAAM,QAAS,sBAAsB;AAClD,YAAM,QAAQ,OAAO,cAAc,OAAO,SAAS,KAAK,SAAS,KAAK,OAAO,MAAM,OAAO,cAAc,OAAO;AAC/G,kBAAY;AAAA,QACV,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO,SAAS,GAAG,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC;AAAA,QACzH,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,QAAQ,KAAK,OAAO,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC3F,CAAC;AAAA,IACH;AACA,UAAM;AACN,UAAM,UAAU,QAAQ;AACvB,KAAC,YAAY,UAAU,QAAQ,QAAQ,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM,EAAE,eAAe,KAAK,CAAC;AAChG,QAAI,QAAQ,WAAW,EAAG,OAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AACrE,UAAM,UAAU,CAAC,UAAwB;AACvC,UAAI,CAAC,MAAM,SAAS,SAAS,MAAM,MAAc,KAAK,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IACvH;AACA,UAAM,SAAS,CAAC,UAAiB;AAAE,UAAI,CAAC,MAAM,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IAAE;AACtG,UAAM,WAAW,IAAI,eAAe,KAAK;AACzC,aAAS,QAAQ,MAAM,OAAO;AAC9B,aAAS,iBAAiB,eAAe,OAAO;AAChD,WAAO,iBAAiB,UAAU,QAAQ,IAAI;AAC9C,WAAO,iBAAiB,UAAU,KAAK;AACvC,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,eAAS,oBAAoB,eAAe,OAAO;AACnD,aAAO,oBAAoB,UAAU,QAAQ,IAAI;AACjD,aAAO,oBAAoB,UAAU,KAAK;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACT,qCAAgB,MAAM;AAAE,QAAI,YAAY,MAAM,WAAW,EAAG,SAAQ,KAAK;AAAA,EAAE,GAAG,CAAC,UAAU,MAAM,MAAM,CAAC;AAEtG,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,+CAAC,SAAI,WAAU,kCACpB;AAAA;AAAA,MAAC;AAAA;AAAA,QAAO,KAAK;AAAA,QAAS,YAAW;AAAA,QAAQ,aAAY;AAAA,QAAK,aAAW;AAAA,QAAC,MAAM,8CAAC,kCAAS,eAAW,MAAC;AAAA,QAChG,cAAY;AAAA,QAAO,iBAAc;AAAA,QAAO,iBAAe;AAAA,QAAM,iBAAe,OAAO,KAAK;AAAA,QAAW;AAAA,QACnG,SAAS,MAAM;AAAE,sBAAY,UAAU;AAAO,kBAAQ,CAAC,IAAI;AAAA,QAAE;AAAA,QAC7D,WAAW,WAAS;AAClB,cAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACxD,kBAAM,eAAe;AAAG,wBAAY,UAAU,MAAM,QAAQ;AAAW,oBAAQ,IAAI;AAAA,UACrF;AAAA,QACF;AAAA;AAAA,IAAG;AAAA,IACJ,YAAQ,gCAAa;AAAA,MAAC;AAAA;AAAA,QAAI,KAAK;AAAA,QAAO;AAAA,QAAQ,MAAK;AAAA,QAAO,UAAU;AAAA,QAAI,cAAY;AAAA,QACnF,WAAU;AAAA,QAA8B,OAAO;AAAA,QAC/C,SAAS,WAAS,MAAM,gBAAgB;AAAA,QACxC,WAAW,WAAS;AAClB,gBAAM,gBAAgB;AACtB,gBAAM,UAAU,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,aAAkC;AAC9F,cAAI,MAAM,QAAQ,UAAU;AAAE,kBAAM,eAAe;AAAG,kBAAM;AAAA,UAAE,WACrD,MAAM,QAAQ,OAAO;AAAE,kBAAM;AAAA,UAAE,WAC/B,CAAC,aAAa,WAAW,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG;AACpE,kBAAM,eAAe;AACrB,kBAAM,OAAO,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,QAAQ,SAAS,KAAK,SAAS,MAAM,QAAQ,cAAc,IAAI,MAAM,QAAQ,UAAU,QAAQ;AAC7J,oBAAQ,IAAI,GAAG,MAAM;AAAA,UACvB,WAAW,MAAM,IAAI,WAAW,KAAK,KAAK,KAAK,MAAM,GAAG,GAAG;AACzD,kBAAM,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ,CAAC,GAAG,GAAG,QAAQ,MAAM,GAAG,QAAQ,CAAC,CAAC;AAC5E,oBAAQ,KAAK,YAAU,OAAO,aAAa,KAAK,EAAE,kBAAkB,EAAE,WAAW,MAAM,IAAI,kBAAkB,CAAC,CAAC,GAAG,MAAM;AAAA,UAC1H;AAAA,QACF;AAAA,QACC,gBAAM,IAAI,UAAQ;AAAA,UAAC;AAAA;AAAA,YAAwB,MAAK;AAAA,YAAS,MAAK;AAAA,YAAW,UAAU;AAAA,YAAI,UAAU,KAAK;AAAA,YACrG,SAAS,MAAM;AAAE,uBAAS,KAAK,KAAK;AAAG,oBAAM;AAAA,YAAE;AAAA,YAC9C;AAAA,mBAAK,QAAQ,8CAAC,UAAK,eAAY,QAAQ,eAAK,MAAK;AAAA,cAAS,KAAK;AAAA;AAAA;AAAA,UAFlC,KAAK;AAAA,QAGrC,CAAS;AAAA;AAAA,IACX,GAAQ,SAAS,IAAI;AAAA,KACvB;AACF;;;AClGA,IAAAC,gBAAsF;AAwD7E,IAAAC,uBAAA;AAnCT,IAAM,SAAS,CAAC,UAAuC,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAC3F,SAAS,YAAY,QAA0C;AACpE,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,wBAAwB,CAAC,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG,IAAI,SAAY,QAAQ,OAAO,KAAK;AAAA,IACtG,sBAAsB,OAAO,OAAO,QAAQ;AAAA,IAC5C,sBAAsB,OAAO,OAAO,QAAQ;AAAA,EAC9C;AACF;AAGA,SAAS,cAAc;AACrB,QAAM,UAAM,sBAAuB,IAAI;AACvC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAC9C,qCAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM,YAAY,GAAG,cAAc,GAAG,cAAc,KAAK,GAAG,eAAe,GAAG,eAAe,CAAC;AAC9G,UAAM,SAAS,IAAI,eAAe,OAAO;AACzC,UAAM,UAAU,MAAM;AACpB,aAAO,WAAW;AAClB,aAAO,QAAQ,EAAE;AACjB,iBAAW,SAAS,GAAG,SAAU,QAAO,QAAQ,KAAK;AACrD,cAAQ;AAAA,IACV;AACA,UAAM,WAAW,IAAI,iBAAiB,OAAO;AAC7C,aAAS,QAAQ,IAAI,EAAE,WAAW,MAAM,SAAS,MAAM,eAAe,KAAK,CAAC;AAC5E,YAAQ;AACR,WAAO,MAAM;AAAE,aAAO,WAAW;AAAG,eAAS,WAAW;AAAA,IAAE;AAAA,EAC5D,GAAG,CAAC,CAAC;AACL,SAAO,EAAE,KAAK,SAAS;AACzB;AAEO,SAAS,cAAc,EAAE,UAAU,WAAW,MAAM,GAAwE;AACjI,QAAM,EAAE,KAAK,SAAS,IAAI,YAAY;AACtC,SAAO,8CAAC,SAAI,KAAU,WAAU,0BAAyB,OAAO,EAAE,UAAU,GAAG,UAAU,WAAW,IAAI,QAAW,MAAM,WAAW,WAAW,QAAW,cAAY,WAAW,GAAG,KAAK,uBAAuB,QAAY,UAAS;AACvO;AAEO,SAAS,iBAAiB,EAAE,UAAU,MAAM,GAA2C;AAC5F,QAAM,EAAE,KAAK,SAAS,IAAI,YAAY;AACtC,qCAAgB,MAAM;AACpB,UAAM,OAAO,IAAI;AACjB,QAAI,CAAC,KAAM;AAGX,UAAM,QAAQ,CAAC,UAAsB;AACnC,UAAI,MAAM,oBAAoB,MAAM,WAAW,CAAC,MAAM,cAAc,KAAK,IAAI,MAAM,MAAM,KAAK,KAAK,IAAI,MAAM,MAAM,EAAG;AACtH,YAAM,QAAQ,KAAK,cAAc,KAAK;AACtC,UAAI,SAAS,EAAG;AAChB,YAAM,MAAM,iBAAiB,IAAI,EAAE,cAAc;AACjD,YAAM,OAAO,MAAM,CAAC,QAAQ,GAAG,QAAQ,MAAM,IAAI;AACjD,UAAI,MAAM,SAAS,IAAI,KAAK,aAAa,QAAQ,IAAI,KAAK,aAAa,OAAO,EAAG;AACjF,YAAM,QAAQ,KAAK,QAAqB,yBAAyB;AACjE,UAAI,CAAC,MAAO;AACZ,YAAM,aAAa,MAAM,cAAc,MAAM;AAC7C,YAAM,WAAW,iBAAiB,KAAK,EAAE,cAAc;AACvD,YAAM,YAAY,WAAW,CAAC,aAAa,GAAG,aAAa,WAAW,IAAI;AAC1E,UAAI,MAAM,SAAS,IAAI,MAAM,cAAc,aAAa,IAAI,MAAM,cAAc,YAAY,EAAG;AAC/F,YAAM,OAAO,MAAM,cAAc,IAAI,WAAW,iBAAiB,IAAI,EAAE,UAAU,KAAK,KAAK,MAAM,cAAc,IAAI,MAAM,cAAc;AACvI,YAAM,eAAe;AACrB,YAAM,cAAc,MAAM,SAAS;AAAA,IACrC;AACA,SAAK,iBAAiB,SAAS,OAAO,EAAE,SAAS,MAAM,CAAC;AACxD,WAAO,MAAM,KAAK,oBAAoB,SAAS,KAAK;AAAA,EACtD,GAAG,CAAC,GAAG,CAAC;AACR,SAAO;AAAA,IAAC;AAAA;AAAA,MAAI;AAAA,MAAU,WAAU;AAAA,MAA4B,iBAAe,YAAY;AAAA,MACrF,UAAU,WAAW,IAAI;AAAA,MAAW,MAAM,WAAW,WAAW;AAAA,MAAW,cAAY,WAAW,GAAG,KAAK,2CAA2C;AAAA,MACrJ,WAAW,WAAS;AAClB,YAAI,CAAC,YAAY,MAAM,WAAW,MAAM,cAAe;AAEvD,YAAI,CAAC,aAAa,cAAc,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG;AAClE,gBAAM,eAAe;AAAG,gBAAM,gBAAgB;AAC9C,gBAAM,KAAK,MAAM;AACjB,cAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,aAAc,IAAG,SAAS,EAAE,MAAM,MAAM,QAAQ,cAAc,MAAM,GAAG,CAAC;AAAA,cAClH,IAAG,aAAa,MAAM,QAAQ,SAAS,IAAI,GAAG,eAAe,iBAAiB,EAAE,EAAE,cAAc,QAAQ,KAAK;AAAA,QACpH,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAS,OAAM,gBAAgB;AAAA,MAC/E;AAAA,MACA,wDAAC,SAAI,WAAU,8BAA8B,UAAS;AAAA;AAAA,EACxD;AACF;;;ACtEU,IAAAC,uBAAA;AALH,SAAS,UAAa,EAAE,SAAS,MAAM,cAAc,QAAQ,OAAO,MAAM,WAAW,cAAc,SAAS,QAAQ,eAAe,OAAO,oBAAoB,OAAO,WAAW,cAAc,YAAY,aAAa,GAAsB;AAClP,SACE,8CAAC,SAAI,WAAW,GAAG,wBAAwB,qBAAqB,sBAAsB,IAAI,IAAI,SAAS,GAAG,sBAAoB,QAAQ,YAAY,GAAG,qBAAmB,QAAQ,qBAAmB,mBAAmB,sBAAoB,cACxO,yDAAC,SAAI,WAAU,6BACZ;AAAA,cACC,8CAAC,SAAI,WAAU,4BACZ,kBACH;AAAA,IAGD,KAAK,WAAW,IACf,8CAAC,SAAI,WAAU,2BACZ,0BAAgB,WACnB,IAEA,8CAAC,iBAAc,WAAsB,OAAO,WAAW,yDAAC,WAAM,cAAY,WAAW,WAAU,2BAC7F;AAAA,oDAAC,WACC,yDAAC,QAAG,WAAU,+BACX;AAAA,gBAAQ,IAAI,CAAC,KAAK,gBACjB,8CAAC,QAAG,OAAM,OAAoB,WAAU,wBAAuB,OAAO,YAAY,GAAG,GAAG,sBAAoB,gBAAgB,IAAI,SAAS,QACvI,wDAAC,oBAAiB,OAAO,GAAG,IAAI,MAAM,WAAY,cAAI,QAAO,KAD1C,IAAI,GAEzB,CACD;AAAA,QACA,gBAAgB,8CAAC,QAAG,OAAM,OAAM,cAAW,eAAc,WAAU,oDAAmD,sBAAmB,YAAW;AAAA,SACvJ,GACF;AAAA,MACA,8CAAC,WACE,eAAK,IAAI,CAAC,KAAK,aACd;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAET;AAAA,oBAAQ,IAAI,CAAC,KAAK,gBACjB,8CAAC,QAAiB,WAAU,wBAAuB,OAAO,YAAY,GAAG,GAAG,sBAAoB,gBAAgB,IAAI,SAAS,QAC3H,wDAAC,oBAAiB,OAAO,GAAG,IAAI,UAAU,OAAO,SAAS,WAAW,CAAC,IAAK,cAAI,OAAO,KAAK,QAAQ,GAAE,KAD9F,IAAI,GAEb,CACD;AAAA,YACA,gBAAgB,8CAAC,QAAG,WAAU,oDAAmD,sBAAmB,YACnG,wDAAC,qBAAkB,OAAO,aAAa,MAAM,KAAK,QAAQ,GAAG,OAAO,aAAa,WAAW,KAAK,QAAQ,KAAK,mBAAmB,WAAW,CAAC,IAAI,UAAU,aAAa,aAAa,KAAK,QAAQ,GAAG,UAAU,WAAS,aAAa,SAAS,OAAO,KAAK,QAAQ,GAAG,GACvQ;AAAA;AAAA;AAAA,QAVK;AAAA,MAWP,CACD,GACH;AAAA,OACF,GAAQ;AAAA,KAEZ,GACF;AAEJ;;;ACzEA,IAAAC,UAAuB;AACvB,IAAAC,yBAA0F;;;ACOnF,SAAS,iBACd,SACA,OACA,QACA,WACA,OACA;AACA,QAAM,MAAM;AACZ,QAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,OAAO,IAAI,CAAC;AAC3E,MAAI,YAAY,KAAK,IAAI,GAAG,OAAO,SAAS,OAAO,GAAG;AACtD,MAAI;AACJ,MAAI;AAEJ,MAAI,cAAc,UAAU,cAAc,SAAS;AACjD,UAAM,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;AAC7C,UAAM,SAAS,QAAQ,OAAO,OAAO,OAAO;AAC5C,QAAI,aAAa,cAAc;AAC/B,QAAI,SAAS,aAAa,QAAQ,YAAY,aAAa,SAAS,QAAQ,QAAQ,SAAS;AAC3F,mBAAa,CAAC;AAAA,IAChB;AACA,WAAO,aAAa,QAAQ,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AACjE,UAAM,QAAQ;AAAA,EAChB,OAAO;AACL,UAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,QAAQ,SAAS,GAAG;AAC9D,UAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM,OAAO,MAAM,GAAG;AACxD,QAAI,aAAa,cAAc;AAC/B,QAAI,MAAM,UAAU,aAAa,QAAQ,WAAW,aAAa,QAAQ,QAAQ,QAAQ,QAAQ;AAC/F,mBAAa,CAAC;AAAA,IAChB;AACA,gBAAY,KAAK,IAAI,WAAW,aAAa,QAAQ,KAAK;AAC1D,UAAM,aAAa,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,SAAS;AAC5F,WAAO,UAAU,UAAU,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EAC7D;AAEA,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,SAAS;AAC/C,SAAO;AAAA,IACL,MAAM,KAAK,IAAI,OAAO,MAAM,KAAK,IAAI,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,IAChE,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO,SAAS,MAAM,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;;;ADuOU,IAAAC,uBAAA;AA1NH,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB,CAAC;AAAA,EAClB;AAAA,EACA,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM,YAAY;AAAA,EAClB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,WAAW;AACb,GAAkB;AAChB,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS,EAAE;AAC3C,QAAM,YAAkB,eAAyB,IAAI;AAErD,QAAM,kBAAkB,gBAAgB,cAAc;AACtD,QAAM,OAAO,eAAe;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAC5C,EAAM,kBAAU,MAAM;AAAE,QAAI,CAAC,KAAM,UAAS,EAAE;AAAA,EAAE,GAAG,CAAC,IAAI,CAAC;AACzD,QAAM,UAAgB,eAAuB,IAAI;AACjD,QAAM,SAAe,cAAM;AAC3B,QAAM,cAAoB,eAAO,KAAK;AACtC,QAAM,aAAmB,eAA0B,IAAI;AACvD,QAAM,WAAiB,eAAuB,IAAI;AAClD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAA8B,CAAC,CAAC;AAE1E,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,SACC,KAAK,QAAQ,QACZ,KAAK,eAAe,SAClB,OAAO,KAAK,gBAAgB,WAAW,KAAK,gBAAgB,KAAK;AAAA,EACxE;AAEA,QAAM,kBAAkB,MAAM,KAAK,EAAE,kBAAkB;AACvD,MAAI,aAAa;AACjB,QAAM,WAAW,IAAI,IAAI,gBAAgB,OAAO,UAAQ;AACtD,QAAI,KAAK,SAAS,UAAU;AAAE,mBAAa,OAAO,KAAK,eAAe,EAAE;AAAG,aAAO;AAAA,IAAM;AACxF,WAAO,GAAG,UAAU,IAAI,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,KAAK,KAAK,GAAG,kBAAkB,EAAE,SAAS,eAAe;AAAA,EAC7I,CAAC,EAAE,IAAI,UAAQ,KAAK,KAAK,CAAC;AAC1B,QAAM,eAAe,gBAAgB,OAAO,CAAC,MAAM,UAAU;AAC3D,QAAI,KAAK,SAAS,SAAU,QAAO,SAAS,IAAI,KAAK,KAAK;AAC1D,UAAM,aAAa,gBAAgB,UAAU,CAAC,MAAM,MAAM,IAAI,SAAS,KAAK,SAAS,QAAQ;AAC7F,WAAO,gBAAgB,MAAM,QAAQ,GAAG,aAAa,IAAI,SAAY,UAAU,EAAE,KAAK,UAAQ,SAAS,IAAI,KAAK,KAAK,CAAC;AAAA,EACxH,CAAC;AACD,QAAM,kBAAkB,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AACtE,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,iBAAiB,EAAE,SAAS,QAAQ,KAAK,gBAAgB,CAAC,KAAK,aAAa,CAAC;AAC5H,QAAM,cAAc,cAAc,OAC9B,mCACA,cAAc,SACZ,qCACA,cAAc,UACZ,sCACA;AAER,mBAAiB,KAAK,MAAM;AAC1B,YAAQ,KAAK;AACb,eAAW,SAAS,MAAM;AAAA,EAC5B,GAAG,IAAI;AAEP,EAAM,wBAAgB,MAAM;AAC1B,UAAM,OAAO,QAAQ;AACrB,UAAM,UAAU,WAAW;AAC3B,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAO;AAE1C,UAAM,iBAAiB,MAAM;AAC3B,YAAM,WAAW,OAAO;AACxB,YAAM,SAAS;AAAA,QACb,MAAM,UAAU,cAAc;AAAA,QAC9B,KAAK,UAAU,aAAa;AAAA,QAC5B,QAAQ,UAAU,cAAc,MAAM,UAAU,SAAS,SAAS,gBAAgB;AAAA,QAClF,SAAS,UAAU,aAAa,MAAM,UAAU,UAAU,SAAS,gBAAgB;AAAA,MACrF;AAEA,eAAS,WAAW,KAAK,eAAe,UAAU,WAAW,SAAS,eAAe;AACnF,cAAM,QAAQ,iBAAiB,QAAQ;AACvC,cAAM,OAAO,SAAS,sBAAsB;AAC5C,YAAI,4BAA4B,KAAK,MAAM,SAAS,GAAG;AACrD,iBAAO,OAAO,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO,SAAS,UAAU;AACnE,iBAAO,QAAQ,KAAK,IAAI,OAAO,OAAO,KAAK,OAAO,SAAS,aAAa,SAAS,WAAW;AAAA,QAC9F;AACA,YAAI,4BAA4B,KAAK,MAAM,SAAS,GAAG;AACrD,iBAAO,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,MAAM,SAAS,SAAS;AAC/D,iBAAO,SAAS,KAAK,IAAI,OAAO,QAAQ,KAAK,MAAM,SAAS,YAAY,SAAS,YAAY;AAAA,QAC/F;AAAA,MACF;AACA,YAAM,UAAU,KAAK,IAAI,GAAG,gBAAgB;AAC5C,aAAO,QAAQ;AACf,aAAO,QAAQ,KAAK,IAAI,OAAO,MAAM,OAAO,QAAQ,OAAO;AAC3D,aAAO,OAAO;AACd,aAAO,SAAS,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,OAAO;AAC5D,YAAM,cAAc,QAAQ,sBAAsB;AAClD,YAAM,WAAW,KAAK,sBAAsB;AAC5C,YAAM,iBAAiB,OAAO,QAAQ,OAAO;AAC7C,YAAM,cAAc,KAAK,IAAI,GAAG,SAAS;AAGzC,YAAM,MAAM,WAAW,GAAG,cAAc;AACxC,YAAM,MAAM,WAAW,GAAG,KAAK,IAAI,YAAY,OAAO,cAAc,CAAC;AACrE,YAAM,YAAY,MAAM,sBAAsB;AAC9C,YAAM,gBAAgB,KAAK,IAAI,aAAa,MAAM,eAAe,MAAM,eAAe,MAAM,YAAY;AACxG,YAAM,WAAW,iBAAiB,aAAa,EAAE,OAAO,UAAU,OAAO,QAAQ,cAAc,GAAG,QAAQ,WAAW,KAAK;AAC1H,YAAM,YAAY;AAAA,QAChB,MAAM,SAAS,OAAO,SAAS,OAAO,KAAK,aAAa,KAAK;AAAA,QAC7D,KAAK,SAAS,MAAM,SAAS,MAAM,KAAK,YAAY,KAAK;AAAA,QACzD,UAAU,KAAK,IAAI,YAAY,OAAO,cAAc;AAAA,QACpD,UAAU;AAAA,QACV,WAAW,KAAK,IAAI,aAAa,SAAS,SAAS;AAAA,MACrD;AAEA,iBAAW,OAAO,OAAO,KAAK,SAAS,GAAiC;AACtE,cAAM,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,CAAC;AAAA,MACtC;AACA,oBAAc,cAAY,OAAO,QAAQ,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,SAAS,GAAgC,MAAM,KAAK,IAC5H,WAAW,SAAS;AAAA,IAC1B;AAEA,mBAAe;AACf,QAAI,cAAc,CAAC,MAAM,SAAS,SAAS,aAAa,EAAG,WAAU,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3G,QAAI,YAAY,SAAS;AACvB,kBAAY,UAAU;AACtB,YAAM,SAAS,MAAM,cAAiC,wBAAwB,KACzE,MAAM,cAAiC,iBAAiB;AAC7D,cAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AACrC,cAAQ,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,IAC7C;AACA,UAAM,SAAS,IAAI,eAAe,cAAc;AAChD,WAAO,QAAQ,IAAI;AACnB,WAAO,QAAQ,KAAK;AACpB,aAAS,WAAW,KAAK,eAAe,UAAU,WAAW,SAAS,eAAe;AACnF,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO,iBAAiB,UAAU,cAAc;AAChD,WAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,WAAO,gBAAgB,iBAAiB,UAAU,cAAc;AAChE,WAAO,gBAAgB,iBAAiB,UAAU,cAAc;AAChE,WAAO,MAAM;AACX,aAAO,WAAW;AAClB,aAAO,oBAAoB,UAAU,cAAc;AACnD,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,aAAO,gBAAgB,oBAAoB,UAAU,cAAc;AACnE,aAAO,gBAAgB,oBAAoB,UAAU,cAAc;AAAA,IACrE;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,OAAO,WAAW,kBAAkB,OAAO,OAAO,OAAO,UAAU,CAAC;AAEzF,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,YAAM,SAAS,EAAE;AACjB,UAAI,WAAW,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS,MAAM,EAAG;AAChF,cAAQ,KAAK;AAAA,IACf;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,gBAAgB,WAAW,EAAG,QAAO;AAEzC,SACE,+CAAC,SAAI,KAAK,SAAS,qBAAmB,MAAM,eAAa,WAAW,eAAe,SAAS,IAAI,QAAQ,aAAa,GAAG,aAAW,MAAM,WAAW,GAAG,oBAAoB,cAAc,2DAA2D,SAAS,GAC3P;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI,aAAa,GAAG,MAAM;AAAA,QAC1B,qBAAmB;AAAA,QACnB,MAAK;AAAA,QACL;AAAA,QACA,iBAAe,aAAa,WAAW;AAAA,QACvC,iBAAe;AAAA,QACf,iBAAe,OAAQ,aAAa,SAAS,GAAG,MAAM,aAAc;AAAA,QACpE,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACxD,kBAAM,eAAe;AACrB,gBAAI,MAAM;AACR,oBAAM,SAAS,SAAS,SAAS,cAAiC,wBAAwB,KACrF,SAAS,SAAS,cAAiC,iBAAiB;AACzE,sBAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AACrC,sBAAQ,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,YAC7C,OAAO;AACL,0BAAY,UAAU;AACtB,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,QACA,cAAY;AAAA,QACZ,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,6BAA6B,IAAI;AAAA,UACjC,6BAA6B,cAAc;AAAA,UAC3C,6BAA6B,kBAAkB;AAAA,UAC/C,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QAEA;AAAA,wDAAC,UAAK,WAAW,aAAa,iCAAiC,QAAW,OAAO,aAAa,SAAY,EAAE,SAAS,WAAW,GAC/H,4BAAkB,OACjB,iBAEA,gFACG;AAAA,sBAAU,QAAQ,QACjB,8CAAC,UAAK,WAAU,wDAAwD,oBAAU,MAAK;AAAA,YAExF,UAAU,eAAe,SACvB,OAAO,UAAU,gBAAgB,YAAY,UAAU,gBAAgB,OACtE,8CAAC,UAAK,WAAU,kCAAkC,oBAAU,aAAY;AAAA,aAE9E,GAEF;AAAA,UACC,CAAC,aAAa,CAAC,YACd,8CAAC,UAAK,WAAU,4BAA2B,eAAW,MACpD,wDAAC,eAAY,MAAM,SAAS,OAAO,KAAK,IAAI,GAC9C;AAAA;AAAA;AAAA,IAEJ;AAAA,IACC,aAAa,8CAAC,WAAM,WAAU,iCAAgC,SAAS,aAAa,GAAG,MAAM,YAAa,sBAAW,IAAW;AAAA,IAEhI,QACC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,WAAW,UAAU,WAAW,MAAM,QAAQ,YAAa;AACrE,cAAI,CAAC,CAAC,aAAa,WAAW,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG,EAAG;AAClE,gBAAM,eAAe;AACrB,gBAAM,UAAU,MAAM,KAAK,SAAS,SAAS,iBAAoC,iBAAiB,KAAK,CAAC,CAAC;AACzG,gBAAM,UAAU,QAAQ,QAAQ,SAAS,aAAkC;AAC3E,gBAAM,QAAQ,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,QAAQ,SAAS,KAC3E,WAAW,MAAM,QAAQ,cAAc,IAAI,MAAM,QAAQ,UAAU,QAAQ;AAChF,kBAAQ,KAAK,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAC7C,kBAAQ,KAAK,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,QACrD;AAAA,QACA,MAAM,aAAa,WAAW;AAAA,QAC9B,cAAY;AAAA,QACZ,WAAW,GAAG,0BAA0B,2BAA2B,IAAI,IAAI,cAAc;AAAA,QACzF,OAAO;AAAA,QAEN;AAAA,wBAAc,+CAAC,SAAI,WAAU,2BAC5B;AAAA,0DAAC,0CAAgB,eAAY,QAAO;AAAA,YACpC,8CAAC,WAAM,KAAK,WAAW,MAAK,UAAS,cAAY,mBAAmB,aAAa,mBAAmB,OAAO,OAAO,UAAU,WAAS,SAAS,MAAM,OAAO,KAAK,GAAG;AAAA,aACrK;AAAA,UACA,+CAAC,SAAI,MAAK,WAAU,IAAI,GAAG,MAAM,YAAY,cAAY,iBAAiB,wBAAsB,YAAY,QAC3G;AAAA,qBAAS,QACR,8CAAC,SAAI,WAAU,0BAA0B,iBAAM;AAAA,YAEhD,aAAa,IAAI,CAAC,MAAM,UAAU;AACjC,oBAAM,aAAa,KAAK,WAAW,QAAQ,8CAAC,SAAI,WAAU,8BAA6B,IAAK;AAC5F,oBAAM,gBAAgB,KAAK,WAAW,WAAW,8CAAC,SAAI,WAAU,8BAA6B,IAAK;AAClG,kBAAI,KAAK,SAAS,UAAU;AAC1B,uBACE,+CAAO,kBAAN,EACE;AAAA;AAAA,kBACD,8CAAC,SAAI,MAAK,gBAAe,WAAU,0BAChC,eAAK,aACR;AAAA,kBACC;AAAA,qBALkB,UAAU,KAAK,EAMpC;AAAA,cAEJ;AACA,oBAAM,aAAa,WAAW,eAAe,SAAS,KAAK,KAAK,IAAI,KAAK,UAAU;AACnF,qBACE,+CAAO,kBAAN,EACE;AAAA;AAAA,gBACD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,iBAAe;AAAA,oBACf,SAAS,MAAM;AACb,0BAAI,SAAU,qBAAoB,aAAa,eAAe,OAAO,WAAS,UAAU,KAAK,KAAK,IAAI,CAAC,GAAG,gBAAgB,KAAK,KAAK,CAAC;AAAA,0BAChI,YAAW,KAAK,KAAK;AAC1B,0BAAI,CAAC,YAAY,eAAe;AAC9B,gCAAQ,KAAK;AACb,mCAAW,SAAS,MAAM;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBACA,WAAU;AAAA,oBAET;AAAA,kCAAY,8CAAC,UAAK,WAAU,6BAA4B,gBAAc,YAAY,eAAY,QAAQ,wBAAc,8CAAC,gCAAM,GAAG;AAAA,sBAC9H,KAAK,QAAQ,QACZ,8CAAC,UAAK,WAAU,yBAAyB,eAAK,MAAK;AAAA,sBAEpD,KAAK,eAAe,SAClB,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,OAC5D,8CAAC,UAAK,WAAU,gCACb,eAAK,aACR;AAAA,sBAEH,KAAK,YAAY,QAChB,8CAAC,UAAK,WAAU,6BAA6B,eAAK,UAAS;AAAA;AAAA;AAAA,gBAE/D;AAAA,gBACC;AAAA,mBA9BkB,KAAK,KA+B1B;AAAA,YAEJ,CAAC;AAAA,aACD;AAAA,UACC,CAAC,gBAAgB,UAAU,8CAAC,OAAE,MAAK,UAAS,WAAU,0BAA0B,wBAAa;AAAA;AAAA;AAAA,IAChG;AAAA,KAEJ;AAEJ;;;AE9XA,IAAAC,UAAuB;AAcnB,IAAAC,uBAAA;AAFJ,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,QAAQ,WAAW,OAAO,MAAM,GAAG,MAAM,GAAG,QACxD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,gBAAgB,iBAAiB,KAAK,IAAI,iBAAiB,IAAI,IAAI,SAAS;AAAA,MACzF,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,KAAK,cAAc;;;ACrBnB,IAAAC,UAAuB;AAYnB,IAAAC,uBAAA;AAFJ,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,OAAO,WAAW,GAAG,MAAM,GAAG,QAC1C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,gBAAgB,iBAAiB,IAAI,IAAI,SAAS;AAAA,MAC/D,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,KAAK,cAAc;;;AClBnB,IAAAC,yBAAiE;AA2CzD,IAAAC,uBAAA;AAjCD,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,SACC,WAAW,kBAAkB;AAAA,QAC9B,iBAAiB;AAAA,QACjB;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc,gBAAgB,UAAU;AAAA,MACxC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AACf,YAAI,CAAC,MAAM,iBAAkB,iBAAgB,iBAAiB,CAAC,OAAO;AAAA,MACxE;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,oBAAY,KAAK;AACjB,YAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAS,OAAM,gBAAgB;AAAA,MACxE;AAAA,MAEC,0BACC,+CAAC,UAAK,WAAU,wCAAuC,eAAY,QACjE;AAAA,sDAAC,uBAAAC,UAAA,EAAa,MAAM,IAAI;AAAA,QACxB,8CAAC,gCAAM,WAAU,wCAAuC,MAAM,IAAI;AAAA,SACpE,IACE,UACF,8CAAC,0CAAgB,eAAY,QAAO,MAAM,IAAI,IAE9C,8CAAC,uBAAAA,UAAA,EAAa,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,EAE/C;AAEJ;;;AClCM,IAAAC,uBAAA;AAXC,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAe;AACb,SACE,+CAAC,WAAM,WAAW,GAAG,iBAAiB,YAAY,2BAA2B,SAAS,GACpF;AAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA,WAAU;AAAA,QACV;AAAA,QACA,UAAU,CAAC,UAAU,kBAAkB,MAAM,cAAc,OAAO;AAAA,QAClE,MAAK;AAAA;AAAA,IACP;AAAA,IACA,8CAAC,UAAK,eAAY,QAAO,WAAU,0BACjC,wDAAC,UAAK,WAAU,sBAAqB,GACvC;AAAA,IACA,+CAAC,UAAK,WAAU,0BACd;AAAA,oDAAC,UAAK,WAAU,wBAAwB,iBAAM;AAAA,MAC7C,eAAe,8CAAC,UAAK,WAAU,8BAA8B,uBAAY;AAAA,OAC5E;AAAA,KACF;AAEJ;;;ACpCA,IAAAC,gBAAkD;AAClD,IAAAC,yBAAiD;AA+M9B,IAAAC,uBAAA;AAtHZ,SAAS,cAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,kBAAkB,IAAI;AACpF,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAwB,oBAAoB;AAE9F,QAAM,eAAe,kBAAkB,UAAa,wBAAwB;AAC5E,QAAM,YAAY,eAAe,gBAAgB;AACjD,QAAM,kBAAkB,eAAe,sBAAsB;AAC7D,QAAM,cAAc,aAAa,OAAO;AACxC,QAAM,oBAAoB,aAAa,aAAa;AACpD,QAAM,eAAe,aAAa,kBAAkB,YAAY;AAChE,QAAM,qBAAqB,aAAa,kBAAkB,kBAAkB;AAE5E,QAAM,aAAS,uBAAQ,MAAM;AAC3B,QAAI,CAAC,gBAAgB,CAAC,mBAAoB,QAAO;AACjD,UAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,YAAY;AACtD,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,WACJ,IAAI,iBACH,CAAC,QAAW;AACX,YAAM,QAAS,IAAgC,YAAY;AAC3D,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC1E;AACF,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,KAAK,SAAS,CAAC;AACrB,YAAM,KAAK,SAAS,CAAC;AACrB,UAAI,MAAM,QAAQ,MAAM,KAAM,QAAO;AACrC,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,MAAM,KAAM,QAAO;AACvB,UAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AACpD,eAAO,uBAAuB,QAAQ,KAAK,KAAK,KAAK;AAAA,MACvD;AACA,YAAM,KAAK,OAAO,EAAE,EAAE,YAAY;AAClC,YAAM,KAAK,OAAO,EAAE,EAAE,YAAY;AAClC,UAAI,KAAK,GAAI,QAAO,uBAAuB,QAAQ,KAAK;AACxD,UAAI,KAAK,GAAI,QAAO,uBAAuB,QAAQ,IAAI;AACvD,aAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,SAAS,cAAc,kBAAkB,CAAC;AAEpD,QAAM,kBAAc,uBAAQ,MAAM;AAChC,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,QAAQ;AAChD,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,SAAS,QAAQ,CAAC;AAClE,UAAM,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,GAAG,UAAU;AAC9D,UAAM,cAAc,OAAO,KAAK;AAChC,WAAO,OAAO,MAAM,YAAY,aAAa,QAAQ;AAAA,EACvD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,QAAM,eAAe,YAAY,OAAO,OAAO,UAAU,UAAU,IAAI,CAAC;AACxE,QAAM,iBAAiB,YACnB,OAAO,OAAO,CAAC,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC,yBAAyB,GAAG,CAAC,IAC9E,CAAC;AACL,QAAM,mBAAmB,YACrB,eAAe,OAAO,UAAU,UAAU,EAAE,SAC5C;AACJ,QAAM,kBAAkB,eAAe,SAAS,KAAK,qBAAqB,eAAe;AACzF,QAAM,mBAAmB,aAAa,SAAS,KAAK,CAAC;AAErD,QAAM,kBAAkB,CAAC,QAAgB;AACvC,QAAI;AACJ,QAAI,CAAC,aAAa,CAAC,iBAAiB;AAClC,sBAAgB,gBAAgB,OAAO,oBAAoB,oBAAoB;AAAA,IACjF,WAAW,cAAc,KAAK;AAC5B,sBAAgB;AAAA,IAClB,WAAW,gBAAgB,OAAO,mBAAmB;AACnD,sBAAgB,oBAAoB,oBAChC,sBAAsB,QAAQ,SAAS,QACvC;AAAA,IACN,WAAW,oBAAoB,OAAO;AACpC,sBAAgB;AAAA,IAClB,OAAO;AACL,sBAAgB;AAAA,IAClB;AACA,UAAM,UAAU,kBAAkB,OAAO,OAAO;AAEhD,QAAI,cAAc;AAChB,qBAAe,SAAS,aAAa;AAAA,IACvC,OAAO;AACL,qBAAe,OAAO;AACtB,2BAAqB,aAAa;AAClC,qBAAe,SAAS,aAAa;AAAA,IACvC;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAW,GAAG,wBAAwB,0BAA0B,2BAA2B,IAAI,IAAI,YAAY,oCAAoC,SAAS,GAAG,sBAAoB,QAAQ,YAAY,GAAG,qBAAmB,QAAQ,qBAAmB,mBAAmB,sBAAoB,cAAc,wBAAsB,QAAQ,SAAS,GACvV,yDAAC,SAAI,WAAU,kCACZ;AAAA,cAAU,8CAAC,SAAI,WAAU,iCAAiC,kBAAO;AAAA,IAEjE,YAAY,WAAW,IACtB,8CAAC,SAAI,WAAU,gCAAgC,0BAAgB,WAAU,IAEzE,8CAAC,iBAAc,WAAsB,OAAO,aAAa,cAAc,yDAAC,WAAM,cAAY,WAAW,WAAU,gCAC7G;AAAA,oDAAC,WACC,yDAAC,QAAG,WAAU,oCACX;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YAAkE,sBAAmB;AAAA,YAC/F,OAAM;AAAA,YAEN;AAAA,cAAC;AAAA;AAAA,gBACC,cAAY,UAAU,kBAAkB;AAAA,gBACxC,SAAS;AAAA,gBACT,UAAU,eAAe,WAAW,KAAK,aAAa,WAAW;AAAA,gBACjE,eAAe;AAAA,gBACf,iBAAiB,CAAC,YAAY;AAC5B,wBAAM,OAAO,UAAU,iBAAiB;AACxC,sBAAI,UAAU,mBAAmB;AAC/B,8BAAU,kBAAkB,MAAM,OAAO;AACzC;AAAA,kBACF;AACA,uBAAK,QAAQ,CAAC,QAAQ;AACpB,wBAAI,UAAU,WAAW,GAAG,MAAM,SAAS;AACzC,gCAAU,iBAAiB,KAAK,OAAO;AAAA,oBACzC;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAED,QAAQ,IAAI,CAAC,KAAK,gBAAgB;AACjC,gBAAM,WAAW,cAAc,IAAI,OAAO,oBAAoB;AAC9D,cAAI,CAAC,IAAI,UAAU;AACjB,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAM;AAAA,gBACN,OAAO,YAAY,GAAG;AAAA,gBAAG,sBAAoB,gBAAgB,IAAI,SAAS;AAAA,gBAE1E,wDAAC,oBAAiB,OAAO,GAAG,IAAI,MAAM,WAAY,cAAI,QAAO;AAAA;AAAA,cALxD,IAAI;AAAA,YAMX;AAAA,UAEJ;AACA,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,OAAM;AAAA,cACN,OAAO,YAAY,GAAG;AAAA,cAAG,sBAAoB,gBAAgB,IAAI,SAAS;AAAA,cAE1E,wDAAC,oBAAiB,OAAO,GAAG,IAAI,MAAM,WAAW;AAAA,gBAAC;AAAA;AAAA,kBAChD,MAAK;AAAA,kBACL,WAAW;AAAA,oBACT;AAAA,oBACA,YAAY;AAAA,kBACd;AAAA,kBACA,SAAS,MAAM,gBAAgB,IAAI,GAAG;AAAA,kBACtC,aACE,WACI,oBAAoB,QAClB,cACA,eACF;AAAA,kBAGN;AAAA,kEAAC,UAAM,cAAI,QAAO;AAAA,oBAClB,8CAAC,UAAK,WAAU,oCAAmC,eAAY,QAC5D,sBAAY,oBAAoB,QAC/B,8CAAC,kCAAQ,MAAM,IAAI,IACjB,YAAY,oBAAoB,SAClC,8CAAC,oCAAU,MAAM,IAAI,IAErB,8CAAC,uCAAa,MAAM,IAAI,GAE5B;AAAA;AAAA;AAAA,cACF,GAAS;AAAA;AAAA,YA9BJ,IAAI;AAAA,UA+BX;AAAA,QAEJ,CAAC;AAAA,QACA,gBAAgB,8CAAC,QAAG,OAAM,OAAM,cAAW,eAAc,WAAU,yDAAwD,sBAAmB,YAAW;AAAA,SAC5J,GACF;AAAA,MACA,8CAAC,WACE,sBAAY,IAAI,CAAC,KAAK,aAAa;AAClC,cAAM,cAAc,eAAe,KAAK,QAAQ,KAAK;AACrD,cAAM,WAAW,gBAAgB,GAAG,KAAK;AACzC,cAAM,oBAAoB,aAAa,yBAAyB,GAAG,KAAK;AACxE,cAAM,cAAc,CAAC,YAAY,QAAQ,cAAc,gBAAgB;AACvE,cAAM,SAAS,CAAC,YAAY,YAAY;AAAA,UACtC,OAAO,UAAU,MAAM,KAAK,QAAQ;AAAA,UACpC,MAAM,UAAU,KAAK,KAAK,QAAQ;AAAA,QACpC,IAAI;AACJ,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,eAAe;AAAA,cACf,eAAe;AAAA,cACf,YAAY;AAAA,YACd;AAAA,YACA,iBAAe,YAAY;AAAA,YAC3B,SAAS,CAAC,YAAY,aAAa,MAAM,WAAW,KAAK,QAAQ,IAAI;AAAA,YACrE,eAAe,CAAC,YAAY,mBAAmB,MAAM,iBAAiB,KAAK,QAAQ,IAAI;AAAA,YACvF,WAAW,cAAc,CAAC,UAAU;AAClC,kBAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,sBAAM,eAAe;AACrB,sBAAM,cAAc,cAAc;AAClC,8BAAc,KAAK,QAAQ;AAAA,cAC7B;AAAA,YACF,IAAI;AAAA,YACJ,cAAY,QAAQ;AAAA,YACpB,iBAAe,YAAY;AAAA,YAC3B,MAAM,cAAc,WAAW;AAAA,YAC/B,UAAU,cAAc,IAAI;AAAA,YAE3B;AAAA,2BACC,8CAAC,QAAG,WAAU,mEAAkE,sBAAmB,aACjG;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAY,UAAU,YAAY,GAAG;AAAA,kBACrC,SAAS,CAAC,qBAAqB,UAAU,WAAW,GAAG;AAAA,kBACvD,UAAU;AAAA,kBACV,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,kBAC1C,iBAAiB,CAAC,YAAY;AAC5B,wBAAI,CAAC,kBAAmB,WAAU,iBAAiB,KAAK,OAAO;AAAA,kBACjE;AAAA;AAAA,cACF,GACF;AAAA,cAED,QAAQ,IAAI,CAAC,KAAK,gBACjB;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAW;AAAA,oBACT;AAAA,oBACA,UAAU,gBAAgB,QAAQ,SAAS,KAAK;AAAA,kBAClD;AAAA,kBACA,OAAO,EAAE,GAAG,YAAY,GAAG,GAAG,WAAW,IAAI,SAAS,OAAO;AAAA,kBAAG,qBAAmB,IAAI;AAAA,kBAAO,sBAAoB,gBAAgB,IAAI,SAAS;AAAA,kBAE/I;AAAA,kEAAC,oBAAiB,OAAO,GAAG,IAAI,UAAU,OAAO,SAAS,WAAW,CAAC,IAAK,cAAI,OAAO,KAAK,QAAQ,GAAE;AAAA,oBACpG,UAAU,gBAAgB,QAAQ,SAAS,KAC1C,8CAAC,UAAK,WAAU,qCAAoC,eAAY,QAC9D,wDAAC,UAAK,WAAU,2CAA2C,iBAAO,MAAK,GACzE;AAAA;AAAA;AAAA,gBAXG,IAAI;AAAA,cAaX,CACD;AAAA,cACA,gBAAgB;AAAA,gBAAC;AAAA;AAAA,kBAAG,WAAU;AAAA,kBAAwD,sBAAmB;AAAA,kBACxG,SAAS,WAAS,MAAM,gBAAgB;AAAA,kBAAG,eAAe,WAAS,MAAM,gBAAgB;AAAA,kBAAG,WAAW,WAAS,MAAM,gBAAgB;AAAA,kBACtI,wDAAC,qBAAkB,OAAO,aAAa,MAAM,KAAK,QAAQ,GAAG,OAAO,aAAa,WAAW,KAAK,QAAQ,KAAK,mBAAmB,WAAW,CAAC,IAAI,UAAU,YAAY,aAAa,aAAa,KAAK,QAAQ,GAAG,UAAU,WAAS,aAAa,SAAS,OAAO,KAAK,QAAQ,GAAG;AAAA;AAAA,cACnR;AAAA;AAAA;AAAA,UAvDK;AAAA,QAwDP;AAAA,MAEJ,CAAC,GACH;AAAA,OACF,GAAQ;AAAA,KAEZ,GACF;AAEJ;;;ACrXA,IAAAC,gBAAiH;AA0G7G,IAAAC,uBAAA;AAhFG,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AACZ,GAAc;AACZ,QAAM,cAAU,qBAAM;AACtB,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC,gBAAgB,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM;AAAA,EACxE;AACA,QAAM,eAAe,oBAAoB;AACzC,QAAM,WAAW,eAAe,kBAAkB;AAElD,QAAM,iBAAa,sBAA8B,IAAI;AACrD,QAAM,cAAU,sBAAiD,CAAC,CAAC;AACnE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAmD,IAAI;AAEzF,qCAAgB,MAAM;AACpB,UAAM,kBAAkB,MAAM;AAC5B,YAAM,YAAY,QAAQ,QAAQ,QAAQ;AAC1C,UAAI,CAAC,UAAW;AAChB,mBAAa,EAAE,QAAQ,UAAU,YAAY,OAAO,UAAU,YAAY,CAAC;AAAA,IAC7E;AAEA,oBAAgB;AAChB,UAAM,OAAO,WAAW;AACxB,QAAI,CAAC,QAAQ,OAAO,mBAAmB,YAAa;AACpD,UAAM,WAAW,IAAI,eAAe,eAAe;AACnD,aAAS,QAAQ,IAAI;AACrB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,MAAM,MAAM,CAAC;AAE3B,QAAM,YAAY,CAAC,OAAe;AAChC,QAAI,cAAc;AAChB,sBAAgB,EAAE;AAAA,IACpB,OAAO;AACL,uBAAiB,EAAE;AACnB,sBAAgB,EAAE;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AACjD,QAAM,iBAAiB,YACnB;AAAA,IACE,mCAAmC,GAAG,UAAU,MAAM;AAAA,IACtD,kCAAkC,GAAG,UAAU,KAAK;AAAA,EACtD,IACA;AAEJ,QAAM,YAAY,CAAC,UAA4C;AAC7D,UAAM,eAAe,UAAU,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AACjE,QAAI,iBAAiB,GAAI;AACzB,QAAI,YAAY;AAChB,YAAQ,MAAM,KAAK;AAAA,MACjB,KAAK;AACH,qBAAa,eAAe,KAAK,UAAU;AAC3C;AAAA,MACF,KAAK;AACH,qBAAa,eAAe,IAAI,UAAU,UAAU,UAAU;AAC9D;AAAA,MACF,KAAK;AACH,oBAAY;AACZ;AAAA,MACF,KAAK;AACH,oBAAY,UAAU,SAAS;AAC/B;AAAA,MACF;AACE;AAAA,IACJ;AACA,UAAM,eAAe;AACrB,UAAMC,UAAS,UAAU,SAAS,EAAE;AACpC,cAAUA,OAAM;AAChB,0BAAsB,MAAM,QAAQ,QAAQA,OAAM,GAAG,MAAM,CAAC;AAAA,EAC9D;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,gBAAgB,iBAAiB,OAAO,IAAI,WAAW,yBAAyB,SAAS,GAC1G;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,WAAU;AAAA,QACV,wBAAsB,YAAY,SAAS;AAAA,QAC3C,OAAO;AAAA,QAEN,gBAAM,IAAI,CAAC,SAAS;AACnB,gBAAM,WAAW,KAAK,OAAO;AAC7B,gBAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,EAAE;AACvC,gBAAM,UAAU,GAAG,OAAO,UAAU,KAAK,EAAE;AAC3C,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,KAAK,CAAC,OAAO;AACX,wBAAQ,QAAQ,KAAK,EAAE,IAAI;AAAA,cAC7B;AAAA,cACA,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,UAAU,WAAW,IAAI;AAAA,cACzB,UAAU,KAAK;AAAA,cACf,WAAW;AAAA,gBACT;AAAA,gBACA,YAAY;AAAA,gBACZ,KAAK,YAAY;AAAA,cACnB;AAAA,cACA,SAAS,MAAM,CAAC,KAAK,YAAY,UAAU,KAAK,EAAE;AAAA,cAClD;AAAA,cAEC,eAAK;AAAA;AAAA,YAnBD,KAAK;AAAA,UAoBZ;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,IACC,MAAM,IAAI,CAAC,SAAS;AACnB,YAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,EAAE;AACvC,YAAM,UAAU,GAAG,OAAO,UAAU,KAAK,EAAE;AAC3C,YAAM,WAAW,KAAK,OAAO;AAC7B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI;AAAA,UACJ,MAAK;AAAA,UACL,mBAAiB;AAAA,UACjB,QAAQ,CAAC;AAAA,UACT,WAAU;AAAA,UAET,sBAAY,KAAK;AAAA;AAAA,QAPb,KAAK;AAAA,MAQZ;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;;;ACpKA,IAAAC,UAAuB;AAyFnB,IAAAC,uBAAA;AAtEG,SAAS,gBAAgB,EAAE,OAAO,OAAO,eAAe,WAAW,YAAY,OAAO,UAAU,GAAyB;AAC9H,QAAM,cAAoB,eAAuB,IAAI;AACrD,QAAM,aAAmB,eAAwC,CAAC,CAAC;AACnE,QAAM,0BAAgC,eAAO,KAAK;AAClD,QAAM,cAAc,MAAM,UAAU,CAAC,SAAS,KAAK,UAAU,KAAK;AAElE,EAAM,wBAAgB,MAAM;AAC1B,UAAM,WAAW,YAAY;AAC7B,UAAM,eAAe,WAAW,QAAQ,WAAW;AACnD,QAAI,cAAc;AAElB,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,gBAAU,gBAAgB,sBAAsB;AAChD,gBAAU,gBAAgB,wBAAwB;AAClD,8BAAwB,UAAU;AAClC;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,YAAM,eAAe,SAAS,sBAAsB;AACpD,YAAM,mBAAmB,aAAa,sBAAsB;AAE5D,eAAS,MAAM,YAAY,0CAA0C,GAAG,iBAAiB,OAAO,aAAa,OAAO,SAAS,UAAU,IAAI;AAC3I,eAAS,MAAM,YAAY,0CAA0C,GAAG,iBAAiB,MAAM,aAAa,MAAM,SAAS,SAAS,IAAI;AACxI,eAAS,MAAM,YAAY,8CAA8C,GAAG,iBAAiB,KAAK,IAAI;AACtG,eAAS,MAAM,YAAY,+CAA+C,GAAG,iBAAiB,MAAM,IAAI;AACxG,eAAS,aAAa,wBAAwB,MAAM;AAEpD,UAAI,CAAC,wBAAwB,WAAW,gBAAgB,GAAG;AACzD,sBAAc,OAAO,sBAAsB,MAAM;AAC/C,kCAAwB,UAAU;AAClC,mBAAS,aAAa,0BAA0B,MAAM;AACtD,wBAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,oBAAgB;AAEhB,QAAI,OAAO,mBAAmB,aAAa;AACzC,aAAO,MAAM;AACX,YAAI,gBAAgB,EAAG,QAAO,qBAAqB,WAAW;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,iBAAiB,IAAI,eAAe,eAAe;AACzD,mBAAe,QAAQ,QAAQ;AAC/B,eAAW,QAAQ,QAAQ,CAAC,WAAW;AACrC,UAAI,OAAQ,gBAAe,QAAQ,MAAM;AAAA,IAC3C,CAAC;AAED,WAAO,MAAM;AACX,qBAAe,WAAW;AAC1B,UAAI,gBAAgB,EAAG,QAAO,qBAAqB,WAAW;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,MAAM,CAAC;AAE9B,QAAM,YAAY,CAAC,OAAe,cAAsB;AACtD,QAAI,YAAY;AAChB,OAAG;AACD,mBAAa,YAAY,YAAY,MAAM,UAAU,MAAM;AAAA,IAC7D,SAAS,MAAM,SAAS,GAAG,YAAY,cAAc;AAErD,QAAI,CAAC,MAAM,SAAS,GAAG,UAAU;AAC/B,iBAAW,QAAQ,SAAS,GAAG,MAAM;AACrC,oBAAc,MAAM,SAAS,EAAE,KAAK;AAAA,IACtC;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,4BAA4B,aAAa,wCAAwC,SAAS;AAAA,MACxG,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,KAAK;AAAA,MAEL;AAAA,sDAAC,UAAK,WAAU,uCAAsC,eAAW,MAAC;AAAA,QACjE,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,gBAAM,SAAS,KAAK,UAAU;AAC9B,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,GAAG,kCAAkC,UAAU,wCAAwC;AAAA,cAElG,MAAK;AAAA,cACL,gBAAc;AAAA,cACd,UAAU,KAAK;AAAA,cACf,SAAS,MAAM,cAAc,KAAK,KAAK;AAAA,cACvC,WAAW,CAAC,UAAU;AACpB,oBAAI,MAAM,QAAQ,cAAc;AAC9B,wBAAM,eAAe;AACrB,4BAAU,OAAO,CAAC;AAAA,gBACpB;AACA,oBAAI,MAAM,QAAQ,aAAa;AAC7B,wBAAM,eAAe;AACrB,4BAAU,OAAO,EAAE;AAAA,gBACrB;AAAA,cACF;AAAA,cACA,KAAK,CAAC,YAAY;AAAE,2BAAW,QAAQ,KAAK,IAAI;AAAA,cAAQ;AAAA,cAEvD,eAAK;AAAA;AAAA,YAjBD,KAAK;AAAA,UAkBZ;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AC5HA,IAAAC,gBAAgD;AAChD,IAAAC,yBAA0C;AAuDpC,IAAAC,uBAAA;AAvCC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,MAAM;AAAA,EACN;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,UAAU;AACZ,GAAoB;AAClB,QAAM,cAAU,qBAAM;AACtB,QAAM,WAAW,GAAG,OAAO;AAC3B,QAAM,UAAU,GAAG,OAAO;AAC1B,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,WAAW;AAC5D,QAAM,eAAe,mBAAmB;AACxC,QAAM,SAAS,eAAe,iBAAiB;AAE/C,QAAM,SAAS,MAAM;AACnB,QAAI,SAAU;AACd,UAAM,OAAO,CAAC;AACd,QAAI,cAAc;AAChB,qBAAe,IAAI;AAAA,IACrB,OAAO;AACL,sBAAgB,IAAI;AACpB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,IAAI;AAAA,YACJ,WAAU;AAAA,YACV,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf;AAAA,YACA,SAAS;AAAA,YAET;AAAA,4DAAC,UAAK,WAAU,2BAA0B,eAAY,QACnD,mBAAS,8CAAC,sCAAY,MAAM,IAAI,IAAK,8CAAC,uCAAa,MAAM,IAAI,GAChE;AAAA,cACA,8CAAC,UAAK,WAAU,4BAA4B,iBAAM;AAAA,cACjD,QAAQ,8CAAC,UAAK,WAAU,2BAA2B,gBAAK;AAAA;AAAA;AAAA,QAC3D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,MAAK;AAAA,YACL,mBAAiB;AAAA,YACjB,WAAU;AAAA,YACV,QAAQ,CAAC;AAAA,YAET,wDAAC,SAAI,WAAU,kCAAkC,UAAS;AAAA;AAAA,QAC5D;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC9DQ,IAAAC,uBAAA;AAhBR,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAMb,SAAS,cAAc,EAAE,WAAW,QAAQ,WAAW,GAAG,MAAM,GAAuB;AAC5F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,WAAW,GAAG,0BAA0B,SAAS;AAAA,MACjD,MAAK;AAAA,MACJ,GAAG;AAAA,MAEH,gBAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,UACzC;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA,UAEV,OAAO,EAAE,2BAA2B,QAAQ,YAAY;AAAA;AAAA,QADnD;AAAA,MAEP,CACD;AAAA;AAAA,EACH;AAEJ;;;ACII,IAAAC,uBAAA;AAXJ,IAAM,cAAc,CAAC,UACnB,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAQtC,SAAS,MAAM,EAAE,WAAW,OAAO,QAAQ,QAAQ,OAAO,GAAG,MAAM,GAAe;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACxC,OAAO;AAAA,QACL,OAAO,YAAY,KAAK;AAAA,QACxB,QAAQ,YAAY,MAAM;AAAA,QAC1B,cAAc,YAAY,MAAM;AAAA,QAChC,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,UAAU,EAAE,WAAW,OAAO,MAAM,QAAQ,QAAQ,GAAG,MAAM,GAAmB;AAC9F,SAAO,8CAAC,SAAM,WAAW,GAAG,sBAAsB,uBAAuB,IAAI,IAAI,SAAS,GAAG,OAAe,GAAG,OAAO;AACxH;AAQO,SAAS,YAAY,EAAE,WAAW,OAAO,MAAM,aAAa,WAAW,OAAO,OAAO,GAAG,MAAM,GAAqB;AACxH,SAAO,8CAAC,SAAM,qBAAmB,eAAe,MAAM,WAAW,GAAG,wBAAwB,yBAAyB,IAAI,IAAI,YAAY,mCAAmC,SAAS,GAAG,OAAe,GAAG,OAAO;AACnN;AAOO,SAAS,UAAU,EAAE,WAAW,QAAQ,GAAG,aAAa,MAAM,GAAG,MAAM,GAAmB;AAC/F,SACE,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,OACzE;AAAA,kBAAc,8CAAC,aAAU,OAAM,OAAM;AAAA,IACtC,8CAAC,SAAI,WAAU,uBACZ,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UAAU,8CAAC,aAAsB,OAAO,UAAU,QAAQ,IAAI,QAAQ,UAA5C,KAAoD,CAAE,GACrH;AAAA,KACF;AAEJ;AAgBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAAwB;AACtB,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UAAU,KAAK;AACjE,SACE,8CAAC,SAAI,aAAU,QAAO,cAAW,iBAAgB,WAAW,GAAG,uBAAuB,wBAAwB,IAAI,IAAI,SAAS,GAAG,MAAK,UAAU,GAAG,OAClJ,yDAAC,WAAM,WAAU,8BACb;AAAA,mBAAc,YACd,8CAAC,WACC,wDAAC,QAAG,WAAU,iCACX,gBAAM,IAAI,CAAC,UACV,8CAAC,QAAe,OAAO,EAAE,OAAO,eAAe,KAAK,EAAE,GACnD,oBAAU,KAAK,KAAK,8CAAC,aAAU,MAAK,MAAK,OAAO,UAAU,UAAU,IAAI,QAAQ,OAAO,KADjF,KAET,CACD,GACH,GACF;AAAA,IAEF,8CAAC,WACE,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAChC,8CAAC,QAAG,WAAU,4BACX,gBAAM,IAAI,CAAC,gBACV,8CAAC,QAAqB,OAAO,EAAE,OAAO,eAAe,WAAW,EAAE,GAChE,wDAAC,aAAU,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,WAAW,eAAe,CAAC,CAAC,KAAK,KADrE,WAET,CACD,KAL2C,QAM9C,CACD,GACH;AAAA,KACF,GACF;AAEJ;AAQO,SAAS,WAAW,EAAE,WAAW,aAAa,OAAO,GAAG,MAAM,GAAwB;AAC3F,SAAO,8CAAC,kBAAe,WAAsB,YAAyB,GAAG,OAAO;AAClF;AAEO,SAAS,cAAc,EAAE,WAAW,aAAa,OAAO,GAAG,MAAM,GAAwB;AAC9F,SAAO,8CAAC,kBAAe,WAAsB,YAAwB,WAAS,MAAE,GAAG,OAAO;AAC5F;AAEO,SAAS,WAAW,EAAE,WAAW,QAAQ,OAAO,GAAG,MAAM,GAAiC;AAC/F,SAAO,8CAAC,aAAU,WAAW,GAAG,uBAAuB,SAAS,GAAG,MAAK,MAAK,OAAe,GAAG,OAAO;AACxG;AAEA,SAAS,eAAe,EAAE,WAAW,aAAa,OAAO,YAAY,OAAO,cAAc,MAAM,GAAG,MAAM,GAAwB;AAC/H,SACE,+CAAC,SAAI,eAAY,QAAO,qBAAmB,aAAa,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAC3G;AAAA,kDAAC,cAAW,OAAO,YAAY;AAAA,IAC/B,8CAAC,SAAM,WAAW,GAAG,gCAAgC,aAAa,yCAAyC,GAAG;AAAA,KAChH;AAEJ;AAEO,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAmC;AAClF,SAAO,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AAAA,kDAAC,aAAU,OAAM,OAAM;AAAA,IAAE,8CAAC,aAAU,MAAK,MAAK,OAAM,OAAM;AAAA,KAAE;AACzJ;AAEO,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAmC;AACrF,SAAO,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,OAAO;AAAA,kDAAC,SAAM,WAAU,iCAAgC;AAAA,IAAE,8CAAC,aAAU,OAAM,OAAM;AAAA,KAAE;AAC1K;AAEO,IAAM,cAAc;AAEpB,SAAS,UAAU,EAAE,WAAW,QAAQ,IAAI,GAAG,MAAM,GAA+B;AACzF,SAAO,8CAAC,SAAM,WAAW,GAAG,sBAAsB,SAAS,GAAG,QAAQ,IAAI,OAAe,GAAG,OAAO;AACrG;AAEO,SAAS,UAAU,EAAE,WAAW,QAAQ,IAAI,GAAG,MAAM,GAAiC;AAC3F,SAAO,8CAAC,aAAU,WAAW,GAAG,sBAAsB,SAAS,GAAG,MAAK,MAAK,OAAe,GAAG,OAAO;AACvG;AAEO,IAAM,kBAAkB;AAExB,SAAS,cAAc,EAAE,WAAW,cAAc,MAAM,GAAG,MAAM,GAAmE;AACzI,SAAO,+CAAC,SAAI,eAAY,QAAO,qBAAmB,aAAa,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AAAA,kDAAC,aAAU,OAAM,OAAM;AAAA,IAAE,8CAAC,SAAM,WAAU,mCAAkC;AAAA,KAAE;AAC9M;AAEO,SAAS,qBAAqB,EAAE,WAAW,UAAU,GAAG,GAAG,MAAM,GAA0D;AAChI,SAAO,8CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAQ,gBAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UAAU,8CAAC,WAAW,KAAO,CAAE,GAAE;AACtK;AAEO,IAAM,YAAY;AAElB,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAmC;AACvF,SAAO,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,4BAA4B,SAAS,GAAI,GAAG,OAAO;AAAA,kDAAC,SAAM,WAAU,kCAAiC;AAAA,IAAE,8CAAC,aAAU,OAAM,OAAM;AAAA,KAAE;AAC/K;AAEO,SAAS,gBAAgB,EAAE,WAAW,QAAQ,GAAG,GAAG,MAAM,GAAwD;AACvH,SAAO,8CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,4BAA4B,SAAS,GAAI,GAAG,OAAQ,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UAAU,8CAAC,WAAW,KAAO,CAAE,GAAE;AACtK;AAEO,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAAmC;AACzF,SAAO,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AAAA,kDAAC,SAAM,WAAU,gCAA+B;AAAA,IAAE,8CAAC,aAAU,OAAM,OAAM;AAAA,IAAE,8CAAC,aAAU,MAAK,MAAK,OAAM,OAAM;AAAA,KAAE;AAC9M;AAEO,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAmC;AACvF,SAAO,8CAAC,aAAU,WAAW,GAAG,6BAA6B,SAAS,GAAG,OAAO,GAAI,GAAG,OAAO;AAChG;AAIO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,GAAG;AACL,GAA2B;AACzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAW,GAAG,8BAA8B,SAAS;AAAA,MACrD,MAAK;AAAA,MACJ,GAAG;AAAA,MAEJ;AAAA,sDAAC,SAAI,eAAY,QAAO,WAAU,iFAChC,yDAAC,SAAI,WAAU,sCACb;AAAA,wDAAC,aAAU,OAAM,QAAO;AAAA,UACxB,8CAAC,aAAU,OAAM,OAAM;AAAA,UACvB,8CAAC,aAAU,OAAM,OAAM;AAAA,WACzB,GACF;AAAA,QACA,+CAAC,SAAI,eAAY,QAAO,WAAU,sFAChC;AAAA,wDAAC,aAAU,OAAM,OAAM;AAAA,UACvB,8CAAC,aAAU,OAAM,OAAM;AAAA,UACvB,8CAAC,aAAU,OAAM,OAAM;AAAA,WACzB;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,mBAAmB,OAA4B;AAC7D,SAAO,8CAAC,kBAAgB,GAAG,OAAO;AACpC;AAMO,SAAS,aAAa,EAAE,WAAW,QAAQ,GAAG,GAAG,MAAM,GAAsB;AAClF,SACE,+CAAC,WAAM,eAAY,QAAO,WAAW,GAAG,yBAAyB,SAAS,GAAI,GAAG,OAC/E;AAAA,kDAAC,SAAM,WAAU,gCAA+B;AAAA,IAChD,8CAAC,SAAI,WAAU,gCACZ,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UAAU,+CAAC,SAAI,WAAU,+BAA0C;AAAA,oDAAC,SAAM;AAAA,MAAE,8CAAC,aAAU,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,KAAK;AAAA,SAArE,KAAuE,CAAM,GAC9K;AAAA,KACF;AAEJ;AAOO,SAAS,WAAW,EAAE,WAAW,OAAO,QAAQ,GAAG,GAAG,MAAM,GAAsB;AACvF,SAAO,8CAAC,gBAAa,WAAW,GAAG,uBAAuB,SAAS,GAAG,OAAc,OAAe,GAAG,OAAO;AAC/G;AAEO,SAAS,eAAe,EAAE,WAAW,OAAO,QAAQ,GAAG,GAAG,MAAM,GAAsB;AAC3F,SAAO,8CAAC,gBAAa,WAAW,GAAG,4BAA4B,SAAS,GAAG,OAAc,OAAe,GAAG,OAAO;AACpH;AAEA,SAAS,aAAa,EAAE,WAAW,OAAO,QAAQ,GAAG,GAAG,MAAM,GAAsB;AAClF,SACE,+CAAC,SAAI,eAAY,QAAO,WAAW,GAAG,yBAAyB,SAAS,GAAI,GAAG,OAC7E;AAAA,mDAAC,SAAI,WAAU,iCAAgC;AAAA,oDAAC,aAAU,OAAM,OAAM;AAAA,MAAE,8CAAC,SAAM,WAAU,gCAA+B;AAAA,OAAE;AAAA,IACzH,SAAS,8CAAC,SAAI,WAAU,gCAAgC,iBAAM;AAAA,IAC/D,8CAAC,SAAI,WAAU,uBAAuB,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UAAU,8CAAC,aAAsB,OAAO,UAAU,QAAQ,IAAI,QAAQ,UAA5C,KAAoD,CAAE,GAAE;AAAA,KAC5J;AAEJ;;;ACpRA,IAAAC,UAAuB;AAcnB,IAAAC,uBAAA;AAFJ,IAAM,UAAgB;AAAA,EACpB,CAAC,EAAE,WAAW,OAAO,UAAU,OAAO,OAAO,GAAG,MAAM,GAAG,QACvD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,mBAAmB,SAAS;AAAA,MAC1C,gBAAc,WAAW;AAAA,MACzB,OAAO,EAAE,GAAG,OAAO,GAAI,QAAQ,EAAE,2BAA2B,MAAM,IAAI,CAAC,EAAG;AAAA,MACzE,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,QAAQ,cAAc;AAEtB,IAAM,gBAAsB;AAAA,EAC1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,2BAA2B,SAAS,GAAI,GAAG,OAAO;AAEnF;AACA,cAAc,cAAc;AAE5B,IAAM,eAAqB;AAAA,EACzB,CAAC,EAAE,WAAW,OAAO,UAAU,GAAG,MAAM,GAAG,QACzC,8CAAC,YAAO,KAAU,MAAY,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AAEjG;AACA,aAAa,cAAc;AAgB3B,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACF,GAA4B;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAW,GAAG,4BAA4B,SAAS;AAAA,MACnD;AAAA,MACA;AAAA,MACA,gBAAe;AAAA,MACf,eAAc;AAAA,MACd,kBAAiB;AAAA,MACjB,gBACE,gFACG;AAAA,gBAAQ,8CAAC,UAAK,WAAU,iCAAgC,eAAY,QAAQ,gBAAK;AAAA,QAClF,8CAAC,UAAK,WAAU,iCAAiC,gBAAK;AAAA,SACxD;AAAA,MAEF;AAAA,MACA,gBAAe;AAAA;AAAA,EACjB;AAEJ;AAEA,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,OAAO;AAEhF;AACA,WAAW,cAAc;AAEzB,IAAM,iBAAuB;AAAA,EAC3B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,4BAA4B,SAAS,GAAI,GAAG,OAAO;AAEpF;AACA,eAAe,cAAc;AAW7B,IAAM,iBAAuB;AAAA,EAC3B,CAAC,EAAE,SAAS,OAAO,MAAM,cAAc,WAAW,OAAO,UAAU,UAAU,GAAG,MAAM,GAAG,QACvF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACpD,eAAa,UAAU;AAAA,MACvB,gBAAc,SAAS,SAAS;AAAA,MAC/B,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,UAAK,WAAU,kCAAiC,eAAY,QAAQ,gBAAK;AAAA,QACnF,8CAAC,UAAK,WAAU,mCAAmC,UAAS;AAAA,QAC3D,gBAAgB,8CAAC,UAAK,WAAU,iCAAiC,wBAAa;AAAA;AAAA;AAAA,EACjF;AAEJ;AACA,eAAe,cAAc;AAE7B,IAAM,gBAAsB;AAAA,EAC1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,2BAA2B,SAAS,GAAI,GAAG,OAAO;AAEnF;AACA,cAAc,cAAc;;;AChI5B,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAC7B,IAAAC,yBAAsB;AAyEZ,IAAAC,uBAAA;AApDH,SAAS,UAAU,EAAE,MAAM,SAAS,OAAO,aAAa,UAAU,QAAQ,OAAO,MAAM,UAAU,OAAO,eAAe,WAAW,UAAU,GAAmB;AACpK,mBAAiB,IAAI,SAAS,IAAI;AAElC,QAAM,UAAgB,eAAuB,IAAI;AACjD,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,EAAE,OAAO,OAAO,OAAO,MAAM,CAAC;AAEnF,EAAM,wBAAgB,MAAM;AAC1B,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,CAAC,KAAM;AAEpB,UAAM,UAAU,MAAM;AAEpB,YAAM,YAAY,KAAK,IAAI,GAAG,KAAK,eAAe,KAAK,YAAY;AACnE,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,SAAS,CAAC;AAC3D,YAAM,QAAQ,YAAY,KAAK,MAAM;AACrC,YAAM,QAAQ,YAAY,MAAM;AAChC,qBAAe,cAAY,SAAS,UAAU,SAAS,SAAS,UAAU,QACtE,WAAW,EAAE,OAAO,MAAM,CAAC;AAAA,IACjC;AACA,UAAM,SAAS,IAAI,eAAe,OAAO;AACzC,UAAM,iBAAiB,MAAM;AAC3B,aAAO,WAAW;AAClB,aAAO,QAAQ,IAAI;AAEnB,iBAAW,SAAS,KAAK,SAAU,QAAO,QAAQ,KAAK;AACvD,cAAQ;AAAA,IACV;AACA,UAAM,YAAY,IAAI,iBAAiB,cAAc;AACrD,cAAU,QAAQ,MAAM,EAAE,WAAW,MAAM,SAAS,MAAM,eAAe,MAAM,YAAY,KAAK,CAAC;AACjG,SAAK,iBAAiB,UAAU,SAAS,EAAE,SAAS,KAAK,CAAC;AAC1D,SAAK,iBAAiB,QAAQ,SAAS,IAAI;AAC3C,mBAAe;AACf,WAAO,MAAM;AACX,aAAO,WAAW;AAClB,gBAAU,WAAW;AACrB,WAAK,oBAAoB,UAAU,OAAO;AAC1C,WAAK,oBAAoB,QAAQ,SAAS,IAAI;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,MAAI,CAAC,KAAM,QAAO;AAElB,aAAO;AAAA,IACL,8CAAC,SAAI,WAAU,8BAA6B,aAAa,SACvD;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,sBAAsB,uBAAuB,IAAI,IAAI,SAAS;AAAA,QAC5E,cAAW;AAAA,QACX,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,QAChD,MAAK;AAAA,QACL,aAAa,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAE9C;AAAA,yDAAC,YAAO,WAAU,8BAA6B,uBAAqB,YAAY,OAC9E;AAAA,2DAAC,SAAI,WAAU,+BACZ;AAAA,qBAAO,UAAU,WACd,8CAAC,QAAG,WAAU,6BAA6B,iBAAM,IACjD,8CAAC,SAAI,WAAU,6BAA6B,iBAAM;AAAA,cACrD,eAAe,8CAAC,OAAE,WAAU,mCAAmC,uBAAY;AAAA,eAC9E;AAAA,YACA,8CAAC,YAAO,MAAK,UAAS,WAAU,6BAA4B,cAAW,eAAc,SAAS,SAC5F,wDAAC,gCAAM,MAAM,IAAI,GACnB;AAAA,aACF;AAAA,UACA,8CAAC,SAAI,KAAK,SAAS,aAAW,WAAW,QAAW,WAAW,GAAG,4BAA4B,WAAW,mCAAmC,GACzI,oBAAU,8CAAC,YAAS,OAAO,cAAc,IAAK,UACjD;AAAA,UACC,UAAU,8CAAC,YAAO,WAAU,8BAA6B,uBAAqB,YAAY,OAAQ,kBAAO;AAAA;AAAA;AAAA,IAC5G,GACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AC7FA,IAAAC,UAAuB;AAiBL,IAAAC,uBAAA;AAJlB,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,YAAY,YAAY,UAAU,IAAI,aAAa,GAAG,MAAM,GAAG,QAAQ;AACnF,UAAM,cAAoB,cAAM;AAChC,UAAM,UAAU,MAAM;AACtB,UAAM,QAAQ;AAAA,MAAC;AAAA;AAAA,QACb;AAAA,QACA,IAAI,aAAa,UAAU;AAAA,QAC3B,aAAa,aAAc,eAAe,MAAO;AAAA,QACjD,WAAW,GAAG,oBAAoB,SAAS;AAAA,QAC3C,mBAAiB;AAAA,QAChB,GAAG;AAAA;AAAA,IACN;AACA,WAAO,aAAa,+CAAC,SAAI,WAAU,2DAA0D,qBAAkB,MAC5G;AAAA;AAAA,MACD,8CAAC,WAAM,WAAU,iCAAgC,SAAS,SAAU,sBAAW;AAAA,OACjF,IAAS;AAAA,EACX;AACF;AACA,SAAS,cAAc;;;AC/BvB,IAAAC,UAAuB;AAiBnB,IAAAC,uBAAA;AAFJ,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,MAAM,eAAe,SAAS,OAAO,MAAM,OAAO,WAAW,UAAU,GAAG,MAAM,GAAG,QAC/F;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,uBAAuB,wBAAwB,IAAI,IAAI,wBAAwB,IAAI,IAAI,SAAS;AAAA,MAC9G,MAAK;AAAA,MACJ,GAAG;AAAA,MAEH;AAAA,gBAAQ,iBAAiB,WAAW,8CAAC,UAAK,WAAU,6BAA4B,eAAY,QAAQ,gBAAK;AAAA,QAC1G,8CAAC,UAAM,UAAS;AAAA,QACf,QAAQ,iBAAiB,SAAS,8CAAC,UAAK,WAAU,6BAA4B,eAAY,QAAQ,gBAAK;AAAA;AAAA;AAAA,EAC1G;AAEJ;AACA,WAAW,cAAc;;;AC7BzB,IAAAC,UAAuB;AACvB,IAAAC,yBAAmC;AAsC7B,IAAAC,uBAAA;AAvBC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AACF,GAAsB;AACpB,QAAM,UAAgB,cAAM;AAC5B,QAAM,WAAiB,eAAyB,IAAI;AACpD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,QAAM,WAAW,CAAC,cAAiC;AACjD,QAAI,SAAU;AACd,UAAM,YAAY,MAAM,KAAK,SAAS;AACtC,QAAI,UAAU,WAAW,EAAG;AAC5B,kBAAc,WAAW,CAAC,GAAG,OAAO,GAAG,SAAS,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC;AAAA,EAC3E;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,yBAAyB,SAAS,GACnD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,WAAU;AAAA,QACV,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,cAAI,MAAM,OAAO,MAAO,UAAS,MAAM,OAAO,KAAK;AACnD,gBAAM,OAAO,QAAQ;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,iBAAe,cAAc;AAAA,QAC7B,MAAK;AAAA,QACL;AAAA,QACA,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,QACvC,aAAa,CAAC,UAAU;AACtB,gBAAM,eAAe;AACrB,cAAI,CAAC,SAAU,eAAc,IAAI;AAAA,QACnC;AAAA,QACA,YAAY,CAAC,UAAU,MAAM,eAAe;AAAA,QAC5C,aAAa,CAAC,UAAU;AACtB,gBAAM,eAAe;AACrB,wBAAc,KAAK;AAAA,QACrB;AAAA,QACA,QAAQ,CAAC,UAAU;AACjB,gBAAM,eAAe;AACrB,wBAAc,KAAK;AACnB,mBAAS,MAAM,aAAa,KAAK;AAAA,QACnC;AAAA,QAEA;AAAA,wDAAC,sCAAY,eAAY,QAAO,MAAM,IAAI;AAAA,UAC1C,+CAAC,UAAK,WAAU,+BACd;AAAA,0DAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,YACrD,eAAe,8CAAC,UAAK,WAAU,sCAAsC,uBAAY;AAAA,aACpF;AAAA;AAAA;AAAA,IACF;AAAA,IACC,MAAM,SAAS,KACd,8CAAC,QAAG,WAAU,gCAA+B,cAAW,kBACrD,gBAAM,IAAI,CAAC,MAAM,UAChB,+CAAC,QAAG,WAAU,+BACZ;AAAA,oDAAC,UAAK,WAAU,oCAAoC,eAAK,MAAK;AAAA,MAC9D,8CAAC,UAAK,WAAU,oCAAoC,yBAAe,KAAK,IAAI,GAAE;AAAA,MAC9E;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAY,UAAU,KAAK,IAAI;AAAA,UAC/B;AAAA,UACA,SAAS,MAAM,cAAc,MAAM,OAAO,CAAC,GAAG,cAAc,cAAc,KAAK,CAAC;AAAA,UAEhF,wDAAC,gCAAM,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,MACtC;AAAA,SAX+C,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,EAYnF,CACD,GACH;AAAA,KAEJ;AAEJ;AAEA,SAAS,eAAe,OAAe;AACrC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC3D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;;;AC1GA,IAAAC,yBAAsC;AAoChC,IAAAC,uBAAA;AAlBC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAoB;AAClB,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,aAAa,QAAQ,CAAC;AAC/D,QAAM,cAAc,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,UAAU;AAC1D,QAAM,QAAQ,eAAe,IAAI,KAAK,cAAc,KAAK,WAAW;AACpE,QAAM,MAAM,KAAK,IAAI,cAAc,UAAU,UAAU;AACvD,QAAM,oBAAoB,mBAAmB,QAAQ,gBAAgB,SAAS,KAAK,oBAAoB;AAEvG,SACE,+CAAC,SAAI,WAAW,GAAG,sBAAsB,SAAS,GAAG,cAAY,WAC/D;AAAA,kDAAC,UAAK,WAAU,+BACb,yBAAe,IAAI,eAAe,GAAG,KAAK,IAAI,GAAG,OAAO,UAAU,IACrE;AAAA,IACA,+CAAC,SAAI,WAAU,gCACZ;AAAA,2BACC;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,WAAU;AAAA,UACV,OAAO,gBAAgB,IAAI,CAAC,YAAY;AAAA,YACtC,OAAO,OAAO,MAAM;AAAA,YACpB,aAAa,GAAG,MAAM;AAAA,UACxB,EAAE;AAAA,UACF,UAAU,CAAC,UAAU,iBAAiB,OAAO,KAAK,CAAC;AAAA,UACnD,eAAe,OAAO,QAAQ;AAAA,UAC9B,MAAK;AAAA,UACL,cAAa;AAAA,UACb,gBAAe;AAAA;AAAA,MACjB;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,OAAM;AAAA,UACN,UAAU,gBAAgB,KAAK,eAAe;AAAA,UAC9C,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAE3C,wDAAC,oCAAU,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,MAC1C;AAAA,MACA,+CAAC,UAAK,WAAU,4BAA2B,gBAAa,QAAQ;AAAA;AAAA,QAAY;AAAA,QAAK;AAAA,SAAW;AAAA,MAC5F;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,OAAM;AAAA,UACN,UAAU,gBAAgB,cAAc,eAAe;AAAA,UACvD,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAE3C,wDAAC,qCAAW,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA,MAC3C;AAAA,OACF;AAAA,KACF;AAEJ;;;AChFA,IAAAC,UAAuB;AACvB,IAAAC,yBAAyE;AA4InE,IAAAC,uBAAA;AAzHN,IAAM,QAAQ,CAAC,GAAa,MAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,UAAU,OAAO,EAAE,KAAK,CAAC;AAGpG,SAAS,aAAa,EAAE,OAAO,OAAO,UAAU,QAAQ,gBAAgB,cAAc,kBAAkB,UAAU,GAAsB;AAC7I,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAyE,IAAI;AACjH,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,EAAE;AACzD,QAAM,OAAa,eAAuB,IAAI;AAC9C,QAAM,UAAgB,eAA0B,IAAI;AACpD,QAAM,QAAc,eAAuB,IAAI;AAC/C,QAAM,OAAa,eAAyB,IAAI;AAChD,QAAM,YAAkB,eAAoC,IAAI;AAChE,QAAM,KAAW,cAAM;AACvB,WAAS,mBAAmB;AAC1B,cAAU,UAAU,IAAI,IAAI,MAAM,KAAK,MAAM,SAAS,iBAA8B,2BAA2B,KAAK,CAAC,CAAC,EAAE,IAAI,CAAAC,SAAO,CAACA,KAAI,QAAQ,kBAAmBA,KAAI,sBAAsB,CAAC,CAAC,CAAC;AAAA,EAClM;AAEA,EAAM,wBAAgB,MAAM;AAC1B,UAAM,SAAS,UAAU;AACzB,cAAU,UAAU;AACpB,QAAI,CAAC,UAAU,CAAC,MAAM,WAAW,OAAO,WAAW,kCAAkC,EAAE,QAAS;AAChG,UAAM,SAAS,iBAAiB,MAAM,OAAO;AAC7C,UAAM,QAAQ,OAAO,iBAAiB,mBAAmB,EAAE,KAAK;AAChE,UAAM,WAAW,WAAW,KAAK,KAAK,MAAM,SAAS,IAAI,IAAI,IAAI;AACjE,UAAM,SAAS,OAAO,iBAAiB,YAAY,EAAE,KAAK;AAC1D,eAAWA,QAAO,MAAM,QAAQ,iBAA8B,2BAA2B,GAAG;AAC1F,YAAM,WAAW,OAAO,IAAIA,KAAI,QAAQ,gBAAiB;AACzD,MAAAA,KAAI,cAAc,EAAE,OAAO,eAAa,UAAU,OAAO,yBAAyB,EAAE,QAAQ,eAAa,UAAU,OAAO,CAAC;AAC3H,UAAI,CAAC,SAAU;AACf,YAAM,OAAOA,KAAI,sBAAsB;AACvC,YAAM,IAAI,SAAS,OAAO,KAAK,MAAM,IAAI,SAAS,MAAM,KAAK;AAC7D,UAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,EAAG;AACxC,MAAAA,KAAI,QAAQ,CAAC,EAAE,WAAW,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,WAAW,kBAAkB,CAAC,GAAG,EAAE,UAAU,QAAQ,IAAI,0BAA0B,CAAC;AAAA,IACjJ;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,OAAO,SAAO,MAAM,KAAK,UAAQ,KAAK,OAAO,GAAG,CAAC;AACnF,QAAM,YAAY,CAAC,GAAG,OAAO,GAAG,MAAM,OAAO,UAAQ,KAAK,YAAY,CAAC,MAAM,SAAS,KAAK,EAAE,CAAC,EAAE,IAAI,UAAQ,KAAK,EAAE,CAAC;AACpH,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,SAAS,SAAS,UAAU,MAAM,OAAO,UAAQ,CAAC,UAAU,SAAS,KAAK,EAAE,CAAC,EAAE,IAAI,UAAQ,KAAK,EAAE;AAExG,WAAS,SAAS;AAAE,qBAAiB;AAAG,SAAK,UAAU;AAAM,eAAW,IAAI;AAAA,EAAE;AAC9E,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,MAAM;AACrB,aAAS,QAAQ,OAAqB;AAAE,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IAAE;AAC3H,aAAS,OAAO,OAAsB;AACpC,UAAI,MAAM,QAAQ,SAAU;AAC5B,YAAM,eAAe;AACrB,UAAI,KAAK,SAAS;AAAE,yBAAiB;AAAG,aAAK,UAAU;AAAM,mBAAW,IAAI;AAAG,wBAAgB,sBAAsB;AAAA,MAAE,OAClH;AAAE,gBAAQ,KAAK;AAAG,gBAAQ,SAAS,MAAM;AAAA,MAAE;AAAA,IAClD;AACA,aAAS,KAAK,OAAmB;AAAE,UAAI,MAAM,yBAAyB,QAAQ,CAAC,KAAK,SAAS,SAAS,MAAM,aAAa,EAAG,SAAQ,KAAK;AAAA,IAAE;AAC3I,UAAM,UAAU,KAAK;AACrB,aAAS,iBAAiB,eAAe,OAAO;AAAG,aAAS,iBAAiB,WAAW,MAAM;AAAG,aAAS,iBAAiB,YAAY,IAAI;AAC3I,WAAO,MAAM;AAAE,eAAS,oBAAoB,eAAe,OAAO;AAAG,eAAS,oBAAoB,WAAW,MAAM;AAAG,eAAS,oBAAoB,YAAY,IAAI;AAAA,IAAE;AAAA,EACvK,GAAG,CAAC,IAAI,CAAC;AAET,WAAS,OAAO,MAAgB,SAAiB;AAAE,qBAAiB;AAAG,aAAS,IAAI;AAAG,oBAAgB,OAAO;AAAA,EAAE;AAChH,WAAS,KAAK,KAAa,QAAgB;AACzC,UAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,UAAM,OAAO,UAAU,OAAO,UAAQ,SAAS,GAAG;AAClD,QAAI,SAAS,KAAK,UAAU,UAAU,SAAS,KAAK,CAAC,MAAM,KAAK,UAAQ,KAAK,OAAO,GAAG,GAAG,UAAU;AAClG,aAAO,MAAM,GAAG,MAAM,KAAK,UAAQ,KAAK,OAAO,GAAG,GAAG,KAAK,SAAS;AAAG;AAAA,IACxE;AACA,SAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC,GAAG,GAAG,GAAG;AACtE,WAAO,MAAM,GAAG,MAAM,KAAK,UAAQ,KAAK,OAAO,GAAG,GAAG,KAAK,UAAU,SAAS,IAAI,OAAO,MAAM,EAAE;AAAA,EAClG;AACA,WAAS,MAAM,OAA0C,KAAa;AACpE,QAAI,MAAM,WAAW,KAAM,MAAM,OAAmB,QAAQ,QAAQ,EAAG;AACvE,SAAK,UAAU,EAAE,IAAI,KAAK,WAAW,MAAM,WAAW,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,QAAQ,OAAO,SAAS,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC,GAAG,MAAM,EAAE;AACtJ,UAAM,SAAS,kBAAkB,MAAM,SAAS;AAChD,UAAM,eAAe;AAAA,EACvB;AACA,WAAS,OAAO,OAA2C;AACzD,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,WAAW,MAAM,cAAc,QAAQ,UAAW;AACvD,QAAI,CAAC,QAAQ,UAAU,KAAK,MAAM,MAAM,UAAU,QAAQ,GAAG,MAAM,UAAU,QAAQ,CAAC,IAAI,EAAG;AAC7F,YAAQ,SAAS;AACjB,UAAM,YAAY,MAAM;AACxB,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,UAAU,sBAAsB;AAC/C,UAAM,cAAc,UAAU,cAA2B,qCAAqC;AAC9F,UAAM,SAAS,MAAM,WAAW,OAAO,QAAQ,MAAM,WAAW,OAAO,SAAS,MAAM,WAAW,OAAO,OAAO,MAAM,WAAW,OAAO;AACvI,QAAI,CAAC,OAAQ;AACb,UAAM,cAAc,MAAM,WAAW,YAAY,sBAAsB,EAAE,MAAM,WAAW;AAC1F,QAAI,gBAAgB,YAAY,MAAM,KAAK,UAAQ,KAAK,OAAO,QAAQ,EAAE,GAAG,SAAU;AAEtF,UAAM,QAAQ,MAAM,KAAK,UAAU,iBAA8B,8BAA8B,WAAW,8BAA8B,CAAC;AACzI,UAAM,SAAS,MAAM,UAAU,OAAO,MAAM,UAAU,YAAY,UAAU;AAC5E,UAAM,UAAU,MAAM,KAAK,CAAAA,SAAOA,KAAI,QAAQ,qBAAqB,QAAQ,EAAE;AAC7E,QAAI,WAAW,UAAU,QAAQ,aAAa,UAAU,QAAQ,YAAY,QAAQ,aAAc;AAClG,UAAM,cAAc,QAAQ,QAAQ,OAAO,SAAO,QAAQ,QAAQ,EAAE;AACpE,QAAI,aAAa,QAAQ,OAAO,OAAO,SAAO,QAAQ,QAAQ,EAAE;AAChE,QAAI,gBAAgB,WAAW;AAC7B,YAAM,QAAQ,MAAM,OAAO,CAAAA,SAAOA,KAAI,QAAQ,qBAAqB,QAAQ,MAAM,SAASA,KAAI,YAAYA,KAAI,eAAe,CAAC,EAAE;AAChI,kBAAY,OAAO,OAAO,GAAG,QAAQ,EAAE;AAAA,IACzC,OAAO;AACL,iBAAW,KAAK,QAAQ,EAAE;AAC1B,mBAAa,MAAM,OAAO,UAAQ,WAAW,SAAS,KAAK,EAAE,CAAC,EAAE,IAAI,UAAQ,KAAK,EAAE;AAAA,IACrF;AACA,QAAI,CAAC,MAAM,aAAa,QAAQ,OAAO,KAAK,CAAC,MAAM,YAAY,QAAQ,MAAM,GAAG;AAC9E,uBAAiB;AACjB,cAAQ,UAAU;AAAa,cAAQ,SAAS;AAAA,IAClD;AACA,eAAW,EAAE,SAAS,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,CAAC;AAEnF,QAAI,MAAM,UAAU,OAAO,MAAM,GAAI,WAAU,aAAa;AAAA,aACnD,MAAM,UAAU,OAAO,SAAS,GAAI,WAAU,aAAa;AAAA,EACtE;AACA,WAAS,OAAO,OAA2C;AACzD,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,WAAW,QAAQ,cAAc,MAAM,UAAW;AACvD,UAAM,MAAM,SAAS,iBAAiB,MAAM,SAAS,MAAM,OAAO;AAClE,QAAI,QAAQ,UAAU,OAAO,MAAM,SAAS,SAAS,GAAG,EAAG,QAAO,QAAQ,SAAS,sBAAsB;AACzG,WAAO;AACP,QAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,EAAG,OAAM,QAAQ,sBAAsB,MAAM,SAAS;AAAA,EAC5G;AACA,WAAS,IAAI,KAAa,UAAmB,OAAe;AAC1D,UAAM,OAAO,MAAM,KAAK,CAAAC,UAAQA,MAAK,OAAO,GAAG;AAC/C,WAAO;AAAA,MAAC;AAAA;AAAA,QAAa,WAAU;AAAA,QAA6B,2BAAyB;AAAA,QAAK,eAAa,YAAY;AAAA,QAAW,iBAAe,SAAS,WAAW,OAAO;AAAA,QACtK,eAAe,WAAS,MAAM,OAAO,GAAG;AAAA,QACxC;AAAA,wDAAC,0CAAgB,WAAU,+BAA8B,eAAY,QAAO;AAAA,UAC5E,8CAAC,UAAK,WAAU,+BAA+B,eAAK,OAAM;AAAA,UAC1D,8CAAC,SAAI,WAAU,kCAAiC,eAAe,WAAS,MAAM,gBAAgB,GAC3F,qBAAW,8CAAC,UAAO,YAAW,SAAQ,aAAY,MAAK,aAAW,MAAC,MAAM,8CAAC,8BAAI,eAAY,QAAO,GAAI,cAAY,QAAQ,KAAK,KAAK,WAAW,SAAS,MAAM,OAAO,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,KAAK,KAAK,QAAQ,GAAG,IAAK,gFACrN;AAAA,0DAAC,UAAO,YAAW,SAAQ,aAAY,MAAK,aAAW,MAAC,MAAM,8CAAC,kCAAQ,eAAY,QAAO,GAAI,cAAY,QAAQ,KAAK,KAAK,OAAO,UAAU,UAAU,GAAG,SAAS,MAAM,KAAK,KAAK,EAAE,GAAG;AAAA,YACxL,8CAAC,UAAO,YAAW,SAAQ,aAAY,MAAK,aAAW,MAAC,MAAM,UAAU,QAAQ,SAAS,KAAK,CAAC,KAAK,WAAW,8CAAC,mCAAS,eAAY,QAAO,IAAK,8CAAC,oCAAU,eAAY,QAAO,GAAI,cAAY,UAAU,QAAQ,SAAS,KAAK,CAAC,KAAK,WAAW,QAAQ,KAAK,KAAK,YAAY,QAAQ,KAAK,KAAK,SAAS,UAAU,UAAU,QAAQ,SAAS,KAAK,KAAK,UAAU,SAAS,MAAM,KAAK,KAAK,CAAC,GAAG;AAAA,aACjY,GACF;AAAA;AAAA;AAAA,MATc;AAAA,IAUhB;AAAA,EACF;AACA,SAAO,+CAAC,SAAI,WAAW,GAAG,yBAAyB,SAAS,GAAG,KAAK,MAClE;AAAA,kDAAC,UAAO,KAAK,SAAS,aAAY,MAAK,YAAW,aAAY,MAAM,8CAAC,+BAAK,eAAY,QAAO,GAAI,cAAa,SAAQ,iBAAc,UAAS,iBAAe,MAAM,iBAAe,IAAI,SAAS,MAAM;AAAE,aAAO;AAAG,cAAQ,aAAW,CAAC,OAAO;AAAA,IAAE,GAAI,iBAAM;AAAA,IACtP,OAAO,+CAAC,SAAI,IAAQ,WAAU,gCAA+B,KAAK,OAAO,MAAK,UAAS,iBAAe,QAAQ,OAAO,KAAK,QAAW,cAAY,OAAO,UAAU,IAAI,eAAe,QAAQ,aAAa,QAAQ,iBAAiB,QAAQ,sBAAsB,QAChQ;AAAA,oDAAC,QAAG,WAAU,+BAA8B,4BAAyB,WAAU,cAAW,mBAAmB,kBAAQ,IAAI,CAAC,KAAK,UAAU,IAAI,KAAK,OAAO,KAAK,CAAC,GAAE;AAAA,MACjK,+CAAC,aAAQ,4BAAyB,UAAS,WAAU,iCAAgC,cAAY,aAC/F;AAAA,sDAAC,SAAI,WAAU,kCAAiC,yDAAC,UAAM;AAAA;AAAA,UAAY,8CAAC,mCAAS,eAAY,QAAO;AAAA,WAAE,GAAO;AAAA,QACzG,8CAAC,QAAG,WAAU,+BAA+B,iBAAO,IAAI,CAAC,KAAK,UAAU,IAAI,KAAK,MAAM,KAAK,CAAC,GAAE;AAAA,QAC9F,CAAC,OAAO,SAAS,8CAAC,OAAE,WAAU,gCAA+B,6CAA+B,IAAO;AAAA,SACtG;AAAA,MACA,8CAAC,UAAK,WAAU,uCAAsC,MAAK,UAAS,aAAU,UAAU,wBAAa;AAAA,OACvG,IAAS;AAAA,KACX;AACF;","names":["import_jsx_runtime","document","lineNumberGutter","CodeMirror","import_fractal_icons","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","FolderIcon","React","import_jsx_runtime","React","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","defaultIcons","Toast","ToastViewport","import_jsx_runtime","React","import_react_dom","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_dom","import_fractal_icons","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_fractal_icons","import_jsx_runtime","CheckboxIcon","import_jsx_runtime","import_react","import_fractal_icons","import_jsx_runtime","import_react","import_jsx_runtime","nextId","React","import_jsx_runtime","import_react","import_fractal_icons","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_react_dom","import_fractal_icons","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","import_fractal_icons","import_jsx_runtime","React","import_fractal_icons","import_jsx_runtime","row","item"]}
|