@goliapkg/gds 2.1.2 → 2.2.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/dist/a11y-CoNNB_xa.js +6 -0
  2. package/dist/a11y-CoNNB_xa.js.map +1 -0
  3. package/dist/{avatar-Ct8OOGx6.js → avatar-oCar1zX6.js} +2 -2
  4. package/dist/{avatar-Ct8OOGx6.js.map → avatar-oCar1zX6.js.map} +1 -1
  5. package/dist/{badge-BCvi5RVF.js → badge-B3ijD3ch.js} +2 -2
  6. package/dist/{badge-BCvi5RVF.js.map → badge-B3ijD3ch.js.map} +1 -1
  7. package/dist/{button-BD3VHhwq.js → button-fRpdsI_4.js} +15 -41
  8. package/dist/button-fRpdsI_4.js.map +1 -0
  9. package/dist/dist-qdXk1a7h.js +35 -0
  10. package/dist/dist-qdXk1a7h.js.map +1 -0
  11. package/dist/{dom-17XgfxMq.js → dom-DkPgnDHP.js} +1 -1
  12. package/dist/{dom-17XgfxMq.js.map → dom-DkPgnDHP.js.map} +1 -1
  13. package/dist/editor/index.d.ts +11 -0
  14. package/dist/editor/index.d.ts.map +1 -0
  15. package/dist/editor/index.js +1250 -0
  16. package/dist/editor/index.js.map +1 -0
  17. package/dist/email-composer-field-UoKh5XMX.js +178 -0
  18. package/dist/email-composer-field-UoKh5XMX.js.map +1 -0
  19. package/dist/{gesture-I79dlTuS.js → gesture-CVcSA-iZ.js} +1 -1
  20. package/dist/{gesture-I79dlTuS.js.map → gesture-CVcSA-iZ.js.map} +1 -1
  21. package/dist/{highlight-BAGZc-4h.js → highlight-pgwGrmcq.js} +1 -1
  22. package/dist/{highlight-BAGZc-4h.js.map → highlight-pgwGrmcq.js.map} +1 -1
  23. package/dist/{hooks-BE-_EmDI.js → hooks-CejfTXVD.js} +1 -1
  24. package/dist/{hooks-BE-_EmDI.js.map → hooks-CejfTXVD.js.map} +1 -1
  25. package/dist/{icon-button-Bns79124.js → icon-button-CR2GECEZ.js} +3 -3
  26. package/dist/{icon-button-Bns79124.js.map → icon-button-CR2GECEZ.js.map} +1 -1
  27. package/dist/index.js +30 -27
  28. package/dist/l2-primitives/index.js +11 -11
  29. package/dist/{l2-primitives-Cn0KNxbB.js → l2-primitives-D503ozjH.js} +4 -4
  30. package/dist/{l2-primitives-Cn0KNxbB.js.map → l2-primitives-D503ozjH.js.map} +1 -1
  31. package/dist/l3-atoms/index.js +6 -5
  32. package/dist/{l3-atoms-BCJNqPHk.js → l3-atoms-CumlHlnP.js} +54 -53
  33. package/dist/{l3-atoms-BCJNqPHk.js.map → l3-atoms-CumlHlnP.js.map} +1 -1
  34. package/dist/l4-molecules/index.js +5 -4
  35. package/dist/{l4-molecules-DtNnQaFU.js → l4-molecules-CWwgFWmO.js} +125 -124
  36. package/dist/{l4-molecules-DtNnQaFU.js.map → l4-molecules-CWwgFWmO.js.map} +1 -1
  37. package/dist/l5-organisms/index.d.ts +0 -10
  38. package/dist/l5-organisms/index.d.ts.map +1 -1
  39. package/dist/l5-organisms/index.js +2 -2
  40. package/dist/{l5-organisms-Bu2Z8LSj.js → l5-organisms-QcvIAoHr.js} +1310 -2548
  41. package/dist/l5-organisms-QcvIAoHr.js.map +1 -0
  42. package/dist/l6-charts/index.js +1 -1
  43. package/dist/{l6-charts-uSpVyFWS.js → l6-charts-DKNVGuo0.js} +1 -1
  44. package/dist/{l6-charts-uSpVyFWS.js.map → l6-charts-DKNVGuo0.js.map} +1 -1
  45. package/dist/l7-patterns/index.js +1 -1
  46. package/dist/{l7-patterns-CwonNW9o.js → l7-patterns-CM3FUxjA.js} +34 -34
  47. package/dist/{l7-patterns-CwonNW9o.js.map → l7-patterns-CM3FUxjA.js.map} +1 -1
  48. package/dist/loading-dots-CjzCz938.js +24 -0
  49. package/dist/loading-dots-CjzCz938.js.map +1 -0
  50. package/dist/motion-CKB1OKVd.js +22 -0
  51. package/dist/motion-CKB1OKVd.js.map +1 -0
  52. package/dist/{portal-Bbl6F_Wj.js → portal-B7bfstxv.js} +1 -1
  53. package/dist/{portal-Bbl6F_Wj.js.map → portal-B7bfstxv.js.map} +1 -1
  54. package/dist/{progress-dZIQEiTw.js → progress-B81FKPw5.js} +2 -2
  55. package/dist/{progress-dZIQEiTw.js.map → progress-B81FKPw5.js.map} +1 -1
  56. package/dist/{resize-handle-BjSNhgJK.js → resize-handle-BFffbhyG.js} +2 -2
  57. package/dist/{resize-handle-BjSNhgJK.js.map → resize-handle-BFffbhyG.js.map} +1 -1
  58. package/dist/{sanitize-BF45M9xp.js → sanitize-CO5dRqZX.js} +1 -1
  59. package/dist/{sanitize-BF45M9xp.js.map → sanitize-CO5dRqZX.js.map} +1 -1
  60. package/dist/{separator-CRll1Ycp.js → separator-wAUWmxji.js} +2 -2
  61. package/dist/{separator-CRll1Ycp.js.map → separator-wAUWmxji.js.map} +1 -1
  62. package/dist/{skeleton-C9FFZSYN.js → skeleton-DhqLfA7r.js} +1 -1
  63. package/dist/{skeleton-C9FFZSYN.js.map → skeleton-DhqLfA7r.js.map} +1 -1
  64. package/dist/{spinner-C15eER04.js → spinner-BimzKtfC.js} +3 -3
  65. package/dist/{spinner-C15eER04.js.map → spinner-BimzKtfC.js.map} +1 -1
  66. package/dist/{stepper-DJ8pn-9D.js → stepper-BINbai2f.js} +4 -4
  67. package/dist/{stepper-DJ8pn-9D.js.map → stepper-BINbai2f.js.map} +1 -1
  68. package/dist/{switch-BAS-GXJV.js → switch-COzaggYE.js} +3 -3
  69. package/dist/{switch-BAS-GXJV.js.map → switch-COzaggYE.js.map} +1 -1
  70. package/dist/{textarea-Btdu41rY.js → textarea-DD1huKel.js} +3 -3
  71. package/dist/{textarea-Btdu41rY.js.map → textarea-DD1huKel.js.map} +1 -1
  72. package/dist/toast-BujeTn1T.js +442 -0
  73. package/dist/toast-BujeTn1T.js.map +1 -0
  74. package/dist/{loading-dots-C1LPHGa0.js → tooltip-BlvhLCp0.js} +2 -17
  75. package/dist/tooltip-BlvhLCp0.js.map +1 -0
  76. package/dist/utils/index.js +8 -7
  77. package/package.json +5 -1
  78. package/dist/button-BD3VHhwq.js.map +0 -1
  79. package/dist/l5-organisms-Bu2Z8LSj.js.map +0 -1
  80. package/dist/loading-dots-C1LPHGa0.js.map +0 -1
  81. package/dist/motion-DUPegem-.js +0 -22
  82. package/dist/motion-DUPegem-.js.map +0 -1
  83. package/dist/toast-QxCZG0Oy.js +0 -614
  84. package/dist/toast-QxCZG0Oy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"l4-molecules-DtNnQaFU.js","names":[],"sources":["../src/l4-molecules/action-card.tsx","../src/l4-molecules/action-menu.tsx","../src/l4-molecules/activity-log.tsx","../src/l4-molecules/alert.tsx","../src/l4-molecules/banner.tsx","../src/l4-molecules/before-after.tsx","../src/l4-molecules/bottom-bar.tsx","../src/l4-molecules/breadcrumb.tsx","../src/l4-molecules/bulk-action-bar.tsx","../src/l4-molecules/callout.tsx","../src/l4-molecules/card.tsx","../src/l4-molecules/category-tag.tsx","../src/l4-molecules/cert-badge.tsx","../src/l4-molecules/chip-group.tsx","../src/l4-molecules/circular-menu.tsx","../src/l4-molecules/code-block.tsx","../src/l4-molecules/code-snippet.tsx","../src/l4-molecules/collapsible.tsx","../src/l4-molecules/color-picker.tsx","../src/l4-molecules/combobox-list.tsx","../src/l4-molecules/combobox.tsx","../src/l4-molecules/command-bar.tsx","../src/l4-molecules/command-bar-float.tsx","../src/l4-molecules/command-menu.tsx","../src/l4-molecules/comparison-bar.tsx","../src/l4-molecules/dialog.tsx","../src/l4-molecules/confirm-dialog.tsx","../src/l4-molecules/context-menu.tsx","../src/l4-molecules/copy-field.tsx","../src/l4-molecules/copy-to-clipboard.tsx","../src/l4-molecules/countdown-timer.tsx","../src/l4-molecules/currency-display.tsx","../src/l4-molecules/currency-input.tsx","../src/l4-molecules/data-card.tsx","../src/l4-molecules/date-display.tsx","../src/l4-molecules/date-range-input.tsx","../src/l4-molecules/description.tsx","../src/l4-molecules/dock.tsx","../src/l4-molecules/download-button.tsx","../src/l4-molecules/drawer.tsx","../src/l4-molecules/drop-zone.tsx","../src/l4-molecules/dropdown.tsx","../src/l4-molecules/editable.tsx","../src/l4-molecules/emoji-picker.tsx","../src/l4-molecules/empty-placeholder.tsx","../src/l4-molecules/empty-search.tsx","../src/l4-molecules/environment-badge.tsx","../src/l4-molecules/feature-flag.tsx","../src/l4-molecules/field-group.tsx","../src/l4-molecules/field-set.tsx","../src/l4-molecules/file-upload.tsx","../src/l4-molecules/filter-bar.tsx","../src/l4-molecules/flip-card.tsx","../src/l4-molecules/form-actions.tsx","../src/l4-molecules/form-field.tsx","../src/l4-molecules/glass-button.tsx","../src/l4-molecules/glass-card.tsx","../src/l4-molecules/glitch-text.tsx","../src/l4-molecules/hover-card.tsx","../src/l4-molecules/info-row.tsx","../src/l4-molecules/input-group.tsx","../src/l4-molecules/input-with-button.tsx","../src/l4-molecules/key-value-list.tsx","../src/l4-molecules/kv-table.tsx","../src/l4-molecules/link-preview.tsx","../src/l4-molecules/live-metric.tsx","../src/l4-molecules/loading-overlay.tsx","../src/l4-molecules/matrix-rain.tsx","../src/l4-molecules/media-container.tsx","../src/l4-molecules/media-object.tsx","../src/l4-molecules/mention-list.tsx","../src/l4-molecules/mention-input.tsx","../src/l4-molecules/metric-row.tsx","../src/l4-molecules/metric-tile.tsx","../src/l4-molecules/morphing-shape.tsx","../src/l4-molecules/multi-select-list.tsx","../src/l4-molecules/multi-select.tsx","../src/l4-molecules/nav-item.tsx","../src/l4-molecules/network-status.tsx","../src/l4-molecules/noise-overlay.tsx","../src/l4-molecules/notification-bell.tsx","../src/l4-molecules/notification-dot.tsx","../src/l4-molecules/num-table.tsx","../src/l4-molecules/otp-input.tsx","../src/l4-molecules/overflow-menu.tsx","../src/l4-molecules/page-nav.tsx","../src/l4-molecules/pagination.tsx","../src/l4-molecules/panel.tsx","../src/l4-molecules/particle-field.tsx","../src/l4-molecules/password-input.tsx","../src/l4-molecules/phone-input.tsx","../src/l4-molecules/pin-input.tsx","../src/l4-molecules/popover.tsx","../src/l4-molecules/quick-stat.tsx","../src/l4-molecules/radio-card.tsx","../src/l4-molecules/reveal.tsx","../src/l4-molecules/scoreboard.tsx","../src/l4-molecules/search-input.tsx","../src/l4-molecules/select.tsx","../src/l4-molecules/slider-field.tsx","../src/l4-molecules/sortable-header.tsx","../src/l4-molecules/split-button.tsx","../src/l4-molecules/stacked-progress.tsx","../src/l4-molecules/stat-comparison.tsx","../src/l4-molecules/stat-trend.tsx","../src/l4-molecules/status-bar-component.tsx","../src/l4-molecules/tabs.tsx","../src/l4-molecules/tab-group.tsx","../src/l4-molecules/tag-input.tsx","../src/l4-molecules/text-reveal.tsx","../src/l4-molecules/text-scramble.tsx","../src/l4-molecules/tilt-card.tsx","../src/l4-molecules/time-picker-grid.tsx","../src/l4-molecules/time-picker.tsx","../src/l4-molecules/timeline-item.tsx","../src/l4-molecules/toast-store.ts","../src/l4-molecules/toast-provider.tsx","../src/l4-molecules/toggle-field.tsx","../src/l4-molecules/toolbar-generic.tsx","../src/l4-molecules/toolbar-group.tsx","../src/l4-molecules/upload-progress.tsx","../src/l4-molecules/user-card.tsx","../src/l4-molecules/user-info.tsx","../src/l4-molecules/user-menu.tsx","../src/l4-molecules/version-badge.tsx","../src/l4-molecules/watermark.tsx","../src/l4-molecules/wizard.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ActionCardProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n description?: string\n icon?: ReactNode\n onClick: () => void\n title: string\n}\n\nexport const ActionCard = forwardRef<HTMLDivElement, ActionCardProps>(\n function ActionCard(\n { className, description, icon, onClick, title, ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-gap gds-pad gds-radius flex cursor-pointer items-center',\n 'border-border bg-surface hover:bg-surface-hover border transition-colors',\n className\n )}\n data-component=\"action-card\"\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n }}\n ref={ref}\n role=\"button\"\n tabIndex={0}\n {...props}\n >\n {icon !== undefined && (\n <span className=\"text-accent shrink-0\">{icon}</span>\n )}\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-fg text-sm font-medium\">{title}</span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs\">{description}</span>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { ActionCardProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { IconButton } from '../l2-primitives/icon-button'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype ActionMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n danger?: boolean\n}\n\ntype ActionMenuProps = {\n items: ActionMenuItem[]\n onSelect: (id: string) => void\n disabled?: boolean\n className?: string\n}\n\nconst dotsIcon = (\n <svg className=\"h-4 w-4\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" />\n </svg>\n)\n\nexport const ActionMenu = forwardRef<HTMLDivElement, ActionMenuProps>(\n function ActionMenu({ className, disabled, items, onSelect }, ref) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n className={cx('relative inline-block', className)}\n data-component=\"action-menu\"\n ref={ref}\n >\n <div ref={containerRef}>\n <IconButton\n disabled={disabled}\n icon={dotsIcon}\n onClick={() => setOpen((prev) => !prev)}\n tooltip=\"Actions\"\n variant=\"default\"\n />\n {open && (\n <div className=\"animate-popup border-border bg-surface absolute right-0 z-50 mt-1 min-w-[140px] rounded-lg border py-1 shadow-lg\">\n {items.map((item) => (\n <button\n key={item.id}\n className={cx(\n 'gds-gap-sm gds-text-body flex w-full items-center px-3 py-1.5 transition-colors',\n focusCls,\n item.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n type=\"button\"\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { ActionMenuItem, ActionMenuProps }\n","// activity-log — vertical feed of timestamped activity entries\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ActivityEntry = {\n action: string\n actor: string\n id: string\n target?: string\n timestamp: string\n}\n\nexport type ActivityLogProps = {\n className?: string\n entries: ActivityEntry[]\n}\n\nexport const ActivityLog = forwardRef<HTMLDivElement, ActivityLogProps>(\n function ActivityLog({ className, entries }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"activity-log\"\n >\n {entries.map((entry) => (\n <div\n key={entry.id}\n className=\"gds-gap-sm border-border flex items-start border-l-2 py-1 pl-3\"\n >\n <div className=\"min-w-0 flex-1\">\n <span className=\"gds-text text-fg font-medium\">\n {entry.actor}\n </span>\n <span className=\"bg-bg-tertiary text-fg-muted mx-1.5 inline-block rounded px-1.5 py-0.5 text-xs\">\n {entry.action}\n </span>\n {entry.target !== undefined && (\n <span className=\"gds-text text-fg-secondary\">\n {entry.target}\n </span>\n )}\n </div>\n <time className=\"text-fg-muted shrink-0 text-xs\">\n {entry.timestamp}\n </time>\n </div>\n ))}\n </div>\n )\n }\n)\n","// alert — contextual feedback banner with variant colors and optional close\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst alertVariants = cva(\n 'flex items-start gds-gap gds-radius-popover border gds-pad-x gds-pad-y gds-text-body',\n {\n variants: {\n variant: {\n default: 'border-border bg-bg-secondary text-fg',\n info: 'border-accent/30 bg-accent/10 text-accent',\n success: 'border-success/30 bg-success/10 text-success',\n warning: 'border-warning/30 bg-warning/10 text-warning',\n danger: 'border-danger/30 bg-danger/10 text-danger',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst variantIcons: Record<string, React.ReactNode> = {\n default: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5v3M8 10.5h.01\" />\n </svg>\n ),\n info: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" />\n <path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n danger: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n}\n\nexport type AlertProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof alertVariants> & {\n title?: string\n onClose?: () => void\n glass?: boolean\n }\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n { children, title, variant = 'default', onClose, glass, className, ...props },\n ref\n) {\n const v = variant ?? 'default'\n\n return (\n <div\n ref={ref}\n className={cx(\n alertVariants({ variant }),\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"alert\"\n data-variant={v}\n role=\"alert\"\n {...props}\n >\n <span className=\"mt-px shrink-0\">{variantIcons[v]}</span>\n <div className=\"min-w-0 flex-1\">\n {title !== undefined && <p className=\"mb-0.5 font-medium\">{title}</p>}\n <div className=\"text-inherit/80\">{children}</div>\n </div>\n {onClose !== undefined && (\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button shrink-0 p-0.5 opacity-60 hover:opacity-100',\n focusCls\n )}\n aria-label=\"Dismiss\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n})\n\nexport { alertVariants }\n","// banner — full-width contextual feedback strip with variant colors and optional dismiss\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype BannerVariant = 'danger' | 'info' | 'success' | 'warning'\n\nconst variantStyles: Record<BannerVariant, string> = {\n danger: 'bg-danger/10 text-danger',\n info: 'bg-accent/10 text-accent',\n success: 'bg-success/10 text-success',\n warning: 'bg-warning/10 text-warning',\n}\n\nconst variantIcons: Record<BannerVariant, ReactNode> = {\n danger: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n info: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" />\n <path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n}\n\nexport type BannerProps = {\n message: ReactNode\n variant?: BannerVariant\n dismissible?: boolean\n onDismiss?: () => void\n glass?: boolean\n className?: string\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n {\n message,\n variant = 'info',\n dismissible = false,\n onDismiss,\n glass,\n className,\n },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y gds-text-body flex w-full items-center',\n variantStyles[variant],\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"banner\"\n data-variant={variant}\n role=\"status\"\n >\n <span className=\"shrink-0\">{variantIcons[variant]}</span>\n <span className=\"flex-1\">{message}</span>\n {dismissible && onDismiss !== undefined && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className={cx(\n 'gds-radius-button shrink-0 p-0.5 transition-opacity hover:opacity-70',\n focusCls\n )}\n aria-label=\"Dismiss\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n})\n\nexport type { BannerVariant }\n","// before-after — interactive slider to compare two overlaid views\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BeforeAfterProps = {\n before: ReactNode\n after: ReactNode\n initialPosition?: number\n className?: string\n}\n\nexport const BeforeAfter = forwardRef<HTMLDivElement, BeforeAfterProps>(\n function BeforeAfter(\n { before, after, initialPosition = 50, className },\n ref\n ) {\n const [position, setPosition] = useState(initialPosition)\n const containerRef = useRef<HTMLDivElement>(null)\n const dragging = useRef(false)\n\n const updatePosition = useCallback((clientX: number) => {\n const el = containerRef.current\n if (el === null) return\n const rect = el.getBoundingClientRect()\n const x = clientX - rect.left\n const pct = Math.max(0, Math.min(100, (x / rect.width) * 100))\n setPosition(pct)\n }, [])\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n dragging.current = true\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n updatePosition(e.clientX)\n },\n [updatePosition]\n )\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!dragging.current) return\n updatePosition(e.clientX)\n },\n [updatePosition]\n )\n\n const onPointerUp = useCallback(() => {\n dragging.current = false\n }, [])\n\n return (\n <div\n ref={(node) => {\n ;(\n containerRef as React.MutableRefObject<HTMLDivElement | null>\n ).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n className={cx(\n 'gds-radius relative overflow-hidden select-none',\n className\n )}\n data-component=\"before-after\"\n style={{ cursor: 'ew-resize' }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n >\n {/* after layer (full width, behind) */}\n <div className=\"relative\">{after}</div>\n\n {/* before layer (clipped) */}\n <div\n className=\"absolute inset-0\"\n style={{ clipPath: `inset(0 ${100 - position}% 0 0)` }}\n >\n {before}\n </div>\n\n {/* divider handle */}\n <div\n className=\"bg-fg/80 absolute inset-y-0 z-10 w-0.5\"\n style={{ left: `${position}%` }}\n >\n <div className=\"border-border bg-bg absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full border p-1 shadow\">\n <svg\n className=\"text-fg-muted h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 6l-4 6 4 6M16 6l4 6-4 6\" />\n </svg>\n </div>\n </div>\n </div>\n )\n }\n)\n","// bottom-bar — fixed bottom navigation bar\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BottomBarProps = {\n children: ReactNode\n className?: string\n}\n\nexport const BottomBar = forwardRef<HTMLDivElement, BottomBarProps>(\n function BottomBar({ children, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-bg gds-pad-y fixed right-0 bottom-0 left-0 z-40 flex items-center justify-around border-t',\n className\n )}\n data-component=\"bottom-bar\"\n >\n {children}\n </div>\n )\n }\n)\n","// breadcrumb — navigation trail with collapsible items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BreadcrumbItem = {\n label: string\n href?: string\n icon?: ReactNode\n}\n\nexport type BreadcrumbProps = {\n items: BreadcrumbItem[]\n separator?: ReactNode\n maxItems?: number\n className?: string\n}\n\nconst defaultSeparator = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M4.5 3l3 3-3 3\" />\n </svg>\n)\n\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n function Breadcrumb(\n { items, separator = defaultSeparator, maxItems, className },\n ref\n ) {\n let visibleItems = items\n\n if (maxItems !== undefined && items.length > maxItems && maxItems >= 2) {\n const first = items[0]\n const last = items[items.length - 1]\n const ellipsis: BreadcrumbItem = { label: '...' }\n visibleItems = [first, ellipsis, last]\n }\n\n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={cx(className)}\n data-component=\"breadcrumb\"\n >\n <ol className=\"gds-gap-sm gds-text-body text-fg-muted flex items-center\">\n {visibleItems.map((item, i) => (\n <li\n key={`${item.label}-${i}`}\n className=\"gds-gap-sm flex items-center\"\n >\n {i > 0 && (\n <span className=\"text-fg-muted/50\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n {item.href !== undefined ? (\n <a href={item.href} className=\"hover:text-fg transition-colors\">\n {item.label}\n </a>\n ) : (\n <span\n className={cx(i === visibleItems.length - 1 && 'text-fg')}\n >\n {item.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )\n }\n)\n","// bulk-action-bar — bar that appears when items are selected\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype BulkActionBarProps = {\n actions: ReactNode\n className?: string\n count: number\n onClear?: () => void\n}\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nexport const BulkActionBar = forwardRef<HTMLDivElement, BulkActionBarProps>(\n function BulkActionBar({ actions, className, count, onClear }, ref) {\n if (count <= 0) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x-lg gds-pad-y fixed bottom-4 left-1/2 z-40 flex -translate-x-1/2 items-center',\n 'animate-popup gds-radius-popover border-border bg-surface gds-shadow-xl border',\n className\n )}\n data-component=\"bulk-action-bar\"\n >\n <span className=\"gds-text-body text-fg font-medium whitespace-nowrap select-none\">\n {count} selected\n </span>\n <div className=\"gds-gap-sm flex items-center\">{actions}</div>\n {onClear !== undefined && (\n <button\n aria-label=\"Clear selection\"\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n {closeIcon}\n </button>\n )}\n </div>\n )\n }\n)\n\nexport type { BulkActionBarProps }\n","// callout — prominent message box with icon, title, and variant colors\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype CalloutVariant = 'info' | 'tip' | 'warning' | 'danger'\n\nconst variantStyles: Record<CalloutVariant, string> = {\n info: 'border-l-accent bg-accent/5 text-accent',\n tip: 'border-l-success bg-success/5 text-success',\n warning: 'border-l-warning bg-warning/5 text-warning',\n danger: 'border-l-danger bg-danger/5 text-danger',\n}\n\nconst defaultIcons: Record<CalloutVariant, ReactNode> = {\n info: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M10 7h.01M10 9.5v4\" />\n </svg>\n ),\n tip: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7.5 15h5M8 17h4M10 2a5.5 5.5 0 0 0-2 10.65V14h4v-1.35A5.5 5.5 0 0 0 10 2z\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M9.13 3l-7 12.5h14l-7-12.5z\" />\n <path d=\"M9.63 8.5v3M9.63 13.5h.01\" />\n </svg>\n ),\n danger: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" />\n </svg>\n ),\n}\n\nexport type CalloutProps = {\n variant?: CalloutVariant\n title?: string\n children: ReactNode\n icon?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const Callout = forwardRef<HTMLDivElement, CalloutProps>(\n function Callout(\n { variant = 'info', title, children, icon, glass, className },\n ref\n ) {\n const resolvedIcon = icon ?? defaultIcons[variant]\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover gds-pad-x-lg gds-pad-y-lg gds-text-body flex items-start gap-3 border-l-[3px]',\n variantStyles[variant],\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"callout\"\n data-variant={variant}\n >\n <span className=\"mt-0.5 shrink-0\">{resolvedIcon}</span>\n <div className=\"min-w-0 flex-1\">\n {title !== undefined && <p className=\"mb-1 font-semibold\">{title}</p>}\n <div className=\"text-inherit/80\">{children}</div>\n </div>\n </div>\n )\n }\n)\n","// card — composition-based content container\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype CardPadding = 'default' | 'lg' | 'none' | 'sm'\n\nconst paddingMap: Record<CardPadding, string> = {\n none: '',\n sm: 'gds-pad-x gds-pad-y',\n default: 'gds-pad-x-lg gds-pad-y-lg',\n lg: 'gds-pad-x-lg gds-pad-y-lg',\n}\n\nexport type CardProps = {\n children: ReactNode\n className?: string\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Show pulse skeleton placeholder */\n loading?: boolean\n /** Click handler — adds cursor-pointer and hover effect */\n onClick?: () => void\n /** Inner padding preset */\n padding?: CardPadding\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n { children, className, glass, loading, onClick, padding = 'default' },\n ref\n) {\n if (loading === true) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-gap gds-radius-card border-border bg-bg-tertiary flex animate-pulse flex-col border',\n paddingMap[padding],\n className\n )}\n data-component=\"card\"\n data-state=\"loading\"\n >\n <div className=\"h-20\" />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-gap gds-radius-card flex flex-col border transition-colors',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n onClick !== undefined &&\n 'hover:border-fg-muted/40 hover:bg-surface/80 cursor-pointer',\n paddingMap[padding],\n className\n )}\n data-component=\"card\"\n onClick={onClick}\n >\n {children}\n </div>\n )\n})\n\nexport type CardHeaderProps = {\n action?: ReactNode\n children?: ReactNode\n className?: string\n description?: string\n title?: string\n}\n\nexport function CardHeader({\n action,\n children,\n className,\n description,\n title,\n}: CardHeaderProps) {\n if (children !== undefined) {\n return (\n <div\n className={cx('gds-gap flex items-start justify-between', className)}\n >\n {children}\n </div>\n )\n }\n return (\n <div className={cx('gds-gap flex items-start justify-between', className)}>\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h3 className=\"text-fg text-sm font-semibold\">{title}</h3>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">{description}</p>\n )}\n </div>\n {action !== undefined && <div className=\"shrink-0\">{action}</div>}\n </div>\n )\n}\n\nexport type CardContentProps = {\n children: ReactNode\n className?: string\n}\n\nexport function CardContent({ children, className }: CardContentProps) {\n return <div className={className}>{children}</div>\n}\n\nexport type CardFooterProps = {\n children: ReactNode\n className?: string\n}\n\nexport function CardFooter({ children, className }: CardFooterProps) {\n return (\n <div\n className={cx(\n 'gds-gap-sm border-border flex items-center border-t pt-3',\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\n\ntype CategoryTagProps = React.HTMLAttributes<HTMLDivElement> & {\n color: string\n count?: number\n label: string\n onClick?: () => void\n}\n\nexport const CategoryTag = forwardRef<HTMLDivElement, CategoryTagProps>(\n function CategoryTag(\n { className, color, count, label, onClick, ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'border-border bg-surface inline-flex items-center gap-2 rounded-md border px-2.5 py-1',\n onClick !== undefined && 'hover:bg-bg-tertiary cursor-pointer',\n className\n )}\n data-component=\"category-tag\"\n onClick={onClick}\n onKeyDown={\n onClick !== undefined\n ? (e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n onClick()\n }\n }\n : undefined\n }\n ref={ref}\n role={onClick !== undefined ? 'button' : undefined}\n tabIndex={onClick !== undefined ? 0 : undefined}\n {...props}\n >\n <span\n className=\"h-3 w-1 shrink-0 rounded-full\"\n style={{ backgroundColor: color }}\n />\n <span className=\"gds-text-label text-fg\">{label}</span>\n {count !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{count}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { CategoryTagProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CertBadgeStatus = 'expired' | 'expiring' | 'valid'\n\ntype CertBadgeProps = React.HTMLAttributes<HTMLDivElement> & {\n domain: string\n expiresAt: string\n status: CertBadgeStatus\n}\n\nconst statusCls: Record<CertBadgeStatus, string> = {\n valid: 'bg-success/15 text-success border-success/20',\n expiring: 'bg-warning/15 text-warning border-warning/20',\n expired: 'bg-danger/15 text-danger border-danger/20',\n}\n\nconst statusIcon: Record<CertBadgeStatus, string> = {\n valid: '🔒',\n expiring: '⚠️',\n expired: '❌',\n}\n\nexport const CertBadge = forwardRef<HTMLDivElement, CertBadgeProps>(\n function CertBadge({ className, domain, expiresAt, status, ...props }, ref) {\n return (\n <div\n className={cx(\n 'inline-flex items-center gap-2 rounded-md border px-2.5 py-1.5',\n statusCls[status],\n className\n )}\n data-component=\"cert-badge\"\n ref={ref}\n {...props}\n >\n <span className=\"text-xs\">{statusIcon[status]}</span>\n <span className=\"gds-text-label font-medium\">{domain}</span>\n <span className=\"gds-text-label opacity-70\">{expiresAt}</span>\n </div>\n )\n }\n)\n\nexport type { CertBadgeProps, CertBadgeStatus }\n","import { forwardRef } from 'react'\n\nimport { Chip } from '../l3-atoms/chip'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype ChipGroupOption = { value: string; label: string }\n\ntype ChipGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n options: ChipGroupOption[]\n value: string[]\n onChange: (value: string[]) => void\n exclusive?: boolean\n className?: string\n}\n\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(\n function ChipGroup(\n { options, value, onChange, exclusive = false, className, ...props },\n ref\n ) {\n function handleClick(optionValue: string) {\n if (exclusive) {\n const next = value.includes(optionValue) ? [] : [optionValue]\n onChange(next)\n return\n }\n const next = value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue]\n onChange(next)\n }\n\n return (\n <div\n className={cx('gds-gap flex flex-wrap', className)}\n data-component=\"chip-group\"\n ref={ref}\n {...props}\n >\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className={cx('cursor-pointer', focusCls)}\n onClick={() => handleClick(opt.value)}\n >\n <Chip\n label={opt.label}\n variant={value.includes(opt.value) ? 'accent' : 'default'}\n />\n </button>\n ))}\n </div>\n )\n }\n)\n\nexport type { ChipGroupOption, ChipGroupProps }\n","// circular-menu — radial popup menu around a trigger\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useEscapeKey } from '../utils/hooks'\n\nexport type CircularMenuItem = {\n icon: ReactNode\n id: string\n label: string\n}\n\nexport type CircularMenuProps = {\n className?: string\n items: CircularMenuItem[]\n radius?: number\n trigger: ReactNode\n}\n\nexport const CircularMenu = forwardRef<HTMLDivElement, CircularMenuProps>(\n function CircularMenu({ className, items, radius = 80, trigger }, ref) {\n const [open, setOpen] = useState(false)\n\n const toggle = useCallback(() => setOpen((prev) => !prev), [])\n const close = useCallback(() => setOpen(false), [])\n\n useEscapeKey(open, close)\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"circular-menu\"\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cx('relative z-10 cursor-pointer', focusCls)}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle()\n }\n }}\n >\n {trigger}\n </div>\n {open && (\n <div className=\"absolute top-1/2 left-1/2\">\n {items.map((item, i) => {\n const angle = (2 * Math.PI * i) / items.length - Math.PI / 2\n const x = Math.cos(angle) * radius\n const y = Math.sin(angle) * radius\n return (\n <button\n key={item.id}\n type=\"button\"\n title={item.label}\n className={cx(\n 'bg-surface border-border absolute flex items-center justify-center rounded-full border',\n 'text-fg h-10 w-10 -translate-x-1/2 -translate-y-1/2 transition-all duration-200',\n focusCls\n )}\n style={{ transform: `translate(${x}px, ${y}px)` }}\n >\n {item.icon}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\n","// code-block — styled code display with line numbers and copy button\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CodeBlockProps = {\n code: string\n language?: string\n showLineNumbers?: boolean\n maxHeight?: number | string\n glass?: boolean\n className?: string\n}\n\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(\n function CodeBlock(\n { code, language, showLineNumbers = true, maxHeight, glass, className },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n navigator.clipboard\n .writeText(code)\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [code])\n\n const lines = code.split('\\n')\n const lineNumberWidth = String(lines.length).length\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover overflow-hidden border',\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-bg-tertiary',\n className\n )}\n data-component=\"code-block\"\n data-variant={glass === true ? 'glass' : 'default'}\n >\n {/* header */}\n <div className=\"border-border/50 flex items-center justify-between border-b px-3 py-1.5\">\n <span\n className=\"text-fg-muted text-xs select-none\"\n data-testid=\"code-language\"\n >\n {language ?? 'code'}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg px-2 py-0.5 text-xs transition-colors select-none',\n focusCls\n )}\n aria-label=\"Copy code\"\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <path d=\"M9.5 4.5V3a1.5 1.5 0 00-1.5-1.5H3A1.5 1.5 0 001.5 3v5A1.5 1.5 0 003 9.5h1.5\" />\n </svg>\n )}\n </button>\n </div>\n\n {/* code body */}\n <div\n className=\"overflow-auto\"\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n data-selectable\n >\n <pre className=\"m-0 p-0\">\n <code className=\"text-fg block px-3 py-2 font-mono text-xs leading-5\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n {showLineNumbers && (\n <span\n className=\"border-border/30 text-fg-muted/40 mr-3 inline-block border-r pr-3 text-right select-none\"\n style={{ minWidth: `${lineNumberWidth}ch` }}\n >\n {i + 1}\n </span>\n )}\n <span className=\"flex-1 whitespace-pre\">{line}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n )\n }\n)\n","// code-snippet — compact code display with optional line numbers and copy\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CodeSnippetProps = {\n code: string\n language?: string\n copyable?: boolean\n showLineNumbers?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const CodeSnippet = forwardRef<HTMLPreElement, CodeSnippetProps>(\n function CodeSnippet(\n {\n code,\n language,\n copyable = true,\n showLineNumbers = true,\n glass,\n className,\n },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const lines = code.split('\\n')\n\n const handleCopy = useCallback(() => {\n navigator.clipboard\n .writeText(code)\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [code])\n\n return (\n <div\n className={cx(\n 'group gds-radius-popover relative overflow-hidden border',\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border/40 bg-bg-secondary',\n className\n )}\n data-component=\"code-snippet\"\n >\n {/* header */}\n {language !== undefined && (\n <div className=\"border-border/20 flex items-center justify-between border-b px-3 py-1.5\">\n <span className=\"text-fg-muted/40 text-[10px] uppercase select-none\">\n {language}\n </span>\n </div>\n )}\n\n {/* copy button */}\n {copyable && (\n <button\n type=\"button\"\n aria-label=\"Copy code\"\n className={cx(\n 'gds-radius-button bg-bg-tertiary/80 text-fg-muted hover:text-fg absolute top-2 right-2 flex h-6 w-6 items-center justify-center opacity-0 transition-opacity group-hover:opacity-100',\n focusCls\n )}\n onClick={handleCopy}\n >\n {copied ? (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n ) : (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <path d=\"M9.5 4.5V3a1.5 1.5 0 00-1.5-1.5H3A1.5 1.5 0 001.5 3v5A1.5 1.5 0 003 9.5h1.5\" />\n </svg>\n )}\n </button>\n )}\n\n {/* code */}\n <pre\n ref={ref}\n className=\"text-fg overflow-x-auto p-3 font-mono text-[11px] leading-relaxed\"\n data-selectable\n >\n <code>\n {lines.map((line, i) => (\n <div className=\"flex\" key={i}>\n {showLineNumbers && (\n <span className=\"text-fg-muted/30 mr-4 inline-block w-6 shrink-0 text-right select-none\">\n {i + 1}\n </span>\n )}\n <span className=\"flex-1\">{line || ' '}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n )\n }\n)\n","// collapsible — simple trigger + content toggle\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CollapsibleProps = {\n trigger: ReactNode\n children: ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n className?: string\n}\n\nconst Collapsible = forwardRef<HTMLDivElement, CollapsibleProps>(\n function Collapsible(\n {\n trigger,\n children,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n className,\n },\n ref\n ) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n function handleToggle() {\n const next = !isOpen\n if (!isControlled) {\n setInternalOpen(next)\n }\n if (onOpenChange !== undefined) {\n onOpenChange(next)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('w-full', className)}\n data-component=\"collapsible\"\n >\n <button\n aria-expanded={isOpen}\n className=\"w-full cursor-pointer text-left select-none\"\n onClick={handleToggle}\n type=\"button\"\n >\n {trigger}\n </button>\n <div\n className={cx(\n 'overflow-hidden transition-[max-height] duration-200',\n isOpen ? 'max-h-[2000px]' : 'max-h-0'\n )}\n data-state={isOpen ? 'open' : 'closed'}\n >\n {isOpen ? children : null}\n </div>\n </div>\n )\n }\n)\n\n// composition sub-components for admin compatibility\ntype CollapsibleTriggerProps = { children: ReactNode; className?: string }\nfunction CollapsibleTrigger({ children, className }: CollapsibleTriggerProps) {\n return <div className={className}>{children}</div>\n}\n\ntype CollapsibleContentProps = { children: ReactNode; className?: string }\nfunction CollapsibleContent({ children, className }: CollapsibleContentProps) {\n return <div className={className}>{children}</div>\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger }\nexport type {\n CollapsibleContentProps,\n CollapsibleProps,\n CollapsibleTriggerProps,\n}\n","// color-picker — preset swatches + custom hex input\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nconst DEFAULT_PRESETS = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#06b6d4',\n '#3b82f6',\n '#8b5cf6',\n '#ec4899',\n '#64748b',\n '#ffffff',\n]\n\nconst HEX_REGEX = /^#[0-9a-fA-F]{6}$/\n\nexport type ColorPickerProps = {\n value: string\n onChange: (color: string) => void\n presets?: string[]\n showInput?: boolean\n disabled?: boolean\n className?: string\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n function ColorPicker(\n { value, onChange, presets, showInput = true, disabled = false, className },\n ref\n ) {\n const swatches = presets ?? DEFAULT_PRESETS\n const [inputValue, setInputValue] = useState(value)\n\n const handleSwatchClick = useCallback(\n (color: string) => {\n if (disabled) return\n onChange(color)\n setInputValue(color)\n },\n [disabled, onChange]\n )\n\n const handleInputChange = useCallback(\n (raw: string) => {\n // ensure # prefix\n const normalized = raw.startsWith('#') ? raw : `#${raw}`\n setInputValue(normalized)\n\n if (HEX_REGEX.test(normalized)) {\n onChange(normalized)\n }\n },\n [onChange]\n )\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"color-picker\"\n data-disabled={disabled ? '' : undefined}\n >\n {/* current color preview */}\n <div className=\"gds-gap flex items-center\">\n <div\n className=\"gds-radius-button border-border h-8 w-8 shrink-0 border\"\n style={{ backgroundColor: value }}\n />\n <span className=\"gds-text-body text-fg-muted font-mono\">{value}</span>\n </div>\n\n {/* preset swatches */}\n <div className=\"flex flex-wrap gap-1.5\">\n {swatches.map((color) => {\n const isActive = color.toLowerCase() === value.toLowerCase()\n return (\n <button\n key={color}\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSwatchClick(color)}\n className={cx(\n 'h-6 w-6 rounded-full border transition-shadow',\n isActive\n ? 'ring-accent ring-offset-bg border-transparent ring-2 ring-offset-1'\n : 'border-border hover:scale-110',\n disabled && 'cursor-not-allowed opacity-40',\n focusCls\n )}\n style={{ backgroundColor: color }}\n aria-label={`Select color ${color}`}\n />\n )\n })}\n </div>\n\n {/* hex input */}\n {showInput && (\n <div className=\"gds-gap flex items-center\">\n <span className=\"gds-text-body text-fg-muted font-mono select-none\">\n #\n </span>\n <input\n type=\"text\"\n value={inputValue.replace(/^#/, '')}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n maxLength={6}\n placeholder=\"000000\"\n className={cx(\n 'border-border gds-text-body text-fg w-20 rounded border bg-transparent px-2 py-1 font-mono',\n 'focus:border-accent focus:outline-none',\n disabled && 'cursor-not-allowed opacity-40'\n )}\n aria-label=\"Hex color input\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n","// combobox-list — dropdown option list for combobox (internal)\nimport { useCallback } from 'react'\n\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype ComboboxOption = {\n label: string\n value: string\n}\n\ntype ComboboxListProps = {\n creatable?: boolean\n filtered: ComboboxOption[]\n glass?: boolean\n highlightedIndex: number\n loading?: boolean\n onCreateOption?: (value: string) => void\n onSearchChange: (value: string) => void\n onSelect: (value: string) => void\n query: string\n searchPlaceholder: string\n searchRef: React.RefObject<HTMLInputElement | null>\n setHighlightedIndex: (index: number) => void\n value: string | null\n}\n\nfunction ComboboxList({\n creatable = false,\n filtered,\n glass,\n highlightedIndex,\n loading = false,\n onCreateOption,\n onSearchChange,\n onSelect,\n query,\n searchPlaceholder,\n searchRef,\n setHighlightedIndex,\n value,\n}: ComboboxListProps) {\n // determine if the \"Create\" row should appear\n const showCreate =\n creatable && query.trim() !== '' && filtered.length === 0 && !loading\n // total navigable items includes the create row\n const totalItems = filtered.length + (showCreate ? 1 : 0)\n\n const handleSearchKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIndex(\n highlightedIndex >= totalItems - 1 ? 0 : highlightedIndex + 1\n )\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIndex(\n highlightedIndex <= 0 ? totalItems - 1 : highlightedIndex - 1\n )\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n // if create row is highlighted\n if (showCreate && highlightedIndex === filtered.length) {\n if (onCreateOption !== undefined) {\n onCreateOption(query.trim())\n }\n return\n }\n const target = filtered[highlightedIndex]\n if (target !== undefined) {\n onSelect(target.value)\n }\n }\n },\n [\n filtered,\n highlightedIndex,\n onSelect,\n setHighlightedIndex,\n totalItems,\n showCreate,\n onCreateOption,\n query,\n ]\n )\n\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div className=\"border-border border-b p-1.5\">\n <input\n className=\"text-fg placeholder:text-fg-muted/50 w-full bg-transparent px-2 py-1 text-sm outline-none\"\n onChange={(e) => onSearchChange(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n placeholder={searchPlaceholder}\n ref={searchRef}\n type=\"text\"\n value={query}\n />\n </div>\n <div className=\"max-h-60 overflow-y-auto py-1\">\n {loading && (\n <div className=\"gds-pad-y-sm flex items-center justify-center\">\n <Spinner className=\"text-fg-muted h-4 w-4\" />\n </div>\n )}\n {!loading && filtered.length === 0 && !showCreate && (\n <div className=\"gds-pad-x gds-pad-y-sm text-fg-muted text-sm\">\n No results\n </div>\n )}\n {!loading &&\n filtered.map((opt, index) => {\n const isActive = opt.value === value\n const isHighlighted = index === highlightedIndex\n return (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm flex w-full items-center text-left text-sm transition-colors',\n isActive && 'bg-accent/10 text-accent',\n !isActive && 'text-fg',\n isHighlighted && !isActive && 'bg-bg-tertiary',\n !isHighlighted && !isActive && 'hover:bg-bg-tertiary'\n )}\n key={opt.value}\n onClick={() => onSelect(opt.value)}\n onMouseEnter={() => setHighlightedIndex(index)}\n type=\"button\"\n >\n {opt.label}\n </button>\n )\n })}\n {showCreate && (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm text-accent flex w-full items-center text-left text-sm transition-colors',\n highlightedIndex === filtered.length && 'bg-bg-tertiary',\n highlightedIndex !== filtered.length && 'hover:bg-bg-tertiary'\n )}\n onClick={() => {\n if (onCreateOption !== undefined) {\n onCreateOption(query.trim())\n }\n }}\n onMouseEnter={() => setHighlightedIndex(filtered.length)}\n type=\"button\"\n >\n Create: {query.trim()}\n </button>\n )}\n </div>\n </div>\n )\n}\n\nexport { ComboboxList }\nexport type { ComboboxListProps, ComboboxOption }\n","// combobox — searchable select dropdown\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport type { ComboboxOption } from './combobox-list'\nimport { ComboboxList } from './combobox-list'\n\ntype ComboboxProps = {\n className?: string\n creatable?: boolean\n debounce?: number\n disabled?: boolean\n error?: boolean\n glass?: boolean\n loading?: boolean\n onChange: (value: string | null) => void\n onCreateOption?: (value: string) => ComboboxOption\n onSearch?: (query: string) => Promise<ComboboxOption[]>\n options: ComboboxOption[]\n placeholder?: string\n searchPlaceholder?: string\n value: string | null\n}\n\n// chevron icon\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n function Combobox(\n {\n className,\n creatable = false,\n debounce: debounceDuration = 300,\n disabled = false,\n error = false,\n glass,\n loading: externalLoading = false,\n onChange,\n onCreateOption,\n onSearch,\n options,\n placeholder = 'Select...',\n searchPlaceholder = 'Search...',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const [asyncResults, setAsyncResults] = useState<ComboboxOption[] | null>(\n null\n )\n const [asyncLoading, setAsyncLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n // merge forwarded ref with internal ref\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n // debounced async search\n useEffect(() => {\n if (onSearch === undefined) return\n if (!open) return\n\n if (query === '') {\n setAsyncResults(null)\n setAsyncLoading(false)\n return\n }\n\n setAsyncLoading(true)\n const timer = setTimeout(() => {\n onSearch(query)\n .then((results) => {\n setAsyncResults(results)\n setHighlightedIndex(0)\n })\n .finally(() => {\n setAsyncLoading(false)\n })\n }, debounceDuration)\n\n return () => {\n clearTimeout(timer)\n }\n }, [query, onSearch, open, debounceDuration])\n\n const isLoading = externalLoading || asyncLoading\n\n const filtered = useMemo(() => {\n // when async search is active, use async results\n if (onSearch !== undefined) {\n if (asyncResults !== null) return asyncResults\n return options\n }\n if (query === '') return options\n const lower = query.toLowerCase()\n return options.filter((opt) => opt.label.toLowerCase().includes(lower))\n }, [options, query, onSearch, asyncResults])\n\n const selectedOption = useMemo(\n () => options.find((opt) => opt.value === value),\n [options, value]\n )\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n setQuery('')\n setHighlightedIndex(0)\n // auto-focus search input after render\n requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n setQuery('')\n setAsyncResults(null)\n setAsyncLoading(false)\n }, [])\n\n const handleSelect = useCallback(\n (optionValue: string) => {\n onChange(optionValue)\n handleClose()\n },\n [onChange, handleClose]\n )\n\n const handleCreate = useCallback(\n (inputValue: string) => {\n if (onCreateOption === undefined) return\n const newOption = onCreateOption(inputValue)\n onChange(newOption.value)\n handleClose()\n },\n [onCreateOption, onChange, handleClose]\n )\n\n const handleSearchChange = useCallback((val: string) => {\n setQuery(val)\n setHighlightedIndex(0)\n }, [])\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"combobox\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span\n className={cx(\n selectedOption !== undefined ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {selectedOption !== undefined ? selectedOption.label : placeholder}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <ComboboxList\n creatable={creatable}\n filtered={filtered}\n glass={glass}\n highlightedIndex={highlightedIndex}\n loading={isLoading}\n onCreateOption={handleCreate}\n onSearchChange={handleSearchChange}\n onSelect={handleSelect}\n query={query}\n searchPlaceholder={searchPlaceholder}\n searchRef={searchRef}\n setHighlightedIndex={setHighlightedIndex}\n value={value}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { ComboboxOption, ComboboxProps }\n","// command-bar — horizontal action bar for selected items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type CommandBarAction = {\n danger?: boolean\n icon?: ReactNode\n id: string\n label: string\n}\n\nexport type CommandBarProps = {\n actions: CommandBarAction[]\n className?: string\n onAction: (id: string) => void\n onClear: () => void\n selectedCount: number\n}\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nexport const CommandBar = forwardRef<HTMLDivElement, CommandBarProps>(\n function CommandBar(\n { actions, className, onAction, onClear, selectedCount },\n ref\n ) {\n if (selectedCount <= 0) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y border-border bg-surface gds-radius flex items-center border',\n className\n )}\n data-component=\"command-bar\"\n >\n <span className=\"gds-text text-fg font-medium whitespace-nowrap select-none\">\n {selectedCount} selected\n </span>\n <div className=\"gds-gap-sm flex items-center\">\n {actions.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n className={cx(\n 'gds-gap-sm gds-text flex items-center rounded px-2 py-1 transition-colors',\n action.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary',\n focusCls\n )}\n onClick={() => onAction(action.id)}\n >\n {action.icon !== undefined && (\n <span className=\"shrink-0\">{action.icon}</span>\n )}\n {action.label}\n </button>\n ))}\n </div>\n <button\n aria-label=\"Clear selection\"\n className={cx(\n 'text-fg-muted hover:text-fg ml-auto shrink-0 p-1',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n {closeIcon}\n </button>\n </div>\n )\n }\n)\n","// command-bar-float — floating action button with expandable actions\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useEscapeKey } from '../utils/hooks'\n\nexport type FabAction = {\n icon: ReactNode\n id: string\n label: string\n onClick: () => void\n}\n\nexport type CommandBarFloatProps = {\n actions: FabAction[]\n className?: string\n}\n\nexport const CommandBarFloat = forwardRef<HTMLDivElement, CommandBarFloatProps>(\n function CommandBarFloat({ actions, className }, ref) {\n const [open, setOpen] = useState(false)\n\n const toggle = useCallback(() => setOpen((prev) => !prev), [])\n const close = useCallback(() => setOpen(false), [])\n\n useEscapeKey(open, close)\n\n return (\n <div\n ref={ref}\n className={cx(\n 'fixed right-6 bottom-6 z-40 flex flex-col-reverse items-end gap-3',\n className\n )}\n data-component=\"command-bar-float\"\n >\n <button\n type=\"button\"\n aria-label={open ? 'Close menu' : 'Open menu'}\n className={cx(\n 'bg-accent text-on-accent flex h-14 w-14 items-center justify-center rounded-full shadow-lg transition-transform duration-200',\n focusCls\n )}\n style={{ transform: open ? 'rotate(45deg)' : 'rotate(0deg)' }}\n onClick={toggle}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n {open && (\n <div className=\"flex flex-col-reverse items-end gap-2\">\n {actions.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n className={cx(\n 'gds-gap-sm bg-surface border-border text-fg hover:bg-bg-tertiary flex items-center rounded-full border px-4 py-2 shadow-md transition-colors',\n focusCls\n )}\n onClick={() => {\n action.onClick()\n close()\n }}\n >\n <span className=\"shrink-0\">{action.icon}</span>\n <span className=\"gds-text whitespace-nowrap\">\n {action.label}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","// command-menu — inline command menu with search and keyboard navigation\nimport type { ReactNode } from 'react'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\n\nexport type CommandMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n group?: string\n danger?: boolean\n}\n\nexport type CommandMenuProps = {\n items: CommandMenuItem[]\n onSelect: (id: string) => void\n searchable?: boolean\n placeholder?: string\n glass?: boolean\n className?: string\n}\n\nexport function CommandMenu({\n items,\n onSelect,\n searchable = true,\n placeholder = 'Type a command...',\n glass,\n className,\n}: CommandMenuProps) {\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n\n const filtered = useMemo(() => {\n if (query === '') return items\n const q = query.toLowerCase()\n return items.filter((it) => it.label.toLowerCase().includes(q))\n }, [items, query])\n\n const groups = useMemo(() => {\n const map = new Map<string, CommandMenuItem[]>()\n for (const it of filtered) {\n const g = it.group ?? ''\n const arr = map.get(g)\n if (arr !== undefined) {\n arr.push(it)\n } else {\n map.set(g, [it])\n }\n }\n return map\n }, [filtered])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((p) => (p + 1) % filtered.length)\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((p) => (p - 1 + filtered.length) % filtered.length)\n } else if (isActivationKey(e)) {\n e.preventDefault()\n const it = filtered[activeIndex]\n if (it !== undefined) {\n onSelect(it.id)\n }\n }\n },\n [filtered, activeIndex, onSelect]\n )\n\n let flatIdx = -1\n const glassCx =\n glass !== undefined && glass !== false\n ? cx('border-white/10 bg-bg/60', glassClass(glass))\n : ''\n\n return (\n <div\n className={cx(\n 'gds-radius-card border-border overflow-hidden border',\n glassCx,\n className\n )}\n data-component=\"command-menu\"\n onKeyDown={handleKeyDown}\n >\n {searchable && (\n <div className=\"border-border border-b\">\n <input\n type=\"text\"\n data-testid=\"command-menu-search\"\n placeholder={placeholder}\n className={cx(\n 'gds-pad-x gds-pad-y text-fg placeholder:text-fg-muted/40 w-full bg-transparent text-sm outline-none',\n focusCls\n )}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n setActiveIndex(0)\n }}\n />\n </div>\n )}\n <div className=\"gds-pad-y-sm max-h-64 overflow-y-auto\">\n {filtered.length === 0 && (\n <div className=\"text-fg-muted/40 py-6 text-center text-sm\">\n No results\n </div>\n )}\n {Array.from(groups.entries()).map(([group, gItems]) => (\n <div key={group}>\n {group !== '' && (\n <div className=\"text-fg-muted/30 px-3 pt-3 pb-1 text-[10px] font-semibold tracking-[0.1em] uppercase\">\n {group}\n </div>\n )}\n {gItems.map((it) => {\n flatIdx++\n const active = flatIdx === activeIndex\n return (\n <button\n key={it.id}\n type=\"button\"\n onClick={() => onSelect(it.id)}\n data-active={active}\n data-testid={`command-menu-item-${it.id}`}\n className={cx(\n 'gds-text-body flex w-full items-center gap-3 px-3 py-2 text-left transition-colors select-none',\n active ? 'bg-accent/10 text-accent' : '',\n it.danger === true\n ? 'text-danger'\n : active\n ? ''\n : 'text-fg hover:bg-white/[0.04]'\n )}\n >\n {it.icon !== undefined && (\n <span className=\"text-fg-muted/50 flex h-5 w-5 shrink-0 items-center justify-center\">\n {it.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{it.label}</span>\n {it.shortcut !== undefined && (\n <kbd className=\"text-fg-muted/30 shrink-0 rounded border border-white/[0.06] bg-white/[0.03] px-1.5 py-px text-[10px]\">\n {it.shortcut}\n </kbd>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","// comparison-bar — SVG horizontal stacked bar chart\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type Segment = {\n color: string\n label: string\n value: number\n}\n\nexport type ComparisonBarProps = {\n className?: string\n height?: number\n segments: Segment[]\n showLabels?: boolean\n}\n\nexport const ComparisonBar = forwardRef<HTMLDivElement, ComparisonBarProps>(\n function ComparisonBar(\n { className, height = 24, segments, showLabels },\n ref\n ) {\n const total = useMemo(\n () => segments.reduce((sum, s) => sum + s.value, 0),\n [segments]\n )\n\n if (total <= 0) return null\n\n let offset = 0\n\n return (\n <div\n ref={ref}\n className={cx('w-full', className)}\n data-component=\"comparison-bar\"\n >\n <svg width=\"100%\" height={height} className=\"overflow-visible rounded\">\n {segments.map((seg) => {\n const widthPct = (seg.value / total) * 100\n const x = offset\n offset += widthPct\n return (\n <rect\n key={seg.label}\n x={`${x}%`}\n y={0}\n width={`${widthPct}%`}\n height={height}\n fill={seg.color}\n rx={0}\n />\n )\n })}\n </svg>\n {showLabels === true && (\n <div className=\"gds-gap-sm mt-2 flex flex-wrap\">\n {segments.map((seg) => (\n <div\n key={seg.label}\n className=\"gds-gap-sm text-fg-muted flex items-center text-xs\"\n >\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-sm\"\n style={{ backgroundColor: seg.color }}\n />\n <span>{seg.label}</span>\n <span className=\"text-fg font-medium\">\n {Math.round((seg.value / total) * 100)}%\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","// dialog — modal overlay with focus trap, scroll lock, escape key\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\nimport { renderPortal } from '../utils/portal'\n\ntype DialogWidth = 'default' | 'lg' | 'md' | 'sm' | 'xl'\n\nconst widthMap: Record<DialogWidth, string> = {\n sm: 'max-w-sm',\n md: 'max-w-lg',\n default: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n}\n\nexport type DialogProps = {\n /** Whether the dialog is visible */\n open: boolean\n /** Called when backdrop click, escape key, or close button */\n onClose: () => void\n /** Header title text */\n title?: string\n /** Subtitle shown below the title */\n description?: string\n children: ReactNode\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Max-width preset for the dialog panel */\n width?: DialogWidth\n className?: string\n}\n\nexport const Dialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(\n {\n open,\n onClose,\n title,\n description,\n children,\n glass,\n width = 'default',\n className,\n },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n return renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"dialog\"\n data-state=\"open\"\n >\n <div\n ref={(node) => {\n // merge refs\n ;(trapRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }}\n className={cx(\n 'gds-ctx animate-popup gds-radius-card gds-shadow-xl w-full border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n widthMap[width],\n className\n )}\n >\n {(title !== undefined || description !== undefined) && (\n <div className=\"gds-gap border-border gds-pad-x-lg gds-pad-y-lg flex items-start justify-between border-b\">\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"gds-pad-x-lg gds-pad-y-lg\">{children}</div>\n </div>\n </div>\n )\n})\n\ntype DialogFooterProps = {\n children: ReactNode\n className?: string\n}\n\nfunction DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={cx(\n 'gds-gap-sm border-border gds-pad-x-lg gds-pad-y flex items-center justify-end border-t',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nexport { DialogFooter }\nexport type { DialogFooterProps }\n","// confirm-dialog — pre-composed confirmation dialog with cancel/confirm buttons\nimport { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { Dialog } from './dialog'\n\ntype ConfirmDialogProps = {\n cancelLabel?: string\n className?: string\n confirmLabel?: string\n loading?: boolean\n message?: string\n onClose: () => void\n onConfirm: () => void\n open: boolean\n title?: string\n variant?: 'danger' | 'default'\n}\n\nexport const ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(\n function ConfirmDialog(\n {\n cancelLabel = 'Cancel',\n className,\n confirmLabel = 'Confirm',\n loading = false,\n message,\n onClose,\n onConfirm,\n open,\n title = 'Confirm',\n variant = 'default',\n },\n ref\n ) {\n return (\n <Dialog\n className={className}\n onClose={onClose}\n open={open}\n ref={ref}\n title={title}\n width=\"sm\"\n >\n <div\n className=\"gds-gap flex flex-col\"\n data-component=\"confirm-dialog\"\n data-variant={variant}\n >\n {message !== undefined && (\n <p className=\"gds-text-body text-fg-muted\">{message}</p>\n )}\n <div className=\"gds-gap-sm flex items-center justify-end\">\n <Button\n disabled={loading}\n onClick={onClose}\n size=\"sm\"\n variant=\"ghost\"\n >\n {cancelLabel}\n </Button>\n <Button\n disabled={loading}\n onClick={onConfirm}\n size=\"sm\"\n variant={variant === 'danger' ? 'danger' : 'primary'}\n >\n {loading ? 'Loading...' : confirmLabel}\n </Button>\n </div>\n </div>\n </Dialog>\n )\n }\n)\n\nexport type { ConfirmDialogProps }\n","// context-menu — right-click triggered floating menu\nimport type { ReactNode } from 'react'\nimport { useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nexport type ContextMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n danger?: boolean\n disabled?: boolean\n separator?: boolean\n}\n\nexport type ContextMenuProps = {\n trigger: ReactNode\n items: ContextMenuItem[]\n onSelect: (id: string) => void\n className?: string\n}\n\nexport function ContextMenu({\n trigger,\n items,\n onSelect,\n className,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false)\n const [pos, setPos] = useState({ x: 0, y: 0 })\n const menuRef = useRef<HTMLDivElement>(null)\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(menuRef, open, close)\n useEscapeKey(open, close)\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setPos({ x: e.clientX, y: e.clientY })\n setOpen(true)\n }, [])\n\n const handleSelect = useCallback(\n (id: string) => {\n setOpen(false)\n onSelect(id)\n },\n [onSelect]\n )\n\n return (\n <div\n className={className}\n data-component=\"context-menu\"\n data-state={open ? 'open' : 'closed'}\n onContextMenu={handleContextMenu}\n >\n {trigger}\n {open && (\n <div\n ref={menuRef}\n className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg fixed z-50 min-w-[160px] border py-1\"\n style={{ left: pos.x, top: pos.y }}\n >\n {items.map((item) => {\n if (item.separator) {\n return <div key={item.id} className=\"bg-border my-1 h-px\" />\n }\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n className={cx(\n 'gds-gap-sm gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center text-left',\n focusCls,\n item.danger\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-secondary',\n item.disabled === true && 'pointer-events-none opacity-40'\n )}\n onClick={() => handleSelect(item.id)}\n >\n {item.icon !== undefined && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.shortcut !== undefined && (\n <span className=\"gds-text-caption text-fg-muted ml-4\">\n {item.shortcut}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","// copy-field — read-only text field with copy button\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CopyFieldProps = {\n value: string\n label?: string\n masked?: boolean\n className?: string\n}\n\nconst CopyField = forwardRef<HTMLDivElement, CopyFieldProps>(function CopyField(\n { value, label, masked = false, className },\n ref\n) {\n const [copied, setCopied] = useState(false)\n const [revealed, setRevealed] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(value).catch(() => {})\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setCopied(false), 1500)\n }, [value])\n\n const display =\n masked && !revealed ? '\\u2022'.repeat(Math.min(value.length, 20)) : value\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-1', className)}\n data-component=\"copy-field\"\n >\n {label !== undefined && (\n <label className=\"text-fg-muted text-xs select-none\">{label}</label>\n )}\n <div className=\"border-border bg-surface flex items-center gap-2 rounded-md border px-3 py-1.5\">\n <span\n className=\"text-fg flex-1 truncate font-mono text-sm select-all\"\n onMouseEnter={masked ? () => setRevealed(true) : undefined}\n onMouseLeave={masked ? () => setRevealed(false) : undefined}\n >\n {display}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"text-fg-muted hover:text-fg shrink-0 transition-colors\"\n aria-label=\"Copy\"\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 7l3 3 7-7\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n )\n})\n\nexport { CopyField }\nexport type { CopyFieldProps }\n","// copy-to-clipboard — inline wrapper that copies a value on click with feedback tooltip\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\n\nexport type CopyToClipboardProps = {\n children: ReactNode\n value: string\n feedback?: string\n className?: string\n}\n\nexport const CopyToClipboard = forwardRef<\n HTMLSpanElement,\n CopyToClipboardProps\n>(function CopyToClipboard(\n { children, value, feedback = 'Copied!', className },\n ref\n) {\n const [showFeedback, setShowFeedback] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleClick = useCallback(() => {\n navigator.clipboard\n .writeText(value)\n .then(() => {\n setShowFeedback(true)\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n timerRef.current = setTimeout(() => {\n setShowFeedback(false)\n timerRef.current = null\n }, 2000)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [value])\n\n return (\n <span\n ref={ref}\n className={cx(\n 'relative inline-flex cursor-pointer select-none',\n focusCls,\n className\n )}\n data-component=\"copy-to-clipboard\"\n onClick={handleClick}\n onKeyDown={(e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n {showFeedback && (\n <span className=\"bg-fg text-bg absolute -top-8 left-1/2 -translate-x-1/2 rounded px-2 py-0.5 text-[11px] whitespace-nowrap shadow-md\">\n {feedback}\n </span>\n )}\n </span>\n )\n})\n","// countdown-timer — DD:HH:MM:SS countdown to a target date\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountdownTimerProps = {\n className?: string\n label?: string\n onComplete?: () => void\n target: Date\n}\n\nfunction computeRemaining(target: Date): {\n dd: string\n hh: string\n mm: string\n ss: string\n done: boolean\n} {\n const diff = Math.max(0, target.getTime() - Date.now())\n const done = diff <= 0\n const totalSec = Math.floor(diff / 1000)\n const dd = String(Math.floor(totalSec / 86400)).padStart(2, '0')\n const hh = String(Math.floor((totalSec % 86400) / 3600)).padStart(2, '0')\n const mm = String(Math.floor((totalSec % 3600) / 60)).padStart(2, '0')\n const ss = String(totalSec % 60).padStart(2, '0')\n return { dd, hh, mm, ss, done }\n}\n\nexport const CountdownTimer = forwardRef<HTMLDivElement, CountdownTimerProps>(\n function CountdownTimer({ className, label, onComplete, target }, ref) {\n const [remaining, setRemaining] = useState(() => computeRemaining(target))\n\n useEffect(() => {\n const id = setInterval(() => {\n const next = computeRemaining(target)\n setRemaining(next)\n if (next.done) {\n clearInterval(id)\n onComplete?.()\n }\n }, 1000)\n return () => clearInterval(id)\n }, [target, onComplete])\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col items-center', className)}\n data-component=\"countdown-timer\"\n >\n {label !== undefined && (\n <span className=\"gds-text text-fg-muted\">{label}</span>\n )}\n <div className=\"text-fg flex items-center gap-1 font-mono text-2xl font-bold tabular-nums\">\n <span>{remaining.dd}</span>:<span>{remaining.hh}</span>:\n <span>{remaining.mm}</span>:<span>{remaining.ss}</span>\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CurrencyDisplayProps = React.HTMLAttributes<HTMLDivElement> & {\n amount: number\n change?: number\n currency?: string\n period?: string\n}\n\nexport const CurrencyDisplay = forwardRef<HTMLDivElement, CurrencyDisplayProps>(\n function CurrencyDisplay(\n { amount, change, className, currency = '\\u00a5', period, ...props },\n ref\n ) {\n const formatted = amount.toLocaleString()\n\n return (\n <div\n className={cx('gds-gap flex items-baseline', className)}\n data-component=\"currency-display\"\n ref={ref}\n {...props}\n >\n <span className=\"text-fg text-2xl font-bold\">\n {currency}\n {formatted}\n </span>\n {change !== undefined && (\n <span\n className={cx(\n 'text-sm font-medium',\n change >= 0 ? 'text-success' : 'text-danger'\n )}\n >\n {change >= 0 ? '\\u2191' : '\\u2193'}\n {Math.abs(change)}%\n </span>\n )}\n {period !== undefined && (\n <span className=\"text-fg-muted text-xs\">{period}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { CurrencyDisplayProps }\n","// currency-input — formatted number input with currency symbol\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type CurrencyInputProps = {\n value: number | null\n onChange: (value: number | null) => void\n currency?: string\n locale?: string\n min?: number\n max?: number\n disabled?: boolean\n error?: boolean\n placeholder?: string\n className?: string\n}\n\nfunction formatNumber(num: number, locale: string): string {\n return new Intl.NumberFormat(locale).format(num)\n}\n\nfunction clampValue(val: number, min?: number, max?: number): number {\n let result = val\n if (min !== undefined && result < min) result = min\n if (max !== undefined && result > max) result = max\n return result\n}\n\nexport const CurrencyInput = forwardRef<HTMLDivElement, CurrencyInputProps>(\n function CurrencyInput(\n {\n value,\n onChange,\n currency = '\\u00a5',\n locale = 'ja-JP',\n min,\n max,\n disabled = false,\n error = false,\n placeholder = '0',\n className,\n },\n ref\n ) {\n const [editing, setEditing] = useState(false)\n const [inputValue, setInputValue] = useState('')\n\n const displayValue = value !== null ? formatNumber(value, locale) : ''\n\n const handleFocus = useCallback(() => {\n setEditing(true)\n setInputValue(value !== null ? String(value) : '')\n }, [value])\n\n const handleBlur = useCallback(() => {\n setEditing(false)\n const stripped = inputValue.replace(/[^\\d.-]/g, '')\n if (stripped === '' || stripped === '-') {\n onChange(null)\n return\n }\n const parsed = Number(stripped)\n if (Number.isNaN(parsed)) {\n onChange(null)\n return\n }\n onChange(clampValue(parsed, min, max))\n }, [inputValue, max, min, onChange])\n\n const handleChange = useCallback((raw: string) => {\n // allow digits, minus, and dot during editing\n const cleaned = raw.replace(/[^\\d.-]/g, '')\n setInputValue(cleaned)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-h gds-radius-input inline-flex items-center border',\n error ? 'border-danger' : 'border-border',\n disabled && 'cursor-not-allowed opacity-40',\n className\n )}\n data-component=\"currency-input\"\n data-disabled={disabled ? '' : undefined}\n data-error={error ? '' : undefined}\n >\n <span className=\"text-fg-muted gds-text-body pl-3 select-none\">\n {currency}\n </span>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={editing ? inputValue : displayValue}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n placeholder={placeholder}\n className={cx(\n 'text-fg gds-text-body flex-1 bg-transparent px-2 text-right focus:outline-none',\n focusCls\n )}\n aria-label=\"Currency amount\"\n />\n </div>\n )\n }\n)\n","// data-card — metric card with title, value, optional change indicator and footer\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype DataCardChangeType = 'down' | 'neutral' | 'up'\n\nconst changeColors: Record<DataCardChangeType, string> = {\n down: 'text-danger',\n neutral: 'text-fg-muted',\n up: 'text-success',\n}\n\nexport type DataCardProps = {\n title: string\n value: number | string\n change?: string\n changeType?: DataCardChangeType\n icon?: ReactNode\n footer?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const DataCard = forwardRef<HTMLDivElement, DataCardProps>(\n function DataCard(\n {\n title,\n value,\n change,\n changeType = 'neutral',\n icon,\n footer,\n glass,\n className,\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-radius border-border/40 bg-surface gds-pad border select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"data-card\"\n >\n <div className=\"flex items-start justify-between\">\n <span className=\"gds-text-body text-fg-muted\">{title}</span>\n {icon !== undefined && (\n <span className=\"text-fg-muted/30\">{icon}</span>\n )}\n </div>\n\n <div className=\"text-fg mt-2 text-xl font-bold\">{value}</div>\n\n {change !== undefined && (\n <div\n className={cx(\n 'mt-1 flex items-center gap-1 text-[11px]',\n changeColors[changeType]\n )}\n >\n {changeType === 'up' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 12l5-5 3 3 5-6\" />\n <path d=\"M11 4h4v4\" />\n </svg>\n )}\n {changeType === 'down' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 4l5 5 3-3 5 6\" />\n <path d=\"M11 12h4V8\" />\n </svg>\n )}\n <span>{change}</span>\n </div>\n )}\n\n {footer !== undefined && (\n <div className=\"border-border/20 text-fg-muted/50 mt-3 border-t pt-2 text-[10px]\">\n {footer}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { DataCardChangeType }\n","// date-display — formatted date with relative time support\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DateDisplayProps = {\n date: string | Date\n format?: 'relative' | 'absolute' | 'auto'\n className?: string\n}\n\nfunction formatRelative(ms: number): string {\n const sec = Math.floor(ms / 1000)\n if (sec < 60) return 'just now'\n const min = Math.floor(sec / 60)\n if (min < 60) return `${min}m ago`\n const hrs = Math.floor(min / 60)\n if (hrs < 24) return `${hrs}h ago`\n if (hrs < 48) return 'yesterday'\n return `${Math.floor(hrs / 24)} days ago`\n}\n\nfunction formatAbsolute(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nconst SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000\n\nconst DateDisplay = forwardRef<HTMLSpanElement, DateDisplayProps>(\n function DateDisplay({ date, format = 'auto', className }, ref) {\n const text = useMemo(() => {\n const d = date instanceof Date ? date : new Date(date)\n const elapsed = Date.now() - d.getTime()\n\n if (format === 'relative') return formatRelative(elapsed)\n if (format === 'absolute') return formatAbsolute(d)\n\n // auto: relative if < 7 days\n return elapsed < SEVEN_DAYS ? formatRelative(elapsed) : formatAbsolute(d)\n }, [date, format])\n\n const d = date instanceof Date ? date : new Date(date)\n\n return (\n <span\n ref={ref}\n className={cx('text-fg-muted gds-text', className)}\n data-component=\"date-display\"\n title={d.toISOString()}\n >\n {text}\n </span>\n )\n }\n)\n\nexport { DateDisplay }\nexport type { DateDisplayProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DateRangeInputProps = {\n className?: string\n disabled?: boolean\n endDate: string | null\n error?: boolean\n onChange: (start: string | null, end: string | null) => void\n placeholder?: { end?: string; start?: string }\n startDate: string | null\n}\n\nexport const DateRangeInput = forwardRef<HTMLDivElement, DateRangeInputProps>(\n function DateRangeInput(\n {\n className,\n disabled = false,\n endDate,\n error = false,\n onChange,\n placeholder,\n startDate,\n },\n ref\n ) {\n const borderCls = error\n ? 'border-danger'\n : 'border-border hover:border-border-strong'\n\n return (\n <div\n className={cx(\n 'gds-radius-input bg-bg flex items-center border transition-colors',\n borderCls,\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"date-range-input\"\n data-error={error ? '' : undefined}\n ref={ref}\n >\n <input\n aria-label={placeholder?.start ?? 'Start date'}\n className=\"gds-h gds-text-body text-fg gds-pad-x flex-1 bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n onChange={(e) => {\n const val = e.target.value === '' ? null : e.target.value\n onChange(val, endDate)\n }}\n placeholder={placeholder?.start}\n type=\"date\"\n value={startDate ?? ''}\n />\n <span className=\"text-fg-muted/40 gds-text-label shrink-0 select-none\">\n &rarr;\n </span>\n <input\n aria-label={placeholder?.end ?? 'End date'}\n className=\"gds-h gds-text-body text-fg gds-pad-x flex-1 border-l border-inherit bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n min={startDate ?? undefined}\n onChange={(e) => {\n const val = e.target.value === '' ? null : e.target.value\n onChange(startDate, val)\n }}\n placeholder={placeholder?.end}\n type=\"date\"\n value={endDate ?? ''}\n />\n </div>\n )\n }\n)\n\nexport type { DateRangeInputProps }\n","// description — title + muted body text pair for inline descriptions\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DescriptionProps = {\n children: ReactNode\n title?: string\n className?: string\n}\n\nexport const Description = forwardRef<HTMLDivElement, DescriptionProps>(\n function Description({ children, title, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('space-y-0.5', className)}\n data-component=\"description\"\n >\n {title !== undefined && (\n <div className=\"gds-text-body text-fg font-medium\">{title}</div>\n )}\n <div className=\"gds-text-body text-fg-muted\">{children}</div>\n </div>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype DockItem = {\n icon: ReactNode\n id: string\n label: string\n}\n\ntype DockProps = React.HTMLAttributes<HTMLDivElement> & {\n glass?: boolean\n items: DockItem[]\n onSelect: (id: string) => void\n}\n\nexport const Dock = forwardRef<HTMLDivElement, DockProps>(function Dock(\n { className, glass = true, items, onSelect, ...props },\n ref\n) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n return (\n <div\n className={cx(\n 'gds-radius-card inline-flex items-end gap-1 p-2',\n 'bg-bg-secondary/80 border border-white/[0.06]',\n glassClass(glass === true ? true : undefined),\n glass === true && 'border-white/10',\n className\n )}\n data-component=\"dock\"\n ref={ref}\n {...props}\n >\n {items.map((item, index) => {\n const isHovered = hoveredIndex === index\n const isNeighbor =\n hoveredIndex !== null && Math.abs(index - hoveredIndex) === 1\n\n let scale = 1\n if (isHovered) {\n scale = 1.3\n } else if (isNeighbor) {\n scale = 1.1\n }\n\n return (\n <div\n key={item.id}\n className=\"group relative flex flex-col items-center\"\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {/* tooltip */}\n <span\n className={cx(\n 'bg-bg-secondary text-fg-muted pointer-events-none absolute -top-8 rounded-md px-2 py-1 text-[10px] whitespace-nowrap shadow-lg',\n 'transition-opacity duration-150',\n isHovered ? 'opacity-100' : 'opacity-0'\n )}\n data-testid={`dock-tooltip-${item.id}`}\n >\n {item.label}\n </span>\n\n {/* icon button */}\n <button\n className={cx(\n 'flex items-center justify-center rounded-lg p-2',\n 'transition-transform duration-200',\n 'hover:bg-white/[0.06]'\n )}\n data-testid={`dock-item-${item.id}`}\n onClick={() => onSelect(item.id)}\n style={{\n transform: `scale(${scale})`,\n transitionTimingFunction:\n 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n }}\n type=\"button\"\n >\n <span className=\"gds-icon-child\">{item.icon}</span>\n </button>\n </div>\n )\n })}\n </div>\n )\n})\n\nexport type { DockItem, DockProps }\n","// download-button — button with progress and completion state for downloads\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type DownloadButtonProps = {\n label: string\n progress?: number\n complete?: boolean\n onClick: () => void\n disabled?: boolean\n className?: string\n}\n\nexport const DownloadButton = forwardRef<\n HTMLButtonElement,\n DownloadButtonProps\n>(function DownloadButton(\n { label, progress, complete = false, onClick, disabled = false, className },\n ref\n) {\n const isDownloading = progress !== undefined && !complete\n const isDisabled = disabled || isDownloading\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx(\n 'gds-radius-button border-border bg-bg text-fg inline-flex items-center gap-2 border px-4 py-2 text-sm font-medium transition-colors select-none',\n 'hover:bg-bg-secondary',\n isDisabled && 'cursor-not-allowed opacity-50',\n complete && 'border-success/30 text-success',\n focusCls,\n className\n )}\n data-component=\"download-button\"\n disabled={isDisabled}\n onClick={onClick}\n >\n {complete && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8.5l4 4 6-7\" />\n </svg>\n <span>Downloaded</span>\n </>\n )}\n {!complete && isDownloading && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"animate-spin\"\n >\n <path d=\"M8 2a6 6 0 1 0 6 6\" />\n </svg>\n <span className=\"tabular-nums\">{progress}%</span>\n </>\n )}\n {!complete && !isDownloading && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 2v8M4.5 7.5L8 11l3.5-3.5\" />\n <path d=\"M3 13h10\" />\n </svg>\n <span>{label}</span>\n </>\n )}\n </button>\n )\n})\n","// drawer — mobile-first bottom drawer with slide-up transition\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\n\ntype DrawerHeight = 'sm' | 'default' | 'lg' | 'full'\n\nconst heightMap: Record<DrawerHeight, string> = {\n sm: 'h-[30vh]',\n default: 'h-[50vh]',\n lg: 'h-[75vh]',\n full: 'h-screen',\n}\n\nexport type DrawerProps = {\n open: boolean\n onClose: () => void\n title?: string\n children: ReactNode\n height?: DrawerHeight\n glass?: boolean\n className?: string\n}\n\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n { open, onClose, title, children, height = 'default', glass, className },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"drawer\"\n data-state=\"open\"\n >\n <div\n ref={mergeRefs(ref, trapRef)}\n className={cx(\n 'gds-ctx fixed inset-x-0 bottom-0 flex flex-col rounded-t-xl border-t transition-transform duration-200',\n heightMap[height],\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n className\n )}\n >\n {/* drag handle */}\n <div className=\"flex justify-center py-2\">\n <div\n className=\"bg-fg-muted/30 h-1 w-8 rounded-full\"\n data-testid=\"drag-handle\"\n />\n </div>\n\n {/* header */}\n {title !== undefined && (\n <div className=\"gds-pad-x-lg flex items-center justify-between pb-2\">\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* content */}\n <div className=\"gds-pad-x-lg gds-pad-y-lg flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n )\n})\n","// drop-zone — file drop area with drag-over visual feedback\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DropZoneProps = {\n onDrop: (files: File[]) => void\n accept?: string\n active?: boolean\n children?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const DropZone = forwardRef<HTMLDivElement, DropZoneProps>(\n function DropZone(\n { onDrop, accept, active, children, glass, className },\n ref\n ) {\n const [dragOver, setDragOver] = useState(false)\n\n const isActive = active === true || dragOver\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n onDrop(files)\n },\n [onDrop]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-radius flex flex-col items-center justify-center border-2 border-dashed p-8 transition-colors',\n focusCls,\n isActive\n ? 'border-accent bg-accent/5'\n : 'border-border/40 bg-bg-secondary/20',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"drop-zone\"\n data-state={isActive ? 'active' : 'idle'}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {children ?? (\n <span className=\"text-fg-muted text-sm select-none\">\n Drop files here\n </span>\n )}\n {accept !== undefined && (\n <span className=\"text-fg-muted/60 text-xs\">{accept}</span>\n )}\n </div>\n )\n }\n)\n","// dropdown — trigger + floating menu with items\nimport type { ReactNode } from 'react'\nimport { useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nexport type DropdownItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n danger?: boolean\n disabled?: boolean\n separator?: boolean\n}\n\ntype DropdownAlign = 'end' | 'start'\n\nexport type DropdownProps = {\n items: DropdownItem[]\n onSelect: (id: string) => void\n trigger: ReactNode\n align?: DropdownAlign\n glass?: boolean\n className?: string\n}\n\nexport function Dropdown({\n items,\n onSelect,\n trigger,\n align = 'start',\n glass,\n className,\n}: DropdownProps) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n useClickOutside(ref, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"dropdown\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n className={focusCls}\n >\n {trigger}\n </button>\n\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute z-50 mt-1 min-w-[160px] border py-1',\n align === 'end' ? 'right-0' : 'left-0',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n {items.map((item) => {\n if (item.separator) {\n return <div key={item.id} className=\"bg-border my-1 h-px\" />\n }\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-gap-sm gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center transition-colors',\n focusCls,\n item.danger\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary',\n item.disabled === true && 'pointer-events-none opacity-40'\n )}\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.shortcut !== undefined && (\n <span className=\"gds-text-caption text-fg-muted ml-4\">\n {item.shortcut}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","// editable — inline editable text, click to edit, enter/blur to save, escape to cancel\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype EditableProps = {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n className?: string\n}\n\nconst Editable = forwardRef<HTMLSpanElement, EditableProps>(function Editable(\n { value, onChange, placeholder = 'Click to edit', disabled, className },\n ref\n) {\n const [editing, setEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const startEditing = useCallback(() => {\n if (disabled === true) return\n setDraft(value)\n setEditing(true)\n // auto-focus happens via autoFocus prop\n }, [disabled, value])\n\n const save = useCallback(() => {\n setEditing(false)\n onChange(draft)\n }, [draft, onChange])\n\n const cancel = useCallback(() => {\n setEditing(false)\n setDraft(value)\n }, [value])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n save()\n }\n if (e.key === 'Escape') {\n cancel()\n }\n },\n [save, cancel]\n )\n\n if (editing) {\n return (\n <input\n ref={inputRef}\n autoFocus\n className={cx(\n 'gds-text-body text-fg bg-transparent underline outline-none',\n focusCls,\n className\n )}\n data-component=\"editable\"\n data-state=\"editing\"\n onBlur={save}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n type=\"text\"\n value={draft}\n />\n )\n }\n\n const isEmpty = value === ''\n\n return (\n <span\n ref={ref}\n className={cx(\n 'gds-text-body inline cursor-pointer hover:underline',\n disabled === true && 'pointer-events-none opacity-50',\n isEmpty ? 'text-fg-muted' : 'text-fg',\n focusCls,\n className\n )}\n data-component=\"editable\"\n data-state=\"display\"\n onClick={startEditing}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n startEditing()\n }\n }}\n role=\"button\"\n tabIndex={disabled === true ? -1 : 0}\n >\n {isEmpty ? placeholder : value}\n </span>\n )\n})\n\nexport { Editable }\nexport type { EditableProps }\n","// emoji-picker — grid of emoji buttons with category tabs and search\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EmojiCategory = {\n name: string\n emojis: string[]\n}\n\nconst defaultCategories: EmojiCategory[] = [\n {\n name: 'Smileys',\n emojis: [\n '😀',\n '😂',\n '🥹',\n '😍',\n '🤔',\n '😎',\n '🥳',\n '😴',\n '🤯',\n '😱',\n '🙄',\n '😤',\n ],\n },\n {\n name: 'Gestures',\n emojis: [\n '👍',\n '👎',\n '👏',\n '🤝',\n '✌️',\n '🤞',\n '🫶',\n '💪',\n '🙏',\n '👋',\n '🫡',\n '🤙',\n ],\n },\n {\n name: 'Animals',\n emojis: [\n '🐶',\n '🐱',\n '🐻',\n '🦊',\n '🐸',\n '🐵',\n '🦁',\n '🐧',\n '🦋',\n '🐝',\n '🐢',\n '🐬',\n ],\n },\n {\n name: 'Objects',\n emojis: [\n '🔥',\n '⭐',\n '💡',\n '🎯',\n '🚀',\n '💎',\n '🎉',\n '📌',\n '🔔',\n '💬',\n '❤️',\n '✅',\n ],\n },\n]\n\nexport type EmojiPickerProps = React.HTMLAttributes<HTMLDivElement> & {\n onSelect: (emoji: string) => void\n categories?: EmojiCategory[]\n columns?: number\n glass?: boolean\n}\n\nexport const EmojiPicker = forwardRef<HTMLDivElement, EmojiPickerProps>(\n function EmojiPicker(\n {\n onSelect,\n categories = defaultCategories,\n columns = 8,\n glass = false,\n className,\n ...props\n },\n ref\n ) {\n const [activeTab, setActiveTab] = useState(0)\n const [search, setSearch] = useState('')\n\n const filteredEmojis = useMemo(() => {\n if (search === '') return categories[activeTab]?.emojis ?? []\n // flatten and filter (search matches category name loosely)\n return categories.flatMap((cat) => cat.emojis)\n }, [search, activeTab, categories])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border w-fit rounded-lg border p-2 shadow-lg',\n glass ? 'bg-bg/80 backdrop-blur-xl' : 'bg-bg-secondary',\n className\n )}\n data-component=\"emoji-picker\"\n {...props}\n >\n {/* search */}\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"border-border text-fg placeholder:text-fg-muted mb-2 w-full rounded-md border bg-transparent px-2 py-1 text-xs outline-none\"\n />\n\n {/* category tabs */}\n {search === '' && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto\">\n {categories.map((cat, i) => (\n <button\n key={cat.name}\n className={cx(\n 'shrink-0 rounded-md px-2 py-0.5 text-[10px] font-medium transition-colors',\n i === activeTab\n ? 'bg-accent/15 text-accent'\n : 'text-fg-muted hover:text-fg'\n )}\n onClick={() => setActiveTab(i)}\n >\n {cat.name}\n </button>\n ))}\n </div>\n )}\n\n {/* emoji grid */}\n <div\n className=\"grid gap-0.5\"\n style={{ gridTemplateColumns: `repeat(${columns}, 1fr)` }}\n >\n {filteredEmojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-base transition-colors hover:bg-white/10\"\n onClick={() => onSelect(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n )\n }\n)\n","// empty-placeholder — inline empty state for cards/tables (lighter than EmptyState L7)\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmptyPlaceholderProps = {\n message: string\n icon?: ReactNode\n action?: ReactNode\n className?: string\n}\n\nexport const EmptyPlaceholder = forwardRef<\n HTMLDivElement,\n EmptyPlaceholderProps\n>(function EmptyPlaceholder({ message, icon, action, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col items-center justify-center gap-2 py-6 select-none',\n className\n )}\n data-component=\"empty-placeholder\"\n >\n {icon !== undefined && <div className=\"text-fg-muted/30\">{icon}</div>}\n <p className=\"gds-text-body text-fg-muted\">{message}</p>\n {action !== undefined && <div className=\"mt-1\">{action}</div>}\n </div>\n )\n})\n","// empty-search — placeholder shown when a search returns no results\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmptySearchProps = {\n query: string\n suggestions?: string[]\n className?: string\n}\n\nexport const EmptySearch = forwardRef<HTMLDivElement, EmptySearchProps>(\n function EmptySearch({ query, suggestions, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col items-center justify-center py-12 text-center select-none',\n className\n )}\n data-component=\"empty-search\"\n >\n <div className=\"bg-bg-tertiary/50 flex h-12 w-12 items-center justify-center rounded-full\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.35-4.35\" />\n </svg>\n </div>\n <h3 className=\"text-fg mt-3 text-sm font-medium\">\n No results for &apos;{query}&apos;\n </h3>\n {suggestions !== undefined && suggestions.length > 0 && (\n <div className=\"mt-3 flex flex-wrap justify-center gap-2\">\n {suggestions.map((suggestion) => (\n <span\n key={suggestion}\n className=\"bg-bg-tertiary/50 text-fg-muted rounded-full px-3 py-1 text-[11px]\"\n >\n {suggestion}\n </span>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EnvironmentType = 'development' | 'local' | 'production' | 'staging'\n\ntype EnvironmentBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n env: EnvironmentType\n showDot?: boolean\n}\n\nconst envCls: Record<EnvironmentType, string> = {\n production: 'bg-success/15 text-success',\n staging: 'bg-warning/15 text-warning',\n development: 'bg-accent/15 text-accent',\n local: 'bg-bg-tertiary text-fg-muted',\n}\n\nconst dotCls: Record<EnvironmentType, string> = {\n production: 'bg-success',\n staging: 'bg-warning',\n development: 'bg-accent',\n local: 'bg-fg-muted',\n}\n\nexport const EnvironmentBadge = forwardRef<\n HTMLSpanElement,\n EnvironmentBadgeProps\n>(function EnvironmentBadge({ className, env, showDot = true, ...props }, ref) {\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n envCls[env],\n className\n )}\n data-component=\"environment-badge\"\n ref={ref}\n {...props}\n >\n {showDot && (\n <span className={cx('h-1.5 w-1.5 rounded-full', dotCls[env])} />\n )}\n {env}\n </span>\n )\n})\n\nexport type { EnvironmentBadgeProps, EnvironmentType }\n","// feature-flag — toggle-style status indicator for feature flags\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FeatureFlagProps = {\n className?: string\n description?: string\n enabled: boolean\n name: string\n}\n\nexport const FeatureFlag = forwardRef<HTMLDivElement, FeatureFlagProps>(\n function FeatureFlag({ className, description, enabled, name }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y flex items-center',\n className\n )}\n data-component=\"feature-flag\"\n data-state={enabled ? 'enabled' : 'disabled'}\n >\n <span\n className={cx(\n 'inline-block h-2.5 w-2.5 shrink-0 rounded-full',\n enabled ? 'bg-success' : 'bg-fg-muted/40'\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <span\n className={cx(\n 'gds-text font-medium',\n enabled ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {name}\n </span>\n {description !== undefined && (\n <p className=\"text-fg-muted mt-0.5 text-xs\">{description}</p>\n )}\n </div>\n <span\n className={cx(\n 'text-xs font-medium',\n enabled ? 'text-success' : 'text-fg-muted'\n )}\n >\n {enabled ? 'ON' : 'OFF'}\n </span>\n </div>\n )\n }\n)\n","// field-group — titled group of form fields with optional multi-column grid\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype FieldGroupColumns = 1 | 2 | 3\n\nconst columnClasses: Record<FieldGroupColumns, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n}\n\nexport type FieldGroupProps = {\n children: ReactNode\n columns?: FieldGroupColumns\n title?: string\n description?: string\n className?: string\n}\n\nexport const FieldGroup = forwardRef<HTMLFieldSetElement, FieldGroupProps>(\n function FieldGroup(\n { children, columns = 1, title, description, className },\n ref\n ) {\n return (\n <fieldset\n ref={ref}\n className={cx('space-y-4', className)}\n data-component=\"field-group\"\n >\n {title !== undefined && (\n <div>\n <legend className=\"text-fg text-sm font-semibold\">{title}</legend>\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n )}\n <div className={cx('gds-gap grid', columnClasses[columns])}>\n {children}\n </div>\n </fieldset>\n )\n }\n)\n\nexport type { FieldGroupColumns }\n","// field-set — bordered fieldset with legend label\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FieldSetProps = {\n children: ReactNode\n legend: string\n disabled?: boolean\n className?: string\n}\n\nexport const FieldSet = forwardRef<HTMLFieldSetElement, FieldSetProps>(\n function FieldSet({ children, legend, disabled = false, className }, ref) {\n return (\n <fieldset\n ref={ref}\n className={cx(\n 'gds-radius border-border gds-pad border',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"field-set\"\n disabled={disabled}\n >\n <legend className=\"text-fg-muted px-2 text-xs font-medium select-none\">\n {legend}\n </legend>\n {children}\n </fieldset>\n )\n }\n)\n","// file-upload — drag-and-drop file upload zone\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype FileUploadProps = {\n accept?: string\n children?: ReactNode\n className?: string\n disabled?: boolean\n glass?: boolean\n maxSize?: number\n multiple?: boolean\n onFiles: (files: File[]) => void\n}\n\nfunction filterBySize(files: File[], maxSize?: number): File[] {\n if (maxSize === undefined) return files\n return files.filter((f) => f.size <= maxSize)\n}\n\nfunction UploadIcon() {\n return (\n <svg\n className=\"text-fg-muted/40 h-8 w-8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </svg>\n )\n}\n\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\n function FileUpload(\n {\n accept,\n children,\n className,\n disabled = false,\n glass,\n maxSize,\n multiple = false,\n onFiles,\n },\n ref\n ) {\n const [dragOver, setDragOver] = useState(false)\n const [selectedFiles, setSelectedFiles] = useState<File[]>([])\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleFiles = useCallback(\n (fileList: FileList) => {\n const files = filterBySize(Array.from(fileList), maxSize)\n setSelectedFiles(files)\n onFiles(files)\n },\n [maxSize, onFiles]\n )\n\n const handleClick = useCallback(() => {\n if (disabled) return\n inputRef.current?.click()\n }, [disabled])\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n if (disabled) return\n setDragOver(true)\n },\n [disabled]\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n if (disabled) return\n handleFiles(e.dataTransfer.files)\n },\n [disabled, handleFiles]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files !== null) {\n handleFiles(e.target.files)\n }\n },\n [handleFiles]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 transition-colors',\n !dragOver && !disabled && 'border-border hover:border-fg-muted',\n dragOver && 'border-accent bg-accent/5',\n disabled && 'pointer-events-none cursor-not-allowed opacity-50',\n glassClass(glass),\n className\n )}\n data-component=\"file-upload\"\n data-state={dragOver ? 'drag-over' : 'idle'}\n onClick={handleClick}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <input\n accept={accept}\n className=\"hidden\"\n multiple={multiple}\n onChange={handleInputChange}\n ref={inputRef}\n type=\"file\"\n />\n {children !== undefined ? (\n children\n ) : (\n <>\n <UploadIcon />\n <div className=\"text-fg-muted text-sm\">\n Drop files here or click to browse\n </div>\n {selectedFiles.length > 0 && (\n <div className=\"text-fg-muted/60 text-xs\">\n {selectedFiles.length} file{selectedFiles.length > 1 ? 's' : ''}{' '}\n selected\n </div>\n )}\n </>\n )}\n </div>\n )\n }\n)\n\nexport type { FileUploadProps }\n","import { forwardRef } from 'react'\n\nimport { Chip } from '../l3-atoms/chip'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype FilterItem = { id: string; label: string; active: boolean }\n\ntype FilterBarProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n filters: FilterItem[]\n onChange: (id: string, active: boolean) => void\n onClear?: () => void\n}\n\nexport const FilterBar = forwardRef<HTMLDivElement, FilterBarProps>(\n function FilterBar({ className, filters, onChange, onClear, ...props }, ref) {\n const hasActive = filters.some((f) => f.active)\n\n return (\n <div\n className={cx('gds-gap flex flex-wrap items-center', className)}\n data-component=\"filter-bar\"\n ref={ref}\n {...props}\n >\n {filters.map((filter) => (\n <button\n key={filter.id}\n className={cx('cursor-pointer', focusCls)}\n onClick={() => onChange(filter.id, !filter.active)}\n type=\"button\"\n >\n <Chip\n label={filter.label}\n variant={filter.active ? 'accent' : 'default'}\n />\n </button>\n ))}\n {hasActive && onClear !== undefined && (\n <button\n className={cx(\n 'gds-text-caption text-fg-muted hover:text-fg',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n Clear all\n </button>\n )}\n </div>\n )\n }\n)\n\nexport type { FilterBarProps, FilterItem }\n","// flip-card — 3D CSS perspective card with front/back\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FlipCardProps = {\n back: ReactNode\n className?: string\n front: ReactNode\n trigger?: 'click' | 'hover'\n}\n\nexport const FlipCard = forwardRef<HTMLDivElement, FlipCardProps>(\n function FlipCard({ back, className, front, trigger = 'click' }, ref) {\n const [flipped, setFlipped] = useState(false)\n\n const hoverHandlers =\n trigger === 'hover'\n ? {\n onMouseEnter: () => setFlipped(true),\n onMouseLeave: () => setFlipped(false),\n }\n : {}\n\n const clickHandler =\n trigger === 'click' ? { onClick: () => setFlipped((prev) => !prev) } : {}\n\n return (\n <div\n ref={ref}\n className={cx('relative cursor-pointer', className)}\n style={{ perspective: '1000px' }}\n data-component=\"flip-card\"\n data-state={flipped ? 'flipped' : 'front'}\n {...hoverHandlers}\n {...clickHandler}\n >\n <div\n className=\"relative w-full transition-transform duration-500\"\n style={{\n transformStyle: 'preserve-3d',\n transform: flipped ? 'rotateY(180deg)' : 'rotateY(0deg)',\n }}\n >\n <div className=\"relative\" style={{ backfaceVisibility: 'hidden' }}>\n {front}\n </div>\n <div\n className=\"absolute inset-0\"\n style={{\n backfaceVisibility: 'hidden',\n transform: 'rotateY(180deg)',\n }}\n >\n {back}\n </div>\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\n\ntype FormActionsProps = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean\n loading?: boolean\n onCancel?: () => void\n onReset?: () => void\n onSave?: () => void\n saveLabel?: string\n}\n\nexport const FormActions = forwardRef<HTMLDivElement, FormActionsProps>(\n function FormActions(\n {\n className,\n disabled,\n loading,\n onCancel,\n onReset,\n onSave,\n saveLabel = 'Save',\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx('gds-gap flex items-center justify-end', className)}\n data-component=\"form-actions\"\n ref={ref}\n {...props}\n >\n {onReset !== undefined && (\n <Button\n variant=\"ghost\"\n disabled={disabled}\n onClick={onReset}\n type=\"button\"\n >\n Reset\n </Button>\n )}\n {onCancel !== undefined && (\n <Button\n variant=\"secondary\"\n disabled={disabled}\n onClick={onCancel}\n type=\"button\"\n >\n Cancel\n </Button>\n )}\n {onSave !== undefined && (\n <Button\n disabled={disabled ?? loading}\n loading={loading}\n onClick={onSave}\n type=\"submit\"\n >\n {loading === true ? 'Saving...' : saveLabel}\n </Button>\n )}\n </div>\n )\n }\n)\n\nexport type { FormActionsProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { Label } from '../l2-primitives/label'\nimport { cx } from '../utils/cx'\n\ntype FieldWrapperProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n children: ReactNode\n error?: string\n helperText?: string\n required?: boolean\n}\n\nexport const FieldWrapper = forwardRef<HTMLDivElement, FieldWrapperProps>(\n function FieldWrapper(\n { children, className, error, helperText, label, required, ...props },\n ref\n ) {\n const hasError = error !== undefined && error !== ''\n\n return (\n <div\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"field-wrapper\"\n data-state={hasError ? 'error' : 'idle'}\n ref={ref}\n {...props}\n >\n <Label required={required}>{label}</Label>\n {children}\n {hasError && (\n <span className=\"gds-text-caption text-danger\">{error}</span>\n )}\n {!hasError && helperText !== undefined && (\n <span className=\"gds-text-caption text-fg-muted\">{helperText}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { FieldWrapperProps }\n","// glass-button — frosted glass variant button with size and color variants\nimport { cva } from 'class-variance-authority'\nimport type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst glassButtonVariants = cva(\n cx(\n 'inline-flex select-none items-center justify-center font-medium gds-glass transition-colors',\n focusCls\n ),\n {\n variants: {\n variant: {\n default: 'border border-border/30 bg-bg/50 text-fg hover:bg-bg/70',\n accent:\n 'border border-accent/30 bg-accent/20 text-accent hover:bg-accent/30',\n },\n size: {\n sm: 'h-7 gap-1 gds-radius-button px-2 text-[11px]',\n default: 'h-8 gap-1.5 gds-radius-button px-3 text-xs',\n lg: 'h-9 gap-2 gds-radius px-4 text-sm',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n }\n)\n\nexport type GlassButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof glassButtonVariants> & {\n children: ReactNode\n }\n\nexport const GlassButton = forwardRef<HTMLButtonElement, GlassButtonProps>(\n function GlassButton({ children, className, size, variant, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cx(glassButtonVariants({ size, variant }), className)}\n data-component=\"glass-button\"\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nexport { glassButtonVariants }\n","// glass-card — frosted glass container with blur intensity variants\nimport { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst glassCardVariants = cva('gds-ctx gds-radius border bg-bg/60', {\n variants: {\n blur: {\n sm: 'gds-glass-sm border-border/25',\n default: 'gds-glass border-border/20',\n lg: 'gds-glass-lg border-border/15',\n },\n },\n defaultVariants: { blur: 'default' },\n})\n\nexport type GlassCardProps = VariantProps<typeof glassCardVariants> & {\n children: ReactNode\n className?: string\n}\n\nexport const GlassCard = forwardRef<HTMLDivElement, GlassCardProps>(\n function GlassCard({ blur, children, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(glassCardVariants({ blur }), className)}\n data-component=\"glass-card\"\n >\n {children}\n </div>\n )\n }\n)\n\nexport { glassCardVariants }\n","// glitch-text — text with pseudo-element glitch animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type GlitchTextProps = {\n active?: boolean\n className?: string\n intensity?: 'default' | 'lg' | 'sm'\n text: string\n}\n\nconst intensityMap = {\n sm: 'gds-glitch-sm',\n default: 'gds-glitch',\n lg: 'gds-glitch-lg',\n} as const\n\nexport const GlitchText = forwardRef<HTMLSpanElement, GlitchTextProps>(\n function GlitchText(\n { active = true, className, intensity = 'default', text },\n ref\n ) {\n return (\n <span\n ref={ref}\n className={cx(\n 'text-fg relative inline-block font-bold select-none',\n active && intensityMap[intensity],\n className\n )}\n data-component=\"glitch-text\"\n data-text={text}\n aria-label={text}\n >\n {text}\n </span>\n )\n }\n)\n","// hover-card — rich content card shown on hover with delay\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst positionClasses: Record<string, string> = {\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n left: 'right-full top-1/2 -translate-y-1/2 mr-2',\n right: 'left-full top-1/2 -translate-y-1/2 ml-2',\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n}\n\nexport type HoverCardProps = React.HTMLAttributes<HTMLDivElement> & {\n trigger: ReactNode\n delay?: number\n placement?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nexport const HoverCard = forwardRef<HTMLDivElement, HoverCardProps>(\n function HoverCard(\n {\n trigger,\n children,\n delay = 300,\n placement = 'bottom',\n className,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const enterTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const leaveTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n\n const handleEnter = useCallback(() => {\n clearTimeout(leaveTimer.current)\n enterTimer.current = setTimeout(() => setOpen(true), delay)\n }, [delay])\n\n const handleLeave = useCallback(() => {\n clearTimeout(enterTimer.current)\n leaveTimer.current = setTimeout(() => setOpen(false), 150)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-flex', className)}\n data-component=\"hover-card\"\n data-state={open ? 'open' : 'closed'}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n {...props}\n >\n {trigger}\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y gds-shadow-lg absolute z-50 border',\n positionClasses[placement]\n )}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n >\n {children}\n </div>\n )}\n </div>\n )\n }\n)\n","// info-row — horizontal info bar with icon, label, and value\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type InfoRowProps = {\n label: string\n value: ReactNode\n icon?: ReactNode\n className?: string\n}\n\nexport const InfoRow = forwardRef<HTMLDivElement, InfoRowProps>(\n function InfoRow({ label, value, icon, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body flex items-center gap-2 select-none',\n className\n )}\n data-component=\"info-row\"\n >\n {icon !== undefined && <span className=\"text-fg-muted/60\">{icon}</span>}\n <span className=\"text-fg-muted\">{label}</span>\n <span className=\"text-fg ml-auto font-medium\">{value}</span>\n </div>\n )\n }\n)\n","// input-group — groups input with prefix/suffix addons\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type InputGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n error?: boolean\n disabled?: boolean\n className?: string\n}\n\nexport const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(\n function InputGroup(\n { prefix, suffix, error, disabled, className, children, ...props },\n ref\n ) {\n return (\n <div\n ref={ref}\n data-component=\"input-group\"\n className={cx(\n 'gds-radius-input flex items-center overflow-hidden border transition-colors',\n error ? 'border-danger' : 'border-border',\n disabled && 'pointer-events-none opacity-50',\n // strip border/radius from nested inputs\n '[&_input]:flex-1 [&_input]:rounded-none [&_input]:border-0 [&_input]:ring-0 [&_input]:focus-visible:ring-0',\n className\n )}\n {...props}\n >\n {prefix !== undefined && (\n <span className=\"bg-bg-tertiary border-border text-fg-muted flex items-center border-r px-3 text-sm select-none\">\n {prefix}\n </span>\n )}\n {children}\n {suffix !== undefined && (\n <span className=\"bg-bg-tertiary border-border text-fg-muted flex items-center border-l px-3 text-sm select-none\">\n {suffix}\n </span>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype InputWithButtonProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n buttonLabel: string\n disabled?: boolean\n onChange: (value: string) => void\n onSubmit: () => void\n placeholder?: string\n value: string\n}\n\nexport const InputWithButton = forwardRef<HTMLDivElement, InputWithButtonProps>(\n function InputWithButton(\n {\n buttonLabel,\n className,\n disabled = false,\n onChange,\n onSubmit,\n placeholder,\n value,\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx(\n 'border-border inline-flex items-center overflow-hidden rounded-md border',\n className\n )}\n data-component=\"input-with-button\"\n ref={ref}\n {...props}\n >\n <input\n className=\"text-fg placeholder:text-fg-muted min-w-0 flex-1 bg-transparent px-3 py-1.5 text-sm outline-none\"\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSubmit()\n }}\n placeholder={placeholder}\n type=\"text\"\n value={value}\n />\n <button\n className=\"border-border bg-accent/10 text-accent hover:bg-accent/20 shrink-0 border-l px-3 py-1.5 text-sm font-medium disabled:opacity-50\"\n disabled={disabled}\n onClick={onSubmit}\n type=\"button\"\n >\n {buttonLabel}\n </button>\n </div>\n )\n }\n)\n\nexport type { InputWithButtonProps }\n","// key-value-list — compact list of label-value pairs in one or two columns\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KeyValueItem = {\n key: string\n value: ReactNode\n}\n\nexport type KeyValueListProps = {\n items: KeyValueItem[]\n columns?: 1 | 2\n className?: string\n}\n\nexport const KeyValueList = forwardRef<HTMLDivElement, KeyValueListProps>(\n function KeyValueList({ items, columns = 1, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'grid gap-x-8 gap-y-2',\n columns === 2 ? 'grid-cols-2' : 'grid-cols-1',\n className\n )}\n data-component=\"key-value-list\"\n >\n {items.map((item) => (\n <div\n className=\"flex items-baseline justify-between gap-4\"\n key={item.key}\n >\n <span className=\"gds-text-body text-fg-muted shrink-0\">\n {item.key}\n </span>\n <span className=\"gds-text-body text-fg text-right\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","// kv-table — key-value display table for entity details\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KvTableItem = {\n key: string\n value: ReactNode\n copyable?: boolean\n}\n\nexport type KvTableProps = {\n items: KvTableItem[]\n columns?: 1 | 2\n striped?: boolean\n className?: string\n}\n\nexport const KvTable = forwardRef<HTMLDivElement, KvTableProps>(\n function KvTable({ items, columns = 1, striped, className }, ref) {\n const isTwoCol = columns === 2\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body',\n isTwoCol && 'grid grid-cols-2 gap-x-6',\n className\n )}\n data-component=\"kv-table\"\n data-variant={isTwoCol ? '2col' : '1col'}\n >\n {items.map((item, i) => (\n <KvRow\n key={item.key}\n item={item}\n striped={striped === true && i % 2 === 1}\n />\n ))}\n </div>\n )\n }\n)\n\nfunction KvRow({ item, striped }: { item: KvTableItem; striped: boolean }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n const text =\n typeof item.value === 'string' ? item.value : String(item.value)\n navigator.clipboard.writeText(text).catch(() => {})\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n\n return (\n <div\n className={cx(\n 'group gds-pad-x gds-pad-y-sm flex items-baseline justify-between gap-4',\n striped && 'bg-bg-tertiary/40'\n )}\n >\n <dt className=\"text-fg-muted shrink-0 font-medium\">{item.key}</dt>\n <dd className=\"text-fg flex items-center gap-1.5 text-right\">\n <span>{item.value}</span>\n {item.copyable === true && (\n <button\n onClick={handleCopy}\n className=\"text-fg-muted/50 hover:text-fg-muted invisible group-hover:visible\"\n aria-label={`Copy ${item.key}`}\n >\n {copied ? '✓' : '⎘'}\n </button>\n )}\n </dd>\n </div>\n )\n}\n","// link-preview — rich preview card for an external link with image, title, description\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type LinkPreviewProps = {\n title: string\n url: string\n description?: string\n domain?: string\n image?: string\n glass?: boolean\n className?: string\n}\n\nexport const LinkPreview = forwardRef<HTMLAnchorElement, LinkPreviewProps>(\n function LinkPreview(\n { title, url, description, domain, image, glass, className },\n ref\n ) {\n return (\n <a\n ref={ref}\n className={cx(\n 'gds-gap gds-radius border-accent bg-bg-secondary gds-pad hover:bg-bg-tertiary flex border-l-4 transition-colors select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"link-preview\"\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-accent truncate text-sm font-medium\">\n {title}\n </span>\n {description !== undefined && (\n <span className=\"gds-text-body text-fg-muted line-clamp-2\">\n {description}\n </span>\n )}\n {domain !== undefined && (\n <span className=\"text-fg-muted/60 text-[10px]\">{domain}</span>\n )}\n </div>\n {image !== undefined && (\n <img\n alt={title}\n className=\"gds-radius h-16 w-16 shrink-0 object-cover\"\n src={image}\n />\n )}\n </a>\n )\n }\n)\n","// live-metric — card displaying a live metric value with optional pulse\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type LiveMetricProps = {\n className?: string\n label: string\n pulse?: boolean\n unit?: string\n value: number | string\n}\n\nexport const LiveMetric = forwardRef<HTMLDivElement, LiveMetricProps>(\n function LiveMetric({ className, label, pulse, unit, value }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap-sm gds-pad gds-radius border-border bg-surface flex flex-col border',\n className\n )}\n data-component=\"live-metric\"\n >\n <div className=\"gds-gap-sm flex items-center\">\n {pulse === true && (\n <span className=\"relative flex h-2.5 w-2.5 shrink-0\">\n <span className=\"bg-success absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\" />\n <span className=\"bg-success relative inline-flex h-2.5 w-2.5 rounded-full\" />\n </span>\n )}\n <span className=\"text-fg-muted text-xs\">{label}</span>\n </div>\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-fg text-2xl font-bold tabular-nums\">\n {value}\n </span>\n {unit !== undefined && (\n <span className=\"text-fg-muted text-sm\">{unit}</span>\n )}\n </div>\n </div>\n )\n }\n)\n","// loading-overlay — covers parent container with spinner + optional message\nimport { forwardRef } from 'react'\n\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype LoadingOverlayProps = {\n visible: boolean\n message?: string\n glass?: boolean\n className?: string\n}\n\nconst LoadingOverlay = forwardRef<HTMLDivElement, LoadingOverlayProps>(\n function LoadingOverlay({ visible, message, glass = true, className }, ref) {\n if (!visible) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute inset-0 z-10 flex flex-col items-center justify-center',\n glass === true ? glassClass(true) : 'bg-bg/80',\n className\n )}\n data-component=\"loading-overlay\"\n >\n <Spinner />\n {message !== undefined && (\n <span className=\"text-fg-muted mt-2 text-xs\">{message}</span>\n )}\n </div>\n )\n }\n)\n\nexport { LoadingOverlay }\nexport type { LoadingOverlayProps }\n","// matrix-rain — canvas-based falling characters effect\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MatrixRainProps = {\n active?: boolean\n className?: string\n color?: string\n density?: number\n speed?: number\n}\n\nexport const MatrixRain = forwardRef<HTMLCanvasElement, MatrixRainProps>(\n function MatrixRain(\n { active = true, className, color = '#00ff41', density = 20, speed = 50 },\n ref\n ) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const animRef = useRef<number>(0)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (canvas === null || !active) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n const resize = () => {\n canvas.width = canvas.offsetWidth\n canvas.height = canvas.offsetHeight\n }\n resize()\n window.addEventListener('resize', resize)\n\n const fontSize = 14\n const columns = Math.floor(canvas.width / density)\n const drops = new Array(columns).fill(1) as number[]\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%^&*'\n\n let last = 0\n const draw = (time: number) => {\n if (time - last < speed) {\n animRef.current = requestAnimationFrame(draw)\n return\n }\n last = time\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n ctx.fillStyle = color\n ctx.font = `${fontSize}px monospace`\n\n for (let i = 0; i < drops.length; i++) {\n const text = chars[Math.floor(Math.random() * chars.length)]\n ctx.fillText(text, i * density, drops[i] * fontSize)\n if (drops[i] * fontSize > canvas.height && Math.random() > 0.975) {\n drops[i] = 0\n }\n drops[i]++\n }\n\n animRef.current = requestAnimationFrame(draw)\n }\n\n animRef.current = requestAnimationFrame(draw)\n\n return () => {\n cancelAnimationFrame(animRef.current)\n window.removeEventListener('resize', resize)\n }\n }, [active, color, density, speed])\n\n return (\n <canvas\n ref={(node) => {\n canvasRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLCanvasElement | null>).current =\n node\n }\n }}\n className={cx('block h-full w-full bg-black', className)}\n data-component=\"matrix-rain\"\n />\n )\n }\n)\n","// media-container — renders image, video, or audio based on type\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MediaType = 'audio' | 'image' | 'video'\n\nexport type MediaContainerProps = {\n alt?: string\n aspectRatio?: number\n className?: string\n rounded?: boolean\n src: string\n type: MediaType\n}\n\nexport const MediaContainer = forwardRef<HTMLDivElement, MediaContainerProps>(\n function MediaContainer(\n { alt, aspectRatio, className, rounded, src, type },\n ref\n ) {\n const roundedCls = rounded === true ? 'rounded-lg overflow-hidden' : ''\n\n return (\n <div\n ref={ref}\n className={cx('relative w-full', roundedCls, className)}\n style={\n aspectRatio !== undefined\n ? { aspectRatio: String(aspectRatio) }\n : undefined\n }\n data-component=\"media-container\"\n data-variant={type}\n >\n {type === 'image' && (\n <img\n src={src}\n alt={alt ?? ''}\n className=\"h-full w-full object-cover\"\n />\n )}\n {type === 'video' && (\n <video\n src={src}\n controls\n className=\"h-full w-full object-cover\"\n aria-label={alt}\n />\n )}\n {type === 'audio' && (\n <audio src={src} controls className=\"w-full\" aria-label={alt} />\n )}\n </div>\n )\n }\n)\n","// media-object — classic media + content side-by-side layout\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype MediaObjectProps = {\n align?: 'center' | 'top'\n children: ReactNode\n className?: string\n media: ReactNode\n reverse?: boolean\n}\n\nexport const MediaObject = forwardRef<HTMLDivElement, MediaObjectProps>(\n function MediaObject(\n { align = 'top', children, className, media, reverse = false },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap flex',\n align === 'center' && 'items-center',\n align === 'top' && 'items-start',\n reverse === true && 'flex-row-reverse',\n className\n )}\n data-component=\"media-object\"\n >\n <div className=\"shrink-0\">{media}</div>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n }\n)\n\nexport type { MediaObjectProps }\n","// mention-list — suggestion dropdown for mention-input\n\nimport { cx } from '../utils/cx'\n\ntype MentionSuggestion = {\n id: string\n label: string\n}\n\ntype MentionListProps = {\n filtered: MentionSuggestion[]\n highlightedIndex: number\n onSelect: (suggestion: MentionSuggestion) => void\n trigger: string\n}\n\nexport function MentionList({\n filtered,\n highlightedIndex,\n onSelect,\n trigger,\n}: MentionListProps) {\n return (\n <div\n className=\"gds-radius-popover border-border bg-surface absolute top-full right-0 left-0 z-50 mt-1 border shadow-lg\"\n role=\"listbox\"\n data-testid=\"mention-suggestions\"\n >\n {filtered.map((suggestion, index) => (\n <button\n key={suggestion.id}\n type=\"button\"\n role=\"option\"\n aria-selected={index === highlightedIndex}\n className={cx(\n 'text-fg flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors',\n index === highlightedIndex && 'bg-accent/10 text-accent',\n index !== highlightedIndex && 'hover:bg-bg-secondary'\n )}\n onMouseDown={(e) => {\n e.preventDefault()\n onSelect(suggestion)\n }}\n >\n <span className=\"text-fg-muted mr-1.5\">{trigger}</span>\n {suggestion.label}\n </button>\n ))}\n </div>\n )\n}\n\nexport type { MentionListProps, MentionSuggestion }\n","// mention-input — text input with @mention suggestion dropdown\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { MentionSuggestion } from './mention-list'\nimport { MentionList } from './mention-list'\n\nexport type MentionInputProps = {\n value: string\n onChange: (value: string) => void\n suggestions: MentionSuggestion[]\n trigger?: string\n placeholder?: string\n disabled?: boolean\n className?: string\n}\n\nexport const MentionInput = forwardRef<HTMLInputElement, MentionInputProps>(\n function MentionInput(\n {\n value,\n onChange,\n suggestions,\n trigger = '@',\n placeholder,\n disabled,\n className,\n },\n ref\n ) {\n const [showSuggestions, setShowSuggestions] = useState(false)\n const [query, setQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const filtered = suggestions.filter((s) =>\n s.label.toLowerCase().includes(query.toLowerCase())\n )\n\n // find the trigger position in the current value\n const findTriggerPosition = useCallback(\n (text: string): number => {\n const lastTrigger = text.lastIndexOf(trigger)\n if (lastTrigger < 0) return -1\n if (lastTrigger > 0 && text[lastTrigger - 1] !== ' ') return -1\n const afterTrigger = text.slice(lastTrigger + trigger.length)\n if (afterTrigger.includes(' ')) return -1\n return lastTrigger\n },\n [trigger]\n )\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n onChange(newValue)\n\n const triggerPos = findTriggerPosition(newValue)\n if (triggerPos >= 0) {\n const q = newValue.slice(triggerPos + trigger.length)\n setQuery(q)\n setShowSuggestions(true)\n setHighlightedIndex(0)\n } else {\n setShowSuggestions(false)\n setQuery('')\n }\n },\n [onChange, findTriggerPosition, trigger]\n )\n\n const selectSuggestion = useCallback(\n (suggestion: MentionSuggestion) => {\n const triggerPos = findTriggerPosition(value)\n if (triggerPos < 0) return\n const before = value.slice(0, triggerPos)\n const after = `${trigger}${suggestion.label} `\n onChange(before + after)\n setShowSuggestions(false)\n setQuery('')\n },\n [value, onChange, findTriggerPosition, trigger]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!showSuggestions) return\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIndex((prev) => {\n if (prev >= filtered.length - 1) return 0\n return prev + 1\n })\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIndex((prev) => {\n if (prev <= 0) return filtered.length - 1\n return prev - 1\n })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n if (filtered.length > 0) {\n selectSuggestion(filtered[highlightedIndex])\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setShowSuggestions(false)\n }\n },\n [showSuggestions, filtered, highlightedIndex, selectSuggestion]\n )\n\n // close on click outside\n useEffect(() => {\n if (!showSuggestions) return\n\n function handleClickOutside(e: MouseEvent) {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setShowSuggestions(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [showSuggestions])\n\n return (\n <div\n ref={containerRef}\n className=\"relative\"\n data-component=\"mention-input\"\n >\n <input\n ref={ref}\n type=\"text\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={cx(\n 'gds-radius-button border-border bg-bg-secondary text-fg w-full border px-3 py-2 text-sm',\n 'placeholder:text-fg-muted/50',\n disabled === true && 'pointer-events-none opacity-50',\n focusCls,\n className\n )}\n />\n {showSuggestions && filtered.length > 0 && (\n <MentionList\n filtered={filtered}\n highlightedIndex={highlightedIndex}\n onSelect={selectSuggestion}\n trigger={trigger}\n />\n )}\n </div>\n )\n }\n)\n","// metric-row — horizontal row of compact metric values\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MetricRowMetric = {\n label: string\n value: string | number\n unit?: string\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\nexport type MetricRowProps = {\n metrics: MetricRowMetric[]\n className?: string\n}\n\nconst variantColor: Record<string, string> = {\n default: 'text-fg',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport const MetricRow = forwardRef<HTMLDivElement, MetricRowProps>(\n function MetricRow({ metrics, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-text-body flex items-center select-none',\n className\n )}\n data-component=\"metric-row\"\n >\n {metrics.map((m) => (\n <div key={m.label} className=\"flex items-baseline gap-1.5\">\n <span className=\"text-fg-muted\">{m.label}</span>\n <span\n className={cx(\n 'font-semibold',\n variantColor[m.variant ?? 'default']\n )}\n >\n {m.value}\n {m.unit !== undefined && (\n <span className=\"text-fg-muted ml-0.5 font-normal\">\n {m.unit}\n </span>\n )}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype MetricTileVariant = 'danger' | 'default' | 'success' | 'warning'\n\ntype MetricTileProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n unit?: string\n value: number | string\n variant?: MetricTileVariant\n}\n\nconst variantCls: Record<MetricTileVariant, string> = {\n default: 'text-fg',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport const MetricTile = forwardRef<HTMLDivElement, MetricTileProps>(\n function MetricTile(\n { className, label, unit, value, variant = 'default', ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-pad gds-radius bg-surface flex flex-col items-center',\n className\n )}\n data-component=\"metric-tile\"\n ref={ref}\n {...props}\n >\n <span\n className={cx('text-lg font-bold tabular-nums', variantCls[variant])}\n >\n {value}\n {unit !== undefined && (\n <span className=\"text-fg-muted ml-0.5 text-xs font-normal\">\n {unit}\n </span>\n )}\n </span>\n <span className=\"text-fg-muted text-xs\">{label}</span>\n </div>\n )\n }\n)\n\nexport type { MetricTileProps, MetricTileVariant }\n","// morphing-shape — SVG shape that transitions between variants\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MorphingShapeProps = {\n className?: string\n color?: string\n size?: number\n variant: 'blob' | 'circle' | 'square' | 'star'\n}\n\nconst paths: Record<MorphingShapeProps['variant'], string> = {\n circle: 'M50 10 A40 40 0 1 1 49.99 10 Z',\n square: 'M15 15 H85 V85 H15 Z',\n star: 'M50 5 L61 35 L95 35 L68 57 L79 90 L50 70 L21 90 L32 57 L5 35 L39 35 Z',\n blob: 'M50 10 C75 5 95 25 90 50 C95 75 75 95 50 90 C25 95 5 75 10 50 C5 25 25 5 50 10 Z',\n}\n\nexport const MorphingShape = forwardRef<SVGSVGElement, MorphingShapeProps>(\n function MorphingShape(\n { className, color = 'currentColor', size = 100, variant },\n ref\n ) {\n const d = useMemo(() => paths[variant], [variant])\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 100 100\"\n className={cx('text-fg', className)}\n data-component=\"morphing-shape\"\n data-variant={variant}\n >\n <path d={d} fill={color} style={{ transition: 'd 0.4s ease' }} />\n </svg>\n )\n }\n)\n","// multi-select-list — dropdown option list for multi-select (internal)\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype MultiSelectOption = {\n label: string\n value: string\n}\n\ntype MultiSelectListProps = {\n filtered: MultiSelectOption[]\n glass?: boolean\n onSearchChange: (value: string) => void\n onToggle: (value: string) => void\n searchQuery: string\n searchRef: React.RefObject<HTMLInputElement | null>\n value: string[]\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"text-accent h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M3.5 8l3 3 6-6\" />\n </svg>\n )\n}\n\nfunction MultiSelectList({\n filtered,\n glass,\n onSearchChange,\n onToggle,\n searchQuery,\n searchRef,\n value,\n}: MultiSelectListProps) {\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div className=\"border-border border-b p-1.5\">\n <input\n className=\"text-fg placeholder:text-fg-muted/50 w-full bg-transparent px-2 py-1 text-sm outline-none\"\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search...\"\n ref={searchRef}\n type=\"text\"\n value={searchQuery}\n />\n </div>\n <div className=\"max-h-60 overflow-y-auto py-1\">\n {filtered.length === 0 && (\n <div className=\"gds-pad-x gds-pad-y-sm text-fg-muted text-sm\">\n No results\n </div>\n )}\n {filtered.map((opt) => {\n const isSelected = value.includes(opt.value)\n return (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm flex w-full items-center gap-2 text-left text-sm transition-colors',\n isSelected && 'text-accent',\n !isSelected && 'text-fg hover:bg-bg-tertiary'\n )}\n key={opt.value}\n onClick={() => onToggle(opt.value)}\n type=\"button\"\n >\n <span\n className={cx(\n 'flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors',\n isSelected ? 'border-accent bg-accent/10' : 'border-border'\n )}\n >\n {isSelected && <CheckIcon />}\n </span>\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport { MultiSelectList }\nexport type { MultiSelectListProps }\n","// multi-select — dropdown with checkboxes for multiple selection\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport { MultiSelectList } from './multi-select-list'\n\ntype MultiSelectOption = {\n label: string\n value: string\n}\n\ntype MultiSelectProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n maxDisplay?: number\n onChange: (value: string[]) => void\n options: MultiSelectOption[]\n placeholder?: string\n value: string[]\n}\n\n// chevron icon\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 shrink-0 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(\n function MultiSelect(\n {\n className,\n disabled = false,\n error = false,\n glass,\n maxDisplay = 3,\n onChange,\n options,\n placeholder = 'Select...',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n const filtered = useMemo(() => {\n if (searchQuery === '') return options\n const lower = searchQuery.toLowerCase()\n return options.filter((opt) => opt.label.toLowerCase().includes(lower))\n }, [options, searchQuery])\n\n const selectedLabels = useMemo(\n () => options.filter((opt) => value.includes(opt.value)),\n [options, value]\n )\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n setSearchQuery('')\n requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n setSearchQuery('')\n }, [])\n\n const handleToggle = useCallback(\n (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n },\n [onChange, value]\n )\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n const visibleChips = selectedLabels.slice(0, maxDisplay)\n const overflow = selectedLabels.length - maxDisplay\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"multi-select\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between gap-1 border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {selectedLabels.length === 0 && (\n <span className=\"text-fg-muted\">{placeholder}</span>\n )}\n {visibleChips.map((opt) => (\n <span\n key={opt.value}\n className=\"bg-accent/10 text-accent inline-flex max-w-[120px] items-center truncate rounded px-1.5 py-0.5 text-xs\"\n >\n {opt.label}\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"text-fg-muted text-xs\">+{overflow} more</span>\n )}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <MultiSelectList\n filtered={filtered}\n glass={glass}\n onSearchChange={setSearchQuery}\n onToggle={handleToggle}\n searchQuery={searchQuery}\n searchRef={searchRef}\n value={value}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { MultiSelectOption, MultiSelectProps }\n","// nav-item — sidebar navigation item with icon, label, and optional badge\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NavItemProps = {\n icon?: ReactNode\n label: string\n active?: boolean\n badge?: number\n onClick?: () => void\n collapsed?: boolean\n className?: string\n}\n\nconst NavItem = forwardRef<HTMLButtonElement, NavItemProps>(function NavItem(\n { icon, label, active, badge, onClick, collapsed, className },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={onClick}\n title={collapsed === true ? label : undefined}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body relative flex w-full items-center gap-3 select-none',\n 'hover:bg-bg-tertiary transition-colors',\n active === true && 'bg-accent/10 text-accent font-medium',\n active !== true && 'text-fg-muted',\n collapsed === true && 'justify-center',\n className\n )}\n data-component=\"nav-item\"\n data-state={active === true ? 'active' : undefined}\n >\n {icon !== undefined && <span className=\"shrink-0\">{icon}</span>}\n {collapsed !== true && (\n <span className=\"flex-1 truncate text-left\">{label}</span>\n )}\n {badge !== undefined && badge > 0 && (\n <span className=\"bg-accent text-accent-fg inline-flex h-5 min-w-5 items-center justify-center rounded-full px-1 text-[10px] font-bold\">\n {badge > 99 ? '99+' : badge}\n </span>\n )}\n </button>\n )\n})\n\nexport { NavItem }\nexport type { NavItemProps }\n","// network-status — connection status indicator\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NetworkStatusValue = 'offline' | 'online' | 'slow'\n\nexport type NetworkStatusProps = {\n className?: string\n status: NetworkStatusValue\n}\n\nconst statusConfig: Record<\n NetworkStatusValue,\n { color: string; label: string }\n> = {\n online: { color: 'bg-success', label: 'Online' },\n offline: { color: 'bg-danger', label: 'Offline' },\n slow: { color: 'bg-warning', label: 'Slow' },\n}\n\nexport const NetworkStatus = forwardRef<HTMLDivElement, NetworkStatusProps>(\n function NetworkStatus({ className, status }, ref) {\n const config = statusConfig[status]\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex items-center', className)}\n data-component=\"network-status\"\n data-state={status}\n >\n <span\n className={cx(\n 'inline-block h-2 w-2 shrink-0 rounded-full',\n config.color\n )}\n />\n <span className=\"gds-text text-fg-muted\">{config.label}</span>\n </div>\n )\n }\n)\n","// noise-overlay — SVG feTurbulence noise filter overlay\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NoiseOverlayProps = {\n animated?: boolean\n className?: string\n opacity?: number\n}\n\nexport const NoiseOverlay = forwardRef<HTMLDivElement, NoiseOverlayProps>(\n function NoiseOverlay({ animated, className, opacity = 0.05 }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'pointer-events-none absolute inset-0 overflow-hidden',\n className\n )}\n style={{ opacity }}\n data-component=\"noise-overlay\"\n >\n <svg className=\"h-full w-full\" xmlns=\"http://www.w3.org/2000/svg\">\n <filter id=\"gds-noise\">\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.8\"\n numOctaves=\"4\"\n stitchTiles=\"stitch\"\n >\n {animated === true && (\n <animate\n attributeName=\"seed\"\n from=\"0\"\n to=\"100\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n )}\n </feTurbulence>\n </filter>\n <rect width=\"100%\" height=\"100%\" filter=\"url(#gds-noise)\" />\n </svg>\n </div>\n )\n }\n)\n","// notification-bell — icon button with unread count badge\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type NotificationBellProps = {\n unread: number\n onClick: () => void\n className?: string\n}\n\nexport const NotificationBell = forwardRef<\n HTMLButtonElement,\n NotificationBellProps\n>(function NotificationBell({ unread, onClick, className }, ref) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx(\n 'gds-radius-button text-fg-muted hover:bg-bg-tertiary hover:text-fg relative inline-flex h-8 w-8 items-center justify-center transition-colors select-none',\n focusCls,\n className\n )}\n data-component=\"notification-bell\"\n onClick={onClick}\n aria-label={`Notifications${unread > 0 ? ` (${unread} unread)` : ''}`}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cx(unread > 0 && 'animate-pulse')}\n >\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n {unread > 0 && (\n <span className=\"bg-danger absolute -top-0.5 -right-0.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-medium text-white\">\n {unread > 99 ? '99+' : unread}\n </span>\n )}\n </button>\n )\n})\n","// notification-dot — element wrapper with notification count badge\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NotificationDotVariant = 'accent' | 'danger'\n\ntype NotificationDotProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n count?: number\n max?: number\n variant?: NotificationDotVariant\n}\n\nconst variantMap: Record<NotificationDotVariant, string> = {\n danger: 'bg-danger text-white',\n accent: 'bg-accent text-accent-fg',\n}\n\nexport const NotificationDot = forwardRef<HTMLDivElement, NotificationDotProps>(\n function NotificationDot(\n { children, count = 0, max = 99, variant = 'danger', className, ...props },\n ref\n ) {\n const visible = count > 0\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-flex', className)}\n data-component=\"notification-dot\"\n {...props}\n >\n {children}\n {visible && (\n <span\n className={cx(\n 'absolute -top-1.5 -right-1.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] leading-none font-bold',\n variantMap[variant]\n )}\n >\n {display}\n </span>\n )}\n </div>\n )\n }\n)\n\nexport type { NotificationDotProps, NotificationDotVariant }\n","// num-table — numeric data table with right-aligned values and optional footer\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NumColumn = {\n footer?: React.ReactNode\n format?: (value: null | number | undefined) => string\n key: string\n label: string\n width?: string\n}\n\nexport type NumTableProps = {\n className?: string\n columns: NumColumn[]\n emptyMessage?: string\n getRowHighlight?: (row: Record<string, unknown>) => string | undefined\n labelHeader: string\n labelKey: string\n rowKey?: string\n rows: Record<string, unknown>[]\n}\n\nfunction formatCell(\n value: unknown,\n format?: (v: null | number | undefined) => string\n): string {\n if (value === null || value === undefined) {\n if (format !== undefined) return format(null)\n return '\\u2014'\n }\n if (typeof value === 'number') {\n if (format !== undefined) return format(value)\n return String(value)\n }\n return String(value)\n}\n\nexport const NumTable = forwardRef<HTMLTableElement, NumTableProps>(\n function NumTable(\n {\n className,\n columns,\n emptyMessage,\n getRowHighlight,\n labelHeader,\n labelKey,\n rowKey,\n rows,\n },\n ref\n ) {\n const hasFooter = columns.some((col) => col.footer !== undefined)\n\n return (\n <table\n ref={ref}\n className={cx('gds-text w-full border-collapse', className)}\n data-component=\"num-table\"\n >\n <thead>\n <tr className=\"border-border border-b\">\n <th className=\"gds-pad-y text-fg-muted px-2 text-left text-xs font-medium\">\n {labelHeader}\n </th>\n {columns.map((col) => (\n <th\n key={col.key}\n className=\"gds-pad-y text-fg-muted px-2 text-right text-xs font-medium\"\n style={\n col.width !== undefined ? { width: col.width } : undefined\n }\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && emptyMessage !== undefined && (\n <tr>\n <td\n colSpan={columns.length + 1}\n className=\"gds-pad-y text-fg-muted px-2 text-center\"\n >\n {emptyMessage}\n </td>\n </tr>\n )}\n {rows.map((row, i) => {\n const key = rowKey !== undefined ? String(row[rowKey]) : String(i)\n const highlight = getRowHighlight?.(row)\n return (\n <tr\n key={key}\n className={cx('border-border/50 border-b', highlight)}\n >\n <td className=\"gds-pad-y text-fg px-2 text-left\">\n {String(row[labelKey] ?? '')}\n </td>\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"gds-pad-y text-fg px-2 text-right tabular-nums\"\n >\n {formatCell(row[col.key], col.format)}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n {hasFooter && (\n <tfoot>\n <tr className=\"border-border border-t font-medium\">\n <td className=\"gds-pad-y px-2\" />\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"gds-pad-y text-fg px-2 text-right tabular-nums\"\n >\n {col.footer ?? ''}\n </td>\n ))}\n </tr>\n </tfoot>\n )}\n </table>\n )\n }\n)\n","// otp-input — one-time password digit input\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type OtpInputProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n length?: number\n onComplete: (code: string) => void\n}\n\nexport const OtpInput = forwardRef<HTMLDivElement, OtpInputProps>(\n function OtpInput(\n { className, disabled, error, length = 6, onComplete },\n ref\n ) {\n const [values, setValues] = useState<string[]>(() =>\n new Array(length).fill('')\n )\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n const focusAt = useCallback((index: number) => {\n inputsRef.current[index]?.focus()\n }, [])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n const digit = char.replace(/\\D/g, '').slice(-1)\n const next = [...values]\n next[index] = digit\n setValues(next)\n\n if (digit !== '' && index < length - 1) {\n focusAt(index + 1)\n }\n\n const code = next.join('')\n if (code.length === length && next.every((v) => v !== '')) {\n onComplete(code)\n }\n },\n [values, length, onComplete, focusAt]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && values[index] === '' && index > 0) {\n focusAt(index - 1)\n }\n },\n [values, focusAt]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n const pasted = e.clipboardData\n .getData('text')\n .replace(/\\D/g, '')\n .slice(0, length)\n const next = new Array(length).fill('') as string[]\n for (let i = 0; i < pasted.length; i++) {\n next[i] = pasted[i]\n }\n setValues(next)\n focusAt(Math.min(pasted.length, length - 1))\n\n if (pasted.length === length) {\n onComplete(pasted)\n }\n },\n [length, onComplete, focusAt]\n )\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex items-center', className)}\n data-component=\"otp-input\"\n >\n {values.map((v, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={v}\n disabled={disabled}\n className={cx(\n 'text-fg bg-bg h-12 w-10 rounded border text-center text-lg font-semibold tabular-nums',\n error === true ? 'border-danger' : 'border-border',\n disabled === true && 'cursor-not-allowed opacity-50',\n focusCls\n )}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n />\n ))}\n </div>\n )\n }\n)\n","// overflow-menu — \"...\" button that reveals hidden action items\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype OverflowMenuItem = {\n id: string\n label: string\n}\n\ntype OverflowMenuProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> & {\n items: OverflowMenuItem[]\n onSelect: (id: string) => void\n}\n\nconst OverflowMenu = forwardRef<HTMLDivElement, OverflowMenuProps>(\n function OverflowMenu({ items, onSelect, className, ...props }, ref) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={cx('relative inline-flex', className)}\n data-component=\"overflow-menu\"\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n aria-label=\"More options\"\n className={cx(\n 'text-fg-muted hover:bg-bg-tertiary rounded px-2 py-1 text-sm transition-colors select-none',\n focusCls\n )}\n >\n ...\n </button>\n {open && (\n <div className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg absolute top-full right-0 z-50 mt-1 min-w-[140px] border py-1\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body text-fg hover:bg-bg-tertiary flex w-full items-center transition-colors',\n focusCls\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport { OverflowMenu }\nexport type { OverflowMenuItem, OverflowMenuProps }\n","// page-nav — previous/next page navigation\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype PageNavLink = {\n href?: string\n label: string\n onClick?: () => void\n}\n\ntype PageNavProps = React.HTMLAttributes<HTMLElement> & {\n next?: PageNavLink\n prev?: PageNavLink\n}\n\nconst linkCls = cx(\n 'flex items-center gap-1.5 gds-radius-button gds-pad-x gds-pad-y gds-text-body text-fg-muted hover:text-fg transition-colors',\n focusCls\n)\n\nexport const PageNav = forwardRef<HTMLElement, PageNavProps>(function PageNav(\n { prev, next, className, ...props },\n ref\n) {\n return (\n <nav\n ref={ref}\n className={cx('flex w-full items-center justify-between', className)}\n data-component=\"page-nav\"\n {...props}\n >\n <div>\n {prev !== undefined && (\n <a href={prev.href} onClick={prev.onClick} className={linkCls}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 3L5 7l4 4\" />\n </svg>\n {prev.label}\n </a>\n )}\n </div>\n <div>\n {next !== undefined && (\n <a href={next.href} onClick={next.onClick} className={linkCls}>\n {next.label}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3l4 4-4 4\" />\n </svg>\n </a>\n )}\n </div>\n </nav>\n )\n})\n\nexport type { PageNavLink, PageNavProps }\n","// pagination — page navigation with numbered buttons and ellipsis\nimport { forwardRef, useMemo } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type PaginationProps = React.HTMLAttributes<HTMLElement> & {\n page: number\n totalPages: number\n onPageChange: (page: number) => void\n siblings?: number\n}\n\nfunction range(start: number, end: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i++) result.push(i)\n return result\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n function Pagination(\n { page, totalPages, onPageChange, siblings = 1, className, ...props },\n ref\n ) {\n const pages = useMemo(() => {\n const total = totalPages\n const boundary = siblings + 3 // siblings + first + last + current\n if (total <= boundary + 2) return range(1, total)\n\n const left = Math.max(page - siblings, 2)\n const right = Math.min(page + siblings, total - 1)\n const showLeftDots = left > 2\n const showRightDots = right < total - 1\n\n const mid = range(left, right)\n const items: (number | 'dots-l' | 'dots-r')[] = [1]\n if (showLeftDots) items.push('dots-l')\n items.push(...mid)\n if (showRightDots) items.push('dots-r')\n items.push(total)\n return items\n }, [page, totalPages, siblings])\n\n const chevron = (dir: 'left' | 'right') => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={dir === 'left' ? 'M9 3L5 7l4 4' : 'M5 3l4 4-4 4'} />\n </svg>\n )\n\n const btnBase = cx(\n 'inline-flex gds-sq items-center justify-center gds-radius-button gds-text-body select-none',\n focusCls\n )\n\n return (\n <nav\n ref={ref}\n className={cx('gds-gap-xs flex items-center', className)}\n data-component=\"pagination\"\n aria-label=\"Pagination\"\n {...props}\n >\n <button\n type=\"button\"\n className={cx(\n btnBase,\n 'text-fg-muted',\n page <= 1\n ? 'pointer-events-none opacity-40'\n : 'hover:bg-bg-secondary'\n )}\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n {chevron('left')}\n </button>\n\n {pages.map((item) => {\n if (item === 'dots-l' || item === 'dots-r') {\n return (\n <span\n key={item}\n className=\"gds-sq gds-text-body text-fg-muted inline-flex items-center justify-center select-none\"\n >\n &hellip;\n </span>\n )\n }\n const active = item === page\n return (\n <button\n key={item}\n type=\"button\"\n className={cx(\n btnBase,\n active\n ? 'bg-accent text-accent-fg font-medium'\n : 'text-fg-muted hover:bg-bg-secondary hover:text-fg'\n )}\n aria-current={active ? 'page' : undefined}\n onClick={() => onPageChange(item as number)}\n >\n {item}\n </button>\n )\n })}\n\n <button\n type=\"button\"\n className={cx(\n btnBase,\n 'text-fg-muted',\n page >= totalPages\n ? 'pointer-events-none opacity-40'\n : 'hover:bg-bg-secondary'\n )}\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n {chevron('right')}\n </button>\n </nav>\n )\n }\n)\n","// panel — collapsible panel with header bar\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype PanelProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n collapsible?: boolean\n defaultOpen?: boolean\n glass?: boolean\n headerAction?: ReactNode\n title: string\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3.5 w-3.5 shrink-0 transition-transform duration-200',\n open && 'rotate-90'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\nexport const Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n {\n children,\n className,\n collapsible = true,\n defaultOpen = true,\n glass,\n headerAction,\n title,\n ...props\n },\n ref\n) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const expanded = collapsible ? isOpen : true\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-popover border-border bg-surface border',\n glassClass(glass),\n glass === true && 'border-white/10 bg-white/5',\n className\n )}\n data-component=\"panel\"\n data-state={expanded ? 'open' : 'closed'}\n ref={ref}\n {...props}\n >\n <div className=\"border-border gds-pad-x gds-pad-y-sm flex items-center border-b\">\n {collapsible ? (\n <button\n className={cx(\n 'text-fg flex flex-1 items-center gap-2 text-left text-sm font-medium',\n focusCls\n )}\n onClick={() => setIsOpen((prev) => !prev)}\n type=\"button\"\n >\n <ChevronIcon open={expanded} />\n <span>{title}</span>\n </button>\n ) : (\n <span className=\"text-fg flex-1 text-sm font-medium\">{title}</span>\n )}\n {headerAction !== undefined && (\n <div className=\"ml-2 shrink-0\">{headerAction}</div>\n )}\n </div>\n {expanded && <div className=\"gds-pad-x gds-pad-y\">{children}</div>}\n </div>\n )\n})\n\nexport type { PanelProps }\n","// particle-field — canvas-based particle animation with optional connections\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ParticleFieldProps = {\n className?: string\n color?: string\n connected?: boolean\n count?: number\n speed?: number\n}\n\ntype Particle = { vx: number; vy: number; x: number; y: number }\n\nexport const ParticleField = forwardRef<HTMLCanvasElement, ParticleFieldProps>(\n function ParticleField(\n { className, color = '#888888', connected, count = 60, speed = 0.5 },\n ref\n ) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const animRef = useRef<number>(0)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (canvas === null) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n const resize = () => {\n canvas.width = canvas.offsetWidth\n canvas.height = canvas.offsetHeight\n }\n resize()\n window.addEventListener('resize', resize)\n\n const particles: Particle[] = Array.from({ length: count }, () => ({\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed,\n vy: (Math.random() - 0.5) * speed,\n }))\n\n const draw = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n for (const p of particles) {\n p.x += p.vx\n p.y += p.vy\n if (p.x < 0 || p.x > canvas.width) p.vx *= -1\n if (p.y < 0 || p.y > canvas.height) p.vy *= -1\n\n ctx.beginPath()\n ctx.arc(p.x, p.y, 2, 0, Math.PI * 2)\n ctx.fillStyle = color\n ctx.fill()\n }\n\n if (connected === true) {\n const maxDist = 120\n for (let i = 0; i < particles.length; i++) {\n for (let j = i + 1; j < particles.length; j++) {\n const dx = particles[i].x - particles[j].x\n const dy = particles[i].y - particles[j].y\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < maxDist) {\n ctx.beginPath()\n ctx.moveTo(particles[i].x, particles[i].y)\n ctx.lineTo(particles[j].x, particles[j].y)\n ctx.strokeStyle = color\n ctx.globalAlpha = 1 - dist / maxDist\n ctx.stroke()\n ctx.globalAlpha = 1\n }\n }\n }\n }\n\n animRef.current = requestAnimationFrame(draw)\n }\n\n animRef.current = requestAnimationFrame(draw)\n\n return () => {\n cancelAnimationFrame(animRef.current)\n window.removeEventListener('resize', resize)\n }\n }, [color, connected, count, speed])\n\n return (\n <canvas\n ref={(node) => {\n canvasRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLCanvasElement | null>).current =\n node\n }\n }}\n className={cx('block h-full w-full', className)}\n data-component=\"particle-field\"\n />\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { Input } from '../l2-primitives/input'\nimport { Progress } from '../l2-primitives/progress'\nimport { cx } from '../utils/cx'\n\ntype StrengthLevel = 'none' | 'weak' | 'fair' | 'strong'\n\nfunction computeStrength(value: string): StrengthLevel {\n if (value.length === 0) return 'none'\n let score = 0\n if (value.length >= 8) score += 1\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1\n if (/\\d/.test(value)) score += 1\n if (/[^a-zA-Z0-9]/.test(value)) score += 1\n if (score <= 1) return 'weak'\n if (score <= 2) return 'fair'\n return 'strong'\n}\n\nconst strengthConfig: Record<\n Exclude<StrengthLevel, 'none'>,\n { label: string; value: number; variant: 'danger' | 'warning' | 'success' }\n> = {\n weak: { label: 'Weak', value: 33, variant: 'danger' },\n fair: { label: 'Fair', value: 66, variant: 'warning' },\n strong: { label: 'Strong', value: 100, variant: 'success' },\n}\n\ntype PasswordInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> & {\n error?: boolean\n glass?: boolean\n icon?: ReactNode\n inputSize?: 'default' | 'sm'\n showStrength?: boolean\n}\n\nconst eyeSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n)\n\nconst eyeOffSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n)\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput({ className, showStrength = false, ...props }, ref) {\n const [visible, setVisible] = useState(false)\n const value = typeof props.value === 'string' ? props.value : ''\n const strength = showStrength ? computeStrength(value) : 'none'\n\n const toggleButton = (\n <button\n aria-label={visible ? 'Hide password' : 'Show password'}\n className=\"text-fg-muted/50 hover:text-fg-muted cursor-pointer\"\n onClick={() => setVisible((v) => !v)}\n tabIndex={-1}\n type=\"button\"\n >\n {visible ? eyeOffSvg : eyeSvg}\n </button>\n )\n\n return (\n <div\n className={cx('flex flex-col gap-1.5', className)}\n data-component=\"password-input\"\n >\n <Input\n {...props}\n ref={ref}\n rightIcon={toggleButton}\n type={visible ? 'text' : 'password'}\n />\n {showStrength && strength !== 'none' && (\n <div className=\"flex items-center gap-2\">\n <Progress\n size=\"sm\"\n value={strengthConfig[strength].value}\n variant={strengthConfig[strength].variant}\n />\n <span className=\"text-fg-muted shrink-0 text-[10px] select-none\">\n {strengthConfig[strength].label}\n </span>\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { PasswordInputProps }\n","// phone-input — phone number input with country code prefix\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside } from '../utils/hooks'\n\nexport type PhoneCountry = {\n code: string\n label: string\n flag: string\n}\n\nconst DEFAULT_COUNTRIES: PhoneCountry[] = [\n { code: '+1', label: 'US', flag: '\\u{1F1FA}\\u{1F1F8}' },\n { code: '+44', label: 'UK', flag: '\\u{1F1EC}\\u{1F1E7}' },\n { code: '+81', label: 'JP', flag: '\\u{1F1EF}\\u{1F1F5}' },\n { code: '+86', label: 'CN', flag: '\\u{1F1E8}\\u{1F1F3}' },\n { code: '+82', label: 'KR', flag: '\\u{1F1F0}\\u{1F1F7}' },\n]\n\nexport type PhoneInputProps = {\n value: string\n onChange: (value: string) => void\n defaultCountry?: string\n countries?: PhoneCountry[]\n disabled?: boolean\n error?: boolean\n placeholder?: string\n className?: string\n}\n\nexport const PhoneInput = forwardRef<HTMLDivElement, PhoneInputProps>(\n function PhoneInput(\n {\n value,\n onChange,\n defaultCountry = '+81',\n countries,\n disabled = false,\n error = false,\n placeholder = 'Phone number',\n className,\n },\n ref\n ) {\n const countryList = countries ?? DEFAULT_COUNTRIES\n const [selectedCode, setSelectedCode] = useState(defaultCountry)\n const [dropdownOpen, setDropdownOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n useClickOutside(dropdownRef, dropdownOpen, () => setDropdownOpen(false))\n\n const selectedCountry =\n countryList.find((c) => c.code === selectedCode) ?? countryList[0]\n\n const handleCountrySelect = useCallback((code: string) => {\n setSelectedCode(code)\n setDropdownOpen(false)\n }, [])\n\n const handleInputChange = useCallback(\n (raw: string) => {\n // strip non-digit chars except dashes\n const cleaned = raw.replace(/[^\\d-]/g, '')\n onChange(cleaned)\n },\n [onChange]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-h gds-radius-input relative inline-flex items-stretch border',\n error ? 'border-danger' : 'border-border',\n disabled && 'cursor-not-allowed opacity-40',\n className\n )}\n data-component=\"phone-input\"\n data-disabled={disabled ? '' : undefined}\n data-error={error ? '' : undefined}\n >\n {/* country code selector */}\n <div ref={dropdownRef} className=\"relative\">\n <button\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'border-border flex h-full items-center gap-1 border-r px-2 text-sm select-none',\n 'gds-radius-input rounded-r-none transition-colors hover:bg-white/5',\n focusCls\n )}\n onClick={() => setDropdownOpen((prev) => !prev)}\n aria-label=\"Select country code\"\n >\n <span>{selectedCountry?.flag}</span>\n <span className=\"text-fg-muted gds-text-body\">\n {selectedCountry?.code}\n </span>\n </button>\n\n {dropdownOpen && (\n <div className=\"animate-popup border-border bg-surface absolute top-full left-0 z-50 mt-1 min-w-[140px] rounded-lg border shadow-lg\">\n {countryList.map((c) => (\n <button\n key={c.code}\n type=\"button\"\n className={cx(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm transition-colors hover:bg-white/5',\n c.code === selectedCode && 'bg-accent/10 text-accent'\n )}\n onClick={() => handleCountrySelect(c.code)}\n >\n <span>{c.flag}</span>\n <span className=\"text-fg-muted\">{c.label}</span>\n <span className=\"text-fg-muted/60 ml-auto\">{c.code}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* phone number input */}\n <input\n type=\"tel\"\n value={value}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={cx(\n 'text-fg gds-text-body flex-1 bg-transparent px-3 focus:outline-none',\n focusCls\n )}\n aria-label=\"Phone number\"\n />\n </div>\n )\n }\n)\n","// pin-input — PIN/OTP code input with auto-focus progression\nimport type { ClipboardEvent, KeyboardEvent } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype PinInputProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n disabled?: boolean\n error?: boolean\n length?: number\n mask?: boolean\n numeric?: boolean\n onChange?: (value: string) => void\n onComplete?: (value: string) => void\n value?: string\n}\n\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(\n function PinInput(\n {\n className,\n disabled = false,\n error = false,\n length = 4,\n mask = false,\n numeric = false,\n onChange,\n onComplete,\n value,\n ...props\n },\n ref\n ) {\n const [internalValues, setInternalValues] = useState<string[]>(() =>\n Array.from({ length }, () => '')\n )\n const isControlled = value !== undefined\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const setInputRef = useCallback(\n (index: number) => (el: HTMLInputElement | null) => {\n inputRefs.current[index] = el\n },\n []\n )\n\n const focusInput = useCallback((index: number) => {\n const target = inputRefs.current[index]\n if (target !== null && target !== undefined) {\n target.focus()\n }\n }, [])\n\n const getDisplayValues = (): string[] => {\n if (isControlled) {\n return Array.from({ length }, (_, i) => value[i] ?? '')\n }\n return internalValues\n }\n\n const checkComplete = useCallback(\n (newValue: string, newValues?: string[]) => {\n if (onComplete !== undefined) {\n if (isControlled) {\n if (newValue.length === length) {\n onComplete(newValue)\n }\n } else if (\n newValues !== undefined &&\n newValues.every((v) => v !== '') &&\n newValues.join('').length === length\n ) {\n onComplete(newValues.join(''))\n }\n }\n },\n [isControlled, length, onComplete]\n )\n\n const handleInput = useCallback(\n (index: number, char: string) => {\n if (char.length !== 1) return\n if (numeric && !/^\\d$/.test(char)) return\n\n if (isControlled) {\n const chars = (value ?? '').split('')\n while (chars.length < index) {\n chars.push('')\n }\n chars[index] = char\n const next = chars.join('')\n if (onChange !== undefined) {\n onChange(next)\n }\n checkComplete(next)\n } else {\n const newValues = [...internalValues]\n newValues[index] = char\n setInternalValues(newValues)\n checkComplete('', newValues)\n }\n\n if (index < length - 1) {\n focusInput(index + 1)\n }\n },\n [\n value,\n length,\n numeric,\n isControlled,\n internalValues,\n onChange,\n checkComplete,\n focusInput,\n ]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault()\n if (isControlled) {\n const chars = (value ?? '').split('')\n if (chars[index] !== undefined && chars[index] !== '') {\n chars[index] = ''\n if (onChange !== undefined) {\n onChange(chars.join('').replace(/\\s+$/, ''))\n }\n } else if (index > 0) {\n chars.splice(index - 1, 1)\n if (onChange !== undefined) {\n onChange(chars.join(''))\n }\n focusInput(index - 1)\n }\n } else {\n const newValues = [...internalValues]\n if (newValues[index] !== '') {\n newValues[index] = ''\n setInternalValues(newValues)\n } else if (index > 0) {\n newValues[index - 1] = ''\n setInternalValues(newValues)\n focusInput(index - 1)\n }\n }\n }\n },\n [value, isControlled, internalValues, onChange, focusInput]\n )\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n let pasted = e.clipboardData.getData('text').slice(0, length)\n if (numeric) {\n pasted = pasted.replace(/\\D/g, '')\n }\n if (pasted.length === 0) return\n\n if (isControlled) {\n if (onChange !== undefined) {\n onChange(pasted)\n }\n checkComplete(pasted)\n } else {\n const newValues = Array.from({ length }, (_, i) => pasted[i] ?? '')\n setInternalValues(newValues)\n checkComplete('', newValues)\n }\n\n const nextIndex = Math.min(pasted.length, length - 1)\n focusInput(nextIndex)\n },\n [length, numeric, isControlled, onChange, checkComplete, focusInput]\n )\n\n const displayValues = getDisplayValues()\n\n return (\n <div\n className={cx('flex gap-2', error && 'animate-shake', className)}\n data-component=\"pin-input\"\n ref={ref}\n {...props}\n >\n {Array.from({ length }, (_, i) => (\n <input\n aria-label={`${numeric ? 'Digit' : 'Pin digit'} ${i + 1}`}\n autoComplete={numeric ? 'one-time-code' : undefined}\n className={cx(\n 'bg-bg text-fg h-10 w-10 rounded-md border text-center text-sm transition-colors outline-none',\n numeric && 'h-12 font-mono text-lg tabular-nums',\n error\n ? 'border-danger'\n : 'border-border hover:border-border-strong',\n focusCls,\n disabled && 'cursor-not-allowed opacity-50'\n )}\n disabled={disabled}\n inputMode={numeric ? 'numeric' : undefined}\n key={i}\n maxLength={1}\n onInput={(e) => {\n const target = e.target as HTMLInputElement\n const char = target.value\n if (char.length > 0) {\n handleInput(i, char[char.length - 1])\n }\n target.value = displayValues[i] ?? ''\n }}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n pattern={numeric ? '[0-9]*' : undefined}\n ref={setInputRef(i)}\n type={mask ? 'password' : 'text'}\n value={\n mask && displayValues[i] !== undefined && displayValues[i] !== ''\n ? '\\u2022'\n : (displayValues[i] ?? '')\n }\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { PinInputProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nconst placementClasses: Record<string, Record<string, string>> = {\n bottom: {\n center: 'top-full left-1/2 -translate-x-1/2 mt-2',\n end: 'top-full right-0 mt-2',\n start: 'top-full left-0 mt-2',\n },\n left: {\n center: 'right-full top-1/2 -translate-y-1/2 mr-2',\n end: 'right-full bottom-0 mr-2',\n start: 'right-full top-0 mr-2',\n },\n right: {\n center: 'left-full top-1/2 -translate-y-1/2 ml-2',\n end: 'left-full bottom-0 ml-2',\n start: 'left-full top-0 ml-2',\n },\n top: {\n center: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n end: 'bottom-full right-0 mb-2',\n start: 'bottom-full left-0 mb-2',\n },\n}\n\ntype PopoverProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> & {\n align?: 'center' | 'end' | 'start'\n content: ReactNode\n placement?: 'bottom' | 'left' | 'right' | 'top'\n trigger: ReactNode\n}\n\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(\n function Popover(\n {\n align = 'start',\n className,\n content,\n placement = 'bottom',\n trigger,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n className={cx('relative inline-flex', className)}\n data-component=\"popover\"\n data-state={open ? 'open' : 'closed'}\n ref={(node) => {\n ;(\n containerRef as React.MutableRefObject<HTMLDivElement | null>\n ).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n {...props}\n >\n <span\n onClick={() => setOpen((v) => !v)}\n onKeyDown={(e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n setOpen((v) => !v)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {trigger}\n </span>\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y gds-shadow-lg absolute z-50 border',\n placementClasses[placement]?.[align]\n )}\n >\n {content}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { PopoverProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype QuickStatProps = React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode\n label: string\n trend?: number\n value: string | number\n}\n\nexport const QuickStat = forwardRef<HTMLDivElement, QuickStatProps>(\n function QuickStat({ className, icon, label, trend, value, ...props }, ref) {\n const trendColor =\n trend !== undefined && trend > 0\n ? 'text-success'\n : trend !== undefined && trend < 0\n ? 'text-danger'\n : 'text-fg-muted'\n\n return (\n <div\n className={cx('inline-flex items-center gap-3 select-none', className)}\n data-component=\"quick-stat\"\n ref={ref}\n {...props}\n >\n {icon !== undefined && <div className=\"text-fg-muted\">{icon}</div>}\n <div className=\"flex flex-col\">\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-fg text-lg leading-tight font-semibold\">\n {value}\n </span>\n {trend !== undefined && (\n <span className={cx('text-xs font-medium', trendColor)}>\n {trend > 0 ? '+' : ''}\n {trend}%\n </span>\n )}\n </div>\n <span className=\"text-fg-muted text-xs leading-tight\">{label}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { QuickStatProps }\n","// radio-card — card-style radio group where each option is a selectable card\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype RadioCardOption = {\n value: string\n label: string\n description?: string\n icon?: ReactNode\n}\n\nexport type RadioCardProps = {\n options: RadioCardOption[]\n value: string | null\n onChange: (value: string) => void\n columns?: 1 | 2 | 3\n disabled?: boolean\n glass?: boolean\n className?: string\n}\n\nconst columnMap: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n}\n\nexport const RadioCard = forwardRef<HTMLDivElement, RadioCardProps>(\n function RadioCard(\n { options, value, onChange, columns = 1, disabled, glass, className },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap grid', columnMap[columns], className)}\n data-component=\"radio-card\"\n role=\"radiogroup\"\n >\n {options.map((option) => {\n const selected = value === option.value\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={disabled}\n onClick={() => {\n if (disabled !== true) {\n onChange(option.value)\n }\n }}\n className={cx(\n 'gds-gap gds-radius-card gds-pad-x gds-pad-y flex items-center text-left transition-colors',\n 'cursor-pointer select-none',\n glass === true\n ? cx(glassClass(glass), 'border border-white/10')\n : selected\n ? 'border-accent bg-accent/5 ring-accent border ring-1'\n : 'border-border hover:border-border-strong border',\n disabled === true && 'pointer-events-none opacity-50'\n )}\n data-state={selected ? 'selected' : 'idle'}\n >\n {/* radio dot */}\n <span\n className={cx(\n 'flex h-4 w-4 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n selected ? 'border-accent bg-accent' : 'border-border-strong'\n )}\n >\n {selected && (\n <span className=\"bg-fg h-1.5 w-1.5 rounded-full\" />\n )}\n </span>\n\n {/* icon */}\n {option.icon !== undefined && (\n <span className=\"text-fg-muted shrink-0\">{option.icon}</span>\n )}\n\n {/* label + description */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-fg text-sm font-medium\">\n {option.label}\n </div>\n {option.description !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-xs\">\n {option.description}\n </div>\n )}\n </div>\n </button>\n )\n })}\n </div>\n )\n }\n)\n","// reveal — slide-in reveal animation wrapper\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type RevealProps = {\n active: boolean\n children: ReactNode\n className?: string\n direction?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nconst translateMap: Record<NonNullable<RevealProps['direction']>, string> = {\n top: 'translate-y-[-20px]',\n bottom: 'translate-y-[20px]',\n left: 'translate-x-[-20px]',\n right: 'translate-x-[20px]',\n}\n\nexport const Reveal = forwardRef<HTMLDivElement, RevealProps>(function Reveal(\n { active, children, className, direction = 'bottom' },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'transition-all duration-300 ease-out',\n active\n ? 'translate-x-0 translate-y-0 opacity-100'\n : cx('opacity-0', translateMap[direction]),\n className\n )}\n data-component=\"reveal\"\n data-state={active ? 'visible' : 'hidden'}\n >\n {children}\n </div>\n )\n})\n","// scoreboard — score display with progress bar\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ScoreboardProps = {\n className?: string\n label: string\n max?: number\n score: number\n}\n\nexport const Scoreboard = forwardRef<HTMLDivElement, ScoreboardProps>(\n function Scoreboard({ className, label, max = 100, score }, ref) {\n const pct = useMemo(() => {\n if (max <= 0) return 0\n return Math.min(100, Math.max(0, (score / max) * 100))\n }, [score, max])\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"scoreboard\"\n >\n <div className=\"flex items-baseline justify-between\">\n <span className=\"gds-text text-fg-muted\">{label}</span>\n <span className=\"text-fg text-lg font-bold tabular-nums\">\n {score}\n <span className=\"text-fg-muted text-sm font-normal\">/{max}</span>\n </span>\n </div>\n <div className=\"bg-bg-tertiary h-2 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-accent h-full rounded-full transition-all duration-300\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Input } from '../l2-primitives/input'\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\n\ntype SearchInputProps = {\n className?: string\n clearable?: boolean\n disabled?: boolean\n inputSize?: 'default' | 'sm'\n loading?: boolean\n onChange: (value: string) => void\n onSearch?: (value: string) => void\n placeholder?: string\n value: string\n}\n\nconst searchSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n)\n\nconst clearSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n)\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n function SearchInput(\n {\n className,\n clearable = true,\n disabled = false,\n inputSize,\n loading = false,\n onChange,\n onSearch,\n placeholder = 'Search...',\n value,\n },\n ref\n ) {\n const leftIcon = loading ? <Spinner size=\"sm\" /> : searchSvg\n\n const showClear = clearable && value.length > 0\n const rightIcon = showClear ? (\n <button\n aria-label=\"Clear search\"\n className=\"text-fg-muted/50 hover:text-fg-muted cursor-pointer\"\n onClick={() => onChange('')}\n tabIndex={-1}\n type=\"button\"\n >\n {clearSvg}\n </button>\n ) : undefined\n\n return (\n <Input\n className={cx(className)}\n data-component=\"search-input\"\n disabled={disabled}\n icon={leftIcon}\n inputSize={inputSize}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && onSearch !== undefined) {\n onSearch(value)\n }\n }}\n placeholder={placeholder}\n ref={ref}\n rightIcon={rightIcon}\n type=\"search\"\n value={value}\n />\n )\n }\n)\n\nexport type { SearchInputProps }\n","// select — styled native select with chevron overlay\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nexport const selectVariants = cva(\n cx(\n 'w-full appearance-none gds-radius-popover border bg-transparent pr-8 text-fg transition-colors',\n 'placeholder:text-fg-muted',\n focusCls\n ),\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n variants: {\n error: {\n true: 'border-danger text-danger',\n false: 'border-border hover:border-fg-muted',\n },\n inputSize: {\n default: 'gds-h-lg gds-pad-x text-sm',\n sm: 'gds-h-sm gds-pad-x-sm gds-text-body',\n },\n },\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n }\n)\n\nexport type SelectProps = Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n 'size'\n> &\n VariantProps<typeof selectVariants> & {\n glass?: boolean\n className?: string\n }\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n function Select(\n { error, inputSize, glass, className, children, ...props },\n ref\n ) {\n return (\n <div className=\"relative\" data-component=\"select\">\n <select\n ref={ref}\n className={cx(\n selectVariants({ error, inputSize }),\n glassClass(glass),\n className\n )}\n {...props}\n >\n {children}\n </select>\n <span className=\"text-fg-muted pointer-events-none absolute top-1/2 right-2 -translate-y-1/2\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n </span>\n </div>\n )\n }\n)\n","// slider-field — label + range slider + value display\nimport { forwardRef } from 'react'\n\nimport { RangeSlider } from '../l3-atoms/range-slider'\nimport { cx } from '../utils/cx'\n\ntype SliderFieldProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n label: string\n value: number\n onChange: (v: number) => void\n min?: number\n max?: number\n step?: number\n unit?: string\n}\n\nconst SliderField = forwardRef<HTMLDivElement, SliderFieldProps>(\n function SliderField(\n {\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n unit,\n className,\n ...props\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-1.5', className)}\n data-component=\"slider-field\"\n {...props}\n >\n <div className=\"flex items-center justify-between\">\n <label className=\"gds-text-body text-fg-muted select-none\">\n {label}\n </label>\n <span className=\"gds-text-body text-fg tabular-nums\">\n {value}\n {unit !== undefined ? ` ${unit}` : ''}\n </span>\n </div>\n <RangeSlider\n value={value}\n onChange={onChange}\n min={min}\n max={max}\n step={step}\n />\n </div>\n )\n }\n)\n\nexport { SliderField }\nexport type { SliderFieldProps }\n","// sortable-header — table column header with sort direction indicator\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype SortDirection = 'asc' | 'desc' | null\n\nexport type SortableHeaderProps = {\n label: string\n direction: SortDirection\n onSort: () => void\n className?: string\n}\n\nexport const SortableHeader = forwardRef<\n HTMLTableCellElement,\n SortableHeaderProps\n>(function SortableHeader({ label, direction, onSort, className }, ref) {\n const active = direction !== null\n\n return (\n <th\n ref={ref}\n className={cx(\n 'px-3 py-2 text-left text-xs font-medium transition-colors select-none',\n focusCls,\n active ? 'text-accent' : 'text-fg-muted',\n 'hover:text-accent cursor-pointer',\n className\n )}\n data-component=\"sortable-header\"\n data-state={direction ?? 'none'}\n onClick={onSort}\n role=\"columnheader\"\n tabIndex={0}\n >\n <span className=\"inline-flex items-center gap-1\">\n {label}\n {direction === 'asc' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 12V4M4.5 7.5L8 4l3.5 3.5\" />\n </svg>\n )}\n {direction === 'desc' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 4v8M4.5 8.5L8 12l3.5-3.5\" />\n </svg>\n )}\n </span>\n </th>\n )\n})\n\nexport type { SortDirection }\n","// split-button — primary action + dropdown menu trigger\nimport type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype SplitButtonVariant = 'danger' | 'primary' | 'secondary'\ntype SplitButtonSize = 'default' | 'lg' | 'sm'\n\ntype SplitButtonItem = {\n id: string\n label: string\n danger?: boolean\n}\n\ntype SplitButtonProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onClick'\n> & {\n children: ReactNode\n variant?: SplitButtonVariant\n size?: SplitButtonSize\n items: SplitButtonItem[]\n onSelect: (id: string) => void\n onClick?: () => void\n disabled?: boolean\n}\n\nconst variantClasses: Record<SplitButtonVariant, string> = {\n primary: 'bg-accent text-accent-fg hover:bg-accent/90',\n secondary:\n 'bg-bg-secondary text-fg border border-border hover:bg-bg-tertiary',\n danger: 'bg-danger text-white hover:bg-danger/90',\n}\n\nconst dividerClasses: Record<SplitButtonVariant, string> = {\n primary: 'border-l-white/20',\n secondary: 'border-l-border',\n danger: 'border-l-white/20',\n}\n\nconst sizeClasses: Record<SplitButtonSize, { main: string; trigger: string }> =\n {\n sm: { main: 'px-2.5 py-1 text-xs', trigger: 'px-1.5 py-1' },\n default: { main: 'px-3 py-1.5 text-sm', trigger: 'px-2 py-1.5' },\n lg: { main: 'px-4 py-2 text-sm', trigger: 'px-2.5 py-2' },\n }\n\nconst SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n function SplitButton(\n {\n children,\n variant = 'primary',\n size = 'default',\n items,\n onSelect,\n onClick,\n disabled,\n className,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n const v = variant ?? 'primary'\n const s = size ?? 'default'\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={cx('relative inline-flex', className)}\n data-component=\"split-button\"\n data-variant={v}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n <div className=\"inline-flex\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cx(\n 'inline-flex items-center rounded-l-md font-medium transition-colors select-none',\n variantClasses[v],\n sizeClasses[s].main,\n focusCls,\n disabled === true && 'pointer-events-none opacity-50'\n )}\n >\n {children}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setOpen((prev) => !prev)}\n aria-label=\"More actions\"\n className={cx(\n 'inline-flex items-center rounded-r-md border-l font-medium transition-colors select-none',\n variantClasses[v],\n dividerClasses[v],\n sizeClasses[s].trigger,\n focusCls,\n disabled === true && 'pointer-events-none opacity-50'\n )}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 5l3 3 3-3\" />\n </svg>\n </button>\n </div>\n\n {open && (\n <div className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg absolute top-full left-0 z-50 mt-1 min-w-[160px] border py-1\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center transition-colors',\n focusCls,\n item.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport { SplitButton }\nexport type {\n SplitButtonItem,\n SplitButtonProps,\n SplitButtonSize,\n SplitButtonVariant,\n}\n","// stacked-progress — multi-segment horizontal progress bar with optional labels\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StackedSegment = {\n label: string\n value: number\n color?: string\n}\n\nexport type StackedProgressProps = {\n segments: StackedSegment[]\n showLabels?: boolean\n className?: string\n}\n\nconst defaultColors = [\n 'var(--color-accent)',\n 'var(--color-success)',\n 'var(--color-warning)',\n 'var(--color-danger)',\n 'var(--color-fg-muted)',\n]\n\nexport const StackedProgress = forwardRef<HTMLDivElement, StackedProgressProps>(\n function StackedProgress({ segments, showLabels = true, className }, ref) {\n const total = segments.reduce((sum, s) => sum + s.value, 0)\n\n return (\n <div\n ref={ref}\n className={cx('select-none', className)}\n data-component=\"stacked-progress\"\n >\n <div className=\"bg-fg-muted/10 flex h-3 overflow-hidden rounded-full\">\n {segments.map((seg, i) => {\n const pct = total > 0 ? (seg.value / total) * 100 : 0\n if (pct <= 0) return null\n const color = seg.color ?? defaultColors[i % defaultColors.length]\n\n return (\n <div\n key={`${seg.label}-${i}`}\n className=\"transition-all duration-300\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n )\n })}\n </div>\n {showLabels && (\n <div className=\"mt-2 flex flex-wrap gap-3\">\n {segments.map((seg, i) => {\n const pct = total > 0 ? (seg.value / total) * 100 : 0\n const color = seg.color ?? defaultColors[i % defaultColors.length]\n\n return (\n <div\n key={`${seg.label}-${i}`}\n className=\"gds-text-body text-fg-muted flex items-center gap-1.5\"\n >\n <div\n className=\"h-2 w-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n <span>{seg.label}</span>\n <span className=\"text-fg font-medium\">{pct.toFixed(1)}%</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StatSide = { label: string; value: number | string }\n\ntype StatComparisonProps = React.HTMLAttributes<HTMLDivElement> & {\n highlight?: 'left' | 'none' | 'right'\n left: StatSide\n right: StatSide\n}\n\nexport const StatComparison = forwardRef<HTMLDivElement, StatComparisonProps>(\n function StatComparison(\n { className, highlight = 'none', left, right, ...props },\n ref\n ) {\n const sideCls = (side: 'left' | 'right') =>\n cx(\n 'flex flex-1 flex-col items-center rounded-lg border border-border p-3',\n highlight === side && 'border-accent bg-accent/5'\n )\n\n return (\n <div\n className={cx('gds-gap flex items-center', className)}\n data-component=\"stat-comparison\"\n ref={ref}\n {...props}\n >\n <div className={sideCls('left')}>\n <span className=\"gds-text-label text-fg-muted\">{left.label}</span>\n <span className=\"text-fg text-lg font-semibold\">{left.value}</span>\n </div>\n <span className=\"text-fg-muted shrink-0 text-xs font-medium\">vs</span>\n <div className={sideCls('right')}>\n <span className=\"gds-text-label text-fg-muted\">{right.label}</span>\n <span className=\"text-fg text-lg font-semibold\">{right.value}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { StatComparisonProps }\n","// stat-trend — stat card with value, label, trend, and optional sparkline\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StatTrendProps = {\n className?: string\n label: string\n trend: number\n trendData?: number[]\n value: number | string\n}\n\nfunction Sparkline({\n data,\n className,\n}: {\n className?: string\n data: number[]\n}) {\n if (data.length < 2) return null\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const w = 60\n const h = 20\n const step = w / (data.length - 1)\n\n const points = data\n .map((v, i) => `${i * step},${h - ((v - min) / range) * h}`)\n .join(' ')\n\n return (\n <svg width={w} height={h} className={className} viewBox={`0 0 ${w} ${h}`}>\n <polyline\n points={points}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const StatTrend = forwardRef<HTMLDivElement, StatTrendProps>(\n function StatTrend({ className, label, trend, trendData, value }, ref) {\n const isPositive = trend >= 0\n\n const trendIcon = useMemo(() => {\n if (isPositive) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 8l4-4 4 4\" />\n </svg>\n )\n }\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 4l4 4 4-4\" />\n </svg>\n )\n }, [isPositive])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap-sm gds-pad gds-radius border-border bg-surface flex flex-col border',\n className\n )}\n data-component=\"stat-trend\"\n >\n <span className=\"text-fg-muted text-xs\">{label}</span>\n <div className=\"gds-gap flex items-end justify-between\">\n <span className=\"text-fg text-2xl font-bold tabular-nums\">\n {value}\n </span>\n {trendData !== undefined && trendData.length >= 2 && (\n <Sparkline\n data={trendData}\n className={isPositive ? 'text-success' : 'text-danger'}\n />\n )}\n </div>\n <div\n className={cx(\n 'gds-gap-sm flex items-center text-xs font-medium',\n isPositive ? 'text-success' : 'text-danger'\n )}\n >\n {trendIcon}\n <span>\n {isPositive ? '+' : ''}\n {trend}%\n </span>\n </div>\n </div>\n )\n }\n)\n","// status-bar-component — application status bar\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StatusBarComponentProps = {\n items: ReactNode[]\n className?: string\n}\n\nexport const StatusBarComponent = forwardRef<\n HTMLDivElement,\n StatusBarComponentProps\n>(function StatusBarComponent({ items, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-surface text-fg-muted flex h-7 items-center border-t px-3 text-xs select-none',\n className\n )}\n data-component=\"status-bar\"\n >\n {items.map((item, i) => (\n <div key={i} className=\"flex items-center\">\n {i > 0 && <span className=\"bg-border mx-2 h-3 w-px\" />}\n <span>{item}</span>\n </div>\n ))}\n </div>\n )\n})\n","// tabs — horizontal tab bar with active indicator and optional counts\nimport { cva } from 'class-variance-authority'\nimport type { KeyboardEvent } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nexport type TabItem = {\n id: string\n label: string\n count?: number\n}\n\nexport const tabVariants = cva(\n cx('relative inline-flex items-center transition-colors', focusCls),\n {\n variants: {\n size: {\n default: 'gds-pad-x gds-pad-y text-sm',\n sm: 'gds-pad-x-sm gds-pad-y-sm gds-text-body',\n },\n active: {\n true: '',\n false: '',\n },\n variant: {\n default: 'border-b-2',\n pills: 'gds-radius px-3 py-1.5',\n underline: 'border-b',\n },\n },\n compoundVariants: [\n { variant: 'default', active: true, class: 'border-accent text-accent' },\n {\n variant: 'default',\n active: false,\n class: 'border-transparent text-fg-muted hover:text-fg',\n },\n { variant: 'pills', active: true, class: 'bg-accent text-accent-fg' },\n {\n variant: 'pills',\n active: false,\n class: 'text-fg-muted hover:bg-fg-muted/10 hover:text-fg',\n },\n {\n variant: 'underline',\n active: true,\n class: 'border-accent text-accent',\n },\n {\n variant: 'underline',\n active: false,\n class: 'border-transparent text-fg-muted hover:text-fg',\n },\n ],\n defaultVariants: {\n size: 'default',\n active: false,\n variant: 'default',\n },\n }\n)\n\nexport type TabsProps = {\n tabs: TabItem[]\n active: string\n onChange: (id: string) => void\n glass?: boolean\n size?: VariantProps<typeof tabVariants>['size']\n variant?: VariantProps<typeof tabVariants>['variant']\n scrollable?: boolean\n className?: string\n}\n\nexport function Tabs({\n tabs,\n active,\n onChange,\n glass,\n size = 'default',\n variant = 'default',\n scrollable = true,\n className,\n}: TabsProps) {\n const isPills = variant === 'pills'\n\n function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n if (\n e.key !== 'ArrowLeft' &&\n e.key !== 'ArrowRight' &&\n e.key !== 'Home' &&\n e.key !== 'End'\n ) {\n return\n }\n e.preventDefault()\n const currentIndex = tabs.findIndex((t) => t.id === active)\n if (currentIndex < 0) return\n\n let nextIndex = currentIndex\n if (e.key === 'ArrowRight') {\n nextIndex = (currentIndex + 1) % tabs.length\n } else if (e.key === 'ArrowLeft') {\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else if (e.key === 'Home') {\n nextIndex = 0\n } else if (e.key === 'End') {\n nextIndex = tabs.length - 1\n }\n\n onChange(tabs[nextIndex].id)\n const tablist = e.currentTarget\n const buttons = tablist.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')\n buttons[nextIndex]?.focus()\n }\n\n return (\n <div\n className={cx(\n 'flex',\n !isPills && 'border-border border-b',\n isPills && 'gap-1.5',\n scrollable && 'scrollbar-hide overflow-x-auto',\n glass\n ? cx('bg-bg/60 rounded-t-lg border-white/10', glassClass(glass))\n : '',\n className\n )}\n data-component=\"tabs\"\n role=\"tablist\"\n onKeyDown={handleKeyDown}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === active\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n tabIndex={isActive ? 0 : -1}\n aria-selected={isActive}\n onClick={() => onChange(tab.id)}\n className={tabVariants({ size, active: isActive, variant })}\n >\n {tab.label}\n {tab.count !== undefined && (\n <span className=\"gds-radius-badge bg-fg-muted/10 gds-text-caption ml-1.5 px-1.5\">\n {tab.count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","// tab-group — tabs with content panels in one composed component\nimport type { ReactNode } from 'react'\nimport { useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { Tabs } from './tabs'\n\nexport type TabGroupTab = {\n id: string\n label: string\n content: ReactNode\n disabled?: boolean\n}\n\nexport type TabGroupProps = {\n tabs: TabGroupTab[]\n defaultTab?: string\n lazy?: boolean\n keepMounted?: boolean\n activeTab?: string\n onTabChange?: (tabId: string) => void\n glass?: boolean\n className?: string\n}\n\nexport function TabGroup({\n tabs,\n defaultTab,\n lazy = false,\n keepMounted = true,\n activeTab: controlledTab,\n onTabChange,\n glass,\n className,\n}: TabGroupProps) {\n const isControlled = controlledTab !== undefined && onTabChange !== undefined\n const initialTab = defaultTab ?? (tabs.length > 0 ? tabs[0].id : '')\n const [internalTab, setInternalTab] = useState(initialTab)\n const currentTab = isControlled ? controlledTab : internalTab\n const renderedTabsRef = useRef<Set<string>>(new Set([currentTab]))\n\n if (lazy && keepMounted) {\n renderedTabsRef.current.add(currentTab)\n }\n\n const tabItems = tabs.map((t) => ({\n id: t.id,\n label: t.label,\n }))\n\n const handleChange = (id: string) => {\n const tab = tabs.find((t) => t.id === id)\n if (tab !== undefined && tab.disabled !== true) {\n if (isControlled) {\n onTabChange(id)\n } else {\n setInternalTab(id)\n }\n }\n }\n\n const renderContent = () => {\n if (lazy && keepMounted) {\n const rendered = renderedTabsRef.current\n return tabs\n .filter((t) => rendered.has(t.id))\n .map((t) => (\n <div\n key={t.id}\n role=\"tabpanel\"\n hidden={t.id !== currentTab}\n className=\"gds-pad\"\n >\n {t.content}\n </div>\n ))\n }\n\n const activeContent = tabs.find((t) => t.id === currentTab)\n if (activeContent === undefined) {\n return null\n }\n return (\n <div role=\"tabpanel\" className=\"gds-pad\">\n {activeContent.content}\n </div>\n )\n }\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-card border-border overflow-hidden border',\n glass !== undefined && glass !== false\n ? cx('bg-bg/60 border-white/10', glassClass(glass))\n : '',\n className\n )}\n data-component=\"tab-group\"\n >\n <Tabs\n tabs={tabItems}\n active={currentTab}\n onChange={handleChange}\n size=\"sm\"\n />\n {renderContent()}\n </div>\n )\n}\n","import { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype TagInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'onChange' | 'value'\n> & {\n disabled?: boolean\n error?: boolean\n glass?: boolean\n maxTags?: number\n onChange: (tags: string[]) => void\n value: string[]\n}\n\n// inline X icon for tag remove button\nfunction RemoveIcon() {\n return (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const TagInput = forwardRef<HTMLInputElement, TagInputProps>(\n function TagInput(\n {\n className,\n disabled = false,\n error = false,\n glass,\n maxTags,\n onChange,\n placeholder,\n value,\n ...props\n },\n ref\n ) {\n const [inputValue, setInputValue] = useState('')\n const [focused, setFocused] = useState(false)\n const innerRef = useRef<HTMLInputElement>(null)\n const inputRef = (ref ?? innerRef) as React.RefObject<HTMLInputElement>\n\n const atLimit = maxTags !== undefined && value.length >= maxTags\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmed = tag.trim()\n if (trimmed === '') return\n if (value.includes(trimmed)) return\n if (atLimit) return\n onChange([...value, trimmed])\n setInputValue('')\n },\n [atLimit, onChange, value]\n )\n\n const removeTag = useCallback(\n (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n },\n [onChange, value]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(inputValue)\n }\n if (e.key === 'Backspace' && inputValue === '' && value.length > 0) {\n removeTag(value.length - 1)\n }\n },\n [addTag, inputValue, removeTag, value.length]\n )\n\n const handleContainerClick = useCallback(() => {\n if (!disabled) {\n inputRef.current?.focus()\n }\n }, [disabled, inputRef])\n\n return (\n <div\n className={cx(\n 'gds-gap-xs gds-pad-x gds-pad-y-sm gds-radius-input bg-bg flex min-h-[var(--gds-h)] flex-wrap items-center border transition-colors',\n !error && !focused && 'border-border hover:border-border-strong',\n !error &&\n focused &&\n 'border-accent ring-accent ring-offset-bg ring-2 ring-offset-1',\n error && 'border-danger',\n error && focused && 'ring-danger ring-offset-bg ring-2 ring-offset-1',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"tag-input\"\n data-state={focused ? 'focused' : 'idle'}\n onClick={handleContainerClick}\n >\n {value.map((tag, index) => (\n <span\n className=\"gds-gap-xs gds-radius-badge gds-pad-x-sm gds-pad-y-sm gds-text-label bg-fg-muted/10 text-fg-muted inline-flex items-center font-medium select-none\"\n key={tag}\n >\n {tag}\n {!disabled && (\n <button\n className={cx(\n 'gds-radius-badge ml-0.5 p-0.5 transition-colors hover:bg-current/10',\n focusCls\n )}\n onClick={(e) => {\n e.stopPropagation()\n removeTag(index)\n }}\n tabIndex={-1}\n type=\"button\"\n >\n <RemoveIcon />\n </button>\n )}\n </span>\n ))}\n {!atLimit && (\n <input\n className=\"text-fg gds-text-body placeholder:text-fg-muted/50 min-w-[60px] flex-1 border-none bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n onBlur={() => setFocused(false)}\n onChange={(e) => setInputValue(e.target.value)}\n onFocus={() => setFocused(true)}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : undefined}\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n {...props}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { TagInputProps }\n","// text-reveal — text that reveals character-by-character or word-by-word\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TextRevealProps = {\n by?: 'character' | 'word'\n className?: string\n staggerDelay?: number\n text: string\n}\n\nexport const TextReveal = forwardRef<HTMLSpanElement, TextRevealProps>(\n function TextReveal(\n { by = 'word', className, staggerDelay = 50, text },\n ref\n ) {\n const parts = useMemo(() => {\n if (by === 'character') return text.split('')\n return text.split(' ')\n }, [by, text])\n\n return (\n <span\n ref={ref}\n className={cx('inline', className)}\n data-component=\"text-reveal\"\n aria-label={text}\n >\n {parts.map((part, i) => (\n <span\n key={`${i}-${part}`}\n className=\"animate-fadeIn inline-block opacity-0\"\n style={{\n animationDelay: `${i * staggerDelay}ms`,\n animationFillMode: 'forwards',\n }}\n aria-hidden\n >\n {part}\n {by === 'word' && i < parts.length - 1 ? '\\u00A0' : ''}\n </span>\n ))}\n </span>\n )\n }\n)\n","// text-scramble — text that scrambles through random characters before revealing\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TextScrambleProps = {\n characters?: string\n className?: string\n speed?: number\n text: string\n}\n\nexport const TextScramble = forwardRef<HTMLSpanElement, TextScrambleProps>(\n function TextScramble(\n {\n characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%',\n className,\n speed = 50,\n text,\n },\n ref\n ) {\n const [display, setDisplay] = useState(text)\n const frameRef = useRef(0)\n\n useEffect(() => {\n let iteration = 0\n const target = text\n\n const interval = setInterval(() => {\n setDisplay(\n target\n .split('')\n .map((char, i) => {\n if (i < iteration) return target[i]\n return characters[Math.floor(Math.random() * characters.length)]\n })\n .join('')\n )\n\n iteration += 1 / 3\n if (iteration >= target.length) {\n clearInterval(interval)\n setDisplay(target)\n }\n }, speed)\n\n return () => clearInterval(interval)\n }, [text, characters, speed])\n\n // cleanup on unmount\n useEffect(() => {\n const frame = frameRef\n return () => cancelAnimationFrame(frame.current)\n }, [])\n\n return (\n <span\n ref={ref}\n className={cx('text-fg inline-block font-mono', className)}\n data-component=\"text-scramble\"\n aria-label={text}\n >\n {display}\n </span>\n )\n }\n)\n","// tilt-card — mouse-tracking 3D tilt effect card\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TiltCardProps = {\n children: ReactNode\n className?: string\n glare?: boolean\n maxTilt?: number\n}\n\nexport const TiltCard = forwardRef<HTMLDivElement, TiltCardProps>(\n function TiltCard({ children, className, glare, maxTilt = 15 }, ref) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [transform, setTransform] = useState(\n 'perspective(800px) rotateX(0deg) rotateY(0deg)'\n )\n const [glareStyle, setGlareStyle] = useState<React.CSSProperties>({})\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const el = innerRef.current\n if (el === null) return\n\n const rect = el.getBoundingClientRect()\n const x = (e.clientX - rect.left) / rect.width\n const y = (e.clientY - rect.top) / rect.height\n const rotateX = (0.5 - y) * maxTilt * 2\n const rotateY = (x - 0.5) * maxTilt * 2\n\n setTransform(\n `perspective(800px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`\n )\n\n if (glare === true) {\n setGlareStyle({\n background: `radial-gradient(circle at ${x * 100}% ${y * 100}%, rgba(255,255,255,0.15), transparent 60%)`,\n })\n }\n },\n [maxTilt, glare]\n )\n\n const handleMouseLeave = useCallback(() => {\n setTransform('perspective(800px) rotateX(0deg) rotateY(0deg)')\n setGlareStyle({})\n }, [])\n\n return (\n <div\n ref={(node) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n className={cx(\n 'relative overflow-hidden transition-transform duration-150 ease-out',\n className\n )}\n style={{ transform }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n data-component=\"tilt-card\"\n >\n {children}\n {glare === true && (\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={glareStyle}\n />\n )}\n </div>\n )\n }\n)\n","// time-picker-grid — hour/minute scrollable columns dropdown (internal)\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype TimePickerGridProps = {\n glass?: boolean\n hours: number[]\n minutes: number[]\n onHourClick: (hour: number) => void\n onMinuteClick: (minute: number) => void\n selectedHour: number | null\n selectedMinute: number | null\n}\n\nfunction pad(n: number): string {\n if (n < 10) return `0${n}`\n return `${n}`\n}\n\nfunction TimePickerGrid({\n glass,\n hours,\n minutes,\n onHourClick,\n onMinuteClick,\n selectedHour,\n selectedMinute,\n}: TimePickerGridProps) {\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 flex border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div\n className=\"border-border flex-1 overflow-y-auto border-r\"\n style={{ maxHeight: 200 }}\n >\n <div className=\"text-fg-muted/50 px-2 py-1 text-[10px] font-medium tracking-wider uppercase\">\n Hour\n </div>\n {hours.map((h) => (\n <button\n className={cx(\n 'flex w-full items-center justify-center py-1.5 text-sm transition-colors',\n h === selectedHour\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n key={h}\n onClick={() => onHourClick(h)}\n type=\"button\"\n >\n {pad(h)}\n </button>\n ))}\n </div>\n <div className=\"flex-1 overflow-y-auto\" style={{ maxHeight: 200 }}>\n <div className=\"text-fg-muted/50 px-2 py-1 text-[10px] font-medium tracking-wider uppercase\">\n Min\n </div>\n {minutes.map((m) => (\n <button\n className={cx(\n 'flex w-full items-center justify-center py-1.5 text-sm transition-colors',\n m === selectedMinute\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n key={m}\n onClick={() => onMinuteClick(m)}\n type=\"button\"\n >\n {pad(m)}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\nexport { pad, TimePickerGrid }\nexport type { TimePickerGridProps }\n","// time-picker — hour:minute selector with scrollable columns\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport { pad, TimePickerGrid } from './time-picker-grid'\n\ntype TimePickerProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n minuteStep?: number\n onChange: (value: string | null) => void\n placeholder?: string\n value: string | null\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n function TimePicker(\n {\n className,\n disabled = false,\n error = false,\n glass,\n minuteStep = 15,\n onChange,\n placeholder = 'Select time',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n const hours = useMemo(() => Array.from({ length: 24 }, (_, i) => i), [])\n const minutes = useMemo(() => {\n const step = Math.max(1, Math.min(60, minuteStep))\n const result: number[] = []\n let m = 0\n while (m < 60) {\n result.push(m)\n m += step\n }\n return result\n }, [minuteStep])\n\n const selectedHour = useMemo(() => {\n if (value === null) return null\n const parts = value.split(':')\n return parseInt(parts[0], 10)\n }, [value])\n\n const selectedMinute = useMemo(() => {\n if (value === null) return null\n const parts = value.split(':')\n return parseInt(parts[1], 10)\n }, [value])\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n }, [])\n\n const handleHourClick = useCallback(\n (hour: number) => {\n const minute = selectedMinute ?? 0\n onChange(`${pad(hour)}:${pad(minute)}`)\n },\n [selectedMinute, onChange]\n )\n\n const handleMinuteClick = useCallback(\n (minute: number) => {\n const hour = selectedHour ?? 0\n onChange(`${pad(hour)}:${pad(minute)}`)\n },\n [selectedHour, onChange]\n )\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"time-picker\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span className={cx(value !== null ? 'text-fg' : 'text-fg-muted')}>\n {value ?? placeholder}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <TimePickerGrid\n glass={glass}\n hours={hours}\n minutes={minutes}\n onHourClick={handleHourClick}\n onMinuteClick={handleMinuteClick}\n selectedHour={selectedHour}\n selectedMinute={selectedMinute}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { TimePickerProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TimelineEntryVariant = 'danger' | 'default' | 'success' | 'warning'\n\ntype TimelineEntryProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n icon?: ReactNode\n last?: boolean\n variant?: TimelineEntryVariant\n}\n\nconst dotColor: Record<TimelineEntryVariant, string> = {\n default: 'bg-fg-muted/40',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n}\n\nexport const TimelineEntry = forwardRef<HTMLDivElement, TimelineEntryProps>(\n function TimelineEntry(\n { children, className, icon, last = false, variant = 'default', ...props },\n ref\n ) {\n return (\n <div\n className={cx('relative flex gap-3', className)}\n data-component=\"timeline-entry\"\n ref={ref}\n {...props}\n >\n <div className=\"flex flex-col items-center\">\n {icon !== undefined ? (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : (\n <span\n className={cx(\n 'mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full',\n dotColor[variant]\n )}\n />\n )}\n {!last && <span className=\"bg-border mt-1 w-px flex-1\" />}\n </div>\n <div className=\"flex-1 pb-4\">{children}</div>\n </div>\n )\n }\n)\n\nexport type { TimelineEntryProps, TimelineEntryVariant }\n","// toast-store — global imperative toast state management\n// provides a Sonner-compatible API: toast.success('msg'), toast.error('msg'), etc.\n// decoupled from React — store is a plain JS module, React reads via useSyncExternalStore\n\nimport type { ToastVariant } from './toast'\n\nexport type ToastOptions = {\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n description?: string\n dismissible?: boolean\n}\n\nexport type ToastItem = {\n id: string\n title: string\n variant: ToastVariant\n description?: string\n duration: number\n dismissible: boolean\n action?: {\n label: string\n onClick: () => void\n }\n createdAt: number\n}\n\n// ---- store ----\n\nlet items: ToastItem[] = []\nlet nextId = 0\nconst listeners = new Set<() => void>()\n\nfunction emit(): void {\n for (const fn of listeners) fn()\n}\n\nfunction addToast(\n title: string,\n variant: ToastVariant,\n options?: ToastOptions\n): string {\n const id = `gds-toast-${++nextId}`\n const item: ToastItem = {\n id,\n title,\n variant,\n description: options?.description,\n duration: options?.duration ?? 5000,\n dismissible: options?.dismissible !== false,\n action: options?.action,\n createdAt: Date.now(),\n }\n items = [...items, item]\n emit()\n return id\n}\n\nfunction dismiss(id: string): void {\n const prev = items\n items = items.filter((t) => t.id !== id)\n if (items !== prev) emit()\n}\n\nfunction dismissAll(): void {\n if (items.length === 0) return\n items = []\n emit()\n}\n\nfunction getSnapshot(): ToastItem[] {\n return items\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n// ---- public API ----\n\nexport const toast = {\n show: (title: string, options?: ToastOptions): string =>\n addToast(title, 'default', options),\n success: (title: string, options?: ToastOptions): string =>\n addToast(title, 'success', options),\n error: (title: string, options?: ToastOptions): string =>\n addToast(title, 'danger', options),\n warning: (title: string, options?: ToastOptions): string =>\n addToast(title, 'warning', options),\n info: (title: string, options?: ToastOptions): string =>\n addToast(title, 'default', options),\n dismiss,\n dismissAll,\n}\n\n// for React consumption\nexport const toastStore = {\n getSnapshot,\n subscribe,\n}\n","// toast-provider — renders toast items from the global store\n// place once at app root: <ToastProvider />\n// then call toast.success('Done!') from anywhere\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useSyncExternalStore,\n} from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\nimport { Toast } from './toast'\nimport type { ToastItem } from './toast-store'\nimport { toast as toastApi, toastStore } from './toast-store'\n\nexport type ToastPosition =\n | 'bottom-center'\n | 'bottom-left'\n | 'bottom-right'\n | 'top-center'\n | 'top-left'\n | 'top-right'\n\nexport type ToastProviderProps = React.HTMLAttributes<HTMLDivElement> & {\n maxVisible?: number\n position?: ToastPosition\n}\n\nconst positionStyles: Record<ToastPosition, string> = {\n 'top-right': 'top-4 right-4 items-end',\n 'top-left': 'top-4 left-4 items-start',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2 items-center',\n 'bottom-right': 'bottom-4 right-4 items-end',\n 'bottom-left': 'bottom-4 left-4 items-start',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center',\n}\n\nconst emptySnapshot: ToastItem[] = []\n\nexport const ToastProvider = forwardRef<HTMLDivElement, ToastProviderProps>(\n function ToastProvider(\n { position = 'bottom-right', maxVisible = 5, className, ...props },\n ref\n ) {\n const items = useSyncExternalStore(\n toastStore.subscribe,\n toastStore.getSnapshot,\n () => emptySnapshot\n )\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map()\n )\n\n const handleClose = useCallback((id: string) => {\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n toastApi.dismiss(id)\n }, [])\n\n // auto-dismiss timers\n useEffect(() => {\n const timers = timersRef.current\n const now = Date.now()\n for (const item of items) {\n if (item.duration > 0 && !timers.has(item.id)) {\n // account for elapsed time since creation (e.g. toast fired before provider mounted)\n const elapsed = now - item.createdAt\n const remaining = Math.max(0, item.duration - elapsed)\n if (remaining === 0) {\n toastApi.dismiss(item.id)\n continue\n }\n const timer = setTimeout(() => {\n timers.delete(item.id)\n toastApi.dismiss(item.id)\n }, remaining)\n timers.set(item.id, timer)\n }\n }\n // cleanup timers for removed items\n for (const [id, timer] of timers) {\n if (!items.some((i) => i.id === id)) {\n clearTimeout(timer)\n timers.delete(id)\n }\n }\n }, [items])\n\n // cleanup all timers on unmount\n useEffect(() => {\n const timers = timersRef.current\n return () => {\n for (const timer of timers.values()) clearTimeout(timer)\n timers.clear()\n }\n }, [])\n\n const visible = items.slice(-maxVisible)\n if (visible.length === 0) return null\n\n const actionButton = (item: ToastItem) => {\n if (item.action === undefined) return undefined\n return (\n <button\n type=\"button\"\n onClick={() => {\n item.action?.onClick()\n handleClose(item.id)\n }}\n className=\"gds-text-label text-accent shrink-0 font-medium hover:underline\"\n >\n {item.action.label}\n </button>\n )\n }\n\n return renderPortal(\n <div\n {...props}\n ref={ref}\n className={cx(\n 'pointer-events-none fixed z-[var(--gds-z-toast)] flex w-80 flex-col gap-2',\n positionStyles[position],\n className\n )}\n data-component=\"toast-provider\"\n aria-live=\"polite\"\n aria-label=\"Notifications\"\n >\n {visible.map((item) => (\n <div key={item.id} className=\"animate-slide-up pointer-events-auto\">\n <Toast\n title={item.title}\n description={item.description}\n variant={item.variant}\n onClose={\n item.dismissible ? () => handleClose(item.id) : undefined\n }\n action={actionButton(item)}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n","// toggle-field — label + switch + optional description for settings\nimport { forwardRef } from 'react'\n\nimport { Switch } from '../l3-atoms/switch'\nimport { cx } from '../utils/cx'\n\ntype ToggleFieldProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n label: string\n description?: string\n checked: boolean\n onChange: (v: boolean) => void\n disabled?: boolean\n}\n\nconst ToggleField = forwardRef<HTMLDivElement, ToggleFieldProps>(\n function ToggleField(\n { label, description, checked, onChange, disabled, className, ...props },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('flex items-center justify-between gap-4', className)}\n data-component=\"toggle-field\"\n {...props}\n >\n <div className=\"flex flex-col\">\n <span className=\"gds-text-body text-fg select-none\">{label}</span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs select-none\">\n {description}\n </span>\n )}\n </div>\n <Switch checked={checked} onChange={onChange} disabled={disabled} />\n </div>\n )\n }\n)\n\nexport { ToggleField }\nexport type { ToggleFieldProps }\n","// toolbar-generic — horizontal toolbar container with optional floating variant\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type ToolbarGenericProps = {\n children: ReactNode\n variant?: 'default' | 'floating'\n glass?: boolean\n className?: string\n}\n\nexport const ToolbarGeneric = forwardRef<HTMLDivElement, ToolbarGenericProps>(\n function ToolbarGeneric(\n { children, variant = 'default', glass, className },\n ref\n ) {\n const variantCls =\n variant === 'floating'\n ? 'gds-radius border border-border bg-surface shadow-md'\n : 'border-b border-border bg-bg'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap flex items-center px-3 py-2 select-none',\n variantCls,\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"toolbar-generic\"\n data-variant={variant}\n role=\"toolbar\"\n >\n {children}\n </div>\n )\n }\n)\n\nexport const ToolbarSeparator = forwardRef<HTMLDivElement>(\n function ToolbarSeparator(_props, ref) {\n return (\n <div\n ref={ref}\n className=\"bg-border/50 h-4 w-px\"\n data-component=\"toolbar-separator\"\n />\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ToolbarGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n}\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, ToolbarGroupProps>(\n function ToolbarGroup({ children, className, ...props }, ref) {\n return (\n <div\n className={cx(\n 'border-border inline-flex items-center overflow-hidden rounded-md border',\n '[&>*]:border-border [&>*]:rounded-none [&>*]:border-0 [&>*]:border-r [&>*:last-child]:border-r-0',\n className\n )}\n data-component=\"toolbar-group\"\n ref={ref}\n role=\"toolbar\"\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nexport type { ToolbarGroupProps }\n","// upload-progress — file upload progress list with status and actions\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type UploadFile = {\n error?: string\n name: string\n progress: number\n status: 'done' | 'error' | 'uploading'\n}\n\nexport type UploadProgressProps = {\n className?: string\n files: UploadFile[]\n onCancel?: (name: string) => void\n onRetry?: (name: string) => void\n}\n\nconst checkIcon = (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8l3 3 7-7\" />\n </svg>\n)\n\nconst alertIcon = (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 5v3M8 10.5v.5\" />\n </svg>\n)\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nconst retryIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 2v4h4M13 12V8H9\" />\n <path d=\"M3.5 9A5 5 0 0112.5 7M10.5 5A5 5 0 001.5 7\" />\n </svg>\n)\n\nexport const UploadProgress = forwardRef<HTMLDivElement, UploadProgressProps>(\n function UploadProgress({ className, files, onCancel, onRetry }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"upload-progress\"\n >\n {files.map((file) => (\n <div\n key={file.name}\n className=\"gds-gap-sm gds-pad-x gds-pad-y border-border bg-surface flex flex-col rounded border\"\n >\n <div className=\"gds-gap-sm flex items-center\">\n {file.status === 'done' && (\n <span className=\"text-success shrink-0\">{checkIcon}</span>\n )}\n {file.status === 'error' && (\n <span className=\"text-danger shrink-0\">{alertIcon}</span>\n )}\n {file.status === 'uploading' && (\n <span className=\"border-accent h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-t-transparent\" />\n )}\n <span className=\"gds-text text-fg min-w-0 flex-1 truncate\">\n {file.name}\n </span>\n {file.status === 'uploading' && onCancel !== undefined && (\n <button\n type=\"button\"\n aria-label={`Cancel ${file.name}`}\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={() => onCancel(file.name)}\n >\n {closeIcon}\n </button>\n )}\n {file.status === 'error' && onRetry !== undefined && (\n <button\n type=\"button\"\n aria-label={`Retry ${file.name}`}\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={() => onRetry(file.name)}\n >\n {retryIcon}\n </button>\n )}\n </div>\n {file.status === 'uploading' && (\n <div className=\"bg-bg-tertiary h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-accent h-full rounded-full transition-all duration-300\"\n style={{\n width: `${Math.min(100, Math.max(0, file.progress))}%`,\n }}\n />\n </div>\n )}\n {file.status === 'error' && file.error !== undefined && (\n <span className=\"text-danger text-xs\">{file.error}</span>\n )}\n </div>\n ))}\n </div>\n )\n }\n)\n","// user-card — compact user display with avatar, name, role, and contact info\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype UserCardStatus = 'away' | 'busy' | 'offline' | 'online'\n\nconst statusColors: Record<UserCardStatus, string> = {\n away: 'bg-warning',\n busy: 'bg-danger',\n offline: 'bg-fg-muted/40',\n online: 'bg-success',\n}\n\nexport type UserCardProps = {\n name: string\n avatar?: string\n role?: string\n department?: string\n email?: string\n status?: UserCardStatus\n glass?: boolean\n className?: string\n children?: ReactNode\n}\n\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(\n function UserCard(\n {\n name,\n avatar,\n role,\n department,\n email,\n status,\n glass,\n className,\n children,\n },\n ref\n ) {\n const initials = (name ?? '')\n .split(' ')\n .map((w) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-radius border-border bg-surface gds-pad inline-flex items-center border select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"user-card\"\n >\n {/* avatar */}\n <div className=\"relative\">\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"h-9 w-9 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/15 text-accent flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium\">\n {initials}\n </div>\n )}\n {status !== undefined && (\n <span\n className={cx(\n 'border-surface absolute -right-0.5 -bottom-0.5 h-3 w-3 rounded-full border-2',\n statusColors[status]\n )}\n />\n )}\n </div>\n\n {/* info */}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-fg truncate text-sm font-medium\">{name}</span>\n {(role !== undefined || department !== undefined) && (\n <span className=\"gds-text-body text-fg-muted flex items-center gap-1\">\n {role !== undefined && <span>{role}</span>}\n {role !== undefined && department !== undefined && (\n <span className=\"text-fg-muted/40\">/</span>\n )}\n {department !== undefined && <span>{department}</span>}\n </span>\n )}\n {email !== undefined && (\n <span className=\"gds-text-body text-fg-muted/60 flex items-center gap-1\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3.5\" width=\"12\" height=\"9\" rx=\"1.5\" />\n <path d=\"M2 5l6 4 6-4\" />\n </svg>\n <span className=\"truncate\">{email}</span>\n </span>\n )}\n </div>\n\n {children}\n </div>\n )\n }\n)\n\nexport type { UserCardStatus }\n","import { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { cx } from '../utils/cx'\n\ntype UserInfoSize = 'sm' | 'default'\n\ntype UserInfoProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n name: string\n role?: string\n size?: UserInfoSize\n}\n\nexport const UserInfo = forwardRef<HTMLDivElement, UserInfoProps>(\n function UserInfo(\n { avatar, className, name, role, size = 'default', ...props },\n ref\n ) {\n const avatarSize = size === 'sm' ? 'sm' : 'default'\n const textCls = size === 'sm' ? 'text-xs' : 'text-sm'\n\n return (\n <div\n className={cx('inline-flex items-center gap-2 select-none', className)}\n data-component=\"user-info\"\n ref={ref}\n {...props}\n >\n <Avatar name={name} size={avatarSize} src={avatar} />\n <div className=\"flex flex-col\">\n <span className={cx('text-fg leading-tight font-medium', textCls)}>\n {name}\n </span>\n {role !== undefined && (\n <span\n className={cx(\n 'text-fg-muted leading-tight',\n size === 'sm' ? 'text-[10px]' : 'text-xs'\n )}\n >\n {role}\n </span>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { UserInfoProps, UserInfoSize }\n","// user-menu — avatar + name trigger with dropdown menu items\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype UserMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n danger?: boolean\n}\n\ntype UserMenuProps = {\n name: string\n avatar?: string\n role?: string\n items: UserMenuItem[]\n onSelect: (id: string) => void\n className?: string\n}\n\nconst UserMenu = forwardRef<HTMLDivElement, UserMenuProps>(function UserMenu(\n { name, avatar, role, items, onSelect, className },\n ref\n) {\n const [open, setOpen] = useState(false)\n const initials = name\n .split(' ')\n .map((w) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <div\n ref={ref}\n className={cx('relative', className)}\n data-component=\"user-menu\"\n >\n <button\n type=\"button\"\n className=\"hover:bg-bg-tertiary flex items-center gap-2 rounded-lg px-2 py-1.5 transition-colors select-none\"\n onClick={() => setOpen((p) => !p)}\n data-testid=\"user-menu-trigger\"\n >\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"h-7 w-7 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/10 text-accent flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold\">\n {initials}\n </div>\n )}\n <span className=\"text-fg text-sm font-medium\">{name}</span>\n </button>\n {open && (\n <div\n className=\"border-border bg-surface animate-popup absolute top-full right-0 z-50 mt-1 min-w-[160px] rounded-lg border py-1 shadow-lg\"\n data-testid=\"user-menu-dropdown\"\n >\n {role !== undefined && (\n <div className=\"text-fg-muted px-3 py-1.5 text-xs\">{role}</div>\n )}\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cx(\n 'hover:bg-bg-tertiary flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors select-none',\n item.danger === true ? 'text-danger' : 'text-fg'\n )}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n})\n\nexport { UserMenu }\nexport type { UserMenuItem, UserMenuProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VersionBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n latest?: string\n version: string\n}\n\nconst VersionBadge = forwardRef<HTMLSpanElement, VersionBadgeProps>(\n function VersionBadge({ className, latest, version, ...props }, ref) {\n const hasUpdate = latest !== undefined && latest !== version\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium tabular-nums',\n hasUpdate ? 'bg-warning/15 text-warning' : 'bg-surface text-fg-muted',\n className\n )}\n data-component=\"version-badge\"\n data-has-update={hasUpdate}\n ref={ref}\n {...props}\n >\n v{version}\n {hasUpdate && (\n <svg\n className=\"shrink-0\"\n fill=\"currentColor\"\n height={12}\n viewBox=\"0 0 24 24\"\n width={12}\n >\n <path\n d=\"M12 2L12 16M12 16L7 11M12 16L17 11M5 20H19\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n />\n </svg>\n )}\n </span>\n )\n }\n)\n\nexport { VersionBadge }\nexport type { VersionBadgeProps }\n","// watermark — overlay repeated text watermark on content\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type WatermarkProps = {\n children: ReactNode\n text: string\n opacity?: number\n className?: string\n}\n\nexport const Watermark = forwardRef<HTMLDivElement, WatermarkProps>(\n function Watermark({ children, text, opacity = 0.1, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden', className)}\n data-component=\"watermark\"\n >\n {children}\n <div\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center overflow-hidden select-none\"\n style={{ opacity }}\n >\n <div\n className=\"absolute inset-[-50%] flex flex-wrap items-center justify-center gap-16\"\n style={{ transform: 'rotate(-30deg)' }}\n >\n {Array.from({ length: 64 }, (_, i) => (\n <span\n key={i}\n className=\"text-fg text-lg font-bold whitespace-nowrap\"\n >\n {text}\n </span>\n ))}\n </div>\n </div>\n </div>\n )\n }\n)\n","// wizard — multi-step wizard with numbered circles and content\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype WizardStep = {\n title: string\n content: ReactNode\n}\n\ntype WizardProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n steps: WizardStep[]\n currentStep?: number\n onStepChange?: (step: number) => void\n}\n\nexport const Wizard = forwardRef<HTMLDivElement, WizardProps>(function Wizard(\n { steps, currentStep, onStepChange, className, ...props },\n ref\n) {\n const [internal, setInternal] = useState(0)\n const active = currentStep ?? internal\n\n function goTo(step: number) {\n if (onStepChange !== undefined) {\n onStepChange(step)\n } else {\n setInternal(step)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"wizard\"\n {...props}\n >\n <div className=\"flex items-center gap-0\">\n {steps.map((step, i) => {\n const done = i < active\n const isCurrent = i === active\n return (\n <div key={`${step.title}-${i}`} className=\"flex items-center\">\n {i > 0 && (\n <div\n className={cx('h-px w-8', done ? 'bg-accent' : 'bg-border')}\n />\n )}\n <button\n type=\"button\"\n className={cx(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium transition-colors',\n done && 'bg-accent text-accent-fg',\n isCurrent && 'bg-accent/20 text-accent ring-accent ring-2',\n !done && !isCurrent && 'bg-bg-tertiary text-fg-muted'\n )}\n onClick={() => goTo(i)}\n >\n {i + 1}\n </button>\n </div>\n )\n })}\n </div>\n <div className=\"text-fg-muted text-xs font-medium\">\n {steps[active]?.title}\n </div>\n <div>{steps[active]?.content}</div>\n </div>\n )\n})\n\nexport type { WizardProps, WizardStep }\n"],"mappings":"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"}
1
+ {"version":3,"file":"l4-molecules-CWwgFWmO.js","names":[],"sources":["../src/l4-molecules/action-card.tsx","../src/l4-molecules/action-menu.tsx","../src/l4-molecules/activity-log.tsx","../src/l4-molecules/alert.tsx","../src/l4-molecules/banner.tsx","../src/l4-molecules/before-after.tsx","../src/l4-molecules/bottom-bar.tsx","../src/l4-molecules/breadcrumb.tsx","../src/l4-molecules/bulk-action-bar.tsx","../src/l4-molecules/callout.tsx","../src/l4-molecules/card.tsx","../src/l4-molecules/category-tag.tsx","../src/l4-molecules/cert-badge.tsx","../src/l4-molecules/chip-group.tsx","../src/l4-molecules/circular-menu.tsx","../src/l4-molecules/code-block.tsx","../src/l4-molecules/code-snippet.tsx","../src/l4-molecules/collapsible.tsx","../src/l4-molecules/color-picker.tsx","../src/l4-molecules/combobox-list.tsx","../src/l4-molecules/combobox.tsx","../src/l4-molecules/command-bar.tsx","../src/l4-molecules/command-bar-float.tsx","../src/l4-molecules/command-menu.tsx","../src/l4-molecules/comparison-bar.tsx","../src/l4-molecules/dialog.tsx","../src/l4-molecules/confirm-dialog.tsx","../src/l4-molecules/context-menu.tsx","../src/l4-molecules/copy-field.tsx","../src/l4-molecules/copy-to-clipboard.tsx","../src/l4-molecules/countdown-timer.tsx","../src/l4-molecules/currency-display.tsx","../src/l4-molecules/currency-input.tsx","../src/l4-molecules/data-card.tsx","../src/l4-molecules/date-display.tsx","../src/l4-molecules/date-range-input.tsx","../src/l4-molecules/description.tsx","../src/l4-molecules/dock.tsx","../src/l4-molecules/download-button.tsx","../src/l4-molecules/drawer.tsx","../src/l4-molecules/drop-zone.tsx","../src/l4-molecules/dropdown.tsx","../src/l4-molecules/editable.tsx","../src/l4-molecules/emoji-picker.tsx","../src/l4-molecules/empty-placeholder.tsx","../src/l4-molecules/empty-search.tsx","../src/l4-molecules/environment-badge.tsx","../src/l4-molecules/feature-flag.tsx","../src/l4-molecules/field-group.tsx","../src/l4-molecules/field-set.tsx","../src/l4-molecules/file-upload.tsx","../src/l4-molecules/filter-bar.tsx","../src/l4-molecules/flip-card.tsx","../src/l4-molecules/form-actions.tsx","../src/l4-molecules/form-field.tsx","../src/l4-molecules/glass-button.tsx","../src/l4-molecules/glass-card.tsx","../src/l4-molecules/glitch-text.tsx","../src/l4-molecules/hover-card.tsx","../src/l4-molecules/info-row.tsx","../src/l4-molecules/input-group.tsx","../src/l4-molecules/input-with-button.tsx","../src/l4-molecules/key-value-list.tsx","../src/l4-molecules/kv-table.tsx","../src/l4-molecules/link-preview.tsx","../src/l4-molecules/live-metric.tsx","../src/l4-molecules/loading-overlay.tsx","../src/l4-molecules/matrix-rain.tsx","../src/l4-molecules/media-container.tsx","../src/l4-molecules/media-object.tsx","../src/l4-molecules/mention-list.tsx","../src/l4-molecules/mention-input.tsx","../src/l4-molecules/metric-row.tsx","../src/l4-molecules/metric-tile.tsx","../src/l4-molecules/morphing-shape.tsx","../src/l4-molecules/multi-select-list.tsx","../src/l4-molecules/multi-select.tsx","../src/l4-molecules/nav-item.tsx","../src/l4-molecules/network-status.tsx","../src/l4-molecules/noise-overlay.tsx","../src/l4-molecules/notification-bell.tsx","../src/l4-molecules/notification-dot.tsx","../src/l4-molecules/num-table.tsx","../src/l4-molecules/otp-input.tsx","../src/l4-molecules/overflow-menu.tsx","../src/l4-molecules/page-nav.tsx","../src/l4-molecules/pagination.tsx","../src/l4-molecules/panel.tsx","../src/l4-molecules/particle-field.tsx","../src/l4-molecules/password-input.tsx","../src/l4-molecules/phone-input.tsx","../src/l4-molecules/pin-input.tsx","../src/l4-molecules/popover.tsx","../src/l4-molecules/quick-stat.tsx","../src/l4-molecules/radio-card.tsx","../src/l4-molecules/reveal.tsx","../src/l4-molecules/scoreboard.tsx","../src/l4-molecules/search-input.tsx","../src/l4-molecules/select.tsx","../src/l4-molecules/slider-field.tsx","../src/l4-molecules/sortable-header.tsx","../src/l4-molecules/split-button.tsx","../src/l4-molecules/stacked-progress.tsx","../src/l4-molecules/stat-comparison.tsx","../src/l4-molecules/stat-trend.tsx","../src/l4-molecules/status-bar-component.tsx","../src/l4-molecules/tabs.tsx","../src/l4-molecules/tab-group.tsx","../src/l4-molecules/tag-input.tsx","../src/l4-molecules/text-reveal.tsx","../src/l4-molecules/text-scramble.tsx","../src/l4-molecules/tilt-card.tsx","../src/l4-molecules/time-picker-grid.tsx","../src/l4-molecules/time-picker.tsx","../src/l4-molecules/timeline-item.tsx","../src/l4-molecules/toast-store.ts","../src/l4-molecules/toast-provider.tsx","../src/l4-molecules/toggle-field.tsx","../src/l4-molecules/toolbar-generic.tsx","../src/l4-molecules/toolbar-group.tsx","../src/l4-molecules/upload-progress.tsx","../src/l4-molecules/user-card.tsx","../src/l4-molecules/user-info.tsx","../src/l4-molecules/user-menu.tsx","../src/l4-molecules/version-badge.tsx","../src/l4-molecules/watermark.tsx","../src/l4-molecules/wizard.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ActionCardProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n description?: string\n icon?: ReactNode\n onClick: () => void\n title: string\n}\n\nexport const ActionCard = forwardRef<HTMLDivElement, ActionCardProps>(\n function ActionCard(\n { className, description, icon, onClick, title, ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-gap gds-pad gds-radius flex cursor-pointer items-center',\n 'border-border bg-surface hover:bg-surface-hover border transition-colors',\n className\n )}\n data-component=\"action-card\"\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n }}\n ref={ref}\n role=\"button\"\n tabIndex={0}\n {...props}\n >\n {icon !== undefined && (\n <span className=\"text-accent shrink-0\">{icon}</span>\n )}\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-fg text-sm font-medium\">{title}</span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs\">{description}</span>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { ActionCardProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { IconButton } from '../l2-primitives/icon-button'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype ActionMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n danger?: boolean\n}\n\ntype ActionMenuProps = {\n items: ActionMenuItem[]\n onSelect: (id: string) => void\n disabled?: boolean\n className?: string\n}\n\nconst dotsIcon = (\n <svg className=\"h-4 w-4\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" />\n </svg>\n)\n\nexport const ActionMenu = forwardRef<HTMLDivElement, ActionMenuProps>(\n function ActionMenu({ className, disabled, items, onSelect }, ref) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n className={cx('relative inline-block', className)}\n data-component=\"action-menu\"\n ref={ref}\n >\n <div ref={containerRef}>\n <IconButton\n disabled={disabled}\n icon={dotsIcon}\n onClick={() => setOpen((prev) => !prev)}\n tooltip=\"Actions\"\n variant=\"default\"\n />\n {open && (\n <div className=\"animate-popup border-border bg-surface absolute right-0 z-50 mt-1 min-w-[140px] rounded-lg border py-1 shadow-lg\">\n {items.map((item) => (\n <button\n key={item.id}\n className={cx(\n 'gds-gap-sm gds-text-body flex w-full items-center px-3 py-1.5 transition-colors',\n focusCls,\n item.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n type=\"button\"\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { ActionMenuItem, ActionMenuProps }\n","// activity-log — vertical feed of timestamped activity entries\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ActivityEntry = {\n action: string\n actor: string\n id: string\n target?: string\n timestamp: string\n}\n\nexport type ActivityLogProps = {\n className?: string\n entries: ActivityEntry[]\n}\n\nexport const ActivityLog = forwardRef<HTMLDivElement, ActivityLogProps>(\n function ActivityLog({ className, entries }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"activity-log\"\n >\n {entries.map((entry) => (\n <div\n key={entry.id}\n className=\"gds-gap-sm border-border flex items-start border-l-2 py-1 pl-3\"\n >\n <div className=\"min-w-0 flex-1\">\n <span className=\"gds-text text-fg font-medium\">\n {entry.actor}\n </span>\n <span className=\"bg-bg-tertiary text-fg-muted mx-1.5 inline-block rounded px-1.5 py-0.5 text-xs\">\n {entry.action}\n </span>\n {entry.target !== undefined && (\n <span className=\"gds-text text-fg-secondary\">\n {entry.target}\n </span>\n )}\n </div>\n <time className=\"text-fg-muted shrink-0 text-xs\">\n {entry.timestamp}\n </time>\n </div>\n ))}\n </div>\n )\n }\n)\n","// alert — contextual feedback banner with variant colors and optional close\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst alertVariants = cva(\n 'flex items-start gds-gap gds-radius-popover border gds-pad-x gds-pad-y gds-text-body',\n {\n variants: {\n variant: {\n default: 'border-border bg-bg-secondary text-fg',\n info: 'border-accent/30 bg-accent/10 text-accent',\n success: 'border-success/30 bg-success/10 text-success',\n warning: 'border-warning/30 bg-warning/10 text-warning',\n danger: 'border-danger/30 bg-danger/10 text-danger',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst variantIcons: Record<string, React.ReactNode> = {\n default: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5v3M8 10.5h.01\" />\n </svg>\n ),\n info: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" />\n <path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n danger: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n}\n\nexport type AlertProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof alertVariants> & {\n title?: string\n onClose?: () => void\n glass?: boolean\n }\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n { children, title, variant = 'default', onClose, glass, className, ...props },\n ref\n) {\n const v = variant ?? 'default'\n\n return (\n <div\n ref={ref}\n className={cx(\n alertVariants({ variant }),\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"alert\"\n data-variant={v}\n role=\"alert\"\n {...props}\n >\n <span className=\"mt-px shrink-0\">{variantIcons[v]}</span>\n <div className=\"min-w-0 flex-1\">\n {title !== undefined && <p className=\"mb-0.5 font-medium\">{title}</p>}\n <div className=\"text-inherit/80\">{children}</div>\n </div>\n {onClose !== undefined && (\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button shrink-0 p-0.5 opacity-60 hover:opacity-100',\n focusCls\n )}\n aria-label=\"Dismiss\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n})\n\nexport { alertVariants }\n","// banner — full-width contextual feedback strip with variant colors and optional dismiss\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype BannerVariant = 'danger' | 'info' | 'success' | 'warning'\n\nconst variantStyles: Record<BannerVariant, string> = {\n danger: 'bg-danger/10 text-danger',\n info: 'bg-accent/10 text-accent',\n success: 'bg-success/10 text-success',\n warning: 'bg-warning/10 text-warning',\n}\n\nconst variantIcons: Record<BannerVariant, ReactNode> = {\n danger: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" />\n </svg>\n ),\n info: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M8 5.5h.01M8 7.5v3\" />\n </svg>\n ),\n success: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" />\n <path d=\"M5.5 8l2 2 3-3.5\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M7.13 2.5l-5.5 10h11l-5.5-10z\" />\n <path d=\"M7.63 6.5v2.5M7.63 11h.01\" />\n </svg>\n ),\n}\n\nexport type BannerProps = {\n message: ReactNode\n variant?: BannerVariant\n dismissible?: boolean\n onDismiss?: () => void\n glass?: boolean\n className?: string\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n {\n message,\n variant = 'info',\n dismissible = false,\n onDismiss,\n glass,\n className,\n },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y gds-text-body flex w-full items-center',\n variantStyles[variant],\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"banner\"\n data-variant={variant}\n role=\"status\"\n >\n <span className=\"shrink-0\">{variantIcons[variant]}</span>\n <span className=\"flex-1\">{message}</span>\n {dismissible && onDismiss !== undefined && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className={cx(\n 'gds-radius-button shrink-0 p-0.5 transition-opacity hover:opacity-70',\n focusCls\n )}\n aria-label=\"Dismiss\"\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n )\n})\n\nexport type { BannerVariant }\n","// before-after — interactive slider to compare two overlaid views\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BeforeAfterProps = {\n before: ReactNode\n after: ReactNode\n initialPosition?: number\n className?: string\n}\n\nexport const BeforeAfter = forwardRef<HTMLDivElement, BeforeAfterProps>(\n function BeforeAfter(\n { before, after, initialPosition = 50, className },\n ref\n ) {\n const [position, setPosition] = useState(initialPosition)\n const containerRef = useRef<HTMLDivElement>(null)\n const dragging = useRef(false)\n\n const updatePosition = useCallback((clientX: number) => {\n const el = containerRef.current\n if (el === null) return\n const rect = el.getBoundingClientRect()\n const x = clientX - rect.left\n const pct = Math.max(0, Math.min(100, (x / rect.width) * 100))\n setPosition(pct)\n }, [])\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n dragging.current = true\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n updatePosition(e.clientX)\n },\n [updatePosition]\n )\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!dragging.current) return\n updatePosition(e.clientX)\n },\n [updatePosition]\n )\n\n const onPointerUp = useCallback(() => {\n dragging.current = false\n }, [])\n\n return (\n <div\n ref={(node) => {\n ;(\n containerRef as React.MutableRefObject<HTMLDivElement | null>\n ).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n className={cx(\n 'gds-radius relative overflow-hidden select-none',\n className\n )}\n data-component=\"before-after\"\n style={{ cursor: 'ew-resize' }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n >\n {/* after layer (full width, behind) */}\n <div className=\"relative\">{after}</div>\n\n {/* before layer (clipped) */}\n <div\n className=\"absolute inset-0\"\n style={{ clipPath: `inset(0 ${100 - position}% 0 0)` }}\n >\n {before}\n </div>\n\n {/* divider handle */}\n <div\n className=\"bg-fg/80 absolute inset-y-0 z-10 w-0.5\"\n style={{ left: `${position}%` }}\n >\n <div className=\"border-border bg-bg absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full border p-1 shadow\">\n <svg\n className=\"text-fg-muted h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 6l-4 6 4 6M16 6l4 6-4 6\" />\n </svg>\n </div>\n </div>\n </div>\n )\n }\n)\n","// bottom-bar — fixed bottom navigation bar\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BottomBarProps = {\n children: ReactNode\n className?: string\n}\n\nexport const BottomBar = forwardRef<HTMLDivElement, BottomBarProps>(\n function BottomBar({ children, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-bg gds-pad-y fixed right-0 bottom-0 left-0 z-40 flex items-center justify-around border-t',\n className\n )}\n data-component=\"bottom-bar\"\n >\n {children}\n </div>\n )\n }\n)\n","// breadcrumb — navigation trail with collapsible items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BreadcrumbItem = {\n label: string\n href?: string\n icon?: ReactNode\n}\n\nexport type BreadcrumbProps = {\n items: BreadcrumbItem[]\n separator?: ReactNode\n maxItems?: number\n className?: string\n}\n\nconst defaultSeparator = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M4.5 3l3 3-3 3\" />\n </svg>\n)\n\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n function Breadcrumb(\n { items, separator = defaultSeparator, maxItems, className },\n ref\n ) {\n let visibleItems = items\n\n if (maxItems !== undefined && items.length > maxItems && maxItems >= 2) {\n const first = items[0]\n const last = items[items.length - 1]\n const ellipsis: BreadcrumbItem = { label: '...' }\n visibleItems = [first, ellipsis, last]\n }\n\n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={cx(className)}\n data-component=\"breadcrumb\"\n >\n <ol className=\"gds-gap-sm gds-text-body text-fg-muted flex items-center\">\n {visibleItems.map((item, i) => (\n <li\n key={`${item.label}-${i}`}\n className=\"gds-gap-sm flex items-center\"\n >\n {i > 0 && (\n <span className=\"text-fg-muted/50\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n {item.href !== undefined ? (\n <a href={item.href} className=\"hover:text-fg transition-colors\">\n {item.label}\n </a>\n ) : (\n <span\n className={cx(i === visibleItems.length - 1 && 'text-fg')}\n >\n {item.label}\n </span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )\n }\n)\n","// bulk-action-bar — bar that appears when items are selected\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype BulkActionBarProps = {\n actions: ReactNode\n className?: string\n count: number\n onClear?: () => void\n}\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nexport const BulkActionBar = forwardRef<HTMLDivElement, BulkActionBarProps>(\n function BulkActionBar({ actions, className, count, onClear }, ref) {\n if (count <= 0) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x-lg gds-pad-y fixed bottom-4 left-1/2 z-40 flex -translate-x-1/2 items-center',\n 'animate-popup gds-radius-popover border-border bg-surface gds-shadow-xl border',\n className\n )}\n data-component=\"bulk-action-bar\"\n >\n <span className=\"gds-text-body text-fg font-medium whitespace-nowrap select-none\">\n {count} selected\n </span>\n <div className=\"gds-gap-sm flex items-center\">{actions}</div>\n {onClear !== undefined && (\n <button\n aria-label=\"Clear selection\"\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n {closeIcon}\n </button>\n )}\n </div>\n )\n }\n)\n\nexport type { BulkActionBarProps }\n","// callout — prominent message box with icon, title, and variant colors\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype CalloutVariant = 'info' | 'tip' | 'warning' | 'danger'\n\nconst variantStyles: Record<CalloutVariant, string> = {\n info: 'border-l-accent bg-accent/5 text-accent',\n tip: 'border-l-success bg-success/5 text-success',\n warning: 'border-l-warning bg-warning/5 text-warning',\n danger: 'border-l-danger bg-danger/5 text-danger',\n}\n\nconst defaultIcons: Record<CalloutVariant, ReactNode> = {\n info: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M10 7h.01M10 9.5v4\" />\n </svg>\n ),\n tip: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7.5 15h5M8 17h4M10 2a5.5 5.5 0 0 0-2 10.65V14h4v-1.35A5.5 5.5 0 0 0 10 2z\" />\n </svg>\n ),\n warning: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M9.13 3l-7 12.5h14l-7-12.5z\" />\n <path d=\"M9.63 8.5v3M9.63 13.5h.01\" />\n </svg>\n ),\n danger: (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"8\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" />\n </svg>\n ),\n}\n\nexport type CalloutProps = {\n variant?: CalloutVariant\n title?: string\n children: ReactNode\n icon?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const Callout = forwardRef<HTMLDivElement, CalloutProps>(\n function Callout(\n { variant = 'info', title, children, icon, glass, className },\n ref\n ) {\n const resolvedIcon = icon ?? defaultIcons[variant]\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover gds-pad-x-lg gds-pad-y-lg gds-text-body flex items-start gap-3 border-l-[3px]',\n variantStyles[variant],\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"callout\"\n data-variant={variant}\n >\n <span className=\"mt-0.5 shrink-0\">{resolvedIcon}</span>\n <div className=\"min-w-0 flex-1\">\n {title !== undefined && <p className=\"mb-1 font-semibold\">{title}</p>}\n <div className=\"text-inherit/80\">{children}</div>\n </div>\n </div>\n )\n }\n)\n","// card — composition-based content container\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype CardPadding = 'default' | 'lg' | 'none' | 'sm'\n\nconst paddingMap: Record<CardPadding, string> = {\n none: '',\n sm: 'gds-pad-x gds-pad-y',\n default: 'gds-pad-x-lg gds-pad-y-lg',\n lg: 'gds-pad-x-lg gds-pad-y-lg',\n}\n\nexport type CardProps = {\n children: ReactNode\n className?: string\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Show pulse skeleton placeholder */\n loading?: boolean\n /** Click handler — adds cursor-pointer and hover effect */\n onClick?: () => void\n /** Inner padding preset */\n padding?: CardPadding\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n { children, className, glass, loading, onClick, padding = 'default' },\n ref\n) {\n if (loading === true) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-gap gds-radius-card border-border bg-bg-tertiary flex animate-pulse flex-col border',\n paddingMap[padding],\n className\n )}\n data-component=\"card\"\n data-state=\"loading\"\n >\n <div className=\"h-20\" />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-gap gds-radius-card flex flex-col border transition-colors',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n onClick !== undefined &&\n 'hover:border-fg-muted/40 hover:bg-surface/80 cursor-pointer',\n paddingMap[padding],\n className\n )}\n data-component=\"card\"\n onClick={onClick}\n >\n {children}\n </div>\n )\n})\n\nexport type CardHeaderProps = {\n action?: ReactNode\n children?: ReactNode\n className?: string\n description?: string\n title?: string\n}\n\nexport function CardHeader({\n action,\n children,\n className,\n description,\n title,\n}: CardHeaderProps) {\n if (children !== undefined) {\n return (\n <div\n className={cx('gds-gap flex items-start justify-between', className)}\n >\n {children}\n </div>\n )\n }\n return (\n <div className={cx('gds-gap flex items-start justify-between', className)}>\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h3 className=\"text-fg text-sm font-semibold\">{title}</h3>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">{description}</p>\n )}\n </div>\n {action !== undefined && <div className=\"shrink-0\">{action}</div>}\n </div>\n )\n}\n\nexport type CardContentProps = {\n children: ReactNode\n className?: string\n}\n\nexport function CardContent({ children, className }: CardContentProps) {\n return <div className={className}>{children}</div>\n}\n\nexport type CardFooterProps = {\n children: ReactNode\n className?: string\n}\n\nexport function CardFooter({ children, className }: CardFooterProps) {\n return (\n <div\n className={cx(\n 'gds-gap-sm border-border flex items-center border-t pt-3',\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\n\ntype CategoryTagProps = React.HTMLAttributes<HTMLDivElement> & {\n color: string\n count?: number\n label: string\n onClick?: () => void\n}\n\nexport const CategoryTag = forwardRef<HTMLDivElement, CategoryTagProps>(\n function CategoryTag(\n { className, color, count, label, onClick, ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'border-border bg-surface inline-flex items-center gap-2 rounded-md border px-2.5 py-1',\n onClick !== undefined && 'hover:bg-bg-tertiary cursor-pointer',\n className\n )}\n data-component=\"category-tag\"\n onClick={onClick}\n onKeyDown={\n onClick !== undefined\n ? (e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n onClick()\n }\n }\n : undefined\n }\n ref={ref}\n role={onClick !== undefined ? 'button' : undefined}\n tabIndex={onClick !== undefined ? 0 : undefined}\n {...props}\n >\n <span\n className=\"h-3 w-1 shrink-0 rounded-full\"\n style={{ backgroundColor: color }}\n />\n <span className=\"gds-text-label text-fg\">{label}</span>\n {count !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{count}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { CategoryTagProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CertBadgeStatus = 'expired' | 'expiring' | 'valid'\n\ntype CertBadgeProps = React.HTMLAttributes<HTMLDivElement> & {\n domain: string\n expiresAt: string\n status: CertBadgeStatus\n}\n\nconst statusCls: Record<CertBadgeStatus, string> = {\n valid: 'bg-success/15 text-success border-success/20',\n expiring: 'bg-warning/15 text-warning border-warning/20',\n expired: 'bg-danger/15 text-danger border-danger/20',\n}\n\nconst statusIcon: Record<CertBadgeStatus, string> = {\n valid: '🔒',\n expiring: '⚠️',\n expired: '❌',\n}\n\nexport const CertBadge = forwardRef<HTMLDivElement, CertBadgeProps>(\n function CertBadge({ className, domain, expiresAt, status, ...props }, ref) {\n return (\n <div\n className={cx(\n 'inline-flex items-center gap-2 rounded-md border px-2.5 py-1.5',\n statusCls[status],\n className\n )}\n data-component=\"cert-badge\"\n ref={ref}\n {...props}\n >\n <span className=\"text-xs\">{statusIcon[status]}</span>\n <span className=\"gds-text-label font-medium\">{domain}</span>\n <span className=\"gds-text-label opacity-70\">{expiresAt}</span>\n </div>\n )\n }\n)\n\nexport type { CertBadgeProps, CertBadgeStatus }\n","import { forwardRef } from 'react'\n\nimport { Chip } from '../l3-atoms/chip'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype ChipGroupOption = { value: string; label: string }\n\ntype ChipGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n options: ChipGroupOption[]\n value: string[]\n onChange: (value: string[]) => void\n exclusive?: boolean\n className?: string\n}\n\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(\n function ChipGroup(\n { options, value, onChange, exclusive = false, className, ...props },\n ref\n ) {\n function handleClick(optionValue: string) {\n if (exclusive) {\n const next = value.includes(optionValue) ? [] : [optionValue]\n onChange(next)\n return\n }\n const next = value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue]\n onChange(next)\n }\n\n return (\n <div\n className={cx('gds-gap flex flex-wrap', className)}\n data-component=\"chip-group\"\n ref={ref}\n {...props}\n >\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className={cx('cursor-pointer', focusCls)}\n onClick={() => handleClick(opt.value)}\n >\n <Chip\n label={opt.label}\n variant={value.includes(opt.value) ? 'accent' : 'default'}\n />\n </button>\n ))}\n </div>\n )\n }\n)\n\nexport type { ChipGroupOption, ChipGroupProps }\n","// circular-menu — radial popup menu around a trigger\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useEscapeKey } from '../utils/hooks'\n\nexport type CircularMenuItem = {\n icon: ReactNode\n id: string\n label: string\n}\n\nexport type CircularMenuProps = {\n className?: string\n items: CircularMenuItem[]\n radius?: number\n trigger: ReactNode\n}\n\nexport const CircularMenu = forwardRef<HTMLDivElement, CircularMenuProps>(\n function CircularMenu({ className, items, radius = 80, trigger }, ref) {\n const [open, setOpen] = useState(false)\n\n const toggle = useCallback(() => setOpen((prev) => !prev), [])\n const close = useCallback(() => setOpen(false), [])\n\n useEscapeKey(open, close)\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"circular-menu\"\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cx('relative z-10 cursor-pointer', focusCls)}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle()\n }\n }}\n >\n {trigger}\n </div>\n {open && (\n <div className=\"absolute top-1/2 left-1/2\">\n {items.map((item, i) => {\n const angle = (2 * Math.PI * i) / items.length - Math.PI / 2\n const x = Math.cos(angle) * radius\n const y = Math.sin(angle) * radius\n return (\n <button\n key={item.id}\n type=\"button\"\n title={item.label}\n className={cx(\n 'bg-surface border-border absolute flex items-center justify-center rounded-full border',\n 'text-fg h-10 w-10 -translate-x-1/2 -translate-y-1/2 transition-all duration-200',\n focusCls\n )}\n style={{ transform: `translate(${x}px, ${y}px)` }}\n >\n {item.icon}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\n","// code-block — styled code display with line numbers and copy button\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CodeBlockProps = {\n code: string\n language?: string\n showLineNumbers?: boolean\n maxHeight?: number | string\n glass?: boolean\n className?: string\n}\n\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(\n function CodeBlock(\n { code, language, showLineNumbers = true, maxHeight, glass, className },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n navigator.clipboard\n .writeText(code)\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [code])\n\n const lines = code.split('\\n')\n const lineNumberWidth = String(lines.length).length\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover overflow-hidden border',\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-bg-tertiary',\n className\n )}\n data-component=\"code-block\"\n data-variant={glass === true ? 'glass' : 'default'}\n >\n {/* header */}\n <div className=\"border-border/50 flex items-center justify-between border-b px-3 py-1.5\">\n <span\n className=\"text-fg-muted text-xs select-none\"\n data-testid=\"code-language\"\n >\n {language ?? 'code'}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg px-2 py-0.5 text-xs transition-colors select-none',\n focusCls\n )}\n aria-label=\"Copy code\"\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <path d=\"M9.5 4.5V3a1.5 1.5 0 00-1.5-1.5H3A1.5 1.5 0 001.5 3v5A1.5 1.5 0 003 9.5h1.5\" />\n </svg>\n )}\n </button>\n </div>\n\n {/* code body */}\n <div\n className=\"overflow-auto\"\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n data-selectable\n >\n <pre className=\"m-0 p-0\">\n <code className=\"text-fg block px-3 py-2 font-mono text-xs leading-5\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n {showLineNumbers && (\n <span\n className=\"border-border/30 text-fg-muted/40 mr-3 inline-block border-r pr-3 text-right select-none\"\n style={{ minWidth: `${lineNumberWidth}ch` }}\n >\n {i + 1}\n </span>\n )}\n <span className=\"flex-1 whitespace-pre\">{line}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n )\n }\n)\n","// code-snippet — compact code display with optional line numbers and copy\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CodeSnippetProps = {\n code: string\n language?: string\n copyable?: boolean\n showLineNumbers?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const CodeSnippet = forwardRef<HTMLPreElement, CodeSnippetProps>(\n function CodeSnippet(\n {\n code,\n language,\n copyable = true,\n showLineNumbers = true,\n glass,\n className,\n },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const lines = code.split('\\n')\n\n const handleCopy = useCallback(() => {\n navigator.clipboard\n .writeText(code)\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [code])\n\n return (\n <div\n className={cx(\n 'group gds-radius-popover relative overflow-hidden border',\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border/40 bg-bg-secondary',\n className\n )}\n data-component=\"code-snippet\"\n >\n {/* header */}\n {language !== undefined && (\n <div className=\"border-border/20 flex items-center justify-between border-b px-3 py-1.5\">\n <span className=\"text-fg-muted/40 text-[10px] uppercase select-none\">\n {language}\n </span>\n </div>\n )}\n\n {/* copy button */}\n {copyable && (\n <button\n type=\"button\"\n aria-label=\"Copy code\"\n className={cx(\n 'gds-radius-button bg-bg-tertiary/80 text-fg-muted hover:text-fg absolute top-2 right-2 flex h-6 w-6 items-center justify-center opacity-0 transition-opacity group-hover:opacity-100',\n focusCls\n )}\n onClick={handleCopy}\n >\n {copied ? (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n ) : (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <path d=\"M9.5 4.5V3a1.5 1.5 0 00-1.5-1.5H3A1.5 1.5 0 001.5 3v5A1.5 1.5 0 003 9.5h1.5\" />\n </svg>\n )}\n </button>\n )}\n\n {/* code */}\n <pre\n ref={ref}\n className=\"text-fg overflow-x-auto p-3 font-mono text-[11px] leading-relaxed\"\n data-selectable\n >\n <code>\n {lines.map((line, i) => (\n <div className=\"flex\" key={i}>\n {showLineNumbers && (\n <span className=\"text-fg-muted/30 mr-4 inline-block w-6 shrink-0 text-right select-none\">\n {i + 1}\n </span>\n )}\n <span className=\"flex-1\">{line || ' '}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n )\n }\n)\n","// collapsible — simple trigger + content toggle\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CollapsibleProps = {\n trigger: ReactNode\n children: ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n className?: string\n}\n\nconst Collapsible = forwardRef<HTMLDivElement, CollapsibleProps>(\n function Collapsible(\n {\n trigger,\n children,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n className,\n },\n ref\n ) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n function handleToggle() {\n const next = !isOpen\n if (!isControlled) {\n setInternalOpen(next)\n }\n if (onOpenChange !== undefined) {\n onOpenChange(next)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('w-full', className)}\n data-component=\"collapsible\"\n >\n <button\n aria-expanded={isOpen}\n className=\"w-full cursor-pointer text-left select-none\"\n onClick={handleToggle}\n type=\"button\"\n >\n {trigger}\n </button>\n <div\n className={cx(\n 'overflow-hidden transition-[max-height] duration-200',\n isOpen ? 'max-h-[2000px]' : 'max-h-0'\n )}\n data-state={isOpen ? 'open' : 'closed'}\n >\n {isOpen ? children : null}\n </div>\n </div>\n )\n }\n)\n\n// composition sub-components for admin compatibility\ntype CollapsibleTriggerProps = { children: ReactNode; className?: string }\nfunction CollapsibleTrigger({ children, className }: CollapsibleTriggerProps) {\n return <div className={className}>{children}</div>\n}\n\ntype CollapsibleContentProps = { children: ReactNode; className?: string }\nfunction CollapsibleContent({ children, className }: CollapsibleContentProps) {\n return <div className={className}>{children}</div>\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger }\nexport type {\n CollapsibleContentProps,\n CollapsibleProps,\n CollapsibleTriggerProps,\n}\n","// color-picker — preset swatches + custom hex input\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nconst DEFAULT_PRESETS = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#06b6d4',\n '#3b82f6',\n '#8b5cf6',\n '#ec4899',\n '#64748b',\n '#ffffff',\n]\n\nconst HEX_REGEX = /^#[0-9a-fA-F]{6}$/\n\nexport type ColorPickerProps = {\n value: string\n onChange: (color: string) => void\n presets?: string[]\n showInput?: boolean\n disabled?: boolean\n className?: string\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n function ColorPicker(\n { value, onChange, presets, showInput = true, disabled = false, className },\n ref\n ) {\n const swatches = presets ?? DEFAULT_PRESETS\n const [inputValue, setInputValue] = useState(value)\n\n const handleSwatchClick = useCallback(\n (color: string) => {\n if (disabled) return\n onChange(color)\n setInputValue(color)\n },\n [disabled, onChange]\n )\n\n const handleInputChange = useCallback(\n (raw: string) => {\n // ensure # prefix\n const normalized = raw.startsWith('#') ? raw : `#${raw}`\n setInputValue(normalized)\n\n if (HEX_REGEX.test(normalized)) {\n onChange(normalized)\n }\n },\n [onChange]\n )\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"color-picker\"\n data-disabled={disabled ? '' : undefined}\n >\n {/* current color preview */}\n <div className=\"gds-gap flex items-center\">\n <div\n className=\"gds-radius-button border-border h-8 w-8 shrink-0 border\"\n style={{ backgroundColor: value }}\n />\n <span className=\"gds-text-body text-fg-muted font-mono\">{value}</span>\n </div>\n\n {/* preset swatches */}\n <div className=\"flex flex-wrap gap-1.5\">\n {swatches.map((color) => {\n const isActive = color.toLowerCase() === value.toLowerCase()\n return (\n <button\n key={color}\n type=\"button\"\n disabled={disabled}\n onClick={() => handleSwatchClick(color)}\n className={cx(\n 'h-6 w-6 rounded-full border transition-shadow',\n isActive\n ? 'ring-accent ring-offset-bg border-transparent ring-2 ring-offset-1'\n : 'border-border hover:scale-110',\n disabled && 'cursor-not-allowed opacity-40',\n focusCls\n )}\n style={{ backgroundColor: color }}\n aria-label={`Select color ${color}`}\n />\n )\n })}\n </div>\n\n {/* hex input */}\n {showInput && (\n <div className=\"gds-gap flex items-center\">\n <span className=\"gds-text-body text-fg-muted font-mono select-none\">\n #\n </span>\n <input\n type=\"text\"\n value={inputValue.replace(/^#/, '')}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n maxLength={6}\n placeholder=\"000000\"\n className={cx(\n 'border-border gds-text-body text-fg w-20 rounded border bg-transparent px-2 py-1 font-mono',\n 'focus:border-accent focus:outline-none',\n disabled && 'cursor-not-allowed opacity-40'\n )}\n aria-label=\"Hex color input\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n","// combobox-list — dropdown option list for combobox (internal)\nimport { useCallback } from 'react'\n\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype ComboboxOption = {\n label: string\n value: string\n}\n\ntype ComboboxListProps = {\n creatable?: boolean\n filtered: ComboboxOption[]\n glass?: boolean\n highlightedIndex: number\n loading?: boolean\n onCreateOption?: (value: string) => void\n onSearchChange: (value: string) => void\n onSelect: (value: string) => void\n query: string\n searchPlaceholder: string\n searchRef: React.RefObject<HTMLInputElement | null>\n setHighlightedIndex: (index: number) => void\n value: string | null\n}\n\nfunction ComboboxList({\n creatable = false,\n filtered,\n glass,\n highlightedIndex,\n loading = false,\n onCreateOption,\n onSearchChange,\n onSelect,\n query,\n searchPlaceholder,\n searchRef,\n setHighlightedIndex,\n value,\n}: ComboboxListProps) {\n // determine if the \"Create\" row should appear\n const showCreate =\n creatable && query.trim() !== '' && filtered.length === 0 && !loading\n // total navigable items includes the create row\n const totalItems = filtered.length + (showCreate ? 1 : 0)\n\n const handleSearchKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIndex(\n highlightedIndex >= totalItems - 1 ? 0 : highlightedIndex + 1\n )\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIndex(\n highlightedIndex <= 0 ? totalItems - 1 : highlightedIndex - 1\n )\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n // if create row is highlighted\n if (showCreate && highlightedIndex === filtered.length) {\n if (onCreateOption !== undefined) {\n onCreateOption(query.trim())\n }\n return\n }\n const target = filtered[highlightedIndex]\n if (target !== undefined) {\n onSelect(target.value)\n }\n }\n },\n [\n filtered,\n highlightedIndex,\n onSelect,\n setHighlightedIndex,\n totalItems,\n showCreate,\n onCreateOption,\n query,\n ]\n )\n\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div className=\"border-border border-b p-1.5\">\n <input\n className=\"text-fg placeholder:text-fg-muted/50 w-full bg-transparent px-2 py-1 text-sm outline-none\"\n onChange={(e) => onSearchChange(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n placeholder={searchPlaceholder}\n ref={searchRef}\n type=\"text\"\n value={query}\n />\n </div>\n <div className=\"max-h-60 overflow-y-auto py-1\">\n {loading && (\n <div className=\"gds-pad-y-sm flex items-center justify-center\">\n <Spinner className=\"text-fg-muted h-4 w-4\" />\n </div>\n )}\n {!loading && filtered.length === 0 && !showCreate && (\n <div className=\"gds-pad-x gds-pad-y-sm text-fg-muted text-sm\">\n No results\n </div>\n )}\n {!loading &&\n filtered.map((opt, index) => {\n const isActive = opt.value === value\n const isHighlighted = index === highlightedIndex\n return (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm flex w-full items-center text-left text-sm transition-colors',\n isActive && 'bg-accent/10 text-accent',\n !isActive && 'text-fg',\n isHighlighted && !isActive && 'bg-bg-tertiary',\n !isHighlighted && !isActive && 'hover:bg-bg-tertiary'\n )}\n key={opt.value}\n onClick={() => onSelect(opt.value)}\n onMouseEnter={() => setHighlightedIndex(index)}\n type=\"button\"\n >\n {opt.label}\n </button>\n )\n })}\n {showCreate && (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm text-accent flex w-full items-center text-left text-sm transition-colors',\n highlightedIndex === filtered.length && 'bg-bg-tertiary',\n highlightedIndex !== filtered.length && 'hover:bg-bg-tertiary'\n )}\n onClick={() => {\n if (onCreateOption !== undefined) {\n onCreateOption(query.trim())\n }\n }}\n onMouseEnter={() => setHighlightedIndex(filtered.length)}\n type=\"button\"\n >\n Create: {query.trim()}\n </button>\n )}\n </div>\n </div>\n )\n}\n\nexport { ComboboxList }\nexport type { ComboboxListProps, ComboboxOption }\n","// combobox — searchable select dropdown\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport type { ComboboxOption } from './combobox-list'\nimport { ComboboxList } from './combobox-list'\n\ntype ComboboxProps = {\n className?: string\n creatable?: boolean\n debounce?: number\n disabled?: boolean\n error?: boolean\n glass?: boolean\n loading?: boolean\n onChange: (value: string | null) => void\n onCreateOption?: (value: string) => ComboboxOption\n onSearch?: (query: string) => Promise<ComboboxOption[]>\n options: ComboboxOption[]\n placeholder?: string\n searchPlaceholder?: string\n value: string | null\n}\n\n// chevron icon\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n function Combobox(\n {\n className,\n creatable = false,\n debounce: debounceDuration = 300,\n disabled = false,\n error = false,\n glass,\n loading: externalLoading = false,\n onChange,\n onCreateOption,\n onSearch,\n options,\n placeholder = 'Select...',\n searchPlaceholder = 'Search...',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const [asyncResults, setAsyncResults] = useState<ComboboxOption[] | null>(\n null\n )\n const [asyncLoading, setAsyncLoading] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n // merge forwarded ref with internal ref\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n // debounced async search\n useEffect(() => {\n if (onSearch === undefined) return\n if (!open) return\n\n if (query === '') {\n setAsyncResults(null)\n setAsyncLoading(false)\n return\n }\n\n setAsyncLoading(true)\n const timer = setTimeout(() => {\n onSearch(query)\n .then((results) => {\n setAsyncResults(results)\n setHighlightedIndex(0)\n })\n .finally(() => {\n setAsyncLoading(false)\n })\n }, debounceDuration)\n\n return () => {\n clearTimeout(timer)\n }\n }, [query, onSearch, open, debounceDuration])\n\n const isLoading = externalLoading || asyncLoading\n\n const filtered = useMemo(() => {\n // when async search is active, use async results\n if (onSearch !== undefined) {\n if (asyncResults !== null) return asyncResults\n return options\n }\n if (query === '') return options\n const lower = query.toLowerCase()\n return options.filter((opt) => opt.label.toLowerCase().includes(lower))\n }, [options, query, onSearch, asyncResults])\n\n const selectedOption = useMemo(\n () => options.find((opt) => opt.value === value),\n [options, value]\n )\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n setQuery('')\n setHighlightedIndex(0)\n // auto-focus search input after render\n requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n setQuery('')\n setAsyncResults(null)\n setAsyncLoading(false)\n }, [])\n\n const handleSelect = useCallback(\n (optionValue: string) => {\n onChange(optionValue)\n handleClose()\n },\n [onChange, handleClose]\n )\n\n const handleCreate = useCallback(\n (inputValue: string) => {\n if (onCreateOption === undefined) return\n const newOption = onCreateOption(inputValue)\n onChange(newOption.value)\n handleClose()\n },\n [onCreateOption, onChange, handleClose]\n )\n\n const handleSearchChange = useCallback((val: string) => {\n setQuery(val)\n setHighlightedIndex(0)\n }, [])\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"combobox\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span\n className={cx(\n selectedOption !== undefined ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {selectedOption !== undefined ? selectedOption.label : placeholder}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <ComboboxList\n creatable={creatable}\n filtered={filtered}\n glass={glass}\n highlightedIndex={highlightedIndex}\n loading={isLoading}\n onCreateOption={handleCreate}\n onSearchChange={handleSearchChange}\n onSelect={handleSelect}\n query={query}\n searchPlaceholder={searchPlaceholder}\n searchRef={searchRef}\n setHighlightedIndex={setHighlightedIndex}\n value={value}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { ComboboxOption, ComboboxProps }\n","// command-bar — horizontal action bar for selected items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type CommandBarAction = {\n danger?: boolean\n icon?: ReactNode\n id: string\n label: string\n}\n\nexport type CommandBarProps = {\n actions: CommandBarAction[]\n className?: string\n onAction: (id: string) => void\n onClear: () => void\n selectedCount: number\n}\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nexport const CommandBar = forwardRef<HTMLDivElement, CommandBarProps>(\n function CommandBar(\n { actions, className, onAction, onClear, selectedCount },\n ref\n ) {\n if (selectedCount <= 0) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y border-border bg-surface gds-radius flex items-center border',\n className\n )}\n data-component=\"command-bar\"\n >\n <span className=\"gds-text text-fg font-medium whitespace-nowrap select-none\">\n {selectedCount} selected\n </span>\n <div className=\"gds-gap-sm flex items-center\">\n {actions.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n className={cx(\n 'gds-gap-sm gds-text flex items-center rounded px-2 py-1 transition-colors',\n action.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary',\n focusCls\n )}\n onClick={() => onAction(action.id)}\n >\n {action.icon !== undefined && (\n <span className=\"shrink-0\">{action.icon}</span>\n )}\n {action.label}\n </button>\n ))}\n </div>\n <button\n aria-label=\"Clear selection\"\n className={cx(\n 'text-fg-muted hover:text-fg ml-auto shrink-0 p-1',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n {closeIcon}\n </button>\n </div>\n )\n }\n)\n","// command-bar-float — floating action button with expandable actions\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useEscapeKey } from '../utils/hooks'\n\nexport type FabAction = {\n icon: ReactNode\n id: string\n label: string\n onClick: () => void\n}\n\nexport type CommandBarFloatProps = {\n actions: FabAction[]\n className?: string\n}\n\nexport const CommandBarFloat = forwardRef<HTMLDivElement, CommandBarFloatProps>(\n function CommandBarFloat({ actions, className }, ref) {\n const [open, setOpen] = useState(false)\n\n const toggle = useCallback(() => setOpen((prev) => !prev), [])\n const close = useCallback(() => setOpen(false), [])\n\n useEscapeKey(open, close)\n\n return (\n <div\n ref={ref}\n className={cx(\n 'fixed right-6 bottom-6 z-40 flex flex-col-reverse items-end gap-3',\n className\n )}\n data-component=\"command-bar-float\"\n >\n <button\n type=\"button\"\n aria-label={open ? 'Close menu' : 'Open menu'}\n className={cx(\n 'bg-accent text-on-accent flex h-14 w-14 items-center justify-center rounded-full shadow-lg transition-transform duration-200',\n focusCls\n )}\n style={{ transform: open ? 'rotate(45deg)' : 'rotate(0deg)' }}\n onClick={toggle}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n {open && (\n <div className=\"flex flex-col-reverse items-end gap-2\">\n {actions.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n className={cx(\n 'gds-gap-sm bg-surface border-border text-fg hover:bg-bg-tertiary flex items-center rounded-full border px-4 py-2 shadow-md transition-colors',\n focusCls\n )}\n onClick={() => {\n action.onClick()\n close()\n }}\n >\n <span className=\"shrink-0\">{action.icon}</span>\n <span className=\"gds-text whitespace-nowrap\">\n {action.label}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","// command-menu — inline command menu with search and keyboard navigation\nimport type { ReactNode } from 'react'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\n\nexport type CommandMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n group?: string\n danger?: boolean\n}\n\nexport type CommandMenuProps = {\n items: CommandMenuItem[]\n onSelect: (id: string) => void\n searchable?: boolean\n placeholder?: string\n glass?: boolean\n className?: string\n}\n\nexport function CommandMenu({\n items,\n onSelect,\n searchable = true,\n placeholder = 'Type a command...',\n glass,\n className,\n}: CommandMenuProps) {\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n\n const filtered = useMemo(() => {\n if (query === '') return items\n const q = query.toLowerCase()\n return items.filter((it) => it.label.toLowerCase().includes(q))\n }, [items, query])\n\n const groups = useMemo(() => {\n const map = new Map<string, CommandMenuItem[]>()\n for (const it of filtered) {\n const g = it.group ?? ''\n const arr = map.get(g)\n if (arr !== undefined) {\n arr.push(it)\n } else {\n map.set(g, [it])\n }\n }\n return map\n }, [filtered])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((p) => (p + 1) % filtered.length)\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((p) => (p - 1 + filtered.length) % filtered.length)\n } else if (isActivationKey(e)) {\n e.preventDefault()\n const it = filtered[activeIndex]\n if (it !== undefined) {\n onSelect(it.id)\n }\n }\n },\n [filtered, activeIndex, onSelect]\n )\n\n let flatIdx = -1\n const glassCx =\n glass !== undefined && glass !== false\n ? cx('border-white/10 bg-bg/60', glassClass(glass))\n : ''\n\n return (\n <div\n className={cx(\n 'gds-radius-card border-border overflow-hidden border',\n glassCx,\n className\n )}\n data-component=\"command-menu\"\n onKeyDown={handleKeyDown}\n >\n {searchable && (\n <div className=\"border-border border-b\">\n <input\n type=\"text\"\n data-testid=\"command-menu-search\"\n placeholder={placeholder}\n className={cx(\n 'gds-pad-x gds-pad-y text-fg placeholder:text-fg-muted/40 w-full bg-transparent text-sm outline-none',\n focusCls\n )}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n setActiveIndex(0)\n }}\n />\n </div>\n )}\n <div className=\"gds-pad-y-sm max-h-64 overflow-y-auto\">\n {filtered.length === 0 && (\n <div className=\"text-fg-muted/40 py-6 text-center text-sm\">\n No results\n </div>\n )}\n {Array.from(groups.entries()).map(([group, gItems]) => (\n <div key={group}>\n {group !== '' && (\n <div className=\"text-fg-muted/30 px-3 pt-3 pb-1 text-[10px] font-semibold tracking-[0.1em] uppercase\">\n {group}\n </div>\n )}\n {gItems.map((it) => {\n flatIdx++\n const active = flatIdx === activeIndex\n return (\n <button\n key={it.id}\n type=\"button\"\n onClick={() => onSelect(it.id)}\n data-active={active}\n data-testid={`command-menu-item-${it.id}`}\n className={cx(\n 'gds-text-body flex w-full items-center gap-3 px-3 py-2 text-left transition-colors select-none',\n active ? 'bg-accent/10 text-accent' : '',\n it.danger === true\n ? 'text-danger'\n : active\n ? ''\n : 'text-fg hover:bg-white/[0.04]'\n )}\n >\n {it.icon !== undefined && (\n <span className=\"text-fg-muted/50 flex h-5 w-5 shrink-0 items-center justify-center\">\n {it.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{it.label}</span>\n {it.shortcut !== undefined && (\n <kbd className=\"text-fg-muted/30 shrink-0 rounded border border-white/[0.06] bg-white/[0.03] px-1.5 py-px text-[10px]\">\n {it.shortcut}\n </kbd>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","// comparison-bar — SVG horizontal stacked bar chart\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type Segment = {\n color: string\n label: string\n value: number\n}\n\nexport type ComparisonBarProps = {\n className?: string\n height?: number\n segments: Segment[]\n showLabels?: boolean\n}\n\nexport const ComparisonBar = forwardRef<HTMLDivElement, ComparisonBarProps>(\n function ComparisonBar(\n { className, height = 24, segments, showLabels },\n ref\n ) {\n const total = useMemo(\n () => segments.reduce((sum, s) => sum + s.value, 0),\n [segments]\n )\n\n if (total <= 0) return null\n\n let offset = 0\n\n return (\n <div\n ref={ref}\n className={cx('w-full', className)}\n data-component=\"comparison-bar\"\n >\n <svg width=\"100%\" height={height} className=\"overflow-visible rounded\">\n {segments.map((seg) => {\n const widthPct = (seg.value / total) * 100\n const x = offset\n offset += widthPct\n return (\n <rect\n key={seg.label}\n x={`${x}%`}\n y={0}\n width={`${widthPct}%`}\n height={height}\n fill={seg.color}\n rx={0}\n />\n )\n })}\n </svg>\n {showLabels === true && (\n <div className=\"gds-gap-sm mt-2 flex flex-wrap\">\n {segments.map((seg) => (\n <div\n key={seg.label}\n className=\"gds-gap-sm text-fg-muted flex items-center text-xs\"\n >\n <span\n className=\"inline-block h-2.5 w-2.5 rounded-sm\"\n style={{ backgroundColor: seg.color }}\n />\n <span>{seg.label}</span>\n <span className=\"text-fg font-medium\">\n {Math.round((seg.value / total) * 100)}%\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","// dialog — modal overlay with focus trap, scroll lock, escape key\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\nimport { renderPortal } from '../utils/portal'\n\ntype DialogWidth = 'default' | 'lg' | 'md' | 'sm' | 'xl'\n\nconst widthMap: Record<DialogWidth, string> = {\n sm: 'max-w-sm',\n md: 'max-w-lg',\n default: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n}\n\nexport type DialogProps = {\n /** Whether the dialog is visible */\n open: boolean\n /** Called when backdrop click, escape key, or close button */\n onClose: () => void\n /** Header title text */\n title?: string\n /** Subtitle shown below the title */\n description?: string\n children: ReactNode\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Max-width preset for the dialog panel */\n width?: DialogWidth\n className?: string\n}\n\nexport const Dialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(\n {\n open,\n onClose,\n title,\n description,\n children,\n glass,\n width = 'default',\n className,\n },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n return renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"dialog\"\n data-state=\"open\"\n >\n <div\n ref={(node) => {\n // merge refs\n ;(trapRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }}\n className={cx(\n 'gds-ctx animate-popup gds-radius-card gds-shadow-xl w-full border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n widthMap[width],\n className\n )}\n >\n {(title !== undefined || description !== undefined) && (\n <div className=\"gds-gap border-border gds-pad-x-lg gds-pad-y-lg flex items-start justify-between border-b\">\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"gds-pad-x-lg gds-pad-y-lg\">{children}</div>\n </div>\n </div>\n )\n})\n\ntype DialogFooterProps = {\n children: ReactNode\n className?: string\n}\n\nfunction DialogFooter({ children, className }: DialogFooterProps) {\n return (\n <div\n className={cx(\n 'gds-gap-sm border-border gds-pad-x-lg gds-pad-y flex items-center justify-end border-t',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nexport { DialogFooter }\nexport type { DialogFooterProps }\n","// confirm-dialog — pre-composed confirmation dialog with cancel/confirm buttons\nimport { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { Dialog } from './dialog'\n\ntype ConfirmDialogProps = {\n cancelLabel?: string\n className?: string\n confirmLabel?: string\n loading?: boolean\n message?: string\n onClose: () => void\n onConfirm: () => void\n open: boolean\n title?: string\n variant?: 'danger' | 'default'\n}\n\nexport const ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(\n function ConfirmDialog(\n {\n cancelLabel = 'Cancel',\n className,\n confirmLabel = 'Confirm',\n loading = false,\n message,\n onClose,\n onConfirm,\n open,\n title = 'Confirm',\n variant = 'default',\n },\n ref\n ) {\n return (\n <Dialog\n className={className}\n onClose={onClose}\n open={open}\n ref={ref}\n title={title}\n width=\"sm\"\n >\n <div\n className=\"gds-gap flex flex-col\"\n data-component=\"confirm-dialog\"\n data-variant={variant}\n >\n {message !== undefined && (\n <p className=\"gds-text-body text-fg-muted\">{message}</p>\n )}\n <div className=\"gds-gap-sm flex items-center justify-end\">\n <Button\n disabled={loading}\n onClick={onClose}\n size=\"sm\"\n variant=\"ghost\"\n >\n {cancelLabel}\n </Button>\n <Button\n disabled={loading}\n onClick={onConfirm}\n size=\"sm\"\n variant={variant === 'danger' ? 'danger' : 'primary'}\n >\n {loading ? 'Loading...' : confirmLabel}\n </Button>\n </div>\n </div>\n </Dialog>\n )\n }\n)\n\nexport type { ConfirmDialogProps }\n","// context-menu — right-click triggered floating menu\nimport type { ReactNode } from 'react'\nimport { useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nexport type ContextMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n danger?: boolean\n disabled?: boolean\n separator?: boolean\n}\n\nexport type ContextMenuProps = {\n trigger: ReactNode\n items: ContextMenuItem[]\n onSelect: (id: string) => void\n className?: string\n}\n\nexport function ContextMenu({\n trigger,\n items,\n onSelect,\n className,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false)\n const [pos, setPos] = useState({ x: 0, y: 0 })\n const menuRef = useRef<HTMLDivElement>(null)\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(menuRef, open, close)\n useEscapeKey(open, close)\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setPos({ x: e.clientX, y: e.clientY })\n setOpen(true)\n }, [])\n\n const handleSelect = useCallback(\n (id: string) => {\n setOpen(false)\n onSelect(id)\n },\n [onSelect]\n )\n\n return (\n <div\n className={className}\n data-component=\"context-menu\"\n data-state={open ? 'open' : 'closed'}\n onContextMenu={handleContextMenu}\n >\n {trigger}\n {open && (\n <div\n ref={menuRef}\n className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg fixed z-50 min-w-[160px] border py-1\"\n style={{ left: pos.x, top: pos.y }}\n >\n {items.map((item) => {\n if (item.separator) {\n return <div key={item.id} className=\"bg-border my-1 h-px\" />\n }\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n className={cx(\n 'gds-gap-sm gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center text-left',\n focusCls,\n item.danger\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-secondary',\n item.disabled === true && 'pointer-events-none opacity-40'\n )}\n onClick={() => handleSelect(item.id)}\n >\n {item.icon !== undefined && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.shortcut !== undefined && (\n <span className=\"gds-text-caption text-fg-muted ml-4\">\n {item.shortcut}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","// copy-field — read-only text field with copy button\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CopyFieldProps = {\n value: string\n label?: string\n masked?: boolean\n className?: string\n}\n\nconst CopyField = forwardRef<HTMLDivElement, CopyFieldProps>(function CopyField(\n { value, label, masked = false, className },\n ref\n) {\n const [copied, setCopied] = useState(false)\n const [revealed, setRevealed] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(value).catch(() => {})\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setCopied(false), 1500)\n }, [value])\n\n const display =\n masked && !revealed ? '\\u2022'.repeat(Math.min(value.length, 20)) : value\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-1', className)}\n data-component=\"copy-field\"\n >\n {label !== undefined && (\n <label className=\"text-fg-muted text-xs select-none\">{label}</label>\n )}\n <div className=\"border-border bg-surface flex items-center gap-2 rounded-md border px-3 py-1.5\">\n <span\n className=\"text-fg flex-1 truncate font-mono text-sm select-all\"\n onMouseEnter={masked ? () => setRevealed(true) : undefined}\n onMouseLeave={masked ? () => setRevealed(false) : undefined}\n >\n {display}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"text-fg-muted hover:text-fg shrink-0 transition-colors\"\n aria-label=\"Copy\"\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 7l3 3 7-7\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n )\n})\n\nexport { CopyField }\nexport type { CopyFieldProps }\n","// copy-to-clipboard — inline wrapper that copies a value on click with feedback tooltip\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\n\nexport type CopyToClipboardProps = {\n children: ReactNode\n value: string\n feedback?: string\n className?: string\n}\n\nexport const CopyToClipboard = forwardRef<\n HTMLSpanElement,\n CopyToClipboardProps\n>(function CopyToClipboard(\n { children, value, feedback = 'Copied!', className },\n ref\n) {\n const [showFeedback, setShowFeedback] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleClick = useCallback(() => {\n navigator.clipboard\n .writeText(value)\n .then(() => {\n setShowFeedback(true)\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n timerRef.current = setTimeout(() => {\n setShowFeedback(false)\n timerRef.current = null\n }, 2000)\n })\n .catch(() => {\n // clipboard api not available\n })\n }, [value])\n\n return (\n <span\n ref={ref}\n className={cx(\n 'relative inline-flex cursor-pointer select-none',\n focusCls,\n className\n )}\n data-component=\"copy-to-clipboard\"\n onClick={handleClick}\n onKeyDown={(e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n {showFeedback && (\n <span className=\"bg-fg text-bg absolute -top-8 left-1/2 -translate-x-1/2 rounded px-2 py-0.5 text-[11px] whitespace-nowrap shadow-md\">\n {feedback}\n </span>\n )}\n </span>\n )\n})\n","// countdown-timer — DD:HH:MM:SS countdown to a target date\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountdownTimerProps = {\n className?: string\n label?: string\n onComplete?: () => void\n target: Date\n}\n\nfunction computeRemaining(target: Date): {\n dd: string\n hh: string\n mm: string\n ss: string\n done: boolean\n} {\n const diff = Math.max(0, target.getTime() - Date.now())\n const done = diff <= 0\n const totalSec = Math.floor(diff / 1000)\n const dd = String(Math.floor(totalSec / 86400)).padStart(2, '0')\n const hh = String(Math.floor((totalSec % 86400) / 3600)).padStart(2, '0')\n const mm = String(Math.floor((totalSec % 3600) / 60)).padStart(2, '0')\n const ss = String(totalSec % 60).padStart(2, '0')\n return { dd, hh, mm, ss, done }\n}\n\nexport const CountdownTimer = forwardRef<HTMLDivElement, CountdownTimerProps>(\n function CountdownTimer({ className, label, onComplete, target }, ref) {\n const [remaining, setRemaining] = useState(() => computeRemaining(target))\n\n useEffect(() => {\n const id = setInterval(() => {\n const next = computeRemaining(target)\n setRemaining(next)\n if (next.done) {\n clearInterval(id)\n onComplete?.()\n }\n }, 1000)\n return () => clearInterval(id)\n }, [target, onComplete])\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col items-center', className)}\n data-component=\"countdown-timer\"\n >\n {label !== undefined && (\n <span className=\"gds-text text-fg-muted\">{label}</span>\n )}\n <div className=\"text-fg flex items-center gap-1 font-mono text-2xl font-bold tabular-nums\">\n <span>{remaining.dd}</span>:<span>{remaining.hh}</span>:\n <span>{remaining.mm}</span>:<span>{remaining.ss}</span>\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CurrencyDisplayProps = React.HTMLAttributes<HTMLDivElement> & {\n amount: number\n change?: number\n currency?: string\n period?: string\n}\n\nexport const CurrencyDisplay = forwardRef<HTMLDivElement, CurrencyDisplayProps>(\n function CurrencyDisplay(\n { amount, change, className, currency = '\\u00a5', period, ...props },\n ref\n ) {\n const formatted = amount.toLocaleString()\n\n return (\n <div\n className={cx('gds-gap flex items-baseline', className)}\n data-component=\"currency-display\"\n ref={ref}\n {...props}\n >\n <span className=\"text-fg text-2xl font-bold\">\n {currency}\n {formatted}\n </span>\n {change !== undefined && (\n <span\n className={cx(\n 'text-sm font-medium',\n change >= 0 ? 'text-success' : 'text-danger'\n )}\n >\n {change >= 0 ? '\\u2191' : '\\u2193'}\n {Math.abs(change)}%\n </span>\n )}\n {period !== undefined && (\n <span className=\"text-fg-muted text-xs\">{period}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { CurrencyDisplayProps }\n","// currency-input — formatted number input with currency symbol\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type CurrencyInputProps = {\n value: number | null\n onChange: (value: number | null) => void\n currency?: string\n locale?: string\n min?: number\n max?: number\n disabled?: boolean\n error?: boolean\n placeholder?: string\n className?: string\n}\n\nfunction formatNumber(num: number, locale: string): string {\n return new Intl.NumberFormat(locale).format(num)\n}\n\nfunction clampValue(val: number, min?: number, max?: number): number {\n let result = val\n if (min !== undefined && result < min) result = min\n if (max !== undefined && result > max) result = max\n return result\n}\n\nexport const CurrencyInput = forwardRef<HTMLDivElement, CurrencyInputProps>(\n function CurrencyInput(\n {\n value,\n onChange,\n currency = '\\u00a5',\n locale = 'ja-JP',\n min,\n max,\n disabled = false,\n error = false,\n placeholder = '0',\n className,\n },\n ref\n ) {\n const [editing, setEditing] = useState(false)\n const [inputValue, setInputValue] = useState('')\n\n const displayValue = value !== null ? formatNumber(value, locale) : ''\n\n const handleFocus = useCallback(() => {\n setEditing(true)\n setInputValue(value !== null ? String(value) : '')\n }, [value])\n\n const handleBlur = useCallback(() => {\n setEditing(false)\n const stripped = inputValue.replace(/[^\\d.-]/g, '')\n if (stripped === '' || stripped === '-') {\n onChange(null)\n return\n }\n const parsed = Number(stripped)\n if (Number.isNaN(parsed)) {\n onChange(null)\n return\n }\n onChange(clampValue(parsed, min, max))\n }, [inputValue, max, min, onChange])\n\n const handleChange = useCallback((raw: string) => {\n // allow digits, minus, and dot during editing\n const cleaned = raw.replace(/[^\\d.-]/g, '')\n setInputValue(cleaned)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-h gds-radius-input inline-flex items-center border',\n error ? 'border-danger' : 'border-border',\n disabled && 'cursor-not-allowed opacity-40',\n className\n )}\n data-component=\"currency-input\"\n data-disabled={disabled ? '' : undefined}\n data-error={error ? '' : undefined}\n >\n <span className=\"text-fg-muted gds-text-body pl-3 select-none\">\n {currency}\n </span>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={editing ? inputValue : displayValue}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n placeholder={placeholder}\n className={cx(\n 'text-fg gds-text-body flex-1 bg-transparent px-2 text-right focus:outline-none',\n focusCls\n )}\n aria-label=\"Currency amount\"\n />\n </div>\n )\n }\n)\n","// data-card — metric card with title, value, optional change indicator and footer\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype DataCardChangeType = 'down' | 'neutral' | 'up'\n\nconst changeColors: Record<DataCardChangeType, string> = {\n down: 'text-danger',\n neutral: 'text-fg-muted',\n up: 'text-success',\n}\n\nexport type DataCardProps = {\n title: string\n value: number | string\n change?: string\n changeType?: DataCardChangeType\n icon?: ReactNode\n footer?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const DataCard = forwardRef<HTMLDivElement, DataCardProps>(\n function DataCard(\n {\n title,\n value,\n change,\n changeType = 'neutral',\n icon,\n footer,\n glass,\n className,\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-radius border-border/40 bg-surface gds-pad border select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"data-card\"\n >\n <div className=\"flex items-start justify-between\">\n <span className=\"gds-text-body text-fg-muted\">{title}</span>\n {icon !== undefined && (\n <span className=\"text-fg-muted/30\">{icon}</span>\n )}\n </div>\n\n <div className=\"text-fg mt-2 text-xl font-bold\">{value}</div>\n\n {change !== undefined && (\n <div\n className={cx(\n 'mt-1 flex items-center gap-1 text-[11px]',\n changeColors[changeType]\n )}\n >\n {changeType === 'up' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 12l5-5 3 3 5-6\" />\n <path d=\"M11 4h4v4\" />\n </svg>\n )}\n {changeType === 'down' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 4l5 5 3-3 5 6\" />\n <path d=\"M11 12h4V8\" />\n </svg>\n )}\n <span>{change}</span>\n </div>\n )}\n\n {footer !== undefined && (\n <div className=\"border-border/20 text-fg-muted/50 mt-3 border-t pt-2 text-[10px]\">\n {footer}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { DataCardChangeType }\n","// date-display — formatted date with relative time support\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DateDisplayProps = {\n date: string | Date\n format?: 'relative' | 'absolute' | 'auto'\n className?: string\n}\n\nfunction formatRelative(ms: number): string {\n const sec = Math.floor(ms / 1000)\n if (sec < 60) return 'just now'\n const min = Math.floor(sec / 60)\n if (min < 60) return `${min}m ago`\n const hrs = Math.floor(min / 60)\n if (hrs < 24) return `${hrs}h ago`\n if (hrs < 48) return 'yesterday'\n return `${Math.floor(hrs / 24)} days ago`\n}\n\nfunction formatAbsolute(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nconst SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000\n\nconst DateDisplay = forwardRef<HTMLSpanElement, DateDisplayProps>(\n function DateDisplay({ date, format = 'auto', className }, ref) {\n const text = useMemo(() => {\n const d = date instanceof Date ? date : new Date(date)\n const elapsed = Date.now() - d.getTime()\n\n if (format === 'relative') return formatRelative(elapsed)\n if (format === 'absolute') return formatAbsolute(d)\n\n // auto: relative if < 7 days\n return elapsed < SEVEN_DAYS ? formatRelative(elapsed) : formatAbsolute(d)\n }, [date, format])\n\n const d = date instanceof Date ? date : new Date(date)\n\n return (\n <span\n ref={ref}\n className={cx('text-fg-muted gds-text', className)}\n data-component=\"date-display\"\n title={d.toISOString()}\n >\n {text}\n </span>\n )\n }\n)\n\nexport { DateDisplay }\nexport type { DateDisplayProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DateRangeInputProps = {\n className?: string\n disabled?: boolean\n endDate: string | null\n error?: boolean\n onChange: (start: string | null, end: string | null) => void\n placeholder?: { end?: string; start?: string }\n startDate: string | null\n}\n\nexport const DateRangeInput = forwardRef<HTMLDivElement, DateRangeInputProps>(\n function DateRangeInput(\n {\n className,\n disabled = false,\n endDate,\n error = false,\n onChange,\n placeholder,\n startDate,\n },\n ref\n ) {\n const borderCls = error\n ? 'border-danger'\n : 'border-border hover:border-border-strong'\n\n return (\n <div\n className={cx(\n 'gds-radius-input bg-bg flex items-center border transition-colors',\n borderCls,\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"date-range-input\"\n data-error={error ? '' : undefined}\n ref={ref}\n >\n <input\n aria-label={placeholder?.start ?? 'Start date'}\n className=\"gds-h gds-text-body text-fg gds-pad-x flex-1 bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n onChange={(e) => {\n const val = e.target.value === '' ? null : e.target.value\n onChange(val, endDate)\n }}\n placeholder={placeholder?.start}\n type=\"date\"\n value={startDate ?? ''}\n />\n <span className=\"text-fg-muted/40 gds-text-label shrink-0 select-none\">\n &rarr;\n </span>\n <input\n aria-label={placeholder?.end ?? 'End date'}\n className=\"gds-h gds-text-body text-fg gds-pad-x flex-1 border-l border-inherit bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n min={startDate ?? undefined}\n onChange={(e) => {\n const val = e.target.value === '' ? null : e.target.value\n onChange(startDate, val)\n }}\n placeholder={placeholder?.end}\n type=\"date\"\n value={endDate ?? ''}\n />\n </div>\n )\n }\n)\n\nexport type { DateRangeInputProps }\n","// description — title + muted body text pair for inline descriptions\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DescriptionProps = {\n children: ReactNode\n title?: string\n className?: string\n}\n\nexport const Description = forwardRef<HTMLDivElement, DescriptionProps>(\n function Description({ children, title, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('space-y-0.5', className)}\n data-component=\"description\"\n >\n {title !== undefined && (\n <div className=\"gds-text-body text-fg font-medium\">{title}</div>\n )}\n <div className=\"gds-text-body text-fg-muted\">{children}</div>\n </div>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype DockItem = {\n icon: ReactNode\n id: string\n label: string\n}\n\ntype DockProps = React.HTMLAttributes<HTMLDivElement> & {\n glass?: boolean\n items: DockItem[]\n onSelect: (id: string) => void\n}\n\nexport const Dock = forwardRef<HTMLDivElement, DockProps>(function Dock(\n { className, glass = true, items, onSelect, ...props },\n ref\n) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n return (\n <div\n className={cx(\n 'gds-radius-card inline-flex items-end gap-1 p-2',\n 'bg-bg-secondary/80 border border-white/[0.06]',\n glassClass(glass === true ? true : undefined),\n glass === true && 'border-white/10',\n className\n )}\n data-component=\"dock\"\n ref={ref}\n {...props}\n >\n {items.map((item, index) => {\n const isHovered = hoveredIndex === index\n const isNeighbor =\n hoveredIndex !== null && Math.abs(index - hoveredIndex) === 1\n\n let scale = 1\n if (isHovered) {\n scale = 1.3\n } else if (isNeighbor) {\n scale = 1.1\n }\n\n return (\n <div\n key={item.id}\n className=\"group relative flex flex-col items-center\"\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {/* tooltip */}\n <span\n className={cx(\n 'bg-bg-secondary text-fg-muted pointer-events-none absolute -top-8 rounded-md px-2 py-1 text-[10px] whitespace-nowrap shadow-lg',\n 'transition-opacity duration-150',\n isHovered ? 'opacity-100' : 'opacity-0'\n )}\n data-testid={`dock-tooltip-${item.id}`}\n >\n {item.label}\n </span>\n\n {/* icon button */}\n <button\n className={cx(\n 'flex items-center justify-center rounded-lg p-2',\n 'transition-transform duration-200',\n 'hover:bg-white/[0.06]'\n )}\n data-testid={`dock-item-${item.id}`}\n onClick={() => onSelect(item.id)}\n style={{\n transform: `scale(${scale})`,\n transitionTimingFunction:\n 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n }}\n type=\"button\"\n >\n <span className=\"gds-icon-child\">{item.icon}</span>\n </button>\n </div>\n )\n })}\n </div>\n )\n})\n\nexport type { DockItem, DockProps }\n","// download-button — button with progress and completion state for downloads\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type DownloadButtonProps = {\n label: string\n progress?: number\n complete?: boolean\n onClick: () => void\n disabled?: boolean\n className?: string\n}\n\nexport const DownloadButton = forwardRef<\n HTMLButtonElement,\n DownloadButtonProps\n>(function DownloadButton(\n { label, progress, complete = false, onClick, disabled = false, className },\n ref\n) {\n const isDownloading = progress !== undefined && !complete\n const isDisabled = disabled || isDownloading\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx(\n 'gds-radius-button border-border bg-bg text-fg inline-flex items-center gap-2 border px-4 py-2 text-sm font-medium transition-colors select-none',\n 'hover:bg-bg-secondary',\n isDisabled && 'cursor-not-allowed opacity-50',\n complete && 'border-success/30 text-success',\n focusCls,\n className\n )}\n data-component=\"download-button\"\n disabled={isDisabled}\n onClick={onClick}\n >\n {complete && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8.5l4 4 6-7\" />\n </svg>\n <span>Downloaded</span>\n </>\n )}\n {!complete && isDownloading && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"animate-spin\"\n >\n <path d=\"M8 2a6 6 0 1 0 6 6\" />\n </svg>\n <span className=\"tabular-nums\">{progress}%</span>\n </>\n )}\n {!complete && !isDownloading && (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 2v8M4.5 7.5L8 11l3.5-3.5\" />\n <path d=\"M3 13h10\" />\n </svg>\n <span>{label}</span>\n </>\n )}\n </button>\n )\n})\n","// drawer — mobile-first bottom drawer with slide-up transition\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\n\ntype DrawerHeight = 'sm' | 'default' | 'lg' | 'full'\n\nconst heightMap: Record<DrawerHeight, string> = {\n sm: 'h-[30vh]',\n default: 'h-[50vh]',\n lg: 'h-[75vh]',\n full: 'h-screen',\n}\n\nexport type DrawerProps = {\n open: boolean\n onClose: () => void\n title?: string\n children: ReactNode\n height?: DrawerHeight\n glass?: boolean\n className?: string\n}\n\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n { open, onClose, title, children, height = 'default', glass, className },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"drawer\"\n data-state=\"open\"\n >\n <div\n ref={mergeRefs(ref, trapRef)}\n className={cx(\n 'gds-ctx fixed inset-x-0 bottom-0 flex flex-col rounded-t-xl border-t transition-transform duration-200',\n heightMap[height],\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n className\n )}\n >\n {/* drag handle */}\n <div className=\"flex justify-center py-2\">\n <div\n className=\"bg-fg-muted/30 h-1 w-8 rounded-full\"\n data-testid=\"drag-handle\"\n />\n </div>\n\n {/* header */}\n {title !== undefined && (\n <div className=\"gds-pad-x-lg flex items-center justify-between pb-2\">\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* content */}\n <div className=\"gds-pad-x-lg gds-pad-y-lg flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n )\n})\n","// drop-zone — file drop area with drag-over visual feedback\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DropZoneProps = {\n onDrop: (files: File[]) => void\n accept?: string\n active?: boolean\n children?: ReactNode\n glass?: boolean\n className?: string\n}\n\nexport const DropZone = forwardRef<HTMLDivElement, DropZoneProps>(\n function DropZone(\n { onDrop, accept, active, children, glass, className },\n ref\n ) {\n const [dragOver, setDragOver] = useState(false)\n\n const isActive = active === true || dragOver\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n onDrop(files)\n },\n [onDrop]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-radius flex flex-col items-center justify-center border-2 border-dashed p-8 transition-colors',\n focusCls,\n isActive\n ? 'border-accent bg-accent/5'\n : 'border-border/40 bg-bg-secondary/20',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"drop-zone\"\n data-state={isActive ? 'active' : 'idle'}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {children ?? (\n <span className=\"text-fg-muted text-sm select-none\">\n Drop files here\n </span>\n )}\n {accept !== undefined && (\n <span className=\"text-fg-muted/60 text-xs\">{accept}</span>\n )}\n </div>\n )\n }\n)\n","// dropdown — trigger + floating menu with items\nimport type { ReactNode } from 'react'\nimport { useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nexport type DropdownItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n danger?: boolean\n disabled?: boolean\n separator?: boolean\n}\n\ntype DropdownAlign = 'end' | 'start'\n\nexport type DropdownProps = {\n items: DropdownItem[]\n onSelect: (id: string) => void\n trigger: ReactNode\n align?: DropdownAlign\n glass?: boolean\n className?: string\n}\n\nexport function Dropdown({\n items,\n onSelect,\n trigger,\n align = 'start',\n glass,\n className,\n}: DropdownProps) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n useClickOutside(ref, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"dropdown\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n className={focusCls}\n >\n {trigger}\n </button>\n\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute z-50 mt-1 min-w-[160px] border py-1',\n align === 'end' ? 'right-0' : 'left-0',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n {items.map((item) => {\n if (item.separator) {\n return <div key={item.id} className=\"bg-border my-1 h-px\" />\n }\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-gap-sm gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center transition-colors',\n focusCls,\n item.danger\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary',\n item.disabled === true && 'pointer-events-none opacity-40'\n )}\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.shortcut !== undefined && (\n <span className=\"gds-text-caption text-fg-muted ml-4\">\n {item.shortcut}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","// editable — inline editable text, click to edit, enter/blur to save, escape to cancel\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype EditableProps = {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n className?: string\n}\n\nconst Editable = forwardRef<HTMLSpanElement, EditableProps>(function Editable(\n { value, onChange, placeholder = 'Click to edit', disabled, className },\n ref\n) {\n const [editing, setEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const startEditing = useCallback(() => {\n if (disabled === true) return\n setDraft(value)\n setEditing(true)\n // auto-focus happens via autoFocus prop\n }, [disabled, value])\n\n const save = useCallback(() => {\n setEditing(false)\n onChange(draft)\n }, [draft, onChange])\n\n const cancel = useCallback(() => {\n setEditing(false)\n setDraft(value)\n }, [value])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n save()\n }\n if (e.key === 'Escape') {\n cancel()\n }\n },\n [save, cancel]\n )\n\n if (editing) {\n return (\n <input\n ref={inputRef}\n autoFocus\n className={cx(\n 'gds-text-body text-fg bg-transparent underline outline-none',\n focusCls,\n className\n )}\n data-component=\"editable\"\n data-state=\"editing\"\n onBlur={save}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n type=\"text\"\n value={draft}\n />\n )\n }\n\n const isEmpty = value === ''\n\n return (\n <span\n ref={ref}\n className={cx(\n 'gds-text-body inline cursor-pointer hover:underline',\n disabled === true && 'pointer-events-none opacity-50',\n isEmpty ? 'text-fg-muted' : 'text-fg',\n focusCls,\n className\n )}\n data-component=\"editable\"\n data-state=\"display\"\n onClick={startEditing}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n startEditing()\n }\n }}\n role=\"button\"\n tabIndex={disabled === true ? -1 : 0}\n >\n {isEmpty ? placeholder : value}\n </span>\n )\n})\n\nexport { Editable }\nexport type { EditableProps }\n","// emoji-picker — grid of emoji buttons with category tabs and search\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EmojiCategory = {\n name: string\n emojis: string[]\n}\n\nconst defaultCategories: EmojiCategory[] = [\n {\n name: 'Smileys',\n emojis: [\n '😀',\n '😂',\n '🥹',\n '😍',\n '🤔',\n '😎',\n '🥳',\n '😴',\n '🤯',\n '😱',\n '🙄',\n '😤',\n ],\n },\n {\n name: 'Gestures',\n emojis: [\n '👍',\n '👎',\n '👏',\n '🤝',\n '✌️',\n '🤞',\n '🫶',\n '💪',\n '🙏',\n '👋',\n '🫡',\n '🤙',\n ],\n },\n {\n name: 'Animals',\n emojis: [\n '🐶',\n '🐱',\n '🐻',\n '🦊',\n '🐸',\n '🐵',\n '🦁',\n '🐧',\n '🦋',\n '🐝',\n '🐢',\n '🐬',\n ],\n },\n {\n name: 'Objects',\n emojis: [\n '🔥',\n '⭐',\n '💡',\n '🎯',\n '🚀',\n '💎',\n '🎉',\n '📌',\n '🔔',\n '💬',\n '❤️',\n '✅',\n ],\n },\n]\n\nexport type EmojiPickerProps = React.HTMLAttributes<HTMLDivElement> & {\n onSelect: (emoji: string) => void\n categories?: EmojiCategory[]\n columns?: number\n glass?: boolean\n}\n\nexport const EmojiPicker = forwardRef<HTMLDivElement, EmojiPickerProps>(\n function EmojiPicker(\n {\n onSelect,\n categories = defaultCategories,\n columns = 8,\n glass = false,\n className,\n ...props\n },\n ref\n ) {\n const [activeTab, setActiveTab] = useState(0)\n const [search, setSearch] = useState('')\n\n const filteredEmojis = useMemo(() => {\n if (search === '') return categories[activeTab]?.emojis ?? []\n // flatten and filter (search matches category name loosely)\n return categories.flatMap((cat) => cat.emojis)\n }, [search, activeTab, categories])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border w-fit rounded-lg border p-2 shadow-lg',\n glass ? 'bg-bg/80 backdrop-blur-xl' : 'bg-bg-secondary',\n className\n )}\n data-component=\"emoji-picker\"\n {...props}\n >\n {/* search */}\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"border-border text-fg placeholder:text-fg-muted mb-2 w-full rounded-md border bg-transparent px-2 py-1 text-xs outline-none\"\n />\n\n {/* category tabs */}\n {search === '' && (\n <div className=\"mb-2 flex gap-1 overflow-x-auto\">\n {categories.map((cat, i) => (\n <button\n key={cat.name}\n className={cx(\n 'shrink-0 rounded-md px-2 py-0.5 text-[10px] font-medium transition-colors',\n i === activeTab\n ? 'bg-accent/15 text-accent'\n : 'text-fg-muted hover:text-fg'\n )}\n onClick={() => setActiveTab(i)}\n >\n {cat.name}\n </button>\n ))}\n </div>\n )}\n\n {/* emoji grid */}\n <div\n className=\"grid gap-0.5\"\n style={{ gridTemplateColumns: `repeat(${columns}, 1fr)` }}\n >\n {filteredEmojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-base transition-colors hover:bg-white/10\"\n onClick={() => onSelect(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n )\n }\n)\n","// empty-placeholder — inline empty state for cards/tables (lighter than EmptyState L7)\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmptyPlaceholderProps = {\n message: string\n icon?: ReactNode\n action?: ReactNode\n className?: string\n}\n\nexport const EmptyPlaceholder = forwardRef<\n HTMLDivElement,\n EmptyPlaceholderProps\n>(function EmptyPlaceholder({ message, icon, action, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col items-center justify-center gap-2 py-6 select-none',\n className\n )}\n data-component=\"empty-placeholder\"\n >\n {icon !== undefined && <div className=\"text-fg-muted/30\">{icon}</div>}\n <p className=\"gds-text-body text-fg-muted\">{message}</p>\n {action !== undefined && <div className=\"mt-1\">{action}</div>}\n </div>\n )\n})\n","// empty-search — placeholder shown when a search returns no results\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmptySearchProps = {\n query: string\n suggestions?: string[]\n className?: string\n}\n\nexport const EmptySearch = forwardRef<HTMLDivElement, EmptySearchProps>(\n function EmptySearch({ query, suggestions, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col items-center justify-center py-12 text-center select-none',\n className\n )}\n data-component=\"empty-search\"\n >\n <div className=\"bg-bg-tertiary/50 flex h-12 w-12 items-center justify-center rounded-full\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.35-4.35\" />\n </svg>\n </div>\n <h3 className=\"text-fg mt-3 text-sm font-medium\">\n No results for &apos;{query}&apos;\n </h3>\n {suggestions !== undefined && suggestions.length > 0 && (\n <div className=\"mt-3 flex flex-wrap justify-center gap-2\">\n {suggestions.map((suggestion) => (\n <span\n key={suggestion}\n className=\"bg-bg-tertiary/50 text-fg-muted rounded-full px-3 py-1 text-[11px]\"\n >\n {suggestion}\n </span>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EnvironmentType = 'development' | 'local' | 'production' | 'staging'\n\ntype EnvironmentBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n env: EnvironmentType\n showDot?: boolean\n}\n\nconst envCls: Record<EnvironmentType, string> = {\n production: 'bg-success/15 text-success',\n staging: 'bg-warning/15 text-warning',\n development: 'bg-accent/15 text-accent',\n local: 'bg-bg-tertiary text-fg-muted',\n}\n\nconst dotCls: Record<EnvironmentType, string> = {\n production: 'bg-success',\n staging: 'bg-warning',\n development: 'bg-accent',\n local: 'bg-fg-muted',\n}\n\nexport const EnvironmentBadge = forwardRef<\n HTMLSpanElement,\n EnvironmentBadgeProps\n>(function EnvironmentBadge({ className, env, showDot = true, ...props }, ref) {\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n envCls[env],\n className\n )}\n data-component=\"environment-badge\"\n ref={ref}\n {...props}\n >\n {showDot && (\n <span className={cx('h-1.5 w-1.5 rounded-full', dotCls[env])} />\n )}\n {env}\n </span>\n )\n})\n\nexport type { EnvironmentBadgeProps, EnvironmentType }\n","// feature-flag — toggle-style status indicator for feature flags\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FeatureFlagProps = {\n className?: string\n description?: string\n enabled: boolean\n name: string\n}\n\nexport const FeatureFlag = forwardRef<HTMLDivElement, FeatureFlagProps>(\n function FeatureFlag({ className, description, enabled, name }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-pad-x gds-pad-y flex items-center',\n className\n )}\n data-component=\"feature-flag\"\n data-state={enabled ? 'enabled' : 'disabled'}\n >\n <span\n className={cx(\n 'inline-block h-2.5 w-2.5 shrink-0 rounded-full',\n enabled ? 'bg-success' : 'bg-fg-muted/40'\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <span\n className={cx(\n 'gds-text font-medium',\n enabled ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {name}\n </span>\n {description !== undefined && (\n <p className=\"text-fg-muted mt-0.5 text-xs\">{description}</p>\n )}\n </div>\n <span\n className={cx(\n 'text-xs font-medium',\n enabled ? 'text-success' : 'text-fg-muted'\n )}\n >\n {enabled ? 'ON' : 'OFF'}\n </span>\n </div>\n )\n }\n)\n","// field-group — titled group of form fields with optional multi-column grid\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype FieldGroupColumns = 1 | 2 | 3\n\nconst columnClasses: Record<FieldGroupColumns, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n}\n\nexport type FieldGroupProps = {\n children: ReactNode\n columns?: FieldGroupColumns\n title?: string\n description?: string\n className?: string\n}\n\nexport const FieldGroup = forwardRef<HTMLFieldSetElement, FieldGroupProps>(\n function FieldGroup(\n { children, columns = 1, title, description, className },\n ref\n ) {\n return (\n <fieldset\n ref={ref}\n className={cx('space-y-4', className)}\n data-component=\"field-group\"\n >\n {title !== undefined && (\n <div>\n <legend className=\"text-fg text-sm font-semibold\">{title}</legend>\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n )}\n <div className={cx('gds-gap grid', columnClasses[columns])}>\n {children}\n </div>\n </fieldset>\n )\n }\n)\n\nexport type { FieldGroupColumns }\n","// field-set — bordered fieldset with legend label\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FieldSetProps = {\n children: ReactNode\n legend: string\n disabled?: boolean\n className?: string\n}\n\nexport const FieldSet = forwardRef<HTMLFieldSetElement, FieldSetProps>(\n function FieldSet({ children, legend, disabled = false, className }, ref) {\n return (\n <fieldset\n ref={ref}\n className={cx(\n 'gds-radius border-border gds-pad border',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"field-set\"\n disabled={disabled}\n >\n <legend className=\"text-fg-muted px-2 text-xs font-medium select-none\">\n {legend}\n </legend>\n {children}\n </fieldset>\n )\n }\n)\n","// file-upload — drag-and-drop file upload zone\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype FileUploadProps = {\n accept?: string\n children?: ReactNode\n className?: string\n disabled?: boolean\n glass?: boolean\n maxSize?: number\n multiple?: boolean\n onFiles: (files: File[]) => void\n}\n\nfunction filterBySize(files: File[], maxSize?: number): File[] {\n if (maxSize === undefined) return files\n return files.filter((f) => f.size <= maxSize)\n}\n\nfunction UploadIcon() {\n return (\n <svg\n className=\"text-fg-muted/40 h-8 w-8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </svg>\n )\n}\n\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\n function FileUpload(\n {\n accept,\n children,\n className,\n disabled = false,\n glass,\n maxSize,\n multiple = false,\n onFiles,\n },\n ref\n ) {\n const [dragOver, setDragOver] = useState(false)\n const [selectedFiles, setSelectedFiles] = useState<File[]>([])\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleFiles = useCallback(\n (fileList: FileList) => {\n const files = filterBySize(Array.from(fileList), maxSize)\n setSelectedFiles(files)\n onFiles(files)\n },\n [maxSize, onFiles]\n )\n\n const handleClick = useCallback(() => {\n if (disabled) return\n inputRef.current?.click()\n }, [disabled])\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n if (disabled) return\n setDragOver(true)\n },\n [disabled]\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n if (disabled) return\n handleFiles(e.dataTransfer.files)\n },\n [disabled, handleFiles]\n )\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files !== null) {\n handleFiles(e.target.files)\n }\n },\n [handleFiles]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 transition-colors',\n !dragOver && !disabled && 'border-border hover:border-fg-muted',\n dragOver && 'border-accent bg-accent/5',\n disabled && 'pointer-events-none cursor-not-allowed opacity-50',\n glassClass(glass),\n className\n )}\n data-component=\"file-upload\"\n data-state={dragOver ? 'drag-over' : 'idle'}\n onClick={handleClick}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <input\n accept={accept}\n className=\"hidden\"\n multiple={multiple}\n onChange={handleInputChange}\n ref={inputRef}\n type=\"file\"\n />\n {children !== undefined ? (\n children\n ) : (\n <>\n <UploadIcon />\n <div className=\"text-fg-muted text-sm\">\n Drop files here or click to browse\n </div>\n {selectedFiles.length > 0 && (\n <div className=\"text-fg-muted/60 text-xs\">\n {selectedFiles.length} file{selectedFiles.length > 1 ? 's' : ''}{' '}\n selected\n </div>\n )}\n </>\n )}\n </div>\n )\n }\n)\n\nexport type { FileUploadProps }\n","import { forwardRef } from 'react'\n\nimport { Chip } from '../l3-atoms/chip'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype FilterItem = { id: string; label: string; active: boolean }\n\ntype FilterBarProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n filters: FilterItem[]\n onChange: (id: string, active: boolean) => void\n onClear?: () => void\n}\n\nexport const FilterBar = forwardRef<HTMLDivElement, FilterBarProps>(\n function FilterBar({ className, filters, onChange, onClear, ...props }, ref) {\n const hasActive = filters.some((f) => f.active)\n\n return (\n <div\n className={cx('gds-gap flex flex-wrap items-center', className)}\n data-component=\"filter-bar\"\n ref={ref}\n {...props}\n >\n {filters.map((filter) => (\n <button\n key={filter.id}\n className={cx('cursor-pointer', focusCls)}\n onClick={() => onChange(filter.id, !filter.active)}\n type=\"button\"\n >\n <Chip\n label={filter.label}\n variant={filter.active ? 'accent' : 'default'}\n />\n </button>\n ))}\n {hasActive && onClear !== undefined && (\n <button\n className={cx(\n 'gds-text-caption text-fg-muted hover:text-fg',\n focusCls\n )}\n onClick={onClear}\n type=\"button\"\n >\n Clear all\n </button>\n )}\n </div>\n )\n }\n)\n\nexport type { FilterBarProps, FilterItem }\n","// flip-card — 3D CSS perspective card with front/back\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type FlipCardProps = {\n back: ReactNode\n className?: string\n front: ReactNode\n trigger?: 'click' | 'hover'\n}\n\nexport const FlipCard = forwardRef<HTMLDivElement, FlipCardProps>(\n function FlipCard({ back, className, front, trigger = 'click' }, ref) {\n const [flipped, setFlipped] = useState(false)\n\n const hoverHandlers =\n trigger === 'hover'\n ? {\n onMouseEnter: () => setFlipped(true),\n onMouseLeave: () => setFlipped(false),\n }\n : {}\n\n const clickHandler =\n trigger === 'click' ? { onClick: () => setFlipped((prev) => !prev) } : {}\n\n return (\n <div\n ref={ref}\n className={cx('relative cursor-pointer', className)}\n style={{ perspective: '1000px' }}\n data-component=\"flip-card\"\n data-state={flipped ? 'flipped' : 'front'}\n {...hoverHandlers}\n {...clickHandler}\n >\n <div\n className=\"relative w-full transition-transform duration-500\"\n style={{\n transformStyle: 'preserve-3d',\n transform: flipped ? 'rotateY(180deg)' : 'rotateY(0deg)',\n }}\n >\n <div className=\"relative\" style={{ backfaceVisibility: 'hidden' }}>\n {front}\n </div>\n <div\n className=\"absolute inset-0\"\n style={{\n backfaceVisibility: 'hidden',\n transform: 'rotateY(180deg)',\n }}\n >\n {back}\n </div>\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\n\ntype FormActionsProps = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean\n loading?: boolean\n onCancel?: () => void\n onReset?: () => void\n onSave?: () => void\n saveLabel?: string\n}\n\nexport const FormActions = forwardRef<HTMLDivElement, FormActionsProps>(\n function FormActions(\n {\n className,\n disabled,\n loading,\n onCancel,\n onReset,\n onSave,\n saveLabel = 'Save',\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx('gds-gap flex items-center justify-end', className)}\n data-component=\"form-actions\"\n ref={ref}\n {...props}\n >\n {onReset !== undefined && (\n <Button\n variant=\"ghost\"\n disabled={disabled}\n onClick={onReset}\n type=\"button\"\n >\n Reset\n </Button>\n )}\n {onCancel !== undefined && (\n <Button\n variant=\"secondary\"\n disabled={disabled}\n onClick={onCancel}\n type=\"button\"\n >\n Cancel\n </Button>\n )}\n {onSave !== undefined && (\n <Button\n disabled={disabled ?? loading}\n loading={loading}\n onClick={onSave}\n type=\"submit\"\n >\n {loading === true ? 'Saving...' : saveLabel}\n </Button>\n )}\n </div>\n )\n }\n)\n\nexport type { FormActionsProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { Label } from '../l2-primitives/label'\nimport { cx } from '../utils/cx'\n\ntype FieldWrapperProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n children: ReactNode\n error?: string\n helperText?: string\n required?: boolean\n}\n\nexport const FieldWrapper = forwardRef<HTMLDivElement, FieldWrapperProps>(\n function FieldWrapper(\n { children, className, error, helperText, label, required, ...props },\n ref\n ) {\n const hasError = error !== undefined && error !== ''\n\n return (\n <div\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"field-wrapper\"\n data-state={hasError ? 'error' : 'idle'}\n ref={ref}\n {...props}\n >\n <Label required={required}>{label}</Label>\n {children}\n {hasError && (\n <span className=\"gds-text-caption text-danger\">{error}</span>\n )}\n {!hasError && helperText !== undefined && (\n <span className=\"gds-text-caption text-fg-muted\">{helperText}</span>\n )}\n </div>\n )\n }\n)\n\nexport type { FieldWrapperProps }\n","// glass-button — frosted glass variant button with size and color variants\nimport { cva } from 'class-variance-authority'\nimport type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst glassButtonVariants = cva(\n cx(\n 'inline-flex select-none items-center justify-center font-medium gds-glass transition-colors',\n focusCls\n ),\n {\n variants: {\n variant: {\n default: 'border border-border/30 bg-bg/50 text-fg hover:bg-bg/70',\n accent:\n 'border border-accent/30 bg-accent/20 text-accent hover:bg-accent/30',\n },\n size: {\n sm: 'h-7 gap-1 gds-radius-button px-2 text-[11px]',\n default: 'h-8 gap-1.5 gds-radius-button px-3 text-xs',\n lg: 'h-9 gap-2 gds-radius px-4 text-sm',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n }\n)\n\nexport type GlassButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof glassButtonVariants> & {\n children: ReactNode\n }\n\nexport const GlassButton = forwardRef<HTMLButtonElement, GlassButtonProps>(\n function GlassButton({ children, className, size, variant, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cx(glassButtonVariants({ size, variant }), className)}\n data-component=\"glass-button\"\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nexport { glassButtonVariants }\n","// glass-card — frosted glass container with blur intensity variants\nimport { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst glassCardVariants = cva('gds-ctx gds-radius border bg-bg/60', {\n variants: {\n blur: {\n sm: 'gds-glass-sm border-border/25',\n default: 'gds-glass border-border/20',\n lg: 'gds-glass-lg border-border/15',\n },\n },\n defaultVariants: { blur: 'default' },\n})\n\nexport type GlassCardProps = VariantProps<typeof glassCardVariants> & {\n children: ReactNode\n className?: string\n}\n\nexport const GlassCard = forwardRef<HTMLDivElement, GlassCardProps>(\n function GlassCard({ blur, children, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(glassCardVariants({ blur }), className)}\n data-component=\"glass-card\"\n >\n {children}\n </div>\n )\n }\n)\n\nexport { glassCardVariants }\n","// glitch-text — text with pseudo-element glitch animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type GlitchTextProps = {\n active?: boolean\n className?: string\n intensity?: 'default' | 'lg' | 'sm'\n text: string\n}\n\nconst intensityMap = {\n sm: 'gds-glitch-sm',\n default: 'gds-glitch',\n lg: 'gds-glitch-lg',\n} as const\n\nexport const GlitchText = forwardRef<HTMLSpanElement, GlitchTextProps>(\n function GlitchText(\n { active = true, className, intensity = 'default', text },\n ref\n ) {\n return (\n <span\n ref={ref}\n className={cx(\n 'text-fg relative inline-block font-bold select-none',\n active && intensityMap[intensity],\n className\n )}\n data-component=\"glitch-text\"\n data-text={text}\n aria-label={text}\n >\n {text}\n </span>\n )\n }\n)\n","// hover-card — rich content card shown on hover with delay\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst positionClasses: Record<string, string> = {\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n left: 'right-full top-1/2 -translate-y-1/2 mr-2',\n right: 'left-full top-1/2 -translate-y-1/2 ml-2',\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n}\n\nexport type HoverCardProps = React.HTMLAttributes<HTMLDivElement> & {\n trigger: ReactNode\n delay?: number\n placement?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nexport const HoverCard = forwardRef<HTMLDivElement, HoverCardProps>(\n function HoverCard(\n {\n trigger,\n children,\n delay = 300,\n placement = 'bottom',\n className,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const enterTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const leaveTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n\n const handleEnter = useCallback(() => {\n clearTimeout(leaveTimer.current)\n enterTimer.current = setTimeout(() => setOpen(true), delay)\n }, [delay])\n\n const handleLeave = useCallback(() => {\n clearTimeout(enterTimer.current)\n leaveTimer.current = setTimeout(() => setOpen(false), 150)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-flex', className)}\n data-component=\"hover-card\"\n data-state={open ? 'open' : 'closed'}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n {...props}\n >\n {trigger}\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y gds-shadow-lg absolute z-50 border',\n positionClasses[placement]\n )}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n >\n {children}\n </div>\n )}\n </div>\n )\n }\n)\n","// info-row — horizontal info bar with icon, label, and value\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type InfoRowProps = {\n label: string\n value: ReactNode\n icon?: ReactNode\n className?: string\n}\n\nexport const InfoRow = forwardRef<HTMLDivElement, InfoRowProps>(\n function InfoRow({ label, value, icon, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body flex items-center gap-2 select-none',\n className\n )}\n data-component=\"info-row\"\n >\n {icon !== undefined && <span className=\"text-fg-muted/60\">{icon}</span>}\n <span className=\"text-fg-muted\">{label}</span>\n <span className=\"text-fg ml-auto font-medium\">{value}</span>\n </div>\n )\n }\n)\n","// input-group — groups input with prefix/suffix addons\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type InputGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n prefix?: React.ReactNode\n suffix?: React.ReactNode\n error?: boolean\n disabled?: boolean\n className?: string\n}\n\nexport const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(\n function InputGroup(\n { prefix, suffix, error, disabled, className, children, ...props },\n ref\n ) {\n return (\n <div\n ref={ref}\n data-component=\"input-group\"\n className={cx(\n 'gds-radius-input flex items-center overflow-hidden border transition-colors',\n error ? 'border-danger' : 'border-border',\n disabled && 'pointer-events-none opacity-50',\n // strip border/radius from nested inputs\n '[&_input]:flex-1 [&_input]:rounded-none [&_input]:border-0 [&_input]:ring-0 [&_input]:focus-visible:ring-0',\n className\n )}\n {...props}\n >\n {prefix !== undefined && (\n <span className=\"bg-bg-tertiary border-border text-fg-muted flex items-center border-r px-3 text-sm select-none\">\n {prefix}\n </span>\n )}\n {children}\n {suffix !== undefined && (\n <span className=\"bg-bg-tertiary border-border text-fg-muted flex items-center border-l px-3 text-sm select-none\">\n {suffix}\n </span>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype InputWithButtonProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n buttonLabel: string\n disabled?: boolean\n onChange: (value: string) => void\n onSubmit: () => void\n placeholder?: string\n value: string\n}\n\nexport const InputWithButton = forwardRef<HTMLDivElement, InputWithButtonProps>(\n function InputWithButton(\n {\n buttonLabel,\n className,\n disabled = false,\n onChange,\n onSubmit,\n placeholder,\n value,\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx(\n 'border-border inline-flex items-center overflow-hidden rounded-md border',\n className\n )}\n data-component=\"input-with-button\"\n ref={ref}\n {...props}\n >\n <input\n className=\"text-fg placeholder:text-fg-muted min-w-0 flex-1 bg-transparent px-3 py-1.5 text-sm outline-none\"\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSubmit()\n }}\n placeholder={placeholder}\n type=\"text\"\n value={value}\n />\n <button\n className=\"border-border bg-accent/10 text-accent hover:bg-accent/20 shrink-0 border-l px-3 py-1.5 text-sm font-medium disabled:opacity-50\"\n disabled={disabled}\n onClick={onSubmit}\n type=\"button\"\n >\n {buttonLabel}\n </button>\n </div>\n )\n }\n)\n\nexport type { InputWithButtonProps }\n","// key-value-list — compact list of label-value pairs in one or two columns\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KeyValueItem = {\n key: string\n value: ReactNode\n}\n\nexport type KeyValueListProps = {\n items: KeyValueItem[]\n columns?: 1 | 2\n className?: string\n}\n\nexport const KeyValueList = forwardRef<HTMLDivElement, KeyValueListProps>(\n function KeyValueList({ items, columns = 1, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'grid gap-x-8 gap-y-2',\n columns === 2 ? 'grid-cols-2' : 'grid-cols-1',\n className\n )}\n data-component=\"key-value-list\"\n >\n {items.map((item) => (\n <div\n className=\"flex items-baseline justify-between gap-4\"\n key={item.key}\n >\n <span className=\"gds-text-body text-fg-muted shrink-0\">\n {item.key}\n </span>\n <span className=\"gds-text-body text-fg text-right\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","// kv-table — key-value display table for entity details\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KvTableItem = {\n key: string\n value: ReactNode\n copyable?: boolean\n}\n\nexport type KvTableProps = {\n items: KvTableItem[]\n columns?: 1 | 2\n striped?: boolean\n className?: string\n}\n\nexport const KvTable = forwardRef<HTMLDivElement, KvTableProps>(\n function KvTable({ items, columns = 1, striped, className }, ref) {\n const isTwoCol = columns === 2\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body',\n isTwoCol && 'grid grid-cols-2 gap-x-6',\n className\n )}\n data-component=\"kv-table\"\n data-variant={isTwoCol ? '2col' : '1col'}\n >\n {items.map((item, i) => (\n <KvRow\n key={item.key}\n item={item}\n striped={striped === true && i % 2 === 1}\n />\n ))}\n </div>\n )\n }\n)\n\nfunction KvRow({ item, striped }: { item: KvTableItem; striped: boolean }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n const text =\n typeof item.value === 'string' ? item.value : String(item.value)\n navigator.clipboard.writeText(text).catch(() => {})\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n\n return (\n <div\n className={cx(\n 'group gds-pad-x gds-pad-y-sm flex items-baseline justify-between gap-4',\n striped && 'bg-bg-tertiary/40'\n )}\n >\n <dt className=\"text-fg-muted shrink-0 font-medium\">{item.key}</dt>\n <dd className=\"text-fg flex items-center gap-1.5 text-right\">\n <span>{item.value}</span>\n {item.copyable === true && (\n <button\n onClick={handleCopy}\n className=\"text-fg-muted/50 hover:text-fg-muted invisible group-hover:visible\"\n aria-label={`Copy ${item.key}`}\n >\n {copied ? '✓' : '⎘'}\n </button>\n )}\n </dd>\n </div>\n )\n}\n","// link-preview — rich preview card for an external link with image, title, description\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type LinkPreviewProps = {\n title: string\n url: string\n description?: string\n domain?: string\n image?: string\n glass?: boolean\n className?: string\n}\n\nexport const LinkPreview = forwardRef<HTMLAnchorElement, LinkPreviewProps>(\n function LinkPreview(\n { title, url, description, domain, image, glass, className },\n ref\n ) {\n return (\n <a\n ref={ref}\n className={cx(\n 'gds-gap gds-radius border-accent bg-bg-secondary gds-pad hover:bg-bg-tertiary flex border-l-4 transition-colors select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"link-preview\"\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-accent truncate text-sm font-medium\">\n {title}\n </span>\n {description !== undefined && (\n <span className=\"gds-text-body text-fg-muted line-clamp-2\">\n {description}\n </span>\n )}\n {domain !== undefined && (\n <span className=\"text-fg-muted/60 text-[10px]\">{domain}</span>\n )}\n </div>\n {image !== undefined && (\n <img\n alt={title}\n className=\"gds-radius h-16 w-16 shrink-0 object-cover\"\n src={image}\n />\n )}\n </a>\n )\n }\n)\n","// live-metric — card displaying a live metric value with optional pulse\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type LiveMetricProps = {\n className?: string\n label: string\n pulse?: boolean\n unit?: string\n value: number | string\n}\n\nexport const LiveMetric = forwardRef<HTMLDivElement, LiveMetricProps>(\n function LiveMetric({ className, label, pulse, unit, value }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap-sm gds-pad gds-radius border-border bg-surface flex flex-col border',\n className\n )}\n data-component=\"live-metric\"\n >\n <div className=\"gds-gap-sm flex items-center\">\n {pulse === true && (\n <span className=\"relative flex h-2.5 w-2.5 shrink-0\">\n <span className=\"bg-success absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\" />\n <span className=\"bg-success relative inline-flex h-2.5 w-2.5 rounded-full\" />\n </span>\n )}\n <span className=\"text-fg-muted text-xs\">{label}</span>\n </div>\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-fg text-2xl font-bold tabular-nums\">\n {value}\n </span>\n {unit !== undefined && (\n <span className=\"text-fg-muted text-sm\">{unit}</span>\n )}\n </div>\n </div>\n )\n }\n)\n","// loading-overlay — covers parent container with spinner + optional message\nimport { forwardRef } from 'react'\n\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype LoadingOverlayProps = {\n visible: boolean\n message?: string\n glass?: boolean\n className?: string\n}\n\nconst LoadingOverlay = forwardRef<HTMLDivElement, LoadingOverlayProps>(\n function LoadingOverlay({ visible, message, glass = true, className }, ref) {\n if (!visible) return null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute inset-0 z-10 flex flex-col items-center justify-center',\n glass === true ? glassClass(true) : 'bg-bg/80',\n className\n )}\n data-component=\"loading-overlay\"\n >\n <Spinner />\n {message !== undefined && (\n <span className=\"text-fg-muted mt-2 text-xs\">{message}</span>\n )}\n </div>\n )\n }\n)\n\nexport { LoadingOverlay }\nexport type { LoadingOverlayProps }\n","// matrix-rain — canvas-based falling characters effect\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MatrixRainProps = {\n active?: boolean\n className?: string\n color?: string\n density?: number\n speed?: number\n}\n\nexport const MatrixRain = forwardRef<HTMLCanvasElement, MatrixRainProps>(\n function MatrixRain(\n { active = true, className, color = '#00ff41', density = 20, speed = 50 },\n ref\n ) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const animRef = useRef<number>(0)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (canvas === null || !active) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n const resize = () => {\n canvas.width = canvas.offsetWidth\n canvas.height = canvas.offsetHeight\n }\n resize()\n window.addEventListener('resize', resize)\n\n const fontSize = 14\n const columns = Math.floor(canvas.width / density)\n const drops = new Array(columns).fill(1) as number[]\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%^&*'\n\n let last = 0\n const draw = (time: number) => {\n if (time - last < speed) {\n animRef.current = requestAnimationFrame(draw)\n return\n }\n last = time\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n ctx.fillStyle = color\n ctx.font = `${fontSize}px monospace`\n\n for (let i = 0; i < drops.length; i++) {\n const text = chars[Math.floor(Math.random() * chars.length)]\n ctx.fillText(text, i * density, drops[i] * fontSize)\n if (drops[i] * fontSize > canvas.height && Math.random() > 0.975) {\n drops[i] = 0\n }\n drops[i]++\n }\n\n animRef.current = requestAnimationFrame(draw)\n }\n\n animRef.current = requestAnimationFrame(draw)\n\n return () => {\n cancelAnimationFrame(animRef.current)\n window.removeEventListener('resize', resize)\n }\n }, [active, color, density, speed])\n\n return (\n <canvas\n ref={(node) => {\n canvasRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLCanvasElement | null>).current =\n node\n }\n }}\n className={cx('block h-full w-full bg-black', className)}\n data-component=\"matrix-rain\"\n />\n )\n }\n)\n","// media-container — renders image, video, or audio based on type\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MediaType = 'audio' | 'image' | 'video'\n\nexport type MediaContainerProps = {\n alt?: string\n aspectRatio?: number\n className?: string\n rounded?: boolean\n src: string\n type: MediaType\n}\n\nexport const MediaContainer = forwardRef<HTMLDivElement, MediaContainerProps>(\n function MediaContainer(\n { alt, aspectRatio, className, rounded, src, type },\n ref\n ) {\n const roundedCls = rounded === true ? 'rounded-lg overflow-hidden' : ''\n\n return (\n <div\n ref={ref}\n className={cx('relative w-full', roundedCls, className)}\n style={\n aspectRatio !== undefined\n ? { aspectRatio: String(aspectRatio) }\n : undefined\n }\n data-component=\"media-container\"\n data-variant={type}\n >\n {type === 'image' && (\n <img\n src={src}\n alt={alt ?? ''}\n className=\"h-full w-full object-cover\"\n />\n )}\n {type === 'video' && (\n <video\n src={src}\n controls\n className=\"h-full w-full object-cover\"\n aria-label={alt}\n />\n )}\n {type === 'audio' && (\n <audio src={src} controls className=\"w-full\" aria-label={alt} />\n )}\n </div>\n )\n }\n)\n","// media-object — classic media + content side-by-side layout\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype MediaObjectProps = {\n align?: 'center' | 'top'\n children: ReactNode\n className?: string\n media: ReactNode\n reverse?: boolean\n}\n\nexport const MediaObject = forwardRef<HTMLDivElement, MediaObjectProps>(\n function MediaObject(\n { align = 'top', children, className, media, reverse = false },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap flex',\n align === 'center' && 'items-center',\n align === 'top' && 'items-start',\n reverse === true && 'flex-row-reverse',\n className\n )}\n data-component=\"media-object\"\n >\n <div className=\"shrink-0\">{media}</div>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n }\n)\n\nexport type { MediaObjectProps }\n","// mention-list — suggestion dropdown for mention-input\n\nimport { cx } from '../utils/cx'\n\ntype MentionSuggestion = {\n id: string\n label: string\n}\n\ntype MentionListProps = {\n filtered: MentionSuggestion[]\n highlightedIndex: number\n onSelect: (suggestion: MentionSuggestion) => void\n trigger: string\n}\n\nexport function MentionList({\n filtered,\n highlightedIndex,\n onSelect,\n trigger,\n}: MentionListProps) {\n return (\n <div\n className=\"gds-radius-popover border-border bg-surface absolute top-full right-0 left-0 z-50 mt-1 border shadow-lg\"\n role=\"listbox\"\n data-testid=\"mention-suggestions\"\n >\n {filtered.map((suggestion, index) => (\n <button\n key={suggestion.id}\n type=\"button\"\n role=\"option\"\n aria-selected={index === highlightedIndex}\n className={cx(\n 'text-fg flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors',\n index === highlightedIndex && 'bg-accent/10 text-accent',\n index !== highlightedIndex && 'hover:bg-bg-secondary'\n )}\n onMouseDown={(e) => {\n e.preventDefault()\n onSelect(suggestion)\n }}\n >\n <span className=\"text-fg-muted mr-1.5\">{trigger}</span>\n {suggestion.label}\n </button>\n ))}\n </div>\n )\n}\n\nexport type { MentionListProps, MentionSuggestion }\n","// mention-input — text input with @mention suggestion dropdown\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { MentionSuggestion } from './mention-list'\nimport { MentionList } from './mention-list'\n\nexport type MentionInputProps = {\n value: string\n onChange: (value: string) => void\n suggestions: MentionSuggestion[]\n trigger?: string\n placeholder?: string\n disabled?: boolean\n className?: string\n}\n\nexport const MentionInput = forwardRef<HTMLInputElement, MentionInputProps>(\n function MentionInput(\n {\n value,\n onChange,\n suggestions,\n trigger = '@',\n placeholder,\n disabled,\n className,\n },\n ref\n ) {\n const [showSuggestions, setShowSuggestions] = useState(false)\n const [query, setQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const filtered = suggestions.filter((s) =>\n s.label.toLowerCase().includes(query.toLowerCase())\n )\n\n // find the trigger position in the current value\n const findTriggerPosition = useCallback(\n (text: string): number => {\n const lastTrigger = text.lastIndexOf(trigger)\n if (lastTrigger < 0) return -1\n if (lastTrigger > 0 && text[lastTrigger - 1] !== ' ') return -1\n const afterTrigger = text.slice(lastTrigger + trigger.length)\n if (afterTrigger.includes(' ')) return -1\n return lastTrigger\n },\n [trigger]\n )\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n onChange(newValue)\n\n const triggerPos = findTriggerPosition(newValue)\n if (triggerPos >= 0) {\n const q = newValue.slice(triggerPos + trigger.length)\n setQuery(q)\n setShowSuggestions(true)\n setHighlightedIndex(0)\n } else {\n setShowSuggestions(false)\n setQuery('')\n }\n },\n [onChange, findTriggerPosition, trigger]\n )\n\n const selectSuggestion = useCallback(\n (suggestion: MentionSuggestion) => {\n const triggerPos = findTriggerPosition(value)\n if (triggerPos < 0) return\n const before = value.slice(0, triggerPos)\n const after = `${trigger}${suggestion.label} `\n onChange(before + after)\n setShowSuggestions(false)\n setQuery('')\n },\n [value, onChange, findTriggerPosition, trigger]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!showSuggestions) return\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIndex((prev) => {\n if (prev >= filtered.length - 1) return 0\n return prev + 1\n })\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIndex((prev) => {\n if (prev <= 0) return filtered.length - 1\n return prev - 1\n })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n if (filtered.length > 0) {\n selectSuggestion(filtered[highlightedIndex])\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n setShowSuggestions(false)\n }\n },\n [showSuggestions, filtered, highlightedIndex, selectSuggestion]\n )\n\n // close on click outside\n useEffect(() => {\n if (!showSuggestions) return\n\n function handleClickOutside(e: MouseEvent) {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setShowSuggestions(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [showSuggestions])\n\n return (\n <div\n ref={containerRef}\n className=\"relative\"\n data-component=\"mention-input\"\n >\n <input\n ref={ref}\n type=\"text\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={cx(\n 'gds-radius-button border-border bg-bg-secondary text-fg w-full border px-3 py-2 text-sm',\n 'placeholder:text-fg-muted/50',\n disabled === true && 'pointer-events-none opacity-50',\n focusCls,\n className\n )}\n />\n {showSuggestions && filtered.length > 0 && (\n <MentionList\n filtered={filtered}\n highlightedIndex={highlightedIndex}\n onSelect={selectSuggestion}\n trigger={trigger}\n />\n )}\n </div>\n )\n }\n)\n","// metric-row — horizontal row of compact metric values\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MetricRowMetric = {\n label: string\n value: string | number\n unit?: string\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\nexport type MetricRowProps = {\n metrics: MetricRowMetric[]\n className?: string\n}\n\nconst variantColor: Record<string, string> = {\n default: 'text-fg',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport const MetricRow = forwardRef<HTMLDivElement, MetricRowProps>(\n function MetricRow({ metrics, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-text-body flex items-center select-none',\n className\n )}\n data-component=\"metric-row\"\n >\n {metrics.map((m) => (\n <div key={m.label} className=\"flex items-baseline gap-1.5\">\n <span className=\"text-fg-muted\">{m.label}</span>\n <span\n className={cx(\n 'font-semibold',\n variantColor[m.variant ?? 'default']\n )}\n >\n {m.value}\n {m.unit !== undefined && (\n <span className=\"text-fg-muted ml-0.5 font-normal\">\n {m.unit}\n </span>\n )}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype MetricTileVariant = 'danger' | 'default' | 'success' | 'warning'\n\ntype MetricTileProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n unit?: string\n value: number | string\n variant?: MetricTileVariant\n}\n\nconst variantCls: Record<MetricTileVariant, string> = {\n default: 'text-fg',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n}\n\nexport const MetricTile = forwardRef<HTMLDivElement, MetricTileProps>(\n function MetricTile(\n { className, label, unit, value, variant = 'default', ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-pad gds-radius bg-surface flex flex-col items-center',\n className\n )}\n data-component=\"metric-tile\"\n ref={ref}\n {...props}\n >\n <span\n className={cx('text-lg font-bold tabular-nums', variantCls[variant])}\n >\n {value}\n {unit !== undefined && (\n <span className=\"text-fg-muted ml-0.5 text-xs font-normal\">\n {unit}\n </span>\n )}\n </span>\n <span className=\"text-fg-muted text-xs\">{label}</span>\n </div>\n )\n }\n)\n\nexport type { MetricTileProps, MetricTileVariant }\n","// morphing-shape — SVG shape that transitions between variants\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MorphingShapeProps = {\n className?: string\n color?: string\n size?: number\n variant: 'blob' | 'circle' | 'square' | 'star'\n}\n\nconst paths: Record<MorphingShapeProps['variant'], string> = {\n circle: 'M50 10 A40 40 0 1 1 49.99 10 Z',\n square: 'M15 15 H85 V85 H15 Z',\n star: 'M50 5 L61 35 L95 35 L68 57 L79 90 L50 70 L21 90 L32 57 L5 35 L39 35 Z',\n blob: 'M50 10 C75 5 95 25 90 50 C95 75 75 95 50 90 C25 95 5 75 10 50 C5 25 25 5 50 10 Z',\n}\n\nexport const MorphingShape = forwardRef<SVGSVGElement, MorphingShapeProps>(\n function MorphingShape(\n { className, color = 'currentColor', size = 100, variant },\n ref\n ) {\n const d = useMemo(() => paths[variant], [variant])\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 100 100\"\n className={cx('text-fg', className)}\n data-component=\"morphing-shape\"\n data-variant={variant}\n >\n <path d={d} fill={color} style={{ transition: 'd 0.4s ease' }} />\n </svg>\n )\n }\n)\n","// multi-select-list — dropdown option list for multi-select (internal)\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype MultiSelectOption = {\n label: string\n value: string\n}\n\ntype MultiSelectListProps = {\n filtered: MultiSelectOption[]\n glass?: boolean\n onSearchChange: (value: string) => void\n onToggle: (value: string) => void\n searchQuery: string\n searchRef: React.RefObject<HTMLInputElement | null>\n value: string[]\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"text-accent h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M3.5 8l3 3 6-6\" />\n </svg>\n )\n}\n\nfunction MultiSelectList({\n filtered,\n glass,\n onSearchChange,\n onToggle,\n searchQuery,\n searchRef,\n value,\n}: MultiSelectListProps) {\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div className=\"border-border border-b p-1.5\">\n <input\n className=\"text-fg placeholder:text-fg-muted/50 w-full bg-transparent px-2 py-1 text-sm outline-none\"\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search...\"\n ref={searchRef}\n type=\"text\"\n value={searchQuery}\n />\n </div>\n <div className=\"max-h-60 overflow-y-auto py-1\">\n {filtered.length === 0 && (\n <div className=\"gds-pad-x gds-pad-y-sm text-fg-muted text-sm\">\n No results\n </div>\n )}\n {filtered.map((opt) => {\n const isSelected = value.includes(opt.value)\n return (\n <button\n className={cx(\n 'gds-pad-x gds-pad-y-sm flex w-full items-center gap-2 text-left text-sm transition-colors',\n isSelected && 'text-accent',\n !isSelected && 'text-fg hover:bg-bg-tertiary'\n )}\n key={opt.value}\n onClick={() => onToggle(opt.value)}\n type=\"button\"\n >\n <span\n className={cx(\n 'flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors',\n isSelected ? 'border-accent bg-accent/10' : 'border-border'\n )}\n >\n {isSelected && <CheckIcon />}\n </span>\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport { MultiSelectList }\nexport type { MultiSelectListProps }\n","// multi-select — dropdown with checkboxes for multiple selection\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport { MultiSelectList } from './multi-select-list'\n\ntype MultiSelectOption = {\n label: string\n value: string\n}\n\ntype MultiSelectProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n maxDisplay?: number\n onChange: (value: string[]) => void\n options: MultiSelectOption[]\n placeholder?: string\n value: string[]\n}\n\n// chevron icon\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 shrink-0 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(\n function MultiSelect(\n {\n className,\n disabled = false,\n error = false,\n glass,\n maxDisplay = 3,\n onChange,\n options,\n placeholder = 'Select...',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n const filtered = useMemo(() => {\n if (searchQuery === '') return options\n const lower = searchQuery.toLowerCase()\n return options.filter((opt) => opt.label.toLowerCase().includes(lower))\n }, [options, searchQuery])\n\n const selectedLabels = useMemo(\n () => options.filter((opt) => value.includes(opt.value)),\n [options, value]\n )\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n setSearchQuery('')\n requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n setSearchQuery('')\n }, [])\n\n const handleToggle = useCallback(\n (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue))\n } else {\n onChange([...value, optionValue])\n }\n },\n [onChange, value]\n )\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n const visibleChips = selectedLabels.slice(0, maxDisplay)\n const overflow = selectedLabels.length - maxDisplay\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"multi-select\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between gap-1 border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {selectedLabels.length === 0 && (\n <span className=\"text-fg-muted\">{placeholder}</span>\n )}\n {visibleChips.map((opt) => (\n <span\n key={opt.value}\n className=\"bg-accent/10 text-accent inline-flex max-w-[120px] items-center truncate rounded px-1.5 py-0.5 text-xs\"\n >\n {opt.label}\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"text-fg-muted text-xs\">+{overflow} more</span>\n )}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <MultiSelectList\n filtered={filtered}\n glass={glass}\n onSearchChange={setSearchQuery}\n onToggle={handleToggle}\n searchQuery={searchQuery}\n searchRef={searchRef}\n value={value}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { MultiSelectOption, MultiSelectProps }\n","// nav-item — sidebar navigation item with icon, label, and optional badge\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NavItemProps = {\n icon?: ReactNode\n label: string\n active?: boolean\n badge?: number\n onClick?: () => void\n collapsed?: boolean\n className?: string\n}\n\nconst NavItem = forwardRef<HTMLButtonElement, NavItemProps>(function NavItem(\n { icon, label, active, badge, onClick, collapsed, className },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={onClick}\n title={collapsed === true ? label : undefined}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body relative flex w-full items-center gap-3 select-none',\n 'hover:bg-bg-tertiary transition-colors',\n active === true && 'bg-accent/10 text-accent font-medium',\n active !== true && 'text-fg-muted',\n collapsed === true && 'justify-center',\n className\n )}\n data-component=\"nav-item\"\n data-state={active === true ? 'active' : undefined}\n >\n {icon !== undefined && <span className=\"shrink-0\">{icon}</span>}\n {collapsed !== true && (\n <span className=\"flex-1 truncate text-left\">{label}</span>\n )}\n {badge !== undefined && badge > 0 && (\n <span className=\"bg-accent text-accent-fg inline-flex h-5 min-w-5 items-center justify-center rounded-full px-1 text-[10px] font-bold\">\n {badge > 99 ? '99+' : badge}\n </span>\n )}\n </button>\n )\n})\n\nexport { NavItem }\nexport type { NavItemProps }\n","// network-status — connection status indicator\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NetworkStatusValue = 'offline' | 'online' | 'slow'\n\nexport type NetworkStatusProps = {\n className?: string\n status: NetworkStatusValue\n}\n\nconst statusConfig: Record<\n NetworkStatusValue,\n { color: string; label: string }\n> = {\n online: { color: 'bg-success', label: 'Online' },\n offline: { color: 'bg-danger', label: 'Offline' },\n slow: { color: 'bg-warning', label: 'Slow' },\n}\n\nexport const NetworkStatus = forwardRef<HTMLDivElement, NetworkStatusProps>(\n function NetworkStatus({ className, status }, ref) {\n const config = statusConfig[status]\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex items-center', className)}\n data-component=\"network-status\"\n data-state={status}\n >\n <span\n className={cx(\n 'inline-block h-2 w-2 shrink-0 rounded-full',\n config.color\n )}\n />\n <span className=\"gds-text text-fg-muted\">{config.label}</span>\n </div>\n )\n }\n)\n","// noise-overlay — SVG feTurbulence noise filter overlay\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NoiseOverlayProps = {\n animated?: boolean\n className?: string\n opacity?: number\n}\n\nexport const NoiseOverlay = forwardRef<HTMLDivElement, NoiseOverlayProps>(\n function NoiseOverlay({ animated, className, opacity = 0.05 }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'pointer-events-none absolute inset-0 overflow-hidden',\n className\n )}\n style={{ opacity }}\n data-component=\"noise-overlay\"\n >\n <svg className=\"h-full w-full\" xmlns=\"http://www.w3.org/2000/svg\">\n <filter id=\"gds-noise\">\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.8\"\n numOctaves=\"4\"\n stitchTiles=\"stitch\"\n >\n {animated === true && (\n <animate\n attributeName=\"seed\"\n from=\"0\"\n to=\"100\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n )}\n </feTurbulence>\n </filter>\n <rect width=\"100%\" height=\"100%\" filter=\"url(#gds-noise)\" />\n </svg>\n </div>\n )\n }\n)\n","// notification-bell — icon button with unread count badge\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type NotificationBellProps = {\n unread: number\n onClick: () => void\n className?: string\n}\n\nexport const NotificationBell = forwardRef<\n HTMLButtonElement,\n NotificationBellProps\n>(function NotificationBell({ unread, onClick, className }, ref) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx(\n 'gds-radius-button text-fg-muted hover:bg-bg-tertiary hover:text-fg relative inline-flex h-8 w-8 items-center justify-center transition-colors select-none',\n focusCls,\n className\n )}\n data-component=\"notification-bell\"\n onClick={onClick}\n aria-label={`Notifications${unread > 0 ? ` (${unread} unread)` : ''}`}\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cx(unread > 0 && 'animate-pulse')}\n >\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n {unread > 0 && (\n <span className=\"bg-danger absolute -top-0.5 -right-0.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-medium text-white\">\n {unread > 99 ? '99+' : unread}\n </span>\n )}\n </button>\n )\n})\n","// notification-dot — element wrapper with notification count badge\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NotificationDotVariant = 'accent' | 'danger'\n\ntype NotificationDotProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n count?: number\n max?: number\n variant?: NotificationDotVariant\n}\n\nconst variantMap: Record<NotificationDotVariant, string> = {\n danger: 'bg-danger text-white',\n accent: 'bg-accent text-accent-fg',\n}\n\nexport const NotificationDot = forwardRef<HTMLDivElement, NotificationDotProps>(\n function NotificationDot(\n { children, count = 0, max = 99, variant = 'danger', className, ...props },\n ref\n ) {\n const visible = count > 0\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-flex', className)}\n data-component=\"notification-dot\"\n {...props}\n >\n {children}\n {visible && (\n <span\n className={cx(\n 'absolute -top-1.5 -right-1.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] leading-none font-bold',\n variantMap[variant]\n )}\n >\n {display}\n </span>\n )}\n </div>\n )\n }\n)\n\nexport type { NotificationDotProps, NotificationDotVariant }\n","// num-table — numeric data table with right-aligned values and optional footer\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type NumColumn = {\n footer?: React.ReactNode\n format?: (value: null | number | undefined) => string\n key: string\n label: string\n width?: string\n}\n\nexport type NumTableProps = {\n className?: string\n columns: NumColumn[]\n emptyMessage?: string\n getRowHighlight?: (row: Record<string, unknown>) => string | undefined\n labelHeader: string\n labelKey: string\n rowKey?: string\n rows: Record<string, unknown>[]\n}\n\nfunction formatCell(\n value: unknown,\n format?: (v: null | number | undefined) => string\n): string {\n if (value === null || value === undefined) {\n if (format !== undefined) return format(null)\n return '\\u2014'\n }\n if (typeof value === 'number') {\n if (format !== undefined) return format(value)\n return String(value)\n }\n return String(value)\n}\n\nexport const NumTable = forwardRef<HTMLTableElement, NumTableProps>(\n function NumTable(\n {\n className,\n columns,\n emptyMessage,\n getRowHighlight,\n labelHeader,\n labelKey,\n rowKey,\n rows,\n },\n ref\n ) {\n const hasFooter = columns.some((col) => col.footer !== undefined)\n\n return (\n <table\n ref={ref}\n className={cx('gds-text w-full border-collapse', className)}\n data-component=\"num-table\"\n >\n <thead>\n <tr className=\"border-border border-b\">\n <th className=\"gds-pad-y text-fg-muted px-2 text-left text-xs font-medium\">\n {labelHeader}\n </th>\n {columns.map((col) => (\n <th\n key={col.key}\n className=\"gds-pad-y text-fg-muted px-2 text-right text-xs font-medium\"\n style={\n col.width !== undefined ? { width: col.width } : undefined\n }\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && emptyMessage !== undefined && (\n <tr>\n <td\n colSpan={columns.length + 1}\n className=\"gds-pad-y text-fg-muted px-2 text-center\"\n >\n {emptyMessage}\n </td>\n </tr>\n )}\n {rows.map((row, i) => {\n const key = rowKey !== undefined ? String(row[rowKey]) : String(i)\n const highlight = getRowHighlight?.(row)\n return (\n <tr\n key={key}\n className={cx('border-border/50 border-b', highlight)}\n >\n <td className=\"gds-pad-y text-fg px-2 text-left\">\n {String(row[labelKey] ?? '')}\n </td>\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"gds-pad-y text-fg px-2 text-right tabular-nums\"\n >\n {formatCell(row[col.key], col.format)}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n {hasFooter && (\n <tfoot>\n <tr className=\"border-border border-t font-medium\">\n <td className=\"gds-pad-y px-2\" />\n {columns.map((col) => (\n <td\n key={col.key}\n className=\"gds-pad-y text-fg px-2 text-right tabular-nums\"\n >\n {col.footer ?? ''}\n </td>\n ))}\n </tr>\n </tfoot>\n )}\n </table>\n )\n }\n)\n","// otp-input — one-time password digit input\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type OtpInputProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n length?: number\n onComplete: (code: string) => void\n}\n\nexport const OtpInput = forwardRef<HTMLDivElement, OtpInputProps>(\n function OtpInput(\n { className, disabled, error, length = 6, onComplete },\n ref\n ) {\n const [values, setValues] = useState<string[]>(() =>\n new Array(length).fill('')\n )\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n const focusAt = useCallback((index: number) => {\n inputsRef.current[index]?.focus()\n }, [])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n const digit = char.replace(/\\D/g, '').slice(-1)\n const next = [...values]\n next[index] = digit\n setValues(next)\n\n if (digit !== '' && index < length - 1) {\n focusAt(index + 1)\n }\n\n const code = next.join('')\n if (code.length === length && next.every((v) => v !== '')) {\n onComplete(code)\n }\n },\n [values, length, onComplete, focusAt]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && values[index] === '' && index > 0) {\n focusAt(index - 1)\n }\n },\n [values, focusAt]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n const pasted = e.clipboardData\n .getData('text')\n .replace(/\\D/g, '')\n .slice(0, length)\n const next = new Array(length).fill('') as string[]\n for (let i = 0; i < pasted.length; i++) {\n next[i] = pasted[i]\n }\n setValues(next)\n focusAt(Math.min(pasted.length, length - 1))\n\n if (pasted.length === length) {\n onComplete(pasted)\n }\n },\n [length, onComplete, focusAt]\n )\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex items-center', className)}\n data-component=\"otp-input\"\n >\n {values.map((v, i) => (\n <input\n key={i}\n ref={(el) => {\n inputsRef.current[i] = el\n }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={v}\n disabled={disabled}\n className={cx(\n 'text-fg bg-bg h-12 w-10 rounded border text-center text-lg font-semibold tabular-nums',\n error === true ? 'border-danger' : 'border-border',\n disabled === true && 'cursor-not-allowed opacity-50',\n focusCls\n )}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n />\n ))}\n </div>\n )\n }\n)\n","// overflow-menu — \"...\" button that reveals hidden action items\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype OverflowMenuItem = {\n id: string\n label: string\n}\n\ntype OverflowMenuProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> & {\n items: OverflowMenuItem[]\n onSelect: (id: string) => void\n}\n\nconst OverflowMenu = forwardRef<HTMLDivElement, OverflowMenuProps>(\n function OverflowMenu({ items, onSelect, className, ...props }, ref) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={cx('relative inline-flex', className)}\n data-component=\"overflow-menu\"\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n aria-label=\"More options\"\n className={cx(\n 'text-fg-muted hover:bg-bg-tertiary rounded px-2 py-1 text-sm transition-colors select-none',\n focusCls\n )}\n >\n ...\n </button>\n {open && (\n <div className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg absolute top-full right-0 z-50 mt-1 min-w-[140px] border py-1\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body text-fg hover:bg-bg-tertiary flex w-full items-center transition-colors',\n focusCls\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport { OverflowMenu }\nexport type { OverflowMenuItem, OverflowMenuProps }\n","// page-nav — previous/next page navigation\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype PageNavLink = {\n href?: string\n label: string\n onClick?: () => void\n}\n\ntype PageNavProps = React.HTMLAttributes<HTMLElement> & {\n next?: PageNavLink\n prev?: PageNavLink\n}\n\nconst linkCls = cx(\n 'flex items-center gap-1.5 gds-radius-button gds-pad-x gds-pad-y gds-text-body text-fg-muted hover:text-fg transition-colors',\n focusCls\n)\n\nexport const PageNav = forwardRef<HTMLElement, PageNavProps>(function PageNav(\n { prev, next, className, ...props },\n ref\n) {\n return (\n <nav\n ref={ref}\n className={cx('flex w-full items-center justify-between', className)}\n data-component=\"page-nav\"\n {...props}\n >\n <div>\n {prev !== undefined && (\n <a href={prev.href} onClick={prev.onClick} className={linkCls}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 3L5 7l4 4\" />\n </svg>\n {prev.label}\n </a>\n )}\n </div>\n <div>\n {next !== undefined && (\n <a href={next.href} onClick={next.onClick} className={linkCls}>\n {next.label}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3l4 4-4 4\" />\n </svg>\n </a>\n )}\n </div>\n </nav>\n )\n})\n\nexport type { PageNavLink, PageNavProps }\n","// pagination — page navigation with numbered buttons and ellipsis\nimport { forwardRef, useMemo } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type PaginationProps = React.HTMLAttributes<HTMLElement> & {\n page: number\n totalPages: number\n onPageChange: (page: number) => void\n siblings?: number\n}\n\nfunction range(start: number, end: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i++) result.push(i)\n return result\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n function Pagination(\n { page, totalPages, onPageChange, siblings = 1, className, ...props },\n ref\n ) {\n const pages = useMemo(() => {\n const total = totalPages\n const boundary = siblings + 3 // siblings + first + last + current\n if (total <= boundary + 2) return range(1, total)\n\n const left = Math.max(page - siblings, 2)\n const right = Math.min(page + siblings, total - 1)\n const showLeftDots = left > 2\n const showRightDots = right < total - 1\n\n const mid = range(left, right)\n const items: (number | 'dots-l' | 'dots-r')[] = [1]\n if (showLeftDots) items.push('dots-l')\n items.push(...mid)\n if (showRightDots) items.push('dots-r')\n items.push(total)\n return items\n }, [page, totalPages, siblings])\n\n const chevron = (dir: 'left' | 'right') => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={dir === 'left' ? 'M9 3L5 7l4 4' : 'M5 3l4 4-4 4'} />\n </svg>\n )\n\n const btnBase = cx(\n 'inline-flex gds-sq items-center justify-center gds-radius-button gds-text-body select-none',\n focusCls\n )\n\n return (\n <nav\n ref={ref}\n className={cx('gds-gap-xs flex items-center', className)}\n data-component=\"pagination\"\n aria-label=\"Pagination\"\n {...props}\n >\n <button\n type=\"button\"\n className={cx(\n btnBase,\n 'text-fg-muted',\n page <= 1\n ? 'pointer-events-none opacity-40'\n : 'hover:bg-bg-secondary'\n )}\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n {chevron('left')}\n </button>\n\n {pages.map((item) => {\n if (item === 'dots-l' || item === 'dots-r') {\n return (\n <span\n key={item}\n className=\"gds-sq gds-text-body text-fg-muted inline-flex items-center justify-center select-none\"\n >\n &hellip;\n </span>\n )\n }\n const active = item === page\n return (\n <button\n key={item}\n type=\"button\"\n className={cx(\n btnBase,\n active\n ? 'bg-accent text-accent-fg font-medium'\n : 'text-fg-muted hover:bg-bg-secondary hover:text-fg'\n )}\n aria-current={active ? 'page' : undefined}\n onClick={() => onPageChange(item as number)}\n >\n {item}\n </button>\n )\n })}\n\n <button\n type=\"button\"\n className={cx(\n btnBase,\n 'text-fg-muted',\n page >= totalPages\n ? 'pointer-events-none opacity-40'\n : 'hover:bg-bg-secondary'\n )}\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n {chevron('right')}\n </button>\n </nav>\n )\n }\n)\n","// panel — collapsible panel with header bar\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype PanelProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n collapsible?: boolean\n defaultOpen?: boolean\n glass?: boolean\n headerAction?: ReactNode\n title: string\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3.5 w-3.5 shrink-0 transition-transform duration-200',\n open && 'rotate-90'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\nexport const Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n {\n children,\n className,\n collapsible = true,\n defaultOpen = true,\n glass,\n headerAction,\n title,\n ...props\n },\n ref\n) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const expanded = collapsible ? isOpen : true\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-popover border-border bg-surface border',\n glassClass(glass),\n glass === true && 'border-white/10 bg-white/5',\n className\n )}\n data-component=\"panel\"\n data-state={expanded ? 'open' : 'closed'}\n ref={ref}\n {...props}\n >\n <div className=\"border-border gds-pad-x gds-pad-y-sm flex items-center border-b\">\n {collapsible ? (\n <button\n className={cx(\n 'text-fg flex flex-1 items-center gap-2 text-left text-sm font-medium',\n focusCls\n )}\n onClick={() => setIsOpen((prev) => !prev)}\n type=\"button\"\n >\n <ChevronIcon open={expanded} />\n <span>{title}</span>\n </button>\n ) : (\n <span className=\"text-fg flex-1 text-sm font-medium\">{title}</span>\n )}\n {headerAction !== undefined && (\n <div className=\"ml-2 shrink-0\">{headerAction}</div>\n )}\n </div>\n {expanded && <div className=\"gds-pad-x gds-pad-y\">{children}</div>}\n </div>\n )\n})\n\nexport type { PanelProps }\n","// particle-field — canvas-based particle animation with optional connections\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ParticleFieldProps = {\n className?: string\n color?: string\n connected?: boolean\n count?: number\n speed?: number\n}\n\ntype Particle = { vx: number; vy: number; x: number; y: number }\n\nexport const ParticleField = forwardRef<HTMLCanvasElement, ParticleFieldProps>(\n function ParticleField(\n { className, color = '#888888', connected, count = 60, speed = 0.5 },\n ref\n ) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const animRef = useRef<number>(0)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (canvas === null) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n const resize = () => {\n canvas.width = canvas.offsetWidth\n canvas.height = canvas.offsetHeight\n }\n resize()\n window.addEventListener('resize', resize)\n\n const particles: Particle[] = Array.from({ length: count }, () => ({\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n vx: (Math.random() - 0.5) * speed,\n vy: (Math.random() - 0.5) * speed,\n }))\n\n const draw = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n for (const p of particles) {\n p.x += p.vx\n p.y += p.vy\n if (p.x < 0 || p.x > canvas.width) p.vx *= -1\n if (p.y < 0 || p.y > canvas.height) p.vy *= -1\n\n ctx.beginPath()\n ctx.arc(p.x, p.y, 2, 0, Math.PI * 2)\n ctx.fillStyle = color\n ctx.fill()\n }\n\n if (connected === true) {\n const maxDist = 120\n for (let i = 0; i < particles.length; i++) {\n for (let j = i + 1; j < particles.length; j++) {\n const dx = particles[i].x - particles[j].x\n const dy = particles[i].y - particles[j].y\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < maxDist) {\n ctx.beginPath()\n ctx.moveTo(particles[i].x, particles[i].y)\n ctx.lineTo(particles[j].x, particles[j].y)\n ctx.strokeStyle = color\n ctx.globalAlpha = 1 - dist / maxDist\n ctx.stroke()\n ctx.globalAlpha = 1\n }\n }\n }\n }\n\n animRef.current = requestAnimationFrame(draw)\n }\n\n animRef.current = requestAnimationFrame(draw)\n\n return () => {\n cancelAnimationFrame(animRef.current)\n window.removeEventListener('resize', resize)\n }\n }, [color, connected, count, speed])\n\n return (\n <canvas\n ref={(node) => {\n canvasRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLCanvasElement | null>).current =\n node\n }\n }}\n className={cx('block h-full w-full', className)}\n data-component=\"particle-field\"\n />\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { Input } from '../l2-primitives/input'\nimport { Progress } from '../l2-primitives/progress'\nimport { cx } from '../utils/cx'\n\ntype StrengthLevel = 'none' | 'weak' | 'fair' | 'strong'\n\nfunction computeStrength(value: string): StrengthLevel {\n if (value.length === 0) return 'none'\n let score = 0\n if (value.length >= 8) score += 1\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1\n if (/\\d/.test(value)) score += 1\n if (/[^a-zA-Z0-9]/.test(value)) score += 1\n if (score <= 1) return 'weak'\n if (score <= 2) return 'fair'\n return 'strong'\n}\n\nconst strengthConfig: Record<\n Exclude<StrengthLevel, 'none'>,\n { label: string; value: number; variant: 'danger' | 'warning' | 'success' }\n> = {\n weak: { label: 'Weak', value: 33, variant: 'danger' },\n fair: { label: 'Fair', value: 66, variant: 'warning' },\n strong: { label: 'Strong', value: 100, variant: 'success' },\n}\n\ntype PasswordInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> & {\n error?: boolean\n glass?: boolean\n icon?: ReactNode\n inputSize?: 'default' | 'sm'\n showStrength?: boolean\n}\n\nconst eyeSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n)\n\nconst eyeOffSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n)\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput({ className, showStrength = false, ...props }, ref) {\n const [visible, setVisible] = useState(false)\n const value = typeof props.value === 'string' ? props.value : ''\n const strength = showStrength ? computeStrength(value) : 'none'\n\n const toggleButton = (\n <button\n aria-label={visible ? 'Hide password' : 'Show password'}\n className=\"text-fg-muted/50 hover:text-fg-muted cursor-pointer\"\n onClick={() => setVisible((v) => !v)}\n tabIndex={-1}\n type=\"button\"\n >\n {visible ? eyeOffSvg : eyeSvg}\n </button>\n )\n\n return (\n <div\n className={cx('flex flex-col gap-1.5', className)}\n data-component=\"password-input\"\n >\n <Input\n {...props}\n ref={ref}\n rightIcon={toggleButton}\n type={visible ? 'text' : 'password'}\n />\n {showStrength && strength !== 'none' && (\n <div className=\"flex items-center gap-2\">\n <Progress\n size=\"sm\"\n value={strengthConfig[strength].value}\n variant={strengthConfig[strength].variant}\n />\n <span className=\"text-fg-muted shrink-0 text-[10px] select-none\">\n {strengthConfig[strength].label}\n </span>\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { PasswordInputProps }\n","// phone-input — phone number input with country code prefix\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { useClickOutside } from '../utils/hooks'\n\nexport type PhoneCountry = {\n code: string\n label: string\n flag: string\n}\n\nconst DEFAULT_COUNTRIES: PhoneCountry[] = [\n { code: '+1', label: 'US', flag: '\\u{1F1FA}\\u{1F1F8}' },\n { code: '+44', label: 'UK', flag: '\\u{1F1EC}\\u{1F1E7}' },\n { code: '+81', label: 'JP', flag: '\\u{1F1EF}\\u{1F1F5}' },\n { code: '+86', label: 'CN', flag: '\\u{1F1E8}\\u{1F1F3}' },\n { code: '+82', label: 'KR', flag: '\\u{1F1F0}\\u{1F1F7}' },\n]\n\nexport type PhoneInputProps = {\n value: string\n onChange: (value: string) => void\n defaultCountry?: string\n countries?: PhoneCountry[]\n disabled?: boolean\n error?: boolean\n placeholder?: string\n className?: string\n}\n\nexport const PhoneInput = forwardRef<HTMLDivElement, PhoneInputProps>(\n function PhoneInput(\n {\n value,\n onChange,\n defaultCountry = '+81',\n countries,\n disabled = false,\n error = false,\n placeholder = 'Phone number',\n className,\n },\n ref\n ) {\n const countryList = countries ?? DEFAULT_COUNTRIES\n const [selectedCode, setSelectedCode] = useState(defaultCountry)\n const [dropdownOpen, setDropdownOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n useClickOutside(dropdownRef, dropdownOpen, () => setDropdownOpen(false))\n\n const selectedCountry =\n countryList.find((c) => c.code === selectedCode) ?? countryList[0]\n\n const handleCountrySelect = useCallback((code: string) => {\n setSelectedCode(code)\n setDropdownOpen(false)\n }, [])\n\n const handleInputChange = useCallback(\n (raw: string) => {\n // strip non-digit chars except dashes\n const cleaned = raw.replace(/[^\\d-]/g, '')\n onChange(cleaned)\n },\n [onChange]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-h gds-radius-input relative inline-flex items-stretch border',\n error ? 'border-danger' : 'border-border',\n disabled && 'cursor-not-allowed opacity-40',\n className\n )}\n data-component=\"phone-input\"\n data-disabled={disabled ? '' : undefined}\n data-error={error ? '' : undefined}\n >\n {/* country code selector */}\n <div ref={dropdownRef} className=\"relative\">\n <button\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'border-border flex h-full items-center gap-1 border-r px-2 text-sm select-none',\n 'gds-radius-input rounded-r-none transition-colors hover:bg-white/5',\n focusCls\n )}\n onClick={() => setDropdownOpen((prev) => !prev)}\n aria-label=\"Select country code\"\n >\n <span>{selectedCountry?.flag}</span>\n <span className=\"text-fg-muted gds-text-body\">\n {selectedCountry?.code}\n </span>\n </button>\n\n {dropdownOpen && (\n <div className=\"animate-popup border-border bg-surface absolute top-full left-0 z-50 mt-1 min-w-[140px] rounded-lg border shadow-lg\">\n {countryList.map((c) => (\n <button\n key={c.code}\n type=\"button\"\n className={cx(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm transition-colors hover:bg-white/5',\n c.code === selectedCode && 'bg-accent/10 text-accent'\n )}\n onClick={() => handleCountrySelect(c.code)}\n >\n <span>{c.flag}</span>\n <span className=\"text-fg-muted\">{c.label}</span>\n <span className=\"text-fg-muted/60 ml-auto\">{c.code}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* phone number input */}\n <input\n type=\"tel\"\n value={value}\n onChange={(e) => handleInputChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={cx(\n 'text-fg gds-text-body flex-1 bg-transparent px-3 focus:outline-none',\n focusCls\n )}\n aria-label=\"Phone number\"\n />\n </div>\n )\n }\n)\n","// pin-input — PIN/OTP code input with auto-focus progression\nimport type { ClipboardEvent, KeyboardEvent } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype PinInputProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n disabled?: boolean\n error?: boolean\n length?: number\n mask?: boolean\n numeric?: boolean\n onChange?: (value: string) => void\n onComplete?: (value: string) => void\n value?: string\n}\n\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(\n function PinInput(\n {\n className,\n disabled = false,\n error = false,\n length = 4,\n mask = false,\n numeric = false,\n onChange,\n onComplete,\n value,\n ...props\n },\n ref\n ) {\n const [internalValues, setInternalValues] = useState<string[]>(() =>\n Array.from({ length }, () => '')\n )\n const isControlled = value !== undefined\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const setInputRef = useCallback(\n (index: number) => (el: HTMLInputElement | null) => {\n inputRefs.current[index] = el\n },\n []\n )\n\n const focusInput = useCallback((index: number) => {\n const target = inputRefs.current[index]\n if (target !== null && target !== undefined) {\n target.focus()\n }\n }, [])\n\n const getDisplayValues = (): string[] => {\n if (isControlled) {\n return Array.from({ length }, (_, i) => value[i] ?? '')\n }\n return internalValues\n }\n\n const checkComplete = useCallback(\n (newValue: string, newValues?: string[]) => {\n if (onComplete !== undefined) {\n if (isControlled) {\n if (newValue.length === length) {\n onComplete(newValue)\n }\n } else if (\n newValues !== undefined &&\n newValues.every((v) => v !== '') &&\n newValues.join('').length === length\n ) {\n onComplete(newValues.join(''))\n }\n }\n },\n [isControlled, length, onComplete]\n )\n\n const handleInput = useCallback(\n (index: number, char: string) => {\n if (char.length !== 1) return\n if (numeric && !/^\\d$/.test(char)) return\n\n if (isControlled) {\n const chars = (value ?? '').split('')\n while (chars.length < index) {\n chars.push('')\n }\n chars[index] = char\n const next = chars.join('')\n if (onChange !== undefined) {\n onChange(next)\n }\n checkComplete(next)\n } else {\n const newValues = [...internalValues]\n newValues[index] = char\n setInternalValues(newValues)\n checkComplete('', newValues)\n }\n\n if (index < length - 1) {\n focusInput(index + 1)\n }\n },\n [\n value,\n length,\n numeric,\n isControlled,\n internalValues,\n onChange,\n checkComplete,\n focusInput,\n ]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault()\n if (isControlled) {\n const chars = (value ?? '').split('')\n if (chars[index] !== undefined && chars[index] !== '') {\n chars[index] = ''\n if (onChange !== undefined) {\n onChange(chars.join('').replace(/\\s+$/, ''))\n }\n } else if (index > 0) {\n chars.splice(index - 1, 1)\n if (onChange !== undefined) {\n onChange(chars.join(''))\n }\n focusInput(index - 1)\n }\n } else {\n const newValues = [...internalValues]\n if (newValues[index] !== '') {\n newValues[index] = ''\n setInternalValues(newValues)\n } else if (index > 0) {\n newValues[index - 1] = ''\n setInternalValues(newValues)\n focusInput(index - 1)\n }\n }\n }\n },\n [value, isControlled, internalValues, onChange, focusInput]\n )\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n let pasted = e.clipboardData.getData('text').slice(0, length)\n if (numeric) {\n pasted = pasted.replace(/\\D/g, '')\n }\n if (pasted.length === 0) return\n\n if (isControlled) {\n if (onChange !== undefined) {\n onChange(pasted)\n }\n checkComplete(pasted)\n } else {\n const newValues = Array.from({ length }, (_, i) => pasted[i] ?? '')\n setInternalValues(newValues)\n checkComplete('', newValues)\n }\n\n const nextIndex = Math.min(pasted.length, length - 1)\n focusInput(nextIndex)\n },\n [length, numeric, isControlled, onChange, checkComplete, focusInput]\n )\n\n const displayValues = getDisplayValues()\n\n return (\n <div\n className={cx('flex gap-2', error && 'animate-shake', className)}\n data-component=\"pin-input\"\n ref={ref}\n {...props}\n >\n {Array.from({ length }, (_, i) => (\n <input\n aria-label={`${numeric ? 'Digit' : 'Pin digit'} ${i + 1}`}\n autoComplete={numeric ? 'one-time-code' : undefined}\n className={cx(\n 'bg-bg text-fg h-10 w-10 rounded-md border text-center text-sm transition-colors outline-none',\n numeric && 'h-12 font-mono text-lg tabular-nums',\n error\n ? 'border-danger'\n : 'border-border hover:border-border-strong',\n focusCls,\n disabled && 'cursor-not-allowed opacity-50'\n )}\n disabled={disabled}\n inputMode={numeric ? 'numeric' : undefined}\n key={i}\n maxLength={1}\n onInput={(e) => {\n const target = e.target as HTMLInputElement\n const char = target.value\n if (char.length > 0) {\n handleInput(i, char[char.length - 1])\n }\n target.value = displayValues[i] ?? ''\n }}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n pattern={numeric ? '[0-9]*' : undefined}\n ref={setInputRef(i)}\n type={mask ? 'password' : 'text'}\n value={\n mask && displayValues[i] !== undefined && displayValues[i] !== ''\n ? '\\u2022'\n : (displayValues[i] ?? '')\n }\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { PinInputProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { isActivationKey } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\nconst placementClasses: Record<string, Record<string, string>> = {\n bottom: {\n center: 'top-full left-1/2 -translate-x-1/2 mt-2',\n end: 'top-full right-0 mt-2',\n start: 'top-full left-0 mt-2',\n },\n left: {\n center: 'right-full top-1/2 -translate-y-1/2 mr-2',\n end: 'right-full bottom-0 mr-2',\n start: 'right-full top-0 mr-2',\n },\n right: {\n center: 'left-full top-1/2 -translate-y-1/2 ml-2',\n end: 'left-full bottom-0 ml-2',\n start: 'left-full top-0 ml-2',\n },\n top: {\n center: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n end: 'bottom-full right-0 mb-2',\n start: 'bottom-full left-0 mb-2',\n },\n}\n\ntype PopoverProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> & {\n align?: 'center' | 'end' | 'start'\n content: ReactNode\n placement?: 'bottom' | 'left' | 'right' | 'top'\n trigger: ReactNode\n}\n\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(\n function Popover(\n {\n align = 'start',\n className,\n content,\n placement = 'bottom',\n trigger,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n return (\n <div\n className={cx('relative inline-flex', className)}\n data-component=\"popover\"\n data-state={open ? 'open' : 'closed'}\n ref={(node) => {\n ;(\n containerRef as React.MutableRefObject<HTMLDivElement | null>\n ).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n {...props}\n >\n <span\n onClick={() => setOpen((v) => !v)}\n onKeyDown={(e) => {\n if (isActivationKey(e)) {\n e.preventDefault()\n setOpen((v) => !v)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {trigger}\n </span>\n {open && (\n <div\n className={cx(\n 'animate-popup gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y gds-shadow-lg absolute z-50 border',\n placementClasses[placement]?.[align]\n )}\n >\n {content}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { PopoverProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype QuickStatProps = React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode\n label: string\n trend?: number\n value: string | number\n}\n\nexport const QuickStat = forwardRef<HTMLDivElement, QuickStatProps>(\n function QuickStat({ className, icon, label, trend, value, ...props }, ref) {\n const trendColor =\n trend !== undefined && trend > 0\n ? 'text-success'\n : trend !== undefined && trend < 0\n ? 'text-danger'\n : 'text-fg-muted'\n\n return (\n <div\n className={cx('inline-flex items-center gap-3 select-none', className)}\n data-component=\"quick-stat\"\n ref={ref}\n {...props}\n >\n {icon !== undefined && <div className=\"text-fg-muted\">{icon}</div>}\n <div className=\"flex flex-col\">\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-fg text-lg leading-tight font-semibold\">\n {value}\n </span>\n {trend !== undefined && (\n <span className={cx('text-xs font-medium', trendColor)}>\n {trend > 0 ? '+' : ''}\n {trend}%\n </span>\n )}\n </div>\n <span className=\"text-fg-muted text-xs leading-tight\">{label}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { QuickStatProps }\n","// radio-card — card-style radio group where each option is a selectable card\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype RadioCardOption = {\n value: string\n label: string\n description?: string\n icon?: ReactNode\n}\n\nexport type RadioCardProps = {\n options: RadioCardOption[]\n value: string | null\n onChange: (value: string) => void\n columns?: 1 | 2 | 3\n disabled?: boolean\n glass?: boolean\n className?: string\n}\n\nconst columnMap: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n}\n\nexport const RadioCard = forwardRef<HTMLDivElement, RadioCardProps>(\n function RadioCard(\n { options, value, onChange, columns = 1, disabled, glass, className },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap grid', columnMap[columns], className)}\n data-component=\"radio-card\"\n role=\"radiogroup\"\n >\n {options.map((option) => {\n const selected = value === option.value\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={disabled}\n onClick={() => {\n if (disabled !== true) {\n onChange(option.value)\n }\n }}\n className={cx(\n 'gds-gap gds-radius-card gds-pad-x gds-pad-y flex items-center text-left transition-colors',\n 'cursor-pointer select-none',\n glass === true\n ? cx(glassClass(glass), 'border border-white/10')\n : selected\n ? 'border-accent bg-accent/5 ring-accent border ring-1'\n : 'border-border hover:border-border-strong border',\n disabled === true && 'pointer-events-none opacity-50'\n )}\n data-state={selected ? 'selected' : 'idle'}\n >\n {/* radio dot */}\n <span\n className={cx(\n 'flex h-4 w-4 shrink-0 items-center justify-center rounded-full border-2 transition-colors',\n selected ? 'border-accent bg-accent' : 'border-border-strong'\n )}\n >\n {selected && (\n <span className=\"bg-fg h-1.5 w-1.5 rounded-full\" />\n )}\n </span>\n\n {/* icon */}\n {option.icon !== undefined && (\n <span className=\"text-fg-muted shrink-0\">{option.icon}</span>\n )}\n\n {/* label + description */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-fg text-sm font-medium\">\n {option.label}\n </div>\n {option.description !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-xs\">\n {option.description}\n </div>\n )}\n </div>\n </button>\n )\n })}\n </div>\n )\n }\n)\n","// reveal — slide-in reveal animation wrapper\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type RevealProps = {\n active: boolean\n children: ReactNode\n className?: string\n direction?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nconst translateMap: Record<NonNullable<RevealProps['direction']>, string> = {\n top: 'translate-y-[-20px]',\n bottom: 'translate-y-[20px]',\n left: 'translate-x-[-20px]',\n right: 'translate-x-[20px]',\n}\n\nexport const Reveal = forwardRef<HTMLDivElement, RevealProps>(function Reveal(\n { active, children, className, direction = 'bottom' },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'transition-all duration-300 ease-out',\n active\n ? 'translate-x-0 translate-y-0 opacity-100'\n : cx('opacity-0', translateMap[direction]),\n className\n )}\n data-component=\"reveal\"\n data-state={active ? 'visible' : 'hidden'}\n >\n {children}\n </div>\n )\n})\n","// scoreboard — score display with progress bar\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ScoreboardProps = {\n className?: string\n label: string\n max?: number\n score: number\n}\n\nexport const Scoreboard = forwardRef<HTMLDivElement, ScoreboardProps>(\n function Scoreboard({ className, label, max = 100, score }, ref) {\n const pct = useMemo(() => {\n if (max <= 0) return 0\n return Math.min(100, Math.max(0, (score / max) * 100))\n }, [score, max])\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"scoreboard\"\n >\n <div className=\"flex items-baseline justify-between\">\n <span className=\"gds-text text-fg-muted\">{label}</span>\n <span className=\"text-fg text-lg font-bold tabular-nums\">\n {score}\n <span className=\"text-fg-muted text-sm font-normal\">/{max}</span>\n </span>\n </div>\n <div className=\"bg-bg-tertiary h-2 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-accent h-full rounded-full transition-all duration-300\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Input } from '../l2-primitives/input'\nimport { Spinner } from '../l2-primitives/spinner'\nimport { cx } from '../utils/cx'\n\ntype SearchInputProps = {\n className?: string\n clearable?: boolean\n disabled?: boolean\n inputSize?: 'default' | 'sm'\n loading?: boolean\n onChange: (value: string) => void\n onSearch?: (value: string) => void\n placeholder?: string\n value: string\n}\n\nconst searchSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n)\n\nconst clearSvg = (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n)\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n function SearchInput(\n {\n className,\n clearable = true,\n disabled = false,\n inputSize,\n loading = false,\n onChange,\n onSearch,\n placeholder = 'Search...',\n value,\n },\n ref\n ) {\n const leftIcon = loading ? <Spinner size=\"sm\" /> : searchSvg\n\n const showClear = clearable && value.length > 0\n const rightIcon = showClear ? (\n <button\n aria-label=\"Clear search\"\n className=\"text-fg-muted/50 hover:text-fg-muted cursor-pointer\"\n onClick={() => onChange('')}\n tabIndex={-1}\n type=\"button\"\n >\n {clearSvg}\n </button>\n ) : undefined\n\n return (\n <Input\n className={cx(className)}\n data-component=\"search-input\"\n disabled={disabled}\n icon={leftIcon}\n inputSize={inputSize}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && onSearch !== undefined) {\n onSearch(value)\n }\n }}\n placeholder={placeholder}\n ref={ref}\n rightIcon={rightIcon}\n type=\"search\"\n value={value}\n />\n )\n }\n)\n\nexport type { SearchInputProps }\n","// select — styled native select with chevron overlay\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nexport const selectVariants = cva(\n cx(\n 'w-full appearance-none gds-radius-popover border bg-transparent pr-8 text-fg transition-colors',\n 'placeholder:text-fg-muted',\n focusCls\n ),\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n variants: {\n error: {\n true: 'border-danger text-danger',\n false: 'border-border hover:border-fg-muted',\n },\n inputSize: {\n default: 'gds-h-lg gds-pad-x text-sm',\n sm: 'gds-h-sm gds-pad-x-sm gds-text-body',\n },\n },\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n }\n)\n\nexport type SelectProps = Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n 'size'\n> &\n VariantProps<typeof selectVariants> & {\n glass?: boolean\n className?: string\n }\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n function Select(\n { error, inputSize, glass, className, children, ...props },\n ref\n ) {\n return (\n <div className=\"relative\" data-component=\"select\">\n <select\n ref={ref}\n className={cx(\n selectVariants({ error, inputSize }),\n glassClass(glass),\n className\n )}\n {...props}\n >\n {children}\n </select>\n <span className=\"text-fg-muted pointer-events-none absolute top-1/2 right-2 -translate-y-1/2\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n </span>\n </div>\n )\n }\n)\n","// slider-field — label + range slider + value display\nimport { forwardRef } from 'react'\n\nimport { RangeSlider } from '../l3-atoms/range-slider'\nimport { cx } from '../utils/cx'\n\ntype SliderFieldProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n label: string\n value: number\n onChange: (v: number) => void\n min?: number\n max?: number\n step?: number\n unit?: string\n}\n\nconst SliderField = forwardRef<HTMLDivElement, SliderFieldProps>(\n function SliderField(\n {\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n unit,\n className,\n ...props\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-1.5', className)}\n data-component=\"slider-field\"\n {...props}\n >\n <div className=\"flex items-center justify-between\">\n <label className=\"gds-text-body text-fg-muted select-none\">\n {label}\n </label>\n <span className=\"gds-text-body text-fg tabular-nums\">\n {value}\n {unit !== undefined ? ` ${unit}` : ''}\n </span>\n </div>\n <RangeSlider\n value={value}\n onChange={onChange}\n min={min}\n max={max}\n step={step}\n />\n </div>\n )\n }\n)\n\nexport { SliderField }\nexport type { SliderFieldProps }\n","// sortable-header — table column header with sort direction indicator\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype SortDirection = 'asc' | 'desc' | null\n\nexport type SortableHeaderProps = {\n label: string\n direction: SortDirection\n onSort: () => void\n className?: string\n}\n\nexport const SortableHeader = forwardRef<\n HTMLTableCellElement,\n SortableHeaderProps\n>(function SortableHeader({ label, direction, onSort, className }, ref) {\n const active = direction !== null\n\n return (\n <th\n ref={ref}\n className={cx(\n 'px-3 py-2 text-left text-xs font-medium transition-colors select-none',\n focusCls,\n active ? 'text-accent' : 'text-fg-muted',\n 'hover:text-accent cursor-pointer',\n className\n )}\n data-component=\"sortable-header\"\n data-state={direction ?? 'none'}\n onClick={onSort}\n role=\"columnheader\"\n tabIndex={0}\n >\n <span className=\"inline-flex items-center gap-1\">\n {label}\n {direction === 'asc' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 12V4M4.5 7.5L8 4l3.5 3.5\" />\n </svg>\n )}\n {direction === 'desc' && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 4v8M4.5 8.5L8 12l3.5-3.5\" />\n </svg>\n )}\n </span>\n </th>\n )\n})\n\nexport type { SortDirection }\n","// split-button — primary action + dropdown menu trigger\nimport type { ReactNode } from 'react'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\n\ntype SplitButtonVariant = 'danger' | 'primary' | 'secondary'\ntype SplitButtonSize = 'default' | 'lg' | 'sm'\n\ntype SplitButtonItem = {\n id: string\n label: string\n danger?: boolean\n}\n\ntype SplitButtonProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onClick'\n> & {\n children: ReactNode\n variant?: SplitButtonVariant\n size?: SplitButtonSize\n items: SplitButtonItem[]\n onSelect: (id: string) => void\n onClick?: () => void\n disabled?: boolean\n}\n\nconst variantClasses: Record<SplitButtonVariant, string> = {\n primary: 'bg-accent text-accent-fg hover:bg-accent/90',\n secondary:\n 'bg-bg-secondary text-fg border border-border hover:bg-bg-tertiary',\n danger: 'bg-danger text-white hover:bg-danger/90',\n}\n\nconst dividerClasses: Record<SplitButtonVariant, string> = {\n primary: 'border-l-white/20',\n secondary: 'border-l-border',\n danger: 'border-l-white/20',\n}\n\nconst sizeClasses: Record<SplitButtonSize, { main: string; trigger: string }> =\n {\n sm: { main: 'px-2.5 py-1 text-xs', trigger: 'px-1.5 py-1' },\n default: { main: 'px-3 py-1.5 text-sm', trigger: 'px-2 py-1.5' },\n lg: { main: 'px-4 py-2 text-sm', trigger: 'px-2.5 py-2' },\n }\n\nconst SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n function SplitButton(\n {\n children,\n variant = 'primary',\n size = 'default',\n items,\n onSelect,\n onClick,\n disabled,\n className,\n ...props\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n useClickOutside(containerRef, open, () => setOpen(false))\n useEscapeKey(open, () => setOpen(false))\n\n const v = variant ?? 'primary'\n const s = size ?? 'default'\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={cx('relative inline-flex', className)}\n data-component=\"split-button\"\n data-variant={v}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n <div className=\"inline-flex\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cx(\n 'inline-flex items-center rounded-l-md font-medium transition-colors select-none',\n variantClasses[v],\n sizeClasses[s].main,\n focusCls,\n disabled === true && 'pointer-events-none opacity-50'\n )}\n >\n {children}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setOpen((prev) => !prev)}\n aria-label=\"More actions\"\n className={cx(\n 'inline-flex items-center rounded-r-md border-l font-medium transition-colors select-none',\n variantClasses[v],\n dividerClasses[v],\n sizeClasses[s].trigger,\n focusCls,\n disabled === true && 'pointer-events-none opacity-50'\n )}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 5l3 3 3-3\" />\n </svg>\n </button>\n </div>\n\n {open && (\n <div className=\"animate-popup gds-radius-popover border-border bg-surface gds-shadow-lg absolute top-full left-0 z-50 mt-1 min-w-[160px] border py-1\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body flex w-full items-center transition-colors',\n focusCls,\n item.danger === true\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport { SplitButton }\nexport type {\n SplitButtonItem,\n SplitButtonProps,\n SplitButtonSize,\n SplitButtonVariant,\n}\n","// stacked-progress — multi-segment horizontal progress bar with optional labels\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StackedSegment = {\n label: string\n value: number\n color?: string\n}\n\nexport type StackedProgressProps = {\n segments: StackedSegment[]\n showLabels?: boolean\n className?: string\n}\n\nconst defaultColors = [\n 'var(--color-accent)',\n 'var(--color-success)',\n 'var(--color-warning)',\n 'var(--color-danger)',\n 'var(--color-fg-muted)',\n]\n\nexport const StackedProgress = forwardRef<HTMLDivElement, StackedProgressProps>(\n function StackedProgress({ segments, showLabels = true, className }, ref) {\n const total = segments.reduce((sum, s) => sum + s.value, 0)\n\n return (\n <div\n ref={ref}\n className={cx('select-none', className)}\n data-component=\"stacked-progress\"\n >\n <div className=\"bg-fg-muted/10 flex h-3 overflow-hidden rounded-full\">\n {segments.map((seg, i) => {\n const pct = total > 0 ? (seg.value / total) * 100 : 0\n if (pct <= 0) return null\n const color = seg.color ?? defaultColors[i % defaultColors.length]\n\n return (\n <div\n key={`${seg.label}-${i}`}\n className=\"transition-all duration-300\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n )\n })}\n </div>\n {showLabels && (\n <div className=\"mt-2 flex flex-wrap gap-3\">\n {segments.map((seg, i) => {\n const pct = total > 0 ? (seg.value / total) * 100 : 0\n const color = seg.color ?? defaultColors[i % defaultColors.length]\n\n return (\n <div\n key={`${seg.label}-${i}`}\n className=\"gds-text-body text-fg-muted flex items-center gap-1.5\"\n >\n <div\n className=\"h-2 w-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n <span>{seg.label}</span>\n <span className=\"text-fg font-medium\">{pct.toFixed(1)}%</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StatSide = { label: string; value: number | string }\n\ntype StatComparisonProps = React.HTMLAttributes<HTMLDivElement> & {\n highlight?: 'left' | 'none' | 'right'\n left: StatSide\n right: StatSide\n}\n\nexport const StatComparison = forwardRef<HTMLDivElement, StatComparisonProps>(\n function StatComparison(\n { className, highlight = 'none', left, right, ...props },\n ref\n ) {\n const sideCls = (side: 'left' | 'right') =>\n cx(\n 'flex flex-1 flex-col items-center rounded-lg border border-border p-3',\n highlight === side && 'border-accent bg-accent/5'\n )\n\n return (\n <div\n className={cx('gds-gap flex items-center', className)}\n data-component=\"stat-comparison\"\n ref={ref}\n {...props}\n >\n <div className={sideCls('left')}>\n <span className=\"gds-text-label text-fg-muted\">{left.label}</span>\n <span className=\"text-fg text-lg font-semibold\">{left.value}</span>\n </div>\n <span className=\"text-fg-muted shrink-0 text-xs font-medium\">vs</span>\n <div className={sideCls('right')}>\n <span className=\"gds-text-label text-fg-muted\">{right.label}</span>\n <span className=\"text-fg text-lg font-semibold\">{right.value}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { StatComparisonProps }\n","// stat-trend — stat card with value, label, trend, and optional sparkline\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StatTrendProps = {\n className?: string\n label: string\n trend: number\n trendData?: number[]\n value: number | string\n}\n\nfunction Sparkline({\n data,\n className,\n}: {\n className?: string\n data: number[]\n}) {\n if (data.length < 2) return null\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const w = 60\n const h = 20\n const step = w / (data.length - 1)\n\n const points = data\n .map((v, i) => `${i * step},${h - ((v - min) / range) * h}`)\n .join(' ')\n\n return (\n <svg width={w} height={h} className={className} viewBox={`0 0 ${w} ${h}`}>\n <polyline\n points={points}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const StatTrend = forwardRef<HTMLDivElement, StatTrendProps>(\n function StatTrend({ className, label, trend, trendData, value }, ref) {\n const isPositive = trend >= 0\n\n const trendIcon = useMemo(() => {\n if (isPositive) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 8l4-4 4 4\" />\n </svg>\n )\n }\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 4l4 4 4-4\" />\n </svg>\n )\n }, [isPositive])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap-sm gds-pad gds-radius border-border bg-surface flex flex-col border',\n className\n )}\n data-component=\"stat-trend\"\n >\n <span className=\"text-fg-muted text-xs\">{label}</span>\n <div className=\"gds-gap flex items-end justify-between\">\n <span className=\"text-fg text-2xl font-bold tabular-nums\">\n {value}\n </span>\n {trendData !== undefined && trendData.length >= 2 && (\n <Sparkline\n data={trendData}\n className={isPositive ? 'text-success' : 'text-danger'}\n />\n )}\n </div>\n <div\n className={cx(\n 'gds-gap-sm flex items-center text-xs font-medium',\n isPositive ? 'text-success' : 'text-danger'\n )}\n >\n {trendIcon}\n <span>\n {isPositive ? '+' : ''}\n {trend}%\n </span>\n </div>\n </div>\n )\n }\n)\n","// status-bar-component — application status bar\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StatusBarComponentProps = {\n items: ReactNode[]\n className?: string\n}\n\nexport const StatusBarComponent = forwardRef<\n HTMLDivElement,\n StatusBarComponentProps\n>(function StatusBarComponent({ items, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-surface text-fg-muted flex h-7 items-center border-t px-3 text-xs select-none',\n className\n )}\n data-component=\"status-bar\"\n >\n {items.map((item, i) => (\n <div key={i} className=\"flex items-center\">\n {i > 0 && <span className=\"bg-border mx-2 h-3 w-px\" />}\n <span>{item}</span>\n </div>\n ))}\n </div>\n )\n})\n","// tabs — horizontal tab bar with active indicator and optional counts\nimport { cva } from 'class-variance-authority'\nimport type { KeyboardEvent } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nexport type TabItem = {\n id: string\n label: string\n count?: number\n}\n\nexport const tabVariants = cva(\n cx('relative inline-flex items-center transition-colors', focusCls),\n {\n variants: {\n size: {\n default: 'gds-pad-x gds-pad-y text-sm',\n sm: 'gds-pad-x-sm gds-pad-y-sm gds-text-body',\n },\n active: {\n true: '',\n false: '',\n },\n variant: {\n default: 'border-b-2',\n pills: 'gds-radius px-3 py-1.5',\n underline: 'border-b',\n },\n },\n compoundVariants: [\n { variant: 'default', active: true, class: 'border-accent text-accent' },\n {\n variant: 'default',\n active: false,\n class: 'border-transparent text-fg-muted hover:text-fg',\n },\n { variant: 'pills', active: true, class: 'bg-accent text-accent-fg' },\n {\n variant: 'pills',\n active: false,\n class: 'text-fg-muted hover:bg-fg-muted/10 hover:text-fg',\n },\n {\n variant: 'underline',\n active: true,\n class: 'border-accent text-accent',\n },\n {\n variant: 'underline',\n active: false,\n class: 'border-transparent text-fg-muted hover:text-fg',\n },\n ],\n defaultVariants: {\n size: 'default',\n active: false,\n variant: 'default',\n },\n }\n)\n\nexport type TabsProps = {\n tabs: TabItem[]\n active: string\n onChange: (id: string) => void\n glass?: boolean\n size?: VariantProps<typeof tabVariants>['size']\n variant?: VariantProps<typeof tabVariants>['variant']\n scrollable?: boolean\n className?: string\n}\n\nexport function Tabs({\n tabs,\n active,\n onChange,\n glass,\n size = 'default',\n variant = 'default',\n scrollable = true,\n className,\n}: TabsProps) {\n const isPills = variant === 'pills'\n\n function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n if (\n e.key !== 'ArrowLeft' &&\n e.key !== 'ArrowRight' &&\n e.key !== 'Home' &&\n e.key !== 'End'\n ) {\n return\n }\n e.preventDefault()\n const currentIndex = tabs.findIndex((t) => t.id === active)\n if (currentIndex < 0) return\n\n let nextIndex = currentIndex\n if (e.key === 'ArrowRight') {\n nextIndex = (currentIndex + 1) % tabs.length\n } else if (e.key === 'ArrowLeft') {\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else if (e.key === 'Home') {\n nextIndex = 0\n } else if (e.key === 'End') {\n nextIndex = tabs.length - 1\n }\n\n onChange(tabs[nextIndex].id)\n const tablist = e.currentTarget\n const buttons = tablist.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')\n buttons[nextIndex]?.focus()\n }\n\n return (\n <div\n className={cx(\n 'flex',\n !isPills && 'border-border border-b',\n isPills && 'gap-1.5',\n scrollable && 'scrollbar-hide overflow-x-auto',\n glass\n ? cx('bg-bg/60 rounded-t-lg border-white/10', glassClass(glass))\n : '',\n className\n )}\n data-component=\"tabs\"\n role=\"tablist\"\n onKeyDown={handleKeyDown}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === active\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n tabIndex={isActive ? 0 : -1}\n aria-selected={isActive}\n onClick={() => onChange(tab.id)}\n className={tabVariants({ size, active: isActive, variant })}\n >\n {tab.label}\n {tab.count !== undefined && (\n <span className=\"gds-radius-badge bg-fg-muted/10 gds-text-caption ml-1.5 px-1.5\">\n {tab.count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","// tab-group — tabs with content panels in one composed component\nimport type { ReactNode } from 'react'\nimport { useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { Tabs } from './tabs'\n\nexport type TabGroupTab = {\n id: string\n label: string\n content: ReactNode\n disabled?: boolean\n}\n\nexport type TabGroupProps = {\n tabs: TabGroupTab[]\n defaultTab?: string\n lazy?: boolean\n keepMounted?: boolean\n activeTab?: string\n onTabChange?: (tabId: string) => void\n glass?: boolean\n className?: string\n}\n\nexport function TabGroup({\n tabs,\n defaultTab,\n lazy = false,\n keepMounted = true,\n activeTab: controlledTab,\n onTabChange,\n glass,\n className,\n}: TabGroupProps) {\n const isControlled = controlledTab !== undefined && onTabChange !== undefined\n const initialTab = defaultTab ?? (tabs.length > 0 ? tabs[0].id : '')\n const [internalTab, setInternalTab] = useState(initialTab)\n const currentTab = isControlled ? controlledTab : internalTab\n const renderedTabsRef = useRef<Set<string>>(new Set([currentTab]))\n\n if (lazy && keepMounted) {\n renderedTabsRef.current.add(currentTab)\n }\n\n const tabItems = tabs.map((t) => ({\n id: t.id,\n label: t.label,\n }))\n\n const handleChange = (id: string) => {\n const tab = tabs.find((t) => t.id === id)\n if (tab !== undefined && tab.disabled !== true) {\n if (isControlled) {\n onTabChange(id)\n } else {\n setInternalTab(id)\n }\n }\n }\n\n const renderContent = () => {\n if (lazy && keepMounted) {\n const rendered = renderedTabsRef.current\n return tabs\n .filter((t) => rendered.has(t.id))\n .map((t) => (\n <div\n key={t.id}\n role=\"tabpanel\"\n hidden={t.id !== currentTab}\n className=\"gds-pad\"\n >\n {t.content}\n </div>\n ))\n }\n\n const activeContent = tabs.find((t) => t.id === currentTab)\n if (activeContent === undefined) {\n return null\n }\n return (\n <div role=\"tabpanel\" className=\"gds-pad\">\n {activeContent.content}\n </div>\n )\n }\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-card border-border overflow-hidden border',\n glass !== undefined && glass !== false\n ? cx('bg-bg/60 border-white/10', glassClass(glass))\n : '',\n className\n )}\n data-component=\"tab-group\"\n >\n <Tabs\n tabs={tabItems}\n active={currentTab}\n onChange={handleChange}\n size=\"sm\"\n />\n {renderContent()}\n </div>\n )\n}\n","import { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype TagInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'onChange' | 'value'\n> & {\n disabled?: boolean\n error?: boolean\n glass?: boolean\n maxTags?: number\n onChange: (tags: string[]) => void\n value: string[]\n}\n\n// inline X icon for tag remove button\nfunction RemoveIcon() {\n return (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const TagInput = forwardRef<HTMLInputElement, TagInputProps>(\n function TagInput(\n {\n className,\n disabled = false,\n error = false,\n glass,\n maxTags,\n onChange,\n placeholder,\n value,\n ...props\n },\n ref\n ) {\n const [inputValue, setInputValue] = useState('')\n const [focused, setFocused] = useState(false)\n const innerRef = useRef<HTMLInputElement>(null)\n const inputRef = (ref ?? innerRef) as React.RefObject<HTMLInputElement>\n\n const atLimit = maxTags !== undefined && value.length >= maxTags\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmed = tag.trim()\n if (trimmed === '') return\n if (value.includes(trimmed)) return\n if (atLimit) return\n onChange([...value, trimmed])\n setInputValue('')\n },\n [atLimit, onChange, value]\n )\n\n const removeTag = useCallback(\n (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n },\n [onChange, value]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(inputValue)\n }\n if (e.key === 'Backspace' && inputValue === '' && value.length > 0) {\n removeTag(value.length - 1)\n }\n },\n [addTag, inputValue, removeTag, value.length]\n )\n\n const handleContainerClick = useCallback(() => {\n if (!disabled) {\n inputRef.current?.focus()\n }\n }, [disabled, inputRef])\n\n return (\n <div\n className={cx(\n 'gds-gap-xs gds-pad-x gds-pad-y-sm gds-radius-input bg-bg flex min-h-[var(--gds-h)] flex-wrap items-center border transition-colors',\n !error && !focused && 'border-border hover:border-border-strong',\n !error &&\n focused &&\n 'border-accent ring-accent ring-offset-bg ring-2 ring-offset-1',\n error && 'border-danger',\n error && focused && 'ring-danger ring-offset-bg ring-2 ring-offset-1',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"tag-input\"\n data-state={focused ? 'focused' : 'idle'}\n onClick={handleContainerClick}\n >\n {value.map((tag, index) => (\n <span\n className=\"gds-gap-xs gds-radius-badge gds-pad-x-sm gds-pad-y-sm gds-text-label bg-fg-muted/10 text-fg-muted inline-flex items-center font-medium select-none\"\n key={tag}\n >\n {tag}\n {!disabled && (\n <button\n className={cx(\n 'gds-radius-badge ml-0.5 p-0.5 transition-colors hover:bg-current/10',\n focusCls\n )}\n onClick={(e) => {\n e.stopPropagation()\n removeTag(index)\n }}\n tabIndex={-1}\n type=\"button\"\n >\n <RemoveIcon />\n </button>\n )}\n </span>\n ))}\n {!atLimit && (\n <input\n className=\"text-fg gds-text-body placeholder:text-fg-muted/50 min-w-[60px] flex-1 border-none bg-transparent outline-none disabled:cursor-not-allowed\"\n disabled={disabled}\n onBlur={() => setFocused(false)}\n onChange={(e) => setInputValue(e.target.value)}\n onFocus={() => setFocused(true)}\n onKeyDown={handleKeyDown}\n placeholder={value.length === 0 ? placeholder : undefined}\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n {...props}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { TagInputProps }\n","// text-reveal — text that reveals character-by-character or word-by-word\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TextRevealProps = {\n by?: 'character' | 'word'\n className?: string\n staggerDelay?: number\n text: string\n}\n\nexport const TextReveal = forwardRef<HTMLSpanElement, TextRevealProps>(\n function TextReveal(\n { by = 'word', className, staggerDelay = 50, text },\n ref\n ) {\n const parts = useMemo(() => {\n if (by === 'character') return text.split('')\n return text.split(' ')\n }, [by, text])\n\n return (\n <span\n ref={ref}\n className={cx('inline', className)}\n data-component=\"text-reveal\"\n aria-label={text}\n >\n {parts.map((part, i) => (\n <span\n key={`${i}-${part}`}\n className=\"animate-fadeIn inline-block opacity-0\"\n style={{\n animationDelay: `${i * staggerDelay}ms`,\n animationFillMode: 'forwards',\n }}\n aria-hidden\n >\n {part}\n {by === 'word' && i < parts.length - 1 ? '\\u00A0' : ''}\n </span>\n ))}\n </span>\n )\n }\n)\n","// text-scramble — text that scrambles through random characters before revealing\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TextScrambleProps = {\n characters?: string\n className?: string\n speed?: number\n text: string\n}\n\nexport const TextScramble = forwardRef<HTMLSpanElement, TextScrambleProps>(\n function TextScramble(\n {\n characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%',\n className,\n speed = 50,\n text,\n },\n ref\n ) {\n const [display, setDisplay] = useState(text)\n const frameRef = useRef(0)\n\n useEffect(() => {\n let iteration = 0\n const target = text\n\n const interval = setInterval(() => {\n setDisplay(\n target\n .split('')\n .map((char, i) => {\n if (i < iteration) return target[i]\n return characters[Math.floor(Math.random() * characters.length)]\n })\n .join('')\n )\n\n iteration += 1 / 3\n if (iteration >= target.length) {\n clearInterval(interval)\n setDisplay(target)\n }\n }, speed)\n\n return () => clearInterval(interval)\n }, [text, characters, speed])\n\n // cleanup on unmount\n useEffect(() => {\n const frame = frameRef\n return () => cancelAnimationFrame(frame.current)\n }, [])\n\n return (\n <span\n ref={ref}\n className={cx('text-fg inline-block font-mono', className)}\n data-component=\"text-scramble\"\n aria-label={text}\n >\n {display}\n </span>\n )\n }\n)\n","// tilt-card — mouse-tracking 3D tilt effect card\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TiltCardProps = {\n children: ReactNode\n className?: string\n glare?: boolean\n maxTilt?: number\n}\n\nexport const TiltCard = forwardRef<HTMLDivElement, TiltCardProps>(\n function TiltCard({ children, className, glare, maxTilt = 15 }, ref) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [transform, setTransform] = useState(\n 'perspective(800px) rotateX(0deg) rotateY(0deg)'\n )\n const [glareStyle, setGlareStyle] = useState<React.CSSProperties>({})\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const el = innerRef.current\n if (el === null) return\n\n const rect = el.getBoundingClientRect()\n const x = (e.clientX - rect.left) / rect.width\n const y = (e.clientY - rect.top) / rect.height\n const rotateX = (0.5 - y) * maxTilt * 2\n const rotateY = (x - 0.5) * maxTilt * 2\n\n setTransform(\n `perspective(800px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`\n )\n\n if (glare === true) {\n setGlareStyle({\n background: `radial-gradient(circle at ${x * 100}% ${y * 100}%, rgba(255,255,255,0.15), transparent 60%)`,\n })\n }\n },\n [maxTilt, glare]\n )\n\n const handleMouseLeave = useCallback(() => {\n setTransform('perspective(800px) rotateX(0deg) rotateY(0deg)')\n setGlareStyle({})\n }, [])\n\n return (\n <div\n ref={(node) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n className={cx(\n 'relative overflow-hidden transition-transform duration-150 ease-out',\n className\n )}\n style={{ transform }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n data-component=\"tilt-card\"\n >\n {children}\n {glare === true && (\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={glareStyle}\n />\n )}\n </div>\n )\n }\n)\n","// time-picker-grid — hour/minute scrollable columns dropdown (internal)\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype TimePickerGridProps = {\n glass?: boolean\n hours: number[]\n minutes: number[]\n onHourClick: (hour: number) => void\n onMinuteClick: (minute: number) => void\n selectedHour: number | null\n selectedMinute: number | null\n}\n\nfunction pad(n: number): string {\n if (n < 10) return `0${n}`\n return `${n}`\n}\n\nfunction TimePickerGrid({\n glass,\n hours,\n minutes,\n onHourClick,\n onMinuteClick,\n selectedHour,\n selectedMinute,\n}: TimePickerGridProps) {\n return (\n <div\n className={cx(\n 'animate-popup gds-radius-popover gds-shadow-lg absolute right-0 left-0 z-50 mt-1 flex border',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface'\n )}\n >\n <div\n className=\"border-border flex-1 overflow-y-auto border-r\"\n style={{ maxHeight: 200 }}\n >\n <div className=\"text-fg-muted/50 px-2 py-1 text-[10px] font-medium tracking-wider uppercase\">\n Hour\n </div>\n {hours.map((h) => (\n <button\n className={cx(\n 'flex w-full items-center justify-center py-1.5 text-sm transition-colors',\n h === selectedHour\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n key={h}\n onClick={() => onHourClick(h)}\n type=\"button\"\n >\n {pad(h)}\n </button>\n ))}\n </div>\n <div className=\"flex-1 overflow-y-auto\" style={{ maxHeight: 200 }}>\n <div className=\"text-fg-muted/50 px-2 py-1 text-[10px] font-medium tracking-wider uppercase\">\n Min\n </div>\n {minutes.map((m) => (\n <button\n className={cx(\n 'flex w-full items-center justify-center py-1.5 text-sm transition-colors',\n m === selectedMinute\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n key={m}\n onClick={() => onMinuteClick(m)}\n type=\"button\"\n >\n {pad(m)}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\nexport { pad, TimePickerGrid }\nexport type { TimePickerGridProps }\n","// time-picker — hour:minute selector with scrollable columns\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport { pad, TimePickerGrid } from './time-picker-grid'\n\ntype TimePickerProps = {\n className?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n minuteStep?: number\n onChange: (value: string | null) => void\n placeholder?: string\n value: string | null\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 transition-transform',\n open && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n )\n}\n\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n function TimePicker(\n {\n className,\n disabled = false,\n error = false,\n glass,\n minuteStep = 15,\n onChange,\n placeholder = 'Select time',\n value,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const mergedRef = (ref ?? containerRef) as React.RefObject<HTMLDivElement>\n\n const hours = useMemo(() => Array.from({ length: 24 }, (_, i) => i), [])\n const minutes = useMemo(() => {\n const step = Math.max(1, Math.min(60, minuteStep))\n const result: number[] = []\n let m = 0\n while (m < 60) {\n result.push(m)\n m += step\n }\n return result\n }, [minuteStep])\n\n const selectedHour = useMemo(() => {\n if (value === null) return null\n const parts = value.split(':')\n return parseInt(parts[0], 10)\n }, [value])\n\n const selectedMinute = useMemo(() => {\n if (value === null) return null\n const parts = value.split(':')\n return parseInt(parts[1], 10)\n }, [value])\n\n const handleOpen = useCallback(() => {\n if (disabled) return\n setOpen(true)\n }, [disabled])\n\n const handleClose = useCallback(() => {\n setOpen(false)\n }, [])\n\n const handleHourClick = useCallback(\n (hour: number) => {\n const minute = selectedMinute ?? 0\n onChange(`${pad(hour)}:${pad(minute)}`)\n },\n [selectedMinute, onChange]\n )\n\n const handleMinuteClick = useCallback(\n (minute: number) => {\n const hour = selectedHour ?? 0\n onChange(`${pad(hour)}:${pad(minute)}`)\n },\n [selectedHour, onChange]\n )\n\n useClickOutside(mergedRef, open, handleClose)\n useEscapeKey(open, handleClose)\n\n return (\n <div\n ref={mergedRef}\n className={cx('relative', className)}\n data-component=\"time-picker\"\n data-state={open ? 'open' : 'closed'}\n >\n <button\n className={cx(\n 'gds-h gds-radius-popover gds-pad-x text-fg flex w-full items-center justify-between border bg-transparent text-left text-sm transition-colors',\n focusCls,\n !error && 'border-border hover:border-fg-muted',\n error && 'border-danger',\n error && 'focus-visible:ring-danger',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10'\n )}\n disabled={disabled}\n onClick={handleOpen}\n type=\"button\"\n >\n <span className={cx(value !== null ? 'text-fg' : 'text-fg-muted')}>\n {value ?? placeholder}\n </span>\n <ChevronIcon open={open} />\n </button>\n\n {open && (\n <TimePickerGrid\n glass={glass}\n hours={hours}\n minutes={minutes}\n onHourClick={handleHourClick}\n onMinuteClick={handleMinuteClick}\n selectedHour={selectedHour}\n selectedMinute={selectedMinute}\n />\n )}\n </div>\n )\n }\n)\n\nexport type { TimePickerProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TimelineEntryVariant = 'danger' | 'default' | 'success' | 'warning'\n\ntype TimelineEntryProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n icon?: ReactNode\n last?: boolean\n variant?: TimelineEntryVariant\n}\n\nconst dotColor: Record<TimelineEntryVariant, string> = {\n default: 'bg-fg-muted/40',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n}\n\nexport const TimelineEntry = forwardRef<HTMLDivElement, TimelineEntryProps>(\n function TimelineEntry(\n { children, className, icon, last = false, variant = 'default', ...props },\n ref\n ) {\n return (\n <div\n className={cx('relative flex gap-3', className)}\n data-component=\"timeline-entry\"\n ref={ref}\n {...props}\n >\n <div className=\"flex flex-col items-center\">\n {icon !== undefined ? (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : (\n <span\n className={cx(\n 'mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full',\n dotColor[variant]\n )}\n />\n )}\n {!last && <span className=\"bg-border mt-1 w-px flex-1\" />}\n </div>\n <div className=\"flex-1 pb-4\">{children}</div>\n </div>\n )\n }\n)\n\nexport type { TimelineEntryProps, TimelineEntryVariant }\n","// toast-store — global imperative toast state management\n// provides a Sonner-compatible API: toast.success('msg'), toast.error('msg'), etc.\n// decoupled from React — store is a plain JS module, React reads via useSyncExternalStore\n\nimport type { ToastVariant } from './toast'\n\nexport type ToastOptions = {\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n description?: string\n dismissible?: boolean\n}\n\nexport type ToastItem = {\n id: string\n title: string\n variant: ToastVariant\n description?: string\n duration: number\n dismissible: boolean\n action?: {\n label: string\n onClick: () => void\n }\n createdAt: number\n}\n\n// ---- store ----\n\nlet items: ToastItem[] = []\nlet nextId = 0\nconst listeners = new Set<() => void>()\n\nfunction emit(): void {\n for (const fn of listeners) fn()\n}\n\nfunction addToast(\n title: string,\n variant: ToastVariant,\n options?: ToastOptions\n): string {\n const id = `gds-toast-${++nextId}`\n const item: ToastItem = {\n id,\n title,\n variant,\n description: options?.description,\n duration: options?.duration ?? 5000,\n dismissible: options?.dismissible !== false,\n action: options?.action,\n createdAt: Date.now(),\n }\n items = [...items, item]\n emit()\n return id\n}\n\nfunction dismiss(id: string): void {\n const prev = items\n items = items.filter((t) => t.id !== id)\n if (items !== prev) emit()\n}\n\nfunction dismissAll(): void {\n if (items.length === 0) return\n items = []\n emit()\n}\n\nfunction getSnapshot(): ToastItem[] {\n return items\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n// ---- public API ----\n\nexport const toast = {\n show: (title: string, options?: ToastOptions): string =>\n addToast(title, 'default', options),\n success: (title: string, options?: ToastOptions): string =>\n addToast(title, 'success', options),\n error: (title: string, options?: ToastOptions): string =>\n addToast(title, 'danger', options),\n warning: (title: string, options?: ToastOptions): string =>\n addToast(title, 'warning', options),\n info: (title: string, options?: ToastOptions): string =>\n addToast(title, 'default', options),\n dismiss,\n dismissAll,\n}\n\n// for React consumption\nexport const toastStore = {\n getSnapshot,\n subscribe,\n}\n","// toast-provider — renders toast items from the global store\n// place once at app root: <ToastProvider />\n// then call toast.success('Done!') from anywhere\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useSyncExternalStore,\n} from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\nimport { Toast } from './toast'\nimport type { ToastItem } from './toast-store'\nimport { toast as toastApi, toastStore } from './toast-store'\n\nexport type ToastPosition =\n | 'bottom-center'\n | 'bottom-left'\n | 'bottom-right'\n | 'top-center'\n | 'top-left'\n | 'top-right'\n\nexport type ToastProviderProps = React.HTMLAttributes<HTMLDivElement> & {\n maxVisible?: number\n position?: ToastPosition\n}\n\nconst positionStyles: Record<ToastPosition, string> = {\n 'top-right': 'top-4 right-4 items-end',\n 'top-left': 'top-4 left-4 items-start',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2 items-center',\n 'bottom-right': 'bottom-4 right-4 items-end',\n 'bottom-left': 'bottom-4 left-4 items-start',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center',\n}\n\nconst emptySnapshot: ToastItem[] = []\n\nexport const ToastProvider = forwardRef<HTMLDivElement, ToastProviderProps>(\n function ToastProvider(\n { position = 'bottom-right', maxVisible = 5, className, ...props },\n ref\n ) {\n const items = useSyncExternalStore(\n toastStore.subscribe,\n toastStore.getSnapshot,\n () => emptySnapshot\n )\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map()\n )\n\n const handleClose = useCallback((id: string) => {\n const timer = timersRef.current.get(id)\n if (timer !== undefined) {\n clearTimeout(timer)\n timersRef.current.delete(id)\n }\n toastApi.dismiss(id)\n }, [])\n\n // auto-dismiss timers\n useEffect(() => {\n const timers = timersRef.current\n const now = Date.now()\n for (const item of items) {\n if (item.duration > 0 && !timers.has(item.id)) {\n // account for elapsed time since creation (e.g. toast fired before provider mounted)\n const elapsed = now - item.createdAt\n const remaining = Math.max(0, item.duration - elapsed)\n if (remaining === 0) {\n toastApi.dismiss(item.id)\n continue\n }\n const timer = setTimeout(() => {\n timers.delete(item.id)\n toastApi.dismiss(item.id)\n }, remaining)\n timers.set(item.id, timer)\n }\n }\n // cleanup timers for removed items\n for (const [id, timer] of timers) {\n if (!items.some((i) => i.id === id)) {\n clearTimeout(timer)\n timers.delete(id)\n }\n }\n }, [items])\n\n // cleanup all timers on unmount\n useEffect(() => {\n const timers = timersRef.current\n return () => {\n for (const timer of timers.values()) clearTimeout(timer)\n timers.clear()\n }\n }, [])\n\n const visible = items.slice(-maxVisible)\n if (visible.length === 0) return null\n\n const actionButton = (item: ToastItem) => {\n if (item.action === undefined) return undefined\n return (\n <button\n type=\"button\"\n onClick={() => {\n item.action?.onClick()\n handleClose(item.id)\n }}\n className=\"gds-text-label text-accent shrink-0 font-medium hover:underline\"\n >\n {item.action.label}\n </button>\n )\n }\n\n return renderPortal(\n <div\n {...props}\n ref={ref}\n className={cx(\n 'pointer-events-none fixed z-[var(--gds-z-toast)] flex w-80 flex-col gap-2',\n positionStyles[position],\n className\n )}\n data-component=\"toast-provider\"\n aria-live=\"polite\"\n aria-label=\"Notifications\"\n >\n {visible.map((item) => (\n <div key={item.id} className=\"animate-slide-up pointer-events-auto\">\n <Toast\n title={item.title}\n description={item.description}\n variant={item.variant}\n onClose={\n item.dismissible ? () => handleClose(item.id) : undefined\n }\n action={actionButton(item)}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n","// toggle-field — label + switch + optional description for settings\nimport { forwardRef } from 'react'\n\nimport { Switch } from '../l3-atoms/switch'\nimport { cx } from '../utils/cx'\n\ntype ToggleFieldProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n label: string\n description?: string\n checked: boolean\n onChange: (v: boolean) => void\n disabled?: boolean\n}\n\nconst ToggleField = forwardRef<HTMLDivElement, ToggleFieldProps>(\n function ToggleField(\n { label, description, checked, onChange, disabled, className, ...props },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('flex items-center justify-between gap-4', className)}\n data-component=\"toggle-field\"\n {...props}\n >\n <div className=\"flex flex-col\">\n <span className=\"gds-text-body text-fg select-none\">{label}</span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs select-none\">\n {description}\n </span>\n )}\n </div>\n <Switch checked={checked} onChange={onChange} disabled={disabled} />\n </div>\n )\n }\n)\n\nexport { ToggleField }\nexport type { ToggleFieldProps }\n","// toolbar-generic — horizontal toolbar container with optional floating variant\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type ToolbarGenericProps = {\n children: ReactNode\n variant?: 'default' | 'floating'\n glass?: boolean\n className?: string\n}\n\nexport const ToolbarGeneric = forwardRef<HTMLDivElement, ToolbarGenericProps>(\n function ToolbarGeneric(\n { children, variant = 'default', glass, className },\n ref\n ) {\n const variantCls =\n variant === 'floating'\n ? 'gds-radius border border-border bg-surface shadow-md'\n : 'border-b border-border bg-bg'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap flex items-center px-3 py-2 select-none',\n variantCls,\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"toolbar-generic\"\n data-variant={variant}\n role=\"toolbar\"\n >\n {children}\n </div>\n )\n }\n)\n\nexport const ToolbarSeparator = forwardRef<HTMLDivElement>(\n function ToolbarSeparator(_props, ref) {\n return (\n <div\n ref={ref}\n className=\"bg-border/50 h-4 w-px\"\n data-component=\"toolbar-separator\"\n />\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ToolbarGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n}\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, ToolbarGroupProps>(\n function ToolbarGroup({ children, className, ...props }, ref) {\n return (\n <div\n className={cx(\n 'border-border inline-flex items-center overflow-hidden rounded-md border',\n '[&>*]:border-border [&>*]:rounded-none [&>*]:border-0 [&>*]:border-r [&>*:last-child]:border-r-0',\n className\n )}\n data-component=\"toolbar-group\"\n ref={ref}\n role=\"toolbar\"\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nexport type { ToolbarGroupProps }\n","// upload-progress — file upload progress list with status and actions\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type UploadFile = {\n error?: string\n name: string\n progress: number\n status: 'done' | 'error' | 'uploading'\n}\n\nexport type UploadProgressProps = {\n className?: string\n files: UploadFile[]\n onCancel?: (name: string) => void\n onRetry?: (name: string) => void\n}\n\nconst checkIcon = (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 8l3 3 7-7\" />\n </svg>\n)\n\nconst alertIcon = (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M8 5v3M8 10.5v.5\" />\n </svg>\n)\n\nconst closeIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n)\n\nconst retryIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 2v4h4M13 12V8H9\" />\n <path d=\"M3.5 9A5 5 0 0112.5 7M10.5 5A5 5 0 001.5 7\" />\n </svg>\n)\n\nexport const UploadProgress = forwardRef<HTMLDivElement, UploadProgressProps>(\n function UploadProgress({ className, files, onCancel, onRetry }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap-sm flex flex-col', className)}\n data-component=\"upload-progress\"\n >\n {files.map((file) => (\n <div\n key={file.name}\n className=\"gds-gap-sm gds-pad-x gds-pad-y border-border bg-surface flex flex-col rounded border\"\n >\n <div className=\"gds-gap-sm flex items-center\">\n {file.status === 'done' && (\n <span className=\"text-success shrink-0\">{checkIcon}</span>\n )}\n {file.status === 'error' && (\n <span className=\"text-danger shrink-0\">{alertIcon}</span>\n )}\n {file.status === 'uploading' && (\n <span className=\"border-accent h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-t-transparent\" />\n )}\n <span className=\"gds-text text-fg min-w-0 flex-1 truncate\">\n {file.name}\n </span>\n {file.status === 'uploading' && onCancel !== undefined && (\n <button\n type=\"button\"\n aria-label={`Cancel ${file.name}`}\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={() => onCancel(file.name)}\n >\n {closeIcon}\n </button>\n )}\n {file.status === 'error' && onRetry !== undefined && (\n <button\n type=\"button\"\n aria-label={`Retry ${file.name}`}\n className={cx(\n 'text-fg-muted hover:text-fg shrink-0 p-0.5',\n focusCls\n )}\n onClick={() => onRetry(file.name)}\n >\n {retryIcon}\n </button>\n )}\n </div>\n {file.status === 'uploading' && (\n <div className=\"bg-bg-tertiary h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-accent h-full rounded-full transition-all duration-300\"\n style={{\n width: `${Math.min(100, Math.max(0, file.progress))}%`,\n }}\n />\n </div>\n )}\n {file.status === 'error' && file.error !== undefined && (\n <span className=\"text-danger text-xs\">{file.error}</span>\n )}\n </div>\n ))}\n </div>\n )\n }\n)\n","// user-card — compact user display with avatar, name, role, and contact info\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype UserCardStatus = 'away' | 'busy' | 'offline' | 'online'\n\nconst statusColors: Record<UserCardStatus, string> = {\n away: 'bg-warning',\n busy: 'bg-danger',\n offline: 'bg-fg-muted/40',\n online: 'bg-success',\n}\n\nexport type UserCardProps = {\n name: string\n avatar?: string\n role?: string\n department?: string\n email?: string\n status?: UserCardStatus\n glass?: boolean\n className?: string\n children?: ReactNode\n}\n\nexport const UserCard = forwardRef<HTMLDivElement, UserCardProps>(\n function UserCard(\n {\n name,\n avatar,\n role,\n department,\n email,\n status,\n glass,\n className,\n children,\n },\n ref\n ) {\n const initials = (name ?? '')\n .split(' ')\n .map((w) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap gds-radius border-border bg-surface gds-pad inline-flex items-center border select-none',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"user-card\"\n >\n {/* avatar */}\n <div className=\"relative\">\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"h-9 w-9 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/15 text-accent flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium\">\n {initials}\n </div>\n )}\n {status !== undefined && (\n <span\n className={cx(\n 'border-surface absolute -right-0.5 -bottom-0.5 h-3 w-3 rounded-full border-2',\n statusColors[status]\n )}\n />\n )}\n </div>\n\n {/* info */}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-fg truncate text-sm font-medium\">{name}</span>\n {(role !== undefined || department !== undefined) && (\n <span className=\"gds-text-body text-fg-muted flex items-center gap-1\">\n {role !== undefined && <span>{role}</span>}\n {role !== undefined && department !== undefined && (\n <span className=\"text-fg-muted/40\">/</span>\n )}\n {department !== undefined && <span>{department}</span>}\n </span>\n )}\n {email !== undefined && (\n <span className=\"gds-text-body text-fg-muted/60 flex items-center gap-1\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3.5\" width=\"12\" height=\"9\" rx=\"1.5\" />\n <path d=\"M2 5l6 4 6-4\" />\n </svg>\n <span className=\"truncate\">{email}</span>\n </span>\n )}\n </div>\n\n {children}\n </div>\n )\n }\n)\n\nexport type { UserCardStatus }\n","import { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { cx } from '../utils/cx'\n\ntype UserInfoSize = 'sm' | 'default'\n\ntype UserInfoProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n name: string\n role?: string\n size?: UserInfoSize\n}\n\nexport const UserInfo = forwardRef<HTMLDivElement, UserInfoProps>(\n function UserInfo(\n { avatar, className, name, role, size = 'default', ...props },\n ref\n ) {\n const avatarSize = size === 'sm' ? 'sm' : 'default'\n const textCls = size === 'sm' ? 'text-xs' : 'text-sm'\n\n return (\n <div\n className={cx('inline-flex items-center gap-2 select-none', className)}\n data-component=\"user-info\"\n ref={ref}\n {...props}\n >\n <Avatar name={name} size={avatarSize} src={avatar} />\n <div className=\"flex flex-col\">\n <span className={cx('text-fg leading-tight font-medium', textCls)}>\n {name}\n </span>\n {role !== undefined && (\n <span\n className={cx(\n 'text-fg-muted leading-tight',\n size === 'sm' ? 'text-[10px]' : 'text-xs'\n )}\n >\n {role}\n </span>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport type { UserInfoProps, UserInfoSize }\n","// user-menu — avatar + name trigger with dropdown menu items\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype UserMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n danger?: boolean\n}\n\ntype UserMenuProps = {\n name: string\n avatar?: string\n role?: string\n items: UserMenuItem[]\n onSelect: (id: string) => void\n className?: string\n}\n\nconst UserMenu = forwardRef<HTMLDivElement, UserMenuProps>(function UserMenu(\n { name, avatar, role, items, onSelect, className },\n ref\n) {\n const [open, setOpen] = useState(false)\n const initials = name\n .split(' ')\n .map((w) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <div\n ref={ref}\n className={cx('relative', className)}\n data-component=\"user-menu\"\n >\n <button\n type=\"button\"\n className=\"hover:bg-bg-tertiary flex items-center gap-2 rounded-lg px-2 py-1.5 transition-colors select-none\"\n onClick={() => setOpen((p) => !p)}\n data-testid=\"user-menu-trigger\"\n >\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"h-7 w-7 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/10 text-accent flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold\">\n {initials}\n </div>\n )}\n <span className=\"text-fg text-sm font-medium\">{name}</span>\n </button>\n {open && (\n <div\n className=\"border-border bg-surface animate-popup absolute top-full right-0 z-50 mt-1 min-w-[160px] rounded-lg border py-1 shadow-lg\"\n data-testid=\"user-menu-dropdown\"\n >\n {role !== undefined && (\n <div className=\"text-fg-muted px-3 py-1.5 text-xs\">{role}</div>\n )}\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cx(\n 'hover:bg-bg-tertiary flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors select-none',\n item.danger === true ? 'text-danger' : 'text-fg'\n )}\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n >\n {item.icon !== undefined && (\n <span className=\"shrink-0\">{item.icon}</span>\n )}\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n})\n\nexport { UserMenu }\nexport type { UserMenuItem, UserMenuProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VersionBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n latest?: string\n version: string\n}\n\nconst VersionBadge = forwardRef<HTMLSpanElement, VersionBadgeProps>(\n function VersionBadge({ className, latest, version, ...props }, ref) {\n const hasUpdate = latest !== undefined && latest !== version\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium tabular-nums',\n hasUpdate ? 'bg-warning/15 text-warning' : 'bg-surface text-fg-muted',\n className\n )}\n data-component=\"version-badge\"\n data-has-update={hasUpdate}\n ref={ref}\n {...props}\n >\n v{version}\n {hasUpdate && (\n <svg\n className=\"shrink-0\"\n fill=\"currentColor\"\n height={12}\n viewBox=\"0 0 24 24\"\n width={12}\n >\n <path\n d=\"M12 2L12 16M12 16L7 11M12 16L17 11M5 20H19\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n />\n </svg>\n )}\n </span>\n )\n }\n)\n\nexport { VersionBadge }\nexport type { VersionBadgeProps }\n","// watermark — overlay repeated text watermark on content\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type WatermarkProps = {\n children: ReactNode\n text: string\n opacity?: number\n className?: string\n}\n\nexport const Watermark = forwardRef<HTMLDivElement, WatermarkProps>(\n function Watermark({ children, text, opacity = 0.1, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden', className)}\n data-component=\"watermark\"\n >\n {children}\n <div\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center overflow-hidden select-none\"\n style={{ opacity }}\n >\n <div\n className=\"absolute inset-[-50%] flex flex-wrap items-center justify-center gap-16\"\n style={{ transform: 'rotate(-30deg)' }}\n >\n {Array.from({ length: 64 }, (_, i) => (\n <span\n key={i}\n className=\"text-fg text-lg font-bold whitespace-nowrap\"\n >\n {text}\n </span>\n ))}\n </div>\n </div>\n </div>\n )\n }\n)\n","// wizard — multi-step wizard with numbered circles and content\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype WizardStep = {\n title: string\n content: ReactNode\n}\n\ntype WizardProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n steps: WizardStep[]\n currentStep?: number\n onStepChange?: (step: number) => void\n}\n\nexport const Wizard = forwardRef<HTMLDivElement, WizardProps>(function Wizard(\n { steps, currentStep, onStepChange, className, ...props },\n ref\n) {\n const [internal, setInternal] = useState(0)\n const active = currentStep ?? internal\n\n function goTo(step: number) {\n if (onStepChange !== undefined) {\n onStepChange(step)\n } else {\n setInternal(step)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"wizard\"\n {...props}\n >\n <div className=\"flex items-center gap-0\">\n {steps.map((step, i) => {\n const done = i < active\n const isCurrent = i === active\n return (\n <div key={`${step.title}-${i}`} className=\"flex items-center\">\n {i > 0 && (\n <div\n className={cx('h-px w-8', done ? 'bg-accent' : 'bg-border')}\n />\n )}\n <button\n type=\"button\"\n className={cx(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium transition-colors',\n done && 'bg-accent text-accent-fg',\n isCurrent && 'bg-accent/20 text-accent ring-accent ring-2',\n !done && !isCurrent && 'bg-bg-tertiary text-fg-muted'\n )}\n onClick={() => goTo(i)}\n >\n {i + 1}\n </button>\n </div>\n )\n })}\n </div>\n <div className=\"text-fg-muted text-xs font-medium\">\n {steps[active]?.title}\n </div>\n <div>{steps[active]?.content}</div>\n </div>\n )\n})\n\nexport type { WizardProps, WizardStep }\n"],"mappings":"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"}