@goliapkg/gds 2.1.1 → 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.
- package/dist/a11y-CoNNB_xa.js +6 -0
- package/dist/a11y-CoNNB_xa.js.map +1 -0
- package/dist/{avatar-Ct8OOGx6.js → avatar-oCar1zX6.js} +2 -2
- package/dist/{avatar-Ct8OOGx6.js.map → avatar-oCar1zX6.js.map} +1 -1
- package/dist/{badge-BCvi5RVF.js → badge-B3ijD3ch.js} +2 -2
- package/dist/{badge-BCvi5RVF.js.map → badge-B3ijD3ch.js.map} +1 -1
- package/dist/{button-BD3VHhwq.js → button-fRpdsI_4.js} +15 -41
- package/dist/button-fRpdsI_4.js.map +1 -0
- package/dist/dist-qdXk1a7h.js +35 -0
- package/dist/dist-qdXk1a7h.js.map +1 -0
- package/dist/{dom-17XgfxMq.js → dom-DkPgnDHP.js} +1 -1
- package/dist/{dom-17XgfxMq.js.map → dom-DkPgnDHP.js.map} +1 -1
- package/dist/editor/index.d.ts +11 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +1250 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/email-composer-field-UoKh5XMX.js +178 -0
- package/dist/email-composer-field-UoKh5XMX.js.map +1 -0
- package/dist/{gesture-I79dlTuS.js → gesture-CVcSA-iZ.js} +1 -1
- package/dist/{gesture-I79dlTuS.js.map → gesture-CVcSA-iZ.js.map} +1 -1
- package/dist/{highlight-BAGZc-4h.js → highlight-pgwGrmcq.js} +1 -1
- package/dist/{highlight-BAGZc-4h.js.map → highlight-pgwGrmcq.js.map} +1 -1
- package/dist/{hooks-BE-_EmDI.js → hooks-CejfTXVD.js} +1 -1
- package/dist/{hooks-BE-_EmDI.js.map → hooks-CejfTXVD.js.map} +1 -1
- package/dist/{icon-button-Bns79124.js → icon-button-CR2GECEZ.js} +3 -3
- package/dist/{icon-button-Bns79124.js.map → icon-button-CR2GECEZ.js.map} +1 -1
- package/dist/index.js +30 -27
- package/dist/l2-primitives/index.js +11 -11
- package/dist/{l2-primitives-Cn0KNxbB.js → l2-primitives-D503ozjH.js} +4 -4
- package/dist/{l2-primitives-Cn0KNxbB.js.map → l2-primitives-D503ozjH.js.map} +1 -1
- package/dist/l3-atoms/index.js +6 -5
- package/dist/{l3-atoms-BCJNqPHk.js → l3-atoms-CumlHlnP.js} +54 -53
- package/dist/{l3-atoms-BCJNqPHk.js.map → l3-atoms-CumlHlnP.js.map} +1 -1
- package/dist/l4-molecules/index.js +5 -4
- package/dist/{l4-molecules-DtNnQaFU.js → l4-molecules-CWwgFWmO.js} +125 -124
- package/dist/{l4-molecules-DtNnQaFU.js.map → l4-molecules-CWwgFWmO.js.map} +1 -1
- package/dist/l5-organisms/index.d.ts +0 -10
- package/dist/l5-organisms/index.d.ts.map +1 -1
- package/dist/l5-organisms/index.js +2 -2
- package/dist/{l5-organisms-Bu2Z8LSj.js → l5-organisms-QcvIAoHr.js} +1310 -2548
- package/dist/l5-organisms-QcvIAoHr.js.map +1 -0
- package/dist/l6-charts/index.js +1 -1
- package/dist/{l6-charts-DEA5DgMy.js → l6-charts-DKNVGuo0.js} +145 -17
- package/dist/l6-charts-DKNVGuo0.js.map +1 -0
- package/dist/l7-patterns/index.js +1 -1
- package/dist/{l7-patterns-CwonNW9o.js → l7-patterns-CM3FUxjA.js} +34 -34
- package/dist/{l7-patterns-CwonNW9o.js.map → l7-patterns-CM3FUxjA.js.map} +1 -1
- package/dist/loading-dots-CjzCz938.js +24 -0
- package/dist/loading-dots-CjzCz938.js.map +1 -0
- package/dist/motion-CKB1OKVd.js +22 -0
- package/dist/motion-CKB1OKVd.js.map +1 -0
- package/dist/{portal-Bbl6F_Wj.js → portal-B7bfstxv.js} +1 -1
- package/dist/{portal-Bbl6F_Wj.js.map → portal-B7bfstxv.js.map} +1 -1
- package/dist/{progress-dZIQEiTw.js → progress-B81FKPw5.js} +2 -2
- package/dist/{progress-dZIQEiTw.js.map → progress-B81FKPw5.js.map} +1 -1
- package/dist/{resize-handle-BjSNhgJK.js → resize-handle-BFffbhyG.js} +2 -2
- package/dist/{resize-handle-BjSNhgJK.js.map → resize-handle-BFffbhyG.js.map} +1 -1
- package/dist/{sanitize-BF45M9xp.js → sanitize-CO5dRqZX.js} +1 -1
- package/dist/{sanitize-BF45M9xp.js.map → sanitize-CO5dRqZX.js.map} +1 -1
- package/dist/{separator-CRll1Ycp.js → separator-wAUWmxji.js} +2 -2
- package/dist/{separator-CRll1Ycp.js.map → separator-wAUWmxji.js.map} +1 -1
- package/dist/{skeleton-C9FFZSYN.js → skeleton-DhqLfA7r.js} +1 -1
- package/dist/{skeleton-C9FFZSYN.js.map → skeleton-DhqLfA7r.js.map} +1 -1
- package/dist/{spinner-C15eER04.js → spinner-BimzKtfC.js} +3 -3
- package/dist/{spinner-C15eER04.js.map → spinner-BimzKtfC.js.map} +1 -1
- package/dist/{stepper-DJ8pn-9D.js → stepper-BINbai2f.js} +4 -4
- package/dist/{stepper-DJ8pn-9D.js.map → stepper-BINbai2f.js.map} +1 -1
- package/dist/{switch-BAS-GXJV.js → switch-COzaggYE.js} +3 -3
- package/dist/{switch-BAS-GXJV.js.map → switch-COzaggYE.js.map} +1 -1
- package/dist/{textarea-Btdu41rY.js → textarea-DD1huKel.js} +3 -3
- package/dist/{textarea-Btdu41rY.js.map → textarea-DD1huKel.js.map} +1 -1
- package/dist/toast-BujeTn1T.js +442 -0
- package/dist/toast-BujeTn1T.js.map +1 -0
- package/dist/{loading-dots-C1LPHGa0.js → tooltip-BlvhLCp0.js} +2 -17
- package/dist/tooltip-BlvhLCp0.js.map +1 -0
- package/dist/utils/index.js +8 -7
- package/package.json +5 -1
- package/dist/button-BD3VHhwq.js.map +0 -1
- package/dist/l5-organisms-Bu2Z8LSj.js.map +0 -1
- package/dist/l6-charts-DEA5DgMy.js.map +0 -1
- package/dist/loading-dots-C1LPHGa0.js.map +0 -1
- package/dist/motion-DUPegem-.js +0 -22
- package/dist/motion-DUPegem-.js.map +0 -1
- package/dist/toast-QxCZG0Oy.js +0 -614
- package/dist/toast-QxCZG0Oy.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"l5-organisms-Bu2Z8LSj.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../src/l5-organisms/activity-feed.tsx","../src/l5-organisms/animate-presence.tsx","../src/l5-organisms/animated-list.tsx","../src/l5-organisms/audio-player.tsx","../src/l5-organisms/audit-log.tsx","../src/l5-organisms/avatar-list.tsx","../src/l5-organisms/calendar-utils.ts","../src/l5-organisms/calendar.tsx","../src/l5-organisms/carousel.tsx","../src/l5-organisms/changelog.tsx","../src/l5-organisms/command-palette-list.tsx","../src/l5-organisms/command-palette.tsx","../src/l5-organisms/comment-thread.tsx","../src/l5-organisms/confetti-physics.ts","../src/l5-organisms/confetti.tsx","../src/l5-organisms/contact-card.tsx","../src/l5-organisms/container-list.tsx","../src/l5-organisms/cookie-banner.tsx","../src/l5-organisms/cron-schedule.tsx","../src/l5-organisms/data-grid.tsx","../src/l5-organisms/data-list.tsx","../src/l5-organisms/data-table/data-table-utils.ts","../src/l5-organisms/data-table/data-table-body.tsx","../src/l5-organisms/data-table/data-table-head.tsx","../src/l5-organisms/data-table/data-table-pagination.tsx","../src/l5-organisms/data-table/data-table-toolbar.tsx","../src/l5-organisms/data-table/data-table.tsx","../src/l5-organisms/date-picker.tsx","../src/l5-organisms/deploy-log.tsx","../src/l5-organisms/description-list.tsx","../src/l5-organisms/diff-algorithm.ts","../src/l5-organisms/diff-viewer.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/context.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/download.js","../node_modules/lucide-react/dist/esm/icons/file-text.js","../node_modules/lucide-react/dist/esm/icons/forward.js","../node_modules/lucide-react/dist/esm/icons/image.js","../node_modules/lucide-react/dist/esm/icons/paperclip.js","../node_modules/lucide-react/dist/esm/icons/reply-all.js","../node_modules/lucide-react/dist/esm/icons/reply.js","../node_modules/lucide-react/dist/esm/icons/send.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/x.js","../src/l5-organisms/rich-text-editor.tsx","../src/l5-organisms/email-composer.tsx","../src/l5-organisms/email-list-item.tsx","../src/l5-organisms/email-thread.tsx","../src/l5-organisms/embed.tsx","../src/l5-organisms/employee-card.tsx","../src/l5-organisms/error-boundary.tsx","../src/l5-organisms/file-browser.tsx","../src/l5-organisms/file-card.tsx","../src/l5-organisms/form-builder.tsx","../src/l5-organisms/gantt-chart/gantt-chart-utils.ts","../src/l5-organisms/gantt-chart/gantt-chart.tsx","../src/l5-organisms/heatmap-table.tsx","../src/l5-organisms/image-preview.tsx","../src/l5-organisms/infinite-scroll.tsx","../src/l5-organisms/json-node.tsx","../src/l5-organisms/json-viewer.tsx","../src/l5-organisms/kanban.tsx","../src/l5-organisms/markdown-parser.ts","../src/l5-organisms/markdown-preview.tsx","../src/l5-organisms/markdown-editor.tsx","../src/l5-organisms/masonry-grid.tsx","../src/l5-organisms/notification-center.tsx","../src/l5-organisms/notification-toast.tsx","../src/l5-organisms/parallax.tsx","../src/l5-organisms/payslip-card.tsx","../src/l5-organisms/permission-matrix.tsx","../src/l5-organisms/progress-timeline.tsx","../src/l5-organisms/property-editor.tsx","../src/l5-organisms/quick-links.tsx","../src/l5-organisms/recent-activity.tsx","../src/l5-organisms/responsive-stack.tsx","../src/l5-organisms/table.tsx","../src/l5-organisms/responsive-table.tsx","../src/l5-organisms/rich-select-list.tsx","../src/l5-organisms/rich-select.tsx","../src/l5-organisms/search-results.tsx","../src/l5-organisms/service-card.tsx","../src/l5-organisms/signature-drawing.ts","../src/l5-organisms/signature-pad.tsx","../src/l5-organisms/sortable-list.tsx","../src/l5-organisms/sortable-table.tsx","../src/l5-organisms/spotlight.tsx","../src/l5-organisms/stacked-list.tsx","../src/l5-organisms/step-form.tsx","../src/l5-organisms/system-health.tsx","../src/l5-organisms/tag-cloud.tsx","../src/l5-organisms/task-board.tsx","../src/l5-organisms/timeline.tsx","../src/l5-organisms/tour.tsx","../src/l5-organisms/transaction-list.tsx","../src/l5-organisms/tree.tsx","../src/l5-organisms/video-controls.tsx","../src/l5-organisms/video-player.tsx","../src/l5-organisms/virtual-list.tsx","../src/l5-organisms/weather-widget.tsx"],"sourcesContent":["// activity-feed — timestamped event log with avatars\nimport { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { cx } from '../utils/cx'\n\ntype ActivityFeedItem = {\n action: string\n avatar?: string\n id: string\n target?: string\n timestamp: string\n user: string\n}\n\ntype ActivityFeedProps = {\n className?: string\n items: ActivityFeedItem[]\n}\n\nexport const ActivityFeed = forwardRef<HTMLDivElement, ActivityFeedProps>(\n function ActivityFeed({ className, items }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col', className)}\n data-component=\"activity-feed\"\n role=\"list\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n className=\"gds-pad-x gds-pad-y-sm flex items-start gap-3\"\n role=\"listitem\"\n >\n <Avatar name={item.user} src={item.avatar} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-text-body\">\n <span className=\"text-fg font-medium\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n {item.target !== undefined && (\n <span className=\"text-fg font-medium\"> {item.target}</span>\n )}\n </div>\n <div className=\"gds-text-caption text-fg-muted mt-0.5\">\n {item.timestamp}\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { ActivityFeedItem, ActivityFeedProps }\n","// animate-presence — animates children on mount/unmount\nimport type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatePresenceAnimation = 'fade' | 'scale' | 'slide-up' | 'slide-down'\n\nexport type AnimatePresenceProps = {\n children: ReactNode\n animation?: AnimatePresenceAnimation\n duration?: number\n className?: string\n}\n\nconst enterClassMap: Record<AnimatePresenceAnimation, string> = {\n fade: 'animate-fade-in',\n scale: 'animate-scale-in',\n 'slide-up': 'animate-slide-up',\n 'slide-down': 'animate-slide-down',\n}\n\nconst exitClassMap: Record<AnimatePresenceAnimation, string> = {\n fade: 'animate-fade-out',\n scale: 'animate-scale-out',\n 'slide-up': 'animate-slide-down',\n 'slide-down': 'animate-slide-up',\n}\n\nexport const AnimatePresence = forwardRef<HTMLDivElement, AnimatePresenceProps>(\n function AnimatePresence(\n { children, animation = 'fade', duration = 200, className },\n ref\n ) {\n const [rendered, setRendered] = useState(\n children !== null && children !== undefined && children !== false\n )\n const [exiting, setExiting] = useState(false)\n const prevChildrenRef = useRef<ReactNode>(children)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const hasChildren =\n children !== null && children !== undefined && children !== false\n\n useEffect(() => {\n if (hasChildren) {\n // entering\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n setExiting(false)\n setRendered(true)\n prevChildrenRef.current = children\n } else if (rendered && !exiting) {\n // exiting\n setExiting(true)\n timerRef.current = setTimeout(() => {\n setRendered(false)\n setExiting(false)\n timerRef.current = null\n }, duration)\n }\n }, [hasChildren, children, duration, rendered, exiting])\n\n // cleanup timer on unmount\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n if (!rendered) return null\n\n const animClass = exiting\n ? exitClassMap[animation]\n : enterClassMap[animation]\n const displayChildren = exiting ? prevChildrenRef.current : children\n\n return (\n <div\n ref={ref}\n className={cx(animClass, className)}\n style={{ animationDuration: `${duration}ms` }}\n data-component=\"animate-presence\"\n data-state={exiting ? 'exiting' : 'entering'}\n >\n {displayChildren}\n </div>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { Children, forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedListAnimation = 'fade' | 'scale' | 'slide-left' | 'slide-up'\n\ntype AnimatedListProps = React.HTMLAttributes<HTMLDivElement> & {\n animation?: AnimatedListAnimation\n children: ReactNode\n stagger?: number\n}\n\nconst animationClassMap: Record<AnimatedListAnimation, string> = {\n fade: 'animate-fade-in',\n scale: 'animate-scale-in',\n 'slide-left': 'animate-slide-left',\n 'slide-up': 'animate-slide-up',\n}\n\nexport const AnimatedList = forwardRef<HTMLDivElement, AnimatedListProps>(\n function AnimatedList(\n { animation = 'slide-up', children, className, stagger = 50, ...props },\n ref\n ) {\n const items = Children.toArray(children)\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"animated-list\"\n ref={ref}\n {...props}\n >\n {items.map((child, index) => (\n <div\n key={index}\n className={animationClassMap[animation]}\n style={{ animationDelay: `${index * stagger}ms` }}\n >\n {child}\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { AnimatedListAnimation, AnimatedListProps }\n","// audio-player — compact audio player with progress bar\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type AudioPlayerProps = {\n src: string\n title?: string\n glass?: boolean\n className?: string\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60)\n const s = Math.floor(seconds % 60)\n return `${m}:${s.toString().padStart(2, '0')}`\n}\n\nexport const AudioPlayer = forwardRef<HTMLDivElement, AudioPlayerProps>(\n function AudioPlayer({ src, title, glass, className }, ref) {\n const audioRef = useRef<HTMLAudioElement>(null)\n const [playing, setPlaying] = useState(false)\n const [currentTime, setCurrentTime] = useState(0)\n const [duration, setDuration] = useState(0)\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n if (audio.paused) {\n audio.play().catch(() => {})\n setPlaying(true)\n } else {\n audio.pause()\n setPlaying(false)\n }\n }, [])\n\n const handleTimeUpdate = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n setCurrentTime(audio.currentTime)\n }, [])\n\n const handleLoadedMetadata = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n setDuration(audio.duration)\n }, [])\n\n const handleEnded = useCallback(() => {\n setPlaying(false)\n }, [])\n\n const handleSeek = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const audio = audioRef.current\n if (audio === null) return\n const rect = e.currentTarget.getBoundingClientRect()\n const ratio = (e.clientX - rect.left) / rect.width\n audio.currentTime = ratio * duration\n },\n [duration]\n )\n\n const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-card gds-pad-x gds-pad-y flex items-center gap-2',\n 'border-border bg-bg-secondary border',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"audio-player\"\n >\n <audio\n ref={audioRef}\n src={src}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n />\n\n {/* play/pause */}\n <button\n type=\"button\"\n onClick={togglePlay}\n className={cx('text-fg shrink-0', focusCls)}\n aria-label={playing ? 'Pause' : 'Play'}\n data-testid=\"play-button\"\n >\n {playing ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"3\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n <rect x=\"9\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4 2l10 6-10 6V2z\" />\n </svg>\n )}\n </button>\n\n {/* title */}\n {title !== undefined && (\n <span\n className=\"text-fg-muted shrink-0 text-xs select-none\"\n data-testid=\"title\"\n >\n {title}\n </span>\n )}\n\n {/* progress bar */}\n <div\n className={cx(\n 'bg-bg-tertiary relative h-1 flex-1 cursor-pointer rounded-full',\n focusCls\n )}\n onClick={handleSeek}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.floor(duration)}\n aria-valuenow={Math.floor(currentTime)}\n tabIndex={0}\n data-testid=\"progress-bar\"\n >\n <div\n className=\"bg-accent absolute inset-y-0 left-0 rounded-full\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n\n {/* time */}\n <span\n className=\"text-fg-muted shrink-0 text-xs tabular-nums select-none\"\n data-testid=\"time-display\"\n >\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { AuditEntry } from '../l4-molecules/audit-entry'\nimport { cx } from '../utils/cx'\n\ntype AuditLogEntry = {\n action: string\n id: string\n target?: string\n timestamp: string\n user: string\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\ntype AuditLogProps = React.HTMLAttributes<HTMLDivElement> & {\n entries: AuditLogEntry[]\n}\n\nexport const AuditLog = forwardRef<HTMLDivElement, AuditLogProps>(\n function AuditLog({ className, entries, ...props }, ref) {\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"audit-log\"\n ref={ref}\n {...props}\n >\n {entries.map((entry, i) => (\n <div\n key={entry.id}\n className={cx(\n 'gds-pad-x gds-pad-y',\n i % 2 === 1 && 'bg-surface/50'\n )}\n >\n <AuditEntry\n action={entry.action}\n target={entry.target}\n timestamp={entry.timestamp}\n user={entry.user}\n variant={entry.variant ?? 'default'}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { AuditLogEntry, AuditLogProps }\n","import { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype AvatarListUser = {\n name: string\n role?: string\n src?: string\n status?: 'away' | 'busy' | 'offline' | 'online'\n}\n\ntype AvatarListProps = React.HTMLAttributes<HTMLDivElement> & {\n users: AvatarListUser[]\n onSelect?: (name: string) => void\n compact?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const AvatarList = forwardRef<HTMLDivElement, AvatarListProps>(\n function AvatarList(\n { users, onSelect, compact = false, glass, className, ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-radius-popover border-border overflow-hidden border',\n glassClass(glass),\n className\n )}\n data-component=\"avatar-list\"\n ref={ref}\n {...props}\n >\n {users.map((user) => {\n const content = (\n <>\n <Avatar\n name={user.name}\n src={user.src}\n status={user.status}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-text-body text-fg truncate font-medium\">\n {user.name}\n </div>\n {compact !== true && user.role !== undefined && (\n <div className=\"gds-text-caption text-fg-muted truncate\">\n {user.role}\n </div>\n )}\n </div>\n </>\n )\n\n const rowCls = cx(\n 'flex items-center gds-gap gds-pad-x gds-pad-y',\n 'border-b border-border last:border-b-0',\n onSelect !== undefined &&\n `cursor-pointer transition-colors hover:bg-bg-tertiary/30 ${focusCls}`\n )\n\n if (onSelect !== undefined) {\n return (\n <button\n key={user.name}\n type=\"button\"\n className={cx(rowCls, 'w-full text-left')}\n onClick={() => onSelect(user.name)}\n >\n {content}\n </button>\n )\n }\n\n return (\n <div key={user.name} className={rowCls}>\n {content}\n </div>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { AvatarListProps, AvatarListUser }\n","// calendar-utils — date grid computation for calendar component\n\nexport const WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\nexport const MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function isDisabled(day: Date, min?: Date, max?: Date): boolean {\n if (\n min !== undefined &&\n day < new Date(min.getFullYear(), min.getMonth(), min.getDate())\n ) {\n return true\n }\n if (\n max !== undefined &&\n day > new Date(max.getFullYear(), max.getMonth(), max.getDate())\n ) {\n return true\n }\n return false\n}\n\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = []\n const date = new Date(year, month, 1)\n while (date.getMonth() === month) {\n days.push(new Date(date))\n date.setDate(date.getDate() + 1)\n }\n return days\n}\n\nexport function getCalendarGrid(year: number, month: number): (Date | null)[] {\n const days = getDaysInMonth(year, month)\n const firstDow = days[0].getDay()\n const grid: (Date | null)[] = Array.from({ length: firstDow }, () => null)\n grid.push(...days)\n while (grid.length < 42) {\n grid.push(null)\n }\n return grid\n}\n","// calendar — month grid with day selection, min/max constraints\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport {\n getCalendarGrid,\n isDisabled,\n isSameDay,\n MONTHS,\n WEEKDAYS,\n} from './calendar-utils'\n\nexport type CalendarProps = {\n value?: Date\n onChange?: (date: Date) => void\n min?: Date\n max?: Date\n className?: string\n}\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n function Calendar({ value, onChange, min, max, className }, ref) {\n const today = new Date()\n const initial = value ?? today\n const [viewYear, setViewYear] = useState(initial.getFullYear())\n const [viewMonth, setViewMonth] = useState(initial.getMonth())\n\n const grid = getCalendarGrid(viewYear, viewMonth)\n\n const prevMonth = () => {\n if (viewMonth === 0) {\n setViewYear((y) => y - 1)\n setViewMonth(11)\n } else {\n setViewMonth((m) => m - 1)\n }\n }\n\n const nextMonth = () => {\n if (viewMonth === 11) {\n setViewYear((y) => y + 1)\n setViewMonth(0)\n } else {\n setViewMonth((m) => m + 1)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y w-64 border select-none',\n className\n )}\n data-component=\"calendar\"\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={cx(\n 'text-fg-muted hover:bg-bg-secondary hover:text-fg rounded p-1',\n focusCls\n )}\n onClick={prevMonth}\n aria-label=\"Previous month\"\n >\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M10 4L6 8L10 12\" />\n </svg>\n </button>\n <span className=\"text-fg text-sm font-medium\">\n {MONTHS[viewMonth]} {viewYear}\n </span>\n <button\n type=\"button\"\n className={cx(\n 'text-fg-muted hover:bg-bg-secondary hover:text-fg rounded p-1',\n focusCls\n )}\n onClick={nextMonth}\n aria-label=\"Next month\"\n >\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 4L10 8L6 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"gds-gap-xs gds-text-body text-fg-muted grid grid-cols-7 text-center\">\n {WEEKDAYS.map((d) => (\n <div key={d} className=\"gds-pad-y-sm font-medium\">\n {d}\n </div>\n ))}\n </div>\n\n <div className=\"gds-gap-xs gds-text-body grid grid-cols-7 text-center\">\n {grid.map((day, i) => {\n if (day === null) {\n return <div key={`e-${i}`} className=\"gds-pad-y-sm\" />\n }\n const disabled = isDisabled(day, min, max)\n const selected = value !== undefined && isSameDay(day, value)\n const isToday = isSameDay(day, today)\n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'gds-radius-badge gds-pad-y-sm transition-colors',\n focusCls,\n disabled && 'cursor-not-allowed opacity-30',\n !disabled && !selected && 'hover:bg-bg-secondary',\n selected && 'bg-accent text-accent-fg',\n !selected && isToday && 'ring-accent ring-1',\n !disabled && 'text-fg'\n )}\n onClick={() => {\n if (!disabled && onChange !== undefined) onChange(day)\n }}\n >\n {day.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n )\n }\n)\n","// carousel — horizontal slide carousel with prev/next navigation\nimport type { ReactNode } from 'react'\nimport {\n Children,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CarouselProps = {\n children: ReactNode\n autoPlay?: boolean\n interval?: number\n showDots?: boolean\n showArrows?: boolean\n glass?: boolean\n className?: string\n}\n\nconst ArrowLeft = () => (\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=\"M10 3L5 8l5 5\" />\n </svg>\n)\n\nconst ArrowRight = () => (\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=\"M6 3l5 5-5 5\" />\n </svg>\n)\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n function Carousel(\n {\n children,\n autoPlay = false,\n interval = 5000,\n showDots = true,\n showArrows = true,\n glass = false,\n className,\n },\n ref\n ) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [activeIndex, setActiveIndex] = useState(0)\n const hoverRef = useRef(false)\n const touchStartRef = useRef<number | null>(null)\n\n const goTo = useCallback(\n (index: number) => {\n const next = ((index % count) + count) % count\n setActiveIndex(next)\n },\n [count]\n )\n\n const goPrev = useCallback(() => goTo(activeIndex - 1), [activeIndex, goTo])\n const goNext = useCallback(() => goTo(activeIndex + 1), [activeIndex, goTo])\n\n // auto-play\n useEffect(() => {\n if (!autoPlay || count <= 1) return\n const id = setInterval(() => {\n if (!hoverRef.current) {\n setActiveIndex((prev) => (prev + 1) % count)\n }\n }, interval)\n return () => clearInterval(id)\n }, [autoPlay, interval, count])\n\n // touch handling\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n touchStartRef.current = e.touches[0].clientX\n }, [])\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (touchStartRef.current === null) return\n const diff = e.changedTouches[0].clientX - touchStartRef.current\n if (Math.abs(diff) > 50) {\n if (diff < 0) goNext()\n else goPrev()\n }\n touchStartRef.current = null\n },\n [goNext, goPrev]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius relative overflow-hidden',\n glass && glassClass(glass),\n className\n )}\n data-component=\"carousel\"\n onMouseEnter={() => {\n hoverRef.current = true\n }}\n onMouseLeave={() => {\n hoverRef.current = false\n }}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {/* slides track */}\n <div\n className=\"flex transition-transform duration-300 ease-out\"\n style={{ transform: `translateX(-${activeIndex * 100}%)` }}\n >\n {slides.map((slide, i) => (\n <div key={i} className=\"w-full shrink-0\" data-slide={i}>\n {slide}\n </div>\n ))}\n </div>\n\n {/* arrows */}\n {showArrows && count > 1 && (\n <>\n <button\n type=\"button\"\n onClick={goPrev}\n className={cx(\n 'border-border bg-bg/80 text-fg hover:bg-bg absolute top-1/2 left-2 -translate-y-1/2 rounded-full border p-1.5 transition-colors',\n focusCls\n )}\n aria-label=\"Previous slide\"\n >\n <ArrowLeft />\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className={cx(\n 'border-border bg-bg/80 text-fg hover:bg-bg absolute top-1/2 right-2 -translate-y-1/2 rounded-full border p-1.5 transition-colors',\n focusCls\n )}\n aria-label=\"Next slide\"\n >\n <ArrowRight />\n </button>\n </>\n )}\n\n {/* dots */}\n {showDots && count > 1 && (\n <div\n className=\"absolute bottom-2 left-1/2 flex -translate-x-1/2 gap-1.5\"\n role=\"tablist\"\n >\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => goTo(i)}\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Slide ${i + 1}`}\n className={cx(\n 'h-2 w-2 rounded-full transition-all',\n i === activeIndex\n ? 'bg-accent scale-125'\n : 'bg-fg-muted/30 hover:bg-fg-muted/50',\n focusCls\n )}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n","// changelog — versioned changelog display\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst typeColors = {\n added: 'bg-success/15 text-success',\n changed: 'bg-accent/15 text-accent',\n fixed: 'bg-warning/15 text-warning',\n removed: 'bg-danger/15 text-danger',\n} as const\n\ntype ChangeType = 'added' | 'changed' | 'fixed' | 'removed'\n\ntype ChangelogChange = {\n type: ChangeType\n text: string\n}\n\ntype ChangelogEntry = {\n version: string\n date: string\n changes: ChangelogChange[]\n}\n\ntype ChangelogProps = React.HTMLAttributes<HTMLDivElement> & {\n entries: ChangelogEntry[]\n}\n\nexport const Changelog = forwardRef<HTMLDivElement, ChangelogProps>(\n function Changelog({ entries, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-6', className)}\n data-component=\"changelog\"\n {...props}\n >\n {entries.map((entry) => (\n <div key={entry.version} className=\"flex flex-col gap-2\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-fg gds-heading font-semibold\">\n {entry.version}\n </span>\n <span className=\"text-fg-muted text-xs\">{entry.date}</span>\n </div>\n <ul className=\"flex flex-col gap-1\">\n {entry.changes.map((change, i) => (\n <li\n key={`${change.type}-${i}`}\n className=\"gds-text text-fg flex items-start gap-2\"\n >\n <span\n className={cx(\n 'mt-0.5 shrink-0 rounded-full px-1.5 py-px text-[9px] leading-tight font-bold uppercase',\n typeColors[change.type]\n )}\n >\n {change.type}\n </span>\n <span>{change.text}</span>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { ChangelogChange, ChangelogEntry, ChangelogProps, ChangeType }\n","// command-palette-list — grouped results list (internal)\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { CommandItem } from './command-palette'\nimport { fuzzyMatchIndices } from './command-palette'\n\ntype CommandPaletteListProps = {\n groups: Map<string, CommandItem[]>\n activeIndex: number\n filteredCount: number\n onSelect: (id: string) => void\n query?: string\n fuzzy?: boolean\n}\n\nfunction highlightLabel(\n label: string,\n query: string,\n fuzzy: boolean\n): ReactNode {\n if (query === '') return label\n if (fuzzy) {\n const indices = new Set(fuzzyMatchIndices(label, query))\n if (indices.size === 0) return label\n return (\n <>\n {label.split('').map((char, i) => {\n if (indices.has(i)) {\n return (\n <span key={i} className=\"text-accent font-semibold\">\n {char}\n </span>\n )\n }\n return char\n })}\n </>\n )\n }\n // substring highlight\n const lower = label.toLowerCase()\n const idx = lower.indexOf(query.toLowerCase())\n if (idx < 0) return label\n return (\n <>\n {label.slice(0, idx)}\n <span className=\"text-accent font-semibold\">\n {label.slice(idx, idx + query.length)}\n </span>\n {label.slice(idx + query.length)}\n </>\n )\n}\n\nfunction CommandPaletteList({\n groups,\n activeIndex,\n filteredCount,\n onSelect,\n query = '',\n fuzzy = true,\n}: CommandPaletteListProps) {\n let flatIndex = -1\n\n if (filteredCount === 0) {\n return (\n <div className=\"text-fg-muted/40 py-8 text-center text-sm\">\n No results found\n </div>\n )\n }\n\n return (\n <>\n {Array.from(groups.entries()).map(([group, groupItems]) => (\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 {groupItems.map((item) => {\n flatIndex++\n const isActive = flatIndex === activeIndex\n return (\n <button\n key={item.id}\n className={cx(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-[13px] transition-colors select-none',\n isActive\n ? 'bg-accent/15 text-accent'\n : 'text-fg hover:bg-white/[0.04]'\n )}\n onClick={() => onSelect(item.id)}\n data-active={isActive}\n >\n {item.icon !== undefined && (\n <span className=\"text-fg-muted/50 flex h-5 w-5 shrink-0 items-center justify-center\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">\n {highlightLabel(item.label, query, fuzzy)}\n </span>\n {item.group !== undefined && (\n <span className=\"text-fg-muted/25 shrink-0 text-[11px]\">\n {item.group}\n </span>\n )}\n {item.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 {item.shortcut}\n </kbd>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </>\n )\n}\n\nexport { CommandPaletteList }\nexport type { CommandPaletteListProps }\n","// command-palette — searchable command launcher overlay\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { useEscapeKey, useScrollLock } from '../utils/hooks'\nimport { renderPortal } from '../utils/portal'\nimport { CommandPaletteList } from './command-palette-list'\n\nexport type CommandItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n group?: string\n description?: string\n disabled?: boolean\n action?: () => void\n}\n\nexport type CommandPaletteProps = {\n open: boolean\n onClose: () => void\n items: CommandItem[]\n onSelect: (id: string) => void\n placeholder?: string\n className?: string\n // v2: fuzzy search\n fuzzy?: boolean\n maxResults?: number\n // v2: recent history\n recentItems?: CommandItem[]\n maxRecent?: number\n onExecute?: (id: string) => void\n}\n\n// fuzzy match scoring: consecutive chars score higher than scattered\nfunction fuzzyScore(label: string, query: string): number {\n const lower = label.toLowerCase()\n const q = query.toLowerCase()\n let score = 0\n let queryIdx = 0\n let consecutive = 0\n let firstMatchBonus = 0\n\n for (let i = 0; i < lower.length && queryIdx < q.length; i++) {\n if (lower[i] === q[queryIdx]) {\n if (queryIdx === 0 && i === 0) firstMatchBonus = 10\n consecutive++\n score += consecutive * 2 // reward consecutive matches\n queryIdx++\n } else {\n consecutive = 0\n }\n }\n if (queryIdx < q.length) return -1 // not all query chars matched\n return score + firstMatchBonus\n}\n\nexport function fuzzyMatchIndices(label: string, query: string): number[] {\n const lower = label.toLowerCase()\n const q = query.toLowerCase()\n const indices: number[] = []\n let queryIdx = 0\n for (let i = 0; i < lower.length && queryIdx < q.length; i++) {\n if (lower[i] === q[queryIdx]) {\n indices.push(i)\n queryIdx++\n }\n }\n return indices\n}\n\nexport function CommandPalette({\n open,\n onClose,\n items,\n onSelect,\n placeholder = 'Search components, patterns, tokens...',\n className,\n fuzzy = true,\n maxResults = 50,\n recentItems,\n maxRecent = 5,\n onExecute,\n}: CommandPaletteProps) {\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n // reset + focus on open\n useEffect(() => {\n if (open) {\n setQuery('')\n setActiveIndex(0)\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n }, [open])\n\n const filtered = useMemo(() => {\n // show recent items when query is empty\n if (query === '') {\n if (recentItems !== undefined && recentItems.length > 0) {\n const recents = recentItems\n .slice(0, maxRecent)\n .map((r) => ({ ...r, group: 'Recent' }))\n return [...recents, ...items]\n }\n return items\n }\n\n if (fuzzy) {\n // fuzzy scoring — rank by match quality\n const scored = items\n .map((item) => ({ item, score: fuzzyScore(item.label, query) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n return scored.slice(0, maxResults).map(({ item }) => item)\n }\n\n // fallback: substring match\n const lower = query.toLowerCase()\n return items\n .filter((item) => item.label.toLowerCase().includes(lower))\n .slice(0, maxResults)\n }, [items, query, fuzzy, maxResults, recentItems, maxRecent])\n\n // group items\n const groups = useMemo(() => {\n const map = new Map<string, CommandItem[]>()\n for (const item of filtered) {\n const group = item.group ?? ''\n const list = map.get(group)\n if (list !== undefined) {\n list.push(item)\n } else {\n map.set(group, [item])\n }\n }\n return map\n }, [filtered])\n\n // scroll active item into view\n useEffect(() => {\n const el = listRef.current?.querySelector('[data-active=\"true\"]')\n if (el !== null && el !== undefined) {\n el.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex])\n\n const handleSelect = useCallback(\n (id: string) => {\n // fire action if item has one\n const item = filtered.find((i) => i.id === id)\n if (item?.disabled) return\n if (item?.action !== undefined) {\n item.action()\n }\n onSelect(id)\n if (onExecute !== undefined) onExecute(id)\n onClose()\n },\n [onSelect, onClose, onExecute, filtered]\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex(\n (prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1)\n )\n } else if (e.key === 'Enter' && filtered[activeIndex] !== undefined) {\n e.preventDefault()\n handleSelect(filtered[activeIndex].id)\n }\n },\n [filtered, activeIndex, handleSelect]\n )\n\n if (!open) return null\n\n return renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-start justify-center bg-black/60 pt-[15vh]\"\n data-component=\"command-palette\"\n data-state=\"open\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n onKeyDown={handleKeyDown}\n >\n <div\n className={cx(\n 'animate-scale-in bg-bg-secondary w-full max-w-xl rounded-xl border border-white/[0.06] shadow-2xl',\n className\n )}\n >\n {/* search bar */}\n <div className=\"flex items-center gap-3 border-b border-white/[0.06] px-4\">\n <svg\n className=\"text-fg-muted/40 h-4 w-4 shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n setActiveIndex(0)\n }}\n placeholder={placeholder}\n className=\"text-fg placeholder:text-fg-muted/30 flex-1 bg-transparent py-3.5 text-sm outline-none\"\n />\n <kbd className=\"text-fg-muted/40 shrink-0 rounded border border-white/[0.08] bg-white/[0.04] px-1.5 py-0.5 text-[10px] font-medium\">\n ESC\n </kbd>\n </div>\n\n {/* results */}\n <div ref={listRef} className=\"max-h-80 overflow-y-auto p-1.5\">\n <CommandPaletteList\n groups={groups}\n activeIndex={activeIndex}\n filteredCount={filtered.length}\n onSelect={handleSelect}\n query={query}\n fuzzy={fuzzy}\n />\n </div>\n\n {/* footer hints */}\n <div className=\"text-fg-muted/25 flex items-center justify-between border-t border-white/[0.06] px-4 py-2 text-[10px]\">\n <div className=\"flex items-center gap-3\">\n <span>↑↓ navigate</span>\n <span>↵ select</span>\n <span>esc close</span>\n </div>\n <span>{items.length} commands</span>\n </div>\n </div>\n </div>\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CommentData = {\n author: string\n avatar?: string\n content: string\n id: string\n replies?: CommentData[]\n timestamp: string\n}\n\ntype CommentThreadProps = React.HTMLAttributes<HTMLDivElement> & {\n comments: CommentData[]\n}\n\nfunction CommentNode({\n comment,\n depth = 0,\n}: {\n comment: CommentData\n depth?: number\n}) {\n return (\n <div className={cx(depth > 0 && 'border-border ml-8 border-l pl-4')}>\n <div className=\"gds-gap flex items-start\">\n <div className=\"bg-accent/10 text-accent flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-xs font-medium\">\n {comment.avatar ?? comment.author.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-gap-sm flex items-baseline\">\n <span className=\"text-fg text-sm font-medium\">\n {comment.author}\n </span>\n <span className=\"gds-text-label text-fg-muted\">\n {comment.timestamp}\n </span>\n </div>\n <p className=\"text-fg-muted mt-1 text-sm\">{comment.content}</p>\n </div>\n </div>\n {comment.replies !== undefined && comment.replies.length > 0 && (\n <div className=\"gds-gap mt-3 flex flex-col\">\n {comment.replies.map((reply) => (\n <CommentNode comment={reply} depth={depth + 1} key={reply.id} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const CommentThread = forwardRef<HTMLDivElement, CommentThreadProps>(\n function CommentThread({ className, comments, ...props }, ref) {\n return (\n <div\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"comment-thread\"\n ref={ref}\n role=\"list\"\n {...props}\n >\n {comments.map((comment) => (\n <div key={comment.id} role=\"listitem\">\n <CommentNode comment={comment} />\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { CommentData, CommentThreadProps }\n","// confetti-physics — particle creation, update, and rendering\n\nexport type Particle = {\n color: string\n drag: number\n gravity: number\n rotation: number\n rotationSpeed: number\n size: number\n vx: number\n vy: number\n x: number\n y: number\n}\n\nexport function createParticle(\n canvasWidth: number,\n colors: string[]\n): Particle {\n return {\n x: Math.random() * canvasWidth,\n y: -10,\n vx: (Math.random() - 0.5) * 8,\n vy: Math.random() * -6 - 4,\n size: Math.random() * 6 + 4,\n color: colors[Math.floor(Math.random() * colors.length)],\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 10,\n gravity: 0.15,\n drag: 0.98,\n }\n}\n\nexport function updateParticle(p: Particle): Particle {\n return {\n ...p,\n x: p.x + p.vx,\n y: p.y + p.vy,\n vx: p.vx * p.drag,\n vy: (p.vy + p.gravity) * p.drag,\n rotation: p.rotation + p.rotationSpeed,\n }\n}\n\nexport function drawParticle(ctx: CanvasRenderingContext2D, p: Particle): void {\n ctx.save()\n ctx.translate(p.x, p.y)\n ctx.rotate((p.rotation * Math.PI) / 180)\n ctx.fillStyle = p.color\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6)\n ctx.restore()\n}\n","// confetti — canvas-based celebration particle animation\nimport { useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\nimport type { Particle } from './confetti-physics'\nimport {\n createParticle,\n drawParticle,\n updateParticle,\n} from './confetti-physics'\n\ntype ConfettiProps = {\n active: boolean\n className?: string\n colors?: string[]\n duration?: number\n particleCount?: number\n}\n\nconst DEFAULT_COLORS = [\n '#6366f1',\n '#ec4899',\n '#14b8a6',\n '#f59e0b',\n '#8b5cf6',\n '#ef4444',\n '#22c55e',\n '#3b82f6',\n]\n\nexport function Confetti({\n active,\n className,\n colors = DEFAULT_COLORS,\n duration = 3000,\n particleCount = 100,\n}: ConfettiProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const particlesRef = useRef<Particle[]>([])\n const rafRef = useRef<number>(0)\n const startTimeRef = useRef<number>(0)\n\n useEffect(() => {\n if (!active) {\n particlesRef.current = []\n return\n }\n\n const canvas = canvasRef.current\n if (canvas === null) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n // size canvas to viewport\n canvas.width = window.innerWidth\n canvas.height = window.innerHeight\n\n particlesRef.current = []\n startTimeRef.current = performance.now()\n let spawnedCount = 0\n\n function animate(now: number) {\n if (canvas === null || ctx === null) return\n\n const elapsed = now - startTimeRef.current\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n // spawn particles over time\n if (elapsed < duration) {\n const targetSpawned = Math.min(\n particleCount,\n Math.floor((elapsed / duration) * particleCount)\n )\n while (spawnedCount < targetSpawned) {\n particlesRef.current = [\n ...particlesRef.current,\n createParticle(canvas.width, colors),\n ]\n spawnedCount += 1\n }\n }\n\n // update and draw\n particlesRef.current = particlesRef.current\n .map(updateParticle)\n .filter((p) => p.y < canvas.height + 20)\n\n for (const p of particlesRef.current) {\n drawParticle(ctx, p)\n }\n\n // keep animating if there are still particles\n if (particlesRef.current.length > 0 || elapsed < duration) {\n rafRef.current = requestAnimationFrame(animate)\n }\n }\n\n rafRef.current = requestAnimationFrame(animate)\n\n return () => {\n cancelAnimationFrame(rafRef.current)\n }\n }, [active, colors, duration, particleCount])\n\n if (!active) return null\n\n return renderPortal(\n <canvas\n ref={canvasRef}\n className={cx('pointer-events-none fixed inset-0 z-[9999]', className)}\n data-component=\"confetti\"\n />\n )\n}\n\nexport type { ConfettiProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ContactCardProps = React.HTMLAttributes<HTMLDivElement> & {\n actions?: ReactNode\n avatar?: string\n email?: string\n name: string\n phone?: string\n role?: string\n}\n\nexport const ContactCard = forwardRef<HTMLDivElement, ContactCardProps>(\n function ContactCard(\n { actions, avatar, className, email, name, phone, role, ...props },\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 className={cx(\n 'gds-ctx gds-radius-card border-border bg-surface gds-pad border text-center',\n className\n )}\n data-component=\"contact-card\"\n ref={ref}\n {...props}\n >\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"mx-auto h-14 w-14 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/10 text-accent mx-auto flex h-14 w-14 items-center justify-center rounded-full text-sm font-semibold\">\n {initials}\n </div>\n )}\n <div className=\"text-fg mt-3 font-semibold\">{name}</div>\n {role !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-xs\">{role}</div>\n )}\n {email !== undefined && (\n <div className=\"text-fg-muted mt-2 text-xs\">{email}</div>\n )}\n {phone !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-xs\">{phone}</div>\n )}\n {actions !== undefined && (\n <div className=\"mt-3 flex justify-center gap-2\">{actions}</div>\n )}\n </div>\n )\n }\n)\n\nexport type { ContactCardProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ContainerStatus = 'paused' | 'running' | 'stopped'\n\ntype ContainerInfo = {\n image: string\n name: string\n ports?: string\n status: ContainerStatus\n}\n\ntype ContainerListProps = React.HTMLAttributes<HTMLDivElement> & {\n containers: ContainerInfo[]\n}\n\nconst dotCls: Record<ContainerStatus, string> = {\n running: 'bg-success',\n stopped: 'bg-danger',\n paused: 'bg-warning',\n}\n\nexport const ContainerList = forwardRef<HTMLDivElement, ContainerListProps>(\n function ContainerList({ className, containers, ...props }, ref) {\n return (\n <div\n className={cx(\n 'gds-radius-popover border-border overflow-hidden border',\n className\n )}\n data-component=\"container-list\"\n ref={ref}\n {...props}\n >\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-bg-tertiary/50 gds-text-body text-fg-muted text-left\">\n <th className=\"px-3 py-1.5 font-medium\">Name</th>\n <th className=\"px-3 py-1.5 font-medium\">Image</th>\n <th className=\"px-3 py-1.5 font-medium\">Status</th>\n <th className=\"px-3 py-1.5 font-medium\">Ports</th>\n </tr>\n </thead>\n <tbody>\n {containers.map((c) => (\n <tr\n key={c.name}\n className=\"border-border gds-text-body hover:bg-bg-tertiary/30 border-t transition-colors\"\n >\n <td className=\"text-fg px-3 py-1.5 font-medium\">{c.name}</td>\n <td className=\"text-fg-muted px-3 py-1.5 font-mono text-xs\">\n {c.image}\n </td>\n <td className=\"px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span\n className={cx('h-2 w-2 rounded-full', dotCls[c.status])}\n />\n <span className=\"text-fg-muted\">{c.status}</span>\n </span>\n </td>\n <td className=\"text-fg-muted px-3 py-1.5 font-mono text-xs\">\n {c.ports ?? '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n\nexport type { ContainerInfo, ContainerListProps, ContainerStatus }\n","// cookie-banner — GDPR-style consent banner with accept/reject\nimport { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype CookieBannerProps = {\n onAccept: () => void\n onReject?: () => void\n message?: string\n className?: string\n}\n\nconst defaultMessage =\n 'We use cookies to improve your experience. By continuing to use this site, you agree to our use of cookies.'\n\nconst CookieBannerInner = forwardRef<HTMLDivElement, CookieBannerProps>(\n function CookieBannerInner({ onAccept, onReject, message, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-surface/80 fixed inset-x-0 bottom-0 z-50 flex items-center justify-between gap-4 border-t px-6 py-4 backdrop-blur-lg',\n className\n )}\n data-component=\"cookie-banner\"\n role=\"banner\"\n >\n <p className=\"text-fg-muted flex-1 text-sm\">\n {message ?? defaultMessage}\n </p>\n <div className=\"flex shrink-0 gap-2\">\n {onReject !== undefined && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReject}>\n Reject\n </Button>\n )}\n <Button variant=\"primary\" size=\"sm\" onClick={onAccept}>\n Accept\n </Button>\n </div>\n </div>\n )\n }\n)\n\nconst CookieBanner = forwardRef<HTMLDivElement, CookieBannerProps>(\n function CookieBanner(props, ref) {\n return renderPortal(<CookieBannerInner {...props} ref={ref} />)\n }\n)\n\nexport { CookieBanner }\nexport type { CookieBannerProps }\n","// cron-schedule — human-readable display of a cron expression\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CronScheduleProps = React.HTMLAttributes<HTMLDivElement> & {\n expression: string\n}\n\nconst DAYS = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n]\n\nfunction parseCron(expr: string): string {\n const parts = expr.trim().split(/\\s+/)\n if (parts.length !== 5) return `Cron: ${expr}`\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts\n\n const time =\n hour !== '*' && minute !== '*'\n ? `${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`\n : null\n\n if (dayOfWeek !== '*' && dayOfWeek !== '?') {\n const dayNum = parseInt(dayOfWeek, 10)\n const dayName = !isNaN(dayNum) ? (DAYS[dayNum % 7] ?? dayOfWeek) : dayOfWeek\n return time !== null ? `Every ${dayName} at ${time}` : `Every ${dayName}`\n }\n\n if (dayOfMonth !== '*' && dayOfMonth !== '?') {\n return time !== null\n ? `Day ${dayOfMonth} of every month at ${time}`\n : `Day ${dayOfMonth} of every month`\n }\n\n if (hour === '*' && minute === '*') return 'Every minute'\n if (hour === '*') return `Every hour at minute ${minute}`\n if (minute === '0' && hour === '0') return 'Every day at midnight'\n\n return time !== null ? `Every day at ${time}` : `Cron: ${expr}`\n}\n\nconst CronSchedule = forwardRef<HTMLDivElement, CronScheduleProps>(\n function CronSchedule({ expression, className, ...props }, ref) {\n const description = useMemo(() => parseCron(expression), [expression])\n\n return (\n <div\n ref={ref}\n className={cx('flex items-center gap-3', className)}\n data-component=\"cron-schedule\"\n {...props}\n >\n <code className=\"bg-bg-secondary text-fg-muted rounded px-2 py-1 font-mono text-xs\">\n {expression}\n </code>\n <span className=\"gds-text-body text-fg\">{description}</span>\n </div>\n )\n }\n)\n\nexport { CronSchedule }\nexport type { CronScheduleProps }\n","// data-grid — simple table grid with typed columns, optional striping and compact mode\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DataGridColumn = {\n key: string\n label: string\n align?: 'center' | 'left' | 'right'\n width?: string\n}\n\nexport type DataGridProps = {\n columns: DataGridColumn[]\n rows: Record<string, ReactNode>[]\n compact?: boolean\n striped?: boolean\n glass?: boolean\n className?: string\n}\n\nconst alignClasses: Record<string, string> = {\n center: 'text-center',\n left: 'text-left',\n right: 'text-right',\n}\n\nexport const DataGrid = forwardRef<HTMLTableElement, DataGridProps>(\n function DataGrid(\n { columns, rows, compact = false, striped = false, glass, className },\n ref\n ) {\n const cellPadding = compact ? 'px-3 py-1' : 'px-3 py-2'\n\n return (\n <div\n className={cx(\n 'w-full overflow-auto',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"data-grid\"\n >\n <table className=\"w-full text-sm\" ref={ref}>\n <thead>\n <tr className=\"border-border/40 border-b\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'text-fg-muted font-medium select-none',\n cellPadding,\n alignClasses[col.align ?? 'left']\n )}\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 && (\n <tr>\n <td\n className=\"text-fg-muted px-3 py-8 text-center\"\n colSpan={columns.length}\n >\n No data\n </td>\n </tr>\n )}\n {rows.map((row, i) => (\n <tr\n key={`${String(row[columns[0]?.key ?? ''] ?? '')}-${i}`}\n className={cx(\n 'border-border/20 border-b',\n striped && i % 2 === 1 && 'bg-bg-secondary/30'\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx(\n 'text-fg',\n cellPadding,\n alignClasses[col.align ?? 'left']\n )}\n >\n {row[col.key]}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n","// data-list — key-value list display for structured data\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DataListItem = {\n label: string\n value: ReactNode\n}\n\nexport type DataListProps = {\n items: DataListItem[]\n layout?: 'vertical' | 'horizontal'\n striped?: boolean\n glass?: boolean\n className?: string\n}\n\nexport function DataList({\n items,\n layout = 'vertical',\n striped = false,\n glass,\n className,\n}: DataListProps) {\n const isHorizontal = layout === 'horizontal'\n\n return (\n <div\n className={cx(\n 'gds-radius-popover 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=\"data-list\"\n data-variant={layout}\n >\n {items.map((item, i) => (\n <div\n key={item.label}\n className={cx(\n 'gds-pad-x gds-pad-y-sm',\n i < items.length - 1 ? 'border-border border-b' : '',\n isHorizontal ? 'flex items-center justify-between gap-4' : '',\n striped && i % 2 === 1 ? 'bg-bg-tertiary/20' : ''\n )}\n >\n <div className=\"gds-text-body text-fg-muted font-medium\">\n {item.label}\n </div>\n <div\n className={cx('text-fg gds-text-body', isHorizontal ? '' : 'mt-1')}\n >\n {item.value}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import type { AggregateFunction, DataColumn, Density } from './data-table-types'\n\n// resolve column label (backward compat: label ?? header)\nexport function getLabel<T>(col: DataColumn<T>): string {\n return col.label ?? col.header ?? col.key\n}\n\n// resolve row key\nexport function resolveRowKey<T>(\n row: T,\n rowKey: string | ((row: T, index: number) => string) | undefined,\n index: number\n): string {\n if (rowKey === undefined) {\n const r = row as Record<string, unknown>\n return String(r['id'] ?? index)\n }\n if (typeof rowKey === 'function') return rowKey(row, index)\n return String((row as Record<string, unknown>)[rowKey] ?? index)\n}\n\n// density padding classes\ntype DensityClasses = { td: string; th: string }\n\nconst densityMap: Record<Density, DensityClasses> = {\n compact: { td: 'px-1.5 py-0.5 text-[11px]', th: 'px-1.5 py-1 text-[11px]' },\n default: { td: 'px-2.5 py-1.5 text-xs', th: 'px-2.5 py-1.5 text-xs' },\n comfortable: { td: 'px-3 py-2.5 text-sm', th: 'px-3 py-2 text-xs' },\n}\n\nexport function getDensity(density: Density = 'default'): DensityClasses {\n return densityMap[density]\n}\n\n// compute aggregate\nexport function computeAggregate<T>(\n rows: T[],\n key: string,\n fn: AggregateFunction\n): number | null {\n const values = rows\n .map((r) => {\n const v = (r as Record<string, unknown>)[key]\n return typeof v === 'number' ? v : null\n })\n .filter((v): v is number => v !== null)\n\n if (values.length === 0) return null\n\n if (fn === 'count') return values.length\n if (fn === 'sum') return values.reduce((a, b) => a + b, 0)\n if (fn === 'avg') return values.reduce((a, b) => a + b, 0) / values.length\n if (fn === 'min') return Math.min(...values)\n if (fn === 'max') return Math.max(...values)\n return null\n}\n\n// csv export\nexport function downloadCsv<T>(\n columns: DataColumn<T>[],\n rows: T[],\n filename: string\n): void {\n const visibleCols = columns.filter((c) => c.hidden !== true)\n const header = visibleCols.map((c) => getLabel(c))\n const csvRows = rows.map((row) =>\n visibleCols.map((col) => {\n const v = (row as Record<string, unknown>)[col.key]\n const str = String(v ?? '')\n // escape quotes in csv\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n })\n )\n const csv = [header.join(','), ...csvRows.map((r) => r.join(','))].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// cell value extraction\nexport function getCellValue<T>(row: T, key: string): unknown {\n return (row as Record<string, unknown>)[key]\n}\n","import type { ReactNode } from 'react'\n\nimport { cx } from '../../utils/cx'\nimport type { DataColumn, Density } from './data-table-types'\nimport {\n computeAggregate,\n getCellValue,\n getDensity,\n resolveRowKey,\n} from './data-table-utils'\n\n// skeleton loading rows\nfunction SkeletonRows<T>({\n columns,\n count,\n density,\n hasSelection,\n rowNumbers,\n hasActions,\n bordered,\n}: {\n columns: DataColumn<T>[]\n count: number\n density?: Density\n hasSelection?: boolean\n rowNumbers?: boolean\n hasActions?: boolean\n bordered?: boolean\n}) {\n const d = getDensity(density)\n const borderCls = bordered === true ? 'border border-border' : ''\n const totalCols =\n columns.length +\n (hasSelection ? 1 : 0) +\n (rowNumbers ? 1 : 0) +\n (hasActions ? 1 : 0)\n return (\n <>\n {Array.from({ length: count }, (_, i) => (\n <tr key={i} className=\"border-border border-b\">\n {Array.from({ length: totalCols }, (_, j) => (\n <td key={j} className={cx(d.td, borderCls)}>\n <div className=\"bg-bg-tertiary h-4 animate-pulse rounded\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n\n// empty state\nfunction EmptyState({\n colSpan,\n message,\n icon,\n}: {\n colSpan: number\n message: string\n icon?: ReactNode\n}) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"text-fg-muted py-12 text-center text-sm\">\n {icon !== undefined && (\n <div className=\"text-fg-muted/30 mb-2 flex justify-center\">\n {icon}\n </div>\n )}\n {message}\n </td>\n </tr>\n )\n}\n\n// error state\nfunction ErrorState({ colSpan, error }: { colSpan: number; error: ReactNode }) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"text-danger py-8 text-center text-sm\">\n {error}\n </td>\n </tr>\n )\n}\n\n// render cell content\nfunction renderCell<T>(\n col: DataColumn<T>,\n row: T,\n index: number,\n highlightQuery?: string\n): ReactNode {\n const value = getCellValue(row, col.key)\n\n // render has full control — support both (value, row, index) and legacy (row) signatures\n if (col.render !== undefined) {\n if (col.render.length <= 1) {\n return (col.render as (row: T) => ReactNode)(row)\n }\n return (col.render as (value: unknown, row: T, index: number) => ReactNode)(\n value,\n row,\n index\n )\n }\n\n // format returns ReactNode\n if (col.format !== undefined) return col.format(value, row)\n\n const str = String(value ?? '')\n\n // highlight matches\n if (highlightQuery !== undefined && highlightQuery !== '' && str !== '') {\n const lowerStr = str.toLowerCase()\n const lowerQuery = highlightQuery.toLowerCase()\n const idx = lowerStr.indexOf(lowerQuery)\n if (idx >= 0) {\n return (\n <>\n {str.slice(0, idx)}\n <mark className=\"bg-warning/30 text-fg\">\n {str.slice(idx, idx + highlightQuery.length)}\n </mark>\n {str.slice(idx + highlightQuery.length)}\n </>\n )\n }\n }\n\n return str\n}\n\ntype DataTableBodyProps<T> = {\n columns: DataColumn<T>[]\n rows: T[]\n density?: Density\n loading?: boolean\n loadingRows?: number\n error?: ReactNode\n emptyMessage?: string\n emptyIcon?: ReactNode\n striped?: boolean\n bordered?: boolean\n highlightOnHover?: boolean\n rowNumbers?: boolean\n rowKey?: string | ((row: T, index: number) => string)\n getRowClassName?: (row: T, index: number) => string | undefined\n onRowClick?: (row: T) => void\n // selection\n hasSelection?: boolean\n selectedKeys?: Set<string>\n onToggleSelect?: (key: string, row: T) => void\n // expand\n expandedKeys?: Set<string>\n onToggleExpand?: (key: string) => void\n renderExpanded?: (row: T) => ReactNode\n // actions\n actions?: (row: T) => ReactNode\n // highlight\n highlightQuery?: string\n // page offset for row numbers\n pageOffset?: number\n}\n\nexport function DataTableBody<T>({\n columns,\n rows,\n density,\n loading,\n loadingRows = 5,\n error,\n emptyMessage = 'No data',\n emptyIcon,\n striped,\n bordered,\n highlightOnHover = true,\n rowNumbers,\n rowKey,\n getRowClassName,\n onRowClick,\n hasSelection,\n selectedKeys,\n onToggleSelect,\n expandedKeys,\n onToggleExpand,\n renderExpanded,\n actions,\n highlightQuery,\n pageOffset = 0,\n}: DataTableBodyProps<T>) {\n const d = getDensity(density)\n const borderCls = bordered === true ? 'border border-border' : ''\n const hasExpand = renderExpanded !== undefined && onToggleExpand !== undefined\n const totalCols =\n columns.length +\n (hasExpand ? 1 : 0) +\n (hasSelection ? 1 : 0) +\n (rowNumbers ? 1 : 0) +\n (actions !== undefined ? 1 : 0)\n const hasAggregate = columns.some((c) => c.aggregate !== undefined)\n\n return (\n <tbody>\n {loading === true && (\n <SkeletonRows\n columns={columns}\n count={loadingRows}\n density={density}\n hasSelection={hasSelection}\n rowNumbers={rowNumbers}\n hasActions={actions !== undefined}\n bordered={bordered}\n />\n )}\n {loading !== true && error !== undefined && (\n <ErrorState colSpan={totalCols} error={error} />\n )}\n {loading !== true && error === undefined && rows.length === 0 && (\n <EmptyState\n colSpan={totalCols}\n message={emptyMessage}\n icon={emptyIcon}\n />\n )}\n {loading !== true &&\n error === undefined &&\n rows.map((row, i) => {\n const key = resolveRowKey(row, rowKey, pageOffset + i)\n const isSelected = selectedKeys !== undefined && selectedKeys.has(key)\n const isExpanded = expandedKeys !== undefined && expandedKeys.has(key)\n const customCls =\n getRowClassName !== undefined\n ? getRowClassName(row, pageOffset + i)\n : undefined\n\n return (\n <RowFragment key={key}>\n <tr\n className={cx(\n 'border-border border-b transition-colors',\n striped === true && i % 2 === 1 && 'bg-bg-secondary/30',\n highlightOnHover && 'hover:bg-bg-secondary/60',\n isSelected && 'bg-accent/5',\n onRowClick !== undefined && 'cursor-pointer',\n customCls\n )}\n onClick={\n onRowClick !== undefined ? () => onRowClick(row) : undefined\n }\n >\n {hasExpand && (\n <td className={cx(d.td, borderCls, 'w-8 text-center')}>\n <button\n className=\"text-fg-muted/50 hover:text-fg-muted transition-transform\"\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand?.(key)\n }}\n style={{\n transform: isExpanded\n ? 'rotate(90deg)'\n : 'rotate(0deg)',\n }}\n type=\"button\"\n >\n ▶\n </button>\n </td>\n )}\n {hasSelection && (\n <td className={cx(d.td, borderCls, 'w-8 text-center')}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation()\n onToggleSelect?.(key, row)\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"accent-accent\"\n />\n </td>\n )}\n {rowNumbers === true && (\n <td\n className={cx(\n d.td,\n borderCls,\n 'text-fg-muted/50 w-8 text-center tabular-nums'\n )}\n >\n {pageOffset + i + 1}\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx(\n d.td,\n borderCls,\n 'text-fg',\n col.align === 'right' && 'text-right tabular-nums',\n col.align === 'center' && 'text-center',\n col.muted === true && 'text-fg-muted'\n )}\n >\n {renderCell(col, row, pageOffset + i, highlightQuery)}\n </td>\n ))}\n {actions !== undefined && (\n <td\n className={cx(d.td, borderCls, 'w-12 text-center')}\n onClick={(e) => e.stopPropagation()}\n >\n {actions(row)}\n </td>\n )}\n </tr>\n {isExpanded && renderExpanded !== undefined && (\n <tr className=\"border-border bg-bg-secondary/20 border-b\">\n <td colSpan={totalCols} className=\"px-4 py-3\">\n {renderExpanded(row)}\n </td>\n </tr>\n )}\n </RowFragment>\n )\n })}\n {loading !== true &&\n error === undefined &&\n hasAggregate &&\n rows.length > 0 && (\n <tr className=\"border-border bg-bg-secondary/50 border-t-2 font-semibold\">\n {hasExpand && <td className={cx(d.td, borderCls)} />}\n {hasSelection && <td className={cx(d.td, borderCls)} />}\n {rowNumbers === true && <td className={cx(d.td, borderCls)} />}\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx(\n d.td,\n borderCls,\n 'text-fg',\n col.align === 'right' && 'text-right tabular-nums'\n )}\n >\n {col.aggregate !== undefined\n ? (computeAggregate(\n rows,\n col.key,\n col.aggregate\n )?.toLocaleString() ?? '')\n : col.key === columns[0]?.key\n ? `Total (${rows.length})`\n : ''}\n </td>\n ))}\n {actions !== undefined && <td className={cx(d.td, borderCls)} />}\n </tr>\n )}\n </tbody>\n )\n}\n\n// fragment wrapper for expand rows (two <tr> per row)\nfunction RowFragment({ children }: { children: ReactNode }) {\n return <>{children}</>\n}\n","import { cx } from '../../utils/cx'\nimport type { DataColumn, Density, SortDir } from './data-table-types'\nimport { getDensity, getLabel } from './data-table-utils'\n\nfunction SortIcon({ dir }: { dir?: SortDir | null }) {\n if (dir === undefined || dir === null) {\n return (\n <svg\n className=\"text-fg-muted/40 ml-1 inline h-3 w-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 12 12\"\n >\n <path d=\"M6 2L9 5H3L6 2Z\" />\n <path d=\"M6 10L3 7H9L6 10Z\" />\n </svg>\n )\n }\n return (\n <svg\n className=\"text-fg-muted ml-1 inline h-3 w-3\"\n fill=\"currentColor\"\n viewBox=\"0 0 12 12\"\n >\n {dir === 'asc' ? (\n <path d=\"M6 2L9 5H3L6 2Z\" />\n ) : (\n <path d=\"M6 10L3 7H9L6 10Z\" />\n )}\n </svg>\n )\n}\n\ntype DataTableHeadProps<T> = {\n columns: DataColumn<T>[]\n density?: Density\n sortKey?: string | null\n sortDir?: SortDir | null\n onSort?: (key: string) => void\n stickyHeader?: boolean\n rowNumbers?: boolean\n hasSelection?: boolean\n allSelected?: boolean\n someSelected?: boolean\n onToggleSelectAll?: () => void\n hasActions?: boolean\n hasExpand?: boolean\n bordered?: boolean\n // column filters\n columnFilters?: Record<string, string>\n onColumnFilterChange?: (key: string, value: string) => void\n}\n\nexport function DataTableHead<T>({\n columns,\n density,\n sortKey,\n sortDir,\n onSort,\n stickyHeader,\n rowNumbers,\n hasSelection,\n allSelected,\n someSelected,\n onToggleSelectAll,\n hasActions,\n hasExpand,\n bordered,\n columnFilters,\n onColumnFilterChange,\n}: DataTableHeadProps<T>) {\n const d = getDensity(density)\n const borderCls =\n bordered === true ? 'border border-border' : 'border-b border-border'\n const hasFilters =\n columns.some((c) => c.filterable === true) &&\n onColumnFilterChange !== undefined\n\n return (\n <thead>\n <tr\n className={cx(\n 'bg-bg-secondary/50',\n stickyHeader === true && 'sticky top-0 z-10'\n )}\n >\n {hasExpand === true && <th className={cx(d.th, borderCls, 'w-8')} />}\n {hasSelection && (\n <th className={cx(d.th, borderCls, 'w-8 text-center')}>\n <input\n type=\"checkbox\"\n checked={allSelected === true}\n ref={(el) => {\n if (el !== null)\n el.indeterminate =\n someSelected === true && allSelected !== true\n }}\n onChange={() => onToggleSelectAll?.()}\n className=\"accent-accent\"\n />\n </th>\n )}\n {rowNumbers === true && (\n <th\n className={cx(\n d.th,\n borderCls,\n 'text-fg-muted w-8 text-center font-medium select-none'\n )}\n >\n #\n </th>\n )}\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n d.th,\n borderCls,\n 'text-fg-muted font-semibold tracking-wide whitespace-nowrap select-none',\n col.align === 'right' && 'text-right',\n col.align === 'center' && 'text-center',\n col.sortable === true &&\n onSort !== undefined &&\n 'hover:text-fg cursor-pointer'\n )}\n style={{\n width: col.width,\n minWidth: col.minWidth,\n }}\n onClick={() => {\n if (col.sortable === true && onSort !== undefined) {\n onSort(col.key)\n }\n }}\n >\n {getLabel(col)}\n {col.sortable === true && (\n <SortIcon dir={sortKey === col.key ? sortDir : undefined} />\n )}\n </th>\n ))}\n {hasActions && <th className={cx(d.th, borderCls, 'w-12')} />}\n </tr>\n {hasFilters && (\n <tr className=\"bg-bg-secondary/30\">\n {hasExpand === true && <th className={cx(d.th, borderCls)} />}\n {hasSelection && <th className={cx(d.th, borderCls)} />}\n {rowNumbers === true && <th className={cx(d.th, borderCls)} />}\n {columns.map((col) => (\n <th key={col.key} className={cx('px-1 py-1', borderCls)}>\n {col.filterable === true ? (\n col.filterOptions !== undefined ? (\n <select\n className=\"border-border bg-bg text-fg w-full rounded border px-1.5 py-0.5 text-[11px] outline-none\"\n value={columnFilters?.[col.key] ?? ''}\n onChange={(e) =>\n onColumnFilterChange?.(col.key, e.target.value)\n }\n >\n <option value=\"\">All</option>\n {col.filterOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n className=\"border-border bg-bg text-fg placeholder:text-fg-muted/50 w-full rounded border px-1.5 py-0.5 text-[11px] outline-none\"\n placeholder=\"Filter...\"\n value={columnFilters?.[col.key] ?? ''}\n onChange={(e) =>\n onColumnFilterChange?.(col.key, e.target.value)\n }\n />\n )\n ) : null}\n </th>\n ))}\n {hasActions && <th className={cx(d.th, borderCls)} />}\n </tr>\n )}\n </thead>\n )\n}\n","import { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\n\ntype DataTablePaginationProps = {\n currentPage: number\n totalPages: number\n totalRows: number\n pageSize: number\n pageSizeOptions?: number[]\n visibleRowCount: number\n onPageChange: (page: number) => void\n onPageSizeChange?: (size: number) => void\n}\n\nexport function DataTablePagination({\n currentPage,\n totalPages,\n totalRows,\n pageSize,\n pageSizeOptions,\n visibleRowCount,\n onPageChange,\n onPageSizeChange,\n}: DataTablePaginationProps) {\n const start = (currentPage - 1) * pageSize + 1\n const end = Math.min(currentPage * pageSize, totalRows)\n\n return (\n <div className=\"border-border flex items-center justify-between border-t px-3 py-2\">\n <div className=\"text-fg-muted flex items-center gap-2 text-[11px]\">\n <span>\n {visibleRowCount === 0 ? '0 rows' : `${start}–${end} of ${totalRows}`}\n </span>\n {pageSizeOptions !== undefined && onPageSizeChange !== undefined && (\n <select\n className=\"border-border bg-bg text-fg rounded border px-1.5 py-0.5 text-[11px] outline-none\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt} / page\n </option>\n ))}\n </select>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <PageButton\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n label=\"Previous\"\n >\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=\"M15 19l-7-7 7-7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </PageButton>\n <span className=\"text-fg-muted px-2 text-[11px] tabular-nums\">\n {currentPage} / {totalPages}\n </span>\n <PageButton\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n label=\"Next\"\n >\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=\"M9 5l7 7-7 7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </PageButton>\n </div>\n </div>\n )\n}\n\nfunction PageButton({\n children,\n disabled,\n onClick,\n label,\n}: {\n children: React.ReactNode\n disabled: boolean\n onClick: () => void\n label: string\n}) {\n return (\n <button\n aria-label={label}\n className={cx(\n 'text-fg-muted rounded p-1 transition-colors',\n focusCls,\n disabled\n ? 'cursor-not-allowed opacity-30'\n : 'hover:bg-bg-tertiary hover:text-fg'\n )}\n disabled={disabled}\n onClick={onClick}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import { useState } from 'react'\n\nimport { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\nimport type { BatchAction, DataColumn } from './data-table-types'\nimport { getLabel } from './data-table-utils'\n\ntype DataTableToolbarProps<T> = {\n // global filter\n globalFilter?: boolean\n globalFilterValue?: string\n globalFilterPlaceholder?: string\n onGlobalFilterChange?: (value: string) => void\n // column toggle\n columnToggle?: boolean\n columns?: DataColumn<T>[]\n hiddenColumns?: Set<string>\n onToggleColumn?: (key: string) => void\n // export\n exportCsv?: boolean\n onExport?: () => void\n // batch actions\n batchActions?: BatchAction[]\n selectedKeys?: Set<string>\n // caption\n caption?: React.ReactNode\n title?: string\n subtitle?: string\n toolbarActions?: React.ReactNode\n}\n\nexport function DataTableToolbar<T>({\n globalFilter,\n globalFilterValue,\n globalFilterPlaceholder = 'Search...',\n onGlobalFilterChange,\n columnToggle,\n columns,\n hiddenColumns,\n onToggleColumn,\n exportCsv,\n onExport,\n batchActions,\n selectedKeys,\n caption,\n title,\n subtitle,\n toolbarActions,\n}: DataTableToolbarProps<T>) {\n const [showColumnMenu, setShowColumnMenu] = useState(false)\n const someSelected = selectedKeys !== undefined && selectedKeys.size > 0\n\n const hasContent =\n globalFilter === true ||\n columnToggle === true ||\n exportCsv === true ||\n caption !== undefined ||\n title !== undefined ||\n toolbarActions !== undefined ||\n someSelected\n\n if (!hasContent) return null\n\n return (\n <div className=\"border-border flex items-center gap-2 border-b px-3 py-2\">\n {caption !== undefined && (\n <span className=\"text-fg text-xs font-semibold\">{caption}</span>\n )}\n {caption === undefined && title !== undefined && (\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-fg text-xs font-semibold\">{title}</span>\n {subtitle !== undefined && (\n <span className=\"text-fg-muted text-[11px]\">{subtitle}</span>\n )}\n </div>\n )}\n {toolbarActions !== undefined && (\n <div className=\"flex items-center gap-1\">{toolbarActions}</div>\n )}\n\n {someSelected && batchActions !== undefined && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-fg-muted text-[11px]\">\n {selectedKeys.size} selected\n </span>\n {batchActions.map((action) => (\n <button\n key={action.label}\n className={cx(\n 'rounded px-2 py-0.5 text-[11px] font-medium transition-colors',\n focusCls,\n action.variant === 'danger'\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary'\n )}\n onClick={() => action.onClick(selectedKeys)}\n type=\"button\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"ml-auto flex items-center gap-2\">\n {globalFilter === true && (\n <input\n className={cx(\n 'border-border bg-bg text-fg placeholder:text-fg-muted/50 w-48 rounded border px-2.5 py-1 text-[11px] outline-none',\n focusCls\n )}\n placeholder={globalFilterPlaceholder}\n value={globalFilterValue ?? ''}\n onChange={(e) => onGlobalFilterChange?.(e.target.value)}\n />\n )}\n\n {columnToggle === true && columns !== undefined && (\n <div className=\"relative\">\n <button\n className={cx(\n 'text-fg-muted hover:bg-bg-tertiary hover:text-fg rounded p-1 transition-colors',\n focusCls\n )}\n onClick={() => setShowColumnMenu((v) => !v)}\n title=\"Toggle columns\"\n type=\"button\"\n >\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 3v18M3 12h18\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {showColumnMenu && (\n <div className=\"border-border bg-bg absolute top-full right-0 z-50 mt-1 min-w-40 rounded border p-1 shadow-lg\">\n {columns.map((col) => (\n <label\n key={col.key}\n className=\"text-fg hover:bg-bg-tertiary flex items-center gap-2 rounded px-2 py-1 text-[11px]\"\n >\n <input\n type=\"checkbox\"\n checked={\n hiddenColumns === undefined ||\n !hiddenColumns.has(col.key)\n }\n onChange={() => onToggleColumn?.(col.key)}\n className=\"accent-accent\"\n />\n {getLabel(col)}\n </label>\n ))}\n </div>\n )}\n </div>\n )}\n\n {exportCsv === true && (\n <button\n className={cx(\n 'text-fg-muted hover:bg-bg-tertiary hover:text-fg rounded p-1 transition-colors',\n focusCls\n )}\n onClick={onExport}\n title=\"Export CSV\"\n type=\"button\"\n >\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n )\n}\n","// data-table — feature-rich data table with sorting, pagination, selection, filtering\nimport type { ReactNode } from 'react'\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../../utils/cx'\nimport { glassSurface } from '../../utils/glass'\nimport { DataTableBody } from './data-table-body'\nimport { DataTableHead } from './data-table-head'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableToolbar } from './data-table-toolbar'\nimport type { DataTableProps } from './data-table-types'\nimport { downloadCsv, resolveRowKey } from './data-table-utils'\n\nfunction DataTableInner<T>(\n props: DataTableProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const {\n columns: allColumns,\n className,\n glass,\n // backward compat\n rows: rowsProp,\n data: dataProp,\n emptyMessage: emptyMessageProp,\n emptyText: emptyTextProp,\n // sort\n sortKey,\n sortDir,\n onSort,\n // pagination\n page: pageProp,\n pageSize: pageSizeProp,\n pageSizeOptions,\n totalRows: totalRowsProp,\n onPageChange,\n onPageSizeChange,\n // selection\n selectable,\n selectedKeys,\n onToggleSelect,\n onToggleSelectAll,\n // global filter\n globalFilter,\n globalFilterValue,\n globalFilterPlaceholder,\n onGlobalFilterChange,\n highlightMatches,\n // column filters\n columnFilters,\n onColumnFilterChange,\n // expand\n expandedKeys,\n onToggleExpand,\n renderExpanded,\n // batch actions\n batchActions,\n // column toggle\n columnToggle,\n // csv export\n exportCsv,\n exportFilename = 'export',\n // density\n density,\n // visual\n striped,\n bordered,\n stickyHeader,\n rowNumbers,\n highlightOnHover,\n // row customization\n rowKey,\n getRowClassName,\n getRowHidden,\n onRowClick,\n // states\n loading,\n loadingRows,\n error,\n emptyIcon,\n // structural\n caption,\n title,\n subtitle,\n toolbarActions,\n footer,\n // actions\n actions,\n } = props\n\n // backward compat\n const resolvedRows = rowsProp ?? dataProp\n const allRows = useMemo(() => (resolvedRows ?? []) as T[], [resolvedRows])\n const emptyMessage = emptyMessageProp ?? emptyTextProp ?? 'No data'\n\n // column toggle state (local)\n const [hiddenColumns, setHiddenColumns] = useState<Set<string>>(new Set())\n\n function handleToggleColumn(key: string) {\n setHiddenColumns((prev) => {\n const next = new Set(prev)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n return next\n })\n }\n\n // visible columns\n const visibleColumns = useMemo(\n () =>\n allColumns.filter((c) => c.hidden !== true && !hiddenColumns.has(c.key)),\n [allColumns, hiddenColumns]\n )\n\n // filter hidden rows\n const filteredRows = useMemo(() => {\n if (getRowHidden === undefined) return allRows\n return allRows.filter((r) => !getRowHidden(r))\n }, [allRows, getRowHidden])\n\n // pagination\n const hasPagination = pageSizeProp !== undefined && onPageChange !== undefined\n const currentPage = pageProp ?? 1\n const pageSize = pageSizeProp ?? filteredRows.length\n const totalRows = totalRowsProp ?? filteredRows.length\n const totalPages = Math.max(1, Math.ceil(totalRows / pageSize))\n\n const displayRows = useMemo(() => {\n if (!hasPagination) return filteredRows\n // only slice if not server-side (totalRowsProp means server handles slicing)\n if (totalRowsProp !== undefined) return filteredRows\n const start = (currentPage - 1) * pageSize\n return filteredRows.slice(start, start + pageSize)\n }, [filteredRows, hasPagination, currentPage, pageSize, totalRowsProp])\n\n const pageOffset =\n hasPagination && totalRowsProp === undefined\n ? (currentPage - 1) * pageSize\n : 0\n\n // selection\n const hasSelection = selectable === true && onToggleSelect !== undefined\n const allRowKeys = useMemo(\n () => displayRows.map((r, i) => resolveRowKey(r, rowKey, pageOffset + i)),\n [displayRows, rowKey, pageOffset]\n )\n const allSelected =\n hasSelection &&\n selectedKeys !== undefined &&\n selectedKeys.size > 0 &&\n allRowKeys.every((k) => selectedKeys.has(k))\n const someSelected =\n hasSelection && selectedKeys !== undefined && selectedKeys.size > 0\n\n function handleToggleSelectAll() {\n if (onToggleSelectAll !== undefined) {\n onToggleSelectAll(allSelected)\n }\n }\n\n // highlight\n const highlightQuery =\n highlightMatches !== false && globalFilter === true\n ? globalFilterValue\n : undefined\n\n // export\n function handleExport() {\n downloadCsv(visibleColumns, filteredRows, exportFilename)\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover overflow-hidden border',\n glass === true\n ? cx(glassSurface(glass), 'bg-bg/60')\n : 'border-border bg-surface',\n className\n )}\n data-component=\"data-table\"\n data-state={loading === true ? 'loading' : undefined}\n >\n <DataTableToolbar\n globalFilter={globalFilter}\n globalFilterValue={globalFilterValue}\n globalFilterPlaceholder={globalFilterPlaceholder}\n onGlobalFilterChange={onGlobalFilterChange}\n columnToggle={columnToggle}\n columns={allColumns}\n hiddenColumns={hiddenColumns}\n onToggleColumn={handleToggleColumn}\n exportCsv={exportCsv}\n onExport={handleExport}\n batchActions={batchActions}\n selectedKeys={selectedKeys}\n caption={caption}\n title={title}\n subtitle={subtitle}\n toolbarActions={toolbarActions}\n />\n\n <div className=\"overflow-auto\">\n <table className=\"w-full border-collapse\">\n <DataTableHead\n columns={visibleColumns}\n density={density}\n sortKey={sortKey}\n sortDir={sortDir}\n onSort={onSort}\n stickyHeader={stickyHeader}\n rowNumbers={rowNumbers}\n hasSelection={hasSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onToggleSelectAll={handleToggleSelectAll}\n hasActions={actions !== undefined}\n hasExpand={\n renderExpanded !== undefined && onToggleExpand !== undefined\n }\n bordered={bordered}\n columnFilters={columnFilters}\n onColumnFilterChange={onColumnFilterChange}\n />\n <DataTableBody\n columns={visibleColumns}\n rows={displayRows}\n density={density}\n loading={loading}\n loadingRows={loadingRows}\n error={error}\n emptyMessage={emptyMessage}\n emptyIcon={emptyIcon}\n striped={striped}\n bordered={bordered}\n highlightOnHover={highlightOnHover}\n rowNumbers={rowNumbers}\n rowKey={rowKey}\n getRowClassName={getRowClassName}\n onRowClick={onRowClick}\n hasSelection={hasSelection}\n selectedKeys={selectedKeys}\n onToggleSelect={onToggleSelect}\n expandedKeys={expandedKeys}\n onToggleExpand={onToggleExpand}\n renderExpanded={renderExpanded}\n actions={actions}\n highlightQuery={highlightQuery}\n pageOffset={pageOffset}\n />\n </table>\n </div>\n\n {footer !== undefined && (\n <div className=\"border-border text-fg-muted border-t px-3 py-2 text-xs\">\n {footer}\n </div>\n )}\n\n {hasPagination && (\n <DataTablePagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalRows={totalRows}\n pageSize={pageSize}\n pageSizeOptions={pageSizeOptions}\n visibleRowCount={displayRows.length}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n )}\n </div>\n )\n}\n\nexport const DataTable = forwardRef(DataTableInner) as <\n T = Record<string, unknown>,\n>(\n props: DataTableProps<T> & { ref?: React.Ref<HTMLDivElement> }\n) => ReactNode\n","// date-picker — input with calendar dropdown\nimport { forwardRef, useCallback, 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 { Calendar } from './calendar'\n\nexport type DatePickerProps = {\n value?: Date\n onChange?: (date: Date) => void\n placeholder?: string\n min?: Date\n max?: Date\n glass?: boolean\n className?: string\n}\n\nfunction formatDate(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\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n function DatePicker(\n {\n value,\n onChange,\n placeholder = 'Select date',\n min,\n max,\n glass,\n className,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(containerRef, open, close)\n useEscapeKey(open, close)\n\n const handleSelect = (date: Date) => {\n if (onChange !== undefined) onChange(date)\n setOpen(false)\n }\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"date-picker\"\n data-state={open ? 'open' : 'closed'}\n >\n <div ref={containerRef}>\n <button\n type=\"button\"\n className={cx(\n 'gds-h-lg gds-gap-sm gds-radius-button gds-pad-x flex items-center border text-sm transition-colors',\n focusCls,\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n value !== undefined ? 'text-fg' : 'text-fg-muted'\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <svg\n className=\"text-fg-muted h-4 w-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"1.5\" />\n <path d=\"M2 6.5H14M5 1.5V4M11 1.5V4\" />\n </svg>\n {value !== undefined ? formatDate(value) : placeholder}\n </button>\n\n {open && (\n <div className=\"animate-popup absolute top-full left-0 z-50 mt-1\">\n <Calendar\n value={value}\n onChange={handleSelect}\n min={min}\n max={max}\n />\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n","// deploy-log — CI/deploy log table with status badges\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DeployLogEntry = {\n project: string\n device: string\n version: string\n status: 'failure' | 'pending' | 'success'\n timestamp: string\n}\nexport type DeployLogProps = { entries: DeployLogEntry[]; className?: string }\n\nconst statusCls: Record<DeployLogEntry['status'], string> = {\n success: 'bg-success/15 text-success',\n failure: 'bg-danger/15 text-danger',\n pending: 'bg-warning/15 text-warning',\n}\n\nexport const DeployLog = forwardRef<HTMLDivElement, DeployLogProps>(\n function DeployLog({ entries, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border overflow-hidden border',\n className\n )}\n data-component=\"deploy-log\"\n >\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-bg-tertiary/50 gds-text-body text-fg-muted text-left\">\n <th className=\"px-3 py-1.5 font-medium\">Project</th>\n <th className=\"px-3 py-1.5 font-medium\">Device</th>\n <th className=\"px-3 py-1.5 font-medium\">Version</th>\n <th className=\"px-3 py-1.5 font-medium\">Status</th>\n <th className=\"px-3 py-1.5 font-medium\">Time</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((e, i) => (\n <tr\n key={`${e.project}-${e.timestamp}-${i}`}\n className=\"border-border gds-text-body hover:bg-bg-tertiary/30 border-t transition-colors\"\n >\n <td className=\"text-fg px-3 py-1.5 font-medium\">{e.project}</td>\n <td className=\"text-fg-muted px-3 py-1.5\">{e.device}</td>\n <td className=\"text-fg-muted px-3 py-1.5 font-mono\">\n {e.version}\n </td>\n <td className=\"px-3 py-1.5\">\n <span\n className={cx(\n 'rounded-full px-2 py-0.5 text-[10px] font-medium',\n statusCls[e.status]\n )}\n >\n {e.status}\n </span>\n </td>\n <td className=\"text-fg-muted px-3 py-1.5\">{e.timestamp}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n","// description-list — semantic dt/dd pairs with layout options\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DescriptionListItem = {\n term: string\n description: ReactNode\n}\n\nexport type DescriptionListProps = {\n items: DescriptionListItem[]\n layout?: 'stacked' | 'horizontal'\n dividers?: boolean\n className?: string\n}\n\nexport function DescriptionList({\n items,\n layout = 'stacked',\n dividers = true,\n className,\n}: DescriptionListProps) {\n const isHorizontal = layout === 'horizontal'\n\n return (\n <dl\n className={cx('gds-text-body', className)}\n data-component=\"description-list\"\n data-variant={layout}\n >\n {items.map((item, i) => (\n <div\n key={item.term}\n className={cx(\n 'gds-pad-x gds-pad-y-sm',\n isHorizontal && 'grid grid-cols-[1fr_2fr] gap-4',\n dividers && i < items.length - 1 && 'border-border border-b'\n )}\n >\n <dt className=\"text-fg-muted font-medium\">{item.term}</dt>\n <dd className={cx('text-fg', isHorizontal ? '' : 'mt-1')}>\n {item.description}\n </dd>\n </div>\n ))}\n </dl>\n )\n}\n","// diff-algorithm — pure LCS diff computation (no React dependency)\n\ntype DiffLine = {\n type: 'added' | 'removed' | 'unchanged'\n content: string\n oldLineNum: number | null\n newLineNum: number | null\n}\n\n// simple line-by-line diff using longest common subsequence\nfunction computeLcs(oldLines: string[], newLines: string[]): DiffLine[] {\n const m = oldLines.length\n const n = newLines.length\n\n // build LCS table\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array(n + 1).fill(0)\n )\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (oldLines[i - 1] === newLines[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])\n }\n }\n }\n\n // backtrack to produce diff\n const result: DiffLine[] = []\n let i = m\n let j = n\n while (i > 0 && j > 0) {\n if (oldLines[i - 1] === newLines[j - 1]) {\n result.unshift({\n type: 'unchanged',\n content: oldLines[i - 1],\n oldLineNum: i,\n newLineNum: j,\n })\n i--\n j--\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n result.unshift({\n type: 'removed',\n content: oldLines[i - 1],\n oldLineNum: i,\n newLineNum: null,\n })\n i--\n } else {\n result.unshift({\n type: 'added',\n content: newLines[j - 1],\n oldLineNum: null,\n newLineNum: j,\n })\n j--\n }\n }\n while (i > 0) {\n result.unshift({\n type: 'removed',\n content: oldLines[i - 1],\n oldLineNum: i,\n newLineNum: null,\n })\n i--\n }\n while (j > 0) {\n result.unshift({\n type: 'added',\n content: newLines[j - 1],\n oldLineNum: null,\n newLineNum: j,\n })\n j--\n }\n\n return result\n}\n\nfunction lineClass(type: DiffLine['type']): string {\n if (type === 'added') return 'bg-success/10'\n if (type === 'removed') return 'bg-danger/10'\n return ''\n}\n\nfunction linePrefix(type: DiffLine['type']): string {\n if (type === 'added') return '+'\n if (type === 'removed') return '-'\n return ' '\n}\n\nexport { computeLcs, lineClass, linePrefix }\nexport type { DiffLine }\n","// diff-viewer — side-by-side or unified text diff viewer\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { DiffLine } from './diff-algorithm'\nimport { computeLcs, lineClass, linePrefix } from './diff-algorithm'\n\nexport type DiffViewerProps = {\n oldText: string\n newText: string\n mode?: 'split' | 'unified'\n oldTitle?: string\n newTitle?: string\n glass?: boolean\n className?: string\n}\n\nfunction UnifiedView({ lines }: { lines: DiffLine[] }) {\n return (\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {lines.map((line, idx) => (\n <tr key={idx} className={lineClass(line.type)}>\n <td className=\"text-fg-muted/50 w-10 pr-2 text-right select-none\">\n {line.oldLineNum ?? ''}\n </td>\n <td className=\"text-fg-muted/50 w-10 pr-2 text-right select-none\">\n {line.newLineNum ?? ''}\n </td>\n <td className=\"text-fg-muted/70 w-4 text-center select-none\">\n {linePrefix(line.type)}\n </td>\n <td className=\"px-2 whitespace-pre\">{line.content}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nfunction SplitView({\n lines,\n oldTitle,\n newTitle,\n}: {\n lines: DiffLine[]\n oldTitle: string\n newTitle: string\n}) {\n // separate into old and new columns\n const oldLines: Array<DiffLine | null> = []\n const newLines: Array<DiffLine | null> = []\n\n for (const line of lines) {\n if (line.type === 'unchanged') {\n oldLines.push(line)\n newLines.push(line)\n } else if (line.type === 'removed') {\n oldLines.push(line)\n newLines.push(null)\n } else {\n oldLines.push(null)\n newLines.push(line)\n }\n }\n\n return (\n <div className=\"divide-border grid grid-cols-2 divide-x\">\n <div>\n <div className=\"border-border text-fg-muted border-b px-3 py-1.5 text-[10px] font-medium select-none\">\n {oldTitle}\n </div>\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {oldLines.map((line, idx) => (\n <tr\n key={idx}\n className={line !== null ? lineClass(line.type) : ''}\n >\n <td className=\"text-fg-muted/50 w-10 pr-2 text-right select-none\">\n {line?.oldLineNum ?? ''}\n </td>\n <td className=\"px-2 whitespace-pre\">{line?.content ?? ''}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div>\n <div className=\"border-border text-fg-muted border-b px-3 py-1.5 text-[10px] font-medium select-none\">\n {newTitle}\n </div>\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {newLines.map((line, idx) => (\n <tr\n key={idx}\n className={line !== null ? lineClass(line.type) : ''}\n >\n <td className=\"text-fg-muted/50 w-10 pr-2 text-right select-none\">\n {line?.newLineNum ?? ''}\n </td>\n <td className=\"px-2 whitespace-pre\">{line?.content ?? ''}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport const DiffViewer = forwardRef<HTMLDivElement, DiffViewerProps>(\n function DiffViewer(\n {\n oldText,\n newText,\n mode = 'unified',\n oldTitle = 'Old',\n newTitle = 'New',\n glass,\n className,\n },\n ref\n ) {\n const lines = useMemo(() => {\n const oldLines = oldText.split('\\n')\n const newLines = newText.split('\\n')\n return computeLcs(oldLines, newLines)\n }, [oldText, newText])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border overflow-auto border',\n glass === true && 'bg-white/5 backdrop-blur-md',\n glass !== true && 'bg-bg-secondary',\n className\n )}\n data-component=\"diff-viewer\"\n data-variant={mode}\n >\n {mode === 'split' ? (\n <SplitView lines={lines} oldTitle={oldTitle} newTitle={newTitle} />\n ) : (\n <UnifiedView lines={lines} />\n )}\n </div>\n )\n }\n)\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/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 strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.js.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { useLucideContext } from './context.js';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 17 5-5-5-5\", key: \"nf172w\" }],\n [\"path\", { d: \"M4 18v-2a4 4 0 0 1 4-4h12\", key: \"jmiej9\" }]\n];\nconst Forward = createLucideIcon(\"forward\", __iconNode);\n\nexport { __iconNode, Forward as default };\n//# sourceMappingURL=forward.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\",\n key: \"1miecu\"\n }\n ]\n];\nconst Paperclip = createLucideIcon(\"paperclip\", __iconNode);\n\nexport { __iconNode, Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m12 17-5-5 5-5\", key: \"1s3y5u\" }],\n [\"path\", { d: \"M22 18v-2a4 4 0 0 0-4-4H7\", key: \"1fcyog\" }],\n [\"path\", { d: \"m7 17-5-5 5-5\", key: \"1ed8i2\" }]\n];\nconst ReplyAll = createLucideIcon(\"reply-all\", __iconNode);\n\nexport { __iconNode, ReplyAll as default };\n//# sourceMappingURL=reply-all.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M20 18v-2a4 4 0 0 0-4-4H4\", key: \"5vmcpk\" }],\n [\"path\", { d: \"m9 17-5-5 5-5\", key: \"nvlc11\" }]\n];\nconst Reply = createLucideIcon(\"reply\", __iconNode);\n\nexport { __iconNode, Reply as default };\n//# sourceMappingURL=reply.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v1.7.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","// rich-text-editor — Tiptap-based WYSIWYG editor\n// wraps Tiptap via anti-corruption layer (utils/tiptap)\n// supports full mode (all extensions) and minimal mode (basic formatting)\n// mailrs uses this for email composition and signature editing\n\nimport type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { Editor } from '../utils/tiptap'\nimport {\n EditorContent,\n ExtCodeBlockLowlight,\n ExtImage,\n ExtLink,\n ExtPlaceholder,\n ExtTable,\n ExtTableCell,\n ExtTableHeader,\n ExtTableRow,\n ExtTaskItem,\n ExtTaskList,\n ExtUnderline,\n StarterKit,\n useEditor,\n} from '../utils/tiptap'\n\n// ---- types ----\n\nexport type ToolbarItem =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'code'\n | 'codeBlock'\n | 'heading'\n | 'blockquote'\n | 'bulletList'\n | 'orderedList'\n | 'taskList'\n | 'link'\n | 'image'\n | 'table'\n | 'divider'\n | '|'\n\nexport type RichTextEditorHandle = {\n focus: () => void\n getHTML: () => string\n getText: () => string\n getEditor: () => Editor | null\n setContent: (html: string) => void\n clearContent: () => void\n isEmpty: () => boolean\n}\n\nexport type RichTextEditorProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n /** HTML string, controlled */\n value?: string\n /** HTML string, uncontrolled */\n defaultValue?: string\n /** Fires on content change */\n onChange?: (html: string, text: string) => void\n placeholder?: string\n\n /** full = all extensions, minimal = basic formatting only */\n mode?: 'full' | 'minimal'\n\n /** show/hide toolbar, default true */\n toolbar?: boolean\n /** override default toolbar items */\n toolbarItems?: ToolbarItem[]\n\n /** image upload handler — returns URL or null on failure */\n onImageUpload?: (file: File) => Promise<string | null>\n\n /** Ctrl/Cmd+Enter handler */\n onSubmit?: () => void\n\n /** frosted glass effect */\n glass?: boolean\n className?: string\n}\n\n// ---- toolbar button config ----\n\ntype ToolbarButton = {\n key: ToolbarItem\n label: string\n shortcut?: string\n icon: ReactNode\n action: (editor: Editor) => void\n isActive: (editor: Editor) => boolean\n}\n\nfunction makeToolbarButtons(): ToolbarButton[] {\n return [\n {\n key: 'bold',\n label: 'Bold',\n shortcut: 'Ctrl+B',\n icon: <span className=\"font-bold\">B</span>,\n action: (e) => e.chain().focus().toggleBold().run(),\n isActive: (e) => e.isActive('bold'),\n },\n {\n key: 'italic',\n label: 'Italic',\n shortcut: 'Ctrl+I',\n icon: <span className=\"italic\">I</span>,\n action: (e) => e.chain().focus().toggleItalic().run(),\n isActive: (e) => e.isActive('italic'),\n },\n {\n key: 'underline',\n label: 'Underline',\n shortcut: 'Ctrl+U',\n icon: <span className=\"underline\">U</span>,\n action: (e) => e.chain().focus().toggleUnderline().run(),\n isActive: (e) => e.isActive('underline'),\n },\n {\n key: 'strikethrough',\n label: 'Strikethrough',\n icon: <span className=\"line-through\">S</span>,\n action: (e) => e.chain().focus().toggleStrike().run(),\n isActive: (e) => e.isActive('strike'),\n },\n {\n key: 'code',\n label: 'Inline Code',\n icon: <span className=\"font-mono text-[11px]\"></></span>,\n action: (e) => e.chain().focus().toggleCode().run(),\n isActive: (e) => e.isActive('code'),\n },\n {\n key: 'codeBlock',\n label: 'Code Block',\n icon: <span className=\"font-mono text-[10px]\">{'{ }'}</span>,\n action: (e) => e.chain().focus().toggleCodeBlock().run(),\n isActive: (e) => e.isActive('codeBlock'),\n },\n {\n key: 'heading',\n label: 'Heading',\n icon: <span className=\"text-[11px] font-bold\">H</span>,\n action: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (e) => e.isActive('heading'),\n },\n {\n key: 'blockquote',\n label: 'Blockquote',\n icon: <span className=\"text-[13px]\">\"</span>,\n action: (e) => e.chain().focus().toggleBlockquote().run(),\n isActive: (e) => e.isActive('blockquote'),\n },\n {\n key: 'bulletList',\n label: 'Bullet List',\n icon: <span className=\"text-[11px]\">•</span>,\n action: (e) => e.chain().focus().toggleBulletList().run(),\n isActive: (e) => e.isActive('bulletList'),\n },\n {\n key: 'orderedList',\n label: 'Ordered List',\n icon: <span className=\"text-[11px]\">1.</span>,\n action: (e) => e.chain().focus().toggleOrderedList().run(),\n isActive: (e) => e.isActive('orderedList'),\n },\n {\n key: 'taskList',\n label: 'Task List',\n icon: <span className=\"text-[11px]\">☑</span>,\n action: (e) => e.chain().focus().toggleTaskList().run(),\n isActive: (e) => e.isActive('taskList'),\n },\n {\n key: 'link',\n label: 'Link',\n icon: <span className=\"text-[11px]\">🔗</span>,\n action: (e) => {\n if (typeof window === 'undefined') return\n const url = window.prompt('Enter URL')\n if (url !== null && url !== '') {\n e.chain().focus().setLink({ href: url }).run()\n }\n },\n isActive: (e) => e.isActive('link'),\n },\n {\n key: 'image',\n label: 'Image',\n icon: <span className=\"text-[11px]\">🖼</span>,\n action: (e) => {\n if (typeof window === 'undefined') return\n const url = window.prompt('Enter image URL')\n if (url !== null && url !== '') {\n e.chain().focus().setImage({ src: url }).run()\n }\n },\n isActive: () => false,\n },\n {\n key: 'table',\n label: 'Table',\n icon: <span className=\"text-[10px]\">⊞</span>,\n action: (e) => e.chain().focus().insertTable({ rows: 3, cols: 3 }).run(),\n isActive: () => false,\n },\n {\n key: 'divider',\n label: 'Divider',\n icon: <span className=\"text-[11px]\">—</span>,\n action: (e) => e.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n },\n ]\n}\n\nconst DEFAULT_FULL_ITEMS: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n '|',\n 'code',\n 'codeBlock',\n '|',\n 'heading',\n 'blockquote',\n '|',\n 'bulletList',\n 'orderedList',\n 'taskList',\n '|',\n 'link',\n 'image',\n 'table',\n 'divider',\n]\n\nconst DEFAULT_MINIMAL_ITEMS: ToolbarItem[] = [\n 'bold',\n 'italic',\n 'underline',\n '|',\n 'link',\n]\n\n// ---- component ----\n\nexport const RichTextEditor = forwardRef<\n RichTextEditorHandle,\n RichTextEditorProps\n>(function RichTextEditor(\n {\n value,\n defaultValue,\n onChange,\n placeholder,\n mode = 'full',\n toolbar: showToolbar = true,\n toolbarItems,\n onImageUpload,\n onSubmit,\n glass,\n className,\n ...props\n },\n ref\n) {\n const isControlled = value !== undefined\n const initialContent = value ?? defaultValue ?? ''\n\n // build extensions based on mode\n const extensions = useMemo(() => {\n if (mode === 'minimal') {\n return [\n StarterKit.configure({\n code: false,\n codeBlock: false,\n heading: false,\n blockquote: false,\n }),\n ExtLink.configure({ autolink: true, openOnClick: false }),\n ExtUnderline,\n ExtPlaceholder.configure({ placeholder: placeholder ?? '' }),\n ]\n }\n // full mode\n return [\n StarterKit.configure({ codeBlock: false }),\n ExtCodeBlockLowlight.configure({}),\n ExtImage.configure({ inline: true }),\n ExtLink.configure({\n autolink: true,\n openOnClick: false,\n HTMLAttributes: { target: '_blank', rel: 'noopener noreferrer' },\n }),\n ExtTable.configure({ resizable: true }),\n ExtTableRow,\n ExtTableCell,\n ExtTableHeader,\n ExtTaskList,\n ExtTaskItem.configure({ nested: true }),\n ExtUnderline,\n ExtPlaceholder.configure({ placeholder: placeholder ?? '' }),\n ]\n }, [mode, placeholder])\n\n const editor = useEditor({\n extensions,\n content: initialContent,\n onUpdate: ({ editor: e }) => {\n if (onChange !== undefined) {\n onChange(e.getHTML(), e.getText())\n }\n },\n })\n\n // sync controlled value\n useEffect(() => {\n if (isControlled && editor !== null && value !== editor.getHTML()) {\n editor.commands.setContent(value, { emitUpdate: false })\n }\n }, [isControlled, value, editor])\n\n // Ctrl/Cmd+Enter submit\n useEffect(() => {\n if (editor === null || onSubmit === undefined) return\n const handleKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n onSubmit()\n }\n }\n const el = editor.view.dom\n el.addEventListener('keydown', handleKeyDown)\n return () => el.removeEventListener('keydown', handleKeyDown)\n }, [editor, onSubmit])\n\n // image drop/paste handling\n useEffect(() => {\n if (editor === null || onImageUpload === undefined) return\n const handleDrop = async (event: DragEvent) => {\n const files = event.dataTransfer?.files\n if (files === undefined || files.length === 0) return\n for (const file of Array.from(files)) {\n if (file.type.startsWith('image/')) {\n event.preventDefault()\n const url = await onImageUpload(file)\n if (url !== null) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n }\n }\n const handlePaste = async (event: ClipboardEvent) => {\n const files = event.clipboardData?.files\n if (files === undefined || files.length === 0) return\n for (const file of Array.from(files)) {\n if (file.type.startsWith('image/')) {\n event.preventDefault()\n const url = await onImageUpload(file)\n if (url !== null) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n }\n }\n const el = editor.view.dom\n const dropHandler = (event: DragEvent) => {\n void handleDrop(event)\n }\n const pasteHandler = (event: ClipboardEvent) => {\n void handlePaste(event)\n }\n el.addEventListener('drop', dropHandler)\n el.addEventListener('paste', pasteHandler)\n return () => {\n el.removeEventListener('drop', dropHandler)\n el.removeEventListener('paste', pasteHandler)\n }\n }, [editor, onImageUpload])\n\n // imperative handle\n useImperativeHandle(\n ref,\n () => ({\n focus: () => editor?.commands.focus(),\n getHTML: () => editor?.getHTML() ?? '',\n getText: () => editor?.getText() ?? '',\n getEditor: () => editor,\n setContent: (html: string) => editor?.commands.setContent(html),\n clearContent: () => editor?.commands.clearContent(),\n isEmpty: () => editor?.isEmpty ?? true,\n }),\n [editor]\n )\n\n // toolbar items\n const allButtons = useMemo(() => makeToolbarButtons(), [])\n const items =\n toolbarItems ??\n (mode === 'full' ? DEFAULT_FULL_ITEMS : DEFAULT_MINIMAL_ITEMS)\n\n return (\n <div\n {...props}\n className={cx(\n 'border-border gds-radius-input bg-surface flex flex-col overflow-hidden border',\n glass === true && glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"rich-text-editor\"\n data-variant={mode}\n >\n {/* toolbar */}\n {showToolbar && editor !== null && (\n <div\n className=\"border-border bg-bg-secondary flex flex-wrap items-center gap-0.5 border-b px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Formatting options\"\n >\n {items.map((item, i) => {\n if (item === '|') {\n return (\n <div\n key={`sep-${i}`}\n className=\"bg-border mx-1 h-4 w-px\"\n role=\"separator\"\n />\n )\n }\n const btn = allButtons.find((b) => b.key === item)\n if (btn === undefined) return null\n const active = btn.isActive(editor)\n return (\n <button\n key={btn.key}\n type=\"button\"\n className={cx(\n 'flex items-center justify-center rounded px-1.5 py-1 text-xs transition-colors select-none',\n active\n ? 'bg-accent/15 text-accent'\n : 'text-fg-muted hover:text-fg hover:bg-white/[0.04]'\n )}\n onClick={() => btn.action(editor)}\n title={\n btn.shortcut !== undefined\n ? `${btn.label} (${btn.shortcut})`\n : btn.label\n }\n aria-pressed={active}\n aria-label={btn.label}\n >\n {btn.icon}\n </button>\n )\n })}\n </div>\n )}\n\n {/* editor content */}\n <div className=\"min-h-[120px] flex-1 overflow-y-auto\" data-selectable>\n <EditorContent\n editor={editor}\n className={cx(\n 'prose prose-sm text-fg max-w-none px-3 py-2',\n 'prose-headings:text-fg prose-p:text-fg prose-a:text-accent',\n 'prose-strong:text-fg prose-em:text-fg',\n 'prose-code:bg-bg-tertiary prose-code:rounded prose-code:px-1 prose-code:text-[0.85em]',\n 'prose-pre:bg-bg-tertiary prose-pre:rounded-lg',\n 'prose-blockquote:border-accent/30',\n '[&_.tiptap]:min-h-[100px] [&_.tiptap]:outline-none',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:text-fg-muted/30 [&_.tiptap_p.is-editor-empty:first-child::before]:pointer-events-none [&_.tiptap_p.is-editor-empty:first-child::before]:float-left [&_.tiptap_p.is-editor-empty:first-child::before]:h-0 [&_.tiptap_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]'\n )}\n />\n </div>\n </div>\n )\n})\n","// email-composer — full-featured block-based email composition\n// supports new/reply/reply-all/forward modes with rich text editing\n// uses RichTextEditor for body, EmailComposerField for recipients\n\nimport { Paperclip, Send, X } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport type { EmailContact } from '../l4-molecules/email-composer-field'\nimport { EmailComposerField } from '../l4-molecules/email-composer-field'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { sanitizeEmailHtml } from '../utils/sanitize'\nimport type { RichTextEditorHandle } from './rich-text-editor'\nimport { RichTextEditor } from './rich-text-editor'\n\n// ---- types ----\n\nexport type EmailComposerMode = 'forward' | 'new' | 'reply' | 'reply-all'\n\nexport type ComposerBlock =\n | { type: 'text'; id: string; html: string; text: string }\n | {\n type: 'attachment'\n id: string\n file: File\n name: string\n size: number\n mimeType: string\n }\n | {\n type: 'quote'\n id: string\n html: string\n headerText: string\n collapsed: boolean\n }\n | { type: 'signature'; id: string; html: string; text: string }\n | { type: 'divider'; id: string }\n\nexport type AssembledEmail = {\n html: string\n text: string\n attachments: File[]\n}\n\nexport type EmailComposerHandle = {\n focus: () => void\n getAssembled: () => AssembledEmail\n getEditorRef: () => RichTextEditorHandle | null\n addAttachment: (file: File) => void\n clearContent: () => void\n}\n\nexport type EmailComposerProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'ref'\n> & {\n /** compose mode */\n mode: EmailComposerMode\n\n /** recipients (controlled) */\n to: EmailContact[]\n onToChange: (contacts: EmailContact[]) => void\n cc?: EmailContact[]\n onCcChange?: (contacts: EmailContact[]) => void\n bcc?: EmailContact[]\n onBccChange?: (contacts: EmailContact[]) => void\n showCc?: boolean\n showBcc?: boolean\n\n /** subject */\n subject: string\n onSubjectChange: (subject: string) => void\n\n /** contact search */\n onContactSearch: (query: string) => Promise<EmailContact[]>\n\n /** image upload (passed to RichTextEditor) */\n onImageUpload?: (file: File) => Promise<string | null>\n\n /** initial quoted content (for reply/forward) */\n quotedHtml?: string\n quotedHeader?: string\n /** HTML signature */\n signature?: string\n\n /** actions */\n onSend: (email: AssembledEmail) => void\n onDiscard?: () => void\n onSaveDraft?: (email: AssembledEmail) => void\n\n /** submit button config */\n submitLabel?: string\n submitShortcut?: string\n\n /** extra action buttons in footer (e.g. AI Suggest, Polish) */\n footerActions?: ReactNode\n\n /** frosted glass effect */\n glass?: boolean\n className?: string\n}\n\n// ---- helpers ----\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction assembleEmail(\n bodyHtml: string,\n bodyText: string,\n attachments: File[],\n quotedHtml?: string,\n quotedHeader?: string,\n signatureHtml?: string\n): AssembledEmail {\n const htmlParts: string[] = []\n const textParts: string[] = []\n\n // body\n htmlParts.push(bodyHtml)\n textParts.push(bodyText)\n\n // signature\n if (signatureHtml !== undefined && signatureHtml !== '') {\n htmlParts.push(\n '<div style=\"margin-top:16px;border-top:1px solid #e5e5e5;padding-top:12px\">'\n )\n htmlParts.push(signatureHtml)\n htmlParts.push('</div>')\n textParts.push('\\n-- \\n')\n }\n\n // quoted content\n if (quotedHtml !== undefined && quotedHtml !== '') {\n const header = quotedHeader ?? ''\n htmlParts.push(\n `<div style=\"margin-top:16px;padding-left:12px;border-left:3px solid #d1d5db;color:#6b7280\">`\n )\n if (header !== '')\n htmlParts.push(`<p style=\"margin-bottom:8px\">${header}</p>`)\n htmlParts.push(quotedHtml)\n htmlParts.push('</div>')\n if (header !== '') textParts.push(`\\n${header}\\n`)\n textParts.push('> (quoted content)')\n }\n\n return {\n html: htmlParts.join('\\n'),\n text: textParts.join('\\n'),\n attachments,\n }\n}\n\n// ---- component ----\n\nexport const EmailComposer = forwardRef<\n EmailComposerHandle,\n EmailComposerProps\n>(function EmailComposer(\n {\n mode,\n to,\n onToChange,\n cc,\n onCcChange,\n bcc,\n onBccChange,\n showCc: initialShowCc,\n showBcc: initialShowBcc,\n subject,\n onSubjectChange,\n onContactSearch,\n onImageUpload,\n quotedHtml,\n quotedHeader,\n signature,\n onSend,\n onDiscard,\n onSaveDraft: _onSaveDraft,\n submitLabel,\n submitShortcut,\n footerActions,\n glass,\n className,\n ...props\n },\n ref\n) {\n const [showCc, setShowCc] = useState(initialShowCc === true)\n const [showBcc, setShowBcc] = useState(initialShowBcc === true)\n const [attachments, setAttachments] = useState<File[]>([])\n const [quoteCollapsed, setQuoteCollapsed] = useState(true)\n const editorRef = useRef<RichTextEditorHandle>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // sanitize quoted HTML to prevent XSS\n const sanitizedQuotedHtml = useMemo(() => {\n if (quotedHtml === undefined || quotedHtml === '') return quotedHtml\n return sanitizeEmailHtml(quotedHtml)\n }, [quotedHtml])\n\n // assemble and send\n const handleSend = useCallback(() => {\n const html = editorRef.current?.getHTML() ?? ''\n const text = editorRef.current?.getText() ?? ''\n const email = assembleEmail(\n html,\n text,\n attachments,\n quotedHtml,\n quotedHeader,\n signature\n )\n onSend(email)\n }, [attachments, quotedHtml, quotedHeader, signature, onSend])\n\n // Ctrl/Cmd+Enter from anywhere in composer\n useEffect(() => {\n const handleKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n handleSend()\n }\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [handleSend])\n\n // file attachment\n const addFiles = useCallback((files: FileList | File[]) => {\n setAttachments((prev) => [...prev, ...Array.from(files)])\n }, [])\n\n const removeAttachment = useCallback((index: number) => {\n setAttachments((prev) => {\n const next = [...prev]\n next.splice(index, 1)\n return next\n })\n }, [])\n\n // drag drop on entire composer\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n const files = e.dataTransfer.files\n if (files.length > 0) addFiles(files)\n },\n [addFiles]\n )\n\n // imperative handle\n useImperativeHandle(\n ref,\n () => ({\n focus: () => editorRef.current?.focus(),\n getAssembled: () => {\n const html = editorRef.current?.getHTML() ?? ''\n const text = editorRef.current?.getText() ?? ''\n return assembleEmail(\n html,\n text,\n attachments,\n quotedHtml,\n quotedHeader,\n signature\n )\n },\n getEditorRef: () => editorRef.current,\n addAttachment: (file: File) => setAttachments((prev) => [...prev, file]),\n clearContent: () => {\n editorRef.current?.clearContent()\n setAttachments([])\n },\n }),\n [attachments, quotedHtml, quotedHeader, signature]\n )\n\n const sendLabel = submitLabel ?? 'Send'\n const shortcutHint = submitShortcut ?? 'Ctrl+Enter'\n\n return (\n <div\n {...props}\n className={cx(\n 'border-border gds-radius-card bg-surface flex flex-col overflow-hidden border',\n glass === true && glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"email-composer\"\n data-variant={mode}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n >\n {/* recipient fields */}\n <div className=\"border-border flex flex-col border-b\">\n <div className=\"flex items-center\">\n <div className=\"flex-1\">\n <EmailComposerField\n label=\"To\"\n value={to}\n onChange={onToChange}\n onSearch={onContactSearch}\n />\n </div>\n {!showCc && !showBcc && (\n <div className=\"flex shrink-0 gap-1.5 px-2\">\n <button\n type=\"button\"\n className=\"gds-text-label text-fg-muted hover:text-accent transition-colors\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n <button\n type=\"button\"\n className=\"gds-text-label text-fg-muted hover:text-accent transition-colors\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n </div>\n )}\n </div>\n\n {showCc && onCcChange !== undefined && (\n <EmailComposerField\n label=\"Cc\"\n value={cc ?? []}\n onChange={onCcChange}\n onSearch={onContactSearch}\n />\n )}\n\n {showBcc && onBccChange !== undefined && (\n <EmailComposerField\n label=\"Bcc\"\n value={bcc ?? []}\n onChange={onBccChange}\n onSearch={onContactSearch}\n />\n )}\n </div>\n\n {/* subject */}\n <div className=\"border-border border-b\">\n <input\n type=\"text\"\n value={subject}\n onChange={(e) => onSubjectChange(e.target.value)}\n placeholder=\"Subject\"\n className=\"gds-text-body text-fg placeholder:text-fg-muted/30 w-full bg-transparent px-3 py-2.5 outline-none\"\n />\n </div>\n\n {/* rich text body */}\n <div className=\"min-h-0 flex-1\">\n <RichTextEditor\n ref={editorRef}\n mode=\"full\"\n placeholder=\"Write your message...\"\n onImageUpload={onImageUpload}\n onSubmit={handleSend}\n className=\"rounded-none border-0\"\n />\n </div>\n\n {/* attachments */}\n {attachments.length > 0 && (\n <div className=\"border-border flex flex-wrap gap-2 border-t px-3 py-2\">\n {attachments.map((file, i) => (\n <div\n key={`${file.name}-${i}`}\n className=\"bg-bg-secondary gds-text-label flex items-center gap-1.5 rounded-md px-2 py-1\"\n >\n <Paperclip className=\"text-fg-muted h-3 w-3\" />\n <span className=\"text-fg max-w-[140px] truncate\">\n {file.name}\n </span>\n <span className=\"text-fg-muted\">{formatFileSize(file.size)}</span>\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-danger transition-colors\"\n onClick={() => removeAttachment(i)}\n aria-label={`Remove ${file.name}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* quoted content (reply/forward) */}\n {sanitizedQuotedHtml !== undefined && sanitizedQuotedHtml !== '' && (\n <div className=\"border-border border-t\">\n <button\n type=\"button\"\n className=\"gds-text-label text-fg-muted hover:text-fg flex w-full items-center gap-1.5 px-3 py-1.5 transition-colors\"\n onClick={() => setQuoteCollapsed((prev) => !prev)}\n aria-expanded={!quoteCollapsed}\n aria-label={\n quoteCollapsed ? 'Show original message' : 'Hide original message'\n }\n >\n <svg\n className={cx(\n 'h-3 w-3 transition-transform',\n !quoteCollapsed && 'rotate-90'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n {quoteCollapsed ? 'Show original' : 'Hide original'}\n </button>\n {!quoteCollapsed && (\n <div\n className=\"border-accent/20 text-fg-muted gds-text-body ml-3 border-l-2 px-3 pb-3\"\n dangerouslySetInnerHTML={{ __html: sanitizedQuotedHtml }}\n />\n )}\n </div>\n )}\n\n {/* footer: actions + send */}\n <div className=\"border-border flex items-center justify-between border-t px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* attachment button */}\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-fg flex items-center justify-center rounded p-1.5 transition-colors hover:bg-white/[0.04]\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach file\"\n aria-label=\"Attach file\"\n >\n <Paperclip className=\"h-4 w-4\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Choose files to attach\"\n onChange={(e) => {\n if (e.target.files !== null && e.target.files.length > 0) {\n addFiles(e.target.files)\n e.target.value = ''\n }\n }}\n />\n\n {/* extra footer actions (AI Suggest, Polish, etc.) */}\n {footerActions}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {onDiscard !== undefined && (\n <button\n type=\"button\"\n className=\"gds-text-body text-fg-muted hover:text-fg px-2 py-1 transition-colors\"\n onClick={onDiscard}\n >\n Cancel\n </button>\n )}\n\n <button\n type=\"button\"\n className=\"bg-accent gds-text-body text-accent-fg hover:bg-accent-hover inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 font-medium transition-colors\"\n onClick={handleSend}\n title={`${sendLabel} (${shortcutHint})`}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {sendLabel}\n </button>\n </div>\n </div>\n </div>\n )\n})\n","// email-list-item — inbox list entry with sender, subject, preview, timestamp\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmailListItemProps = {\n sender: string\n senderAvatar?: string\n subject: string\n preview?: string\n timestamp: string\n unread?: boolean\n starred?: boolean\n selected?: boolean\n onClick?: () => void\n className?: string\n}\n\nexport const EmailListItem = forwardRef<HTMLDivElement, EmailListItemProps>(\n function EmailListItem(\n {\n sender,\n senderAvatar,\n subject,\n preview,\n timestamp,\n unread,\n starred,\n selected,\n onClick,\n className,\n },\n ref\n ) {\n const isUnread = unread === true\n const avatarText = senderAvatar ?? sender.charAt(0).toUpperCase()\n\n return (\n <div\n ref={ref}\n role={onClick !== undefined ? 'button' : undefined}\n tabIndex={onClick !== undefined ? 0 : undefined}\n onClick={onClick}\n onKeyDown={\n onClick !== undefined\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n }\n : undefined\n }\n className={cx(\n 'gds-pad-x gds-pad-y-sm gds-text-body flex items-start gap-3 select-none',\n onClick !== undefined && 'hover:bg-bg-tertiary cursor-pointer',\n selected === true && 'bg-accent/5',\n className\n )}\n data-component=\"email-list-item\"\n data-state={isUnread ? 'unread' : 'read'}\n >\n {/* avatar */}\n <div className=\"bg-bg-tertiary text-fg-muted flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-semibold\">\n {avatarText}\n </div>\n\n {/* body */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {isUnread && (\n <span className=\"bg-accent h-2 w-2 shrink-0 rounded-full\" />\n )}\n <span\n className={cx(\n 'truncate',\n isUnread ? 'text-fg font-semibold' : 'text-fg'\n )}\n >\n {sender}\n </span>\n {starred === true && (\n <span className=\"text-warning shrink-0\">★</span>\n )}\n </div>\n <div\n className={cx(\n 'truncate',\n isUnread ? 'text-fg font-medium' : 'text-fg-muted'\n )}\n >\n {subject}\n </div>\n {preview !== undefined && (\n <div className=\"text-fg-muted/60 truncate\">{preview}</div>\n )}\n </div>\n\n {/* timestamp */}\n <span className=\"text-fg-muted shrink-0 text-xs\">{timestamp}</span>\n </div>\n )\n }\n)\n","// email-thread — renders email conversation threads with message bubbles,\n// HTML/text rendering, attachments, expand/collapse, and AI analysis panel\n\nimport {\n ChevronDown,\n ChevronRight,\n Download,\n FileText,\n Forward,\n Image as ImageIcon,\n Paperclip,\n Reply,\n ReplyAll,\n Sparkles,\n Trash2,\n} from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useMemo, useState } from 'react'\n\nimport { IconButton } from '../l2-primitives/icon-button'\nimport { Avatar } from '../l3-atoms/avatar'\nimport { Tooltip } from '../l3-atoms/tooltip'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { sanitizeEmailHtml } from '../utils/sanitize'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype EmailAttachment = {\n index: number\n filename: string\n mimeType: string\n size: number\n contentId?: string\n thumbnailUrl?: string\n}\n\ntype EmailAiAnalysis = {\n summary?: string\n people?: Array<{ name: string; role?: string; email?: string }>\n dates?: Array<{ text: string; context?: string }>\n amounts?: Array<{ value: string; currency?: string; context?: string }>\n actionItems?: string[]\n deadline?: string\n riskScore?: number\n riskReason?: string\n}\n\ntype EmailMessage = {\n id: string\n from: string\n fromName?: string\n to: string[]\n cc?: string[]\n date: string\n subject?: string\n textBody: string | null\n htmlBody: string | null\n isOwn: boolean\n attachments?: EmailAttachment[]\n aiAnalysis?: EmailAiAnalysis | null\n}\n\ntype EmailThreadProps = React.HTMLAttributes<HTMLDivElement> & {\n messages: EmailMessage[]\n\n defaultExpandedIds?: Set<string>\n expandAll?: boolean\n\n onReply?: (message: EmailMessage) => void\n onReplyAll?: (message: EmailMessage) => void\n onForward?: (message: EmailMessage) => void\n onDelete?: (message: EmailMessage) => void\n onPrint?: (message: EmailMessage) => void\n onDownloadRaw?: (message: EmailMessage) => void\n\n onAttachmentClick?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentDownload?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentExtractText?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n\n showAiAnalysis?: boolean\n\n renderMessageActions?: (message: EmailMessage) => ReactNode\n renderAttachment?: (\n attachment: EmailAttachment,\n message: EmailMessage\n ) => ReactNode\n\n glass?: boolean\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n const now = new Date()\n const diffMs = now.getTime() - d.getTime()\n const diffMin = Math.floor(diffMs / 60_000)\n if (diffMin < 1) return 'just now'\n if (diffMin < 60) return `${diffMin}m ago`\n const diffHr = Math.floor(diffMin / 60)\n if (diffHr < 24) return `${diffHr}h ago`\n const diffDay = Math.floor(diffHr / 24)\n if (diffDay < 7) return `${diffDay}d ago`\n return d.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\nfunction isImageMime(mime: string): boolean {\n return mime.startsWith('image/')\n}\n\nfunction isPdfMime(mime: string): boolean {\n return mime === 'application/pdf'\n}\n\n// ---------------------------------------------------------------------------\n// EmailAttachmentPreview (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailAttachmentPreview({\n attachment,\n message,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n renderAttachment,\n}: {\n attachment: EmailAttachment\n message: EmailMessage\n onAttachmentClick?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentDownload?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentExtractText?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n renderAttachment?: (\n attachment: EmailAttachment,\n message: EmailMessage\n ) => ReactNode\n}) {\n if (renderAttachment !== undefined) {\n return <>{renderAttachment(attachment, message)}</>\n }\n\n const isImage = isImageMime(attachment.mimeType)\n const isPdf = isPdfMime(attachment.mimeType)\n\n return (\n <div\n className={cx(\n 'border-border bg-bg-secondary flex items-center gap-2 rounded-md border p-2',\n onAttachmentClick !== undefined && 'hover:bg-bg-tertiary cursor-pointer'\n )}\n role={onAttachmentClick !== undefined ? 'button' : undefined}\n tabIndex={onAttachmentClick !== undefined ? 0 : undefined}\n onClick={\n onAttachmentClick !== undefined\n ? () => onAttachmentClick(message, attachment)\n : undefined\n }\n onKeyDown={\n onAttachmentClick !== undefined\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onAttachmentClick(message, attachment)\n }\n }\n : undefined\n }\n data-component=\"email-attachment-preview\"\n >\n {isImage && attachment.thumbnailUrl !== undefined ? (\n <img\n src={attachment.thumbnailUrl}\n alt={attachment.filename}\n className=\"h-10 w-10 rounded object-cover\"\n />\n ) : (\n <span className=\"bg-bg-tertiary text-fg-muted flex h-10 w-10 shrink-0 items-center justify-center rounded\">\n {isImage && <ImageIcon size={18} />}\n {!isImage && isPdf && <FileText size={18} />}\n {!isImage && !isPdf && <Paperclip size={18} />}\n </span>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-fg truncate text-sm font-medium\">\n {attachment.filename}\n </div>\n <div className=\"text-fg-muted text-xs\">\n {formatFileSize(attachment.size)}\n </div>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n {isPdf && onAttachmentExtractText !== undefined && (\n <Tooltip content=\"Extract text\">\n <IconButton\n size=\"sm\"\n icon={<FileText size={14} />}\n tooltip=\"Extract text\"\n onClick={(e) => {\n e.stopPropagation()\n onAttachmentExtractText(message, attachment)\n }}\n />\n </Tooltip>\n )}\n {onAttachmentDownload !== undefined && (\n <Tooltip content=\"Download\">\n <IconButton\n size=\"sm\"\n icon={<Download size={14} />}\n tooltip=\"Download attachment\"\n onClick={(e) => {\n e.stopPropagation()\n onAttachmentDownload(message, attachment)\n }}\n />\n </Tooltip>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailAiPanel (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailAiPanel({ analysis }: { analysis: EmailAiAnalysis }) {\n const [expanded, setExpanded] = useState(false)\n\n const hasSummary =\n analysis.summary !== undefined && analysis.summary.length > 0\n const hasDetails =\n (analysis.people !== undefined && analysis.people.length > 0) ||\n (analysis.dates !== undefined && analysis.dates.length > 0) ||\n (analysis.amounts !== undefined && analysis.amounts.length > 0) ||\n (analysis.actionItems !== undefined && analysis.actionItems.length > 0) ||\n analysis.deadline !== undefined ||\n analysis.riskScore !== undefined\n\n if (!hasSummary && !hasDetails) return null\n\n return (\n <div\n className=\"border-accent/20 bg-accent/5 mt-2 rounded-md border p-3\"\n data-component=\"email-ai-panel\"\n >\n <button\n type=\"button\"\n className=\"text-accent flex w-full items-center gap-2 text-left text-xs font-medium\"\n onClick={() => setExpanded((p) => !p)}\n aria-expanded={expanded}\n aria-label=\"AI Analysis\"\n >\n <Sparkles size={14} />\n <span className=\"flex-1\">AI Analysis</span>\n {hasDetails &&\n (expanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />)}\n </button>\n\n {hasSummary && (\n <p className=\"text-fg-muted mt-1 text-xs\">{analysis.summary}</p>\n )}\n\n {expanded && hasDetails && (\n <div className=\"mt-2 flex flex-col gap-2 text-xs\">\n {analysis.people !== undefined && analysis.people.length > 0 && (\n <div>\n <span className=\"text-fg font-medium\">People:</span>\n <ul className=\"text-fg-muted mt-0.5 list-inside list-disc\">\n {analysis.people.map((p, i) => (\n <li key={i}>\n {p.name}\n {p.role !== undefined && (\n <span className=\"text-fg-muted/60\"> — {p.role}</span>\n )}\n {p.email !== undefined && (\n <span className=\"text-fg-muted/60\"> ({p.email})</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.dates !== undefined && analysis.dates.length > 0 && (\n <div>\n <span className=\"text-fg font-medium\">Dates:</span>\n <ul className=\"text-fg-muted mt-0.5 list-inside list-disc\">\n {analysis.dates.map((d, i) => (\n <li key={i}>\n {d.text}\n {d.context !== undefined && (\n <span className=\"text-fg-muted/60\"> — {d.context}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.amounts !== undefined && analysis.amounts.length > 0 && (\n <div>\n <span className=\"text-fg font-medium\">Amounts:</span>\n <ul className=\"text-fg-muted mt-0.5 list-inside list-disc\">\n {analysis.amounts.map((a, i) => (\n <li key={i}>\n {a.value}\n {a.currency !== undefined && <span> {a.currency}</span>}\n {a.context !== undefined && (\n <span className=\"text-fg-muted/60\"> — {a.context}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.actionItems !== undefined &&\n analysis.actionItems.length > 0 && (\n <div>\n <span className=\"text-fg font-medium\">Action Items:</span>\n <ul className=\"text-fg-muted mt-0.5 list-inside list-disc\">\n {analysis.actionItems.map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.deadline !== undefined && (\n <div>\n <span className=\"text-danger font-medium\">Deadline:</span>{' '}\n <span className=\"text-danger\">{analysis.deadline}</span>\n </div>\n )}\n\n {analysis.riskScore !== undefined && (\n <div>\n <span className=\"text-warning font-medium\">\n Risk: {analysis.riskScore}/10\n </span>\n {analysis.riskReason !== undefined && (\n <span className=\"text-fg-muted\"> — {analysis.riskReason}</span>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailMessageBubble (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailMessageBubble({\n message,\n isExpanded,\n onToggleExpand,\n onReply,\n onReplyAll,\n onForward,\n onDelete,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n showAiAnalysis,\n renderMessageActions,\n renderAttachment,\n}: {\n message: EmailMessage\n isExpanded: boolean\n onToggleExpand: () => void\n onReply?: (message: EmailMessage) => void\n onReplyAll?: (message: EmailMessage) => void\n onForward?: (message: EmailMessage) => void\n onDelete?: (message: EmailMessage) => void\n onAttachmentClick?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentDownload?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n onAttachmentExtractText?: (\n message: EmailMessage,\n attachment: EmailAttachment\n ) => void\n showAiAnalysis?: boolean\n renderMessageActions?: (message: EmailMessage) => ReactNode\n renderAttachment?: (\n attachment: EmailAttachment,\n message: EmailMessage\n ) => ReactNode\n}) {\n const displayName = message.fromName ?? message.from\n const hasAttachments =\n message.attachments !== undefined && message.attachments.length > 0\n const hasAiAnalysis =\n showAiAnalysis === true &&\n message.aiAnalysis !== undefined &&\n message.aiAnalysis !== null\n\n // Build sanitized HTML content\n const sanitizedHtml = useMemo(() => {\n if (message.htmlBody === null) return null\n return sanitizeEmailHtml(message.htmlBody)\n }, [message.htmlBody])\n\n // Render body content\n const bodyContent = useMemo(() => {\n if (sanitizedHtml !== null) {\n return (\n <div\n className=\"prose prose-sm dark:prose-invert max-w-none break-words [&_img]:h-auto [&_img]:max-w-full [&_table]:text-xs\"\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n />\n )\n }\n if (message.textBody !== null) {\n return (\n <pre className=\"text-fg font-sans text-sm leading-relaxed break-words whitespace-pre-wrap\">\n {message.textBody}\n </pre>\n )\n }\n return <p className=\"text-fg-muted text-sm italic\">No content</p>\n }, [sanitizedHtml, message.textBody])\n\n // Collapsed preview: first line of text\n const collapsedPreview = useMemo(() => {\n if (message.textBody !== null) {\n const lines = message.textBody\n .split('\\n')\n .filter((l) => l.trim().length > 0)\n const preview = lines.slice(0, 3).join(' ')\n if (preview.length > 200) return `${preview.slice(0, 200)}…`\n return preview\n }\n if (message.htmlBody !== null) {\n // Strip tags for preview\n const text = message.htmlBody\n .replace(/<[^>]*>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n if (text.length > 200) return `${text.slice(0, 200)}…`\n return text\n }\n return ''\n }, [message.textBody, message.htmlBody])\n\n const avatarEl = <Avatar name={displayName} size=\"default\" />\n\n const headerEl = (\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left\"\n onClick={onToggleExpand}\n aria-expanded={isExpanded}\n aria-label={\n isExpanded\n ? `Collapse message from ${displayName}`\n : `Expand message from ${displayName}`\n }\n >\n {isExpanded ? (\n <ChevronDown size={14} className=\"text-fg-muted shrink-0\" />\n ) : (\n <ChevronRight size={14} className=\"text-fg-muted shrink-0\" />\n )}\n <span className=\"text-fg truncate text-sm font-medium\">\n {displayName}\n </span>\n <span className=\"text-fg-muted truncate text-xs\">\n <{message.from}>\n </span>\n </button>\n <span className=\"text-fg-muted shrink-0 text-xs\">\n {formatDate(message.date)}\n </span>\n </div>\n )\n\n const actionBar =\n renderMessageActions !== undefined ? (\n renderMessageActions(message)\n ) : (\n <div className=\"flex items-center gap-0.5\">\n {onReply !== undefined && (\n <Tooltip content=\"Reply\">\n <IconButton\n size=\"sm\"\n icon={<Reply size={14} />}\n tooltip=\"Reply\"\n onClick={() => onReply(message)}\n />\n </Tooltip>\n )}\n {onReplyAll !== undefined && (\n <Tooltip content=\"Reply All\">\n <IconButton\n size=\"sm\"\n icon={<ReplyAll size={14} />}\n tooltip=\"Reply all\"\n onClick={() => onReplyAll(message)}\n />\n </Tooltip>\n )}\n {onForward !== undefined && (\n <Tooltip content=\"Forward\">\n <IconButton\n size=\"sm\"\n icon={<Forward size={14} />}\n tooltip=\"Forward\"\n onClick={() => onForward(message)}\n />\n </Tooltip>\n )}\n {onDelete !== undefined && (\n <Tooltip content=\"Delete\">\n <IconButton\n size=\"sm\"\n variant=\"danger\"\n icon={<Trash2 size={14} />}\n tooltip=\"Delete\"\n onClick={() => onDelete(message)}\n />\n </Tooltip>\n )}\n </div>\n )\n\n const hasAnyAction =\n onReply !== undefined ||\n onReplyAll !== undefined ||\n onForward !== undefined ||\n onDelete !== undefined ||\n renderMessageActions !== undefined\n\n return (\n <div\n className={cx('flex gap-3', message.isOwn && 'flex-row-reverse')}\n data-component=\"email-message-bubble\"\n data-state={isExpanded ? 'expanded' : 'collapsed'}\n data-own={message.isOwn ? 'true' : 'false'}\n >\n {/* Avatar */}\n <div className=\"shrink-0 pt-1\">{avatarEl}</div>\n\n {/* Content */}\n <div\n className={cx(\n 'gds-pad min-w-0 flex-1 rounded-lg border',\n message.isOwn\n ? 'border-accent/20 bg-accent/5'\n : 'border-border bg-bg-secondary'\n )}\n >\n {/* Header */}\n <div className=\"flex items-start gap-2\">\n {headerEl}\n {isExpanded && hasAnyAction && (\n <div className=\"shrink-0\">{actionBar}</div>\n )}\n </div>\n\n {/* Recipients (expanded only) */}\n {isExpanded && (\n <div className=\"text-fg-muted mt-1 text-xs\">\n <span>To: {message.to.join(', ')}</span>\n {message.cc !== undefined && message.cc.length > 0 && (\n <span className=\"ml-2\">Cc: {message.cc.join(', ')}</span>\n )}\n </div>\n )}\n\n {/* Body */}\n <div className=\"mt-2\">\n {isExpanded ? (\n bodyContent\n ) : (\n <button\n type=\"button\"\n className=\"text-fg-muted w-full text-left text-sm\"\n onClick={onToggleExpand}\n aria-expanded={false}\n aria-label={`Expand message from ${displayName}`}\n >\n <span className=\"line-clamp-2\">{collapsedPreview}</span>\n <span className=\"text-accent text-xs\"> Show more</span>\n </button>\n )}\n </div>\n\n {/* Attachments (expanded only) */}\n {isExpanded && hasAttachments && (\n <div className=\"mt-3\">\n <div className=\"text-fg-muted mb-1.5 flex items-center gap-1 text-xs font-medium\">\n <Paperclip size={12} />\n <span>\n {message.attachments?.length ?? 0} attachment\n {(message.attachments?.length ?? 0) > 1 ? 's' : ''}\n </span>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {(message.attachments ?? []).map((att) => (\n <EmailAttachmentPreview\n key={att.index}\n attachment={att}\n message={message}\n onAttachmentClick={onAttachmentClick}\n onAttachmentDownload={onAttachmentDownload}\n onAttachmentExtractText={onAttachmentExtractText}\n renderAttachment={renderAttachment}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* AI Analysis (expanded only) */}\n {isExpanded &&\n hasAiAnalysis &&\n message.aiAnalysis !== undefined &&\n message.aiAnalysis !== null && (\n <EmailAiPanel analysis={message.aiAnalysis} />\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailThread (exported)\n// ---------------------------------------------------------------------------\n\nconst EmailThread = forwardRef<HTMLDivElement, EmailThreadProps>(\n function EmailThread(\n {\n messages,\n defaultExpandedIds,\n expandAll,\n onReply,\n onReplyAll,\n onForward,\n onDelete,\n onPrint: _onPrint,\n onDownloadRaw: _onDownloadRaw,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n showAiAnalysis,\n renderMessageActions,\n renderAttachment,\n glass,\n className,\n ...props\n },\n ref\n ) {\n // Build initial expanded set: default last message expanded\n const initialExpanded = useMemo(() => {\n if (expandAll === true) return new Set(messages.map((m) => m.id))\n if (defaultExpandedIds !== undefined) return new Set(defaultExpandedIds)\n // Default: expand last message\n if (messages.length > 0)\n return new Set([messages[messages.length - 1].id])\n return new Set<string>()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally stable, only computed once on mount\n }, [])\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(initialExpanded)\n\n // When expandAll changes, override local state\n const effectiveExpanded =\n expandAll === true ? new Set(messages.map((m) => m.id)) : expandedIds\n\n const toggleExpand = useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n if (messages.length === 0) {\n return (\n <div\n ref={ref}\n className={cx(\n 'text-fg-muted gds-text-body flex flex-col items-center justify-center py-12',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"email-thread\"\n data-state=\"empty\"\n {...props}\n >\n <p>No messages</p>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-gap flex flex-col',\n glass === true && glassClass(glass),\n className\n )}\n data-component=\"email-thread\"\n role=\"list\"\n aria-label=\"Email thread\"\n {...props}\n >\n {messages.map((message) => (\n <div key={message.id} role=\"listitem\">\n <EmailMessageBubble\n message={message}\n isExpanded={effectiveExpanded.has(message.id)}\n onToggleExpand={() => toggleExpand(message.id)}\n onReply={onReply}\n onReplyAll={onReplyAll}\n onForward={onForward}\n onDelete={onDelete}\n onAttachmentClick={onAttachmentClick}\n onAttachmentDownload={onAttachmentDownload}\n onAttachmentExtractText={onAttachmentExtractText}\n showAiAnalysis={showAiAnalysis}\n renderMessageActions={renderMessageActions}\n renderAttachment={renderAttachment}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport { EmailThread }\nexport type { EmailAiAnalysis, EmailAttachment, EmailMessage, EmailThreadProps }\n","// embed — responsive embed container for iframes (videos, maps, etc)\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmbedProps = {\n src: string\n title?: string\n ratio?: number\n allowFullscreen?: boolean\n sandbox?: string\n loading?: 'eager' | 'lazy'\n glass?: boolean\n className?: string\n}\n\nexport const Embed = forwardRef<HTMLDivElement, EmbedProps>(function Embed(\n {\n src,\n title,\n ratio = 16 / 9,\n allowFullscreen = true,\n sandbox,\n loading = 'lazy',\n glass = false,\n className,\n },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-card relative w-full overflow-hidden border border-white/[0.06]',\n glass && 'gds-glass',\n className\n )}\n data-component=\"embed\"\n style={{ aspectRatio: ratio }}\n >\n <iframe\n src={src}\n title={title}\n className=\"absolute inset-0 h-full w-full border-none\"\n allowFullScreen={allowFullscreen}\n sandbox={sandbox}\n loading={loading}\n data-testid=\"embed-iframe\"\n />\n </div>\n )\n})\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EmployeeStatus = 'active' | 'inactive' | 'onboarding'\n\ntype EmployeeCardProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n department?: string\n email?: string\n name: string\n phone?: string\n role?: string\n status?: EmployeeStatus\n}\n\nconst statusCls: Record<EmployeeStatus, string> = {\n active: 'bg-success/15 text-success',\n inactive: 'bg-danger/15 text-danger',\n onboarding: 'bg-warning/15 text-warning',\n}\n\nexport const EmployeeCard = forwardRef<HTMLDivElement, EmployeeCardProps>(\n function EmployeeCard(\n {\n avatar,\n className,\n department,\n email,\n name,\n phone,\n role,\n status,\n ...props\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 className={cx(\n 'gds-ctx gds-radius-card border-border bg-surface gds-pad border',\n className\n )}\n data-component=\"employee-card\"\n ref={ref}\n {...props}\n >\n <div className=\"gds-gap flex items-center\">\n {avatar !== undefined ? (\n <img\n src={avatar}\n alt={name}\n className=\"h-12 w-12 rounded-full object-cover\"\n />\n ) : (\n <div className=\"bg-accent/10 text-accent flex h-12 w-12 items-center justify-center rounded-full text-sm font-semibold\">\n {initials}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-fg truncate font-semibold\">{name}</div>\n {role !== undefined && (\n <div className=\"text-fg-muted truncate text-xs\">{role}</div>\n )}\n {department !== undefined && (\n <div className=\"text-fg-muted truncate text-xs\">{department}</div>\n )}\n </div>\n {status !== undefined && (\n <span\n className={cx(\n 'shrink-0 rounded-full px-2 py-0.5 text-xs font-medium',\n statusCls[status]\n )}\n >\n {status}\n </span>\n )}\n </div>\n {(email !== undefined || phone !== undefined) && (\n <div className=\"text-fg-muted mt-3 space-y-0.5 text-xs\">\n {email !== undefined && <div>{email}</div>}\n {phone !== undefined && <div>{phone}</div>}\n </div>\n )}\n </div>\n )\n }\n)\n\nexport type { EmployeeCardProps, EmployeeStatus }\n","// error-boundary — catches render errors and shows fallback UI\nimport type { ErrorInfo, ReactNode } from 'react'\nimport { Component } from 'react'\n\nexport type ErrorBoundaryProps = {\n children: ReactNode\n fallback?: ReactNode | ((error: Error) => ReactNode)\n onError?: (error: Error, info: ErrorInfo) => void\n}\n\ntype ErrorBoundaryState = {\n error: Error | null\n}\n\nclass ErrorBoundaryClass extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n if (this.props.onError !== undefined) {\n this.props.onError(error, info)\n }\n }\n\n render() {\n const { error } = this.state\n const { children, fallback } = this.props\n\n if (error === null) {\n return children\n }\n\n if (fallback !== undefined) {\n if (typeof fallback === 'function') {\n return fallback(error)\n }\n return fallback\n }\n\n return (\n <div\n className=\"gds-pad gds-text-body text-danger flex flex-col items-center justify-center gap-2\"\n data-component=\"error-boundary\"\n >\n <p className=\"font-semibold\">Something went wrong</p>\n <p className=\"text-fg-muted gds-text-caption\">{error.message}</p>\n </div>\n )\n }\n}\n\nexport { ErrorBoundaryClass as ErrorBoundary }\n","// file-browser — table layout for file/folder navigation\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FileNode = {\n id: string\n name: string\n type: 'file' | 'folder'\n size?: number\n modified?: string\n icon?: ReactNode\n}\n\nexport type FileBrowserProps = {\n files: FileNode[]\n onNavigate?: (id: string) => void\n onSelect?: (id: string) => void\n selected?: string\n className?: string\n}\n\nfunction FolderIcon() {\n return (\n <svg\n className=\"text-warning h-4 w-4\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path d=\"M1 3.5A1.5 1.5 0 012.5 2h3.379a1.5 1.5 0 011.06.44L8.062 3.5H13.5A1.5 1.5 0 0115 5v7.5a1.5 1.5 0 01-1.5 1.5h-11A1.5 1.5 0 011 12.5v-9z\" />\n </svg>\n )\n}\n\nfunction FileIcon() {\n return (\n <svg\n className=\"text-fg-muted h-4 w-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n >\n <path d=\"M4 1.5h5l3.5 3.5V14a.5.5 0 01-.5.5H4a.5.5 0 01-.5-.5V2a.5.5 0 01.5-.5z\" />\n <path d=\"M9 1.5V5h3.5\" />\n </svg>\n )\n}\n\nfunction formatSize(bytes?: number): string {\n if (bytes === undefined) return '—'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport const FileBrowser = forwardRef<HTMLDivElement, FileBrowserProps>(\n function FileBrowser(\n { files, onNavigate, onSelect, selected, className },\n ref\n ) {\n const handleClick = (node: FileNode) => {\n if (node.type === 'folder' && onNavigate !== undefined) {\n onNavigate(node.id)\n } else if (node.type === 'file' && onSelect !== undefined) {\n onSelect(node.id)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border bg-surface overflow-auto border',\n className\n )}\n data-component=\"file-browser\"\n >\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-border bg-bg-secondary/50 border-b\">\n <th className=\"gds-pad-x gds-pad-y gds-text-body text-fg-muted text-left font-medium tracking-wider uppercase select-none\">\n Name\n </th>\n <th className=\"gds-pad-x gds-pad-y gds-text-body text-fg-muted w-24 text-right font-medium tracking-wider uppercase select-none\">\n Size\n </th>\n <th className=\"gds-pad-x gds-pad-y gds-text-body text-fg-muted w-32 text-right font-medium tracking-wider uppercase select-none\">\n Modified\n </th>\n </tr>\n </thead>\n <tbody>\n {files.length === 0 && (\n <tr>\n <td\n colSpan={3}\n className=\"gds-pad-x text-fg-muted py-12 text-center text-sm\"\n >\n Empty folder\n </td>\n </tr>\n )}\n {files.map((node) => (\n <tr\n key={node.id}\n className={cx(\n 'border-border border-b transition-colors',\n focusCls,\n selected === node.id && 'bg-accent/10',\n selected !== node.id && 'hover:bg-bg-secondary/60',\n 'cursor-pointer'\n )}\n onClick={() => handleClick(node)}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick(node)\n }}\n >\n <td className=\"gds-pad-x gds-pad-y\">\n <div className=\"gds-gap-sm text-fg flex items-center\">\n {node.icon ??\n (node.type === 'folder' ? <FolderIcon /> : <FileIcon />)}\n <span\n className={node.type === 'folder' ? 'font-medium' : ''}\n >\n {node.name}\n </span>\n </div>\n </td>\n <td className=\"gds-pad-x gds-pad-y text-fg-muted text-right\">\n {node.type === 'folder' ? '—' : formatSize(node.size)}\n </td>\n <td className=\"gds-pad-x gds-pad-y text-fg-muted text-right\">\n {node.modified ?? '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n","// file-card — file/document card with thumbnail, name, size, type badge, and actions\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { cx } from '../utils/cx'\n\ntype FileCardProps = {\n name: string\n size?: string\n type?: string\n thumbnail?: string\n actions?: ReactNode\n onClick?: () => void\n className?: string\n}\n\nconst FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n { name, size, type, thumbnail, actions, onClick, className },\n ref\n) {\n const isClickable = onClick !== undefined\n\n return (\n <div\n ref={ref}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={isClickable ? onClick : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n }\n : undefined\n }\n className={cx(\n 'gds-ctx gds-radius-card border-border bg-surface overflow-hidden border select-none',\n isClickable &&\n 'hover:border-accent/40 cursor-pointer transition-colors',\n className\n )}\n data-component=\"file-card\"\n >\n {thumbnail !== undefined && (\n <div className=\"bg-bg-tertiary flex h-28 items-center justify-center\">\n <img\n src={thumbnail}\n alt={name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n <div className=\"gds-pad\">\n <div className=\"text-fg gds-text-body truncate font-medium\">{name}</div>\n <div className=\"mt-1 flex items-center gap-2\">\n {size !== undefined && (\n <span className=\"text-fg-muted gds-text-caption\">{size}</span>\n )}\n {type !== undefined && <Badge>{type}</Badge>}\n </div>\n {actions !== undefined && (\n <div className=\"mt-2 flex gap-1\">{actions}</div>\n )}\n </div>\n </div>\n )\n})\n\nexport { FileCard }\nexport type { FileCardProps }\n","// form-builder — schema-driven form renderer\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FormField = {\n id: string\n label: string\n type: 'checkbox' | 'number' | 'select' | 'text' | 'textarea'\n options?: string[]\n required?: boolean\n placeholder?: string\n}\n\nexport type FormBuilderProps = {\n fields: FormField[]\n values: Record<string, unknown>\n onChange: (id: string, value: unknown) => void\n className?: string\n}\n\nconst inputCls = cx(\n 'w-full gds-radius-button border border-border bg-bg gds-pad-x gds-pad-y-sm text-sm text-fg',\n 'placeholder:text-fg-muted/50',\n focusCls\n)\n\nfunction renderField(\n field: FormField,\n value: unknown,\n onChange: (id: string, value: unknown) => void\n) {\n const id = `form-field-${field.id}`\n\n if (field.type === 'checkbox') {\n return (\n <label\n htmlFor={id}\n className=\"gds-gap-sm flex cursor-pointer items-center select-none\"\n >\n <input\n id={id}\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(field.id, e.target.checked)}\n className={cx('border-border h-4 w-4 rounded', focusCls)}\n />\n <span className=\"text-fg text-sm\">{field.label}</span>\n {field.required === true && <span className=\"text-danger\">*</span>}\n </label>\n )\n }\n\n if (field.type === 'textarea') {\n return (\n <div className=\"gds-gap-xs flex flex-col\">\n <label\n htmlFor={id}\n className=\"gds-text-body text-fg-muted font-medium select-none\"\n >\n {field.label}\n {field.required === true && (\n <span className=\"text-danger ml-0.5\">*</span>\n )}\n </label>\n <textarea\n id={id}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n onChange={(e) => onChange(field.id, e.target.value)}\n className={cx(inputCls, 'min-h-[72px] resize-y')}\n rows={3}\n />\n </div>\n )\n }\n\n if (field.type === 'select') {\n return (\n <div className=\"gds-gap-xs flex flex-col\">\n <label\n htmlFor={id}\n className=\"gds-text-body text-fg-muted font-medium select-none\"\n >\n {field.label}\n {field.required === true && (\n <span className=\"text-danger ml-0.5\">*</span>\n )}\n </label>\n <select\n id={id}\n value={String(value ?? '')}\n onChange={(e) => onChange(field.id, e.target.value)}\n className={cx(inputCls, 'cursor-pointer')}\n >\n <option value=\"\">{field.placeholder ?? 'Select...'}</option>\n {field.options?.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n </div>\n )\n }\n\n // text or number\n return (\n <div className=\"gds-gap-xs flex flex-col\">\n <label\n htmlFor={id}\n className=\"gds-text-body text-fg-muted font-medium select-none\"\n >\n {field.label}\n {field.required === true && (\n <span className=\"text-danger ml-0.5\">*</span>\n )}\n </label>\n <input\n id={id}\n type={field.type}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n onChange={(e) => {\n if (field.type === 'number') {\n onChange(\n field.id,\n e.target.value === '' ? '' : Number(e.target.value)\n )\n } else {\n onChange(field.id, e.target.value)\n }\n }}\n className={inputCls}\n />\n </div>\n )\n}\n\nexport const FormBuilder = forwardRef<HTMLDivElement, FormBuilderProps>(\n function FormBuilder({ fields, values, onChange, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"form-builder\"\n >\n {fields.map((field) => (\n <div key={field.id}>\n {renderField(field, values[field.id], onChange)}\n </div>\n ))}\n </div>\n )\n }\n)\n","import type { GanttTask, GanttViewMode } from './gantt-chart-types'\n\nexport const PALETTE = [\n 'var(--gds-palette-0)',\n 'var(--gds-palette-1)',\n 'var(--gds-palette-2)',\n 'var(--gds-palette-3)',\n 'var(--gds-palette-4)',\n 'var(--gds-palette-5)',\n 'var(--gds-palette-6)',\n 'var(--gds-palette-7)',\n]\n\nexport const DAY_MS = 86400000\nexport const RESIZE_HANDLE_WIDTH = 6\n\nexport const toTs = (d: Date | string): number => new Date(d).getTime()\n\nexport const fmtDate = (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 shortMonth = (d: Date): string =>\n d.toLocaleDateString('en-US', { month: 'short' })\n\nconst startOfWeek = (d: Date): Date => {\n const result = new Date(d)\n const day = result.getDay()\n const diff = day === 0 ? -6 : 1 - day\n result.setDate(result.getDate() + diff)\n result.setHours(0, 0, 0, 0)\n return result\n}\n\nconst startOfMonth = (d: Date): Date => {\n const result = new Date(d)\n result.setDate(1)\n result.setHours(0, 0, 0, 0)\n return result\n}\n\nexport const generateColumns = (\n minDate: Date,\n maxDate: Date,\n viewMode: GanttViewMode\n): Date[] => {\n const cols: Date[] = []\n const end = maxDate.getTime() + DAY_MS\n\n if (viewMode === 'day') {\n const d = new Date(minDate)\n d.setHours(0, 0, 0, 0)\n while (d.getTime() <= end) {\n cols.push(new Date(d))\n d.setDate(d.getDate() + 1)\n }\n } else if (viewMode === 'week') {\n const d = startOfWeek(minDate)\n while (d.getTime() <= end) {\n cols.push(new Date(d))\n d.setDate(d.getDate() + 7)\n }\n } else {\n const d = startOfMonth(minDate)\n while (d.getTime() <= end) {\n cols.push(new Date(d))\n d.setMonth(d.getMonth() + 1)\n }\n }\n return cols\n}\n\nexport const colWidth = (mode: GanttViewMode): number => {\n if (mode === 'day') return 36\n if (mode === 'week') return 80\n return 120\n}\n\nexport const colLabel = (d: Date, mode: GanttViewMode): string => {\n if (mode === 'day') return String(d.getDate())\n if (mode === 'week') return `${shortMonth(d)} ${d.getDate()}`\n return `${shortMonth(d)} ${d.getFullYear()}`\n}\n\nexport const computeCriticalPath = (tasks: GanttTask[]): Set<string> => {\n const taskMap = new Map<string, GanttTask>()\n tasks.forEach((t) => taskMap.set(t.id, t))\n\n const hasDependents = new Set<string>()\n tasks.forEach((t) => {\n if (t.dependencies !== undefined) {\n t.dependencies.forEach((depId) => hasDependents.add(depId))\n }\n })\n\n const endTasks = tasks.filter((t) => !hasDependents.has(t.id))\n const cache = new Map<string, { chain: string[]; duration: number }>()\n\n const longestChain = (\n taskId: string\n ): { chain: string[]; duration: number } => {\n const cached = cache.get(taskId)\n if (cached !== undefined) return cached\n\n const task = taskMap.get(taskId)\n if (task === undefined) {\n const empty = { chain: [], duration: 0 }\n cache.set(taskId, empty)\n return empty\n }\n\n const taskDuration = toTs(task.end) - toTs(task.start)\n\n if (task.dependencies === undefined || task.dependencies.length === 0) {\n const result = { chain: [taskId], duration: taskDuration }\n cache.set(taskId, result)\n return result\n }\n\n let bestDep = { chain: [] as string[], duration: 0 }\n task.dependencies.forEach((depId) => {\n const dep = longestChain(depId)\n if (dep.duration > bestDep.duration) {\n bestDep = dep\n }\n })\n\n const result = {\n chain: [...bestDep.chain, taskId],\n duration: taskDuration + bestDep.duration,\n }\n cache.set(taskId, result)\n return result\n }\n\n let longestPath = { chain: [] as string[], duration: 0 }\n endTasks.forEach((t) => {\n const result = longestChain(t.id)\n if (result.duration > longestPath.duration) {\n longestPath = result\n }\n })\n\n return new Set(longestPath.chain)\n}\n","// gantt-chart — interactive timeline chart with task bars, milestones, dependencies\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\nimport type {\n DragState,\n GanttChartProps,\n GanttTask,\n GroupedRow,\n TooltipState,\n} from './gantt-chart-types'\nimport {\n colLabel,\n colWidth,\n computeCriticalPath,\n DAY_MS,\n fmtDate,\n generateColumns,\n PALETTE,\n RESIZE_HANDLE_WIDTH,\n toTs,\n} from './gantt-chart-utils'\n\nexport function GanttChart({\n className,\n editable = false,\n headerHeight = 40,\n height: customHeight,\n labelWidth = 180,\n onTaskClick,\n onTaskMove,\n onTaskResize,\n rowHeight = 36,\n showCriticalPath = false,\n showDependencies = true,\n showProgress = true,\n showToday = true,\n tasks,\n viewMode = 'week',\n}: GanttChartProps) {\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(\n () => new Set()\n )\n const [tooltip, setTooltip] = useState<TooltipState>(null)\n const [drag, setDrag] = useState<DragState>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const toggleGroup = useCallback((group: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev)\n if (next.has(group)) {\n next.delete(group)\n } else {\n next.add(group)\n }\n return next\n })\n }, [])\n\n const criticalPathIds = useMemo(() => {\n if (!showCriticalPath) return new Set<string>()\n return computeCriticalPath(tasks)\n }, [tasks, showCriticalPath])\n\n // build grouped rows\n const rows = useMemo((): GroupedRow[] => {\n const result: GroupedRow[] = []\n const grouped = new Map<string, GanttTask[]>()\n const ungrouped: GanttTask[] = []\n\n tasks.forEach((task) => {\n if (task.group !== undefined) {\n const list = grouped.get(task.group)\n if (list !== undefined) {\n list.push(task)\n } else {\n grouped.set(task.group, [task])\n }\n } else {\n ungrouped.push(task)\n }\n })\n\n let idx = 0\n grouped.forEach((groupTasks, groupName) => {\n const collapsed = collapsedGroups.has(groupName)\n result.push({ collapsed, kind: 'group', label: groupName })\n if (!collapsed) {\n groupTasks.forEach((task) => {\n result.push({ index: idx++, kind: 'task', task })\n })\n }\n })\n ungrouped.forEach((task) => {\n result.push({ index: idx++, kind: 'task', task })\n })\n return result\n }, [tasks, collapsedGroups])\n\n // compute date range and columns\n const { columns, timelineStart, timelineWidth, totalWidth } = useMemo(() => {\n if (tasks.length === 0) {\n return {\n columns: [] as Date[],\n timelineStart: 0,\n timelineWidth: 0,\n totalWidth: labelWidth,\n }\n }\n let minTs = Infinity\n let maxTs = -Infinity\n tasks.forEach((t) => {\n const s = toTs(t.start)\n const e = toTs(t.end)\n if (s < minTs) minTs = s\n if (e > maxTs) maxTs = e\n })\n const padMs =\n viewMode === 'day'\n ? DAY_MS * 2\n : viewMode === 'week'\n ? DAY_MS * 7\n : DAY_MS * 30\n const minDate = new Date(minTs - padMs)\n const maxDate = new Date(maxTs + padMs)\n const cols = generateColumns(minDate, maxDate, viewMode)\n const cw = colWidth(viewMode)\n const tw = cols.length * cw\n return {\n columns: cols,\n timelineStart: cols.length > 0 ? cols[0].getTime() : 0,\n timelineWidth: tw,\n totalWidth: labelWidth + tw,\n }\n }, [tasks, viewMode, labelWidth])\n\n const timelineEnd = useMemo(() => {\n if (columns.length === 0) return 0\n const lastCol = columns[columns.length - 1]\n if (viewMode === 'day') return lastCol.getTime() + DAY_MS\n if (viewMode === 'week') return lastCol.getTime() + DAY_MS * 7\n const next = new Date(lastCol)\n next.setMonth(next.getMonth() + 1)\n return next.getTime()\n }, [columns, viewMode])\n\n const totalDuration = timelineEnd - timelineStart\n\n const pxToMs = useMemo(() => {\n if (timelineWidth <= 0) return 0\n return totalDuration / timelineWidth\n }, [totalDuration, timelineWidth])\n\n const taskX = useCallback(\n (date: Date | string): number => {\n if (totalDuration <= 0) return 0\n const ts = toTs(date)\n return ((ts - timelineStart) / totalDuration) * timelineWidth\n },\n [timelineStart, totalDuration, timelineWidth]\n )\n\n const taskPositions = useMemo(() => {\n const map = new Map<string, { w: number; x: number; y: number }>()\n let rowIdx = 0\n rows.forEach((row) => {\n if (row.kind === 'group') {\n rowIdx++\n return\n }\n const t = row.task\n const x = taskX(t.start)\n const endX = t.milestone ? x : taskX(t.end)\n const w = Math.max(endX - x, 2)\n const y = headerHeight + rowIdx * rowHeight + rowHeight / 2\n map.set(t.id, { w, x, y })\n rowIdx++\n })\n return map\n }, [rows, taskX, headerHeight, rowHeight])\n\n const todayX = useMemo(() => {\n if (!showToday) return null\n const now = new Date()\n now.setHours(12, 0, 0, 0)\n const ts = now.getTime()\n if (ts < timelineStart || ts > timelineEnd) return null\n return ((ts - timelineStart) / totalDuration) * timelineWidth\n }, [showToday, timelineStart, timelineEnd, totalDuration, timelineWidth])\n\n const chartHeight = customHeight ?? headerHeight + rows.length * rowHeight + 8\n const barHeight = Math.round(rowHeight * 0.56)\n const barOffset = Math.round((rowHeight - barHeight) / 2)\n\n // drag handlers\n const handleDragStart = useCallback(\n (taskId: string, type: 'move' | 'resize', e: React.MouseEvent) => {\n if (!editable) return\n e.preventDefault()\n e.stopPropagation()\n const task = tasks.find((t) => t.id === taskId)\n if (task === undefined) return\n setDrag({\n origEnd: new Date(task.end),\n origStart: new Date(task.start),\n startX: e.clientX,\n taskId,\n type,\n })\n setTooltip(null)\n },\n [editable, tasks]\n )\n\n const dragDelta = useRef(0)\n\n useEffect(() => {\n if (drag === null) return\n const handleMouseMove = (e: MouseEvent) => {\n dragDelta.current = e.clientX - drag.startX\n setDrag((prev) => (prev !== null ? { ...prev } : null))\n }\n const handleMouseUp = (e: MouseEvent) => {\n const deltaMs = Math.round((e.clientX - drag.startX) * pxToMs)\n if (drag.type === 'move') {\n const newStart = new Date(drag.origStart.getTime() + deltaMs)\n const newEnd = new Date(drag.origEnd.getTime() + deltaMs)\n onTaskMove?.(drag.taskId, newStart, newEnd)\n } else {\n const newEndMs = Math.max(\n drag.origStart.getTime() + DAY_MS,\n drag.origEnd.getTime() + deltaMs\n )\n onTaskResize?.(drag.taskId, new Date(newEndMs))\n }\n dragDelta.current = 0\n setDrag(null)\n }\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n window.removeEventListener('mouseup', handleMouseUp)\n }\n }, [drag, pxToMs, onTaskMove, onTaskResize])\n\n const ghostBar = useMemo(() => {\n if (drag === null) return null\n const deltaMs = Math.round(dragDelta.current * pxToMs)\n if (drag.type === 'move') {\n return {\n end: new Date(drag.origEnd.getTime() + deltaMs),\n start: new Date(drag.origStart.getTime() + deltaMs),\n taskId: drag.taskId,\n }\n }\n const newEndMs = Math.max(\n drag.origStart.getTime() + DAY_MS,\n drag.origEnd.getTime() + deltaMs\n )\n return {\n end: new Date(newEndMs),\n start: drag.origStart,\n taskId: drag.taskId,\n }\n }, [drag, pxToMs])\n\n const handleMouseEnter = useCallback(\n (task: GanttTask, e: React.MouseEvent) => {\n if (drag !== null) return\n const rect = containerRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setTooltip({\n task,\n x: e.clientX - rect.left + 12,\n y: e.clientY - rect.top - 8,\n })\n },\n [drag]\n )\n\n const handleMouseLeave = useCallback(() => {\n setTooltip(null)\n }, [])\n\n const cWidth = colWidth(viewMode)\n\n return (\n <div\n className={cx(\n 'border-border bg-bg relative overflow-hidden rounded border select-none',\n className\n )}\n data-component=\"gantt-chart\"\n ref={containerRef}\n style={{ height: chartHeight }}\n >\n {/* label column header */}\n <div\n className=\"border-border bg-surface sticky left-0 z-20 border-r border-b\"\n style={{\n height: headerHeight,\n position: 'absolute',\n top: 0,\n width: labelWidth,\n }}\n >\n <div className=\"text-fg-muted flex h-full items-center px-3 text-xs font-semibold\">\n Task\n </div>\n </div>\n\n {/* scrollable area */}\n <div className=\"overflow-x-auto\" style={{ height: chartHeight }}>\n <div\n style={{\n minHeight: chartHeight,\n position: 'relative',\n width: totalWidth,\n }}\n >\n {/* timeline header */}\n <div\n className=\"border-border bg-surface border-b\"\n style={{\n height: headerHeight,\n marginLeft: labelWidth,\n position: 'sticky',\n top: 0,\n width: timelineWidth,\n zIndex: 15,\n }}\n >\n <div className=\"relative flex h-full\">\n {columns.map((col, i) => (\n <div\n className={cx(\n 'border-border text-fg-muted flex shrink-0 items-center justify-center border-r text-[10px]',\n i % 2 === 0 ? 'bg-surface' : 'bg-bg'\n )}\n key={col.getTime()}\n style={{ height: headerHeight, width: cWidth }}\n >\n {colLabel(col, viewMode)}\n </div>\n ))}\n </div>\n </div>\n\n {/* label column */}\n <div\n className=\"border-border bg-bg sticky left-0 z-10 border-r\"\n style={{\n position: 'absolute',\n top: headerHeight,\n width: labelWidth,\n }}\n >\n {rows.map((row, i) => {\n if (row.kind === 'group') {\n return (\n <button\n className={cx(\n 'border-border bg-surface/60 text-fg flex w-full items-center gap-1.5 border-b px-3 text-xs font-semibold',\n focusCls\n )}\n key={`group-${row.label}`}\n onClick={() => toggleGroup(row.label)}\n style={{ height: rowHeight }}\n type=\"button\"\n >\n <span\n className=\"text-fg-muted text-[10px] transition-transform\"\n style={{\n transform: row.collapsed\n ? 'rotate(-90deg)'\n : 'rotate(0deg)',\n }}\n >\n ▼\n </span>\n {row.label}\n </button>\n )\n }\n return (\n <div\n className={cx(\n 'border-border text-fg flex items-center border-b px-3 text-xs',\n i % 2 === 0 ? 'bg-bg' : 'bg-surface/30'\n )}\n key={row.task.id}\n style={{ height: rowHeight }}\n >\n <span className=\"truncate\">{row.task.label}</span>\n </div>\n )\n })}\n </div>\n\n {/* timeline body */}\n <div\n style={{\n left: labelWidth,\n position: 'absolute',\n top: headerHeight,\n width: timelineWidth,\n }}\n >\n {/* grid background */}\n {rows.map((_row, i) => (\n <div\n className={cx(\n 'border-border flex border-b',\n i % 2 === 0 ? 'bg-bg' : 'bg-surface/30'\n )}\n key={`row-bg-${i}`}\n style={{ height: rowHeight }}\n >\n {columns.map((col, ci) => (\n <div\n className=\"border-border/30 shrink-0 border-r\"\n key={col.getTime()}\n style={{\n backgroundColor:\n ci % 2 === 0 ? 'transparent' : 'var(--gds-surface)',\n height: rowHeight,\n opacity: ci % 2 === 0 ? 1 : 0.15,\n width: cWidth,\n }}\n />\n ))}\n </div>\n ))}\n\n {/* svg overlay */}\n <svg\n className=\"pointer-events-none absolute top-0 left-0\"\n data-testid=\"gantt-svg\"\n height={rows.length * rowHeight}\n width={timelineWidth}\n >\n {/* dependency arrows */}\n {showDependencies &&\n rows.map((row) => {\n if (row.kind !== 'task') return null\n const t = row.task\n if (\n t.dependencies === undefined ||\n t.dependencies.length === 0\n )\n return null\n const target = taskPositions.get(t.id)\n if (target === undefined) return null\n return t.dependencies.map((depId) => {\n const source = taskPositions.get(depId)\n if (source === undefined) return null\n const sx = source.x + source.w\n const sy = source.y - headerHeight\n const tx = target.x\n const ty = target.y - headerHeight\n const midX = sx + (tx - sx) / 2\n return (\n <g\n data-dependency={`${depId}->${t.id}`}\n key={`dep-${depId}-${t.id}`}\n >\n <path\n d={`M ${sx} ${sy} C ${midX} ${sy}, ${midX} ${ty}, ${tx} ${ty}`}\n fill=\"none\"\n stroke=\"var(--gds-fg-muted)\"\n strokeOpacity={0.4}\n strokeWidth={1.5}\n />\n <polygon\n fill=\"var(--gds-fg-muted)\"\n fillOpacity={0.4}\n points={`${tx},${ty} ${tx - 5},${ty - 3} ${tx - 5},${ty + 3}`}\n />\n </g>\n )\n })\n })}\n\n {/* task bars and milestones */}\n {rows.map((row, i) => {\n if (row.kind !== 'task') return null\n const t = row.task\n const isGhost = ghostBar !== null && ghostBar.taskId === t.id\n const effectiveStart = isGhost ? ghostBar.start : t.start\n const effectiveEnd = isGhost ? ghostBar.end : t.end\n const x = taskX(effectiveStart)\n const endX = taskX(effectiveEnd)\n const y = i * rowHeight + barOffset\n const color = t.color ?? PALETTE[row.index % PALETTE.length]\n const isCritical = criticalPathIds.has(t.id)\n\n if (t.milestone) {\n const size = barHeight * 0.5\n const cy = y + barHeight / 2\n return (\n <g\n className=\"pointer-events-auto cursor-pointer\"\n data-critical-path={isCritical ? 'true' : undefined}\n data-milestone={t.id}\n key={t.id}\n onClick={() => onTaskClick?.(t)}\n onMouseEnter={(e) => handleMouseEnter(t, e)}\n onMouseLeave={handleMouseLeave}\n >\n {isCritical && (\n <rect\n fill=\"var(--gds-danger)\"\n fillOpacity={0.25}\n height={size * 2 + 4}\n rx={2}\n width={size * 2 + 4}\n x={x - size - 2}\n y={cy - size - 2}\n />\n )}\n <rect\n fill={color}\n height={size * 2}\n rx={2}\n transform={`rotate(45 ${x} ${cy})`}\n width={size * 2}\n x={x - size}\n y={cy - size}\n />\n </g>\n )\n }\n\n const w = Math.max(endX - x, 2)\n const progressW =\n showProgress && t.progress !== undefined\n ? (t.progress / 100) * w\n : 0\n const isDragging = drag !== null && drag.taskId === t.id\n\n return (\n <g\n className={cx(\n 'pointer-events-auto',\n editable ? 'cursor-grab' : 'cursor-pointer',\n isDragging && 'cursor-grabbing'\n )}\n data-critical-path={isCritical ? 'true' : undefined}\n data-task={t.id}\n key={t.id}\n onClick={() => {\n if (drag === null) onTaskClick?.(t)\n }}\n onMouseDown={(e) => handleDragStart(t.id, 'move', e)}\n onMouseEnter={(e) => handleMouseEnter(t, e)}\n onMouseLeave={handleMouseLeave}\n >\n {isCritical && (\n <rect\n data-testid={`critical-border-${t.id}`}\n fill=\"var(--gds-danger)\"\n height={barHeight}\n rx={3}\n width={3}\n x={x}\n y={y}\n />\n )}\n <rect\n fill={color}\n fillOpacity={isDragging ? 0.5 : 0.3}\n height={barHeight}\n rx={3}\n width={w}\n x={x}\n y={y}\n />\n {progressW > 0 && (\n <rect\n data-progress={t.progress}\n fill={color}\n fillOpacity={0.85}\n height={barHeight}\n rx={3}\n width={Math.min(progressW, w)}\n x={x}\n y={y}\n />\n )}\n {editable && !t.milestone && (\n <rect\n className=\"cursor-ew-resize\"\n data-resize-handle={t.id}\n fill=\"transparent\"\n height={barHeight}\n onMouseDown={(e) => {\n e.stopPropagation()\n handleDragStart(t.id, 'resize', e)\n }}\n width={RESIZE_HANDLE_WIDTH}\n x={x + w - RESIZE_HANDLE_WIDTH}\n y={y}\n />\n )}\n {t.assignee !== undefined && (\n <text\n dominantBaseline=\"middle\"\n fill=\"var(--gds-fg-muted)\"\n fontSize={9}\n x={x + w + 6}\n y={y + barHeight / 2}\n >\n {t.assignee}\n </text>\n )}\n </g>\n )\n })}\n\n {/* today line */}\n {todayX !== null && (\n <line\n data-testid=\"today-line\"\n stroke=\"var(--gds-danger)\"\n strokeDasharray=\"4,3\"\n strokeWidth={1.5}\n x1={todayX}\n x2={todayX}\n y1={0}\n y2={rows.length * rowHeight}\n />\n )}\n </svg>\n </div>\n </div>\n </div>\n\n {/* tooltip */}\n {tooltip !== null && (\n <div\n className=\"border-border bg-surface pointer-events-none absolute z-30 rounded border px-3 py-2 shadow-lg\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div className=\"text-fg text-xs font-semibold\">\n {tooltip.task.label}\n </div>\n <div className=\"text-fg-muted mt-0.5 text-[10px]\">\n {fmtDate(new Date(tooltip.task.start))} —{' '}\n {fmtDate(new Date(tooltip.task.end))}\n </div>\n {tooltip.task.progress !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-[10px]\">\n Progress: {tooltip.task.progress}%\n </div>\n )}\n {tooltip.task.assignee !== undefined && (\n <div className=\"text-fg-muted mt-0.5 text-[10px]\">\n Assignee: {tooltip.task.assignee}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype HeatmapRow = {\n label: string\n values: number[]\n}\n\ntype HeatmapTableProps = React.HTMLAttributes<HTMLTableElement> & {\n headers: string[]\n maxValue?: number\n rows: HeatmapRow[]\n}\n\nexport const HeatmapTable = forwardRef<HTMLTableElement, HeatmapTableProps>(\n function HeatmapTable({ className, headers, maxValue, rows, ...props }, ref) {\n const resolvedMax =\n maxValue ?? Math.max(1, ...rows.flatMap((r) => r.values))\n\n return (\n <table\n className={cx('w-full border-collapse text-xs', className)}\n data-component=\"heatmap-table\"\n ref={ref}\n {...props}\n >\n <thead>\n <tr>\n <th className=\"text-fg-muted p-1.5 text-left font-medium\" />\n {headers.map((h) => (\n <th\n className=\"text-fg-muted p-1.5 text-center font-medium\"\n key={h}\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"text-fg p-1.5 font-medium\">{row.label}</td>\n {row.values.map((val, i) => {\n const intensity = Math.min(val / resolvedMax, 1)\n return (\n <td\n className=\"text-fg p-1.5 text-center tabular-nums\"\n key={i}\n style={{\n backgroundColor: `color-mix(in srgb, var(--color-accent) ${Math.round(intensity * 20)}%, transparent)`,\n }}\n >\n {val}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )\n }\n)\n\nexport type { HeatmapRow, HeatmapTableProps }\n","// image-preview — lightbox image viewer with fullscreen overlay\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\nexport type ImagePreviewProps = {\n src: string\n alt?: string\n thumbnailClassName?: string\n className?: string\n}\n\nexport const ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(\n function ImagePreview({ src, alt = '', thumbnailClassName, className }, ref) {\n const [open, setOpen] = useState(false)\n\n const handleOpen = useCallback(() => setOpen(true), [])\n const handleClose = useCallback(() => setOpen(false), [])\n\n // escape key to close\n useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open, handleClose])\n\n // scroll lock when open\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [open])\n\n return (\n <div\n ref={ref}\n className={cx('inline-block', className)}\n data-component=\"image-preview\"\n >\n {/* thumbnail */}\n <button\n type=\"button\"\n onClick={handleOpen}\n className={cx('cursor-pointer border-0 bg-transparent p-0', focusCls)}\n aria-label={`Preview ${alt}`}\n >\n <img\n src={src}\n alt={alt}\n className={cx('gds-radius object-cover', thumbnailClassName)}\n data-testid=\"thumbnail\"\n />\n </button>\n\n {/* lightbox overlay */}\n {open &&\n renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\"\n onClick={(e) => {\n if (e.target === e.currentTarget) handleClose()\n }}\n data-testid=\"lightbox\"\n >\n {/* close button */}\n <button\n type=\"button\"\n onClick={handleClose}\n className={cx(\n 'absolute top-4 right-4 rounded-full bg-white/10 p-2 text-white transition-colors hover:bg-white/20',\n focusCls\n )}\n aria-label=\"Close preview\"\n >\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 <path d=\"M3 3l10 10M13 3L3 13\" />\n </svg>\n </button>\n\n {/* full image */}\n <img\n src={src}\n alt={alt}\n className=\"max-h-[90vh] max-w-[90vw] object-contain\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { LoadingDots } from '../l3-atoms/loading-dots'\nimport { cx } from '../utils/cx'\n\ntype InfiniteScrollProps = React.HTMLAttributes<HTMLDivElement> & {\n onLoadMore: () => void\n hasMore: boolean\n loading?: boolean\n threshold?: number\n loader?: ReactNode\n}\n\nexport const InfiniteScroll = forwardRef<HTMLDivElement, InfiniteScrollProps>(\n function InfiniteScroll(\n {\n children,\n className,\n hasMore,\n loader,\n loading,\n onLoadMore,\n threshold = 0.8,\n ...props\n },\n ref\n ) {\n const sentinelRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const sentinel = sentinelRef.current\n if (sentinel === null) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (\n entry !== undefined &&\n entry.isIntersecting &&\n hasMore &&\n !loading\n ) {\n onLoadMore()\n }\n },\n { threshold }\n )\n\n observer.observe(sentinel)\n return () => observer.disconnect()\n }, [hasMore, loading, onLoadMore, threshold])\n\n return (\n <div\n className={cx('relative', className)}\n data-component=\"infinite-scroll\"\n ref={ref}\n {...props}\n >\n {children}\n\n {loading === true && (\n <div className=\"flex items-center justify-center py-4\">\n {loader ?? <LoadingDots />}\n </div>\n )}\n\n <div ref={sentinelRef} data-sentinel=\"true\" className=\"h-px w-full\" />\n </div>\n )\n }\n)\n\nexport type { InfiniteScrollProps }\n","// json-node — recursive tree node for json-viewer\nimport { useCallback, useState } from 'react'\n\ntype NodeProps = {\n value: unknown\n keyName?: string\n depth: number\n defaultExpanded: boolean | number\n}\n\nfunction isExpandedAtDepth(\n defaultExpanded: boolean | number,\n depth: number\n): boolean {\n if (defaultExpanded === true) return true\n if (defaultExpanded === false) return false\n return depth < defaultExpanded\n}\n\nfunction JsonString({ value }: { value: string }) {\n return <span className=\"text-success\">\"{value}\"</span>\n}\n\nfunction JsonNumber({ value }: { value: number }) {\n return <span className=\"text-accent\">{String(value)}</span>\n}\n\nfunction JsonBoolean({ value }: { value: boolean }) {\n return <span className=\"text-[#c084fc]\">{String(value)}</span>\n}\n\nfunction JsonNull() {\n return <span className=\"text-fg-muted\">null</span>\n}\n\nexport type { NodeProps as JsonNodeProps }\n\nexport function JsonNode({\n value,\n keyName,\n depth,\n defaultExpanded,\n}: NodeProps) {\n const [expanded, setExpanded] = useState(() =>\n isExpandedAtDepth(defaultExpanded, depth)\n )\n\n const handleToggle = useCallback(() => {\n setExpanded((prev) => !prev)\n }, [])\n\n // render key prefix\n const keyPrefix =\n keyName !== undefined ? <span className=\"text-fg\">{keyName}: </span> : null\n\n // primitives\n if (value === null || value === undefined) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <JsonNull />\n </div>\n )\n }\n if (typeof value === 'string') {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <JsonString value={value} />\n </div>\n )\n }\n if (typeof value === 'number') {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <JsonNumber value={value} />\n </div>\n )\n }\n if (typeof value === 'boolean') {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <JsonBoolean value={value} />\n </div>\n )\n }\n\n // arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}[]</div>\n }\n\n if (!expanded) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"text-fg-muted hover:text-fg cursor-pointer\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n [...{value.length} items]\n </button>\n </div>\n )\n }\n\n return (\n <div>\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"text-fg-muted hover:text-fg cursor-pointer\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n [\n </button>\n </div>\n {value.map((item, idx) => (\n <JsonNode\n key={idx}\n value={item}\n depth={depth + 1}\n defaultExpanded={defaultExpanded}\n />\n ))}\n <div style={{ paddingLeft: `${depth * 16}px` }}>]</div>\n </div>\n )\n }\n\n // objects\n if (typeof value === 'object') {\n const entries = Object.entries(value)\n if (entries.length === 0) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n {'{}'}\n </div>\n )\n }\n\n if (!expanded) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"text-fg-muted hover:text-fg cursor-pointer\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n {'{'} ...{entries.length} keys {'}'}\n </button>\n </div>\n )\n }\n\n return (\n <div>\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"text-fg-muted hover:text-fg cursor-pointer\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n {'{'}\n </button>\n </div>\n {entries.map(([k, v]) => (\n <JsonNode\n key={k}\n value={v}\n keyName={k}\n depth={depth + 1}\n defaultExpanded={defaultExpanded}\n />\n ))}\n <div style={{ paddingLeft: `${depth * 16}px` }}>{'}'}</div>\n </div>\n )\n }\n\n // fallback\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n {String(value)}\n </div>\n )\n}\n","// json-viewer — interactive collapsible JSON tree viewer\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { JsonNode } from './json-node'\n\nexport type JsonViewerProps = {\n data: unknown\n defaultExpanded?: boolean | number\n glass?: boolean\n className?: string\n}\n\nexport const JsonViewer = forwardRef<HTMLDivElement, JsonViewerProps>(\n function JsonViewer({ data, defaultExpanded = 2, glass, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border gds-pad-x gds-pad-y overflow-auto border font-mono text-xs leading-5',\n glass === true && 'bg-white/5 backdrop-blur-md',\n glass !== true && 'bg-bg-secondary',\n className\n )}\n data-component=\"json-viewer\"\n >\n <JsonNode value={data} depth={0} defaultExpanded={defaultExpanded} />\n </div>\n )\n }\n)\n","// kanban — column-based board layout for items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KanbanItem = {\n id: string\n title: string\n description?: string\n tags?: string[]\n}\n\nexport type KanbanColumn = {\n id: string\n title: string\n items: KanbanItem[]\n}\n\nexport type KanbanProps = {\n columns: KanbanColumn[]\n onMoveItem?: (itemId: string, fromCol: string, toCol: string) => void\n renderItem?: (item: KanbanItem) => ReactNode\n className?: string\n}\n\nfunction KanbanTag({ label }: { label: string }) {\n return (\n <span className=\"gds-radius-badge bg-bg-tertiary gds-pad-x-sm gds-text-caption text-fg-muted inline-block py-0.5 font-medium\">\n {label}\n </span>\n )\n}\n\nexport type KanbanCardProps = {\n className?: string\n description?: string\n tags?: string[]\n title: string\n}\n\nexport function KanbanCard({\n className,\n description,\n tags,\n title,\n}: KanbanCardProps) {\n return (\n <div\n className={cx(\n 'gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y hover:border-fg-muted/30 border transition-colors',\n className\n )}\n data-component=\"kanban-card\"\n >\n <div className=\"text-fg text-sm font-medium\">{title}</div>\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-1\">{description}</p>\n )}\n {tags !== undefined && tags.length > 0 && (\n <div className=\"gds-gap-xs mt-2 flex flex-wrap\">\n {tags.map((tag) => (\n <KanbanTag key={tag} label={tag} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport type KanbanColumnComponentProps = {\n children?: ReactNode\n className?: string\n title: string\n}\n\nexport function KanbanColumnComponent({\n children,\n className,\n title,\n}: KanbanColumnComponentProps) {\n return (\n <div\n className={cx(\n 'gds-radius-popover bg-bg-secondary/50 gds-pad-x-sm gds-pad-y flex w-72 shrink-0 flex-col',\n className\n )}\n data-component=\"kanban-column\"\n >\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <h3 className=\"gds-text-body text-fg-muted font-semibold tracking-wider uppercase\">\n {title}\n </h3>\n </div>\n <div className=\"gds-gap-sm flex flex-1 flex-col overflow-y-auto\">\n {children}\n </div>\n </div>\n )\n}\n\n// internal card used by data-driven Kanban\nfunction KanbanCardInternal({ item }: { item: KanbanItem }) {\n return (\n <div className=\"gds-radius-popover border-border bg-surface gds-pad-x gds-pad-y hover:border-fg-muted/30 border transition-colors\">\n <div className=\"text-fg text-sm font-medium\">{item.title}</div>\n {item.description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-1\">{item.description}</p>\n )}\n {item.tags !== undefined && item.tags.length > 0 && (\n <div className=\"gds-gap-xs mt-2 flex flex-wrap\">\n {item.tags.map((tag) => (\n <KanbanTag key={tag} label={tag} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction KanbanColumnView({\n column,\n renderItem,\n}: {\n column: KanbanColumn\n renderItem?: (item: KanbanItem) => ReactNode\n}) {\n return (\n <div className=\"gds-radius-popover bg-bg-secondary/50 gds-pad-x-sm gds-pad-y flex w-72 shrink-0 flex-col\">\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <h3 className=\"gds-text-body text-fg-muted font-semibold tracking-wider uppercase\">\n {column.title}\n </h3>\n <span className=\"gds-text-body text-fg-muted/60\">\n {column.items.length}\n </span>\n </div>\n <div className=\"gds-gap-sm flex flex-1 flex-col overflow-y-auto\">\n {column.items.map((item) => (\n <div key={item.id}>\n {renderItem !== undefined ? (\n renderItem(item)\n ) : (\n <KanbanCardInternal item={item} />\n )}\n </div>\n ))}\n {column.items.length === 0 && (\n <div className=\"gds-text-body text-fg-muted/40 py-8 text-center\">\n No items\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport const Kanban = forwardRef<HTMLDivElement, KanbanProps>(function Kanban(\n { columns, renderItem, className },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex overflow-x-auto p-1', className)}\n data-component=\"kanban\"\n >\n {columns.map((col) => (\n <KanbanColumnView key={col.id} column={col} renderItem={renderItem} />\n ))}\n </div>\n )\n})\n","// markdown-parser — pure markdown-to-html conversion without external deps\n\nfunction sanitize(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<script[^>]*>/gi, '')\n .replace(/\\son\\w+\\s*=\\s*\"[^\"]*\"/gi, '')\n .replace(/\\son\\w+\\s*=\\s*'[^']*'/gi, '')\n .replace(/\\son\\w+\\s*=\\s*[^\\s>]*/gi, '')\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n\nfunction parseInline(text: string): string {\n let result = escapeHtml(text)\n // code (backtick) — must come before bold/italic\n result = result.replace(\n /`([^`]+)`/g,\n '<code class=\"rounded bg-bg-tertiary px-1 py-0.5 font-mono text-[0.85em]\">$1</code>'\n )\n // bold\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n // italic\n result = result.replace(/\\*([^*]+)\\*/g, '<em>$1</em>')\n // links\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-accent hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n )\n return result\n}\n\nexport function parseMarkdown(content: string): string {\n const lines = content.split('\\n')\n const output: string[] = []\n let inCodeBlock = false\n let codeLines: string[] = []\n let inList = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n\n // fenced code blocks\n if (line.trimStart().startsWith('```')) {\n if (inCodeBlock) {\n output.push(\n `<pre class=\"overflow-auto rounded-lg bg-bg-tertiary p-3 font-mono text-xs\"><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`\n )\n codeLines = []\n inCodeBlock = false\n } else {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n inCodeBlock = true\n }\n continue\n }\n\n if (inCodeBlock) {\n codeLines.push(line)\n continue\n }\n\n // horizontal rule\n if (/^---+$/.test(line.trim())) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n output.push('<hr class=\"my-3 border-border\" />')\n continue\n }\n\n // headings\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/)\n if (headingMatch !== null) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n const level = headingMatch[1].length\n const sizes = [\n 'text-xl',\n 'text-lg',\n 'text-base',\n 'text-sm',\n 'text-xs',\n 'text-xs',\n ]\n const margins = [\n 'mt-4 mb-2',\n 'mt-3 mb-2',\n 'mt-3 mb-1',\n 'mt-2 mb-1',\n 'mt-2 mb-1',\n 'mt-2 mb-1',\n ]\n output.push(\n `<h${level} class=\"font-semibold ${sizes[level - 1]} ${margins[level - 1]}\">${parseInline(headingMatch[2])}</h${level}>`\n )\n continue\n }\n\n // blockquote\n if (line.trimStart().startsWith('> ')) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n const text = line.replace(/^>\\s*/, '')\n output.push(\n `<blockquote class=\"border-l-2 border-accent/30 pl-3 text-fg-muted italic\">${parseInline(text)}</blockquote>`\n )\n continue\n }\n\n // unordered list\n const listMatch = line.match(/^(\\s*)[-*]\\s+(.+)$/)\n if (listMatch !== null) {\n if (!inList) {\n output.push('<ul class=\"list-disc pl-5 space-y-0.5\">')\n inList = true\n }\n output.push(`<li>${parseInline(listMatch[2])}</li>`)\n continue\n }\n\n // close list if non-list line\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n\n // empty line\n if (line.trim() === '') {\n continue\n }\n\n // paragraph\n output.push(`<p class=\"mb-2\">${parseInline(line)}</p>`)\n }\n\n // close dangling blocks\n if (inCodeBlock) {\n output.push(\n `<pre class=\"overflow-auto rounded-lg bg-bg-tertiary p-3 font-mono text-xs\"><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`\n )\n }\n if (inList) {\n output.push('</ul>')\n }\n\n return sanitize(output.join('\\n'))\n}\n","// markdown-preview — simple markdown renderer with DOMPurify sanitization\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { sanitizeHtml } from '../utils/sanitize'\nimport { parseMarkdown } from './markdown-parser'\n\nexport type MarkdownPreviewProps = {\n content: string\n glass?: boolean\n className?: string\n /** v2: sanitize HTML output via DOMPurify, default true */\n sanitize?: boolean\n /** v2: DOMPurify config override */\n sanitizeConfig?: Record<string, unknown>\n /** v2: enable GFM features (tables, strikethrough, task lists), default true */\n gfm?: boolean\n}\n\nexport const MarkdownPreview = forwardRef<HTMLDivElement, MarkdownPreviewProps>(\n function MarkdownPreview(\n { content, glass, className, sanitize: shouldSanitize = true },\n ref\n ) {\n const html = useMemo(() => {\n const raw = parseMarkdown(content)\n if (!shouldSanitize) return raw\n try {\n return sanitizeHtml(raw, { ADD_ATTR: ['target', 'rel'] })\n } catch {\n // DOMPurify not installed — strip all HTML tags to prevent XSS\n return raw.replace(/<[^>]*>/g, '')\n }\n }, [content, shouldSanitize])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover gds-pad-x gds-pad-y text-fg text-sm leading-relaxed',\n glass === true && 'bg-white/5 backdrop-blur-md',\n className\n )}\n data-component=\"markdown-preview\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n }\n)\n","// markdown-editor — split pane editor with live preview\nimport { forwardRef, useCallback } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { MarkdownPreview } from './markdown-preview'\n\ntype MarkdownEditorProps = {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n className?: string\n}\n\nconst MarkdownEditor = forwardRef<HTMLDivElement, MarkdownEditorProps>(\n function MarkdownEditor({ value, onChange, placeholder, className }, ref) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),\n [onChange]\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border bg-surface flex gap-px overflow-hidden rounded-lg border',\n className\n )}\n data-component=\"markdown-editor\"\n >\n <textarea\n className=\"text-fg min-h-[200px] flex-1 resize-none bg-transparent p-3 font-mono text-sm outline-none\"\n value={value}\n onChange={handleChange}\n placeholder={placeholder}\n />\n <div className=\"bg-border w-px\" />\n <div className=\"min-h-[200px] flex-1 overflow-auto\">\n <MarkdownPreview content={value} className=\"h-full\" />\n </div>\n </div>\n )\n }\n)\n\nexport { MarkdownEditor }\nexport type { MarkdownEditorProps }\n","// masonry-grid — CSS column-based masonry layout\nimport type { ReactNode } from 'react'\nimport { Children, forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MasonryGridProps = {\n children: ReactNode\n columns?: number\n gap?: number\n className?: string\n}\n\nexport const MasonryGrid = forwardRef<HTMLDivElement, MasonryGridProps>(\n function MasonryGrid({ children, columns = 3, gap = 16, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(className)}\n data-component=\"masonry-grid\"\n style={{ columnCount: columns, columnGap: `${gap}px` }}\n >\n {Children.map(children, (child) => (\n <div style={{ breakInside: 'avoid', marginBottom: `${gap}px` }}>\n {child}\n </div>\n ))}\n </div>\n )\n }\n)\n","// notification-center — notification list panel with dismiss and clear\nimport { forwardRef } from 'react'\n\nimport { Notification } from '../l4-molecules/notification'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype NotificationItem = {\n id: string\n message?: string\n timestamp?: string\n title: string\n variant?: 'danger' | 'info' | 'success' | 'warning'\n}\n\nexport type NotificationCenterProps = React.HTMLAttributes<HTMLDivElement> & {\n emptyMessage?: string\n glass?: boolean\n notifications: NotificationItem[]\n onClear?: () => void\n onClose?: (id: string) => void\n}\n\nexport const NotificationCenter = forwardRef<\n HTMLDivElement,\n NotificationCenterProps\n>(function NotificationCenter(\n {\n className,\n emptyMessage = 'No notifications',\n glass,\n notifications,\n onClear,\n onClose,\n ...props\n },\n ref\n) {\n const hasItems = notifications.length > 0\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border flex flex-col border',\n glass === true\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'bg-surface',\n className\n )}\n data-component=\"notification-center\"\n {...props}\n >\n <div className=\"border-border gds-pad-x gds-pad-y-sm flex items-center justify-between border-b\">\n <span className=\"gds-text-body text-fg font-medium select-none\">\n Notifications\n </span>\n {hasItems && onClear !== undefined && (\n <button\n type=\"button\"\n onClick={onClear}\n className={cx(\n 'gds-text-label text-accent hover:text-accent-hover',\n focusCls\n )}\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {hasItems ? (\n <div className=\"gds-gap-sm gds-pad flex flex-col\">\n {notifications.map((n) => (\n <Notification\n key={n.id}\n title={n.title}\n description={n.message}\n variant={n.variant ?? 'info'}\n onClose={\n onClose !== undefined ? () => onClose(n.id) : undefined\n }\n />\n ))}\n </div>\n ) : (\n <div className=\"gds-pad-lg flex items-center justify-center\">\n <span className=\"gds-text-label text-fg-muted\">{emptyMessage}</span>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport type { NotificationItem }\n","// notification-toast — renders stacked toasts with auto-dismiss via portal\nimport { forwardRef, useEffect } from 'react'\n\nimport { Toast } from '../l4-molecules/toast'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype ToastEntry = {\n id: string\n message?: string\n title: string\n variant?: 'danger' | 'info' | 'success' | 'warning'\n}\n\ntype NotificationToastPosition = 'bottom-right' | 'top-right'\n\ntype NotificationToastProps = {\n className?: string\n onClose: (id: string) => void\n position?: NotificationToastPosition\n toasts: ToastEntry[]\n}\n\nconst positionMap: Record<NotificationToastPosition, string> = {\n 'top-right': 'top-4 right-4',\n 'bottom-right': 'bottom-4 right-4',\n}\n\nconst variantToToast = (v?: ToastEntry['variant']) => {\n if (v === 'info') return 'default'\n return v ?? 'default'\n}\n\nexport const NotificationToast = forwardRef<\n HTMLDivElement,\n NotificationToastProps\n>(function NotificationToast(\n { toasts, onClose, position = 'top-right', className },\n ref\n) {\n useEffect(() => {\n const timers = toasts.map((t) =>\n window.setTimeout(() => onClose(t.id), 5000)\n )\n return () => timers.forEach((id) => window.clearTimeout(id))\n }, [toasts, onClose])\n\n if (toasts.length === 0) return null\n\n return renderPortal(\n <div\n ref={ref}\n className={cx(\n 'fixed z-50 flex w-80 flex-col gap-2',\n positionMap[position],\n className\n )}\n data-component=\"notification-toast\"\n >\n {toasts.map((t) => (\n <Toast\n key={t.id}\n title={t.title}\n description={t.message}\n variant={variantToToast(t.variant)}\n onClose={() => onClose(t.id)}\n />\n ))}\n </div>\n )\n})\n\nexport type { NotificationToastPosition, NotificationToastProps, ToastEntry }\n","// parallax — container where children move at different speeds on scroll\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ParallaxProps = {\n children: ReactNode\n speed?: number\n direction?: 'horizontal' | 'vertical'\n disabled?: boolean\n className?: string\n}\n\nexport const Parallax = forwardRef<HTMLDivElement, ParallaxProps>(\n function Parallax(\n {\n children,\n speed = 0.5,\n direction = 'vertical',\n disabled = false,\n className,\n },\n ref\n ) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [offset, setOffset] = useState(0)\n const rafRef = useRef<number>(0)\n\n const handleScroll = useCallback(() => {\n if (rafRef.current !== 0) return\n rafRef.current = requestAnimationFrame(() => {\n const el = innerRef.current\n if (el !== null) {\n const rect = el.getBoundingClientRect()\n const scrollOffset =\n direction === 'vertical' ? -rect.top * speed : -rect.left * speed\n setOffset(scrollOffset)\n }\n rafRef.current = 0\n })\n }, [speed, direction])\n\n useEffect(() => {\n if (disabled) return\n window.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll()\n return () => {\n window.removeEventListener('scroll', handleScroll)\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current)\n }\n }\n }, [disabled, handleScroll])\n\n // check prefers-reduced-motion\n const prefersReducedMotion = useRef(false)\n useEffect(() => {\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)')\n prefersReducedMotion.current = mq.matches\n }, [])\n\n const shouldDisable = disabled || prefersReducedMotion.current\n\n const transform = shouldDisable\n ? undefined\n : direction === 'vertical'\n ? `translateY(${offset}px)`\n : `translateX(${offset}px)`\n\n return (\n <div\n ref={(node) => {\n innerRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref !== null && ref !== undefined) {\n ;(ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node\n }\n }}\n className={cx('will-change-transform', className)}\n style={transform !== undefined ? { transform } : undefined}\n data-component=\"parallax\"\n >\n {children}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PayslipDeduction = { label: string; amount: number }\n\ntype PayslipCardProps = React.HTMLAttributes<HTMLDivElement> & {\n currency?: string\n deductions: PayslipDeduction[]\n gross: number\n net: number\n period: string\n}\n\nexport const PayslipCard = forwardRef<HTMLDivElement, PayslipCardProps>(\n function PayslipCard(\n {\n className,\n currency = '\\u00a5',\n deductions,\n gross,\n net,\n period,\n ...props\n },\n ref\n ) {\n const fmt = (n: number) => `${currency}${n.toLocaleString()}`\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-card border-border bg-surface gds-pad border',\n className\n )}\n data-component=\"payslip-card\"\n ref={ref}\n {...props}\n >\n <div className=\"text-fg mb-3 font-semibold\">{period}</div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-fg-muted\">Gross</span>\n <span className=\"text-fg\">{fmt(gross)}</span>\n </div>\n {deductions.map((d) => (\n <div key={d.label} className=\"flex justify-between text-sm\">\n <span className=\"text-fg-muted\">{d.label}</span>\n <span className=\"text-danger\">-{fmt(d.amount)}</span>\n </div>\n ))}\n <div className=\"border-border my-2 border-t\" />\n <div className=\"flex justify-between font-bold\">\n <span className=\"text-fg\">Net Pay</span>\n <span className=\"text-fg\">{fmt(net)}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { PayslipCardProps, PayslipDeduction }\n","// permission-matrix — role/permission grid with checkbox intersections\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PermissionMatrixProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n roles: string[]\n permissions: string[]\n values: boolean[][]\n onChange?: (perm: number, role: number, value: boolean) => void\n readonly?: boolean\n}\n\nconst PermissionMatrix = forwardRef<HTMLDivElement, PermissionMatrixProps>(\n function PermissionMatrix(\n { roles, permissions, values, onChange, readonly, className, ...props },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx('overflow-auto', className)}\n data-component=\"permission-matrix\"\n {...props}\n >\n <table className=\"gds-text-body w-full border-collapse\">\n <thead>\n <tr>\n <th className=\"border-border bg-bg-secondary text-fg-muted border px-3 py-2 text-left font-medium select-none\">\n Permission\n </th>\n {roles.map((role) => (\n <th\n key={role}\n className=\"border-border bg-bg-secondary text-fg-muted border px-3 py-2 text-center font-medium select-none\"\n >\n {role}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {permissions.map((perm, pi) => (\n <tr key={perm}>\n <td className=\"border-border text-fg border px-3 py-2 select-none\">\n {perm}\n </td>\n {roles.map((_, ri) => {\n const checked = values[pi]?.[ri] ?? false\n return (\n <td\n key={ri}\n className=\"border-border border px-3 py-2 text-center\"\n >\n {readonly === true ? (\n <span\n className={checked ? 'text-success' : 'text-fg-muted'}\n >\n {checked ? '✓' : '—'}\n </span>\n ) : (\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange?.(pi, ri, e.target.checked)}\n className=\"accent-accent cursor-pointer\"\n aria-label={`${perm} - ${roles[ri]}`}\n />\n )}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n\nexport { PermissionMatrix }\nexport type { PermissionMatrixProps }\n","// progress-timeline — horizontal milestone tracker with progress line\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type Milestone = {\n label: string\n date: string\n completed: boolean\n}\n\nexport type ProgressTimelineProps = {\n milestones: Milestone[]\n className?: string\n}\n\nexport const ProgressTimeline = forwardRef<\n HTMLDivElement,\n ProgressTimelineProps\n>(function ProgressTimeline({ milestones, className }, ref) {\n const lastCompletedIdx = milestones.reduce(\n (acc, m, i) => (m.completed ? i : acc),\n -1\n )\n\n return (\n <div\n ref={ref}\n className={cx('select-none', className)}\n data-component=\"progress-timeline\"\n >\n <div className=\"relative flex items-start justify-between\">\n {/* background line */}\n <div className=\"bg-border absolute top-3 right-4 left-4 h-0.5\" />\n\n {/* progress line */}\n {lastCompletedIdx >= 0 && milestones.length > 1 && (\n <div\n className=\"bg-accent absolute top-3 left-4 h-0.5\"\n style={{\n width: `${(lastCompletedIdx / (milestones.length - 1)) * 100}%`,\n }}\n />\n )}\n\n {milestones.map((milestone, i) => (\n <div\n key={`${milestone.label}-${i}`}\n className=\"relative z-10 flex flex-col items-center gap-1\"\n >\n {/* circle */}\n <div\n className={cx(\n 'h-6 w-6 rounded-full border-2 transition-colors',\n milestone.completed\n ? 'border-accent bg-accent'\n : 'border-border bg-bg'\n )}\n data-completed={milestone.completed}\n />\n {/* label */}\n <span className=\"text-fg text-xs font-medium\">\n {milestone.label}\n </span>\n {/* date */}\n <span className=\"gds-text-body text-fg-muted\">\n {milestone.date}\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n})\n","// property-editor — key-value property editor with inline editing\nimport { forwardRef } from 'react'\n\nimport { InlineEdit } from '../l4-molecules/inline-edit'\nimport { cx } from '../utils/cx'\n\ntype PropertyItem = {\n editable?: boolean\n key: string\n value: string\n}\n\ntype PropertyEditorProps = {\n className?: string\n onChange?: (key: string, value: string) => void\n properties: PropertyItem[]\n}\n\nexport const PropertyEditor = forwardRef<HTMLDivElement, PropertyEditorProps>(\n function PropertyEditor({ className, onChange, properties }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover border-border overflow-hidden border',\n className\n )}\n data-component=\"property-editor\"\n >\n {properties.map((prop, i) => (\n <div\n key={prop.key}\n className={cx(\n 'gds-pad-x gds-pad-y-sm flex items-center justify-between',\n i < properties.length - 1 && 'border-border border-b'\n )}\n >\n <span className=\"gds-text-body text-fg-muted font-medium\">\n {prop.key}\n </span>\n <div className=\"text-right\">\n {prop.editable === true && onChange !== undefined ? (\n <InlineEdit\n onSave={(v) => onChange(prop.key, v)}\n value={prop.value}\n />\n ) : (\n <span className=\"gds-text-body text-fg\">{prop.value}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { PropertyEditorProps, PropertyItem }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype QuickLink = {\n href?: string\n icon?: ReactNode\n label: string\n onClick?: () => void\n}\n\ntype QuickLinksProps = React.HTMLAttributes<HTMLDivElement> & {\n columns?: number\n links: QuickLink[]\n}\n\nexport const QuickLinks = forwardRef<HTMLDivElement, QuickLinksProps>(\n function QuickLinks({ className, columns = 4, links, ...props }, ref) {\n return (\n <div\n className={cx('grid gap-3', className)}\n data-component=\"quick-links\"\n ref={ref}\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n {...props}\n >\n {links.map((link) => {\n const Tag = link.href !== undefined ? 'a' : 'button'\n return (\n <Tag\n key={link.label}\n className={cx(\n 'border-border bg-surface text-fg hover:bg-bg-secondary flex flex-col items-center gap-2 rounded-lg border p-4 transition-colors',\n focusCls\n )}\n {...(link.href !== undefined ? { href: link.href } : {})}\n onClick={link.onClick}\n >\n {link.icon !== undefined && (\n <div className=\"text-fg-muted\">{link.icon}</div>\n )}\n <span className=\"text-xs font-medium select-none\">\n {link.label}\n </span>\n </Tag>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { QuickLink, QuickLinksProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RecentActivityItem = {\n action: string\n timestamp: string\n user: string\n}\n\ntype RecentActivityProps = React.HTMLAttributes<HTMLDivElement> & {\n items: RecentActivityItem[]\n title?: string\n}\n\nconst RecentActivity = forwardRef<HTMLDivElement, RecentActivityProps>(\n function RecentActivity(\n { className, items, title = 'Recent Activity', ...props },\n ref\n ) {\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"recent-activity\"\n ref={ref}\n {...props}\n >\n <h3 className=\"text-fg-muted mb-2 text-xs font-semibold tracking-wider uppercase\">\n {title}\n </h3>\n <div className=\"flex flex-col gap-1\">\n {items.map((item, i) => (\n <div\n className=\"flex items-baseline justify-between gap-2 py-1 text-sm\"\n key={i}\n >\n <div className=\"min-w-0 truncate\">\n <span className=\"text-fg font-medium\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n </div>\n <span className=\"text-fg-muted shrink-0 text-xs\">\n {item.timestamp}\n </span>\n </div>\n ))}\n {items.length === 0 && (\n <p className=\"text-fg-muted py-2 text-center text-xs\">\n No activity\n </p>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport { RecentActivity }\nexport type { RecentActivityItem, RecentActivityProps }\n","// responsive-stack — column-to-row layout that switches at a breakpoint\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ResponsiveStackProps = {\n children: ReactNode\n breakpoint?: 'sm' | 'md' | 'lg'\n gap?: 'sm' | 'default' | 'lg'\n align?: 'start' | 'center' | 'end' | 'stretch'\n className?: string\n}\n\nconst breakpointMap = {\n sm: 'sm:flex-row',\n md: 'md:flex-row',\n lg: 'lg:flex-row',\n} as const\n\nconst gapMap = {\n sm: 'gap-2',\n default: 'gap-4',\n lg: 'gap-6',\n} as const\n\nconst alignMap = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n} as const\n\nexport const ResponsiveStack = forwardRef<HTMLDivElement, ResponsiveStackProps>(\n function ResponsiveStack(\n {\n children,\n breakpoint = 'md',\n gap = 'default',\n align = 'stretch',\n className,\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col',\n breakpointMap[breakpoint],\n gapMap[gap],\n alignMap[align],\n className\n )}\n data-component=\"responsive-stack\"\n >\n {children}\n </div>\n )\n }\n)\n","// table — lightweight styled table wrapper\n// for when DataTable is overkill — just semantic HTML table elements with styling\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type TableProps = React.HTMLAttributes<HTMLTableElement> & {\n striped?: boolean\n compact?: boolean\n hoverable?: boolean\n glass?: boolean\n className?: string\n}\n\n// semantic sub-components for manual table composition\n\nexport const Thead = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(function Thead({ className, ...props }, ref) {\n return <thead ref={ref} className={className} {...props} />\n})\n\nexport const Tbody = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(function Tbody({ className, ...props }, ref) {\n return <tbody ref={ref} className={className} {...props} />\n})\n\nexport const Tfoot = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(function Tfoot({ className, ...props }, ref) {\n return (\n <tfoot\n ref={ref}\n className={cx('bg-bg-secondary font-semibold', className)}\n {...props}\n />\n )\n})\n\nexport const Tr = forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(function Tr({ className, ...props }, ref) {\n return (\n <tr ref={ref} className={cx('transition-colors', className)} {...props} />\n )\n})\n\nexport const Th = forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(function Th({ className, ...props }, ref) {\n return (\n <th\n ref={ref}\n className={cx(\n 'border-border bg-bg-secondary text-fg-muted border px-2.5 py-1.5 text-left text-xs font-semibold tracking-wide whitespace-nowrap',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const Td = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(function Td({ className, ...props }, ref) {\n return (\n <td\n ref={ref}\n className={cx(\n 'border-border/60 text-fg border px-2.5 py-1.5 text-xs whitespace-nowrap',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const ThNum = forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(function ThNum({ className, ...props }, ref) {\n return (\n <th\n ref={ref}\n className={cx(\n 'border-border bg-bg-secondary text-fg-muted border px-2.5 py-1.5 text-right text-xs font-semibold tracking-wide whitespace-nowrap',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const TdNum = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(function TdNum({ className, ...props }, ref) {\n return (\n <td\n ref={ref}\n className={cx(\n 'border-border/60 text-fg border px-2.5 py-1.5 text-right text-xs whitespace-nowrap tabular-nums',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const TdMuted = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(function TdMuted({ className, ...props }, ref) {\n return (\n <td\n ref={ref}\n className={cx(\n 'border-border/60 text-fg-muted border px-2.5 py-1.5 text-xs whitespace-nowrap',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const TdFoot = forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(function TdFoot({ className, ...props }, ref) {\n return (\n <td\n ref={ref}\n className={cx(\n 'border-border bg-bg-secondary text-fg border px-2.5 py-1.5 text-xs font-semibold whitespace-nowrap',\n className\n )}\n {...props}\n />\n )\n})\n\nexport const TableCaption = forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n ref={ref}\n className={cx('text-fg-muted mt-2 text-xs', className)}\n {...props}\n />\n )\n})\n\nexport const TableFooter = forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(function TableFooter({ className, ...props }, ref) {\n return (\n <tfoot\n ref={ref}\n className={cx('bg-bg-secondary font-semibold', className)}\n {...props}\n />\n )\n})\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n { striped, compact, hoverable = true, glass, className, children, ...props },\n ref\n) {\n return (\n <div\n data-component=\"table\"\n data-striped={striped ?? undefined}\n data-compact={compact ?? undefined}\n className={cx(\n 'gds-radius-popover border-border overflow-hidden border',\n glassClass(glass),\n striped && '[&_tbody_tr:nth-child(even)]:bg-bg-secondary/30',\n compact && '[&_td]:px-2 [&_td]:py-1 [&_th]:px-2 [&_th]:py-1',\n !compact &&\n '[&_th]:gds-pad-x [&_td]:gds-pad-x [&_td]:gds-pad-y [&_th]:py-1.5',\n hoverable &&\n '[&_tbody_tr:hover]:bg-bg-tertiary/30 [&_tbody_tr]:transition-colors',\n '[&_th]:bg-bg-tertiary/50 [&_th]:text-fg-muted [&_th]:border-border [&_th]:gds-text-body [&_th]:border-b [&_th]:text-left [&_th]:font-medium',\n '[&_td]:border-border [&_td]:gds-text-body [&_tbody_tr:last-child_td]:border-0 [&_td]:border-b',\n className\n )}\n >\n <table ref={ref} className=\"w-full\" {...props}>\n {children}\n </table>\n </div>\n )\n})\n","import { forwardRef, useSyncExternalStore } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { Table } from './table'\n\ntype ResponsiveTableColumn = { key: string; header: string }\n\ntype ResponsiveTableProps = React.HTMLAttributes<HTMLDivElement> & {\n columns: ResponsiveTableColumn[]\n data: Record<string, unknown>[]\n glass?: boolean\n className?: string\n}\n\n// simple media query hook without useEffect\nconst mobileQuery =\n typeof window !== 'undefined'\n ? window.matchMedia('(max-width: 1023px)')\n : null\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener('change', cb)\n return () => mobileQuery?.removeEventListener('change', cb)\n}\n\nfunction getIsMobile() {\n return mobileQuery?.matches ?? false\n}\n\nexport const ResponsiveTable = forwardRef<HTMLDivElement, ResponsiveTableProps>(\n function ResponsiveTable({ columns, data, glass, className, ...props }, ref) {\n const isMobile = useSyncExternalStore(\n subscribeMobile,\n getIsMobile,\n () => false\n )\n\n if (isMobile) {\n return (\n <div\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"responsive-table\"\n data-mode=\"cards\"\n ref={ref}\n {...props}\n >\n {data.map((row, i) => (\n <div\n key={i}\n className={cx(\n 'gds-radius-popover border-border gds-pad border',\n glassClass(glass)\n )}\n >\n {columns.map((col) => (\n <div\n key={col.key}\n className=\"gds-pad-y-sm flex justify-between\"\n >\n <span className=\"gds-text-caption text-fg-muted font-medium\">\n {col.header}\n </span>\n <span className=\"gds-text-body text-fg\">\n {String(row[col.key] ?? '')}\n </span>\n </div>\n ))}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-component=\"responsive-table\"\n data-mode=\"table\"\n ref={ref}\n {...props}\n >\n <Table glass={glass} className={className}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key}>{col.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, i) => (\n <tr key={i}>\n {columns.map((col) => (\n <td key={col.key}>{String(row[col.key] ?? '')}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </Table>\n </div>\n )\n }\n)\n\nexport type { ResponsiveTableColumn, ResponsiveTableProps }\n","// rich-select-list — option list dropdown for rich-select\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { RichSelectOption } from './rich-select'\n\ntype RichSelectListProps = {\n options: RichSelectOption[]\n value: string | null\n focusedIndex: number\n glass?: boolean\n onSelect: (value: string) => void\n onFocus: (index: number) => void\n}\n\nexport type { RichSelectListProps }\n\nexport function RichSelectList({\n options,\n value,\n focusedIndex,\n glass,\n onSelect,\n onFocus,\n}: RichSelectListProps) {\n return (\n <div\n role=\"listbox\"\n className={cx(\n 'gds-radius-popover border-border bg-bg absolute z-50 mt-1 max-h-60 w-full overflow-auto border shadow-lg',\n glassClass(glass)\n )}\n >\n {options.map((opt, i) => (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n data-focused={i === focusedIndex ? '' : undefined}\n className={cx(\n 'flex cursor-pointer items-start gap-2 px-3 py-2 transition-colors',\n opt.value === value && 'bg-accent/10 text-accent',\n i === focusedIndex && 'bg-bg-tertiary/50',\n opt.value !== value &&\n i !== focusedIndex &&\n 'hover:bg-bg-tertiary/30'\n )}\n onClick={() => onSelect(opt.value)}\n onMouseEnter={() => onFocus(i)}\n >\n {opt.icon !== undefined && (\n <span className=\"mt-0.5 shrink-0\">{opt.icon}</span>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{opt.label}</div>\n {opt.description !== undefined && (\n <div className=\"text-fg-muted truncate text-xs\">\n {opt.description}\n </div>\n )}\n </div>\n {opt.badge !== undefined && (\n <span className=\"bg-bg-tertiary text-fg-muted shrink-0 rounded-full px-2 py-0.5 text-[10px]\">\n {opt.badge}\n </span>\n )}\n </div>\n ))}\n </div>\n )\n}\n","// rich-select — dropdown with icons, descriptions, and badges per option\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { RichSelectList } from './rich-select-list'\n\nexport type RichSelectOption = {\n value: string\n label: string\n description?: string\n icon?: React.ReactNode\n badge?: string\n}\n\nexport type RichSelectProps = {\n options: RichSelectOption[]\n value: string | null\n onChange: (value: string | null) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const RichSelect = forwardRef<HTMLDivElement, RichSelectProps>(\n function RichSelect(\n {\n options,\n value,\n onChange,\n placeholder,\n disabled,\n error,\n glass,\n className,\n },\n ref\n ) {\n const [open, setOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const selected = options.find((o) => o.value === value)\n\n // close on outside click\n useEffect(() => {\n if (!open) return\n function handleClick(e: MouseEvent) {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return\n\n if (e.key === 'Escape') {\n setOpen(false)\n return\n }\n\n if (!open) {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n setOpen(true)\n setFocusedIndex(0)\n }\n return\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setFocusedIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1))\n } else if (e.key === 'Enter') {\n e.preventDefault()\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n onChange(options[focusedIndex].value)\n setOpen(false)\n }\n }\n },\n [disabled, open, options, focusedIndex, onChange]\n )\n\n const handleSelect = useCallback(\n (val: string) => {\n onChange(val)\n setOpen(false)\n },\n [onChange]\n )\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n data-component=\"rich-select\"\n data-state={open ? 'open' : 'closed'}\n className={cx('relative', className)}\n onKeyDown={handleKeyDown}\n >\n <button\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'gds-radius-input gds-pad-x gds-h-lg flex w-full items-center gap-2 border text-left text-sm transition-colors',\n error ? 'border-danger' : 'border-border hover:border-fg-muted',\n disabled && 'cursor-not-allowed opacity-50',\n glassClass(glass),\n focusCls\n )}\n onClick={() => setOpen((p) => !p)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n >\n {selected !== undefined ? (\n <>\n {selected.icon !== undefined && (\n <span className=\"shrink-0\">{selected.icon}</span>\n )}\n <span className=\"text-fg flex-1 truncate\">{selected.label}</span>\n </>\n ) : (\n <span className=\"text-fg-muted flex-1 truncate\">\n {placeholder ?? 'Select...'}\n </span>\n )}\n <svg\n className=\"text-fg-muted ml-auto h-3 w-3 shrink-0\"\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 </button>\n\n {open && (\n <RichSelectList\n options={options}\n value={value}\n focusedIndex={focusedIndex}\n glass={glass}\n onSelect={handleSelect}\n onFocus={setFocusedIndex}\n />\n )}\n </div>\n )\n }\n)\n","// search-results — list of search results with query highlighting and category badges\nimport { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { Highlight } from '../l2-primitives/highlight'\nimport { cx } from '../utils/cx'\n\ntype SearchResult = {\n id: string\n title: string\n description?: string\n category?: string\n url?: string\n}\n\ntype SearchResultsProps = {\n results: SearchResult[]\n query: string\n total?: number\n onSelect?: (id: string) => void\n className?: string\n}\n\nconst SearchResults = forwardRef<HTMLDivElement, SearchResultsProps>(\n function SearchResults({ results, query, total, onSelect, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col', className)}\n data-component=\"search-results\"\n >\n {total !== undefined && (\n <div className=\"gds-pad-x text-fg-muted py-2 text-xs\">\n {total} result{total !== 1 ? 's' : ''} found\n </div>\n )}\n {results.map((result) => (\n <div\n key={result.id}\n role={onSelect !== undefined ? 'button' : undefined}\n tabIndex={onSelect !== undefined ? 0 : undefined}\n onClick={\n onSelect !== undefined ? () => onSelect(result.id) : undefined\n }\n onKeyDown={\n onSelect !== undefined\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect(result.id)\n }\n }\n : undefined\n }\n className={cx(\n 'gds-pad-x gds-pad-y border-border border-b last:border-b-0',\n onSelect !== undefined &&\n 'hover:bg-bg-tertiary cursor-pointer transition-colors'\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Highlight\n text={result.title}\n query={query}\n className=\"text-fg gds-text-body font-medium\"\n />\n {result.category !== undefined && (\n <Badge>{result.category}</Badge>\n )}\n </div>\n {result.description !== undefined && (\n <Highlight\n text={result.description}\n query={query}\n className=\"text-fg-muted gds-text-caption mt-0.5 line-clamp-2\"\n />\n )}\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport { SearchResults }\nexport type { SearchResult, SearchResultsProps }\n","// service-card — service/server status card with health, metrics, and tags\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ServiceCardStatus = 'error' | 'healthy' | 'offline' | 'warning'\n\nexport type ServiceCardProps = {\n name: string\n description?: string\n status: ServiceCardStatus\n metrics?: { label: string; value: string }[]\n tags?: string[]\n url?: string\n className?: string\n}\n\nconst statusDot: Record<ServiceCardStatus, string> = {\n healthy: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-danger',\n offline: 'bg-fg-muted/40',\n}\n\nconst statusLabel: Record<ServiceCardStatus, string> = {\n healthy: 'Healthy',\n warning: 'Warning',\n error: 'Error',\n offline: 'Offline',\n}\n\nexport const ServiceCard = forwardRef<HTMLDivElement, ServiceCardProps>(\n function ServiceCard(\n { name, description, status, metrics, tags, url, className },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-ctx gds-radius-card border-border bg-surface gds-pad border',\n className\n )}\n data-component=\"service-card\"\n data-state={status}\n >\n {/* header */}\n <div className=\"flex items-center gap-2\">\n <span className={cx('h-2.5 w-2.5 rounded-full', statusDot[status])} />\n <span className=\"text-fg font-semibold\">{name}</span>\n <span className=\"text-fg-muted ml-auto text-xs\">\n {statusLabel[status]}\n </span>\n </div>\n\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-1.5\">{description}</p>\n )}\n\n {/* metrics */}\n {metrics !== undefined && metrics.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n {metrics.map((m) => (\n <div key={m.label} className=\"flex gap-1\">\n <span className=\"text-fg-muted\">{m.label}</span>\n <span className=\"text-fg font-medium\">{m.value}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* tags + url */}\n {(tags !== undefined || url !== undefined) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-1.5\">\n {tags?.map((tag) => (\n <span\n key={tag}\n className=\"bg-bg-tertiary text-fg-muted rounded-full px-2 py-0.5 text-[10px]\"\n >\n {tag}\n </span>\n ))}\n {url !== undefined && (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-accent ml-auto text-xs hover:underline\"\n >\n {url}\n </a>\n )}\n </div>\n )}\n </div>\n )\n }\n)\n","// signature-drawing — pure canvas drawing utilities (no React dependency)\n\ntype Point = { x: number; y: number }\n\ntype DrawConfig = {\n strokeColor: string\n strokeWidth: number\n}\n\nfunction getCanvasPosition(\n canvas: HTMLCanvasElement,\n clientX: number,\n clientY: number\n): Point {\n const rect = canvas.getBoundingClientRect()\n return {\n x: (clientX - rect.left) * (canvas.width / rect.width),\n y: (clientY - rect.top) * (canvas.height / rect.height),\n }\n}\n\nfunction beginStroke(\n ctx: CanvasRenderingContext2D,\n point: Point,\n config: DrawConfig\n): void {\n ctx.strokeStyle = config.strokeColor\n ctx.lineWidth = config.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.beginPath()\n ctx.moveTo(point.x, point.y)\n}\n\nfunction continueStroke(ctx: CanvasRenderingContext2D, point: Point): void {\n ctx.lineTo(point.x, point.y)\n ctx.stroke()\n}\n\nfunction clearCanvas(canvas: HTMLCanvasElement): void {\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n}\n\nfunction canvasToDataUrl(canvas: HTMLCanvasElement): string {\n return canvas.toDataURL('image/png')\n}\n\nexport {\n beginStroke,\n canvasToDataUrl,\n clearCanvas,\n continueStroke,\n getCanvasPosition,\n}\nexport type { DrawConfig, Point }\n","// signature-pad — canvas-based signature capture\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport {\n beginStroke,\n canvasToDataUrl,\n clearCanvas,\n continueStroke,\n getCanvasPosition,\n} from './signature-drawing'\n\ntype SignaturePadProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> & {\n disabled?: boolean\n height?: number\n onSign: (dataUrl: string) => void\n strokeColor?: string\n strokeWidth?: number\n width?: number\n}\n\nexport const SignaturePad = forwardRef<HTMLDivElement, SignaturePadProps>(\n function SignaturePad(\n {\n className,\n disabled,\n height = 200,\n onSign,\n strokeColor = 'var(--gds-fg)',\n strokeWidth = 2,\n width = 400,\n ...props\n },\n ref\n ) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const isDrawingRef = useRef(false)\n const [isEmpty, setIsEmpty] = useState(true)\n\n const startDraw = useCallback(\n (clientX: number, clientY: number) => {\n if (disabled === true) return\n const canvas = canvasRef.current\n if (canvas === null) return\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n isDrawingRef.current = true\n const pos = getCanvasPosition(canvas, clientX, clientY)\n beginStroke(ctx, pos, { strokeColor, strokeWidth })\n },\n [disabled, strokeColor, strokeWidth]\n )\n\n const draw = useCallback((clientX: number, clientY: number) => {\n if (!isDrawingRef.current) return\n const canvas = canvasRef.current\n if (canvas === null) return\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n const pos = getCanvasPosition(canvas, clientX, clientY)\n continueStroke(ctx, pos)\n setIsEmpty(false)\n }, [])\n\n const endDraw = useCallback(() => {\n if (!isDrawingRef.current) return\n isDrawingRef.current = false\n const canvas = canvasRef.current\n if (canvas !== null) {\n onSign(canvasToDataUrl(canvas))\n }\n }, [onSign])\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n startDraw(e.clientX, e.clientY)\n },\n [startDraw]\n )\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n draw(e.clientX, e.clientY)\n },\n [draw]\n )\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n const touch = e.touches[0]\n if (touch === undefined) return\n startDraw(touch.clientX, touch.clientY)\n },\n [startDraw]\n )\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n const touch = e.touches[0]\n if (touch === undefined) return\n draw(touch.clientX, touch.clientY)\n },\n [draw]\n )\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n endDraw()\n },\n [endDraw]\n )\n\n const handleClear = useCallback(() => {\n const canvas = canvasRef.current\n if (canvas === null) return\n clearCanvas(canvas)\n setIsEmpty(true)\n }, [])\n\n return (\n <div\n className={cx(\n 'gds-ctx gds-radius-popover border-border bg-surface inline-flex flex-col gap-2 border p-3',\n disabled === true && 'pointer-events-none opacity-40',\n className\n )}\n data-component=\"signature-pad\"\n ref={ref}\n {...props}\n >\n <div className=\"relative\">\n <canvas\n className=\"border-border/50 bg-bg block cursor-crosshair rounded border\"\n height={height}\n onMouseDown={handleMouseDown}\n onMouseLeave={endDraw}\n onMouseMove={handleMouseMove}\n onMouseUp={endDraw}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onTouchStart={handleTouchStart}\n ref={canvasRef}\n style={{ width, height }}\n width={width}\n />\n {isEmpty && (\n <div className=\"pointer-events-none absolute inset-0 flex items-end justify-center pb-4\">\n <span className=\"text-fg-muted/50 text-xs select-none\">\n Sign above\n </span>\n </div>\n )}\n </div>\n <div className=\"flex justify-end\">\n <button\n className={cx(\n 'text-fg-muted hover:bg-fg-muted/10 hover:text-fg rounded px-2.5 py-1 text-xs transition-colors',\n focusCls\n )}\n onClick={handleClear}\n type=\"button\"\n >\n Clear\n </button>\n </div>\n </div>\n )\n }\n)\n\nexport type { SignaturePadProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SortableItem = {\n id: string\n content: ReactNode\n}\n\ntype SortableListProps = React.HTMLAttributes<HTMLDivElement> & {\n items: SortableItem[]\n onReorder: (items: SortableItem[]) => void\n disabled?: boolean\n itemClassName?: string\n}\n\n// grip icon inline svg\nfunction GripIcon() {\n return (\n <svg\n className=\"text-fg-muted/50 h-4 w-4\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <circle cx=\"5\" cy=\"3\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"3\" r=\"1.2\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.2\" />\n <circle cx=\"5\" cy=\"13\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"13\" r=\"1.2\" />\n </svg>\n )\n}\n\nexport const SortableList = forwardRef<HTMLDivElement, SortableListProps>(\n function SortableList(\n { className, disabled, itemClassName, items, onReorder, ...props },\n ref\n ) {\n const [dragIndex, setDragIndex] = useState<number | null>(null)\n const [dropIndex, setDropIndex] = useState<number | null>(null)\n\n function handleDragStart(index: number) {\n if (disabled) return\n setDragIndex(index)\n }\n\n function handleDragOver(e: React.DragEvent, index: number) {\n e.preventDefault()\n setDropIndex(index)\n }\n\n function handleDragLeave() {\n setDropIndex(null)\n }\n\n function handleDrop(e: React.DragEvent, targetIndex: number) {\n e.preventDefault()\n if (dragIndex === null || dragIndex === targetIndex) {\n setDragIndex(null)\n setDropIndex(null)\n return\n }\n\n const reordered = [...items]\n const [moved] = reordered.splice(dragIndex, 1)\n if (moved !== undefined) {\n reordered.splice(targetIndex, 0, moved)\n }\n onReorder(reordered)\n setDragIndex(null)\n setDropIndex(null)\n }\n\n function handleDragEnd() {\n setDragIndex(null)\n setDropIndex(null)\n }\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"sortable-list\"\n ref={ref}\n {...props}\n >\n {items.map((item, index) => (\n <div\n className={cx(\n 'gds-gap border-border flex items-center border-b px-2 py-2 transition-opacity',\n dragIndex === index && 'opacity-50',\n dropIndex === index && 'border-t-accent border-t-2',\n disabled !== true && 'cursor-grab active:cursor-grabbing',\n disabled === true && 'pointer-events-none opacity-60',\n itemClassName\n )}\n data-item-id={item.id}\n draggable={disabled !== true}\n key={item.id}\n onDragEnd={handleDragEnd}\n onDragLeave={handleDragLeave}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragStart={() => handleDragStart(index)}\n onDrop={(e) => handleDrop(e, index)}\n >\n {disabled !== true && (\n <span className=\"flex-shrink-0 select-none\">\n <GripIcon />\n </span>\n )}\n <div className=\"flex-1\">{item.content}</div>\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { SortableItem, SortableListProps }\n","// sortable-table — table with client-side column sorting\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SortableColumn = {\n key: string\n header: string\n sortable?: boolean\n}\n\ntype SortState = {\n key: string\n dir: 'asc' | 'desc'\n}\n\ntype SortableTableProps = React.HTMLAttributes<HTMLDivElement> & {\n columns: SortableColumn[]\n data: Record<string, unknown>[]\n defaultSort?: SortState\n}\n\nexport const SortableTable = forwardRef<HTMLDivElement, SortableTableProps>(\n function SortableTable(\n { columns, data, defaultSort, className, ...props },\n ref\n ) {\n const [sort, setSort] = useState<SortState | undefined>(defaultSort)\n\n const sorted = useMemo(() => {\n if (sort === undefined) return data\n return [...data].sort((a, b) => {\n const av = String(a[sort.key] ?? '')\n const bv = String(b[sort.key] ?? '')\n const cmp = av.localeCompare(bv, undefined, { numeric: true })\n return sort.dir === 'asc' ? cmp : -cmp\n })\n }, [data, sort])\n\n function toggleSort(key: string) {\n if (sort?.key === key) {\n setSort({ key, dir: sort.dir === 'asc' ? 'desc' : 'asc' })\n } else {\n setSort({ key, dir: 'asc' })\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'border-border overflow-hidden rounded-lg border',\n className\n )}\n data-component=\"sortable-table\"\n {...props}\n >\n <table className=\"gds-text w-full text-left\">\n <thead>\n <tr className=\"border-border bg-bg-tertiary/50 border-b\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'text-fg-muted px-3 py-1.5 font-medium',\n col.sortable !== false &&\n 'hover:text-fg cursor-pointer select-none'\n )}\n onClick={\n col.sortable !== false\n ? () => toggleSort(col.key)\n : undefined\n }\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {sort?.key === col.key && (\n <span className=\"text-[10px]\">\n {sort.dir === 'asc' ? '▲' : '▼'}\n </span>\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.map((row, i) => (\n <tr\n key={`${String(row[columns[0]?.key ?? ''] ?? '')}-${i}`}\n className=\"border-border hover:bg-bg-tertiary/30 border-b transition-colors last:border-0\"\n >\n {columns.map((col) => (\n <td key={col.key} className=\"text-fg px-3 py-1.5\">\n {String(row[col.key] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n)\n\nexport type { SortableColumn, SortableTableProps, SortState }\n","// spotlight — dims everything except a target element for onboarding/tutorials\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype Rect = { top: number; left: number; width: number; height: number }\n\nexport type SpotlightProps = {\n active: boolean\n targetRef: React.RefObject<HTMLElement | null>\n title?: string\n description?: string\n placement?: 'top' | 'bottom' | 'left' | 'right'\n onClose?: () => void\n className?: string\n}\n\nfunction useTargetRect(\n targetRef: React.RefObject<HTMLElement | null>,\n active: boolean\n): Rect | null {\n const [rect, setRect] = useState<Rect | null>(null)\n\n useEffect(() => {\n if (!active) {\n setRect(null)\n return\n }\n const el = targetRef.current\n if (el === null) return\n\n const measure = () => {\n const r = el.getBoundingClientRect()\n setRect({ top: r.top, left: r.left, width: r.width, height: r.height })\n }\n measure()\n\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => {\n window.removeEventListener('resize', measure)\n window.removeEventListener('scroll', measure, true)\n }\n }, [active, targetRef])\n\n return rect\n}\n\nfunction computeCardStyle(\n rect: Rect,\n placement: 'top' | 'bottom' | 'left' | 'right'\n): React.CSSProperties {\n const gap = 12\n const base: React.CSSProperties = { position: 'fixed' }\n\n if (placement === 'bottom') {\n return { ...base, top: rect.top + rect.height + gap, left: rect.left }\n }\n if (placement === 'top') {\n return {\n ...base,\n bottom: window.innerHeight - rect.top + gap,\n left: rect.left,\n }\n }\n if (placement === 'left') {\n return {\n ...base,\n top: rect.top,\n right: window.innerWidth - rect.left + gap,\n }\n }\n // right\n return { ...base, top: rect.top, left: rect.left + rect.width + gap }\n}\n\nexport function Spotlight({\n active,\n targetRef,\n title,\n description,\n placement = 'bottom',\n onClose,\n className,\n}: SpotlightProps): ReactNode {\n const rect = useTargetRect(targetRef, active)\n\n // escape key\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n\n const handleEscape = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && onCloseRef.current !== undefined) {\n onCloseRef.current()\n }\n }, [])\n\n useEffect(() => {\n if (!active) return\n window.addEventListener('keydown', handleEscape)\n return () => window.removeEventListener('keydown', handleEscape)\n }, [active, handleEscape])\n\n if (!active || rect === null) return null\n\n const pad = 6\n const overlay = (\n <div\n className={cx('fixed inset-0 z-[9998]', className)}\n data-component=\"spotlight\"\n onClick={onClose}\n >\n {/* highlight hole via box-shadow */}\n <div\n className=\"absolute rounded-md\"\n style={{\n top: rect.top - pad,\n left: rect.left - pad,\n width: rect.width + pad * 2,\n height: rect.height + pad * 2,\n boxShadow: '0 0 0 9999px rgba(0,0,0,0.6)',\n pointerEvents: 'none',\n }}\n />\n\n {/* tooltip card */}\n <div\n className=\"bg-bg-secondary z-[9999] max-w-xs rounded-lg border border-white/10 p-4 shadow-lg\"\n style={computeCardStyle(rect, placement)}\n onClick={(e) => e.stopPropagation()}\n >\n {title !== undefined && (\n <p className=\"text-fg text-sm font-semibold\">{title}</p>\n )}\n {description !== undefined && (\n <p className=\"text-fg-muted mt-1 text-xs\">{description}</p>\n )}\n {onClose !== undefined && (\n <button\n className=\"text-accent hover:text-accent/80 mt-3 text-xs font-medium\"\n onClick={onClose}\n >\n Got it\n </button>\n )}\n </div>\n </div>\n )\n\n return renderPortal(overlay)\n}\n","// stacked-list — vertical list with header, footer, and selectable items\nimport type { ReactNode } from 'react'\n\nimport { ListItem } from '../l4-molecules/list-item'\nimport { cx } from '../utils/cx'\n\nexport type StackedListItem = {\n id: string\n title: string\n description?: string\n icon?: ReactNode\n trailing?: ReactNode\n}\n\nexport type StackedListProps = {\n items: StackedListItem[]\n header?: ReactNode\n footer?: ReactNode\n onSelect?: (id: string) => void\n selectedId?: string\n dividers?: boolean\n glass?: boolean\n className?: string\n}\n\nexport function StackedList({\n items,\n header,\n footer,\n onSelect,\n selectedId,\n dividers = true,\n glass,\n className,\n}: StackedListProps) {\n return (\n <div\n data-component=\"stacked-list\"\n className={cx(\n 'gds-radius-card border-border overflow-hidden border',\n glass === true && 'bg-white/5 backdrop-blur-md',\n className\n )}\n >\n {header !== undefined && (\n <div className=\"border-border bg-bg-tertiary/30 border-b px-4 py-2.5\">\n {header}\n </div>\n )}\n <div>\n {items.map((item, i) => (\n <ListItem\n key={item.id}\n icon={item.icon}\n title={item.title}\n description={item.description}\n trailing={item.trailing}\n active={selectedId === item.id}\n onClick={\n onSelect !== undefined ? () => onSelect(item.id) : undefined\n }\n className={cx(\n dividers === true &&\n i < items.length - 1 &&\n 'border-border/50 border-b'\n )}\n />\n ))}\n </div>\n {footer !== undefined && (\n <div className=\"border-border border-t px-4 py-2.5\">{footer}</div>\n )}\n </div>\n )\n}\n","// step-form — multi-step form wizard with stepper header and navigation buttons\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FormStep = {\n label: string\n description?: string\n content: ReactNode\n}\n\nexport type StepFormProps = {\n steps: FormStep[]\n onComplete: () => void\n className?: string\n}\n\nexport const StepForm = forwardRef<HTMLDivElement, StepFormProps>(\n function StepForm({ steps, onComplete, className }, ref) {\n const [current, setCurrent] = useState(0)\n const isFirst = current === 0\n const isLast = current === steps.length - 1\n\n const handleNext = () => {\n if (isLast) {\n onComplete()\n return\n }\n setCurrent((prev) => prev + 1)\n }\n\n const handleBack = () => {\n setCurrent((prev) => prev - 1)\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-6 select-none', className)}\n data-component=\"step-form\"\n >\n {/* step indicators */}\n <div className=\"flex items-center gap-2\">\n {steps.map((step, i) => (\n <div key={`${step.label}-${i}`} className=\"flex items-center gap-2\">\n {i > 0 && (\n <div\n className={cx(\n 'h-px w-8',\n i <= current ? 'bg-accent' : 'bg-border'\n )}\n />\n )}\n <div className=\"flex items-center gap-2\">\n <div\n className={cx(\n 'flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium',\n i < current && 'bg-accent text-accent-fg',\n i === current && 'border-accent text-accent border-2',\n i > current && 'border-border text-fg-muted border'\n )}\n >\n {i < current ? (\n <svg\n width=\"12\"\n height=\"12\"\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=\"M3 7l3 3 5-6\" />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span\n className={cx(\n 'text-xs',\n i === current ? 'text-fg font-medium' : 'text-fg-muted'\n )}\n >\n {step.label}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* content */}\n <div className=\"min-h-[120px]\">{steps[current].content}</div>\n\n {/* navigation */}\n <div className=\"flex items-center justify-end gap-2\">\n {!isFirst && (\n <button\n type=\"button\"\n className={cx(\n 'gds-radius-button text-fg-muted hover:bg-bg-tertiary hover:text-fg h-8 px-3 text-xs font-medium transition-colors',\n focusCls\n )}\n onClick={handleBack}\n >\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'gds-radius-button bg-accent text-accent-fg hover:bg-accent/90 h-8 px-3 text-xs font-medium transition-colors',\n focusCls\n )}\n onClick={handleNext}\n >\n {isLast ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Progress } from '../l2-primitives/progress'\nimport { cx } from '../utils/cx'\n\ntype HealthMetric = {\n label: string\n max?: number\n unit?: string\n value: number\n}\n\ntype SystemHealthProps = React.HTMLAttributes<HTMLDivElement> & {\n metrics: HealthMetric[]\n}\n\nfunction barVariant(pct: number): 'danger' | 'default' | 'success' | 'warning' {\n if (pct >= 90) return 'danger'\n if (pct >= 70) return 'warning'\n return 'success'\n}\n\nexport const SystemHealth = forwardRef<HTMLDivElement, SystemHealthProps>(\n function SystemHealth({ className, metrics, ...props }, ref) {\n return (\n <div\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"system-health\"\n ref={ref}\n {...props}\n >\n {metrics.map((m) => {\n const max = m.max ?? 100\n const pct = max > 0 ? Math.round((m.value / max) * 100) : 0\n return (\n <div key={m.label} className=\"flex flex-col gap-1\">\n <div className=\"gds-text-label flex items-center justify-between\">\n <span className=\"text-fg\">{m.label}</span>\n <span className=\"text-fg-muted font-mono tabular-nums\">\n {m.value}\n {m.unit ?? ''} / {max}\n {m.unit ?? ''} ({pct}%)\n </span>\n </div>\n <Progress value={pct} variant={barVariant(pct)} size=\"sm\" />\n </div>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { HealthMetric, SystemHealthProps }\n","// tag-cloud — interactive tag cloud with counts and selection\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TagCloudTag = {\n label: string\n count: number\n}\n\nexport type TagCloudProps = {\n tags: TagCloudTag[]\n selected?: string[]\n onToggle?: (label: string) => void\n className?: string\n}\n\nexport const TagCloud = forwardRef<HTMLDivElement, TagCloudProps>(\n function TagCloud({ tags, selected, onToggle, className }, ref) {\n const selectedSet = new Set(selected ?? [])\n return (\n <div\n ref={ref}\n className={cx('flex flex-wrap gap-2', className)}\n data-component=\"tag-cloud\"\n >\n {tags.map((tag) => {\n const isSelected = selectedSet.has(tag.label)\n return (\n <button\n key={tag.label}\n type=\"button\"\n onClick={() => onToggle?.(tag.label)}\n className={cx(\n 'gds-text-body rounded-full px-3 py-1 font-medium transition-colors select-none',\n isSelected\n ? 'bg-accent/15 text-accent'\n : 'bg-bg-tertiary text-fg-muted hover:bg-bg-tertiary/80'\n )}\n >\n {tag.label}\n <span className=\"ml-1.5 text-[10px] opacity-60\">{tag.count}</span>\n </button>\n )\n })}\n </div>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { TaskItem } from '../l4-molecules/task-item'\nimport { cx } from '../utils/cx'\n\ntype TaskBoardItem = {\n completed?: boolean\n id: string\n priority?: 'low' | 'medium' | 'high' | 'critical'\n title: string\n}\n\ntype TaskBoardSection = {\n id: string\n items: TaskBoardItem[]\n title: string\n}\n\ntype TaskBoardProps = React.HTMLAttributes<HTMLDivElement> & {\n onToggle?: (sectionId: string, itemId: string) => void\n sections: TaskBoardSection[]\n}\n\nconst TaskBoard = forwardRef<HTMLDivElement, TaskBoardProps>(function TaskBoard(\n { className, onToggle, sections, ...props },\n ref\n) {\n return (\n <div\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"task-board\"\n ref={ref}\n {...props}\n >\n {sections.map((section) => (\n <div\n className=\"border-border bg-surface gds-pad rounded-lg border\"\n key={section.id}\n >\n <h3 className=\"text-fg-muted mb-2 text-xs font-semibold tracking-wider uppercase\">\n {section.title}\n </h3>\n <div className=\"flex flex-col gap-0.5\">\n {section.items.map((item) => (\n <TaskItem\n completed={item.completed}\n key={item.id}\n onToggle={\n onToggle !== undefined\n ? () => onToggle(section.id, item.id)\n : undefined\n }\n priority={item.priority}\n title={item.title}\n />\n ))}\n {section.items.length === 0 && (\n <p className=\"text-fg-muted py-2 text-center text-xs\">No items</p>\n )}\n </div>\n </div>\n ))}\n </div>\n )\n})\n\nexport { TaskBoard }\nexport type { TaskBoardItem, TaskBoardProps, TaskBoardSection }\n","// timeline — vertical event timeline with variant-colored nodes\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TimelineItem = {\n id: string\n title: string\n description?: string\n date?: string\n icon?: ReactNode\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\nexport type TimelineProps = {\n items: TimelineItem[]\n orientation?: 'vertical'\n className?: string\n}\n\nconst dotColors: Record<string, string> = {\n default: 'bg-fg-muted',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n}\n\n// composition sub-components\n\nexport type TimelineGroupProps = {\n children: ReactNode\n className?: string\n label: string\n}\n\nexport function TimelineGroup({\n children,\n className,\n label,\n}: TimelineGroupProps) {\n return (\n <div className={cx('', className)}>\n <div className=\"text-fg-muted mb-2 pl-6 text-xs font-semibold\">\n {label}\n </div>\n <div className=\"flex flex-col gap-4\">{children}</div>\n </div>\n )\n}\n\nexport type TimelineItemComponentProps = {\n children?: ReactNode\n className?: string\n description?: ReactNode\n icon?: ReactNode\n status?: 'danger' | 'default' | 'success' | 'warning'\n timestamp?: string\n title: ReactNode\n}\n\nexport function TimelineItemComponent({\n children,\n className,\n description,\n icon,\n status = 'default',\n timestamp,\n title,\n}: TimelineItemComponentProps) {\n return (\n <div className={cx('gds-gap relative flex pl-6', className)}>\n <div className=\"absolute top-1.5 left-0\">\n {icon !== undefined ? (\n <span className=\"text-fg-muted flex h-[15px] w-[15px] items-center justify-center\">\n {icon}\n </span>\n ) : (\n <span\n className={cx(\n 'gds-radius-badge border-bg block h-[15px] w-[15px] border-2',\n dotColors[status]\n )}\n />\n )}\n </div>\n <div className=\"min-w-0 flex-1 pb-1\">\n <div className=\"gds-gap-sm flex items-baseline justify-between\">\n <span className=\"text-fg text-sm font-medium\">{title}</span>\n {timestamp !== undefined && (\n <span className=\"gds-text-body text-fg-muted shrink-0\">\n {timestamp}\n </span>\n )}\n </div>\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">{description}</p>\n )}\n {children}\n </div>\n </div>\n )\n}\n\nexport const Timeline = forwardRef<HTMLDivElement, TimelineProps>(\n function Timeline({ items, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('relative', className)}\n data-component=\"timeline\"\n >\n {/* vertical line */}\n <div className=\"bg-border absolute top-2 bottom-2 left-[7px] w-px\" />\n\n <div className=\"flex flex-col gap-4\">\n {items.map((item) => {\n const variant = item.variant ?? 'default'\n return (\n <div key={item.id} className=\"gds-gap relative flex pl-6\">\n {/* dot */}\n <div className=\"absolute top-1.5 left-0\">\n {item.icon !== undefined ? (\n <span className=\"text-fg-muted flex h-[15px] w-[15px] items-center justify-center\">\n {item.icon}\n </span>\n ) : (\n <span\n className={cx(\n 'gds-radius-badge border-bg block h-[15px] w-[15px] border-2',\n dotColors[variant]\n )}\n />\n )}\n </div>\n\n {/* content */}\n <div className=\"min-w-0 flex-1 pb-1\">\n <div className=\"gds-gap-sm flex items-baseline justify-between\">\n <span className=\"text-fg text-sm font-medium\">\n {item.title}\n </span>\n {item.date !== undefined && (\n <span className=\"gds-text-body text-fg-muted shrink-0\">\n {item.date}\n </span>\n )}\n </div>\n {item.description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {item.description}\n </p>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n)\n","// tour — guided product tour with spotlight highlighting and step navigation\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type TourStep = {\n title: string\n description: string\n target?: string\n placement?: 'top' | 'bottom' | 'left' | 'right'\n image?: string\n}\n\nexport type TourProps = {\n steps: TourStep[]\n active: boolean\n onComplete: () => void\n onSkip?: () => void\n className?: string\n}\n\nexport const Tour = forwardRef<HTMLDivElement, TourProps>(function Tour(\n { steps, active, onComplete, onSkip, className },\n ref\n) {\n const [current, setCurrent] = useState(0)\n const [entering, setEntering] = useState(true)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const cardRef = useRef<HTMLDivElement>(null)\n\n // reset to first step when tour activates\n useEffect(() => {\n if (!active) return\n setCurrent(0)\n setEntering(true)\n const timer = setTimeout(() => setEntering(false), 300)\n return () => clearTimeout(timer)\n }, [active])\n\n // find and highlight target element\n useEffect(() => {\n if (!active) return\n const step = steps[current]\n if (step?.target === undefined) {\n setTargetRect(null)\n return\n }\n try {\n const el = document.querySelector(step.target)\n if (el !== null) {\n const rect = el.getBoundingClientRect()\n setTargetRect(rect)\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n } else {\n setTargetRect(null)\n }\n } catch {\n setTargetRect(null)\n }\n }, [active, current, steps])\n\n const handleNext = useCallback(() => {\n if (current >= steps.length - 1) {\n onComplete()\n return\n }\n setEntering(true)\n setCurrent((p) => p + 1)\n setTimeout(() => setEntering(false), 200)\n }, [current, steps.length, onComplete])\n\n const handlePrev = useCallback(() => {\n if (current <= 0) return\n setEntering(true)\n setCurrent((p) => p - 1)\n setTimeout(() => setEntering(false), 200)\n }, [current])\n\n const handleSkip = useCallback(() => {\n onSkip?.()\n }, [onSkip])\n\n // keyboard navigation\n useEffect(() => {\n if (!active) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleSkip()\n if (e.key === 'ArrowRight') handleNext()\n if (e.key === 'ArrowLeft') handlePrev()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [active, handleNext, handlePrev, handleSkip])\n\n if (!active) return null\n\n const step = steps[current]\n if (step === undefined) return null\n\n const isFirst = current === 0\n const isLast = current === steps.length - 1\n const progress = ((current + 1) / steps.length) * 100\n\n // calculate card position near target\n const cardStyle = (() => {\n if (targetRect === null) return undefined\n const placement = step.placement ?? 'bottom'\n const padding = 16\n\n if (placement === 'bottom') {\n return {\n position: 'fixed' as const,\n top: `${targetRect.bottom + padding}px`,\n left: `${Math.max(16, targetRect.left + targetRect.width / 2 - 200)}px`,\n }\n }\n if (placement === 'top') {\n return {\n position: 'fixed' as const,\n bottom: `${window.innerHeight - targetRect.top + padding}px`,\n left: `${Math.max(16, targetRect.left + targetRect.width / 2 - 200)}px`,\n }\n }\n if (placement === 'right') {\n return {\n position: 'fixed' as const,\n top: `${Math.max(16, targetRect.top + targetRect.height / 2 - 80)}px`,\n left: `${targetRect.right + padding}px`,\n }\n }\n // left\n return {\n position: 'fixed' as const,\n top: `${Math.max(16, targetRect.top + targetRect.height / 2 - 80)}px`,\n right: `${window.innerWidth - targetRect.left + padding}px`,\n }\n })()\n\n return (\n <div\n ref={ref}\n className={cx('fixed inset-0 z-50', className)}\n data-component=\"tour\"\n >\n {/* backdrop with spotlight cutout */}\n <svg\n className=\"absolute inset-0 h-full w-full\"\n style={{ pointerEvents: 'none' }}\n >\n <defs>\n <mask id=\"tour-mask\">\n <rect fill=\"white\" height=\"100%\" width=\"100%\" x=\"0\" y=\"0\" />\n {targetRect !== null && (\n <rect\n fill=\"black\"\n height={targetRect.height + 16}\n rx=\"8\"\n width={targetRect.width + 16}\n x={targetRect.left - 8}\n y={targetRect.top - 8}\n />\n )}\n </mask>\n </defs>\n <rect\n className=\"fill-fg/40\"\n height=\"100%\"\n mask=\"url(#tour-mask)\"\n width=\"100%\"\n x=\"0\"\n y=\"0\"\n />\n </svg>\n\n {/* target highlight ring */}\n {targetRect !== null && (\n <div\n className=\"gds-radius ring-accent pointer-events-none fixed ring-2 ring-offset-2 ring-offset-transparent transition-all duration-300\"\n style={{\n top: targetRect.top - 4,\n left: targetRect.left - 4,\n width: targetRect.width + 8,\n height: targetRect.height + 8,\n }}\n />\n )}\n\n {/* tour card */}\n <div\n ref={cardRef}\n className={cx(\n 'gds-radius border-border bg-surface w-96 border shadow-2xl transition-all duration-200 select-none',\n entering ? 'scale-95 opacity-0' : 'scale-100 opacity-100',\n targetRect === null &&\n 'fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2'\n )}\n role=\"dialog\"\n style={cardStyle}\n >\n {/* progress bar */}\n <div className=\"bg-bg-tertiary h-1 overflow-hidden rounded-t-xl\">\n <div\n className=\"bg-accent h-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n\n {/* header */}\n <div className=\"flex items-center justify-between px-5 pt-4 pb-1\">\n <span className=\"text-fg-muted/40 text-[10px] tracking-widest uppercase\">\n Step {current + 1} of {steps.length}\n </span>\n {onSkip !== undefined && (\n <button\n type=\"button\"\n className={cx(\n 'gds-radius-button text-fg-muted/40 hover:text-fg p-1 transition-colors',\n focusCls\n )}\n onClick={handleSkip}\n aria-label=\"Close tour\"\n >\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 <path d=\"M4 4l8 8M12 4l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* content */}\n <div className=\"px-5 pb-2\">\n <div className=\"text-fg text-base font-semibold\">{step.title}</div>\n <p className=\"text-fg-muted mt-2 text-sm leading-relaxed\">\n {step.description}\n </p>\n {step.image !== undefined && (\n <div className=\"gds-radius border-border/30 mt-3 overflow-hidden border\">\n <img alt={step.title} className=\"w-full\" src={step.image} />\n </div>\n )}\n </div>\n\n {/* footer */}\n <div className=\"flex items-center justify-between px-5 pt-2 pb-4\">\n {/* dots */}\n <div className=\"flex gap-1.5\">\n {steps.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n className={cx(\n 'h-2 rounded-full transition-all',\n i === current\n ? 'bg-accent w-5'\n : 'bg-fg-muted/20 hover:bg-fg-muted/40 w-2'\n )}\n onClick={() => {\n setEntering(true)\n setCurrent(i)\n setTimeout(() => setEntering(false), 200)\n }}\n />\n ))}\n </div>\n\n {/* nav buttons */}\n <div className=\"flex items-center gap-2\">\n {!isFirst && (\n <button\n type=\"button\"\n className={cx(\n 'gds-radius-button text-fg-muted hover:bg-bg-tertiary hover:text-fg flex h-8 items-center gap-1 px-3 text-xs transition-colors',\n focusCls\n )}\n onClick={handlePrev}\n >\n <svg\n width=\"14\"\n height=\"14\"\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=\"M10 3L5 8l5 5\" />\n </svg>\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'gds-radius-button bg-accent text-accent-fg hover:bg-accent/90 flex h-8 items-center gap-1 px-4 text-xs font-medium transition-colors',\n focusCls\n )}\n onClick={handleNext}\n >\n {isLast ? 'Done' : 'Next'}\n {!isLast && (\n <svg\n width=\"14\"\n height=\"14\"\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=\"M6 3l5 5-5 5\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n})\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype Transaction = {\n amount: number\n currency?: string\n date: string\n description: string\n id: string\n}\n\ntype TransactionListProps = React.HTMLAttributes<HTMLDivElement> & {\n transactions: Transaction[]\n}\n\nfunction formatAmount(amount: number, currency: string): string {\n const sign = amount >= 0 ? '+' : ''\n return `${sign}${currency}${Math.abs(amount).toLocaleString()}`\n}\n\nexport const TransactionList = forwardRef<HTMLDivElement, TransactionListProps>(\n function TransactionList({ className, transactions, ...props }, ref) {\n return (\n <div\n className={cx('divide-border flex flex-col divide-y', className)}\n data-component=\"transaction-list\"\n ref={ref}\n {...props}\n >\n {transactions.map((tx) => {\n const currency = tx.currency ?? '\\u00a5'\n const isPositive = tx.amount >= 0\n return (\n <div\n className=\"flex items-center justify-between px-3 py-2.5\"\n key={tx.id}\n >\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-fg text-sm font-medium\">\n {tx.description}\n </span>\n <span className=\"text-fg-muted text-xs\">{tx.date}</span>\n </div>\n <span\n className={cx(\n 'text-sm font-semibold tabular-nums',\n isPositive ? 'text-success' : 'text-danger'\n )}\n >\n {formatAmount(tx.amount, currency)}\n </span>\n </div>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { Transaction, TransactionListProps }\n","// tree — recursive collapsible tree view\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type TreeNode = {\n id: string\n label: string\n icon?: ReactNode\n children?: TreeNode[]\n disabled?: boolean\n}\n\nexport type TreeProps = {\n nodes: TreeNode[]\n onSelect?: (id: string) => void\n selected?: string\n defaultExpanded?: string[]\n className?: string\n}\n\nfunction ChevronSvg({ expanded }: { expanded: boolean }) {\n return (\n <svg\n className={cx(\n 'text-fg-muted h-3 w-3 shrink-0 transition-transform',\n expanded && 'rotate-90'\n )}\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n >\n <path d=\"M4 2L8 6L4 10V2Z\" />\n </svg>\n )\n}\n\nfunction TreeNodeItem({\n node,\n depth,\n selected,\n expanded,\n onToggle,\n onSelect,\n}: {\n node: TreeNode\n depth: number\n selected?: string\n expanded: Set<string>\n onToggle: (id: string) => void\n onSelect?: (id: string) => void\n}) {\n const hasChildren = node.children !== undefined && node.children.length > 0\n const isExpanded = expanded.has(node.id)\n const isSelected = selected === node.id\n const isDisabled = node.disabled === true\n\n const handleClick = () => {\n if (isDisabled) return\n if (hasChildren) {\n onToggle(node.id)\n }\n if (onSelect !== undefined) {\n onSelect(node.id)\n }\n }\n\n return (\n <div>\n <button\n className={cx(\n 'gds-gap-sm gds-radius-button gds-pad-x-sm gds-pad-y-sm flex w-full items-center text-sm select-none',\n isSelected\n ? 'bg-accent/10 text-accent'\n : 'text-fg hover:bg-bg-secondary',\n isDisabled && 'cursor-not-allowed opacity-50',\n focusCls\n )}\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={handleClick}\n disabled={isDisabled}\n data-state={isSelected ? 'selected' : undefined}\n >\n {hasChildren ? (\n <ChevronSvg expanded={isExpanded} />\n ) : (\n <span className=\"h-3 w-3 shrink-0\" />\n )}\n {node.icon !== undefined && (\n <span className=\"text-fg-muted shrink-0\">{node.icon}</span>\n )}\n <span className=\"truncate\">{node.label}</span>\n </button>\n {hasChildren && isExpanded && (\n <div>\n {node.children?.map((child) => (\n <TreeNodeItem\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const Tree = forwardRef<HTMLDivElement, TreeProps>(function Tree(\n { nodes, onSelect, selected, defaultExpanded, className },\n ref\n) {\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(defaultExpanded ?? [])\n )\n\n const handleToggle = useCallback((id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap-xs flex flex-col', className)}\n data-component=\"tree\"\n role=\"tree\"\n >\n {nodes.map((node) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n )\n})\n","// video-controls — custom controls bar for video player (internal)\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype VideoControlsProps = {\n currentTime: number\n duration: number\n playing: boolean\n isMuted: boolean\n showControls: boolean\n onTogglePlay: () => void\n onToggleMute: () => void\n onSeek: (e: React.MouseEvent<HTMLDivElement>) => void\n onFullscreen: () => void\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60)\n const s = Math.floor(seconds % 60)\n return `${m}:${s.toString().padStart(2, '0')}`\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4 2l10 6-10 6V2z\" />\n </svg>\n )\n}\n\nfunction PauseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"3\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n <rect x=\"9\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction MuteIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 5h3l4-3v12l-4-3H2V5z\" />\n <line\n x1=\"12\"\n y1=\"5\"\n x2=\"12\"\n y2=\"11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n )\n}\n\nfunction UnmuteIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 5h3l4-3v12l-4-3H2V5z\" />\n <path\n d=\"M11 4c1.5 1 2 2.5 2 4s-.5 3-2 4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n )\n}\n\nfunction FullscreenIcon() {\n return (\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 >\n <path d=\"M2 6V2h4M10 2h4v4M14 10v4h-4M6 14H2v-4\" />\n </svg>\n )\n}\n\nfunction VideoControls({\n currentTime,\n duration,\n playing,\n isMuted,\n showControls,\n onTogglePlay,\n onToggleMute,\n onSeek,\n onFullscreen,\n}: VideoControlsProps) {\n const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0\n\n return (\n <div\n className={cx(\n 'absolute inset-x-0 bottom-0 flex items-center gap-2 bg-black/60 px-3 py-2 transition-opacity duration-200',\n showControls ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n data-testid=\"controls\"\n >\n <button\n type=\"button\"\n onClick={onTogglePlay}\n className={cx('text-white', focusCls)}\n aria-label={playing ? 'Pause' : 'Play'}\n data-testid=\"play-button\"\n >\n {playing ? <PauseIcon /> : <PlayIcon />}\n </button>\n\n <div\n className={cx(\n 'relative h-1 flex-1 cursor-pointer rounded-full bg-white/30',\n focusCls\n )}\n onClick={onSeek}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.floor(duration)}\n aria-valuenow={Math.floor(currentTime)}\n tabIndex={0}\n data-testid=\"progress-bar\"\n >\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n\n <span\n className=\"text-xs text-white/80 select-none\"\n data-testid=\"time-display\"\n >\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n\n <button\n type=\"button\"\n onClick={onToggleMute}\n className={cx('text-white', focusCls)}\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n data-testid=\"mute-button\"\n >\n {isMuted ? <MuteIcon /> : <UnmuteIcon />}\n </button>\n\n <button\n type=\"button\"\n onClick={onFullscreen}\n className={cx('text-white', focusCls)}\n aria-label=\"Fullscreen\"\n data-testid=\"fullscreen-button\"\n >\n <FullscreenIcon />\n </button>\n </div>\n )\n}\n\nexport { VideoControls }\nexport type { VideoControlsProps }\n","// video-player — styled html5 video player with custom controls\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { VideoControls } from './video-controls'\n\nexport type VideoPlayerProps = {\n src: string\n poster?: string\n autoPlay?: boolean\n muted?: boolean\n loop?: boolean\n controls?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const VideoPlayer = forwardRef<HTMLDivElement, VideoPlayerProps>(\n function VideoPlayer(\n {\n src,\n poster,\n autoPlay = false,\n muted: mutedProp = false,\n loop = false,\n controls = true,\n glass = false,\n className,\n },\n ref\n ) {\n const videoRef = useRef<HTMLVideoElement>(null)\n const hideTimerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const [playing, setPlaying] = useState(false)\n const [currentTime, setCurrentTime] = useState(0)\n const [duration, setDuration] = useState(0)\n const [isMuted, setIsMuted] = useState(mutedProp)\n const [showControls, setShowControls] = useState(true)\n\n const resetHideTimer = useCallback(() => {\n setShowControls(true)\n if (hideTimerRef.current !== null) {\n clearTimeout(hideTimerRef.current)\n }\n hideTimerRef.current = setTimeout(() => {\n if (playing) setShowControls(false)\n }, 3000)\n }, [playing])\n\n // auto-hide controls\n useEffect(() => {\n if (!controls) return\n resetHideTimer()\n return () => {\n if (hideTimerRef.current !== null) clearTimeout(hideTimerRef.current)\n }\n }, [controls, resetHideTimer])\n\n const togglePlay = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n if (video.paused) {\n video.play().catch(() => {})\n setPlaying(true)\n } else {\n video.pause()\n setPlaying(false)\n }\n }, [])\n\n const toggleMute = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n video.muted = !video.muted\n setIsMuted(video.muted)\n }, [])\n\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n setCurrentTime(video.currentTime)\n }, [])\n\n const handleLoadedMetadata = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n setDuration(video.duration)\n }, [])\n\n const handleSeek = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const video = videoRef.current\n if (video === null) return\n const rect = e.currentTarget.getBoundingClientRect()\n const ratio = (e.clientX - rect.left) / rect.width\n video.currentTime = ratio * duration\n },\n [duration]\n )\n\n const handleFullscreen = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n if (document.fullscreenElement !== null) {\n document.exitFullscreen().catch(() => {})\n } else {\n video.requestFullscreen().catch(() => {})\n }\n }, [])\n\n const handleEnded = useCallback(() => {\n setPlaying(false)\n setShowControls(true)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-card relative overflow-hidden',\n glass && 'gds-glass',\n className\n )}\n data-component=\"video-player\"\n onMouseMove={controls ? resetHideTimer : undefined}\n onMouseLeave={controls ? () => setShowControls(false) : undefined}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n muted={isMuted}\n loop={loop}\n className=\"block h-full w-full object-cover\"\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"video-element\"\n />\n\n {controls && (\n <VideoControls\n currentTime={currentTime}\n duration={duration}\n playing={playing}\n isMuted={isMuted}\n showControls={showControls}\n onTogglePlay={togglePlay}\n onToggleMute={toggleMute}\n onSeek={handleSeek}\n onFullscreen={handleFullscreen}\n />\n )}\n </div>\n )\n }\n)\n","// virtual-list — windowed list rendering for large datasets\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type VirtualListProps<T> = {\n items: T[]\n itemHeight: number\n renderItem: (item: T, index: number) => ReactNode\n overscan?: number\n className?: string\n height?: number | string\n}\n\nfunction VirtualListInner<T>(\n {\n items,\n itemHeight,\n renderItem,\n overscan = 3,\n className,\n height = 400,\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [scrollTop, setScrollTop] = useState(0)\n const innerRef = useRef<HTMLDivElement>(null)\n\n const totalHeight = items.length * itemHeight\n\n const containerHeight = typeof height === 'number' ? height : undefined\n\n const { visibleItems } = useMemo(() => {\n const viewportHeight = containerHeight ?? 400\n const rawStart = Math.floor(scrollTop / itemHeight)\n const rawEnd = Math.ceil((scrollTop + viewportHeight) / itemHeight)\n const start = Math.max(0, rawStart - overscan)\n const end = Math.min(items.length, rawEnd + overscan)\n\n const visible: Array<{ item: T; index: number }> = []\n for (let i = start; i < end; i++) {\n visible.push({ item: items[i], index: i })\n }\n\n return { startIndex: start, endIndex: end, visibleItems: visible }\n }, [items, itemHeight, scrollTop, containerHeight, overscan])\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('overflow-y-auto', className)}\n style={{ height }}\n onScroll={handleScroll}\n data-component=\"virtual-list\"\n >\n <div ref={innerRef} style={{ height: totalHeight, position: 'relative' }}>\n {visibleItems.map(({ item, index }) => (\n <div\n key={index}\n style={{\n position: 'absolute',\n top: index * itemHeight,\n left: 0,\n right: 0,\n height: itemHeight,\n }}\n >\n {renderItem(item, index)}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.Ref<HTMLDivElement> }\n) => ReactNode\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype WeatherWidgetProps = React.HTMLAttributes<HTMLDivElement> & {\n condition: string\n icon?: ReactNode\n location: string\n temp: number\n unit?: 'C' | 'F'\n}\n\nexport const WeatherWidget = forwardRef<HTMLDivElement, WeatherWidgetProps>(\n function WeatherWidget(\n { className, condition, icon, location, temp, unit = 'C', ...props },\n ref\n ) {\n return (\n <div\n className={cx(\n 'border-border bg-surface inline-flex items-center gap-4 rounded-xl border p-4 select-none',\n className\n )}\n data-component=\"weather-widget\"\n ref={ref}\n {...props}\n >\n {icon !== undefined && (\n <div className=\"text-fg-muted text-2xl\">{icon}</div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-fg text-2xl leading-tight font-bold\">\n {temp}°{unit}\n </span>\n <span className=\"text-fg-muted text-sm\">{condition}</span>\n <span className=\"text-fg-muted/70 text-xs\">{location}</span>\n </div>\n </div>\n )\n }\n)\n\nexport type { WeatherWidgetProps }\n"],"x_google_ignoreList":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"mappings":"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"}
|