northline 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +250 -0
  3. package/dist/chartSetup.d.ts +3 -0
  4. package/dist/chartTheme.d.ts +67 -0
  5. package/dist/components/Accordion.d.ts +17 -0
  6. package/dist/components/Alert.d.ts +9 -0
  7. package/dist/components/Avatar.d.ts +10 -0
  8. package/dist/components/AvatarGroup.d.ts +7 -0
  9. package/dist/components/Badge.d.ts +8 -0
  10. package/dist/components/Breadcrumbs.d.ts +8 -0
  11. package/dist/components/BulletChart.d.ts +10 -0
  12. package/dist/components/Button.d.ts +6 -0
  13. package/dist/components/ButtonGroup.d.ts +5 -0
  14. package/dist/components/Card.d.ts +7 -0
  15. package/dist/components/Carousel.d.ts +7 -0
  16. package/dist/components/ChartCard.d.ts +23 -0
  17. package/dist/components/ChartLegend.d.ts +10 -0
  18. package/dist/components/Checkbox.d.ts +8 -0
  19. package/dist/components/CodeBlock.d.ts +6 -0
  20. package/dist/components/ColorPicker.d.ts +7 -0
  21. package/dist/components/Combobox.d.ts +13 -0
  22. package/dist/components/Container.d.ts +7 -0
  23. package/dist/components/CopyButton.d.ts +5 -0
  24. package/dist/components/DatePicker.d.ts +9 -0
  25. package/dist/components/DateRangePicker.d.ts +9 -0
  26. package/dist/components/DescriptionList.d.ts +10 -0
  27. package/dist/components/Divider.d.ts +6 -0
  28. package/dist/components/Drawer.d.ts +11 -0
  29. package/dist/components/EmptyState.d.ts +8 -0
  30. package/dist/components/ErrorBoundary.d.ts +18 -0
  31. package/dist/components/Fieldset.d.ts +9 -0
  32. package/dist/components/FileUpload.d.ts +10 -0
  33. package/dist/components/Gauge.d.ts +10 -0
  34. package/dist/components/Grid.d.ts +8 -0
  35. package/dist/components/Heading.d.ts +7 -0
  36. package/dist/components/Icon.d.ts +8 -0
  37. package/dist/components/IconButton.d.ts +8 -0
  38. package/dist/components/InfoTooltip.d.ts +4 -0
  39. package/dist/components/Input.d.ts +10 -0
  40. package/dist/components/Kbd.d.ts +5 -0
  41. package/dist/components/Link.d.ts +6 -0
  42. package/dist/components/List.d.ts +11 -0
  43. package/dist/components/LoadingOverlay.d.ts +7 -0
  44. package/dist/components/Menu.d.ts +13 -0
  45. package/dist/components/MiniBar.d.ts +6 -0
  46. package/dist/components/Modal.d.ts +10 -0
  47. package/dist/components/Navbar.d.ts +7 -0
  48. package/dist/components/NumberStepper.d.ts +10 -0
  49. package/dist/components/OTPInput.d.ts +8 -0
  50. package/dist/components/Pagination.d.ts +6 -0
  51. package/dist/components/PasswordInput.d.ts +13 -0
  52. package/dist/components/Popover.d.ts +8 -0
  53. package/dist/components/Portal.d.ts +5 -0
  54. package/dist/components/ProgressBar.d.ts +9 -0
  55. package/dist/components/Radio.d.ts +23 -0
  56. package/dist/components/Rating.d.ts +7 -0
  57. package/dist/components/ScoreCard.d.ts +10 -0
  58. package/dist/components/SearchInput.d.ts +7 -0
  59. package/dist/components/SegmentedControl.d.ts +12 -0
  60. package/dist/components/Select.d.ts +22 -0
  61. package/dist/components/Sidebar.d.ts +14 -0
  62. package/dist/components/Skeleton.d.ts +8 -0
  63. package/dist/components/Slider.d.ts +13 -0
  64. package/dist/components/Sparkline.d.ts +6 -0
  65. package/dist/components/Spinner.d.ts +5 -0
  66. package/dist/components/Stack.d.ts +13 -0
  67. package/dist/components/StatusDot.d.ts +8 -0
  68. package/dist/components/Stepper.d.ts +11 -0
  69. package/dist/components/Switch.d.ts +8 -0
  70. package/dist/components/Table.d.ts +15 -0
  71. package/dist/components/Tabs.d.ts +12 -0
  72. package/dist/components/TagInput.d.ts +8 -0
  73. package/dist/components/Text.d.ts +11 -0
  74. package/dist/components/Textarea.d.ts +10 -0
  75. package/dist/components/Timeline.d.ts +13 -0
  76. package/dist/components/Toast.d.ts +14 -0
  77. package/dist/components/Tooltip.d.ts +7 -0
  78. package/dist/components/Tree.d.ts +13 -0
  79. package/dist/hooks/useClickOutside.d.ts +2 -0
  80. package/dist/index.d.ts +78 -0
  81. package/dist/index.js +2769 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/theme.css +2 -0
  84. package/package.json +46 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/Sparkline.tsx","../src/components/ScoreCard.tsx","../src/components/Icon.tsx","../src/components/InfoTooltip.tsx","../src/components/ChartCard.tsx","../src/components/Select.tsx","../src/components/DateRangePicker.tsx","../src/components/Tabs.tsx","../src/components/Button.tsx","../src/components/Badge.tsx","../src/components/Input.tsx","../src/components/Switch.tsx","../src/components/Table.tsx","../src/components/Modal.tsx","../src/components/Toast.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/Textarea.tsx","../src/components/Skeleton.tsx","../src/components/Menu.tsx","../src/components/Pagination.tsx","../src/components/Breadcrumbs.tsx","../src/components/ProgressBar.tsx","../src/components/Gauge.tsx","../src/components/Avatar.tsx","../src/components/Card.tsx","../src/components/EmptyState.tsx","../src/components/Spinner.tsx","../src/components/Accordion.tsx","../src/components/SegmentedControl.tsx","../src/components/ChartLegend.tsx","../src/components/MiniBar.tsx","../src/components/BulletChart.tsx","../src/components/Slider.tsx","../src/components/Stepper.tsx","../src/components/Drawer.tsx","../src/components/Popover.tsx","../src/components/TagInput.tsx","../src/components/SearchInput.tsx","../src/components/CopyButton.tsx","../src/components/StatusDot.tsx","../src/components/DescriptionList.tsx","../src/components/Text.tsx","../src/components/Heading.tsx","../src/components/Container.tsx","../src/components/Stack.tsx","../src/components/Grid.tsx","../src/components/Divider.tsx","../src/components/Link.tsx","../src/components/Alert.tsx","../src/components/IconButton.tsx","../src/components/Tooltip.tsx","../src/components/Fieldset.tsx","../src/components/Combobox.tsx","../src/components/NumberStepper.tsx","../src/components/FileUpload.tsx","../src/components/DatePicker.tsx","../src/components/Rating.tsx","../src/components/List.tsx","../src/components/Timeline.tsx","../src/components/AvatarGroup.tsx","../src/components/CodeBlock.tsx","../src/components/Kbd.tsx","../src/components/Tree.tsx","../src/components/Navbar.tsx","../src/components/Sidebar.tsx","../src/components/ButtonGroup.tsx","../src/components/ColorPicker.tsx","../src/components/PasswordInput.tsx","../src/components/OTPInput.tsx","../src/components/LoadingOverlay.tsx","../src/components/ErrorBoundary.tsx","../src/components/Carousel.tsx","../src/components/Portal.tsx","../src/hooks/useClickOutside.ts","../src/chartTheme.ts","../src/chartSetup.ts"],"sourcesContent":["export interface SparklineProps {\n data?: number[]\n color?: string\n height?: number\n}\n\n// Minimal inline SVG sparkline - no axes, no library, just a smoothed polyline\n// tracing a short trend under a scorecard value.\nexport default function Sparkline({ data, color = '#8FB4F5', height = 36 }: SparklineProps) {\n if (!data || data.length < 2) return null\n\n const width = 200\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const padY = 4\n\n const points = data.map((v, i): [number, number] => {\n const x = (i / (data.length - 1)) * width\n const y = padY + (1 - (v - min) / range) * (height - padY * 2)\n return [x, y]\n })\n\n const path = points.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')\n\n return (\n <svg className=\"score-card__sparkline\" viewBox={`0 0 ${width} ${height}`} preserveAspectRatio=\"none\">\n <path d={path} fill=\"none\" stroke={color} strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","import type { ReactNode } from 'react'\nimport Sparkline from './Sparkline'\n\nexport interface ScoreCardProps {\n label: ReactNode\n value: ReactNode\n accent: 'indigo' | 'green' | 'rose' | 'cyan'\n sub?: ReactNode\n direction?: 'up' | 'down'\n trend?: number[]\n}\n\nexport default function ScoreCard({ label, value, accent, sub, direction, trend }: ScoreCardProps) {\n return (\n <div className={`score-card score-card--${accent}`}>\n <span className=\"score-card__label\">{label}</span>\n <span className=\"score-card__value\">{value}</span>\n {sub && (\n <span className={`score-card__sub${direction ? ` score-card__sub--${direction}` : ''}`}>{sub}</span>\n )}\n {trend && <Sparkline data={trend} color=\"var(--accent)\" />}\n </div>\n )\n}\n","import type { ReactElement } from 'react'\n\nexport type IconName =\n | 'close'\n | 'check'\n | 'chevron-left'\n | 'chevron-right'\n | 'kebab'\n | 'drag-handle'\n | 'copy'\n | 'trash'\n | 'plus'\n | 'minus'\n | 'upload'\n | 'star'\n | 'info'\n | 'warning'\n | 'settings'\n | 'inbox'\n | 'search'\n | 'calendar'\n | 'eye'\n | 'eye-off'\n\n// Stroke-based (24x24 viewBox) paths - sized/colored via the `size`/`color`\n// props, not baked into the path data, so one path works at any size/tone.\nconst PATHS: Record<IconName, ReactElement> = {\n close: <path d=\"M6 6L18 18M18 6L6 18\" />,\n check: <path d=\"M5 12.5L9.5 17L19 7\" />,\n 'chevron-left': <path d=\"M15 6L9 12L15 18\" />,\n 'chevron-right': <path d=\"M9 6L15 12L9 18\" />,\n kebab: (\n <>\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </>\n ),\n 'drag-handle': (\n <>\n <circle cx=\"9\" cy=\"6\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.3\" fill=\"currentColor\" stroke=\"none\" />\n </>\n ),\n copy: (\n <>\n <rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2\" />\n </>\n ),\n trash: (\n <>\n <path d=\"M5 7h14\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12\" />\n <path d=\"M9 7V5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n </>\n ),\n plus: <path d=\"M12 5V19M5 12H19\" />,\n minus: <path d=\"M5 12H19\" />,\n upload: (\n <>\n <path d=\"M12 4V15\" />\n <path d=\"M7 9L12 4L17 9\" />\n <path d=\"M5 16v2a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-2\" />\n </>\n ),\n star: <path d=\"M12 3l2.6 5.8 6.2.6-4.7 4.2 1.4 6.2L12 16.9 6.5 19.8l1.4-6.2L3.2 9.4l6.2-.6L12 3z\" strokeLinejoin=\"round\" />,\n info: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <circle cx=\"12\" cy=\"8\" r=\"0.5\" fill=\"currentColor\" />\n </>\n ),\n warning: (\n <>\n <path d=\"M12 3L22 20H2L12 3z\" strokeLinejoin=\"round\" />\n <path d=\"M12 10v4\" />\n <circle cx=\"12\" cy=\"17\" r=\"0.5\" fill=\"currentColor\" />\n </>\n ),\n settings: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19 12a7 7 0 0 0-.1-1.2l2-1.6-2-3.4-2.4 1a7 7 0 0 0-2-1.2L14 3h-4l-.5 2.6a7 7 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6A7 7 0 0 0 5 12a7 7 0 0 0 .1 1.2l-2 1.6 2 3.4 2.4-1a7 7 0 0 0 2 1.2L10 21h4l.5-2.6a7 7 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6c.067-.395.1-.796.1-1.2z\" />\n </>\n ),\n inbox: (\n <>\n <path d=\"M4 12h4l2 3h4l2-3h4\" />\n <path d=\"M6 5h12l2 7v6a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-6l2-7z\" strokeLinejoin=\"round\" />\n </>\n ),\n search: (\n <>\n <circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" />\n <path d=\"M19.5 19.5L15 15\" />\n </>\n ),\n calendar: (\n <>\n <rect x=\"3.5\" y=\"5\" width=\"17\" height=\"16\" rx=\"2\" />\n <path d=\"M3.5 10h17\" />\n <path d=\"M8 3v4M16 3v4\" />\n </>\n ),\n eye: (\n <>\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" strokeLinejoin=\"round\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </>\n ),\n 'eye-off': (\n <>\n <path d=\"M3 3l18 18\" />\n <path d=\"M10.6 5.2A10.6 10.6 0 0 1 12 5c6.5 0 10 7 10 7a15.6 15.6 0 0 1-3.4 4.3M6.6 6.6A15.7 15.7 0 0 0 2 12s3.5 7 10 7a10.4 10.4 0 0 0 3.4-.6\" />\n <path d=\"M9.9 9.9a3 3 0 0 0 4.2 4.2\" />\n </>\n ),\n}\n\nexport interface IconProps {\n name: IconName\n size?: number\n color?: string\n filled?: boolean\n}\n\n// Single inline-SVG icon component covering every glyph the kit needs -\n// used instead of emoji or unicode symbol characters, which render\n// inconsistently (color emoji fonts, missing glyphs, baseline misalignment)\n// across platforms. `color` defaults to inheriting text color; `filled`\n// switches to a solid fill (used by Rating's star).\nexport default function Icon({ name, size = 16, color = 'currentColor', filled = false }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? color : 'none'}\n stroke={color}\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {PATHS[name]}\n </svg>\n )\n}\n","import Icon from './Icon'\n\nexport interface InfoTooltipProps {\n text?: string\n}\n\n// Small (i) affordance that reveals a formula/explanation on hover or focus.\n// Keyboard accessible: tabbable span, shown on focus as well as hover.\nexport default function InfoTooltip({ text }: InfoTooltipProps) {\n if (!text) return null\n return (\n <span className=\"info-tooltip\" tabIndex={0} role=\"note\" aria-label={text}>\n <span className=\"info-tooltip__icon\">\n <Icon name=\"info\" size={11} />\n </span>\n <span className=\"info-tooltip__bubble\">{text}</span>\n </span>\n )\n}\n","import { useEffect, useRef, type DragEvent, type ReactNode } from 'react'\nimport InfoTooltip from './InfoTooltip'\nimport Icon from './Icon'\n\nexport interface ChartCardSize {\n width: number\n height: number\n}\n\nexport interface ChartCardProps {\n id: string\n title: ReactNode\n info?: string\n height?: number | string\n width?: number | string\n children: ReactNode\n onDragStart?: (e: DragEvent<HTMLDivElement>, id: string) => void\n onDragOver?: (id: string) => void\n onDrop?: (id: string) => void\n onDragEnd?: () => void\n onResize?: (id: string, size: ChartCardSize) => void\n registerRef?: (id: string, node: HTMLDivElement | null) => void\n isDragOver?: boolean\n isDragging?: boolean\n draggable?: boolean\n}\n\n// A dashboard widget: the whole card (not just the chart) can be resized by\n// dragging its bottom-right corner, and reordered by dragging it onto another\n// card - both native browser/DOM behaviors, no extra library. Size changes\n// are reported via onResize so the parent can persist them.\nexport default function ChartCard({\n id,\n title,\n info,\n height = 320,\n width,\n children,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n onResize,\n registerRef,\n isDragOver,\n isDragging,\n draggable = true,\n}: ChartCardProps) {\n const cardRef = useRef<HTMLDivElement | null>(null)\n // Keep the latest callback without making the effect below re-run on every\n // render - onResize is a fresh function each render, and ResizeObserver\n // fires an initial callback as soon as observe() is called, so depending on\n // onResize directly would tear down/recreate the observer forever.\n const onResizeRef = useRef(onResize)\n onResizeRef.current = onResize\n\n useEffect(() => {\n const el = cardRef.current\n if (!el) return\n const observer = new ResizeObserver(([entry]) => {\n if (!entry) return\n // Read border-box size, matching the border-box width/height we set via\n // inline style (global box-sizing: border-box) - contentRect would be\n // smaller by the padding/border.\n const box = entry.borderBoxSize?.[0]\n const w = box ? box.inlineSize : el.getBoundingClientRect().width\n const h = box ? box.blockSize : el.getBoundingClientRect().height\n // A hidden tab (display: none) collapses its cards to 0x0 - that's not\n // a real resize, and persisting it would corrupt the saved layout the\n // next time this tab becomes visible again.\n if (w === 0 && h === 0) return\n onResizeRef.current?.(id, { width: Math.round(w), height: Math.round(h) })\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [id])\n\n return (\n <div\n ref={(node) => {\n cardRef.current = node\n registerRef?.(id, node)\n }}\n className={`card chart-card${isDragOver ? ' chart-card--drag-over' : ''}${isDragging ? ' chart-card--dragging' : ''}`}\n style={{ height, width, flex: '0 0 auto' }}\n draggable={draggable}\n onDragStart={draggable && onDragStart ? (e) => onDragStart(e, id) : undefined}\n onDragOver={\n draggable && onDragOver\n ? (e) => {\n e.preventDefault()\n onDragOver(id)\n }\n : undefined\n }\n onDrop={\n draggable && onDrop\n ? (e) => {\n e.preventDefault()\n onDrop(id)\n }\n : undefined\n }\n onDragEnd={draggable && onDragEnd ? onDragEnd : undefined}\n >\n <h2 className=\"chart-card__title\">\n {draggable && (\n <span className=\"chart-card__handle\" title=\"Drag to reorder\">\n <Icon name=\"drag-handle\" size={14} />\n </span>\n )}\n {title}\n <InfoTooltip text={info} />\n </h2>\n <div className=\"chart-card__body\">{children}</div>\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\n\nexport interface SelectOption {\n value: string\n label: ReactNode\n}\n\ninterface SelectBaseProps {\n options: SelectOption[]\n label?: string\n}\n\nexport interface SingleSelectProps extends SelectBaseProps {\n multiple?: false\n value: string\n onChange: (value: string) => void\n}\n\nexport interface MultiSelectProps extends SelectBaseProps {\n multiple: true\n value: string[]\n onChange: (value: string[]) => void\n}\n\nexport type SelectProps = SingleSelectProps | MultiSelectProps\n\n// A fully custom dropdown - native <select> option popups are an OS-level\n// overlay that CSS can't restyle in most browsers, so the whole menu is\n// built here as regular themed DOM instead.\n//\n// Single-select: value is a scalar, onChange(newValue), menu closes on pick.\n// Multi-select (multiple prop): value is an array, onChange(newArray), menu\n// stays open so several options can be toggled in one pass. The first option\n// is treated as an \"all\" clear-state: picking it deselects everything else,\n// and picking anything else drops it.\nexport default function Select(props: SelectProps) {\n const { options, label, multiple = false } = props\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const allValue = options[0]?.value\n const selectedValues = props.multiple ? props.value : [props.value]\n\n const triggerLabel = (): ReactNode => {\n if (!props.multiple) return options.find((o) => o.value === props.value)?.label ?? props.value\n const value = props.value\n if (!value.length || value.includes(allValue as string)) return options[0]?.label\n if (value.length === 1) return options.find((o) => o.value === value[0])?.label ?? value[0]\n return `${value.length} selected`\n }\n\n const toggle = (optionValue: string) => {\n if (!props.multiple) {\n props.onChange(optionValue)\n setOpen(false)\n return\n }\n if (optionValue === allValue) {\n props.onChange([allValue as string])\n return\n }\n const withoutAll = props.value.filter((v) => v !== allValue)\n const next = withoutAll.includes(optionValue)\n ? withoutAll.filter((v) => v !== optionValue)\n : [...withoutAll, optionValue]\n props.onChange(next.length ? next : [allValue as string])\n }\n\n return (\n <div className=\"select\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"select__trigger\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-label={label}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{triggerLabel()}</span>\n <span className=\"select__chevron\" aria-hidden=\"true\" />\n </button>\n {open && (\n <ul className=\"select__menu\" role=\"listbox\" aria-multiselectable={multiple} aria-label={label}>\n {options.map((o) => {\n const isSelected = selectedValues.includes(o.value)\n return (\n <li\n key={o.value}\n role=\"option\"\n aria-selected={isSelected}\n className={`select__option${isSelected ? ' select__option--selected' : ''}${multiple ? ' select__option--multi' : ''}`}\n onClick={() => toggle(o.value)}\n >\n {multiple && <span className={`select__checkbox${isSelected ? ' select__checkbox--checked' : ''}`} aria-hidden=\"true\" />}\n {o.label}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport Icon from './Icon'\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nfunction parseISO(iso?: string | null): Date | null {\n if (!iso) return null\n const [y, m, d] = iso.split('-').map(Number)\n if (y === undefined || m === undefined || d === undefined) return null\n return new Date(y, m - 1, d)\n}\n\nfunction toISO(date: Date): string {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n}\n\nfunction formatShort(iso?: string | null): string {\n const date = parseISO(iso)\n if (!date) return ''\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${m}/${d}/${date.getFullYear()}`\n}\n\nexport interface DateRangePickerProps {\n from?: string | null\n to?: string | null\n min?: string | null\n max?: string | null\n onChange: (from: string, to: string) => void\n label?: string\n}\n\n// A single-trigger date-range picker (replaces separate From/To pickers).\n// First click sets the range start, second click sets the end (swapping if\n// picked out of order); the in-between days get a light \"in range\" fill.\nexport default function DateRangePicker({ from, to, min, max, onChange, label = 'Date range' }: DateRangePickerProps) {\n const [open, setOpen] = useState(false)\n const [pendingStart, setPendingStart] = useState<Date | null>(null)\n const fromDate = parseISO(from)\n const toDate = parseISO(to)\n const minDate = parseISO(min)\n const maxDate = parseISO(max)\n const [viewDate, setViewDate] = useState<Date>(() => fromDate ?? new Date())\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (open) {\n setViewDate(fromDate ?? new Date())\n setPendingStart(null)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const firstWeekday = new Date(year, month, 1).getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < firstWeekday; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n\n const isDisabled = (date: Date) => Boolean((minDate && date < minDate) || (maxDate && date > maxDate))\n const rangeStart = pendingStart ?? fromDate\n const rangeEnd = pendingStart ? null : toDate\n const isStart = (date: Date) => Boolean(rangeStart && date.toDateString() === rangeStart.toDateString())\n const isEnd = (date: Date) => Boolean(rangeEnd && date.toDateString() === rangeEnd.toDateString())\n const isInRange = (date: Date) => Boolean(rangeStart && rangeEnd && date > rangeStart && date < rangeEnd)\n const isToday = (date: Date) => date.toDateString() === new Date().toDateString()\n\n const goMonth = (delta: number) => setViewDate(new Date(year, month + delta, 1))\n\n const pick = (date: Date) => {\n if (!pendingStart) {\n setPendingStart(date)\n return\n }\n let start = pendingStart\n let end = date\n if (end < start) [start, end] = [end, start]\n onChange(toISO(start), toISO(end))\n setPendingStart(null)\n setOpen(false)\n }\n\n return (\n <div className=\"datepicker\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"select__trigger datepicker__trigger--range\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={label}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{formatShort(from)} – {formatShort(to)}</span>\n <span className=\"datepicker__icon\" aria-hidden=\"true\" />\n </button>\n {open && (\n <div className=\"datepicker__panel\" role=\"dialog\" aria-label={label}>\n <div className=\"datepicker__header\">\n <button type=\"button\" className=\"datepicker__nav\" onClick={() => goMonth(-1)} aria-label=\"Previous month\"><Icon name=\"chevron-left\" size={14} /></button>\n <span className=\"datepicker__title\">{MONTH_NAMES[month]} {year}</span>\n <button type=\"button\" className=\"datepicker__nav\" onClick={() => goMonth(1)} aria-label=\"Next month\"><Icon name=\"chevron-right\" size={14} /></button>\n </div>\n <p className=\"datepicker__hint\">{pendingStart ? 'Pick the end date' : 'Pick the start date'}</p>\n <div className=\"datepicker__weekdays\">\n {WEEKDAYS.map((w) => (\n <span key={w}>{w}</span>\n ))}\n </div>\n <div className=\"datepicker__grid\">\n {cells.map((date, i) =>\n date ? (\n <button\n key={i}\n type=\"button\"\n disabled={isDisabled(date)}\n className={[\n 'datepicker__day',\n (isStart(date) || isEnd(date)) && 'datepicker__day--selected',\n isInRange(date) && 'datepicker__day--in-range',\n isToday(date) && 'datepicker__day--today',\n ].filter(Boolean).join(' ')}\n onClick={() => pick(date)}\n >\n {date.getDate()}\n </button>\n ) : (\n <span key={i} />\n )\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface Tab {\n id: string\n label: ReactNode\n comingSoon?: boolean\n}\n\nexport interface TabsProps {\n tabs: Tab[]\n active: string\n onChange: (id: string) => void\n}\n\nexport default function Tabs({ tabs, active, onChange }: TabsProps) {\n return (\n <div className=\"tabs\" role=\"tablist\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n role=\"tab\"\n aria-selected={active === tab.id}\n disabled={tab.comingSoon}\n className={`tab${active === tab.id ? ' tab--active' : ''}`}\n onClick={() => !tab.comingSoon && onChange(tab.id)}\n >\n {tab.label}\n {tab.comingSoon && <span className=\"tab__badge\">Soon</span>}\n </button>\n ))}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes } from 'react'\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger'\n size?: 'sm' | 'md'\n}\n\nexport default function Button({\n children,\n variant = 'primary',\n size = 'md',\n type = 'button',\n disabled = false,\n onClick,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type={type}\n disabled={disabled}\n onClick={onClick}\n className={`btn btn--${variant}${size === 'sm' ? ' btn--sm' : ''}`}\n {...rest}\n >\n {children}\n </button>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport type BadgeTone = 'neutral' | 'blue' | 'teal' | 'purple' | 'orange' | 'red' | 'green'\n\nexport interface BadgeProps {\n children: ReactNode\n tone?: BadgeTone\n dot?: boolean\n}\n\n// Small status pill. `tone` picks the pastel background/text pair; `dot`\n// prepends a filled circle (e.g. for live/online indicators).\nexport default function Badge({ children, tone = 'neutral', dot = false }: BadgeProps) {\n return (\n <span className={`badge${tone !== 'neutral' ? ` badge--${tone}` : ''}`}>\n {dot && <span className=\"badge__dot\" aria-hidden=\"true\" />}\n {children}\n </span>\n )\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'id'> {\n label?: ReactNode\n value: string\n onChange: (value: string) => void\n error?: boolean\n hint?: ReactNode\n id?: string\n}\n\n// Plain themed text field with an optional label and hint/error line.\n// `error` shows the hint (if any) in the error tone and gives the input an\n// error border, independent of whether `hint` is also passed.\nexport default function Input({\n label,\n value,\n onChange,\n type = 'text',\n placeholder,\n disabled = false,\n error = false,\n hint,\n id,\n ...rest\n}: InputProps) {\n const generatedId = useId()\n const inputId = id ?? generatedId\n\n return (\n <div className={`field${error ? ' field--error' : ''}`}>\n {label && <label className=\"field__label\" htmlFor={inputId}>{label}</label>}\n <input\n id={inputId}\n className=\"field__input\"\n type={type}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || undefined}\n {...rest}\n />\n {hint && <span className=\"field__hint\">{hint}</span>}\n </div>\n )\n}\n","import { useId, type ReactNode } from 'react'\n\nexport interface SwitchProps {\n checked: boolean\n onChange: (checked: boolean) => void\n label?: ReactNode\n disabled?: boolean\n}\n\n// Themed toggle switch. The native checkbox stays in the DOM (visually\n// hidden) so keyboard/screen-reader behavior comes for free.\nexport default function Switch({ checked, onChange, label, disabled = false }: SwitchProps) {\n const inputId = useId()\n\n return (\n <label\n htmlFor={inputId}\n className={`switch${checked ? ' switch--checked' : ''}${disabled ? ' switch--disabled' : ''}`}\n >\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"switch__input\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n <span className=\"switch__control\" aria-hidden=\"true\" />\n {label && <span className=\"switch__label\">{label}</span>}\n </label>\n )\n}\n","import type { Key, ReactNode } from 'react'\n\nexport interface TableColumn<T> {\n key: string\n header: ReactNode\n align?: 'left' | 'right'\n render?: (row: T) => ReactNode\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[]\n rows: T[]\n getRowKey?: (row: T) => Key\n onRowClick?: (row: T) => void\n emptyMessage?: ReactNode\n}\n\n// Plain themed data table. `columns`: [{ key, header, align, render }].\n// `rows`: array of plain objects keyed by column `key`. `getRowKey` defaults\n// to row index.\nexport default function Table<T extends Record<string, unknown>>({\n columns,\n rows,\n getRowKey,\n onRowClick,\n emptyMessage = 'No data',\n}: TableProps<T>) {\n return (\n <div className=\"nl-table-wrap\">\n <table className={`nl-table${onRowClick ? ' nl-table--hoverable' : ''}`}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key} data-align={col.align}>{col.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td className=\"nl-table__empty\" colSpan={columns.length}>{emptyMessage}</td>\n </tr>\n )}\n {rows.map((row, i) => (\n <tr key={getRowKey ? getRowKey(row) : i} onClick={() => onRowClick?.(row)}>\n {columns.map((col) => (\n <td key={col.key} data-align={col.align}>\n {col.render ? col.render(row) : (row[col.key] as ReactNode)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport Icon from './Icon'\n\nexport interface ModalProps {\n open: boolean\n onClose?: () => void\n title?: ReactNode\n children: ReactNode\n footer?: ReactNode\n size?: 'sm' | 'md' | 'lg'\n}\n\n// Centered dialog rendered via portal so it stacks above any app layout\n// (ChartCard drag/resize, sticky headers, etc.) without z-index tuning.\n// Closes on Escape or a click on the backdrop; the dialog itself stops that\n// click from bubbling to the backdrop.\nexport default function Modal({ open, onClose, title, children, footer, size = 'md' }: ModalProps) {\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose?.()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"modal-backdrop\" onMouseDown={() => onClose?.()}>\n <div\n className={`modal modal--${size}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title && (\n <div className=\"modal__header\">\n <h2 className=\"modal__title\">{title}</h2>\n <button type=\"button\" className=\"modal__close\" aria-label=\"Close\" onClick={() => onClose?.()}>\n <Icon name=\"close\" size={16} />\n </button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body,\n )\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport type { BadgeTone } from './Badge'\nimport Icon from './Icon'\n\nexport interface ToastOptions {\n tone?: BadgeTone\n duration?: number\n}\n\nexport interface ToastContextValue {\n show: (message: ReactNode, options?: ToastOptions) => number\n dismiss: (id: number) => void\n}\n\ninterface ToastEntry {\n id: number\n message: ReactNode\n tone: BadgeTone\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nlet idCounter = 0\n\n// Wrap the app once (e.g. alongside installCharts, at the top of main.jsx)\n// to get a `show(message, opts)` toast function anywhere via useToast().\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastEntry[]>([])\n const timers = useRef(new Map<number, ReturnType<typeof setTimeout>>())\n\n const dismiss = useCallback((id: number) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n const timer = timers.current.get(id)\n if (timer) clearTimeout(timer)\n timers.current.delete(id)\n }, [])\n\n const show = useCallback((message: ReactNode, { tone = 'neutral', duration = 4000 }: ToastOptions = {}) => {\n const id = (idCounter += 1)\n setToasts((prev) => [...prev, { id, message, tone }])\n if (duration > 0) {\n const timer = setTimeout(() => dismiss(id), duration)\n timers.current.set(id, timer)\n }\n return id\n }, [dismiss])\n\n return (\n <ToastContext.Provider value={{ show, dismiss }}>\n {children}\n {createPortal(\n <div className=\"toast-stack\" role=\"status\" aria-live=\"polite\">\n {toasts.map((t) => (\n <div key={t.id} className={`toast${t.tone !== 'neutral' ? ` toast--${t.tone}` : ''}`}>\n <span className=\"toast__message\">{t.message}</span>\n <button type=\"button\" className=\"toast__close\" aria-label=\"Dismiss\" onClick={() => dismiss(t.id)}>\n <Icon name=\"close\" size={14} />\n </button>\n </div>\n ))}\n </div>,\n document.body,\n )}\n </ToastContext.Provider>\n )\n}\n\n// Returns { show(message, { tone, duration }), dismiss(id) }. `tone` is one\n// of neutral/blue/teal/purple/orange/red/green (same tones as Badge).\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext)\n if (!ctx) throw new Error('useToast must be used within a ToastProvider')\n return ctx\n}\n","import { useId, type ReactNode } from 'react'\n\nexport interface CheckboxProps {\n checked: boolean\n onChange: (checked: boolean) => void\n label?: ReactNode\n disabled?: boolean\n}\n\n// Standalone checkbox (Select has its own embedded one for multi-mode menus).\n// The native input stays in the DOM (visually hidden) for free keyboard/SR\n// behavior; the visible box is themed CSS driven by :checked.\nexport default function Checkbox({ checked, onChange, label, disabled = false }: CheckboxProps) {\n const inputId = useId()\n\n return (\n <label htmlFor={inputId} className={`checkbox${disabled ? ' checkbox--disabled' : ''}`}>\n <input\n id={inputId}\n type=\"checkbox\"\n className=\"checkbox__input\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n <span className=\"checkbox__box\" aria-hidden=\"true\" />\n {label && <span className=\"checkbox__label\">{label}</span>}\n </label>\n )\n}\n","import { useId, type ReactNode } from 'react'\n\nexport interface RadioProps {\n name: string\n value: string\n checked: boolean\n onChange: (value: string) => void\n label?: ReactNode\n disabled?: boolean\n}\n\n// A single themed radio. Group several under one `name` and shared\n// value/onChange to build a radio group - see RadioGroup for the common case.\nexport function Radio({ name, value, checked, onChange, label, disabled = false }: RadioProps) {\n const inputId = useId()\n\n return (\n <label htmlFor={inputId} className={`radio${disabled ? ' radio--disabled' : ''}`}>\n <input\n id={inputId}\n type=\"radio\"\n name={name}\n className=\"radio__input\"\n checked={checked}\n disabled={disabled}\n onChange={() => onChange?.(value)}\n />\n <span className=\"radio__dot\" aria-hidden=\"true\" />\n {label && <span className=\"radio__label\">{label}</span>}\n </label>\n )\n}\n\nexport interface RadioOption {\n value: string\n label?: ReactNode\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n name: string\n value: string\n onChange: (value: string) => void\n options: RadioOption[]\n disabled?: boolean\n}\n\nexport default function RadioGroup({ name, value, onChange, options, disabled = false }: RadioGroupProps) {\n return (\n <div className=\"radio-group\" role=\"radiogroup\">\n {options.map((o) => (\n <Radio\n key={o.value}\n name={name}\n value={o.value}\n checked={value === o.value}\n onChange={onChange}\n label={o.label}\n disabled={disabled || o.disabled}\n />\n ))}\n </div>\n )\n}\n","import { useId, type ReactNode, type TextareaHTMLAttributes } from 'react'\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange' | 'value' | 'id'> {\n label?: ReactNode\n value: string\n onChange: (value: string) => void\n error?: boolean\n hint?: ReactNode\n id?: string\n}\n\n// Multi-line counterpart to Input - same label/hint/error shape.\nexport default function Textarea({\n label,\n value,\n onChange,\n placeholder,\n disabled = false,\n error = false,\n hint,\n rows = 4,\n id,\n ...rest\n}: TextareaProps) {\n const generatedId = useId()\n const inputId = id ?? generatedId\n\n return (\n <div className={`field${error ? ' field--error' : ''}`}>\n {label && <label className=\"field__label\" htmlFor={inputId}>{label}</label>}\n <textarea\n id={inputId}\n className=\"field__input field__input--textarea\"\n rows={rows}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || undefined}\n {...rest}\n />\n {hint && <span className=\"field__hint\">{hint}</span>}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\n\nexport interface SkeletonProps {\n variant?: 'text' | 'circle' | 'rect'\n width?: CSSProperties['width']\n height?: CSSProperties['height']\n radius?: CSSProperties['borderRadius']\n}\n\n// Content-shaped loading placeholder. `variant` picks the base shape:\n// 'text' (a line, defaults to font-height), 'circle' (avatar/icon), or\n// 'rect' (card/image block) - width/height override the defaults for any.\nexport default function Skeleton({ variant = 'text', width, height, radius }: SkeletonProps) {\n const style: CSSProperties = {\n width: width ?? (variant === 'circle' ? 32 : '100%'),\n height: height ?? (variant === 'circle' ? 32 : variant === 'rect' ? 120 : 14),\n borderRadius: radius ?? (variant === 'circle' ? '50%' : variant === 'rect' ? 8 : 4),\n }\n\n return <span className=\"skeleton\" style={style} aria-hidden=\"true\" />\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport Icon from './Icon'\n\nexport interface MenuItem {\n label: string\n onClick?: () => void\n danger?: boolean\n disabled?: boolean\n}\n\nexport interface MenuProps {\n items: MenuItem[]\n label?: string\n trigger?: ReactNode\n}\n\n// A lightweight popover action list - e.g. a kebab menu for Table row\n// actions - distinct from Select, which is a full listbox for picking a\n// value. items: [{ label, onClick, danger, disabled }].\nexport default function Menu({ items, label = 'Actions', trigger }: MenuProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n return (\n <div className=\"menu\" ref={rootRef}>\n {trigger ? (\n <span onClick={() => setOpen((v) => !v)}>{trigger}</span>\n ) : (\n <button\n type=\"button\"\n className=\"menu__kebab\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={label}\n onClick={() => setOpen((v) => !v)}\n >\n <Icon name=\"kebab\" size={16} />\n </button>\n )}\n {open && (\n <ul className=\"menu__list\" role=\"menu\" aria-label={label}>\n {items.map((item) => (\n <li key={item.label} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n className={`menu__item${item.danger ? ' menu__item--danger' : ''}`}\n onClick={() => {\n setOpen(false)\n item.onClick?.()\n }}\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","import Icon from './Icon'\n\n// Page-number list with prev/next, collapsing to ellipses once pageCount\n// grows past what's worth spelling out in full (always shows first, last,\n// current, and a neighbor on each side).\nfunction pageList(page: number, pageCount: number): (number | string)[] {\n const pages = new Set([1, pageCount, page, page - 1, page + 1])\n return [...pages]\n .filter((p) => p >= 1 && p <= pageCount)\n .sort((a, b) => a - b)\n .reduce<(number | string)[]>((acc, p, i, arr) => {\n const prev = arr[i - 1]\n if (i > 0 && prev !== undefined && p - prev > 1) acc.push('ellipsis-' + p)\n acc.push(p)\n return acc\n }, [])\n}\n\nexport interface PaginationProps {\n page: number\n pageCount: number\n onChange: (page: number) => void\n}\n\nexport default function Pagination({ page, pageCount, onChange }: PaginationProps) {\n if (pageCount <= 1) return null\n const pages = pageList(page, pageCount)\n\n return (\n <nav className=\"pagination\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n className=\"pagination__nav\"\n disabled={page <= 1}\n onClick={() => onChange(page - 1)}\n aria-label=\"Previous page\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </button>\n {pages.map((p) =>\n typeof p === 'number' ? (\n <button\n key={p}\n type=\"button\"\n className={`pagination__page${p === page ? ' pagination__page--active' : ''}`}\n aria-current={p === page ? 'page' : undefined}\n onClick={() => onChange(p)}\n >\n {p}\n </button>\n ) : (\n <span key={p} className=\"pagination__ellipsis\">…</span>\n ),\n )}\n <button\n type=\"button\"\n className=\"pagination__nav\"\n disabled={page >= pageCount}\n onClick={() => onChange(page + 1)}\n aria-label=\"Next page\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </button>\n </nav>\n )\n}\n","export interface BreadcrumbItem {\n label: string\n onClick?: () => void\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[]\n}\n\n// items: [{ label, onClick }] - the last item renders as plain (current\n// page) text; every earlier one renders as a clickable crumb.\nexport default function Breadcrumbs({ items }: BreadcrumbsProps) {\n return (\n <nav className=\"breadcrumbs\" aria-label=\"Breadcrumb\">\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n return (\n <span key={item.label} className=\"breadcrumbs__item\">\n {isLast ? (\n <span className=\"breadcrumbs__current\" aria-current=\"page\">{item.label}</span>\n ) : (\n <button type=\"button\" className=\"breadcrumbs__link\" onClick={item.onClick}>\n {item.label}\n </button>\n )}\n {!isLast && <span className=\"breadcrumbs__sep\" aria-hidden=\"true\">/</span>}\n </span>\n )\n })}\n </nav>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { BadgeTone } from './Badge'\n\nexport interface ProgressBarProps {\n value: number\n max?: number\n tone?: Exclude<BadgeTone, 'neutral'>\n label?: ReactNode\n}\n\n// Linear progress/quota bar. value/max define the fill percentage; `tone`\n// picks the fill color (same tones as Badge). `label` renders a caption row\n// with the value shown as a percentage on the right.\nexport default function ProgressBar({ value, max = 100, tone = 'blue', label }: ProgressBarProps) {\n const pct = Math.max(0, Math.min(100, (value / max) * 100))\n\n return (\n <div className=\"progress\">\n {label && (\n <div className=\"progress__label-row\">\n <span className=\"progress__label\">{label}</span>\n <span className=\"progress__value\">{Math.round(pct)}%</span>\n </div>\n )}\n <div className=\"progress__track\" role=\"progressbar\" aria-valuenow={value} aria-valuemin={0} aria-valuemax={max}>\n <div className={`progress__fill progress__fill--${tone}`} style={{ width: `${pct}%` }} />\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { BadgeTone } from './Badge'\n\nexport interface GaugeProps {\n value: number\n max?: number\n tone?: Exclude<BadgeTone, 'neutral'>\n size?: number\n label?: ReactNode\n}\n\n// Circular counterpart to ProgressBar - a ring plus the value/label centered\n// inside it. Pure SVG, no library, sized via `size`.\nexport default function Gauge({ value, max = 100, tone = 'blue', size = 96, label }: GaugeProps) {\n const pct = Math.max(0, Math.min(100, (value / max) * 100))\n const strokeWidth = size * 0.1\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference * (1 - pct / 100)\n\n return (\n <div className=\"gauge\" style={{ width: size, height: size }}>\n <svg viewBox={`0 0 ${size} ${size}`} width={size} height={size}>\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"var(--neutral-100)\"\n strokeWidth={strokeWidth}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={`var(--chart-${tone})`}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n <div className=\"gauge__center\">\n <span className=\"gauge__value\">{Math.round(pct)}%</span>\n {label && <span className=\"gauge__label\">{label}</span>}\n </div>\n </div>\n )\n}\n","import type { BadgeTone } from './Badge'\n\ntype AvatarTone = Exclude<BadgeTone, 'neutral'>\n\nconst TONES: AvatarTone[] = ['blue', 'teal', 'purple', 'orange', 'red', 'green']\n\n// Deterministic tone from the name, so the same person always gets the same\n// color without needing a `tone` prop passed in from data.\nfunction toneFor(name: string): AvatarTone {\n const sum = [...name].reduce((acc, ch) => acc + ch.charCodeAt(0), 0)\n return TONES[sum % TONES.length] as AvatarTone\n}\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n const first = parts[0] ?? ''\n if (parts.length === 1) return first.slice(0, 2).toUpperCase()\n const last = parts[parts.length - 1] ?? ''\n return (first[0] ?? '') .concat(last[0] ?? '').toUpperCase()\n}\n\nexport interface AvatarProps {\n name?: string\n src?: string\n size?: number\n tone?: AvatarTone\n}\n\n// Renders `src` if given, otherwise a pastel initials badge derived from\n// `name`. `size` is the diameter in px.\nexport default function Avatar({ name, src, size = 32, tone }: AvatarProps) {\n const resolvedTone = tone ?? toneFor(name ?? '')\n const style = { width: size, height: size, fontSize: Math.round(size * 0.4) }\n\n if (src) {\n return <img className=\"avatar\" style={style} src={src} alt={name ?? ''} />\n }\n\n return (\n <span className={`avatar avatar--${resolvedTone}`} style={style} title={name}>\n {name ? initials(name) : '?'}\n </span>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface CardProps {\n title?: ReactNode\n children: ReactNode\n className?: string\n}\n\n// Plain flat card - the same surface ScoreCard/ChartCard build on, exposed\n// directly for anything that just needs a bordered white/dark panel.\nexport default function Card({ title, children, className }: CardProps) {\n return (\n <div className={`card${className ? ` ${className}` : ''}`}>\n {title && <h2>{title}</h2>}\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface EmptyStateProps {\n icon?: ReactNode\n title: ReactNode\n description?: ReactNode\n action?: ReactNode\n}\n\n// Centered placeholder for a zero-data view (empty table, no results, etc).\nexport default function EmptyState({ icon, title, description, action }: EmptyStateProps) {\n return (\n <div className=\"empty-state\">\n {icon && <div className=\"empty-state__icon\">{icon}</div>}\n <h2>{title}</h2>\n {description && <p>{description}</p>}\n {action}\n </div>\n )\n}\n","export interface SpinnerProps {\n size?: number\n label?: string\n}\n\n// Small themed loading spinner. `label` is read by screen readers only -\n// visually the spinner speaks for itself.\nexport default function Spinner({ size = 32, label = 'Loading' }: SpinnerProps) {\n return <span className=\"spinner\" role=\"status\" aria-label={label} style={{ width: size, height: size }} />\n}\n","import { useState, type ReactNode } from 'react'\n\nexport interface AccordionItem {\n id: string\n title: ReactNode\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Controlled: which item ids are open. Omit to let Accordion manage its own state. */\n openIds?: string[]\n onChange?: (openIds: string[]) => void\n /** Allow more than one section open at once. Default: false (single-open). */\n allowMultiple?: boolean\n defaultOpenIds?: string[]\n}\n\n// Expandable section list. Uncontrolled by default (pass defaultOpenIds to\n// seed it); pass openIds + onChange to control it from outside.\nexport default function Accordion({\n items,\n openIds,\n onChange,\n allowMultiple = false,\n defaultOpenIds = [],\n}: AccordionProps) {\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultOpenIds)\n const open = openIds ?? internalOpen\n\n const toggle = (id: string) => {\n const isOpen = open.includes(id)\n const next = isOpen\n ? open.filter((i) => i !== id)\n : allowMultiple\n ? [...open, id]\n : [id]\n onChange ? onChange(next) : setInternalOpen(next)\n }\n\n return (\n <div className=\"accordion\">\n {items.map((item) => {\n const isOpen = open.includes(item.id)\n return (\n <div key={item.id} className={`accordion__item${isOpen ? ' accordion__item--open' : ''}`}>\n <button\n type=\"button\"\n className=\"accordion__header\"\n aria-expanded={isOpen}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n >\n <span className=\"accordion__chevron\" aria-hidden=\"true\" />\n {item.title}\n </button>\n {isOpen && <div className=\"accordion__panel\">{item.content}</div>}\n </div>\n )\n })}\n </div>\n )\n}\n","export interface SegmentedOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface SegmentedControlProps {\n options: SegmentedOption[]\n value: string\n onChange: (value: string) => void\n label?: string\n}\n\n// A button-group toggle for a small, always-visible set of mutually\n// exclusive options - lighter weight than Tabs (no content-panel switching\n// semantics, just a single value).\nexport default function SegmentedControl({ options, value, onChange, label = 'Options' }: SegmentedControlProps) {\n return (\n <div className=\"segmented\" role=\"radiogroup\" aria-label={label}>\n {options.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={o.value === value}\n disabled={o.disabled}\n className={`segmented__option${o.value === value ? ' segmented__option--active' : ''}`}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n </button>\n ))}\n </div>\n )\n}\n","export interface ChartLegendItem {\n label: string\n color: string\n}\n\nexport interface ChartLegendProps {\n items: ChartLegendItem[]\n hidden?: string[]\n onToggle?: (label: string) => void\n}\n\n// A themed HTML legend to pair with a Chart.js canvas whose own legend is\n// switched off (`legend: { display: false }` in the chart's options) -\n// canvas-drawn legends can't pick up hover/focus styling or the rest of the\n// component kit's interaction language. Click a swatch to toggle a series\n// (wire `onToggle` to `chart.setDatasetVisibility` + `chart.update()`).\nexport default function ChartLegend({ items, hidden = [], onToggle }: ChartLegendProps) {\n return (\n <ul className=\"chart-legend\" role=\"list\">\n {items.map((item) => {\n const isHidden = hidden.includes(item.label)\n return (\n <li key={item.label}>\n <button\n type=\"button\"\n className={`chart-legend__item${isHidden ? ' chart-legend__item--hidden' : ''}${onToggle ? '' : ' chart-legend__item--static'}`}\n onClick={onToggle ? () => onToggle(item.label) : undefined}\n disabled={!onToggle}\n >\n <span className=\"chart-legend__swatch\" style={{ background: item.color }} aria-hidden=\"true\" />\n {item.label}\n </button>\n </li>\n )\n })}\n </ul>\n )\n}\n","export interface MiniBarProps {\n data?: number[]\n color?: string\n height?: number\n}\n\n// Minimal inline SVG bar sparkline - the bar-chart counterpart to Sparkline,\n// same no-axes/no-library approach for a compact inline trend.\nexport default function MiniBar({ data, color = '#8FB4F5', height = 36 }: MiniBarProps) {\n if (!data || data.length === 0) return null\n\n const width = 200\n const max = Math.max(...data, 0) || 1\n const gap = 2\n const barWidth = width / data.length - gap\n\n return (\n <svg className=\"score-card__sparkline\" viewBox={`0 0 ${width} ${height}`} preserveAspectRatio=\"none\">\n {data.map((v, i) => {\n const barHeight = Math.max((v / max) * height, 1)\n const x = i * (barWidth + gap)\n const y = height - barHeight\n return <rect key={i} x={x} y={y} width={barWidth} height={barHeight} fill={color} rx={1} />\n })}\n </svg>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { BadgeTone } from './Badge'\n\nexport interface BulletChartProps {\n value: number\n target: number\n max?: number\n tone?: Exclude<BadgeTone, 'neutral'>\n label?: ReactNode\n}\n\n// A compact bullet graph: a filled bar for the actual value plus a tick mark\n// for the target, in one horizontal track - reads a target-vs-actual\n// comparison (quota attainment, SLA target, etc) faster than a bare\n// ProgressBar since the target is a mark on the same scale, not a separate\n// number.\nexport default function BulletChart({ value, target, max, tone = 'blue', label }: BulletChartProps) {\n const scaleMax = max ?? (Math.max(value, target) * 1.2 || 1)\n const valuePct = Math.max(0, Math.min(100, (value / scaleMax) * 100))\n const targetPct = Math.max(0, Math.min(100, (target / scaleMax) * 100))\n\n return (\n <div className=\"bullet\">\n {label && (\n <div className=\"bullet__label-row\">\n <span className=\"progress__label\">{label}</span>\n <span className=\"progress__value\">{value} / {target}</span>\n </div>\n )}\n <div className=\"bullet__track\">\n <div className={`bullet__fill bullet__fill--${tone}`} style={{ width: `${valuePct}%` }} />\n <div className=\"bullet__target\" style={{ left: `${targetPct}%` }} />\n </div>\n </div>\n )\n}\n","import { useId, type ReactNode } from 'react'\n\nexport interface SliderProps {\n value: number\n onChange: (value: number) => void\n min?: number\n max?: number\n step?: number\n label?: ReactNode\n disabled?: boolean\n /** Formats the value shown next to the label, e.g. `(v) => `${v}%`` */\n formatValue?: (value: number) => ReactNode\n}\n\n// Themed range slider - stays a native <input type=\"range\"> (styled via\n// ::-webkit-slider-thumb/::-moz-range-thumb in theme.css) rather than a\n// from-scratch drag implementation, so keyboard/touch behavior comes free.\nexport default function Slider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n disabled = false,\n formatValue,\n}: SliderProps) {\n const inputId = useId()\n const pct = ((value - min) / (max - min || 1)) * 100\n\n return (\n <div className=\"field\">\n {label && (\n <div className=\"progress__label-row\">\n <label className=\"field__label\" htmlFor={inputId}>{label}</label>\n <span className=\"progress__value\">{formatValue ? formatValue(value) : value}</span>\n </div>\n )}\n <input\n id={inputId}\n type=\"range\"\n className=\"slider\"\n style={{ ['--slider-fill' as string]: `${pct}%` }}\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onChange={(e) => onChange(Number(e.target.value))}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport Icon from './Icon'\n\nexport interface StepperStep {\n id: string\n label: ReactNode\n}\n\nexport interface StepperProps {\n steps: StepperStep[]\n activeId: string\n completedIds?: string[]\n}\n\n// Horizontal multi-step progress indicator (wizard/setup flows) - purely\n// presentational, pair it with your own step-switching state.\nexport default function Stepper({ steps, activeId, completedIds = [] }: StepperProps) {\n const activeIndex = steps.findIndex((s) => s.id === activeId)\n\n return (\n <div className=\"stepper\" role=\"list\">\n {steps.map((step, i) => {\n const isCompleted = completedIds.includes(step.id) || i < activeIndex\n const isActive = step.id === activeId\n\n return (\n <div\n key={step.id}\n role=\"listitem\"\n className={`stepper__step${isActive ? ' stepper__step--active' : ''}${isCompleted ? ' stepper__step--completed' : ''}`}\n >\n <span className=\"stepper__dot\" aria-hidden=\"true\">{isCompleted ? <Icon name=\"check\" size={13} /> : i + 1}</span>\n <span className=\"stepper__label\">{step.label}</span>\n {i < steps.length - 1 && <span className=\"stepper__connector\" aria-hidden=\"true\" />}\n </div>\n )\n })}\n </div>\n )\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport Icon from './Icon'\n\nexport interface DrawerProps {\n open: boolean\n onClose?: () => void\n title?: ReactNode\n children: ReactNode\n footer?: ReactNode\n side?: 'left' | 'right'\n width?: number\n}\n\n// Slide-in side panel - Modal's counterpart for content that reads better\n// anchored to an edge (filters, record detail, forms) than centered.\nexport default function Drawer({ open, onClose, title, children, footer, side = 'right', width = 380 }: DrawerProps) {\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose?.()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"drawer-backdrop\" onMouseDown={() => onClose?.()}>\n <div\n className={`drawer drawer--${side}`}\n style={{ width }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {title && (\n <div className=\"modal__header\">\n <h2 className=\"modal__title\">{title}</h2>\n <button type=\"button\" className=\"modal__close\" aria-label=\"Close\" onClick={() => onClose?.()}>\n <Icon name=\"close\" size={16} />\n </button>\n </div>\n )}\n <div className=\"drawer__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body,\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\n\nexport interface PopoverProps {\n trigger: ReactNode\n children: ReactNode\n label?: string\n align?: 'left' | 'right'\n}\n\n// A generic anchored popover - same click-outside/Escape mechanics as Menu,\n// but holds arbitrary content instead of a fixed action list.\nexport default function Popover({ trigger, children, label = 'More', align = 'left' }: PopoverProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n return (\n <div className=\"popover\" ref={rootRef}>\n <span onClick={() => setOpen((v) => !v)}>{trigger}</span>\n {open && (\n <div className={`popover__panel popover__panel--${align}`} role=\"dialog\" aria-label={label}>\n {children}\n </div>\n )}\n </div>\n )\n}\n","import { useId, useState, type KeyboardEvent } from 'react'\n\nexport interface TagInputProps {\n value: string[]\n onChange: (value: string[]) => void\n label?: string\n placeholder?: string\n disabled?: boolean\n}\n\n// Multi-value chip input - type and press Enter/comma to add a tag,\n// Backspace on an empty field removes the last one.\nexport default function TagInput({ value, onChange, label, placeholder = 'Add a tag...', disabled = false }: TagInputProps) {\n const [draft, setDraft] = useState('')\n const inputId = useId()\n\n const commit = () => {\n const tag = draft.trim()\n if (tag && !value.includes(tag)) onChange([...value, tag])\n setDraft('')\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault()\n commit()\n } else if (e.key === 'Backspace' && !draft && value.length) {\n onChange(value.slice(0, -1))\n }\n }\n\n const removeAt = (i: number) => onChange(value.filter((_, idx) => idx !== i))\n\n return (\n <div className=\"field\">\n {label && <label className=\"field__label\" htmlFor={inputId}>{label}</label>}\n <div className={`tag-input${disabled ? ' tag-input--disabled' : ''}`}>\n {value.map((tag, i) => (\n <span key={tag} className=\"tag-input__tag\">\n {tag}\n {!disabled && (\n <button type=\"button\" aria-label={`Remove ${tag}`} onClick={() => removeAt(i)}>×</button>\n )}\n </span>\n ))}\n <input\n id={inputId}\n className=\"tag-input__field\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={commit}\n placeholder={value.length ? '' : placeholder}\n disabled={disabled}\n />\n </div>\n </div>\n )\n}\n","export interface SearchInputProps {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n}\n\n// Text input with a leading search icon and a clear button that appears\n// once there's something to clear - the thing that sits above every Table.\nexport default function SearchInput({ value, onChange, placeholder = 'Search...', disabled = false }: SearchInputProps) {\n return (\n <div className=\"search-input\">\n <span className=\"search-input__icon\" aria-hidden=\"true\" />\n <input\n className=\"search-input__field\"\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n />\n {value && (\n <button type=\"button\" className=\"search-input__clear\" aria-label=\"Clear search\" onClick={() => onChange('')}>\n ×\n </button>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport Icon from './Icon'\n\nexport interface CopyButtonProps {\n text: string\n label?: string\n}\n\n// Icon button that copies `text` to the clipboard and shows brief \"Copied\"\n// feedback - pairs with IDs/API keys/URLs shown in a Table or Card.\nexport default function CopyButton({ text, label = 'Copy' }: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n\n const onClick = async () => {\n try {\n await navigator.clipboard.writeText(text)\n } catch {\n // Clipboard API can be unavailable (permissions, insecure context) -\n // fail silently rather than throwing in the caller's click handler.\n }\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n\n return (\n <button type=\"button\" className=\"copy-button\" aria-label={copied ? 'Copied' : label} onClick={onClick}>\n <Icon name={copied ? 'check' : 'copy'} size={14} />\n </button>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { BadgeTone } from './Badge'\n\nexport interface StatusDotProps {\n tone?: Exclude<BadgeTone, 'neutral'>\n label?: ReactNode\n pulse?: boolean\n}\n\n// A bare colored indicator dot, with an optional label - denser than Badge\n// for table cells/lists where a full pill would be too wide. `pulse` adds a\n// soft glow animation for a \"live\" state.\nexport default function StatusDot({ tone = 'green', label, pulse = false }: StatusDotProps) {\n return (\n <span className=\"status-dot\">\n <span className={`status-dot__dot status-dot__dot--${tone}${pulse ? ' status-dot__dot--pulse' : ''}`} aria-hidden=\"true\" />\n {label && <span className=\"status-dot__label\">{label}</span>}\n </span>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface DescriptionItem {\n label: ReactNode\n value: ReactNode\n}\n\nexport interface DescriptionListProps {\n items: DescriptionItem[]\n columns?: number\n}\n\n// Label/value pairs grid - detail panels, Drawer contents, record summaries.\nexport default function DescriptionList({ items, columns = 1 }: DescriptionListProps) {\n return (\n <dl className=\"description-list\" style={{ gridTemplateColumns: `repeat(${columns}, 1fr)` }}>\n {items.map((item, i) => (\n <div key={i} className=\"description-list__item\">\n <dt>{item.label}</dt>\n <dd>{item.value}</dd>\n </div>\n ))}\n </dl>\n )\n}\n","import type { ElementType, ReactNode } from 'react'\n\nexport interface TextProps {\n as?: 'p' | 'span' | 'div'\n size?: 'xs' | 'sm' | 'md' | 'lg'\n weight?: 'regular' | 'medium' | 'semibold' | 'bold'\n color?: 'default' | 'muted' | 'accent' | 'danger'\n mono?: boolean\n children: ReactNode\n className?: string\n}\n\n// Generic text primitive - the reusable base every other component's own\n// label/value text is a specific case of. Use this for arbitrary page copy\n// instead of hand-rolling font-family/size/color inline.\nexport default function Text({\n as = 'p',\n size = 'md',\n weight = 'regular',\n color = 'default',\n mono = false,\n children,\n className,\n}: TextProps) {\n const Tag = as as ElementType\n return (\n <Tag\n className={`nl-text nl-text--${size} nl-text--${weight} nl-text--${color}${mono ? ' nl-text--mono' : ''}${className ? ` ${className}` : ''}`}\n >\n {children}\n </Tag>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface HeadingProps {\n level?: 1 | 2 | 3 | 4\n children: ReactNode\n className?: string\n}\n\n// Generic heading primitive with Northline's display type scale - distinct\n// from ScoreCard/Card's own hardcoded h2 sizing, which stays as-is for those\n// specific components.\nexport default function Heading({ level = 2, children, className }: HeadingProps) {\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4'\n return <Tag className={`nl-heading nl-heading--${level}${className ? ` ${className}` : ''}`}>{children}</Tag>\n}\n","import type { ReactNode } from 'react'\n\nexport interface ContainerProps {\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n children: ReactNode\n className?: string\n}\n\n// Centered max-width content wrapper - the outermost layout primitive most\n// pages start from.\nexport default function Container({ size = 'lg', children, className }: ContainerProps) {\n return <div className={`nl-container nl-container--${size}${className ? ` ${className}` : ''}`}>{children}</div>\n}\n","import type { CSSProperties, ReactNode } from 'react'\n\nexport interface StackProps {\n direction?: 'row' | 'column'\n gap?: number\n align?: CSSProperties['alignItems']\n justify?: CSSProperties['justifyContent']\n wrap?: boolean\n children: ReactNode\n className?: string\n}\n\n// Flex layout primitive with a consistent gap - the reusable base behind\n// VStack/HStack, instead of hand-rolled `style={{ display: 'flex' }}`.\nexport default function Stack({ direction = 'column', gap = 12, align, justify, wrap = false, children, className }: StackProps) {\n return (\n <div\n className={`nl-stack${className ? ` ${className}` : ''}`}\n style={{\n display: 'flex',\n flexDirection: direction,\n gap,\n alignItems: align,\n justifyContent: justify,\n flexWrap: wrap ? 'wrap' : 'nowrap',\n }}\n >\n {children}\n </div>\n )\n}\n\nexport function VStack(props: Omit<StackProps, 'direction'>) {\n return <Stack {...props} direction=\"column\" />\n}\n\nexport function HStack(props: Omit<StackProps, 'direction'>) {\n return <Stack {...props} direction=\"row\" />\n}\n","import type { ReactNode } from 'react'\n\nexport interface GridProps {\n columns?: number\n gap?: number\n children: ReactNode\n className?: string\n}\n\n// Simple responsive-ish column grid - `columns` is the max column count on\n// a wide viewport; each column gets a min-width derived from it (assuming a\n// ~1200px container) so the grid wraps down on narrow viewports without\n// needing explicit breakpoints.\nexport default function Grid({ columns = 12, gap = 16, children, className }: GridProps) {\n const minColWidth = Math.max(120, Math.floor(1200 / columns))\n\n return (\n <div\n className={`nl-grid${className ? ` ${className}` : ''}`}\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(auto-fit, minmax(${minColWidth}px, 1fr))`,\n gap,\n }}\n >\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface DividerProps {\n orientation?: 'horizontal' | 'vertical'\n label?: ReactNode\n}\n\n// Plain visual separator - every gap in the kit was faking this with a raw\n// border-bottom; this is the reusable version, with an optional centered\n// label (e.g. \"OR\").\nexport default function Divider({ orientation = 'horizontal', label }: DividerProps) {\n if (orientation === 'vertical') return <span className=\"nl-divider nl-divider--vertical\" role=\"separator\" />\n if (!label) return <hr className=\"nl-divider\" />\n\n return (\n <div className=\"nl-divider--labeled\" role=\"separator\">\n <span className=\"nl-divider--labeled__line\" />\n <span className=\"nl-divider--labeled__text\">{label}</span>\n <span className=\"nl-divider--labeled__line\" />\n </div>\n )\n}\n","import type { AnchorHTMLAttributes, ReactNode } from 'react'\n\nexport interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className'> {\n children: ReactNode\n external?: boolean\n}\n\n// Themed anchor. `external` adds target=\"_blank\" + rel=\"noopener noreferrer\"\n// - for an SPA router Link, wrap that component's `as`/render-prop instead\n// of using this directly, or copy the \"nl-link\" className onto it.\nexport default function Link({ children, external = false, ...rest }: LinkProps) {\n return (\n <a\n className=\"nl-link\"\n {...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...rest}\n >\n {children}\n </a>\n )\n}\n","import type { ReactNode } from 'react'\nimport Icon, { type IconName } from './Icon'\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger'\n\nexport interface AlertProps {\n tone?: AlertTone\n title?: ReactNode\n children?: ReactNode\n onDismiss?: () => void\n}\n\nconst ICONS: Record<AlertTone, IconName> = { info: 'info', success: 'check', warning: 'warning', danger: 'close' }\n\n// Persistent inline status banner - distinct from Toast (transient,\n// floating) and Badge (a tiny pill). Use this for \"there's a warning sitting\n// in the page\" rather than a one-off notification.\nexport default function Alert({ tone = 'info', title, children, onDismiss }: AlertProps) {\n return (\n <div className={`alert alert--${tone}`} role={tone === 'danger' ? 'alert' : 'status'}>\n <span className=\"alert__icon\" aria-hidden=\"true\">\n <Icon name={ICONS[tone]} size={12} color=\"var(--neutral-0)\" />\n </span>\n <div className=\"alert__body\">\n {title && <div className=\"alert__title\">{title}</div>}\n {children && <div className=\"alert__message\">{children}</div>}\n </div>\n {onDismiss && (\n <button type=\"button\" className=\"alert__dismiss\" aria-label=\"Dismiss\" onClick={onDismiss}>\n <Icon name=\"close\" size={14} />\n </button>\n )}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\n\nexport interface IconButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {\n children: ReactNode\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger'\n size?: 'sm' | 'md'\n label: string\n}\n\n// Icon-only button - Button's square counterpart, with its own compact\n// padding (a plain Button with an icon child ends up with lopsided\n// horizontal padding). `label` is required and becomes aria-label since\n// there's no visible text.\nexport default function IconButton({ children, variant = 'ghost', size = 'md', label, ...rest }: IconButtonProps) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n className={`icon-button icon-button--${variant} icon-button--${size}`}\n {...rest}\n >\n {children}\n </button>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface TooltipProps {\n content: ReactNode\n children: ReactNode\n placement?: 'top' | 'bottom'\n}\n\n// Generic tooltip - wraps any single child element, shown on hover/focus of\n// that child. InfoTooltip is the fixed \"(i) icon\" special case of this;\n// reach for Tooltip when the trigger isn't that icon.\nexport default function Tooltip({ content, children, placement = 'top' }: TooltipProps) {\n return (\n <span className=\"tooltip-wrapper\">\n {children}\n <span className={`tooltip-wrapper__bubble tooltip-wrapper__bubble--${placement}`} role=\"tooltip\">\n {content}\n </span>\n </span>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface FieldsetProps {\n label?: ReactNode\n hint?: ReactNode\n error?: boolean\n htmlFor?: string\n children: ReactNode\n}\n\n// The label+hint+error chrome that Input/Textarea each bake in already -\n// reach for Fieldset when wrapping a custom or third-party control that\n// needs the same shape without reimplementing it.\nexport default function Fieldset({ label, hint, error = false, htmlFor, children }: FieldsetProps) {\n return (\n <div className={`field${error ? ' field--error' : ''}`}>\n {label && (\n <label className=\"field__label\" htmlFor={htmlFor}>\n {label}\n </label>\n )}\n {children}\n {hint && <span className=\"field__hint\">{hint}</span>}\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\n\nexport interface ComboboxOption {\n value: string\n label: string\n}\n\nexport interface ComboboxProps {\n value: string\n onChange: (value: string) => void\n options: ComboboxOption[]\n label?: string\n placeholder?: string\n disabled?: boolean\n}\n\n// A searchable select - free-text filters the option list as you type,\n// distinct from Select's fixed listbox. Typing a value with no exact option\n// match still calls onChange with the raw text on blur (useful for\n// \"pick from these or type your own\" filters); pick from the menu to commit\n// a known option's value and label.\nexport default function Combobox({ value, onChange, options, label, placeholder = 'Search...', disabled = false }: ComboboxProps) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const rootRef = useRef<HTMLDivElement>(null)\n\n const selectedLabel = options.find((o) => o.value === value)?.label ?? value\n\n useEffect(() => {\n if (!open) setQuery('')\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [options, query])\n\n const pick = (option: ComboboxOption) => {\n onChange(option.value)\n setOpen(false)\n }\n\n return (\n <div className=\"select combobox\" ref={rootRef}>\n {open ? (\n <input\n autoFocus\n className=\"select__trigger\"\n value={query}\n placeholder={selectedLabel || placeholder}\n onChange={(e) => setQuery(e.target.value)}\n disabled={disabled}\n />\n ) : (\n <button\n type=\"button\"\n className=\"select__trigger\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-label={label}\n disabled={disabled}\n onClick={() => setOpen(true)}\n >\n <span>{selectedLabel || <span className=\"combobox__placeholder\">{placeholder}</span>}</span>\n <span className=\"select__chevron\" aria-hidden=\"true\" />\n </button>\n )}\n {open && (\n <ul className=\"select__menu\" role=\"listbox\" aria-label={label}>\n {filtered.length === 0 && <li className=\"select__option combobox__empty\">No matches</li>}\n {filtered.map((o) => (\n <li\n key={o.value}\n role=\"option\"\n aria-selected={o.value === value}\n className={`select__option${o.value === value ? ' select__option--selected' : ''}`}\n onClick={() => pick(o)}\n >\n {o.label}\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","import Icon from './Icon'\n\nexport interface NumberStepperProps {\n value: number\n onChange: (value: number) => void\n min?: number\n max?: number\n step?: number\n label?: string\n disabled?: boolean\n}\n\n// Quantity input with +/- buttons around a numeric field, clamped to\n// [min, max].\nexport default function NumberStepper({ value, onChange, min = -Infinity, max = Infinity, step = 1, label, disabled = false }: NumberStepperProps) {\n const clamp = (v: number) => Math.min(max, Math.max(min, v))\n const set = (v: number) => onChange(clamp(v))\n\n return (\n <div className=\"number-stepper\" role=\"group\" aria-label={label}>\n <button\n type=\"button\"\n className=\"number-stepper__btn\"\n aria-label=\"Decrease\"\n disabled={disabled || value <= min}\n onClick={() => set(value - step)}\n >\n <Icon name=\"minus\" size={13} />\n </button>\n <input\n className=\"number-stepper__field\"\n type=\"number\"\n value={value}\n min={min === -Infinity ? undefined : min}\n max={max === -Infinity ? undefined : max}\n step={step}\n disabled={disabled}\n onChange={(e) => {\n const next = Number(e.target.value)\n if (!Number.isNaN(next)) set(next)\n }}\n />\n <button\n type=\"button\"\n className=\"number-stepper__btn\"\n aria-label=\"Increase\"\n disabled={disabled || value >= max}\n onClick={() => set(value + step)}\n >\n <Icon name=\"plus\" size={13} />\n </button>\n </div>\n )\n}\n","import { useId, useRef, useState, type DragEvent, type ReactNode } from 'react'\nimport Icon from './Icon'\n\nexport interface FileUploadProps {\n onFiles: (files: File[]) => void\n accept?: string\n multiple?: boolean\n disabled?: boolean\n label?: ReactNode\n hint?: ReactNode\n}\n\n// Drag-and-drop file dropzone, backed by a native file input for the\n// click-to-browse path - stays stateless about the selected files\n// themselves (just reports them via onFiles) so the caller decides how to\n// show/manage the list.\nexport default function FileUpload({\n onFiles,\n accept,\n multiple = false,\n disabled = false,\n label = 'Drag files here or click to browse',\n hint,\n}: FileUploadProps) {\n const [isDragOver, setDragOver] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const inputId = useId()\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || !fileList.length) return\n onFiles(Array.from(fileList))\n }\n\n const onDrop = (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (!disabled) handleFiles(e.dataTransfer.files)\n }\n\n return (\n <div\n className={`file-upload${isDragOver ? ' file-upload--drag-over' : ''}${disabled ? ' file-upload--disabled' : ''}`}\n onDragOver={(e) => {\n e.preventDefault()\n if (!disabled) setDragOver(true)\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n onClick={() => !disabled && inputRef.current?.click()}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n >\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n className=\"file-upload__input\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={(e) => handleFiles(e.target.files)}\n />\n <span className=\"file-upload__icon\" aria-hidden=\"true\"><Icon name=\"upload\" size={22} /></span>\n <span className=\"file-upload__label\">{label}</span>\n {hint && <span className=\"file-upload__hint\">{hint}</span>}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport Icon from './Icon'\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nfunction parseISO(iso?: string | null): Date | null {\n if (!iso) return null\n const [y, m, d] = iso.split('-').map(Number)\n if (y === undefined || m === undefined || d === undefined) return null\n return new Date(y, m - 1, d)\n}\n\nfunction toISO(date: Date): string {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n}\n\nfunction formatShort(iso?: string | null): string {\n const date = parseISO(iso)\n if (!date) return ''\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${m}/${d}/${date.getFullYear()}`\n}\n\nexport interface DatePickerProps {\n value?: string | null\n min?: string | null\n max?: string | null\n onChange: (date: string) => void\n label?: string\n placeholder?: string\n}\n\n// Single-date counterpart to DateRangePicker - same trigger+panel mechanics,\n// one click commits a date instead of a from/to pair.\nexport default function DatePicker({ value, min, max, onChange, label = 'Date', placeholder = 'Select date' }: DatePickerProps) {\n const [open, setOpen] = useState(false)\n const selected = parseISO(value)\n const minDate = parseISO(min)\n const maxDate = parseISO(max)\n const [viewDate, setViewDate] = useState<Date>(() => selected ?? new Date())\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (open) setViewDate(selected ?? new Date())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onClickOutside = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onClickOutside)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onClickOutside)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const firstWeekday = new Date(year, month, 1).getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < firstWeekday; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n\n const isDisabled = (date: Date) => Boolean((minDate && date < minDate) || (maxDate && date > maxDate))\n const isSelected = (date: Date) => Boolean(selected && date.toDateString() === selected.toDateString())\n const isToday = (date: Date) => date.toDateString() === new Date().toDateString()\n const goMonth = (delta: number) => setViewDate(new Date(year, month + delta, 1))\n\n const pick = (date: Date) => {\n onChange(toISO(date))\n setOpen(false)\n }\n\n return (\n <div className=\"datepicker\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"select__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={label}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{value ? formatShort(value) : placeholder}</span>\n <span className=\"datepicker__icon\" aria-hidden=\"true\" />\n </button>\n {open && (\n <div className=\"datepicker__panel\" role=\"dialog\" aria-label={label}>\n <div className=\"datepicker__header\">\n <button type=\"button\" className=\"datepicker__nav\" onClick={() => goMonth(-1)} aria-label=\"Previous month\"><Icon name=\"chevron-left\" size={14} /></button>\n <span className=\"datepicker__title\">{MONTH_NAMES[month]} {year}</span>\n <button type=\"button\" className=\"datepicker__nav\" onClick={() => goMonth(1)} aria-label=\"Next month\"><Icon name=\"chevron-right\" size={14} /></button>\n </div>\n <div className=\"datepicker__weekdays\">\n {WEEKDAYS.map((w) => (\n <span key={w}>{w}</span>\n ))}\n </div>\n <div className=\"datepicker__grid\">\n {cells.map((date, i) =>\n date ? (\n <button\n key={i}\n type=\"button\"\n disabled={isDisabled(date)}\n className={[\n 'datepicker__day',\n isSelected(date) && 'datepicker__day--selected',\n isToday(date) && 'datepicker__day--today',\n ].filter(Boolean).join(' ')}\n onClick={() => pick(date)}\n >\n {date.getDate()}\n </button>\n ) : (\n <span key={i} />\n )\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport Icon from './Icon'\n\nexport interface RatingProps {\n value: number\n onChange?: (value: number) => void\n max?: number\n readOnly?: boolean\n}\n\n// Star rating input/display. Omit onChange (or pass readOnly) to render a\n// static rating rather than an editable one.\nexport default function Rating({ value, onChange, max = 5, readOnly = false }: RatingProps) {\n const [hovered, setHovered] = useState<number | null>(null)\n const isInteractive = !readOnly && !!onChange\n const displayValue = hovered ?? value\n\n return (\n <div\n className={`rating${isInteractive ? '' : ' rating--readonly'}`}\n role={isInteractive ? 'radiogroup' : 'img'}\n aria-label={`${value} out of ${max} stars`}\n onMouseLeave={() => setHovered(null)}\n >\n {Array.from({ length: max }, (_, i) => i + 1).map((n) => (\n <span\n key={n}\n className={`rating__star${n <= displayValue ? ' rating__star--filled' : ''}`}\n onMouseEnter={() => isInteractive && setHovered(n)}\n onClick={() => isInteractive && onChange?.(n)}\n role={isInteractive ? 'radio' : undefined}\n aria-checked={isInteractive ? n === value : undefined}\n aria-hidden={isInteractive ? undefined : true}\n >\n <Icon name=\"star\" size={20} filled={n <= displayValue} />\n </span>\n ))}\n </div>\n )\n}\n","import type { Key, ReactNode } from 'react'\n\nexport interface ListItemData {\n id: Key\n content: ReactNode\n onClick?: () => void\n}\n\nexport interface ListProps {\n items: ListItemData[]\n bordered?: boolean\n}\n\n// Generic styled list - lighter than Table for a plain vertical stack of\n// rows (a feed, a simple picklist, etc) that doesn't need columns.\nexport default function List({ items, bordered = true }: ListProps) {\n return (\n <ul className={`nl-list${bordered ? ' nl-list--bordered' : ''}`}>\n {items.map((item) => (\n <li\n key={item.id}\n className={`nl-list__item${item.onClick ? ' nl-list__item--clickable' : ''}`}\n onClick={item.onClick}\n >\n {item.content}\n </li>\n ))}\n </ul>\n )\n}\n","import type { Key, ReactNode } from 'react'\nimport type { BadgeTone } from './Badge'\n\nexport interface TimelineItem {\n id: Key\n title: ReactNode\n timestamp?: ReactNode\n description?: ReactNode\n tone?: Exclude<BadgeTone, 'neutral'>\n}\n\nexport interface TimelineProps {\n items: TimelineItem[]\n}\n\n// Vertical activity/event feed - a connected line of dots, one per event.\nexport default function Timeline({ items }: TimelineProps) {\n return (\n <div className=\"timeline\">\n {items.map((item, i) => (\n <div key={item.id} className=\"timeline__item\">\n <div className=\"timeline__rail\">\n <span className={`timeline__dot${item.tone ? ` timeline__dot--${item.tone}` : ''}`} />\n {i < items.length - 1 && <span className=\"timeline__line\" />}\n </div>\n <div className=\"timeline__content\">\n <div className=\"timeline__header\">\n <span className=\"timeline__title\">{item.title}</span>\n {item.timestamp && <span className=\"timeline__timestamp\">{item.timestamp}</span>}\n </div>\n {item.description && <div className=\"timeline__description\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import Avatar, { type AvatarProps } from './Avatar'\n\nexport interface AvatarGroupProps {\n avatars: AvatarProps[]\n max?: number\n size?: number\n}\n\n// Overlapping stack of avatars with a \"+N\" overflow badge once there are\n// more than `max`.\nexport default function AvatarGroup({ avatars, max = 4, size = 32 }: AvatarGroupProps) {\n const visible = avatars.slice(0, max)\n const overflow = avatars.length - visible.length\n\n return (\n <div className=\"avatar-group\">\n {visible.map((props, i) => (\n <div key={i} className=\"avatar-group__item\" style={{ zIndex: visible.length - i }}>\n <Avatar {...props} size={props.size ?? size} />\n </div>\n ))}\n {overflow > 0 && (\n <div className=\"avatar-group__item avatar-group__overflow\" style={{ width: size, height: size, fontSize: Math.round(size * 0.35) }}>\n +{overflow}\n </div>\n )}\n </div>\n )\n}\n","import CopyButton from './CopyButton'\n\nexport interface CodeBlockProps {\n code: string\n language?: string\n copyable?: boolean\n}\n\n// Plain monospace code snippet display - no syntax highlighting (bring your\n// own highlighter and pass the highlighted markup as `code` via\n// dangerouslySetInnerHTML upstream if you need that; this just owns the\n// themed frame + optional copy button).\nexport default function CodeBlock({ code, language, copyable = true }: CodeBlockProps) {\n return (\n <div className=\"code-block\">\n {(language || copyable) && (\n <div className=\"code-block__header\">\n {language && <span className=\"code-block__lang\">{language}</span>}\n {copyable && <CopyButton text={code} />}\n </div>\n )}\n <pre className=\"code-block__body\"><code>{code}</code></pre>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface KbdProps {\n children: ReactNode\n}\n\n// Keyboard-shortcut chip, e.g. <Kbd>⌘</Kbd><Kbd>K</Kbd>.\nexport default function Kbd({ children }: KbdProps) {\n return <kbd className=\"kbd\">{children}</kbd>\n}\n","import { useState, type ReactNode } from 'react'\n\nexport interface TreeNode {\n id: string\n label: ReactNode\n children?: TreeNode[]\n}\n\nexport interface TreeProps {\n nodes: TreeNode[]\n defaultExpandedIds?: string[]\n onSelect?: (id: string) => void\n selectedId?: string\n}\n\nfunction TreeItem({\n node,\n expanded,\n toggle,\n onSelect,\n selectedId,\n}: {\n node: TreeNode\n expanded: Set<string>\n toggle: (id: string) => void\n onSelect?: (id: string) => void\n selectedId?: string\n}) {\n const hasChildren = !!node.children?.length\n const isExpanded = expanded.has(node.id)\n\n return (\n <li className=\"tree__item\">\n <div\n className={`tree__row${node.id === selectedId ? ' tree__row--selected' : ''}`}\n onClick={() => {\n if (hasChildren) toggle(node.id)\n onSelect?.(node.id)\n }}\n >\n {hasChildren ? (\n <span className={`tree__chevron${isExpanded ? ' tree__chevron--open' : ''}`} aria-hidden=\"true\" />\n ) : (\n <span className=\"tree__chevron tree__chevron--leaf\" aria-hidden=\"true\" />\n )}\n <span className=\"tree__label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"tree__children\">\n {node.children!.map((child) => (\n <TreeItem key={child.id} node={child} expanded={expanded} toggle={toggle} onSelect={onSelect} selectedId={selectedId} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Nested expandable hierarchy - file trees, category trees, org charts.\nexport default function Tree({ nodes, defaultExpandedIds = [], onSelect, selectedId }: TreeProps) {\n const [expanded, setExpanded] = useState(new Set(defaultExpandedIds))\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n return (\n <ul className=\"tree\" role=\"tree\">\n {nodes.map((node) => (\n <TreeItem key={node.id} node={node} expanded={expanded} toggle={toggle} onSelect={onSelect} selectedId={selectedId} />\n ))}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface NavbarProps {\n brand?: ReactNode\n children?: ReactNode\n sticky?: boolean\n}\n\n// App header bar: brand/logo on the left, arbitrary nav items/actions\n// (Tabs, Button, Avatar, ...) on the right via `children`.\nexport default function Navbar({ brand, children, sticky = false }: NavbarProps) {\n return (\n <header className={`navbar${sticky ? ' navbar--sticky' : ''}`}>\n {brand && <div className=\"navbar__brand\">{brand}</div>}\n <div className=\"navbar__actions\">{children}</div>\n </header>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface SidebarItem {\n id: string\n label: ReactNode\n icon?: ReactNode\n onClick?: () => void\n}\n\nexport interface SidebarProps {\n items: SidebarItem[]\n activeId?: string\n collapsed?: boolean\n header?: ReactNode\n}\n\n// Persistent side navigation rail - distinct from Drawer, which is an\n// overlay meant to be opened/closed. `collapsed` shrinks it to icon-only\n// width (pass `icon` on each item for that to look right).\nexport default function Sidebar({ items, activeId, collapsed = false, header }: SidebarProps) {\n return (\n <nav className={`sidebar${collapsed ? ' sidebar--collapsed' : ''}`}>\n {header && <div className=\"sidebar__header\">{header}</div>}\n <ul className=\"sidebar__list\">\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={`sidebar__item${item.id === activeId ? ' sidebar__item--active' : ''}`}\n onClick={item.onClick}\n title={collapsed && typeof item.label === 'string' ? item.label : undefined}\n >\n {item.icon && <span className=\"sidebar__icon\">{item.icon}</span>}\n {!collapsed && <span className=\"sidebar__label\">{item.label}</span>}\n </button>\n </li>\n ))}\n </ul>\n </nav>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport interface ButtonGroupProps {\n children: ReactNode\n}\n\n// Visually merges adjacent Buttons into one segmented-looking group (shared\n// border, squared-off inner corners) - distinct from SegmentedControl,\n// which carries single-value selection state. This is purely a visual\n// wrapper around independent Button actions.\nexport default function ButtonGroup({ children }: ButtonGroupProps) {\n return <div className=\"button-group\">{children}</div>\n}\n","export interface ColorPickerProps {\n value: string\n onChange: (color: string) => void\n swatches?: string[]\n label?: string\n}\n\nconst DEFAULT_SWATCHES = ['#8FB4F5', '#7FD8C9', '#C9A8F0', '#F5C88F', '#F19A9A', '#8FCB9E']\n\n// Preset swatch grid plus a native color input for anything outside the\n// palette - the native input keeps full OS color-picker behavior for free.\nexport default function ColorPicker({ value, onChange, swatches = DEFAULT_SWATCHES, label = 'Color' }: ColorPickerProps) {\n return (\n <div className=\"color-picker\" role=\"group\" aria-label={label}>\n {swatches.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`color-picker__swatch${color.toLowerCase() === value.toLowerCase() ? ' color-picker__swatch--selected' : ''}`}\n style={{ background: color }}\n aria-label={color}\n aria-pressed={color.toLowerCase() === value.toLowerCase()}\n onClick={() => onChange(color)}\n />\n ))}\n <label className=\"color-picker__custom\">\n <input type=\"color\" value={value} onChange={(e) => onChange(e.target.value)} aria-label=\"Custom color\" />\n </label>\n </div>\n )\n}\n","import { useId, useState, type ReactNode } from 'react'\nimport Icon from './Icon'\n\nexport interface PasswordInputProps {\n label?: ReactNode\n value: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n hint?: ReactNode\n id?: string\n autoComplete?: string\n}\n\n// Input's password-specific variant - a trailing eye/eye-off button toggles\n// between masked and plain text, same label/hint/error shape as Input.\nexport default function PasswordInput({\n label,\n value,\n onChange,\n placeholder,\n disabled = false,\n error = false,\n hint,\n id,\n autoComplete = 'current-password',\n}: PasswordInputProps) {\n const [visible, setVisible] = useState(false)\n const generatedId = useId()\n const inputId = id ?? generatedId\n\n return (\n <div className={`field${error ? ' field--error' : ''}`}>\n {label && <label className=\"field__label\" htmlFor={inputId}>{label}</label>}\n <div className=\"password-input\">\n <input\n id={inputId}\n className=\"field__input password-input__field\"\n type={visible ? 'text' : 'password'}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n autoComplete={autoComplete}\n aria-invalid={error || undefined}\n />\n <button\n type=\"button\"\n className=\"password-input__toggle\"\n aria-label={visible ? 'Hide password' : 'Show password'}\n disabled={disabled}\n onClick={() => setVisible((v) => !v)}\n >\n <Icon name={visible ? 'eye-off' : 'eye'} size={16} />\n </button>\n </div>\n {hint && <span className=\"field__hint\">{hint}</span>}\n </div>\n )\n}\n","import { useRef, type ClipboardEvent, type KeyboardEvent } from 'react'\n\nexport interface OTPInputProps {\n length?: number\n value: string\n onChange: (value: string) => void\n disabled?: boolean\n label?: string\n}\n\n// Segmented verification-code input - one box per character, auto-advancing\n// focus as you type, Backspace steps back, and pasting a full code fills\n// every box at once.\nexport default function OTPInput({ length = 6, value, onChange, disabled = false, label = 'Verification code' }: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n const chars = Array.from({ length }, (_, i) => value[i] ?? '')\n\n const setChar = (index: number, char: string) => {\n const next = chars.slice()\n next[index] = char\n onChange(next.join('').slice(0, length))\n }\n\n const onInput = (index: number, raw: string) => {\n const char = raw.slice(-1)\n setChar(index, char)\n if (char && index < length - 1) inputRefs.current[index + 1]?.focus()\n }\n\n const onKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !chars[index] && index > 0) {\n inputRefs.current[index - 1]?.focus()\n }\n }\n\n const onPaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').trim().slice(0, length)\n onChange(pasted)\n inputRefs.current[Math.min(pasted.length, length - 1)]?.focus()\n }\n\n return (\n <div className=\"otp-input\" role=\"group\" aria-label={label}>\n {chars.map((char, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el }}\n className=\"otp-input__box\"\n value={char}\n onChange={(e) => onInput(i, e.target.value)}\n onKeyDown={(e) => onKeyDown(i, e)}\n onPaste={onPaste}\n disabled={disabled}\n inputMode=\"text\"\n maxLength={1}\n aria-label={`Digit ${i + 1} of ${length}`}\n />\n ))}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport Spinner from './Spinner'\n\nexport interface LoadingOverlayProps {\n active: boolean\n children: ReactNode\n label?: string\n}\n\n// Dims and blocks a section while `active`, with a centered Spinner on top -\n// distinct from a bare Spinner, which doesn't manage the underlying content.\n// Wraps `children` in a relatively-positioned container so the overlay\n// covers exactly that area, not the whole page.\nexport default function LoadingOverlay({ active, children, label = 'Loading' }: LoadingOverlayProps) {\n return (\n <div className=\"loading-overlay\">\n {children}\n {active && (\n <div className=\"loading-overlay__veil\" role=\"status\" aria-label={label}>\n <Spinner />\n </div>\n )}\n </div>\n )\n}\n","import { Component, type ErrorInfo, type ReactNode } from 'react'\nimport Alert from './Alert'\nimport Button from './Button'\n\nexport interface ErrorBoundaryProps {\n children: ReactNode\n /** Custom fallback UI. Given the caught error and a `reset()` to retry. */\n fallback?: (error: Error, reset: () => void) => ReactNode\n onError?: (error: Error, info: ErrorInfo) => void\n}\n\ninterface ErrorBoundaryState {\n error: Error | null\n}\n\n// React error boundaries must be class components - hooks can't implement\n// getDerivedStateFromError/componentDidCatch. Wrap a section of the app\n// that might throw during render (a risky third-party widget, a route) so\n// one broken subtree doesn't blank the whole page.\nexport default class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info)\n }\n\n reset = () => this.setState({ error: null })\n\n render() {\n const { error } = this.state\n if (!error) return this.props.children\n\n if (this.props.fallback) return this.props.fallback(error, this.reset)\n\n return (\n <Alert tone=\"danger\" title=\"Something went wrong\">\n <div className=\"error-boundary__message\">{error.message}</div>\n <div className=\"error-boundary__actions\">\n <Button variant=\"secondary\" size=\"sm\" onClick={this.reset}>Try again</Button>\n </div>\n </Alert>\n )\n }\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport Icon from './Icon'\n\nexport interface CarouselProps {\n items: ReactNode[]\n autoPlay?: boolean\n interval?: number\n}\n\n// Single-item-at-a-time carousel with prev/next controls and dot\n// indicators. Renders only the active item (no slide-track transform math),\n// with a plain fade between slides.\nexport default function Carousel({ items, autoPlay = false, interval = 4000 }: CarouselProps) {\n const [index, setIndex] = useState(0)\n\n useEffect(() => {\n if (!autoPlay || items.length <= 1) return\n const timer = setInterval(() => setIndex((i) => (i + 1) % items.length), interval)\n return () => clearInterval(timer)\n }, [autoPlay, interval, items.length])\n\n if (!items.length) return null\n\n const go = (delta: number) => setIndex((i) => (i + delta + items.length) % items.length)\n\n return (\n <div className=\"carousel\">\n <div className=\"carousel__viewport\">\n <div key={index} className=\"carousel__slide\">{items[index]}</div>\n {items.length > 1 && (\n <>\n <button type=\"button\" className=\"carousel__nav carousel__nav--prev\" aria-label=\"Previous slide\" onClick={() => go(-1)}>\n <Icon name=\"chevron-left\" size={18} />\n </button>\n <button type=\"button\" className=\"carousel__nav carousel__nav--next\" aria-label=\"Next slide\" onClick={() => go(1)}>\n <Icon name=\"chevron-right\" size={18} />\n </button>\n </>\n )}\n </div>\n {items.length > 1 && (\n <div className=\"carousel__dots\" role=\"tablist\">\n {items.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === index}\n aria-label={`Go to slide ${i + 1}`}\n className={`carousel__dot${i === index ? ' carousel__dot--active' : ''}`}\n onClick={() => setIndex(i)}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalProps {\n children: ReactNode\n}\n\n// Renders `children` into document.body - the same mechanism Modal/Drawer/\n// Toast use internally, exposed for a custom overlay you build yourself.\nexport default function Portal({ children }: PortalProps) {\n if (typeof document === 'undefined') return null\n return createPortal(children, document.body)\n}\n","import { useEffect, type RefObject } from 'react'\n\n// The click-outside/Escape-to-close pattern used internally by Select,\n// Menu, Popover, Combobox, DateRangePicker, and DatePicker - exported so a\n// custom overlay you build on top of Northline doesn't have to\n// reimplement it again. Those built-in components keep their own inline\n// copies (predating this hook) rather than being refactored onto it, to\n// avoid touching several working, well-tested components for no behavior\n// change.\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, onOutside: () => void, active = true): void {\n useEffect(() => {\n if (!active) return\n const onMouseDown = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onOutside()\n }\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onOutside()\n }\n document.addEventListener('mousedown', onMouseDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('mousedown', onMouseDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [ref, onOutside, active])\n}\n","// Shared Chart.js styling/helpers, reused across every sub-tab's charts so\n// they read as one consistent system rather than each hand-rolling options.\nimport type { ChartOptions } from 'chart.js'\n\n// Minimal light-dashboard palette: pastel blue/teal/purple/orange, matching\n// flat white cards with thin borders rather than a saturated brand theme.\n// Kept identical across themes - these pastels read fine on both light and\n// dark surfaces, unlike grid lines/tooltips/axis text below.\nexport const PALETTE = ['#8FB4F5', '#7FD8C9', '#C9A8F0', '#F5C88F', '#F19A9A', '#A9B4F0', '#8FCBEE', '#F5AFD1', '#B9DE9E']\n\nexport const AXIS_TICK_FONT = { size: 11, family: \"'IBM Plex Mono', monospace\" }\n\nexport interface ChartColors {\n gridColor: string\n axisColor: string\n tooltip: {\n backgroundColor: string\n titleColor: string\n bodyColor: string\n borderColor: string\n }\n}\n\nconst LIGHT_CHART_COLORS: ChartColors = {\n gridColor: '#F1F2F5',\n axisColor: '#9CA3AF',\n tooltip: {\n backgroundColor: '#FFFFFF',\n titleColor: '#0B0D12',\n bodyColor: '#4B5563',\n borderColor: '#E7E9EE',\n },\n}\n\n// Canvas fillStyle/strokeStyle can't resolve CSS custom properties the way\n// DOM styles can, so Chart.js needs actual resolved colors. This reads\n// Northline's current theme tokens (light or dark, whichever is active on\n// <html> right now) via getComputedStyle and returns plain color strings -\n// call it fresh whenever you (re)build chart options, not once at import\n// time, so it reflects the theme active at that moment.\nexport function getChartColors(): ChartColors {\n if (typeof document === 'undefined') return LIGHT_CHART_COLORS\n const styles = getComputedStyle(document.documentElement)\n const read = (name: string, fallback: string) => styles.getPropertyValue(name).trim() || fallback\n\n return {\n gridColor: read('--neutral-100', LIGHT_CHART_COLORS.gridColor),\n axisColor: read('--neutral-400', LIGHT_CHART_COLORS.axisColor),\n tooltip: {\n backgroundColor: read('--neutral-0', LIGHT_CHART_COLORS.tooltip.backgroundColor),\n titleColor: read('--neutral-1000', LIGHT_CHART_COLORS.tooltip.titleColor),\n bodyColor: read('--neutral-600', LIGHT_CHART_COLORS.tooltip.bodyColor),\n borderColor: read('--card-border', LIGHT_CHART_COLORS.tooltip.borderColor),\n },\n }\n}\n\n// Snapshot of getChartColors() at module-load time - convenient for a\n// one-off chart built before the page ever toggles theme, but it will NOT\n// update on a later theme change. Prefer getChartColors() (or just\n// dualAxisOptions(), which calls it internally) for anything long-lived.\nexport const AXIS_COLOR = getChartColors().axisColor\nexport const GRID_COLOR = getChartColors().gridColor\n\nexport const TOOLTIP_OPTS = {\n ...getChartColors().tooltip,\n borderWidth: 1,\n padding: 8,\n cornerRadius: 8,\n titleFont: { size: 12, weight: 600, family: \"'Space Grotesk', sans-serif\" },\n bodyFont: { size: 12, family: \"'IBM Plex Mono', monospace\" },\n}\n\nfunction buildTooltipOpts() {\n return {\n ...getChartColors().tooltip,\n borderWidth: 1,\n padding: 8,\n cornerRadius: 8,\n titleFont: { size: 12, weight: 600, family: \"'Space Grotesk', sans-serif\" },\n bodyFont: { size: 12, family: \"'IBM Plex Mono', monospace\" },\n }\n}\n\nconst LEGEND_LABELS = { boxWidth: 10, font: { size: 11, family: \"'IBM Plex Mono', monospace\" } }\n\n// Notifies `callback` whenever the active theme flips - either the OS/browser\n// `prefers-color-scheme` or an explicit `data-theme` attribute on <html> (see\n// the README's dark mode section). Use it to rebuild/re-apply chart options\n// (dualAxisOptions() + TOOLTIP_OPTS reread the current theme each call) and\n// call `chart.update()` so already-rendered charts repaint. Returns an\n// unsubscribe function.\nexport function onThemeChange(callback: () => void): () => void {\n if (typeof window === 'undefined') return () => {}\n\n const media = window.matchMedia('(prefers-color-scheme: dark)')\n media.addEventListener('change', callback)\n\n const observer = new MutationObserver(callback)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n\n return () => {\n media.removeEventListener('change', callback)\n observer.disconnect()\n }\n}\n\nexport interface DualAxisOptionsOpts {\n rotateXTicks?: boolean\n maxTicks?: number\n longLabels?: boolean\n}\n\n// Shared options for count/value-bars + percentage-line combo charts (Weekly\n// Trend, Failure Pareto, Cost run-rate): left axis is a raw value, right\n// axis is 0-100%. Returned as `ChartOptions<'bar'>` since that's the widest\n// type callers pass to <Chart type=\"bar\" ... /> for a bar+line combo. Reads\n// the active theme's colors fresh on every call - call this again (and\n// chart.update()) after a theme change rather than reusing a stale result.\nexport function dualAxisOptions(\n rightUnit: string,\n { rotateXTicks = false, maxTicks, longLabels = false }: DualAxisOptionsOpts = {},\n): ChartOptions<'bar'> {\n const { gridColor, axisColor } = getChartColors()\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n layout: { padding: { bottom: rotateXTicks ? 8 : 0 } },\n animation: { duration: 500, easing: 'easeOutQuad' },\n interaction: { mode: 'index', intersect: false },\n plugins: {\n legend: { position: 'bottom', labels: LEGEND_LABELS },\n tooltip: buildTooltipOpts(),\n },\n scales: {\n x: {\n ticks: {\n font: AXIS_TICK_FONT,\n color: axisColor,\n autoSkip: true,\n // Long category names get a free-fitting rotation (Chart.js picks\n // the smallest angle, up to 90°, that avoids overlap) instead of a\n // fixed angle that only suits short labels.\n ...(longLabels\n ? { maxRotation: 90, minRotation: 0 }\n : rotateXTicks\n ? { maxRotation: 35, minRotation: 35 }\n : {}),\n ...(maxTicks ? { maxTicksLimit: maxTicks } : {}),\n },\n grid: { color: gridColor },\n },\n y: {\n position: 'left',\n beginAtZero: true,\n ticks: { font: AXIS_TICK_FONT, color: axisColor },\n grid: { color: gridColor },\n },\n y1: {\n position: 'right',\n min: 0,\n max: 100,\n ticks: { font: AXIS_TICK_FONT, color: axisColor, callback: (v: number | string) => `${v}${rightUnit}` },\n grid: { drawOnChartArea: false },\n },\n },\n } as ChartOptions<'bar'>\n}\n\nexport interface DonutOptionsOpts {\n cutout?: string | number\n showLegend?: boolean\n}\n\n// Options for a donut/pie chart (Distribution-by-type widgets). Pair with\n// `<Pie type=\"doughnut\" .../>` or react-chartjs-2's `<Doughnut />`.\nexport function donutOptions({ cutout = '65%', showLegend = true }: DonutOptionsOpts = {}): ChartOptions<'doughnut'> {\n return {\n responsive: true,\n maintainAspectRatio: false,\n cutout,\n animation: { duration: 500, easing: 'easeOutQuad' },\n plugins: {\n legend: showLegend ? { position: 'bottom', labels: LEGEND_LABELS } : { display: false },\n tooltip: buildTooltipOpts(),\n },\n } as ChartOptions<'doughnut'>\n}\n\nexport interface HorizontalBarOptionsOpts {\n maxTicks?: number\n beginAtZero?: boolean\n}\n\n// Options for a horizontal bar chart (ranked lists - top failure reasons,\n// slowest jobs, etc). Pair with `<Bar options={...} />` and `indexAxis: 'y'`\n// is already set here, so datasets don't need to repeat it.\nexport function horizontalBarOptions({ maxTicks, beginAtZero = true }: HorizontalBarOptionsOpts = {}): ChartOptions<'bar'> {\n const { gridColor, axisColor } = getChartColors()\n\n return {\n indexAxis: 'y',\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500, easing: 'easeOutQuad' },\n plugins: {\n legend: { display: false },\n tooltip: buildTooltipOpts(),\n },\n scales: {\n x: {\n beginAtZero,\n ticks: { font: AXIS_TICK_FONT, color: axisColor, ...(maxTicks ? { maxTicksLimit: maxTicks } : {}) },\n grid: { color: gridColor },\n },\n y: {\n ticks: { font: AXIS_TICK_FONT, color: axisColor },\n grid: { display: false },\n },\n },\n } as ChartOptions<'bar'>\n}\n\nexport interface AreaOptionsOpts {\n maxTicks?: number\n beginAtZero?: boolean\n unit?: string\n}\n\n// Options for a single filled-line/area trend chart - simpler than\n// dualAxisOptions when there's just one series and no combo axis. Pair with\n// a line dataset that sets `fill: true`.\nexport function areaOptions({ maxTicks, beginAtZero = true, unit = '' }: AreaOptionsOpts = {}): ChartOptions<'line'> {\n const { gridColor, axisColor } = getChartColors()\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500, easing: 'easeOutQuad' },\n interaction: { mode: 'index', intersect: false },\n plugins: {\n legend: { display: false },\n tooltip: buildTooltipOpts(),\n },\n scales: {\n x: {\n ticks: { font: AXIS_TICK_FONT, color: axisColor, autoSkip: true, ...(maxTicks ? { maxTicksLimit: maxTicks } : {}) },\n grid: { color: gridColor },\n },\n y: {\n beginAtZero,\n ticks: { font: AXIS_TICK_FONT, color: axisColor, callback: (v: number | string) => `${v}${unit}` },\n grid: { color: gridColor },\n },\n },\n } as ChartOptions<'line'>\n}\n\nexport interface StackedBarOptionsOpts {\n maxTicks?: number\n rotateXTicks?: boolean\n}\n\n// Options for a stacked bar chart (composition-over-time - volume by status,\n// spend by category). Sets `stacked: true` on both axes so datasets don't\n// need to repeat it.\nexport function stackedBarOptions({ maxTicks, rotateXTicks = false }: StackedBarOptionsOpts = {}): ChartOptions<'bar'> {\n const { gridColor, axisColor } = getChartColors()\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500, easing: 'easeOutQuad' },\n interaction: { mode: 'index', intersect: false },\n plugins: {\n legend: { position: 'bottom', labels: LEGEND_LABELS },\n tooltip: buildTooltipOpts(),\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n font: AXIS_TICK_FONT,\n color: axisColor,\n autoSkip: true,\n ...(rotateXTicks ? { maxRotation: 35, minRotation: 35 } : {}),\n ...(maxTicks ? { maxTicksLimit: maxTicks } : {}),\n },\n grid: { color: gridColor },\n },\n y: {\n stacked: true,\n beginAtZero: true,\n ticks: { font: AXIS_TICK_FONT, color: axisColor },\n grid: { color: gridColor },\n },\n },\n } as ChartOptions<'bar'>\n}\n\n// Options for a radar/spider chart (multi-dimensional comparisons - e.g.\n// this segment's scores across several metrics at once).\nexport function radarOptions(): ChartOptions<'radar'> {\n const { gridColor, axisColor } = getChartColors()\n\n return {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500, easing: 'easeOutQuad' },\n plugins: {\n legend: { position: 'bottom', labels: LEGEND_LABELS },\n tooltip: buildTooltipOpts(),\n },\n scales: {\n r: {\n angleLines: { color: gridColor },\n grid: { color: gridColor },\n pointLabels: { font: AXIS_TICK_FONT, color: axisColor },\n ticks: { font: AXIS_TICK_FONT, color: axisColor, backdropColor: 'transparent' },\n },\n },\n } as ChartOptions<'radar'>\n}\n\n// Trailing rolling average of series[i][key] over the last windowSize points.\nexport function rollingAverage<T extends Record<string, unknown>>(\n series: T[],\n key: keyof T,\n windowSize: number,\n): (number | null)[] {\n return series.map((_, i) => {\n const start = Math.max(0, i - windowSize + 1)\n const window = series.slice(start, i + 1).filter((d) => d[key] != null)\n if (!window.length) return null\n const avg = window.reduce((sum, d) => sum + (d[key] as number), 0) / window.length\n return Number(avg.toFixed(1))\n })\n}\n","// Chart.js registration for the Northline theme. Call installCharts() once,\n// at app startup, before any chart renders (e.g. top of main.jsx).\nimport { Chart as ChartJS, registerables } from 'chart.js'\nimport ChartDataLabels from 'chartjs-plugin-datalabels'\n\nlet installed = false\n\nexport function installCharts() {\n if (installed) return\n installed = true\n ChartJS.register(...registerables, ChartDataLabels)\n // Datalabels would otherwise render on every chart by default; opt in per-chart instead.\n ChartJS.defaults.set('plugins.datalabels', { display: false })\n}\n\nexport default ChartJS\n"],"mappings":"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"}