@goliapkg/gds 0.9.5 → 0.9.7

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"l5-organisms-8KB_8a-H.js","names":[],"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.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","../src/l5-organisms/email-list-item.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/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=\"flex items-start gap-3 gds-pad-x gds-pad-y-sm\"\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=\"font-medium text-fg\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n {item.target !== undefined && (\n <span className=\"font-medium text-fg\"> {item.target}</span>\n )}\n </div>\n <div className=\"mt-0.5 gds-text-caption text-fg-muted\">{item.timestamp}</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(children !== null && children !== undefined && children !== false)\n const [exiting, setExiting] = useState(false)\n const prevChildrenRef = useRef<ReactNode>(children)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const hasChildren = 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 ? exitClassMap[animation] : 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 'flex items-center gap-2 gds-radius-card gds-pad-x gds-pad-y',\n 'border border-border bg-bg-secondary',\n glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\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('shrink-0 text-fg', 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 className=\"shrink-0 select-none text-xs text-fg-muted\" data-testid=\"title\">\n {title}\n </span>\n )}\n\n {/* progress bar */}\n <div\n className={cx('relative h-1 flex-1 cursor-pointer rounded-full bg-bg-tertiary', focusCls)}\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=\"absolute inset-y-0 left-0 rounded-full bg-accent\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n\n {/* time */}\n <span className=\"shrink-0 select-none text-xs tabular-nums text-fg-muted\" data-testid=\"time-display\">\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 key={entry.id} className={cx('gds-pad-x gds-pad-y', i % 2 === 1 && 'bg-surface/50')}>\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({ users, onSelect, compact = false, glass, className, ...props }, ref) {\n return (\n <div\n className={cx(\n 'gds-radius-popover overflow-hidden border border-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 name={user.name} src={user.src} status={user.status} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate gds-text-body font-medium text-fg\">{user.name}</div>\n {compact !== true && user.role !== undefined && (\n <div className=\"truncate gds-text-caption text-fg-muted\">{user.role}</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 && `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', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear()\n && a.getMonth() === b.getMonth()\n && a.getDate() === b.getDate()\n}\n\nexport function isDisabled(day: Date, min?: Date, max?: Date): boolean {\n if (min !== undefined && day < new Date(min.getFullYear(), min.getMonth(), min.getDate())) {\n return true\n }\n if (max !== undefined && day > new Date(max.getFullYear(), max.getMonth(), max.getDate())) {\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 { getCalendarGrid, isDisabled, isSameDay, MONTHS, WEEKDAYS } 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('w-64 gds-radius-popover border border-border bg-surface gds-pad-x gds-pad-y select-none', className)}\n data-component=\"calendar\"\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={cx('rounded p-1 text-fg-muted hover:bg-bg-secondary hover:text-fg', focusCls)}\n onClick={prevMonth}\n aria-label=\"Previous month\"\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10 4L6 8L10 12\" />\n </svg>\n </button>\n <span className=\"text-sm font-medium text-fg\">\n {MONTHS[viewMonth]} {viewYear}\n </span>\n <button\n type=\"button\"\n className={cx('rounded p-1 text-fg-muted hover:bg-bg-secondary hover:text-fg', focusCls)}\n onClick={nextMonth}\n aria-label=\"Next month\"\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M6 4L10 8L6 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"grid grid-cols-7 gds-gap-xs text-center gds-text-body text-fg-muted\">\n {WEEKDAYS.map((d) => (\n <div key={d} className=\"gds-pad-y-sm font-medium\">{d}</div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gds-gap-xs text-center gds-text-body\">\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-1 ring-accent',\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 { Children, forwardRef, useCallback, useEffect, useRef, useState } 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 width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 3L5 8l5 5\" />\n </svg>\n)\n\nconst ArrowRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3l5 5-5 5\" />\n </svg>\n)\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n function Carousel({ children, autoPlay = false, interval = 5000, showDots = true, showArrows = true, glass = false, className }, ref) {\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((index: number) => {\n const next = ((index % count) + count) % count\n setActiveIndex(next)\n }, [count])\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((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 }, [goNext, goPrev])\n\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden gds-radius', glass && glassClass(glass), className)}\n data-component=\"carousel\"\n onMouseEnter={() => { hoverRef.current = true }}\n onMouseLeave={() => { hoverRef.current = false }}\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 'absolute left-2 top-1/2 -translate-y-1/2 rounded-full border border-border bg-bg/80 p-1.5 text-fg transition-colors hover:bg-bg',\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 'absolute right-2 top-1/2 -translate-y-1/2 rounded-full border border-border bg-bg/80 p-1.5 text-fg transition-colors hover:bg-bg',\n focusCls,\n )}\n aria-label=\"Next slide\"\n >\n <ArrowRight />\n </button>\n </>\n )}\n\n {/* dots */}\n {showDots && count > 1 && (\n <div className=\"absolute bottom-2 left-1/2 flex -translate-x-1/2 gap-1.5\" role=\"tablist\">\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 ? 'bg-accent scale-125' : '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 ref={ref} className={cx('flex flex-col gap-6', className)} data-component=\"changelog\" {...props}>\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=\"font-semibold text-fg gds-heading\">{entry.version}</span>\n <span className=\"text-xs text-fg-muted\">{entry.date}</span>\n </div>\n <ul className=\"flex flex-col gap-1\">\n {entry.changes.map((change, i) => (\n <li key={i} className=\"flex items-start gap-2 gds-text text-fg\">\n <span className={cx(\n 'mt-0.5 shrink-0 rounded-full px-1.5 py-px text-[9px] font-bold uppercase leading-tight',\n typeColors[change.type],\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 { cx } from '../utils/cx'\nimport type { CommandItem } from './command-palette'\n\ntype CommandPaletteListProps = {\n groups: Map<string, CommandItem[]>\n activeIndex: number\n filteredCount: number\n onSelect: (id: string) => void\n}\n\nfunction CommandPaletteList({\n groups,\n activeIndex,\n filteredCount,\n onSelect,\n}: CommandPaletteListProps) {\n let flatIndex = -1\n\n if (filteredCount === 0) {\n return (\n <div className=\"py-8 text-center text-sm text-fg-muted/40\">No results found</div>\n )\n }\n\n return (\n <>\n {Array.from(groups.entries()).map(([group, groupItems]) => (\n <div key={group}>\n {group !== '' && (\n <div className=\"px-3 pb-1 pt-3 text-[10px] font-semibold uppercase tracking-[0.1em] text-fg-muted/30\">\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 ? 'bg-accent/15 text-accent' : '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=\"flex h-5 w-5 shrink-0 items-center justify-center text-fg-muted/50\">{item.icon}</span>\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.group !== undefined && (\n <span className=\"shrink-0 text-[11px] text-fg-muted/25\">{item.group}</span>\n )}\n {item.shortcut !== undefined && (\n <kbd className=\"shrink-0 rounded border border-white/[0.06] bg-white/[0.03] px-1.5 py-px text-[10px] text-fg-muted/30\">\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}\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}\n\nexport function CommandPalette({\n open,\n onClose,\n items,\n onSelect,\n placeholder = 'Search components, patterns, tokens...',\n className,\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 if (query === '') return items\n const lower = query.toLowerCase()\n return items.filter((item) => item.label.toLowerCase().includes(lower))\n }, [items, query])\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((id: string) => {\n onSelect(id)\n onClose()\n }, [onSelect, onClose])\n\n const handleKeyDown = useCallback((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((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n } else if (e.key === 'Enter' && filtered[activeIndex] !== undefined) {\n e.preventDefault()\n handleSelect(filtered[activeIndex].id)\n }\n }, [filtered, activeIndex, handleSelect])\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) => { if (e.target === e.currentTarget) onClose() }}\n onKeyDown={handleKeyDown}\n >\n <div\n className={cx(\n 'w-full max-w-xl animate-scale-in rounded-xl border border-white/[0.06] bg-bg-secondary 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 className=\"h-4 w-4 shrink-0 text-fg-muted/40\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\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) => { setQuery(e.target.value); setActiveIndex(0) }}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent py-3.5 text-sm text-fg placeholder:text-fg-muted/30 outline-none\"\n />\n <kbd className=\"shrink-0 rounded border border-white/[0.08] bg-white/[0.04] px-1.5 py-0.5 text-[10px] font-medium text-fg-muted/40\">\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 />\n </div>\n\n {/* footer hints */}\n <div className=\"flex items-center justify-between border-t border-white/[0.06] px-4 py-2 text-[10px] text-fg-muted/25\">\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({ comment, depth = 0 }: { comment: CommentData; depth?: number }) {\n return (\n <div className={cx(depth > 0 && 'ml-8 border-l border-border pl-4')}>\n <div className=\"flex items-start gds-gap\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-accent/10 text-xs font-medium text-accent\">\n {comment.avatar ?? comment.author.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gds-gap-sm\">\n <span className=\"text-sm font-medium text-fg\">{comment.author}</span>\n <span className=\"gds-text-label text-fg-muted\">{comment.timestamp}</span>\n </div>\n <p className=\"mt-1 text-sm text-fg-muted\">{comment.content}</p>\n </div>\n </div>\n {comment.replies !== undefined && comment.replies.length > 0 && (\n <div className=\"mt-3 flex flex-col gds-gap\">\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('flex flex-col gds-gap', 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 { createParticle, drawParticle, updateParticle } 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', '#ec4899', '#14b8a6', '#f59e0b',\n '#8b5cf6', '#ef4444', '#22c55e', '#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('fixed inset-0 pointer-events-none 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({ actions, avatar, className, email, name, phone, role, ...props }, ref) {\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('gds-ctx gds-radius-card border border-border bg-surface gds-pad text-center', className)}\n data-component=\"contact-card\"\n ref={ref}\n {...props}\n >\n {avatar !== undefined ? (\n <img src={avatar} alt={name} className=\"mx-auto h-14 w-14 rounded-full object-cover\" />\n ) : (\n <div className=\"mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent\">\n {initials}\n </div>\n )}\n <div className=\"mt-3 font-semibold text-fg\">{name}</div>\n {role !== undefined && <div className=\"mt-0.5 text-xs text-fg-muted\">{role}</div>}\n {email !== undefined && (\n <div className=\"mt-2 text-xs text-fg-muted\">{email}</div>\n )}\n {phone !== undefined && (\n <div className=\"mt-0.5 text-xs text-fg-muted\">{phone}</div>\n )}\n {actions !== undefined && <div className=\"mt-3 flex justify-center gap-2\">{actions}</div>}\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('gds-radius-popover overflow-hidden border border-border', className)}\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 text-left gds-text-body text-fg-muted\">\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 key={c.name} className=\"border-t border-border gds-text-body hover:bg-bg-tertiary/30 transition-colors\">\n <td className=\"px-3 py-1.5 font-medium text-fg\">{c.name}</td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted text-xs\">{c.image}</td>\n <td className=\"px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className={cx('h-2 w-2 rounded-full', dotCls[c.status])} />\n <span className=\"text-fg-muted\">{c.status}</span>\n </span>\n </td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted text-xs\">{c.ports ?? '—'}</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 = '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 'fixed inset-x-0 bottom-0 z-50 flex items-center justify-between gap-4 border-t border-border bg-surface/80 px-6 py-4 backdrop-blur-lg',\n className,\n )}\n data-component=\"cookie-banner\"\n role=\"banner\"\n >\n <p className=\"text-sm text-fg-muted flex-1\">{message ?? defaultMessage}</p>\n <div className=\"flex shrink-0 gap-2\">\n {onReject !== undefined && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReject}>Reject</Button>\n )}\n <Button variant=\"primary\" size=\"sm\" onClick={onAccept}>Accept</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 = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\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 = 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 ? `Day ${dayOfMonth} of every month at ${time}` : `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 ref={ref} className={cx('flex items-center gap-3', className)} data-component=\"cron-schedule\" {...props}>\n <code className=\"rounded bg-bg-secondary px-2 py-1 text-xs text-fg-muted font-mono\">{expression}</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({ columns, rows, compact = false, striped = false, glass, className }, ref) {\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-b border-border/40\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'font-medium text-fg-muted select-none',\n cellPadding,\n alignClasses[col.align ?? 'left'],\n )}\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td className=\"px-3 py-8 text-center text-fg-muted\" colSpan={columns.length}>\n No data\n </td>\n </tr>\n )}\n {rows.map((row, i) => (\n <tr\n key={i}\n className={cx(\n 'border-b border-border/20',\n striped && i % 2 === 1 && 'bg-bg-secondary/30',\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx('text-fg', cellPadding, alignClasses[col.align ?? 'left'])}\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-border overflow-hidden',\n glass !== undefined && glass !== false\n ? cx('border-white/10 bg-bg/60', 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-b border-border' : '',\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 font-medium text-fg-muted\">{item.label}</div>\n <div className={cx('text-fg gds-text-body', isHorizontal ? '' : 'mt-1')}>\n {item.value}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","// data-table — sortable, striped table with loading and empty states\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassSurface } from '../utils/glass'\n\nexport type Column<T> = {\n key: string\n header: string\n render?: (row: T) => ReactNode\n sortable?: boolean\n width?: string\n}\n\nexport type DataTableProps<T extends Record<string, unknown>> = {\n columns: Column<T>[]\n data: T[]\n className?: string\n onRowClick?: (row: T) => void\n sortKey?: string\n sortDir?: 'asc' | 'desc'\n onSort?: (key: string) => void\n emptyText?: string\n loading?: boolean\n glass?: boolean\n}\n\nfunction SortChevron({ dir }: { dir?: 'asc' | 'desc' }) {\n if (dir === undefined) {\n return (\n <svg className=\"ml-1 inline h-3 w-3 text-fg-muted/40\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M6 2L9 5H3L6 2Z\" />\n <path d=\"M6 10L3 7H9L6 10Z\" />\n </svg>\n )\n }\n return (\n <svg className=\"ml-1 inline h-3 w-3 text-fg-muted\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n {dir === 'asc'\n ? <path d=\"M6 2L9 5H3L6 2Z\" />\n : <path d=\"M6 10L3 7H9L6 10Z\" />\n }\n </svg>\n )\n}\n\nfunction SkeletonRows<T extends Record<string, unknown>>({ columns }: { columns: Column<T>[] }) {\n return (\n <>\n {Array.from({ length: 5 }, (_, i) => (\n <tr key={i} className=\"border-b border-border\">\n {columns.map((col) => (\n <td key={col.key} className=\"gds-pad-x gds-pad-y\">\n <div className=\"h-4 animate-pulse rounded bg-bg-tertiary\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n\nfunction EmptyState({ colSpan, text }: { colSpan: number; text: string }) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"gds-pad-x py-12 text-center text-sm text-fg-muted\">\n {text}\n </td>\n </tr>\n )\n}\n\nfunction DataTableInner<T extends Record<string, unknown>>(\n {\n columns,\n data,\n className,\n onRowClick,\n sortKey,\n sortDir,\n onSort,\n emptyText = 'No data',\n loading,\n glass,\n }: DataTableProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const handleHeaderClick = (col: Column<T>) => {\n if (col.sortable !== true || onSort === undefined) return\n onSort(col.key)\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-auto gds-radius-popover 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 <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-bg-secondary/50\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'gds-pad-x gds-pad-y text-left gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none',\n col.sortable === true && 'cursor-pointer hover:text-fg',\n )}\n style={col.width !== undefined ? { width: col.width } : undefined}\n onClick={() => handleHeaderClick(col)}\n >\n {col.header}\n {col.sortable === true && (\n <SortChevron dir={sortKey === col.key ? sortDir : undefined} />\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading === true && <SkeletonRows columns={columns} />}\n {loading !== true && data.length === 0 && (\n <EmptyState colSpan={columns.length} text={emptyText} />\n )}\n {loading !== true && data.map((row, i) => (\n <tr\n key={i}\n className={cx(\n 'border-b border-border transition-colors',\n i % 2 === 1 && 'bg-bg-secondary/30',\n onRowClick !== undefined && 'cursor-pointer hover:bg-bg-secondary/60',\n )}\n onClick={onRowClick !== undefined ? () => onRowClick(row) : undefined}\n >\n {columns.map((col) => (\n <td key={col.key} className=\"gds-pad-x gds-pad-y text-fg\">\n {col.render !== undefined\n ? col.render(row)\n : String(row[col.key] ?? '')\n }\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nexport const DataTable = forwardRef(DataTableInner) as <T extends Record<string, unknown>>(\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({ value, onChange, placeholder = 'Select date', min, max, glass, className }, ref) {\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 'flex gds-h-lg items-center gds-gap-sm gds-radius-button border gds-pad-x text-sm transition-colors',\n focusCls,\n glass === true\n ? cx(glassClass(glass), 'border-white/10 bg-bg/60')\n : 'border-border bg-surface',\n value !== undefined ? 'text-fg' : 'text-fg-muted',\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <svg className=\"h-4 w-4 text-fg-muted\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\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=\"absolute left-0 top-full z-50 mt-1 animate-popup\">\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 = { project: string; device: string; version: string; status: 'failure' | 'pending' | 'success'; timestamp: string }\nexport type DeployLogProps = { entries: DeployLogEntry[]; className?: string }\n\nconst statusCls: Record<DeployLogEntry['status'], string> = { success: 'bg-success/15 text-success', failure: 'bg-danger/15 text-danger', pending: 'bg-warning/15 text-warning' }\n\nexport const DeployLog = forwardRef<HTMLDivElement, DeployLogProps>(\n function DeployLog({ entries, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-radius-popover overflow-hidden border border-border', className)}\n data-component=\"deploy-log\"\n >\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-bg-tertiary/50 text-left gds-text-body text-fg-muted\">\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 key={i} className=\"border-t border-border gds-text-body hover:bg-bg-tertiary/30 transition-colors\">\n <td className=\"px-3 py-1.5 font-medium text-fg\">{e.project}</td>\n <td className=\"px-3 py-1.5 text-fg-muted\">{e.device}</td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted\">{e.version}</td>\n <td className=\"px-3 py-1.5\">\n <span className={cx('rounded-full px-2 py-0.5 text-[10px] font-medium', statusCls[e.status])}>\n {e.status}\n </span>\n </td>\n <td className=\"px-3 py-1.5 text-fg-muted\">{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-b border-border',\n )}\n >\n <dt className=\"font-medium text-fg-muted\">{item.term}</dt>\n <dd className={cx('text-fg', isHorizontal ? '' : 'mt-1')}>{item.description}</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 }, () => Array(n + 1).fill(0))\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({ type: 'unchanged', content: oldLines[i - 1], oldLineNum: i, newLineNum: j })\n i--\n j--\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n result.unshift({ type: 'removed', content: oldLines[i - 1], oldLineNum: i, newLineNum: null })\n i--\n } else {\n result.unshift({ type: 'added', content: newLines[j - 1], oldLineNum: null, newLineNum: j })\n j--\n }\n }\n while (i > 0) {\n result.unshift({ type: 'removed', content: oldLines[i - 1], oldLineNum: i, newLineNum: null })\n i--\n }\n while (j > 0) {\n result.unshift({ type: 'added', content: newLines[j - 1], oldLineNum: null, newLineNum: j })\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=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line.oldLineNum ?? ''}\n </td>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line.newLineNum ?? ''}\n </td>\n <td className=\"w-4 select-none text-center text-fg-muted/70\">\n {linePrefix(line.type)}\n </td>\n <td className=\"whitespace-pre px-2\">{line.content}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nfunction SplitView({ lines, oldTitle, newTitle }: {\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=\"grid grid-cols-2 divide-x divide-border\">\n <div>\n <div className=\"border-b border-border px-3 py-1.5 text-[10px] font-medium text-fg-muted 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 key={idx} className={line !== null ? lineClass(line.type) : ''}>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line?.oldLineNum ?? ''}\n </td>\n <td className=\"whitespace-pre px-2\">{line?.content ?? ''}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div>\n <div className=\"border-b border-border px-3 py-1.5 text-[10px] font-medium text-fg-muted 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 key={idx} className={line !== null ? lineClass(line.type) : ''}>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line?.newLineNum ?? ''}\n </td>\n <td className=\"whitespace-pre px-2\">{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 { oldText, newText, mode = 'unified', oldTitle = 'Old', newTitle = 'New', glass, className },\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 'overflow-auto gds-radius-popover border border-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","// 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({ sender, senderAvatar, subject, preview, timestamp, unread, starred, selected, onClick, className }, ref) {\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={onClick !== undefined ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n } : undefined}\n className={cx(\n 'flex items-start gap-3 gds-pad-x gds-pad-y-sm gds-text-body select-none',\n onClick !== undefined && 'cursor-pointer hover:bg-bg-tertiary',\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=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-tertiary text-xs font-semibold text-fg-muted\">\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 && <span className=\"h-2 w-2 shrink-0 rounded-full bg-accent\" />}\n <span className={cx('truncate', isUnread ? 'font-semibold text-fg' : 'text-fg')}>{sender}</span>\n {starred === true && <span className=\"shrink-0 text-warning\">★</span>}\n </div>\n <div className={cx('truncate', isUnread ? 'font-medium text-fg' : 'text-fg-muted')}>{subject}</div>\n {preview !== undefined && (\n <div className=\"truncate text-fg-muted/60\">{preview}</div>\n )}\n </div>\n\n {/* timestamp */}\n <span className=\"shrink-0 text-xs text-fg-muted\">{timestamp}</span>\n </div>\n )\n },\n)\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>(\n 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 'relative w-full overflow-hidden border border-white/[0.06] gds-radius-card',\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)\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({ avatar, className, department, email, name, phone, role, status, ...props }, ref) {\n const initials = name.split(' ').map((w) => w[0]).join('').slice(0, 2).toUpperCase()\n\n return (\n <div\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\n data-component=\"employee-card\"\n ref={ref}\n {...props}\n >\n <div className=\"flex items-center gds-gap\">\n {avatar !== undefined ? (\n <img src={avatar} alt={name} className=\"h-12 w-12 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent\">\n {initials}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-semibold text-fg truncate\">{name}</div>\n {role !== undefined && <div className=\"text-xs text-fg-muted truncate\">{role}</div>}\n {department !== undefined && <div className=\"text-xs text-fg-muted truncate\">{department}</div>}\n </div>\n {status !== undefined && (\n <span className={cx('shrink-0 rounded-full px-2 py-0.5 text-xs font-medium', statusCls[status])}>\n {status}\n </span>\n )}\n </div>\n {(email !== undefined || phone !== undefined) && (\n <div className=\"mt-3 space-y-0.5 text-xs text-fg-muted\">\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<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n 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=\"flex flex-col items-center justify-center gap-2 gds-pad gds-text-body text-danger\"\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 className=\"h-4 w-4 text-warning\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\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 className=\"h-4 w-4 text-fg-muted\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\">\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({ files, onNavigate, onSelect, selected, className }, ref) {\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('overflow-auto gds-radius-popover border border-border bg-surface', className)}\n data-component=\"file-browser\"\n >\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-bg-secondary/50\">\n <th className=\"gds-pad-x gds-pad-y text-left gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Name\n </th>\n <th className=\"w-24 gds-pad-x gds-pad-y text-right gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Size\n </th>\n <th className=\"w-32 gds-pad-x gds-pad-y text-right gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Modified\n </th>\n </tr>\n </thead>\n <tbody>\n {files.length === 0 && (\n <tr>\n <td colSpan={3} className=\"gds-pad-x py-12 text-center text-sm text-fg-muted\">\n Empty folder\n </td>\n </tr>\n )}\n {files.map((node) => (\n <tr\n key={node.id}\n className={cx(\n 'border-b border-border 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=\"flex items-center gds-gap-sm text-fg\">\n {node.icon ?? (node.type === 'folder' ? <FolderIcon /> : <FileIcon />)}\n <span className={node.type === 'folder' ? 'font-medium' : ''}>\n {node.name}\n </span>\n </div>\n </td>\n <td className=\"gds-pad-x gds-pad-y text-right text-fg-muted\">\n {node.type === 'folder' ? '—' : formatSize(node.size)}\n </td>\n <td className=\"gds-pad-x gds-pad-y text-right text-fg-muted\">\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>(\n function FileCard({ name, size, type, thumbnail, actions, onClick, className }, ref) {\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={isClickable ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick() }\n } : undefined}\n className={cx(\n 'gds-ctx gds-radius-card border border-border bg-surface overflow-hidden select-none',\n isClickable && 'cursor-pointer hover:border-accent/40 transition-colors',\n className,\n )}\n data-component=\"file-card\"\n >\n {thumbnail !== undefined && (\n <div className=\"flex h-28 items-center justify-center bg-bg-tertiary\">\n <img src={thumbnail} alt={name} className=\"h-full w-full object-cover\" />\n </div>\n )}\n <div className=\"gds-pad\">\n <div className=\"truncate font-medium text-fg gds-text-body\">{name}</div>\n <div className=\"mt-1 flex items-center gap-2\">\n {size !== undefined && <span className=\"text-fg-muted gds-text-caption\">{size}</span>}\n {type !== undefined && <Badge>{type}</Badge>}\n </div>\n {actions !== undefined && <div className=\"mt-2 flex gap-1\">{actions}</div>}\n </div>\n </div>\n )\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 htmlFor={id} className=\"flex cursor-pointer items-center gds-gap-sm select-none\">\n <input\n id={id}\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(field.id, e.target.checked)}\n className={cx('h-4 w-4 rounded border-border', focusCls)}\n />\n <span className=\"text-sm text-fg\">{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=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\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=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\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}>{opt}</option>\n ))}\n </select>\n </div>\n )\n }\n\n // text or number\n return (\n <div className=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\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(field.id, e.target.value === '' ? '' : Number(e.target.value))\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 { 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 = 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=\"p-1.5 text-left font-medium text-fg-muted\" />\n {headers.map((h) => (\n <th className=\"p-1.5 text-center font-medium text-fg-muted\" key={h}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"p-1.5 font-medium text-fg\">{row.label}</td>\n {row.values.map((val, i) => {\n const intensity = Math.min(val / resolvedMax, 1)\n return (\n <td\n className=\"p-1.5 text-center tabular-nums text-fg\"\n key={i}\n style={{ backgroundColor: `color-mix(in srgb, var(--color-accent) ${Math.round(intensity * 20)}%, transparent)` }}\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 () => { document.body.style.overflow = prev }\n }, [open])\n\n return (\n <div ref={ref} className={cx('inline-block', className)} data-component=\"image-preview\">\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 && renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\"\n onClick={(e) => { if (e.target === e.currentTarget) handleClose() }}\n data-testid=\"lightbox\"\n >\n {/* close button */}\n <button\n type=\"button\"\n onClick={handleClose}\n className={cx(\n 'absolute right-4 top-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 width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\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 (entry !== undefined && entry.isIntersecting && hasMore && !loading) {\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(defaultExpanded: boolean | number, depth: number): 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({ value, keyName, depth, defaultExpanded }: NodeProps) {\n const [expanded, setExpanded] = useState(() => isExpandedAtDepth(defaultExpanded, depth))\n\n const handleToggle = useCallback(() => {\n setExpanded((prev) => !prev)\n }, [])\n\n // render key prefix\n const keyPrefix = keyName !== undefined ? (\n <span className=\"text-fg\">{keyName}: </span>\n ) : null\n\n // primitives\n if (value === null || value === undefined) {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonNull /></div>\n }\n if (typeof value === 'string') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonString value={value} /></div>\n }\n if (typeof value === 'number') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonNumber value={value} /></div>\n }\n if (typeof value === 'boolean') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonBoolean value={value} /></div>\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=\"cursor-pointer text-fg-muted hover:text-fg\"\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=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n [\n </button>\n </div>\n {value.map((item, idx) => (\n <JsonNode key={idx} value={item} depth={depth + 1} defaultExpanded={defaultExpanded} />\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 <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=\"cursor-pointer text-fg-muted hover:text-fg\"\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=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n {'{'}\n </button>\n </div>\n {entries.map(([k, v]) => (\n <JsonNode key={k} value={v} keyName={k} depth={depth + 1} defaultExpanded={defaultExpanded} />\n ))}\n <div style={{ paddingLeft: `${depth * 16}px` }}>{'}'}</div>\n </div>\n )\n }\n\n // fallback\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}{String(value)}</div>\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 'overflow-auto gds-radius-popover border border-border gds-pad-x gds-pad-y 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=\"inline-block gds-radius-badge bg-bg-tertiary gds-pad-x-sm py-0.5 gds-text-caption font-medium text-fg-muted\">\n {label}\n </span>\n )\n}\n\nfunction KanbanCard({ item }: { item: KanbanItem }) {\n return (\n <div className=\"gds-radius-popover border border-border bg-surface gds-pad-x gds-pad-y transition-colors hover:border-fg-muted/30\">\n <div className=\"text-sm font-medium text-fg\">{item.title}</div>\n {item.description !== undefined && (\n <p className=\"mt-1 gds-text-body text-fg-muted\">{item.description}</p>\n )}\n {item.tags !== undefined && item.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gds-gap-xs\">\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=\"flex w-72 shrink-0 flex-col gds-radius-popover bg-bg-secondary/50 gds-pad-x-sm gds-pad-y\">\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <h3 className=\"gds-text-body font-semibold uppercase tracking-wider text-fg-muted\">\n {column.title}\n </h3>\n <span className=\"gds-text-body text-fg-muted/60\">{column.items.length}</span>\n </div>\n <div className=\"flex flex-1 flex-col gds-gap-sm overflow-y-auto\">\n {column.items.map((item) => (\n <div key={item.id}>\n {renderItem !== undefined ? renderItem(item) : <KanbanCard item={item} />}\n </div>\n ))}\n {column.items.length === 0 && (\n <div className=\"py-8 text-center gds-text-body text-fg-muted/40\">\n No items\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport const Kanban = forwardRef<HTMLDivElement, KanbanProps>(\n function Kanban({ columns, renderItem, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex gds-gap overflow-x-auto p-1', className)}\n data-component=\"kanban\"\n >\n {columns.map((col) => (\n <KanbanColumnView\n key={col.id}\n column={col}\n renderItem={renderItem}\n />\n ))}\n </div>\n )\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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction parseInline(text: string): string {\n let result = escapeHtml(text)\n // code (backtick) — must come before bold/italic\n result = result.replace(/`([^`]+)`/g, '<code class=\"rounded bg-bg-tertiary px-1 py-0.5 font-mono text-[0.85em]\">$1</code>')\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 = ['text-xl', 'text-lg', 'text-base', 'text-sm', 'text-xs', 'text-xs']\n const margins = ['mt-4 mb-2', 'mt-3 mb-2', 'mt-3 mb-1', 'mt-2 mb-1', 'mt-2 mb-1', 'mt-2 mb-1']\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 without external deps\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { parseMarkdown } from './markdown-parser'\n\nexport type MarkdownPreviewProps = {\n content: string\n glass?: boolean\n className?: string\n}\n\nexport const MarkdownPreview = forwardRef<HTMLDivElement, MarkdownPreviewProps>(\n function MarkdownPreview({ content, glass, className }, ref) {\n const html = useMemo(() => parseMarkdown(content), [content])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover gds-pad-x gds-pad-y text-sm text-fg 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('flex gap-px rounded-lg border border-border bg-surface overflow-hidden', className)}\n data-component=\"markdown-editor\"\n >\n <textarea\n className=\"flex-1 resize-none bg-transparent p-3 text-sm text-fg outline-none font-mono min-h-[200px]\"\n value={value}\n onChange={handleChange}\n placeholder={placeholder}\n />\n <div className=\"w-px bg-border\" />\n <div className=\"flex-1 overflow-auto min-h-[200px]\">\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 onDismiss?: (id: string) => void\n}\n\nexport const NotificationCenter = forwardRef<HTMLDivElement, NotificationCenterProps>(\n function NotificationCenter(\n {\n className,\n emptyMessage = 'No notifications',\n glass,\n notifications,\n onClear,\n onDismiss,\n ...props\n },\n ref,\n ) {\n const hasItems = notifications.length > 0\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col gds-radius-popover border border-border',\n glass === true ? cx(glassClass(glass), 'border-white/10 bg-bg/60') : 'bg-surface',\n className,\n )}\n data-component=\"notification-center\"\n {...props}\n >\n <div className=\"flex items-center justify-between border-b border-border gds-pad-x gds-pad-y-sm\">\n <span className=\"gds-text-body font-medium text-fg select-none\">Notifications</span>\n {hasItems && onClear !== undefined && (\n <button\n type=\"button\"\n onClick={onClear}\n className={cx('gds-text-label text-accent hover:text-accent-hover', focusCls)}\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {hasItems ? (\n <div className=\"flex flex-col gds-gap-sm gds-pad\">\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={onDismiss !== undefined ? () => onDismiss(n.id) : undefined}\n />\n ))}\n </div>\n ) : (\n <div className=\"flex items-center justify-center gds-pad-lg\">\n <span className=\"gds-text-label text-fg-muted\">{emptyMessage}</span>\n </div>\n )}\n </div>\n </div>\n )\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 onDismiss: (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<HTMLDivElement, NotificationToastProps>(\n function NotificationToast({ toasts, onDismiss, position = 'top-right', className }, ref) {\n useEffect(() => {\n const timers = toasts.map((t) =>\n window.setTimeout(() => onDismiss(t.id), 5000),\n )\n return () => timers.forEach((id) => window.clearTimeout(id))\n }, [toasts, onDismiss])\n\n if (toasts.length === 0) return null\n\n return renderPortal(\n <div\n ref={ref}\n className={cx('fixed z-50 flex w-80 flex-col gap-2', positionMap[position], className)}\n data-component=\"notification-toast\"\n >\n {toasts.map((t) => (\n <Toast key={t.id} title={t.title} description={t.message} variant={variantToToast(t.variant)} onClose={() => onDismiss(t.id)} />\n ))}\n </div>,\n )\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({ children, speed = 0.5, direction = 'vertical', disabled = false, className }, ref) {\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 = direction === 'vertical'\n ? -rect.top * speed\n : -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 = 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({ className, currency = '\\u00a5', deductions, gross, net, period, ...props }, ref) {\n const fmt = (n: number) => `${currency}${n.toLocaleString()}`\n\n return (\n <div\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\n data-component=\"payslip-card\"\n ref={ref}\n {...props}\n >\n <div className=\"mb-3 font-semibold text-fg\">{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=\"my-2 border-t border-border\" />\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<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\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({ roles, permissions, values, onChange, readonly, className, ...props }, ref) {\n return (\n <div ref={ref} className={cx('overflow-auto', className)} data-component=\"permission-matrix\" {...props}>\n <table className=\"w-full border-collapse gds-text-body\">\n <thead>\n <tr>\n <th className=\"border border-border bg-bg-secondary px-3 py-2 text-left text-fg-muted font-medium select-none\">Permission</th>\n {roles.map((role) => (\n <th key={role} className=\"border border-border bg-bg-secondary px-3 py-2 text-center text-fg-muted font-medium select-none\">{role}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {permissions.map((perm, pi) => (\n <tr key={perm}>\n <td className=\"border border-border px-3 py-2 text-fg select-none\">{perm}</td>\n {roles.map((_, ri) => {\n const checked = values[pi]?.[ri] ?? false\n return (\n <td key={ri} className=\"border border-border px-3 py-2 text-center\">\n {readonly === true ? (\n <span className={checked ? 'text-success' : 'text-fg-muted'}>{checked ? '✓' : '—'}</span>\n ) : (\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange?.(pi, ri, e.target.checked)}\n className=\"cursor-pointer accent-accent\"\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<HTMLDivElement, 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=\"absolute top-3 right-4 left-4 h-0.5 bg-border\" />\n\n {/* progress line */}\n {lastCompletedIdx >= 0 && milestones.length > 1 && (\n <div\n className=\"absolute top-3 left-4 h-0.5 bg-accent\"\n style={{\n width: `${(lastCompletedIdx / (milestones.length - 1)) * 100}%`,\n }}\n />\n )}\n\n {milestones.map((milestone, i) => (\n <div\n key={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-xs font-medium text-fg\">\n {milestone.label}\n </span>\n {/* date */}\n <span className=\"gds-text-body text-fg-muted\">{milestone.date}</span>\n </div>\n ))}\n </div>\n </div>\n )\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('gds-radius-popover border border-border overflow-hidden', className)}\n data-component=\"property-editor\"\n >\n {properties.map((prop, i) => (\n <div\n key={prop.key}\n className={cx(\n 'flex items-center justify-between gds-pad-x gds-pad-y-sm',\n i < properties.length - 1 && 'border-b border-border',\n )}\n >\n <span className=\"gds-text-body font-medium text-fg-muted\">{prop.key}</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 'flex flex-col items-center gap-2 rounded-lg border border-border bg-surface p-4 text-fg transition-colors hover:bg-bg-secondary',\n focusCls,\n )}\n {...(link.href !== undefined ? { href: link.href } : {})}\n onClick={link.onClick}\n >\n {link.icon !== undefined && <div className=\"text-fg-muted\">{link.icon}</div>}\n <span className=\"text-xs font-medium select-none\">{link.label}</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({ className, items, title = 'Recent Activity', ...props }, ref) {\n return (\n <div className={cx('flex flex-col', className)} data-component=\"recent-activity\" ref={ref} {...props}>\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-fg-muted\">{title}</h3>\n <div className=\"flex flex-col gap-1\">\n {items.map((item, i) => (\n <div className=\"flex items-baseline justify-between gap-2 py-1 text-sm\" key={i}>\n <div className=\"min-w-0 truncate\">\n <span className=\"font-medium text-fg\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n </div>\n <span className=\"shrink-0 text-xs text-fg-muted\">{item.timestamp}</span>\n </div>\n ))}\n {items.length === 0 && (\n <p className=\"py-2 text-center text-xs text-fg-muted\">No activity</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({ children, breakpoint = 'md', gap = 'default', align = 'stretch', className }, ref) {\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\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n function Table({ striped, compact, hoverable = true, glass, className, children, ...props }, ref) {\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 overflow-hidden border border-border',\n glassClass(glass),\n striped && '[&_tbody_tr:nth-child(even)]:bg-bg-secondary/30',\n compact && '[&_th]:px-2 [&_th]:py-1 [&_td]:px-2 [&_td]:py-1',\n !compact && '[&_th]:gds-pad-x [&_th]:py-1.5 [&_td]:gds-pad-x [&_td]:gds-pad-y',\n hoverable && '[&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-bg-tertiary/30',\n '[&_th]:bg-bg-tertiary/50 [&_th]:text-left [&_th]:font-medium [&_th]:text-fg-muted [&_th]:border-b [&_th]:border-border [&_th]:gds-text-body',\n '[&_td]:border-b [&_td]:border-border [&_td]:gds-text-body [&_tbody_tr:last-child_td]:border-0',\n className,\n )}\n >\n <table ref={ref} className=\"w-full\" {...props}>\n {children}\n </table>\n </div>\n )\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 = typeof window !== 'undefined' ? window.matchMedia('(max-width: 1023px)') : 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(subscribeMobile, getIsMobile, () => false)\n\n if (isMobile) {\n return (\n <div\n className={cx('flex flex-col gds-gap', 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-border gds-pad',\n glassClass(glass),\n )}\n >\n {columns.map((col) => (\n <div key={col.key} className=\"flex justify-between gds-pad-y-sm\">\n <span className=\"gds-text-caption font-medium text-fg-muted\">{col.header}</span>\n <span className=\"gds-text-body text-fg\">{String(row[col.key] ?? '')}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div data-component=\"responsive-table\" data-mode=\"table\" ref={ref} {...props}>\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({ options, value, focusedIndex, glass, onSelect, onFocus }: RichSelectListProps) {\n return (\n <div\n role=\"listbox\"\n className={cx(\n 'absolute z-50 mt-1 w-full gds-radius-popover border border-border bg-bg shadow-lg overflow-auto max-h-60',\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 items-start gap-2 px-3 py-2 cursor-pointer transition-colors',\n opt.value === value && 'bg-accent/10 text-accent',\n i === focusedIndex && 'bg-bg-tertiary/50',\n opt.value !== value && i !== focusedIndex && 'hover:bg-bg-tertiary/30',\n )}\n onClick={() => onSelect(opt.value)}\n onMouseEnter={() => onFocus(i)}\n >\n {opt.icon !== undefined && <span className=\"mt-0.5 shrink-0\">{opt.icon}</span>}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm truncate\">{opt.label}</div>\n {opt.description !== undefined && (\n <div className=\"text-xs text-fg-muted truncate\">{opt.description}</div>\n )}\n </div>\n {opt.badge !== undefined && (\n <span className=\"shrink-0 rounded-full bg-bg-tertiary px-2 py-0.5 text-[10px] text-fg-muted\">\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({ options, value, onChange, placeholder, disabled, error, glass, className }, ref) {\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 (containerRef.current !== null && !containerRef.current.contains(e.target as Node)) {\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((val: string) => {\n onChange(val)\n setOpen(false)\n }, [onChange])\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 'flex w-full items-center gap-2 gds-radius-input border gds-pad-x gds-h-lg text-sm text-left transition-colors',\n error ? 'border-danger' : 'border-border hover:border-fg-muted',\n disabled && 'opacity-50 cursor-not-allowed',\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 && <span className=\"shrink-0\">{selected.icon}</span>}\n <span className=\"flex-1 truncate text-fg\">{selected.label}</span>\n </>\n ) : (\n <span className=\"flex-1 truncate text-fg-muted\">{placeholder ?? 'Select...'}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 shrink-0 text-fg-muted\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\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 ref={ref} className={cx('flex flex-col', className)} data-component=\"search-results\">\n {total !== undefined && (\n <div className=\"gds-pad-x py-2 text-xs text-fg-muted\">\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={onSelect !== undefined ? () => onSelect(result.id) : undefined}\n onKeyDown={onSelect !== undefined ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelect(result.id) }\n } : undefined}\n className={cx(\n 'gds-pad-x gds-pad-y border-b border-border last:border-b-0',\n onSelect !== undefined && 'cursor-pointer hover:bg-bg-tertiary transition-colors',\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Highlight text={result.title} query={query} className=\"font-medium text-fg gds-text-body\" />\n {result.category !== undefined && <Badge>{result.category}</Badge>}\n </div>\n {result.description !== undefined && (\n <Highlight text={result.description} query={query} className=\"mt-0.5 text-fg-muted gds-text-caption line-clamp-2\" />\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({ name, description, status, metrics, tags, url, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\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=\"font-semibold text-fg\">{name}</span>\n <span className=\"ml-auto text-xs text-fg-muted\">{statusLabel[status]}</span>\n </div>\n\n {description !== undefined && (\n <p className=\"mt-1.5 gds-text-body text-fg-muted\">{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=\"font-medium text-fg\">{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 key={tag} className=\"rounded-full bg-bg-tertiary px-2 py-0.5 text-[10px] text-fg-muted\">\n {tag}\n </span>\n ))}\n {url !== undefined && (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className=\"ml-auto text-xs text-accent hover:underline\">\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(\n ctx: CanvasRenderingContext2D,\n point: Point,\n): 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 { beginStroke, canvasToDataUrl, clearCanvas, continueStroke, getCanvasPosition }\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 { beginStroke, canvasToDataUrl, clearCanvas, continueStroke, getCanvasPosition } from './signature-drawing'\n\ntype SignaturePadProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\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(\n (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 )\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 inline-flex flex-col gap-2 gds-radius-popover border border-border bg-surface 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=\"block cursor-crosshair rounded border border-border/50 bg-bg\"\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=\"select-none text-xs text-fg-muted/50\">Sign above</span>\n </div>\n )}\n </div>\n <div className=\"flex justify-end\">\n <button\n className={cx(\n 'rounded px-2.5 py-1 text-xs text-fg-muted transition-colors hover:bg-fg-muted/10 hover:text-fg',\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=\"h-4 w-4 text-fg-muted/50\"\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 'flex items-center gds-gap border-b border-border px-2 py-2 transition-opacity',\n dragIndex === index && 'opacity-50',\n dropIndex === index && 'border-t-2 border-t-accent',\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({ columns, data, defaultSort, className, ...props }, ref) {\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 ref={ref} className={cx('overflow-hidden rounded-lg border border-border', className)} data-component=\"sortable-table\" {...props}>\n <table className=\"w-full text-left gds-text\">\n <thead>\n <tr className=\"border-b border-border bg-bg-tertiary/50\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'px-3 py-1.5 font-medium text-fg-muted',\n col.sortable !== false && 'cursor-pointer select-none hover:text-fg',\n )}\n onClick={col.sortable !== false ? () => toggleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {sort?.key === col.key && (\n <span className=\"text-[10px]\">{sort.dir === 'asc' ? '▲' : '▼'}</span>\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.map((row, i) => (\n <tr key={i} className=\"border-b border-border last:border-0 transition-colors hover:bg-bg-tertiary/30\">\n {columns.map((col) => (\n <td key={col.key} className=\"px-3 py-1.5 text-fg\">\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 { ...base, bottom: window.innerHeight - rect.top + gap, left: rect.left }\n }\n if (placement === 'left') {\n return { ...base, top: rect.top, right: window.innerWidth - rect.left + gap }\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=\"z-[9999] max-w-xs rounded-lg border border-white/10 bg-bg-secondary p-4 shadow-lg\"\n style={computeCardStyle(rect, placement)}\n onClick={(e) => e.stopPropagation()}\n >\n {title !== undefined && (\n <p className=\"text-sm font-semibold text-fg\">{title}</p>\n )}\n {description !== undefined && (\n <p className=\"mt-1 text-xs text-fg-muted\">{description}</p>\n )}\n {onClose !== undefined && (\n <button\n className=\"mt-3 text-xs font-medium text-accent hover:text-accent/80\"\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 'overflow-hidden gds-radius-card border border-border',\n glass === true && 'bg-white/5 backdrop-blur-md',\n className,\n )}\n >\n {header !== undefined && (\n <div className=\"border-b border-border bg-bg-tertiary/30 px-4 py-2.5\">{header}</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={onSelect !== undefined ? () => onSelect(item.id) : undefined}\n className={cx(\n dividers === true && i < items.length - 1 && 'border-b border-border/50',\n )}\n />\n ))}\n </div>\n {footer !== undefined && (\n <div className=\"border-t border-border 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={i} className=\"flex items-center gap-2\">\n {i > 0 && <div className={cx('h-px w-8', i <= current ? 'bg-accent' : 'bg-border')} />}\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-2 border-accent text-accent',\n i > current && 'border border-border text-fg-muted',\n )}\n >\n {i < current ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7l3 3 5-6\" />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span className={cx('text-xs', i === current ? 'font-medium text-fg' : 'text-fg-muted')}>\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 'h-8 gds-radius-button px-3 text-xs font-medium text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={handleBack}\n >\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'h-8 gds-radius-button bg-accent px-3 text-xs font-medium text-accent-fg transition-colors hover:bg-accent/90',\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('flex flex-col gds-gap', 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=\"flex items-center justify-between gds-text-label\">\n <span className=\"text-fg\">{m.label}</span>\n <span className=\"text-fg-muted font-mono tabular-nums\">\n {m.value}{m.unit ?? ''} / {max}{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 'rounded-full px-3 py-1 gds-text-body 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>(\n function TaskBoard({ className, onToggle, sections, ...props }, ref) {\n return (\n <div className={cx('flex flex-col gds-gap', className)} data-component=\"task-board\" ref={ref} {...props}>\n {sections.map((section) => (\n <div className=\"rounded-lg border border-border bg-surface gds-pad\" key={section.id}>\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-fg-muted\">{section.title}</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={onToggle !== undefined ? () => onToggle(section.id, item.id) : undefined}\n priority={item.priority}\n title={item.title}\n />\n ))}\n {section.items.length === 0 && (\n <p className=\"py-2 text-center text-xs text-fg-muted\">No items</p>\n )}\n </div>\n </div>\n ))}\n </div>\n )\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\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=\"absolute left-[7px] top-2 bottom-2 w-px bg-border\" />\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=\"relative flex gds-gap pl-6\">\n {/* dot */}\n <div className=\"absolute left-0 top-1.5\">\n {item.icon !== undefined ? (\n <span className=\"flex h-[15px] w-[15px] items-center justify-center text-fg-muted\">\n {item.icon}\n </span>\n ) : (\n <span className={cx(\n 'block h-[15px] w-[15px] gds-radius-badge border-2 border-bg',\n dotColors[variant],\n )} />\n )}\n </div>\n\n {/* content */}\n <div className=\"min-w-0 flex-1 pb-1\">\n <div className=\"flex items-baseline justify-between gds-gap-sm\">\n <span className=\"text-sm font-medium text-fg\">{item.title}</span>\n {item.date !== undefined && (\n <span className=\"shrink-0 gds-text-body text-fg-muted\">{item.date}</span>\n )}\n </div>\n {item.description !== undefined && (\n <p className=\"mt-0.5 gds-text-body text-fg-muted\">{item.description}</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>(\n function Tour({ steps, active, onComplete, onSkip, className }, ref) {\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=\"pointer-events-none fixed gds-radius ring-2 ring-accent 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 'w-96 gds-radius border border-border bg-surface shadow-2xl transition-all duration-200 select-none',\n entering ? 'scale-95 opacity-0' : 'scale-100 opacity-100',\n targetRect === null && '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=\"h-1 overflow-hidden rounded-t-xl bg-bg-tertiary\">\n <div\n className=\"h-full bg-accent 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-[10px] tracking-widest text-fg-muted/40 uppercase\">\n Step {current + 1} of {steps.length}\n </span>\n {onSkip !== undefined && (\n <button\n type=\"button\"\n className={cx('gds-radius-button p-1 text-fg-muted/40 transition-colors hover:text-fg', focusCls)}\n onClick={handleSkip}\n aria-label=\"Close tour\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\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-base font-semibold text-fg\">{step.title}</div>\n <p className=\"mt-2 text-sm leading-relaxed text-fg-muted\">\n {step.description}\n </p>\n {step.image !== undefined && (\n <div className=\"mt-3 overflow-hidden gds-radius border border-border/30\">\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 ? 'w-5 bg-accent'\n : 'w-2 bg-fg-muted/20 hover:bg-fg-muted/40',\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 'flex h-8 items-center gap-1 gds-radius-button px-3 text-xs text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={handlePrev}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 3L5 8l5 5\" />\n </svg>\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'flex h-8 items-center gap-1 gds-radius-button bg-accent px-4 text-xs font-medium text-accent-fg transition-colors hover:bg-accent/90',\n focusCls,\n )}\n onClick={handleNext}\n >\n {isLast ? 'Done' : 'Next'}\n {!isLast && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3l5 5-5 5\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\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('flex flex-col divide-y divide-border', 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 className=\"flex items-center justify-between px-3 py-2.5\" key={tx.id}>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-fg\">{tx.description}</span>\n <span className=\"text-xs text-fg-muted\">{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('h-3 w-3 shrink-0 text-fg-muted transition-transform', expanded && 'rotate-90')}\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 'flex w-full items-center gds-gap-sm gds-radius-button gds-pad-x-sm gds-pad-y-sm text-sm select-none',\n isSelected ? 'bg-accent/10 text-accent' : '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=\"shrink-0 text-fg-muted\">{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>(\n function Tree({ nodes, onSelect, selected, defaultExpanded, className }, ref) {\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('flex flex-col gds-gap-xs', 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)\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 x1=\"12\" y1=\"5\" x2=\"12\" y2=\"11\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\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 d=\"M11 4c1.5 1 2 2.5 2 4s-.5 3-2 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\n\nfunction FullscreenIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\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('relative h-1 flex-1 cursor-pointer rounded-full bg-white/30', focusCls)}\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 className=\"select-none text-xs text-white/80\" data-testid=\"time-display\">\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 {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} 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 'relative overflow-hidden gds-radius-card',\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\n ref={innerRef}\n style={{ height: totalHeight, position: 'relative' }}\n >\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({ className, condition, icon, location, temp, unit = 'C', ...props }, ref) {\n return (\n <div\n className={cx(\n 'inline-flex items-center gap-4 rounded-xl border border-border bg-surface p-4 select-none',\n className,\n )}\n data-component=\"weather-widget\"\n ref={ref}\n {...props}\n >\n {icon !== undefined && <div className=\"text-2xl text-fg-muted\">{icon}</div>}\n <div className=\"flex flex-col\">\n <span className=\"text-2xl font-bold text-fg leading-tight\">\n {temp}&deg;{unit}\n </span>\n <span className=\"text-sm text-fg-muted\">{condition}</span>\n <span className=\"text-xs text-fg-muted/70\">{location}</span>\n </div>\n </div>\n )\n },\n)\n\nexport type { WeatherWidgetProps }\n"],"mappings":"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"}