@mirror-physics/fractal-ui 0.2.0-next.3 → 0.2.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -680,7 +680,8 @@ function SortableTable({
680
680
  sortKey: controlledKey,
681
681
  sortDirection: controlledDirection,
682
682
  onSortChange,
683
- highlightRow
683
+ highlightRow,
684
+ onRowClick
684
685
  }) {
685
686
  const [internalKey, setInternalKey] = useState3(defaultSortKey ?? null);
686
687
  const [internalDirection, setInternalDirection] = useState3(defaultSortDirection);
@@ -781,8 +782,18 @@ function SortableTable({
781
782
  {
782
783
  className: cn(
783
784
  "fractal-sortable-table-row",
784
- highlighted && "fractal-sortable-table-row--highlighted"
785
+ highlighted && "fractal-sortable-table-row--highlighted",
786
+ onRowClick && "fractal-sortable-table-row--interactive"
785
787
  ),
788
+ onClick: onRowClick ? () => onRowClick(row, rowIndex) : void 0,
789
+ onKeyDown: onRowClick ? (event) => {
790
+ if (event.key === "Enter" || event.key === " ") {
791
+ event.preventDefault();
792
+ onRowClick(row, rowIndex);
793
+ }
794
+ } : void 0,
795
+ role: onRowClick ? "button" : void 0,
796
+ tabIndex: onRowClick ? 0 : void 0,
786
797
  children: columns.map((col) => /* @__PURE__ */ jsx12(
787
798
  "td",
788
799
  {
@@ -1027,6 +1038,61 @@ var SidebarFooter = React10.forwardRef(
1027
1038
  ({ className, ...props }, ref) => /* @__PURE__ */ jsx15("div", { ref, className: cn("fractal-sidebar__footer", className), ...props })
1028
1039
  );
1029
1040
  SidebarFooter.displayName = "SidebarFooter";
1041
+
1042
+ // src/components/PageHeader/PageHeader.tsx
1043
+ import * as React11 from "react";
1044
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
1045
+ var PageHeader = React11.forwardRef(
1046
+ ({ title, description, actions, className, ...props }, ref) => /* @__PURE__ */ jsxs13("div", { ref, className: cn("fractal-page-header", className), ...props, children: [
1047
+ /* @__PURE__ */ jsxs13("div", { className: "fractal-page-header__content", children: [
1048
+ /* @__PURE__ */ jsx16("h1", { className: "fractal-page-header__title", children: title }),
1049
+ description && /* @__PURE__ */ jsx16("p", { className: "fractal-page-header__description", children: description })
1050
+ ] }),
1051
+ actions && /* @__PURE__ */ jsx16("div", { className: "fractal-page-header__actions", children: actions })
1052
+ ] })
1053
+ );
1054
+ PageHeader.displayName = "PageHeader";
1055
+
1056
+ // src/components/SidePanel/SidePanel.tsx
1057
+ import { createPortal as createPortal2 } from "react-dom";
1058
+ import { Close } from "@mirror-physics/fractal-icons";
1059
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
1060
+ function SidePanel({ open, onClose, title, description, children, footer, size = "md", className }) {
1061
+ useEscapeDismiss(80, onClose, open);
1062
+ if (!open) return null;
1063
+ return createPortal2(
1064
+ /* @__PURE__ */ jsx17("div", { className: "fractal-side-panel-overlay", onMouseDown: onClose, children: /* @__PURE__ */ jsxs14(
1065
+ "aside",
1066
+ {
1067
+ className: cn("fractal-side-panel", `fractal-side-panel--${size}`, className),
1068
+ "aria-modal": "true",
1069
+ "aria-label": typeof title === "string" ? title : "Side panel",
1070
+ role: "dialog",
1071
+ onMouseDown: (event) => event.stopPropagation(),
1072
+ children: [
1073
+ /* @__PURE__ */ jsxs14("header", { className: "fractal-side-panel__header", children: [
1074
+ /* @__PURE__ */ jsxs14("div", { className: "fractal-side-panel__heading", children: [
1075
+ /* @__PURE__ */ jsx17("h2", { className: "fractal-side-panel__title", children: title }),
1076
+ description && /* @__PURE__ */ jsx17("p", { className: "fractal-side-panel__description", children: description })
1077
+ ] }),
1078
+ /* @__PURE__ */ jsx17("button", { type: "button", className: "fractal-side-panel__close", "aria-label": "Close panel", onClick: onClose, children: /* @__PURE__ */ jsx17(Close, { size: 18 }) })
1079
+ ] }),
1080
+ /* @__PURE__ */ jsx17("div", { className: "fractal-side-panel__body", children }),
1081
+ footer && /* @__PURE__ */ jsx17("footer", { className: "fractal-side-panel__footer", children: footer })
1082
+ ]
1083
+ }
1084
+ ) }),
1085
+ document.body
1086
+ );
1087
+ }
1088
+
1089
+ // src/components/Textarea/Textarea.tsx
1090
+ import * as React12 from "react";
1091
+ import { jsx as jsx18 } from "react/jsx-runtime";
1092
+ var Textarea = React12.forwardRef(
1093
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx18("textarea", { ref, className: cn("fractal-textarea", className), ...props })
1094
+ );
1095
+ Textarea.displayName = "Textarea";
1030
1096
  export {
1031
1097
  Alert,
1032
1098
  AlertDescription,
@@ -1048,8 +1114,10 @@ export {
1048
1114
  Label,
1049
1115
  Link,
1050
1116
  Modal,
1117
+ PageHeader,
1051
1118
  PromptCard,
1052
1119
  PromptGrid,
1120
+ SidePanel,
1053
1121
  Sidebar,
1054
1122
  SidebarBrand,
1055
1123
  SidebarFooter,
@@ -1059,6 +1127,7 @@ export {
1059
1127
  SidebarSection,
1060
1128
  SortableTable,
1061
1129
  Tabs,
1130
+ Textarea,
1062
1131
  Toggle,
1063
1132
  cn,
1064
1133
  useEscapeDismiss
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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"],"sourcesContent":["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: '38px', padding: '8px 16px', iconOnly: '38px', 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}\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}: 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 )}\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"],"mappings":"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","names":["React","jsxs","React","jsx","jsxs","React","jsx","React","jsx","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","React","jsx","React","jsx","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useRef","nextId","useId","useState","ChevronDown","jsx","jsxs","useId","useState","ChevronDown","React","jsx","jsxs"]}
1
+ {"version":3,"sources":["../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/PageHeader/PageHeader.tsx","../src/components/SidePanel/SidePanel.tsx","../src/components/Textarea/Textarea.tsx"],"sourcesContent":["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: '38px', padding: '8px 16px', iconOnly: '38px', 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 { cn } from '../../utils/cn'\nimport './PageHeader.css'\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** The page's primary title. */\n title: React.ReactNode\n /** Optional supporting context for the page. */\n description?: React.ReactNode\n /** Right-aligned action slot. Place secondary actions before the primary action. */\n actions?: React.ReactNode\n}\n\nconst PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(\n ({ title, description, actions, className, ...props }, ref) => (\n <div ref={ref} className={cn('fractal-page-header', className)} {...props}>\n <div className=\"fractal-page-header__content\">\n <h1 className=\"fractal-page-header__title\">{title}</h1>\n {description && <p className=\"fractal-page-header__description\">{description}</p>}\n </div>\n {actions && <div className=\"fractal-page-header__actions\">{actions}</div>}\n </div>\n ),\n)\nPageHeader.displayName = 'PageHeader'\n\nexport { PageHeader }\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","jsxs","React","jsx","jsxs","React","jsx","React","jsx","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","React","jsx","React","jsx","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useRef","nextId","useId","useState","ChevronDown","jsx","jsxs","useId","useState","ChevronDown","React","jsx","jsxs","React","jsx","jsxs","createPortal","jsx","jsxs","createPortal","React","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirror-physics/fractal-ui",
3
- "version": "0.2.0-next.3",
3
+ "version": "0.2.0-next.5",
4
4
  "description": "Fractal UI — React components and CSS tokens for Mirror Physics products",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",