@lagroon/inkwell-design-system 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/icons.jsx","../src/components/button.tsx","../src/components/iconButton.tsx","../src/components/pill.tsx","../src/components/statusBanner.tsx","../src/components/select.tsx","../src/components/popoverMenu.tsx","../src/components/ui.jsx","../src/components/modalFrame.tsx","../src/components/splitButton.jsx","../src/components/forms.tsx","../src/components/card.tsx","../src/components/badge.tsx","../src/components/tabs.tsx","../src/components/collapsible.tsx","../src/components/tooltip.tsx","../src/components/divider.tsx","../src/components/avatar.tsx","../src/components/table.tsx","../src/components/list.tsx","../src/components/spinner.tsx","../src/components/skeleton.tsx","../src/components/progress.tsx","../src/components/layout.tsx"],"sourcesContent":["// Solar Linear icons + Simple Icons brand logos\n// All render at 1em × 1em, inherit color via stroke=\"currentColor\"\n\nfunction Svg({ size = \"1em\", style, children, ...props }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{ flexShrink: 0, ...style }}\n {...props}\n >\n {children}\n </svg>\n );\n}\n\nexport function IconArrowDown(props) {\n return (\n <Svg {...props}>\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m19 9l-7 6l-7-6\" />\n </Svg>\n );\n}\n\nexport function IconCheck(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m8.5 12.5l2 2l5-5\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconDotsVertical({ style, ...rest }) {\n return (\n <Svg style={{ transform: \"rotate(90deg)\", ...style }} {...rest}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"5\" cy=\"12\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <circle cx=\"19\" cy=\"12\" r=\"2\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconEye(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M3.275 15.296C2.425 14.192 2 13.639 2 12c0-1.64.425-2.191 1.275-3.296C4.972 6.5 7.818 4 12 4s7.028 2.5 8.725 4.704C21.575 9.81 22 10.361 22 12c0 1.64-.425 2.191-1.275 3.296C19.028 17.5 16.182 20 12 20s-7.028-2.5-8.725-4.704Z\" />\n <path d=\"M15 12a3 3 0 1 1-6 0a3 3 0 0 1 6 0Z\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconLogout(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\">\n <path d=\"M12 20a8 8 0 1 1 0-16\" />\n <path strokeLinejoin=\"round\" d=\"M10 12h10m0 0l-3-3m3 3l-3 3\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconTrophy(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M12 16c-5.76 0-6.78-5.74-6.96-10.294c-.051-1.266-.076-1.9.4-2.485c.475-.586 1.044-.682 2.183-.874A26.4 26.4 0 0 1 12 2c1.784 0 3.253.157 4.377.347c1.139.192 1.708.288 2.184.874s.45 1.219.4 2.485C18.781 10.26 17.761 16 12.001 16Z\" />\n <path strokeLinecap=\"round\" d=\"M12 16v3\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.5 22h-7l.34-1.696a1 1 0 0 1 .98-.804h4.36a1 1 0 0 1 .98.804z\" />\n <path d=\"m19 5l.949.316c.99.33 1.485.495 1.768.888S22 7.12 22 8.162v.073c0 .86 0 1.291-.207 1.643s-.584.561-1.336.98L17.5 12.5M5 5l-.949.316c-.99.33-1.485.495-1.768.888S2 7.12 2 8.162v.073c0 .86 0 1.291.207 1.643s.584.561 1.336.98L6.5 12.5m4.646-6.477C11.526 5.34 11.716 5 12 5s.474.34.854 1.023l.098.176c.108.194.162.29.246.354c.085.064.19.088.4.135l.19.044c.738.167 1.107.25 1.195.532s-.164.577-.667 1.165l-.13.152c-.143.167-.215.25-.247.354s-.021.215 0 .438l.02.203c.076.785.114 1.178-.115 1.352c-.23.174-.576.015-1.267-.303l-.178-.082c-.197-.09-.295-.135-.399-.135s-.202.045-.399.135l-.178.082c-.691.319-1.037.477-1.267.303s-.191-.567-.115-1.352l.02-.203c.021-.223.032-.334 0-.438s-.104-.187-.247-.354l-.13-.152c-.503-.588-.755-.882-.667-1.165c.088-.282.457-.365 1.195-.532l.19-.044c.21-.047.315-.07.4-.135c.084-.064.138-.16.246-.354z\" />\n <path strokeLinecap=\"round\" d=\"M18 22H6\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconUsers(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"9\" cy=\"6\" r=\"4\" />\n <path strokeLinecap=\"round\" d=\"M15 9a3 3 0 1 0 0-6\" />\n <ellipse cx=\"9\" cy=\"17\" rx=\"7\" ry=\"4\" />\n <path strokeLinecap=\"round\" d=\"M18 14c1.754.385 3 1.359 3 2.5c0 1.03-1.014 1.923-2.5 2.37\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconSettings(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M13.765 2.152C13.398 2 12.932 2 12 2s-1.398 0-1.765.152a2 2 0 0 0-1.083 1.083c-.092.223-.129.484-.143.863a1.62 1.62 0 0 1-.79 1.353a1.62 1.62 0 0 1-1.567.008c-.336-.178-.579-.276-.82-.308a2 2 0 0 0-1.478.396C4.04 5.79 3.806 6.193 3.34 7s-.7 1.21-.751 1.605a2 2 0 0 0 .396 1.479c.148.192.355.353.676.555c.473.297.777.803.777 1.361s-.304 1.064-.777 1.36c-.321.203-.529.364-.676.556a2 2 0 0 0-.396 1.479c.052.394.285.798.75 1.605c.467.807.7 1.21 1.015 1.453a2 2 0 0 0 1.479.396c.24-.032.483-.13.819-.308a1.62 1.62 0 0 1 1.567.008c.483.28.77.795.79 1.353c.014.38.05.64.143.863a2 2 0 0 0 1.083 1.083C10.602 22 11.068 22 12 22s1.398 0 1.765-.152a2 2 0 0 0 1.083-1.083c.092-.223.129-.483.143-.863c.02-.558.307-1.074.79-1.353a1.62 1.62 0 0 1 1.567-.008c.336.178.579.276.819.308a2 2 0 0 0 1.479-.396c.315-.242.548-.646 1.014-1.453s.7-1.21.751-1.605a2 2 0 0 0-.396-1.479c-.148-.192-.355-.353-.676-.555A1.62 1.62 0 0 1 19.562 12c0-.558.304-1.064.777-1.36c.321-.203.529-.364.676-.556a2 2 0 0 0 .396-1.479c-.052-.394-.285-.798-.75-1.605c-.467-.807-.7-1.21-1.015-1.453a2 2 0 0 0-1.479-.396c-.24.032-.483.13-.82.308a1.62 1.62 0 0 1-1.566-.008a1.62 1.62 0 0 1-.79-1.353c-.014-.38-.05-.64-.143-.863a2 2 0 0 0-1.083-1.083Z\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconCopy(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M6 11c0-2.828 0-4.243.879-5.121C7.757 5 9.172 5 12 5h3c2.828 0 4.243 0 5.121.879C21 6.757 21 8.172 21 11v5c0 2.828 0 4.243-.879 5.121C19.243 22 17.828 22 15 22h-3c-2.828 0-4.243 0-5.121-.879C6 20.243 6 18.828 6 16z\" />\n <path d=\"M6 19a3 3 0 0 1-3-3v-6c0-3.771 0-5.657 1.172-6.828S7.229 2 11 2h4a3 3 0 0 1 3 3\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconRestart(props) {\n return (\n <Svg {...props}>\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.5\" d=\"m18.364 8.05l-.707-.707a8 8 0 1 0 2.28 4.658m-1.573-3.95h-4.243m4.243 0V3.807\" />\n </Svg>\n );\n}\n\nexport function IconClose(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"m14.5 9.5l-5 5m0-5l5 5\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconAward(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M11.146 7.023C11.526 6.34 11.716 6 12 6s.474.34.854 1.023l.098.176c.108.194.162.29.246.354c.085.064.19.088.4.135l.19.044c.738.167 1.107.25 1.195.532s-.164.577-.667 1.165l-.13.152c-.143.167-.215.25-.247.354s-.021.215 0 .438l.02.203c.076.785.114 1.178-.115 1.352c-.23.174-.576.015-1.267-.303l-.178-.082c-.197-.09-.295-.135-.399-.135s-.202.045-.399.135l-.178.082c-.691.319-1.037.477-1.267.303s-.191-.567-.115-1.352l.02-.203c.021-.223.032-.334 0-.438s-.104-.187-.247-.354l-.13-.152c-.503-.588-.755-.882-.667-1.165c.088-.282.457-.365 1.195-.532l.19-.044c.21-.047.315-.07.4-.135c.084-.064.138-.16.246-.354z\" />\n <path d=\"M19 9A7 7 0 1 1 5 9a7 7 0 0 1 14 0Z\" />\n <path d=\"m12 16.068l-3.771 3.905c-.54.56-.81.839-1.04.935c-.52.22-1.099.032-1.373-.448c-.12-.21-.158-.59-.232-1.35c-.043-.43-.064-.644-.128-.824a1.43 1.43 0 0 0-.835-.864c-.173-.067-.38-.088-.795-.132c-.734-.078-1.101-.117-1.305-.241c-.463-.284-.646-.883-.433-1.422c.094-.237.364-.517.904-1.076L5.456 12M12 16.068l3.771 3.905c.54.56.81.839 1.04.935c.52.22 1.099.032 1.373-.448c.12-.21.157-.59.232-1.35c.043-.43.064-.644.128-.824c.144-.402.446-.715.835-.864c.173-.067.38-.088.795-.132c.734-.078 1.101-.117 1.305-.241c.463-.284.646-.883.433-1.422c-.094-.237-.364-.517-.904-1.076L18.544 12\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconList(props) {\n return (\n <Svg {...props}>\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\" d=\"M20 7H4m11 5H4m5 5H4\" />\n </Svg>\n );\n}\n\nexport function IconShirt(props) {\n return (\n <Svg {...props}>\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\" d=\"M5.777 10.296v7.969c0 1.323 0 1.985.449 2.547c.448.562.985.66 2.058.858c.992.182 2.249.33 3.716.33s2.724-.148 3.716-.33c1.073-.198 1.61-.296 2.059-.858c.448-.562.448-1.224.448-2.547v-7.97c0-.683 0-1.025.132-1.326c.131-.3.378-.523.871-.968l.186-.167c1.056-.952 1.584-1.429 1.588-2.118c.004-.69-.465-1.122-1.401-1.988a8 8 0 0 0-.418-.362c-.472-.378-1.138-.792-1.648-1.09a2.05 2.05 0 0 0-1.567-.205l-.49.129a1.6 1.6 0 0 0-.949.703c-1.202 1.897-3.852 1.897-5.054 0a1.6 1.6 0 0 0-.948-.703l-.49-.129a2.05 2.05 0 0 0-1.568.205c-.51.298-1.176.712-1.648 1.09a8 8 0 0 0-.418.362C3.464 4.594 2.996 5.027 3 5.716s.532 1.166 1.588 2.118l.186.167c.493.445.74.668.871.968c.132.3.132.643.132 1.327Z\" />\n </Svg>\n );\n}\n\nexport function IconLogin(props) {\n return (\n <Svg {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"1.5\">\n <path d=\"M12 20a8 8 0 1 0 0-16\" />\n <path strokeLinejoin=\"round\" d=\"M4 12h10m0 0l-3-3m3 3l-3 3\" />\n </g>\n </Svg>\n );\n}\n\nexport function IconGoogle(props) {\n return (\n <Svg {...props}>\n <path fill=\"currentColor\" d=\"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z\" />\n </Svg>\n );\n}\n\nexport function IconDiscord(props) {\n return (\n <Svg {...props}>\n <path fill=\"currentColor\" d=\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\" />\n </Svg>\n );\n}\n\nexport function BrandIcon({ id }) {\n if (id === \"google\") return <IconGoogle />;\n if (id === \"discord\") return <IconDiscord />;\n return <IconLogin />;\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\r\n\r\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\r\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n /** Visual role in the action hierarchy. */\r\n variant?: ButtonVariant;\r\n /** Control height/density. `md` is the default and adds no modifier. */\r\n size?: ButtonSize;\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * The primary action control. `variant` selects the visual role and `size`\r\n * the density; extra `className` values are appended for composition.\r\n */\r\nexport function Button({\r\n variant = \"primary\",\r\n size = \"md\",\r\n type = \"button\",\r\n className = \"\",\r\n children,\r\n ...props\r\n}: ButtonProps) {\r\n const classes = [\r\n `${variant}-button`,\r\n size !== \"md\" ? `button--${size}` : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <button type={type} className={classes} {...props}>\r\n {children}\r\n </button>\r\n );\r\n}\r\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\r\n\r\nexport type IconButtonSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n /** The icon element to render. */\r\n icon?: ReactNode;\r\n /** Control size. `md` is the default and adds no modifier. */\r\n size?: IconButtonSize;\r\n}\r\n\r\n/**\r\n * A square, icon-only button. Provide an accessible name via `aria-label`.\r\n */\r\nexport function IconButton({ icon, size = \"md\", className = \"\", type = \"button\", ...props }: IconButtonProps) {\r\n const sizeClass = size === \"sm\" ? \"icon-btn--sm\" : size === \"lg\" ? \"icon-btn--lg\" : \"\";\r\n const classes = [\"icon-btn\", sizeClass, className].filter(Boolean).join(\" \");\r\n return (\r\n <button type={type} className={classes} {...props}>\r\n {icon}\r\n </button>\r\n );\r\n}\r\n","import type { HTMLAttributes, ReactNode } from \"react\";\r\n\r\nexport type PillTone = \"default\" | \"success\" | \"warning\" | \"danger\";\r\n\r\nexport interface PillProps extends HTMLAttributes<HTMLSpanElement> {\r\n /** Semantic tone. `default` is neutral and adds no modifier. */\r\n tone?: PillTone;\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * A small status/label chip. Use `tone` to signal state; keep the label short.\r\n */\r\nexport function Pill({ tone = \"default\", children, className = \"\", ...props }: PillProps) {\r\n const classes = [\"pill\", tone !== \"default\" ? tone : \"\", className].filter(Boolean).join(\" \");\r\n return (\r\n <span className={classes} {...props}>\r\n {children}\r\n </span>\r\n );\r\n}\r\n","import type { ReactNode } from \"react\";\r\nimport { IconClose } from \"./icons\";\r\n\r\nexport type StatusBannerTone = \"success\" | \"warning\" | \"error\";\r\n\r\nexport interface StatusBannerProps {\r\n /** Banner copy. When empty/falsy the banner renders nothing. */\r\n message?: ReactNode;\r\n /** Semantic tone. `success` uses the default styling (no modifier). */\r\n tone?: StatusBannerTone;\r\n /** When provided, renders a dismiss button that calls this handler. */\r\n onDismiss?: () => void;\r\n}\r\n\r\n/**\r\n * An inline, persistent status message for a surface or form. Use for state\r\n * that should stay visible (vs. a transient Toast).\r\n */\r\nexport function StatusBanner({ message, tone, onDismiss }: StatusBannerProps) {\r\n if (!message) return null;\r\n const toneClass = tone === \"error\" ? \"error\" : tone === \"warning\" ? \"warning\" : \"\";\r\n return (\r\n <div className={[\"status-banner\", toneClass].filter(Boolean).join(\" \")}>\r\n <span>{message}</span>\r\n {onDismiss ? (\r\n <button type=\"button\" className=\"banner-dismiss\" aria-label=\"Dismiss\" onClick={onDismiss}>\r\n <IconClose />\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type { KeyboardEvent } from \"react\";\r\nimport { IconArrowDown, IconCheck } from \"./icons\";\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface SelectProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n options?: SelectOption[];\r\n placeholder?: string;\r\n variant?: \"form\" | \"control\";\r\n disabled?: boolean;\r\n \"aria-label\"?: string;\r\n id?: string;\r\n}\r\n\r\nfunction firstEnabled(options: SelectOption[]): number {\r\n return options.findIndex((o) => !o.disabled);\r\n}\r\nfunction lastEnabled(options: SelectOption[]): number {\r\n for (let i = options.length - 1; i >= 0; i--) if (!options[i]!.disabled) return i;\r\n return -1;\r\n}\r\nfunction nextEnabled(options: SelectOption[], from: number, dir: 1 | -1): number {\r\n const n = options.length;\r\n if (n === 0) return -1;\r\n let i = from;\r\n for (let step = 0; step < n; step++) {\r\n i = (i + dir + n) % n;\r\n if (!options[i]!.disabled) return i;\r\n }\r\n return from;\r\n}\r\n\r\n/**\r\n * A custom listbox select. Fully keyboard operable: the trigger opens on\r\n * Arrow/Enter/Space; the open list supports Up/Down, Home/End, type-ahead,\r\n * Enter/Space to choose, and Escape to close (returning focus to the trigger).\r\n */\r\nexport function Select({\r\n value,\r\n onChange,\r\n options = [],\r\n placeholder = \"\",\r\n variant = \"form\",\r\n disabled = false,\r\n \"aria-label\": ariaLabel,\r\n id,\r\n}: SelectProps) {\r\n const [open, setOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState(-1);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\r\n const typeahead = useRef<{ buffer: string; timer: number | undefined }>({ buffer: \"\", timer: undefined });\r\n\r\n const selectedIndex = options.findIndex((o) => o.value === value);\r\n const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\r\n const displayLabel = selectedOption?.label ?? placeholder;\r\n const isPlaceholder = !selectedOption;\r\n\r\n // Close when clicking outside.\r\n useEffect(() => {\r\n if (!open) return;\r\n function handleOutside(event: PointerEvent) {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) setOpen(false);\r\n }\r\n document.addEventListener(\"pointerdown\", handleOutside);\r\n return () => document.removeEventListener(\"pointerdown\", handleOutside);\r\n }, [open]);\r\n\r\n // On open, start the active option at the current selection (or first enabled).\r\n useEffect(() => {\r\n if (!open) return;\r\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled(options));\r\n // Intentionally only re-run when `open` toggles.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [open]);\r\n\r\n // Keep DOM focus on the active option while open.\r\n useEffect(() => {\r\n if (!open || activeIndex < 0) return;\r\n optionRefs.current[activeIndex]?.focus();\r\n }, [open, activeIndex]);\r\n\r\n function closeList(returnFocus = true) {\r\n setOpen(false);\r\n setActiveIndex(-1);\r\n if (returnFocus) triggerRef.current?.focus();\r\n }\r\n\r\n function commit(index: number) {\r\n const option = options[index];\r\n if (!option || option.disabled) return;\r\n onChange?.(option.value);\r\n closeList();\r\n }\r\n\r\n function runTypeahead(char: string) {\r\n const state = typeahead.current;\r\n state.buffer += char.toLowerCase();\r\n if (state.timer) window.clearTimeout(state.timer);\r\n state.timer = window.setTimeout(() => {\r\n state.buffer = \"\";\r\n }, 500);\r\n const match = options.findIndex((o) => !o.disabled && o.label.toLowerCase().startsWith(state.buffer));\r\n if (match >= 0) setActiveIndex(match);\r\n }\r\n\r\n function onTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\r\n if (disabled) return;\r\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\" || event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n if (!open) setOpen(true);\r\n } else if (event.key === \"Escape\" && open) {\r\n event.preventDefault();\r\n closeList();\r\n }\r\n }\r\n\r\n function onListKeyDown(event: KeyboardEvent<HTMLDivElement>) {\r\n switch (event.key) {\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n setActiveIndex((i) => nextEnabled(options, i < 0 ? -1 : i, 1));\r\n break;\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n setActiveIndex((i) => nextEnabled(options, i < 0 ? 0 : i, -1));\r\n break;\r\n case \"Home\":\r\n event.preventDefault();\r\n setActiveIndex(firstEnabled(options));\r\n break;\r\n case \"End\":\r\n event.preventDefault();\r\n setActiveIndex(lastEnabled(options));\r\n break;\r\n case \"Enter\":\r\n case \" \":\r\n event.preventDefault();\r\n if (activeIndex >= 0) commit(activeIndex);\r\n break;\r\n case \"Escape\":\r\n event.preventDefault();\r\n closeList();\r\n break;\r\n case \"Tab\":\r\n closeList(false);\r\n break;\r\n default:\r\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey) {\r\n runTypeahead(event.key);\r\n }\r\n }\r\n }\r\n\r\n const containerClass = [\"cselect\", variant === \"control\" ? \"cselect--control\" : \"\", open ? \"open\" : \"\"]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClass} ref={containerRef}>\r\n <button\r\n type=\"button\"\r\n ref={triggerRef}\r\n className=\"cselect-trigger\"\r\n disabled={disabled}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open ? \"true\" : \"false\"}\r\n aria-label={ariaLabel}\r\n id={id}\r\n onClick={() => setOpen((v) => !v)}\r\n onKeyDown={onTriggerKeyDown}\r\n >\r\n <span className={[\"cselect-value\", isPlaceholder ? \"placeholder\" : \"\"].filter(Boolean).join(\" \")}>\r\n {displayLabel}\r\n </span>\r\n <IconArrowDown className=\"cselect-chevron\" />\r\n </button>\r\n {open && (\r\n <div className=\"cselect-dropdown\" role=\"listbox\" onKeyDown={onListKeyDown}>\r\n {options.map((option, index) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n ref={(el) => {\r\n optionRefs.current[index] = el;\r\n }}\r\n tabIndex={activeIndex === index ? 0 : -1}\r\n className={[\r\n \"cselect-option\",\r\n option.value === value ? \"selected\" : \"\",\r\n option.disabled ? \"cselect-option--disabled\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n role=\"option\"\r\n aria-selected={option.value === value ? \"true\" : \"false\"}\r\n disabled={option.disabled}\r\n onClick={() => commit(index)}\r\n >\r\n <span>{option.label}</span>\r\n {option.value === value && <IconCheck className=\"check-icon\" />}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type { KeyboardEvent, ReactNode } from \"react\";\r\n\r\nconst FOCUSABLE_SELECTOR = [\r\n \"a[href]\",\r\n \"button:not([disabled])\",\r\n \"textarea:not([disabled])\",\r\n \"input:not([disabled])\",\r\n \"select:not([disabled])\",\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n].join(\",\");\r\n\r\nfunction getFocusables(container: HTMLElement | null): HTMLElement[] {\r\n if (!container) return [];\r\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\r\n (el) => el.offsetWidth > 0 || el.offsetHeight > 0,\r\n );\r\n}\r\n\r\nexport interface PopoverMenuTriggerProps {\r\n open: boolean;\r\n onToggle: () => void;\r\n}\r\n\r\nexport interface PopoverMenuProps {\r\n /** Render prop for the trigger; receives the open state and a toggle handler. */\r\n trigger: (props: PopoverMenuTriggerProps) => ReactNode;\r\n children?: ReactNode;\r\n menuClassName?: string;\r\n popoverClassName?: string;\r\n menuRole?: string;\r\n menuLabel?: string;\r\n}\r\n\r\n/**\r\n * A trigger + popover surface. Fully keyboard operable: ArrowDown opens and\r\n * focuses the first item; Up/Down and Home/End move between items; Escape\r\n * closes and returns focus to the trigger; Tab closes.\r\n */\r\nexport function PopoverMenu({\r\n trigger,\r\n children,\r\n menuClassName = \"ink-popover-menu\",\n popoverClassName = \"ink-popover-surface\",\n menuRole = \"menu\",\r\n menuLabel = \"Menu\",\r\n}: PopoverMenuProps) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n const triggerFocusRef = useRef<HTMLElement | null>(null);\r\n const onToggle = () => setOpen((v) => !v);\r\n\r\n // Close when clicking outside.\r\n useEffect(() => {\r\n if (!open) return;\r\n function handleOutside(event: PointerEvent) {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) setOpen(false);\r\n }\r\n document.addEventListener(\"pointerdown\", handleOutside);\r\n return () => document.removeEventListener(\"pointerdown\", handleOutside);\r\n }, [open]);\r\n\r\n // On open, remember the trigger and move focus to the first menu item.\r\n useEffect(() => {\r\n if (!open) return;\r\n triggerFocusRef.current = document.activeElement as HTMLElement | null;\r\n getFocusables(popoverRef.current)[0]?.focus();\r\n }, [open]);\r\n\r\n function moveFocus(dir: 1 | -1) {\r\n const items = getFocusables(popoverRef.current);\r\n if (items.length === 0) return;\r\n const index = items.indexOf(document.activeElement as HTMLElement);\r\n const next = (index + dir + items.length) % items.length;\r\n items[next]!.focus();\r\n }\r\n\r\n function focusEdge(edge: \"first\" | \"last\") {\r\n const items = getFocusables(popoverRef.current);\r\n if (items.length === 0) return;\r\n (edge === \"first\" ? items[0]! : items[items.length - 1]!).focus();\r\n }\r\n\r\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\r\n switch (event.key) {\r\n case \"Escape\":\r\n if (open) {\r\n event.preventDefault();\r\n setOpen(false);\r\n triggerFocusRef.current?.focus();\r\n }\r\n break;\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n if (!open) setOpen(true);\r\n else moveFocus(1);\r\n break;\r\n case \"ArrowUp\":\r\n if (open) {\r\n event.preventDefault();\r\n moveFocus(-1);\r\n }\r\n break;\r\n case \"Home\":\r\n if (open) {\r\n event.preventDefault();\r\n focusEdge(\"first\");\r\n }\r\n break;\r\n case \"End\":\r\n if (open) {\r\n event.preventDefault();\r\n focusEdge(\"last\");\r\n }\r\n break;\r\n case \"Tab\":\r\n if (open) setOpen(false);\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={[menuClassName, open ? \"open\" : \"\"].filter(Boolean).join(\" \")}\r\n onKeyDown={onKeyDown}\r\n >\r\n {trigger({ open, onToggle })}\r\n <div ref={popoverRef} className={popoverClassName} role={menuRole} aria-label={menuLabel}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { IconClose } from \"./icons.jsx\";\r\n\r\n// Typed components extracted into their own modules; re-exported here so\r\n// existing imports from \"./ui.jsx\" keep resolving. ModalFrame is intentionally\r\n// NOT re-exported — it imports SectionHeading from this file, so re-exporting it\r\n// here would create an import cycle. Import ModalFrame from \"./modalFrame\".\r\nexport { Button } from \"./button\";\r\nexport { IconButton } from \"./iconButton\";\r\nexport { Pill } from \"./pill\";\r\nexport { StatusBanner } from \"./statusBanner\";\r\nexport { Select } from \"./select\";\r\nexport { PopoverMenu } from \"./popoverMenu\";\r\n\r\nexport function Panel({ children, className = \"panel\", ...props }) {\r\n return (\r\n <section className={className} {...props}>\r\n {children}\r\n </section>\r\n );\r\n}\r\n\r\n/**\r\n * @param {Object} props\r\n * @param {import(\"react\").ReactNode} [props.eyebrow]\r\n * @param {import(\"react\").ReactNode} [props.title]\r\n * @param {string} [props.titleId] id applied to the title heading (for `aria-labelledby`).\r\n * @param {import(\"react\").ReactNode} [props.copy]\r\n * @param {boolean} [props.compact]\r\n * @param {import(\"react\").ReactNode} [props.children]\r\n * @param {string} [props.className]\r\n */\r\nexport function SectionHeading({ eyebrow, title, titleId, copy, compact = false, children, className = \"\" }) {\r\n const classes = [\"section-heading\", compact ? \"compact\" : \"\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <div className={classes}>\r\n <div>\r\n {eyebrow ? <p className=\"eyebrow\">{eyebrow}</p> : null}\r\n {title ? <h2 id={titleId}>{title}</h2> : null}\r\n </div>\r\n {copy ? <div className=\"section-heading-copy subtle\">{copy}</div> : null}\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport function EmptyState({ children, className = \"empty-state\", ...props }) {\r\n return (\r\n <div className={className} {...props}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport function Toast({ id, message, tone, onDismiss }) {\r\n return (\r\n <article className={[\"toast\", tone].filter(Boolean).join(\" \")}>\r\n <div><strong>{message}</strong></div>\r\n <button type=\"button\" aria-label=\"Dismiss\" onClick={onDismiss}><IconClose /></button>\r\n </article>\r\n );\r\n}\r\n\r\nexport function ToastRegion({ toasts = [], onDismiss }) {\r\n return (\r\n <div id=\"toastRegion\" className=\"toast-region\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {toasts.map((toast) => (\r\n <Toast key={toast.id} {...toast} onDismiss={() => onDismiss?.(toast.id)} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n","import { useEffect, useRef } from \"react\";\r\nimport type { KeyboardEvent, ReactNode } from \"react\";\r\nimport { Button } from \"./button\";\r\nimport { IconClose } from \"./icons\";\r\nimport { SectionHeading } from \"./ui\";\r\n\r\nexport type ModalSize = \"default\" | \"compact\" | \"picker\" | \"settings\";\r\n\r\nconst MODAL_SIZE_CLASSES: Record<ModalSize, string> = {\r\n default: \"modal-card panel modal-panel modal-panel--wide\",\r\n compact: \"modal-card panel modal-panel modal-panel--compact\",\r\n picker: \"modal-card panel modal-panel modal-panel--compact\",\r\n settings: \"modal-card panel modal-panel--settings\",\r\n};\r\n\r\nconst FOCUSABLE_SELECTOR = [\r\n \"a[href]\",\r\n \"button:not([disabled])\",\r\n \"textarea:not([disabled])\",\r\n \"input:not([disabled])\",\r\n \"select:not([disabled])\",\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n].join(\",\");\r\n\r\nexport interface ModalFrameProps {\r\n id?: string;\r\n /** id of the element that labels the dialog (`aria-labelledby`). */\r\n titleId?: string;\r\n /** Heading rendered at the top of the modal card. */\r\n title?: ReactNode;\r\n /** Called when the backdrop, close button, or Escape is activated. */\r\n onClose?: () => void;\r\n children?: ReactNode;\r\n /** Preset card sizing. */\r\n size?: ModalSize;\r\n /** Overrides the size preset's card class entirely. */\r\n cardClassName?: string;\r\n /** id of the element that describes the dialog (`aria-describedby`). */\r\n describedBy?: string;\r\n /** Whether the modal is visible. */\r\n open?: boolean;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A dialog surface with a titled header and close control. When `open` it:\r\n * moves focus into the dialog, traps Tab within it, closes on Escape, locks\r\n * background scroll, and restores focus to the previously focused element on\r\n * close.\r\n *\r\n * Note: intentionally rendered in place (not portalled). `.modal` is\r\n * `position: fixed`, and portalling to `document.body` would break Storybook's\r\n * canvas rendering, which relies on the story container to scope fixed\r\n * positioning. Consumers who need portal behavior can wrap it themselves.\r\n */\r\nexport function ModalFrame({\r\n id,\r\n titleId,\r\n title,\r\n onClose,\r\n children,\r\n size = \"default\",\r\n cardClassName,\r\n describedBy,\r\n open = false,\r\n className = \"\",\r\n}: ModalFrameProps) {\r\n const cardRef = useRef<HTMLDivElement>(null);\r\n const resolvedCardClass = cardClassName ?? MODAL_SIZE_CLASSES[size] ?? MODAL_SIZE_CLASSES.default;\r\n const classes = [\"modal\", open ? \"\" : \"hidden\", className].filter(Boolean).join(\" \");\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const card = cardRef.current;\r\n const previouslyFocused = document.activeElement as HTMLElement | null;\r\n\r\n // Move focus into the dialog (first focusable, else the card itself).\r\n const focusables = card ? Array.from(card.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)) : [];\r\n (focusables[0] ?? card)?.focus();\r\n\r\n // Lock background scroll while open.\r\n const body = document.body;\r\n const previousOverflow = body.style.overflow;\r\n body.style.overflow = \"hidden\";\r\n\r\n return () => {\r\n body.style.overflow = previousOverflow;\r\n previouslyFocused?.focus?.();\r\n };\r\n }, [open]);\r\n\r\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\r\n if (!open) return;\r\n if (event.key === \"Escape\") {\r\n event.stopPropagation();\r\n onClose?.();\r\n return;\r\n }\r\n if (event.key !== \"Tab\") return;\r\n\r\n const card = cardRef.current;\r\n if (!card) return;\r\n const items = Array.from(card.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\r\n (el) => el.offsetWidth > 0 || el.offsetHeight > 0 || el === document.activeElement,\r\n );\r\n if (items.length === 0) {\r\n event.preventDefault();\r\n card.focus();\r\n return;\r\n }\r\n const first = items[0]!;\r\n const last = items[items.length - 1]!;\r\n const active = document.activeElement;\r\n if (event.shiftKey) {\r\n if (active === first || !card.contains(active)) {\r\n event.preventDefault();\r\n last.focus();\r\n }\r\n } else if (active === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n id={id}\r\n className={classes}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={titleId}\r\n aria-describedby={describedBy}\r\n aria-hidden={open ? \"false\" : \"true\"}\r\n onKeyDown={handleKeyDown}\r\n >\r\n <div className=\"modal-backdrop\" onClick={onClose}></div>\r\n <div className={resolvedCardClass} ref={cardRef} tabIndex={-1}>\r\n <SectionHeading title={title} titleId={titleId}>\r\n <Button variant=\"ghost\" className=\"modal-close-button\" aria-label=\"Close\" onClick={onClose}>\r\n <IconClose />\r\n </Button>\r\n </SectionHeading>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useRef } from \"react\";\nimport { IconArrowDown } from \"./icons.jsx\";\n\nexport function SplitButton({ primaryLabel, onPrimaryClick, items = [] }) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (!open) return;\n function handleOutside(e) {\n if (containerRef.current && !containerRef.current.contains(e.target)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"pointerdown\", handleOutside);\n return () => document.removeEventListener(\"pointerdown\", handleOutside);\n }, [open]);\n\n function handleItemClick(onClick) {\n setOpen(false);\n onClick?.();\n }\n\n return (\n <div className=\"split-button\" ref={containerRef}>\n <button type=\"button\" className=\"split-button-primary\" onClick={onPrimaryClick}>\n {primaryLabel}\n </button>\n <div className=\"split-button-divider\" />\n <button\n type=\"button\"\n className=\"split-button-chevron\"\n onClick={() => setOpen((v) => !v)}\n aria-label=\"More round types\"\n aria-haspopup=\"menu\"\n aria-expanded={open ? \"true\" : \"false\"}\n >\n <IconArrowDown style={open ? { transform: \"rotate(180deg)\" } : undefined} />\n </button>\n {open && (\n <div className=\"split-dropdown\" role=\"menu\">\n {items.map((item) => (\n <button\n key={item.label}\n type=\"button\"\n className=\"split-dropdown-item\"\n role=\"menuitem\"\n onClick={() => handleItemClick(item.onClick)}\n >\n <span\n className=\"split-dropdown-icon\"\n style={{ background: item.iconBg, color: item.iconColor }}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n <span className=\"split-dropdown-copy\">\n <span className=\"split-dropdown-label\">{item.label}</span>\n <span className=\"split-dropdown-desc\">{item.description}</span>\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { createContext, useContext, useId } from \"react\";\r\nimport type { InputHTMLAttributes, ReactNode, TextareaHTMLAttributes } from \"react\";\r\n\r\n/**\r\n * Form primitives for Inkwell.\r\n *\r\n * Each control wraps a native element — which already carries Inkwell's field\r\n * styling via global CSS — with a typed API. `FormField` is the shared wrapper\r\n * that owns the control's `id` and forwards the accessibility wiring\r\n * (`aria-describedby`, `aria-invalid`, `required`) to whichever control it wraps.\r\n *\r\n * A control placed inside a `FormField` inherits that wiring automatically; the\r\n * same control used standalone still works with explicit props.\r\n */\r\n\r\ninterface FieldContextValue {\r\n /** Control id, shared with the label's `htmlFor`. */\r\n id: string;\r\n /** Space-joined ids of hint/error text, for `aria-describedby`. */\r\n describedBy?: string;\r\n /** Whether the field is in an error state. */\r\n invalid: boolean;\r\n /** Whether the field is required. */\r\n required?: boolean;\r\n}\r\n\r\nconst FieldContext = createContext<FieldContextValue | null>(null);\r\n\r\nexport interface FormFieldProps {\r\n /** Visible label text. */\r\n label?: ReactNode;\r\n /** Helper text shown below the control. */\r\n hint?: ReactNode;\r\n /** Error text; sets the field invalid and replaces the hint. */\r\n error?: ReactNode;\r\n /** Explicit control id. Auto-generated when omitted. */\r\n htmlFor?: string;\r\n /** Marks the field required (visual marker + inherited by the control). */\r\n required?: boolean;\r\n /** Extra class names on the field wrapper. */\r\n className?: string;\r\n /** The control (TextInput, Textarea, Select, …). */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Labelled field wrapper. Owns the control's id and forwards hint/error wiring\r\n * to whichever Inkwell control it wraps.\r\n */\r\nexport function FormField({\r\n label,\r\n hint,\r\n error,\r\n htmlFor,\r\n required = false,\r\n className = \"\",\r\n children,\r\n}: FormFieldProps) {\r\n const generatedId = useId();\r\n const id = htmlFor ?? generatedId;\r\n const hintId = hint ? `${id}-hint` : undefined;\r\n const errorId = error ? `${id}-error` : undefined;\r\n const describedBy = [hintId, errorId].filter(Boolean).join(\" \") || undefined;\r\n const invalid = Boolean(error);\r\n\r\n const classes = [\"field\", invalid ? \"field--invalid\" : \"\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <FieldContext.Provider value={{ id, describedBy, invalid, required }}>\r\n <div className={classes}>\r\n {label ? (\r\n <label className=\"field-label\" htmlFor={id}>\r\n {label}\r\n {required ? <span className=\"field-required\" aria-hidden=\"true\"> *</span> : null}\r\n </label>\r\n ) : null}\r\n {children}\r\n {hint && !error ? (\r\n <p className=\"field-hint\" id={hintId}>{hint}</p>\r\n ) : null}\r\n {error ? (\r\n <p className=\"field-error\" id={errorId} role=\"alert\">{error}</p>\r\n ) : null}\r\n </div>\r\n </FieldContext.Provider>\r\n );\r\n}\r\n\r\nexport interface TextInputProps extends InputHTMLAttributes<HTMLInputElement> {\r\n /** Force the invalid state when used outside a `FormField`. */\r\n invalid?: boolean;\r\n /** Explicit `aria-describedby`. Falls back to the FormField value. */\r\n describedBy?: string;\r\n}\r\n\r\n/**\r\n * Single-line text input. Inherits field wiring when rendered inside a\r\n * `FormField`; all native input props pass through.\r\n */\r\nexport function TextInput({\r\n id,\r\n type = \"text\",\r\n invalid = false,\r\n describedBy,\r\n className = \"\",\r\n ...props\r\n}: TextInputProps) {\r\n const field = useContext(FieldContext);\r\n const resolvedInvalid = invalid || field?.invalid || false;\r\n const classes = [\"input\", resolvedInvalid ? \"input--invalid\" : \"\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <input\r\n id={id ?? field?.id}\r\n type={type}\r\n className={classes}\r\n aria-invalid={resolvedInvalid || undefined}\r\n aria-describedby={describedBy ?? field?.describedBy}\r\n required={field?.required}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n /** Force the invalid state when used outside a `FormField`. */\r\n invalid?: boolean;\r\n /** Explicit `aria-describedby`. Falls back to the FormField value. */\r\n describedBy?: string;\r\n}\r\n\r\n/**\r\n * Multi-line text input. Same field-wiring behaviour as {@link TextInput}.\r\n */\r\nexport function Textarea({\r\n id,\r\n rows = 4,\r\n invalid = false,\r\n describedBy,\r\n className = \"\",\r\n ...props\r\n}: TextareaProps) {\r\n const field = useContext(FieldContext);\r\n const resolvedInvalid = invalid || field?.invalid || false;\r\n const classes = [\"textarea\", resolvedInvalid ? \"input--invalid\" : \"\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <textarea\r\n id={id ?? field?.id}\r\n rows={rows}\r\n className={classes}\r\n aria-invalid={resolvedInvalid || undefined}\r\n aria-describedby={describedBy ?? field?.describedBy}\r\n required={field?.required}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\r\n /** Inline label text. */\r\n label?: ReactNode;\r\n /** Force the invalid state. */\r\n invalid?: boolean;\r\n}\r\n\r\n/**\r\n * Checkbox with an inline label. Unlike {@link TextInput}, the checkbox owns its\r\n * own label rather than pairing with a stacked `FormField` label, so it stays\r\n * self-contained.\r\n */\r\nexport function Checkbox({ id, label, invalid = false, className = \"\", ...props }: CheckboxProps) {\r\n const generatedId = useId();\r\n const resolvedId = id ?? generatedId;\r\n const classes = [\"checkbox\", props.disabled ? \"checkbox--disabled\" : \"\", className].filter(Boolean).join(\" \");\r\n\r\n return (\r\n <label className={classes} htmlFor={resolvedId}>\r\n <input\r\n id={resolvedId}\r\n type=\"checkbox\"\r\n className=\"checkbox-input\"\r\n aria-invalid={invalid || undefined}\r\n {...props}\r\n />\r\n {label ? <span className=\"checkbox-label\">{label}</span> : null}\r\n </label>\r\n );\r\n}\r\n","import type { HTMLAttributes, ReactNode } from \"react\";\r\n\r\nexport type CardVariant = \"plain\" | \"outlined\";\r\nexport type CardTone = \"default\" | \"danger\";\r\n\r\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Surface treatment. `plain` (default) is borderless on the raised surface —\r\n * the app's common look. `outlined` adds a subtle border on the default\r\n * surface for the rare case that needs a hard edge.\r\n */\r\n variant?: CardVariant;\r\n /** `danger` flags a destructive zone with a danger-soft border. */\r\n tone?: CardTone;\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * A padded content surface. Borderless and raised by default (a content-unit\r\n * sibling to the section-level `Panel`). Compose it with `SectionHeading` for a\r\n * header and `CardActions` for a footer row.\r\n */\r\nexport function Card({ variant = \"plain\", tone = \"default\", className = \"\", children, ...props }: CardProps) {\r\n const classes = [\r\n \"card\",\r\n variant === \"outlined\" ? \"card--outlined\" : \"\",\r\n tone === \"danger\" ? \"card--danger\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n return (\r\n <div className={classes} {...props}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface CardActionsProps extends HTMLAttributes<HTMLDivElement> {\r\n children?: ReactNode;\r\n}\r\n\r\n/** A footer row of actions inside a `Card` — a wrapping, gap-spaced flex row. */\r\nexport function CardActions({ className = \"\", children, ...props }: CardActionsProps) {\r\n return (\r\n <div className={[\"card-actions\", className].filter(Boolean).join(\" \")} {...props}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import type { HTMLAttributes, ReactNode } from \"react\";\r\n\r\nexport type BadgeTone = \"brand\" | \"neutral\" | \"danger\";\r\n\r\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\r\n /** Color tone. Defaults to `brand` (the notification color). */\r\n tone?: BadgeTone;\r\n /**\r\n * Render a bare dot with no content — a presence indicator (generalizes the\r\n * app's nav notification dot). Provide an `aria-label` if it's meaningful, or\r\n * `aria-hidden` if it's purely decorative.\r\n */\r\n dot?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * A compact count / notification indicator. Show a small count or short label,\r\n * or set `dot` for a bare indicator. For inline status labels use `Pill`\r\n * instead.\r\n */\r\nexport function Badge({ tone = \"brand\", dot = false, className = \"\", children, ...props }: BadgeProps) {\r\n const classes = [\r\n \"badge\",\r\n dot ? \"badge--dot\" : \"\",\r\n tone !== \"brand\" ? `badge--${tone}` : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n return (\r\n <span className={classes} {...props}>\r\n {dot ? null : children}\r\n </span>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type { KeyboardEvent, ReactNode } from \"react\";\r\n\r\nexport interface TabItem {\r\n value: string;\r\n label: ReactNode;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface TabsProps {\r\n /** The tabs to render, in order. */\r\n tabs: TabItem[];\r\n /** The selected tab's value (controlled). */\r\n value: string;\r\n /** Called with the new value when the selection changes. */\r\n onChange: (value: string) => void;\r\n /** Accessible name for the tablist. */\r\n \"aria-label\"?: string;\r\n /**\r\n * Base id. When set, each tab gets `${id}-tab-${value}` and references its\r\n * panel via `aria-controls=\"${id}-panel-${value}\"` — give the matching panel\r\n * that id, `role=\"tabpanel\"`, and `aria-labelledby` the tab id.\r\n */\r\n id?: string;\r\n}\r\n\r\nfunction firstEnabled(tabs: TabItem[]): number {\r\n return tabs.findIndex((t) => !t.disabled);\r\n}\r\nfunction lastEnabled(tabs: TabItem[]): number {\r\n for (let i = tabs.length - 1; i >= 0; i--) if (!tabs[i]!.disabled) return i;\r\n return -1;\r\n}\r\nfunction nextEnabled(tabs: TabItem[], from: number, dir: 1 | -1): number {\r\n const n = tabs.length;\r\n if (n === 0) return -1;\r\n let i = from;\r\n for (let step = 0; step < n; step++) {\r\n i = (i + dir + n) % n;\r\n if (!tabs[i]!.disabled) return i;\r\n }\r\n return from;\r\n}\r\n\r\n/**\r\n * A segmented tab bar with a sliding underline indicator. Controlled: it renders\r\n * the tablist and reports selection via `onChange`; render the matching panel\r\n * yourself. Fully keyboard operable (Left/Right/Up/Down move and activate,\r\n * Home/End jump to the ends, disabled tabs are skipped).\r\n */\r\nexport function Tabs({ tabs, value, onChange, \"aria-label\": ariaLabel, id }: TabsProps) {\r\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([]);\r\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\r\n\r\n const activeIndex = tabs.findIndex((t) => t.value === value);\r\n\r\n useEffect(() => {\r\n const btn = tabRefs.current[activeIndex];\r\n if (btn) setIndicator({ left: btn.offsetLeft, width: btn.offsetWidth });\r\n }, [activeIndex, tabs]);\r\n\r\n function selectAt(index: number) {\r\n const tab = tabs[index];\r\n if (!tab || tab.disabled) return;\r\n onChange(tab.value);\r\n tabRefs.current[index]?.focus();\r\n }\r\n\r\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\r\n switch (event.key) {\r\n case \"ArrowRight\":\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n selectAt(nextEnabled(tabs, activeIndex < 0 ? -1 : activeIndex, 1));\r\n break;\r\n case \"ArrowLeft\":\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n selectAt(nextEnabled(tabs, activeIndex < 0 ? 0 : activeIndex, -1));\r\n break;\r\n case \"Home\":\r\n event.preventDefault();\r\n selectAt(firstEnabled(tabs));\r\n break;\r\n case \"End\":\r\n event.preventDefault();\r\n selectAt(lastEnabled(tabs));\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"ink-tabs\" role=\"tablist\" aria-label={ariaLabel} onKeyDown={onKeyDown}>\r\n {tabs.map((tab, index) => {\r\n const selected = tab.value === value;\r\n return (\r\n <button\r\n key={tab.value}\r\n ref={(el) => {\r\n tabRefs.current[index] = el;\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n id={id ? `${id}-tab-${tab.value}` : undefined}\r\n aria-selected={selected ? \"true\" : \"false\"}\r\n aria-controls={id ? `${id}-panel-${tab.value}` : undefined}\r\n tabIndex={selected ? 0 : -1}\r\n disabled={tab.disabled}\r\n className={[\"ink-tab\", selected ? \"ink-tab--active\" : \"\"].filter(Boolean).join(\" \")}\r\n onClick={() => onChange(tab.value)}\r\n >\r\n {tab.label}\r\n </button>\r\n );\r\n })}\r\n <span\r\n className=\"ink-tab-indicator\"\r\n aria-hidden=\"true\"\r\n style={{ transform: `translateX(${indicator.left}px)`, width: `${indicator.width}px` }}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useId, useState } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { IconArrowDown } from \"./icons\";\r\n\r\nexport interface CollapsibleProps {\r\n /** The trigger's main label. */\r\n title: ReactNode;\r\n /** Optional secondary line under the title. */\r\n description?: ReactNode;\r\n /** Optional trailing meta (e.g. a count), before the chevron. */\r\n meta?: ReactNode;\r\n /** Uncontrolled initial open state. Ignored when `open` is provided. */\r\n defaultOpen?: boolean;\r\n /** Controlled open state. */\r\n open?: boolean;\r\n /** Called with the next open state when the trigger is activated. */\r\n onOpenChange?: (open: boolean) => void;\r\n /** Adds a hairline divider under the row — matches the app's stacked submission rows. */\r\n divided?: boolean;\r\n /** The revealed content. */\r\n children?: ReactNode;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A disclosure: the whole header is the toggle button, with a chevron that\r\n * rotates when open. The chevron sits in a contained box that carries the\r\n * hover/focus fill, so the affordance reads as a control even though the full\r\n * row is clickable. Works controlled (`open` + `onOpenChange`) or uncontrolled\r\n * (`defaultOpen`). The content stays mounted and is hidden via the `hidden`\r\n * attribute so `aria-controls` always resolves.\r\n */\r\nexport function Collapsible({\r\n title,\r\n description,\r\n meta,\r\n defaultOpen = false,\r\n open,\r\n onOpenChange,\r\n divided = false,\r\n children,\r\n id,\r\n className = \"\",\r\n}: CollapsibleProps) {\r\n const generatedId = useId();\r\n const baseId = id ?? generatedId;\r\n const triggerId = `${baseId}-trigger`;\r\n const contentId = `${baseId}-content`;\r\n\r\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\r\n const isControlled = open !== undefined;\r\n const isOpen = isControlled ? open : internalOpen;\r\n\r\n function toggle() {\r\n const next = !isOpen;\r\n if (!isControlled) setInternalOpen(next);\r\n onOpenChange?.(next);\r\n }\r\n\r\n return (\r\n <div className={[\"collapsible\", divided ? \"collapsible--divided\" : \"\", className].filter(Boolean).join(\" \")}>\r\n <button\r\n type=\"button\"\r\n id={triggerId}\r\n className=\"collapsible-trigger\"\r\n aria-expanded={isOpen ? \"true\" : \"false\"}\r\n aria-controls={contentId}\r\n onClick={toggle}\r\n >\r\n <span className=\"collapsible-main\">\r\n <strong>{title}</strong>\r\n {description ? <span className=\"subtle\">{description}</span> : null}\r\n </span>\r\n {meta ? <span className=\"collapsible-meta\">{meta}</span> : null}\r\n <span className=\"collapsible-chevron-box\" aria-hidden=\"true\">\r\n <IconArrowDown\r\n className={[\"collapsible-chevron\", isOpen ? \"collapsible-chevron--open\" : \"\"].filter(Boolean).join(\" \")}\r\n />\r\n </span>\r\n </button>\r\n <div id={contentId} className=\"collapsible-content\" role=\"region\" aria-labelledby={triggerId} hidden={!isOpen}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { cloneElement, isValidElement, useId, useState } from \"react\";\r\nimport type { KeyboardEvent, ReactElement, ReactNode } from \"react\";\r\n\r\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\nexport interface TooltipProps {\r\n /** The tooltip body, revealed on hover/focus. */\r\n content: ReactNode;\r\n /** Which side of the trigger the popover appears on. Defaults to \"top\". */\r\n placement?: TooltipPlacement;\r\n /**\r\n * The trigger. Defaults to a small round \"i\" info button. Pass a custom\r\n * element (it should be focusable so keyboard users can reveal the tooltip);\r\n * it will be wired to the content via `aria-describedby`.\r\n */\r\n trigger?: ReactNode;\r\n /** Accessible label for the default info trigger. Defaults to \"More information\". */\r\n triggerLabel?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A tooltip: a trigger paired with a popover shown above it on hover or focus.\r\n * Seeded from the app's info tooltip. The reveal is CSS-driven (`:hover` /\r\n * `:focus-within`), so it works for pointer and keyboard alike; `Escape`\r\n * dismisses it while focused. The content carries `role=\"tooltip\"` and is wired\r\n * to the trigger with `aria-describedby`.\r\n */\r\nexport function Tooltip({\r\n content,\r\n placement = \"top\",\r\n trigger,\r\n triggerLabel = \"More information\",\r\n id,\r\n className = \"\",\r\n}: TooltipProps) {\r\n const generatedId = useId();\r\n const contentId = `${id ?? generatedId}-content`;\r\n\r\n // Escape hides the tooltip even while hovered/focused; leaving or blurring the\r\n // wrapper re-arms it so the next hover/focus reveals it again.\r\n const [dismissed, setDismissed] = useState(false);\r\n\r\n function handleKeyDown(event: KeyboardEvent<HTMLSpanElement>) {\r\n if (event.key === \"Escape\" && !dismissed) setDismissed(true);\r\n }\r\n\r\n function rearm() {\r\n if (dismissed) setDismissed(false);\r\n }\r\n\r\n const triggerNode =\r\n trigger != null ? (\r\n isValidElement(trigger) ? (\r\n cloneElement(trigger as ReactElement<{ \"aria-describedby\"?: string }>, { \"aria-describedby\": contentId })\r\n ) : (\r\n trigger\r\n )\r\n ) : (\r\n <button type=\"button\" className=\"info-tooltip-trigger\" aria-describedby={contentId} aria-label={triggerLabel}>\r\n i\r\n </button>\r\n );\r\n\r\n return (\r\n <span\r\n className={[\"info-tooltip\", className].filter(Boolean).join(\" \")}\r\n data-tooltip-dismissed={dismissed ? \"\" : undefined}\r\n onKeyDown={handleKeyDown}\r\n onMouseLeave={rearm}\r\n onBlur={rearm}\r\n >\r\n {triggerNode}\r\n <span id={contentId} role=\"tooltip\" className=\"info-tooltip-content\" data-placement={placement}>\r\n {content}\r\n </span>\r\n </span>\r\n );\r\n}\r\n","import type { ReactNode } from \"react\";\r\n\r\nexport interface DividerProps {\r\n /** Direction of the rule. Vertical needs a flex/grid parent to take height. */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Optional centered label (horizontal only), e.g. \"or\". */\r\n label?: ReactNode;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A thin rule that separates content. Horizontal by default (a native `<hr>`);\r\n * pass `orientation=\"vertical\"` for an inline rule, or `label` for a labeled\r\n * separator with the text centered between two lines. Uses the app's hairline\r\n * (`--line-soft`) and carries no margins — space it with layout primitives.\r\n */\r\nexport function Divider({ orientation = \"horizontal\", label, id, className = \"\" }: DividerProps) {\r\n if (orientation === \"vertical\") {\r\n return (\r\n <div\r\n id={id}\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n className={[\"ink-divider\", \"ink-divider--vertical\", className].filter(Boolean).join(\" \")}\r\n />\r\n );\r\n }\r\n\r\n if (label != null) {\r\n return (\r\n <div id={id} role=\"separator\" className={[\"ink-divider\", \"ink-divider--labeled\", className].filter(Boolean).join(\" \")}>\r\n <span className=\"ink-divider-label\">{label}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return <hr id={id} className={[\"ink-divider\", className].filter(Boolean).join(\" \")} />;\r\n}\r\n","import type { ReactNode } from \"react\";\r\n\r\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\";\r\nexport type AvatarShape = \"circle\" | \"square\";\r\n\r\nexport interface AvatarProps {\r\n /** Person/entity name. Drives the initials fallback and the accessible label. */\r\n name?: string;\r\n /** Image URL. When set (and it loads), shows the image instead of initials. */\r\n src?: string;\r\n /** Alt text for the image. Defaults to `name`. */\r\n alt?: string;\r\n /** Size preset. Defaults to \"md\" (matches the app's 34px avatar). */\r\n size?: AvatarSize;\r\n /** Circle (default) or square with a soft corner. */\r\n shape?: AvatarShape;\r\n /** Custom fallback (e.g. an icon) shown when there's no image. Overrides initials. */\r\n children?: ReactNode;\r\n /** Hide from assistive tech — use when the name is already shown adjacently. */\r\n decorative?: boolean;\r\n /**\r\n * Make the avatar a button. Wraps it in a `<button>` that brightens the ring\r\n * on hover/focus, matching the app's account trigger. Provide `onClick`.\r\n */\r\n interactive?: boolean;\r\n /** Click handler when `interactive` is set. */\r\n onClick?: () => void;\r\n /** Accessible label for the interactive button. Defaults to `name`. */\r\n buttonLabel?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/** Up to two uppercase initials from a name. */\r\nfunction getInitials(value: string): string {\r\n return value\r\n .trim()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, 2)\r\n .map((part) => part.charAt(0).toUpperCase())\r\n .join(\"\");\r\n}\r\n\r\n/**\r\n * A compact circular (or square) identity mark showing an image or an initials\r\n * fallback. Seeded from the app's account avatar. When `decorative` isn't set it\r\n * exposes an accessible name (the image `alt`/`name`, or `role=\"img\"` +\r\n * `aria-label` for the initials fallback).\r\n */\r\nexport function Avatar({\r\n name,\r\n src,\r\n alt,\r\n size = \"md\",\r\n shape = \"circle\",\r\n children,\r\n decorative = false,\r\n interactive = false,\r\n onClick,\r\n buttonLabel,\r\n id,\r\n className = \"\",\r\n}: AvatarProps) {\r\n const avatarClasses = [\r\n \"ink-avatar\",\r\n size !== \"md\" ? `ink-avatar--${size}` : \"\",\r\n shape === \"square\" ? \"ink-avatar--square\" : \"\",\r\n !interactive ? className : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const initials = name ? getInitials(name) : \"\";\r\n const label = alt ?? name;\r\n\r\n let body: ReactNode;\r\n if (src) {\r\n body = <img className=\"ink-avatar-image\" src={src} alt={decorative || interactive ? \"\" : label ?? \"\"} />;\r\n } else if (children != null) {\r\n body = children;\r\n } else {\r\n // Wrapping initials lets us optically center them without shifting images.\r\n body = <span className=\"ink-avatar-initials\">{initials}</span>;\r\n }\r\n\r\n // The <img> or the interactive button carries the accessible name, so only\r\n // the plain initials/children path needs a role/label on the wrapper.\r\n const labelProps =\r\n decorative || interactive || src\r\n ? { \"aria-hidden\": decorative || undefined }\r\n : label\r\n ? { role: \"img\", \"aria-label\": label }\r\n : { \"aria-hidden\": true };\r\n\r\n const avatar = (\r\n <span id={interactive ? undefined : id} className={avatarClasses} {...labelProps}>\r\n {body}\r\n </span>\r\n );\r\n\r\n if (!interactive) return avatar;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n id={id}\r\n className={[\"ink-avatar-button\", className].filter(Boolean).join(\" \")}\r\n aria-label={buttonLabel ?? label ?? \"Account\"}\r\n onClick={onClick}\r\n >\r\n {avatar}\r\n </button>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { IconArrowDown } from \"./icons\";\r\n\r\nexport type TableSortDirection = \"asc\" | \"desc\";\r\nexport type TableDensity = \"comfortable\" | \"compact\";\r\nexport type TableAlign = \"start\" | \"center\" | \"end\";\r\n\r\nexport interface TableColumn<T> {\r\n /** Stable id used for sort state and React keys. */\r\n id: string;\r\n /** Header cell content. */\r\n header: ReactNode;\r\n /** Renders the body cell for a row. */\r\n render: (row: T) => ReactNode;\r\n /** Show the sort affordance on the header; clicks call `onSortChange`. */\r\n sortable?: boolean;\r\n /** Text alignment for this column's cells and header. Defaults to \"start\". */\r\n align?: TableAlign;\r\n /** Optional width, applied via `<colgroup>` (e.g. \"12ch\", \"20%\"). */\r\n width?: string;\r\n}\r\n\r\nexport interface TableProps<T> {\r\n columns: TableColumn<T>[];\r\n data: readonly T[];\r\n /** Stable React key for each row. */\r\n getRowKey: (row: T) => string | number;\r\n /** Controlled sort column id. */\r\n sortBy?: string;\r\n /** Controlled sort direction. */\r\n sortDirection?: TableSortDirection;\r\n /** Called when a sortable header is activated. */\r\n onSortChange?: (sortBy: string, direction: TableSortDirection) => void;\r\n /** Uncontrolled starting sort column. */\r\n defaultSortBy?: string;\r\n /** Uncontrolled starting sort direction. Defaults to \"asc\". */\r\n defaultSortDirection?: TableSortDirection;\r\n /** Row height / padding. Defaults to \"comfortable\". */\r\n density?: TableDensity;\r\n /** Pin `<thead>` when the parent scrolls. */\r\n stickyHeader?: boolean;\r\n /** Subtle hover fill on rows. */\r\n hoverable?: boolean;\r\n /** Renders as `<caption>`. */\r\n caption?: ReactNode;\r\n /** Empty-state content shown when `data` is empty. */\r\n empty?: ReactNode;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A semantic HTML table with optional sortable columns, sticky header, row\r\n * hover, and density presets. Sorting is caller-controlled: the component\r\n * surfaces the click and shows the indicator, but the data must already be in\r\n * the desired order (use `onSortChange` to react).\r\n */\r\nexport function Table<T>({\r\n columns,\r\n data,\r\n getRowKey,\r\n sortBy,\r\n sortDirection,\r\n onSortChange,\r\n defaultSortBy,\r\n defaultSortDirection = \"asc\",\r\n density = \"comfortable\",\r\n stickyHeader = false,\r\n hoverable = false,\r\n caption,\r\n empty,\r\n id,\r\n className = \"\",\r\n}: TableProps<T>) {\r\n const isControlled = sortBy !== undefined;\r\n const [internalSort, setInternalSort] = useState<{ by?: string; direction: TableSortDirection }>({\r\n by: defaultSortBy,\r\n direction: defaultSortDirection,\r\n });\r\n const activeSortBy = isControlled ? sortBy : internalSort.by;\r\n const activeSortDirection = isControlled ? (sortDirection ?? \"asc\") : internalSort.direction;\r\n\r\n function toggleSort(columnId: string) {\r\n const nextDirection: TableSortDirection =\r\n activeSortBy === columnId && activeSortDirection === \"asc\" ? \"desc\" : \"asc\";\r\n if (!isControlled) setInternalSort({ by: columnId, direction: nextDirection });\r\n onSortChange?.(columnId, nextDirection);\r\n }\r\n\r\n const classes = [\r\n \"ink-table\",\r\n density === \"compact\" ? \"ink-table--compact\" : \"\",\r\n stickyHeader ? \"ink-table--sticky\" : \"\",\r\n hoverable ? \"ink-table--hoverable\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <table id={id} className={classes}>\r\n {caption ? <caption className=\"ink-table-caption\">{caption}</caption> : null}\r\n {columns.some((c) => c.width) ? (\r\n <colgroup>\r\n {columns.map((c) => (\r\n <col key={c.id} style={c.width ? { width: c.width } : undefined} />\r\n ))}\r\n </colgroup>\r\n ) : null}\r\n <thead>\r\n <tr>\r\n {columns.map((column) => {\r\n const align = column.align ?? \"start\";\r\n const isActive = column.sortable && activeSortBy === column.id;\r\n const ariaSort = column.sortable\r\n ? isActive\r\n ? activeSortDirection === \"asc\"\r\n ? \"ascending\"\r\n : \"descending\"\r\n : \"none\"\r\n : undefined;\r\n return (\r\n <th\r\n key={column.id}\r\n scope=\"col\"\r\n aria-sort={ariaSort}\r\n data-align={align}\r\n >\r\n {column.sortable ? (\r\n <button\r\n type=\"button\"\r\n className=\"ink-table-sort-button\"\r\n onClick={() => toggleSort(column.id)}\r\n >\r\n <span className=\"ink-table-header-label\">{column.header}</span>\r\n <IconArrowDown\r\n className={[\r\n \"ink-table-sort-icon\",\r\n isActive ? \"ink-table-sort-icon--active\" : \"\",\r\n isActive && activeSortDirection === \"asc\" ? \"ink-table-sort-icon--asc\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n ) : (\r\n <span className=\"ink-table-header-label\">{column.header}</span>\r\n )}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {data.length === 0 ? (\r\n <tr className=\"ink-table-empty-row\">\r\n <td colSpan={columns.length}>{empty ?? \"No data.\"}</td>\r\n </tr>\r\n ) : (\r\n data.map((row) => (\r\n <tr key={getRowKey(row)}>\r\n {columns.map((column) => (\r\n <td key={column.id} data-align={column.align ?? \"start\"}>\r\n {column.render(row)}\r\n </td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n );\r\n}\r\n","import type { CSSProperties, ReactNode } from \"react\";\r\n\r\nexport type ListDensity = \"comfortable\" | \"compact\";\r\n\r\nexport interface ListProps {\r\n /**\r\n * Grid template for row columns (e.g. `\"1fr 1fr auto\"`,\r\n * `\"minmax(0, 1.1fr) minmax(0, 1fr) auto\"`). Applied to every child row via\r\n * a CSS custom property, so all rows share the same column geometry.\r\n */\r\n columns: string;\r\n /** Row padding preset. Defaults to \"comfortable\". */\r\n density?: ListDensity;\r\n /** Hide the hairline divider between rows. */\r\n bordered?: boolean;\r\n children?: ReactNode;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\nexport interface ListRowProps {\r\n children?: ReactNode;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A grid-based list of rows. Not a semantic table — use for content that reads\r\n * tabularly but isn't structured data (e.g. the app's roster). Each row is a\r\n * grid with the column template set on the parent via `columns`.\r\n */\r\nexport function List({\r\n columns,\r\n density = \"comfortable\",\r\n bordered = true,\r\n children,\r\n id,\r\n className = \"\",\r\n}: ListProps) {\r\n const classes = [\r\n \"ink-list\",\r\n density === \"compact\" ? \"ink-list--compact\" : \"\",\r\n bordered ? \"ink-list--bordered\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const style = { \"--ink-list-cols\": columns } as CSSProperties;\r\n\r\n return (\r\n <div id={id} className={classes} style={style} role=\"list\">\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n/** A row in a `List`. Wraps `children` in a grid using the parent's `columns`. */\r\nList.Row = function ListRow({ children, id, className = \"\" }: ListRowProps) {\r\n return (\r\n <div id={id} role=\"listitem\" className={[\"ink-list-row\", className].filter(Boolean).join(\" \")}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","export type SpinnerSize = \"sm\" | \"md\" | \"lg\";\r\nexport type SpinnerTone = \"muted\" | \"brand\" | \"current\";\r\n\r\nexport interface SpinnerProps {\r\n /** Diameter preset. Defaults to \"md\" (20px). */\r\n size?: SpinnerSize;\r\n /** Spinner color. `current` inherits `currentColor`. Defaults to \"muted\". */\r\n tone?: SpinnerTone;\r\n /** Announced by screen readers. Defaults to \"Loading\". */\r\n label?: string;\r\n /** Skip the announcement (use when a surrounding region already announces state). */\r\n decorative?: boolean;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A small rotating indeterminate loader. Use for short waits inside a control\r\n * or beside a label. For loading larger regions of content, use `Skeleton`\r\n * instead so the layout doesn't jump when data arrives.\r\n */\r\nexport function Spinner({\r\n size = \"md\",\r\n tone = \"muted\",\r\n label = \"Loading\",\r\n decorative = false,\r\n id,\r\n className = \"\",\r\n}: SpinnerProps) {\r\n const classes = [\r\n \"ink-spinner\",\r\n size !== \"md\" ? `ink-spinner--${size}` : \"\",\r\n tone !== \"muted\" ? `ink-spinner--${tone}` : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n if (decorative) {\r\n return <span id={id} className={classes} aria-hidden=\"true\" />;\r\n }\r\n return (\r\n <span id={id} className={classes} role=\"status\" aria-live=\"polite\">\r\n <span className=\"sr-only\">{label}</span>\r\n </span>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\n\r\nexport type SkeletonVariant = \"text\" | \"rect\" | \"circle\";\r\n\r\nexport interface SkeletonProps {\r\n /** Shape preset. `text` is a single-line placeholder; `circle` is 1:1; `rect` is generic. Defaults to \"text\". */\r\n variant?: SkeletonVariant;\r\n /** CSS width. Defaults to `100%` for text/rect, or `size` for circles. */\r\n width?: number | string;\r\n /** CSS height. Defaults to `1em` for text, `size` for circle, and requires a value for rect. */\r\n height?: number | string;\r\n /** Convenience for circles — sets both width and height. Defaults to 40. */\r\n size?: number | string;\r\n /** Number of stacked text lines. Only applies to `variant=\"text\"`. */\r\n lines?: number;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\nfunction normalize(value: number | string | undefined): string | undefined {\r\n if (value == null) return undefined;\r\n return typeof value === \"number\" ? `${value}px` : value;\r\n}\r\n\r\n/**\r\n * A placeholder block that shimmers while content is loading. `text` reads as a\r\n * single line (or `lines`-many); `circle` is a 1:1 avatar-style placeholder;\r\n * `rect` is a generic block sized by width/height. Always decorative — a\r\n * surrounding region should announce the loading state.\r\n */\r\nexport function Skeleton({ variant = \"text\", width, height, size = 40, lines, id, className = \"\" }: SkeletonProps) {\r\n const classes = [\"ink-skeleton\", `ink-skeleton--${variant}`, className].filter(Boolean).join(\" \");\r\n\r\n const styleFor = (index?: number): CSSProperties => {\r\n if (variant === \"circle\") {\r\n const d = normalize(width ?? size);\r\n return { width: d, height: normalize(height ?? size) ?? d };\r\n }\r\n if (variant === \"rect\") {\r\n return { width: normalize(width) ?? \"100%\", height: normalize(height) };\r\n }\r\n // text\r\n const isLast = lines != null && index === lines - 1;\r\n return {\r\n // A shorter last line reads as natural paragraph flow.\r\n width: isLast ? \"68%\" : normalize(width) ?? \"100%\",\r\n height: normalize(height),\r\n };\r\n };\r\n\r\n if (variant === \"text\" && lines != null && lines > 1) {\r\n return (\r\n <span id={id} className=\"ink-skeleton-lines\" aria-hidden=\"true\">\r\n {Array.from({ length: lines }, (_, i) => (\r\n <span key={i} className={classes} style={styleFor(i)} />\r\n ))}\r\n </span>\r\n );\r\n }\r\n\r\n return <span id={id} className={classes} style={styleFor()} aria-hidden=\"true\" />;\r\n}\r\n","import { useId } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\n\r\nexport type ProgressTone = \"brand\" | \"success\" | \"danger\";\r\nexport type ProgressSize = \"sm\" | \"md\";\r\n\r\nexport interface ProgressProps {\r\n /** Current progress (0–100). Omit for an indeterminate bar. */\r\n value?: number;\r\n /** Fill color. Defaults to \"brand\". */\r\n tone?: ProgressTone;\r\n /** Track height. `md` (default) ≈ 6px; `sm` ≈ 3px. */\r\n size?: ProgressSize;\r\n /** Optional visible label rendered above the track. Also becomes the accessible name. */\r\n label?: ReactNode;\r\n /** Value formatter shown next to the label (determinate only). Defaults to `${value}%`. */\r\n valueFormatter?: (value: number) => string;\r\n /** Fallback accessible name when `label` isn't set. */\r\n ariaLabel?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/** Clamp a raw value into the 0–100 range and round to a whole percent. */\r\nfunction clamp(value: number): number {\r\n if (Number.isNaN(value)) return 0;\r\n return Math.round(Math.min(100, Math.max(0, value)));\r\n}\r\n\r\n/**\r\n * A horizontal progress bar. Pass `value` for determinate progress; omit it for\r\n * an indeterminate sliding-bar animation. Exposes `role=\"progressbar\"` with\r\n * `aria-valuemin/max/now` (or `aria-valuetext=\"indeterminate\"` when unknown).\r\n */\r\nexport function Progress({\r\n value,\r\n tone = \"brand\",\r\n size = \"md\",\r\n label,\r\n valueFormatter,\r\n ariaLabel,\r\n id,\r\n className = \"\",\r\n}: ProgressProps) {\r\n const generatedId = useId();\r\n const baseId = id ?? generatedId;\r\n const labelId = label != null ? `${baseId}-label` : undefined;\r\n\r\n const isDeterminate = typeof value === \"number\";\r\n const percent = isDeterminate ? clamp(value) : 0;\r\n const formatted = isDeterminate ? (valueFormatter ?? ((v) => `${v}%`))(percent) : null;\r\n\r\n const classes = [\r\n \"ink-progress\",\r\n tone !== \"brand\" ? `ink-progress--${tone}` : \"\",\r\n size !== \"md\" ? `ink-progress--${size}` : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div id={id} className={classes}>\r\n {label != null ? (\r\n <div className=\"ink-progress-heading\">\r\n <span id={labelId} className=\"ink-progress-label\">{label}</span>\r\n {formatted != null ? <span className=\"ink-progress-value\">{formatted}</span> : null}\r\n </div>\r\n ) : null}\r\n <div\r\n className=\"ink-progress-track\"\r\n role=\"progressbar\"\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-valuenow={isDeterminate ? percent : undefined}\r\n aria-valuetext={isDeterminate ? undefined : \"indeterminate\"}\r\n aria-labelledby={labelId}\r\n aria-label={labelId ? undefined : ariaLabel}\r\n >\r\n <div\r\n className={[\"ink-progress-fill\", isDeterminate ? \"\" : \"ink-progress-fill--indeterminate\"].filter(Boolean).join(\" \")}\r\n style={isDeterminate ? { transform: `scaleX(${percent / 100})` } : undefined}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\r\n\r\n/**\r\n * Layout primitives for Inkwell.\r\n *\r\n * Stack / Inline / Grid arrange children with token-backed spacing so consumers\r\n * stop hand-rolling flexbox and arbitrary gap values. The `gap` scale maps to\r\n * the same spacing rhythm the source app used — `md` (12px / --space-3) is the\r\n * default, matching the app's `.stacked-form` / `.grid` layout rhythm.\r\n *\r\n * Each primitive renders a `div` with a base class and sets CSS variables inline\r\n * so the props drive the values while the rules live in the stylesheet.\r\n */\r\n\r\nexport type SpaceScale = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\nconst SPACE: Record<SpaceScale, string> = {\r\n none: \"0\",\r\n xs: \"var(--space-1)\", // 4px\r\n sm: \"var(--space-2)\", // 8px\r\n md: \"var(--space-3)\", // 12px — default, the app's canonical rhythm\r\n lg: \"var(--space-4)\", // 16px\r\n xl: \"var(--space-6)\", // 24px\r\n};\r\n\r\nexport type AlignItems = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\r\nconst ALIGN: Record<AlignItems, string> = {\r\n start: \"flex-start\",\r\n center: \"center\",\r\n end: \"flex-end\",\r\n stretch: \"stretch\",\r\n baseline: \"baseline\",\r\n};\r\n\r\nexport type JustifyContent = \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\r\nconst JUSTIFY: Record<JustifyContent, string> = {\r\n start: \"flex-start\",\r\n center: \"center\",\r\n end: \"flex-end\",\r\n between: \"space-between\",\r\n around: \"space-around\",\r\n};\r\n\r\nfunction styleVars(base: CSSProperties | undefined, entries: Record<string, string | undefined>): CSSProperties {\r\n const vars: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(entries)) {\r\n if (value !== undefined) vars[key] = value;\r\n }\r\n return { ...base, ...vars } as CSSProperties;\r\n}\r\n\r\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\r\n /** Space between children. Defaults to `md` (12px). */\r\n gap?: SpaceScale;\r\n /** Cross-axis alignment (`align-items`). */\r\n align?: AlignItems;\r\n children?: ReactNode;\r\n}\r\n\r\n/** Vertical flow with a consistent, token-backed gap. */\r\nexport function Stack({ gap = \"md\", align, className = \"\", style, children, ...props }: StackProps) {\r\n return (\r\n <div\r\n className={[\"ink-stack\", className].filter(Boolean).join(\" \")}\r\n style={styleVars(style, { \"--ink-stack-gap\": SPACE[gap], \"--ink-stack-align\": align && ALIGN[align] })}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface InlineProps extends HTMLAttributes<HTMLDivElement> {\r\n /** Space between children. Defaults to `md` (12px). */\r\n gap?: SpaceScale;\r\n /** Cross-axis alignment (`align-items`). Defaults to `center`. */\r\n align?: AlignItems;\r\n /** Main-axis distribution (`justify-content`). */\r\n justify?: JustifyContent;\r\n /** Whether children wrap onto multiple rows. Defaults to `true`. */\r\n wrap?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\n/** Horizontal flow with gap, wrapping, and alignment. */\r\nexport function Inline({ gap = \"md\", align, justify, wrap = true, className = \"\", style, children, ...props }: InlineProps) {\r\n return (\r\n <div\r\n className={[\"ink-inline\", className].filter(Boolean).join(\" \")}\r\n style={styleVars(style, {\r\n \"--ink-inline-gap\": SPACE[gap],\r\n \"--ink-inline-align\": align && ALIGN[align],\r\n \"--ink-inline-justify\": justify && JUSTIFY[justify],\r\n \"--ink-inline-wrap\": wrap ? \"wrap\" : \"nowrap\",\r\n })}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\r\n /** Space between cells. Defaults to `md` (12px). */\r\n gap?: SpaceScale;\r\n /** Number of equal columns (`repeat(n, minmax(0, 1fr))`). Defaults to 2. */\r\n columns?: number;\r\n /** Cross-axis alignment (`align-items`). */\r\n align?: AlignItems;\r\n children?: ReactNode;\r\n}\r\n\r\n/** Equal-column grid using the app's `repeat(n, minmax(0, 1fr))` convention. */\r\nexport function Grid({ gap = \"md\", columns = 2, align, className = \"\", style, children, ...props }: GridProps) {\r\n return (\r\n <div\r\n className={[\"ink-grid\", className].filter(Boolean).join(\" \")}\r\n style={styleVars(style, {\r\n \"--ink-grid-gap\": SPACE[gap],\r\n \"--ink-grid-columns\": `repeat(${columns}, minmax(0, 1fr))`,\r\n \"--ink-grid-align\": align && ALIGN[align],\r\n })}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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"}