@goliapkg/gds 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"l3-atoms-BCJNqPHk.js","names":[],"sources":["../src/l3-atoms/animated-border.tsx","../src/l3-atoms/animated-counter.tsx","../src/l3-atoms/animated-number.tsx","../src/l3-atoms/avatar-badge.tsx","../src/l3-atoms/barcode.tsx","../src/l3-atoms/blinking.tsx","../src/l3-atoms/bounce-dot.tsx","../src/l3-atoms/checkbox-group.tsx","../src/l3-atoms/color-swatch.tsx","../src/l3-atoms/copy-button.tsx","../src/l3-atoms/count-badge.tsx","../src/l3-atoms/count-up.tsx","../src/l3-atoms/countdown.tsx","../src/l3-atoms/countdown-badge.tsx","../src/l3-atoms/cursor-follow.tsx","../src/l3-atoms/diff-indicator.tsx","../src/l3-atoms/glow-dot.tsx","../src/l3-atoms/gradient-text.tsx","../src/l3-atoms/heat-cell.tsx","../src/l3-atoms/hotkey.tsx","../src/l3-atoms/info-tip.tsx","../src/l3-atoms/key-value.tsx","../src/l3-atoms/keyboard-shortcut.tsx","../src/l3-atoms/live-dot.tsx","../src/l3-atoms/magnetic-button.tsx","../src/l3-atoms/marquee.tsx","../src/l3-atoms/meter.tsx","../src/l3-atoms/number-flow.tsx","../src/l3-atoms/online-indicator.tsx","../src/l3-atoms/orbit.tsx","../src/l3-atoms/percentage.tsx","../src/l3-atoms/percentage-circle.tsx","../src/l3-atoms/price.tsx","../src/l3-atoms/progress-circle.tsx","../src/l3-atoms/progress-ring.tsx","../src/l3-atoms/pulse-indicator.tsx","../src/l3-atoms/pulse-ring.tsx","../src/l3-atoms/qr-code.tsx","../src/l3-atoms/quick-action.tsx","../src/l3-atoms/radio-group.tsx","../src/l3-atoms/rating.tsx","../src/l3-atoms/relative-time.tsx","../src/l3-atoms/ribbon.tsx","../src/l3-atoms/ribbon-banner.tsx","../src/l3-atoms/ripple-effect.tsx","../src/l3-atoms/scroll-progress.tsx","../src/l3-atoms/scroll-to-top.tsx","../src/l3-atoms/segmented-control.tsx","../src/l3-atoms/shortcut-display.tsx","../src/l3-atoms/skeleton-group.tsx","../src/l3-atoms/sparkle.tsx","../src/l3-atoms/stagger.tsx","../src/l3-atoms/star-rating.tsx","../src/l3-atoms/status-badge.tsx","../src/l3-atoms/status-dot.tsx","../src/l3-atoms/switch-group.tsx","../src/l3-atoms/text-badge.tsx","../src/l3-atoms/text-effect.tsx","../src/l3-atoms/textarea-counter.tsx","../src/l3-atoms/theme-toggle.tsx","../src/l3-atoms/toggle-group.tsx","../src/l3-atoms/trend-arrow.tsx","../src/l3-atoms/trend-indicator.tsx","../src/l3-atoms/truncated-list.tsx","../src/l3-atoms/typewriter.tsx","../src/l3-atoms/verified-badge.tsx","../src/l3-atoms/visual-counter.tsx","../src/l3-atoms/volume-slider.tsx","../src/l3-atoms/zoom-on-hover.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedBorderProps = {\n children: ReactNode\n className?: string\n variant?: 'dash' | 'gradient' | 'pulse'\n}\n\nconst variantClasses = {\n dash: 'border-2 border-dashed border-accent/40 animate-[dash-march_1s_linear_infinite]',\n gradient:\n 'border-0 bg-gradient-to-r from-accent via-success to-accent bg-[length:200%_100%] animate-[gradient-shift_3s_ease_infinite] p-[2px]',\n pulse:\n 'border-2 border-accent animate-[border-pulse_2s_ease-in-out_infinite]',\n}\n\nexport function AnimatedBorder({\n children,\n className,\n variant = 'gradient',\n}: AnimatedBorderProps) {\n if (variant === 'gradient') {\n return (\n <div\n className={cx('rounded-lg', variantClasses.gradient, className)}\n data-component=\"animated-border\"\n >\n <div className=\"bg-bg rounded-[calc(0.5rem-2px)]\">{children}</div>\n </div>\n )\n }\n return (\n <div\n className={cx('rounded-lg', variantClasses[variant], className)}\n data-component=\"animated-border\"\n >\n {children}\n </div>\n )\n}\n\nexport type { AnimatedBorderProps }\n","// animated-counter — number display with animated transitions\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedCounterProps = React.HTMLAttributes<HTMLSpanElement> & {\n duration?: number\n format?: (n: number) => string\n prefix?: string\n suffix?: string\n value: number\n}\n\nconst defaultFormat = (n: number): string => {\n if (Number.isInteger(n)) return n.toLocaleString()\n return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n}\n\nexport const AnimatedCounter = forwardRef<\n HTMLSpanElement,\n AnimatedCounterProps\n>(function AnimatedCounter(\n {\n className,\n duration = 500,\n format = defaultFormat,\n prefix,\n suffix,\n value,\n ...props\n },\n ref\n) {\n const [display, setDisplay] = useState(value)\n const prevRef = useRef(value)\n const rafRef = useRef<number>(0)\n\n useEffect(() => {\n const from = prevRef.current\n const to = value\n prevRef.current = to\n\n if (from === to) return\n\n const startTime = performance.now()\n const diff = to - from\n\n const animate = (now: number) => {\n const elapsed = now - startTime\n const progress = Math.min(1, elapsed / duration)\n // ease out cubic\n const eased = 1 - Math.pow(1 - progress, 3)\n setDisplay(from + diff * eased)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setDisplay(to)\n }\n }\n\n rafRef.current = requestAnimationFrame(animate)\n return () => cancelAnimationFrame(rafRef.current)\n }, [value, duration])\n\n return (\n <span\n className={cx('tabular-nums select-none', className)}\n data-component=\"animated-counter\"\n ref={ref}\n {...props}\n >\n {prefix !== undefined && <span>{prefix}</span>}\n {format(display)}\n {suffix !== undefined && <span>{suffix}</span>}\n </span>\n )\n})\n\nexport type { AnimatedCounterProps }\n","// animated-number — number display that animates when value changes\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type AnimatedNumberProps = {\n value: number\n duration?: number\n format?: (n: number) => string\n className?: string\n}\n\nfunction defaultFormat(n: number): string {\n return n.toLocaleString()\n}\n\nfunction easeOut(t: number): number {\n return 1 - Math.pow(1 - t, 3)\n}\n\nexport const AnimatedNumber = forwardRef<HTMLSpanElement, AnimatedNumberProps>(\n function AnimatedNumber(\n { value, duration = 500, format = defaultFormat, className },\n ref\n ) {\n const [display, setDisplay] = useState(value)\n const prevRef = useRef(value)\n\n useEffect(() => {\n const from = prevRef.current\n prevRef.current = value\n\n if (duration <= 0) {\n setDisplay(value)\n return\n }\n\n const start = performance.now()\n let raf: number\n\n function tick(now: number) {\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n setDisplay(from + (value - from) * easeOut(progress))\n if (progress < 1) {\n raf = requestAnimationFrame(tick)\n }\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, duration])\n\n return (\n <span\n ref={ref}\n className={cx('tabular-nums', className)}\n data-component=\"animated-number\"\n >\n {format(display)}\n </span>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { cx } from '../utils/cx'\nimport type { AvatarProps } from './avatar'\nimport { Avatar } from './avatar'\n\ntype AvatarBadgeProps = AvatarProps & {\n count?: number\n maxCount?: number\n}\n\nexport const AvatarBadge = forwardRef<HTMLSpanElement, AvatarBadgeProps>(\n function AvatarBadge(\n { count, maxCount = 99, className, ...avatarProps },\n ref\n ) {\n const showBadge = count !== undefined && count > 0\n\n return (\n <span\n className={cx('relative inline-flex', className)}\n data-component=\"avatar-badge\"\n ref={ref}\n >\n <Avatar {...avatarProps} />\n {showBadge && (\n <Badge\n className=\"absolute -top-1 -right-1 z-10\"\n count={count}\n countMax={maxCount}\n />\n )}\n </span>\n )\n }\n)\n\nexport type { AvatarBadgeProps }\n","// barcode — simple barcode display using SVG (code 128 style appearance)\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BarcodeProps = {\n value: string\n width?: number\n height?: number\n showValue?: boolean\n color?: string\n className?: string\n}\n\n// generate bar pattern from character codes\nfunction generateBars(value: string): number[] {\n const bars: number[] = []\n\n // start pattern — thick bars\n bars.push(3, 1, 1, 1, 3, 1)\n\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i)\n // alternate thick/thin based on char code bits\n bars.push(\n (code & 1) !== 0 ? 2 : 1,\n (code & 2) !== 0 ? 2 : 1,\n (code & 4) !== 0 ? 2 : 1,\n (code & 8) !== 0 ? 2 : 1,\n (code & 16) !== 0 ? 2 : 1,\n 1\n )\n }\n\n // stop pattern — thick bars\n bars.push(3, 1, 1, 1, 3)\n\n return bars\n}\n\nexport const Barcode = forwardRef<SVGSVGElement, BarcodeProps>(function Barcode(\n {\n value,\n width = 200,\n height = 60,\n showValue = true,\n color = 'currentColor',\n className,\n },\n ref\n) {\n const bars = useMemo(() => generateBars(value), [value])\n\n const totalUnits = bars.reduce((sum, b) => sum + b, 0)\n const barHeight = showValue ? height - 16 : height\n const unitWidth = width / totalUnits\n\n let x = 0\n const rects: Array<{ x: number; w: number }> = []\n for (let i = 0; i < bars.length; i++) {\n const w = bars[i] * unitWidth\n // even indices are bars, odd are spaces\n if (i % 2 === 0) {\n rects.push({ x, w })\n }\n x += w\n }\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('shrink-0', className)}\n data-component=\"barcode\"\n data-testid=\"barcode-svg\"\n role=\"img\"\n aria-label={`Barcode: ${value}`}\n >\n {rects.map((r, i) => (\n <rect\n key={i}\n x={r.x}\n y={0}\n width={r.w}\n height={barHeight}\n fill={color}\n />\n ))}\n {showValue && (\n <text\n x={width / 2}\n y={height - 2}\n textAnchor=\"middle\"\n fontSize={11}\n fill={color}\n fontFamily=\"monospace\"\n data-testid=\"barcode-text\"\n >\n {value}\n </text>\n )}\n </svg>\n )\n})\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst speedMap = {\n default: 'animate-pulse',\n fast: 'animate-pulse [animation-duration:0.5s]',\n slow: 'animate-pulse [animation-duration:3s]',\n} as const\n\ntype BlinkingSpeed = 'slow' | 'default' | 'fast'\n\ntype BlinkingProps = React.HTMLAttributes<HTMLSpanElement> & {\n active?: boolean\n speed?: BlinkingSpeed\n}\n\nexport const Blinking = forwardRef<HTMLSpanElement, BlinkingProps>(\n function Blinking(\n { active = true, children, className, speed = 'default', ...props },\n ref\n ) {\n return (\n <span\n className={cx(active && speedMap[speed], className)}\n data-component=\"blinking\"\n ref={ref}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { BlinkingProps, BlinkingSpeed }\n","// bounce-dot — bouncing dot loader animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype BounceDotProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n count?: number\n size?: 'default' | 'lg' | 'sm'\n}\n\nconst sizeClasses = {\n default: 'h-2 w-2',\n lg: 'h-3 w-3',\n sm: 'h-1.5 w-1.5',\n} as const\n\nexport const BounceDot = forwardRef<HTMLDivElement, BounceDotProps>(\n function BounceDot(\n { className, color, count = 3, size = 'default', ...props },\n ref\n ) {\n const dots = Array.from({ length: count }, (_, i) => i)\n\n return (\n <div\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"bounce-dot\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n {dots.map((i) => (\n <span\n className={cx(\n 'bg-fg-muted animate-[bounce-dot_1.4s_ease-in-out_infinite] rounded-full',\n sizeClasses[size]\n )}\n key={i}\n style={{\n animationDelay: `${i * 160}ms`,\n ...(color !== undefined ? { backgroundColor: color } : {}),\n }}\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { BounceDotProps }\n","// checkbox-group — group of checkboxes with optional select-all\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Checkbox } from './checkbox'\n\ntype CheckboxGroupOption = {\n label: string\n value: string\n}\n\ntype CheckboxGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n disabled?: boolean\n onChange: (value: string[]) => void\n options: CheckboxGroupOption[]\n selectAll?: boolean\n value: string[]\n}\n\nexport const CheckboxGroup = forwardRef<HTMLDivElement, CheckboxGroupProps>(\n function CheckboxGroup(\n {\n className,\n disabled = false,\n onChange,\n options,\n selectAll = false,\n value,\n ...props\n },\n ref\n ) {\n const allSelected =\n options.length > 0 && options.every((o) => value.includes(o.value))\n\n const handleToggle = (optValue: string, checked: boolean) => {\n if (checked) {\n onChange([...value, optValue])\n } else {\n onChange(value.filter((v) => v !== optValue))\n }\n }\n\n const handleSelectAll = (checked: boolean) => {\n if (checked) {\n onChange(options.map((o) => o.value))\n } else {\n onChange([])\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"checkbox-group\"\n role=\"group\"\n {...props}\n >\n {selectAll && (\n <Checkbox\n checked={allSelected}\n disabled={disabled}\n label=\"Select all\"\n onChange={handleSelectAll}\n />\n )}\n {options.map((opt) => (\n <Checkbox\n checked={value.includes(opt.value)}\n disabled={disabled}\n key={opt.value}\n label={opt.label}\n onChange={(checked) => handleToggle(opt.value, checked)}\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { CheckboxGroupOption, CheckboxGroupProps }\n","// color-swatch — color display block with optional copy-to-clipboard\nimport { cva } from 'class-variance-authority'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst colorSwatchVariants = cva('rounded-md', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-10 w-10',\n lg: 'h-14 w-14',\n sm: 'h-7 w-7',\n },\n },\n})\n\ntype ColorSwatchProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof colorSwatchVariants> & {\n color: string\n copyable?: boolean\n label?: string\n }\n\nexport const ColorSwatch = forwardRef<HTMLSpanElement, ColorSwatchProps>(\n function ColorSwatch(\n { className, color, copyable = false, label, size, ...props },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleClick = useCallback(async () => {\n if (!copyable) return\n await navigator.clipboard.writeText(color)\n setCopied(true)\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n timerRef.current = setTimeout(() => {\n setCopied(false)\n timerRef.current = null\n }, 2000)\n }, [color, copyable])\n\n const swatchEl = (\n <span\n className={cx(colorSwatchVariants({ size }), 'block')}\n style={{ backgroundColor: color }}\n />\n )\n\n return (\n <span\n className={cx('inline-flex flex-col items-center gap-1', className)}\n data-component=\"color-swatch\"\n ref={ref}\n {...props}\n >\n {copyable ? (\n <button\n aria-label={`Copy ${color}`}\n className={cx('rounded-md select-none', focusCls)}\n onClick={handleClick}\n type=\"button\"\n >\n {swatchEl}\n </button>\n ) : (\n swatchEl\n )}\n <span className=\"text-fg-muted font-mono text-[10px]\">\n {copied ? 'Copied!' : color}\n </span>\n {label !== undefined && (\n <span className=\"text-fg-muted/60 text-[10px]\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nexport { colorSwatchVariants }\nexport type { ColorSwatchProps }\n","// copy-button — button that copies text to clipboard with feedback\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\n\nexport type CopyButtonProps = {\n text: string\n label?: string\n copiedLabel?: string\n variant?: 'default' | 'ghost'\n size?: 'default' | 'sm'\n className?: string\n}\n\nexport const CopyButton = forwardRef<HTMLButtonElement, CopyButtonProps>(\n function CopyButton(\n {\n text,\n label = 'Copy',\n copiedLabel = 'Copied!',\n variant = 'default',\n size = 'default',\n className,\n },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(text).catch(() => {})\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setCopied(false), 1500)\n }, [text])\n\n const buttonVariant = variant === 'ghost' ? 'ghost' : 'secondary'\n\n return (\n <Button\n ref={ref}\n variant={buttonVariant}\n size={size}\n className={cx(className)}\n onClick={handleCopy}\n data-component=\"copy-button\"\n icon={\n copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 7l3 3 7-7\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\" />\n </svg>\n )\n }\n >\n {copied ? copiedLabel : label}\n </Button>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent text-accent-fg',\n danger: 'bg-danger text-white',\n success: 'bg-success text-white',\n} as const\n\ntype CountBadgeVariant = 'accent' | 'danger' | 'success'\n\ntype CountBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n count: number\n max?: number\n variant?: CountBadgeVariant\n}\n\nexport const CountBadge = forwardRef<HTMLSpanElement, CountBadgeProps>(\n function CountBadge(\n { className, count, max = 99, variant = 'danger', ...props },\n ref\n ) {\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <span\n className={cx(\n 'inline-flex min-w-5 items-center justify-center rounded-full px-1.5 py-0.5 text-[10px] leading-none font-bold select-none',\n variantMap[variant],\n className\n )}\n data-component=\"count-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { CountBadgeProps, CountBadgeVariant }\n","// count-up — animated number counter from 0 to target\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountUpProps = {\n value: number\n duration?: number\n decimals?: number\n prefix?: string\n suffix?: string\n separator?: string\n className?: string\n}\n\nfunction formatNumber(n: number, decimals: number, separator: string): string {\n const fixed = n.toFixed(decimals)\n if (separator === '') return fixed\n\n const [intPart, decPart] = fixed.split('.')\n const formatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n if (decPart !== undefined) return `${formatted}.${decPart}`\n return formatted\n}\n\n// ease-out cubic\nfunction easeOut(t: number): number {\n const t1 = t - 1\n return t1 * t1 * t1 + 1\n}\n\nexport const CountUp = forwardRef<HTMLSpanElement, CountUpProps>(\n function CountUp(\n {\n value,\n duration = 1500,\n decimals = 0,\n prefix,\n suffix,\n separator = ',',\n className,\n },\n ref\n ) {\n const [current, setCurrent] = useState(0)\n\n useEffect(() => {\n if (duration <= 0) {\n setCurrent(value)\n return\n }\n const start = performance.now()\n let raf: number\n\n function tick(now: number) {\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n setCurrent(easeOut(progress) * value)\n if (progress < 1) {\n raf = requestAnimationFrame(tick)\n }\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, duration])\n\n return (\n <span\n ref={ref}\n className={cx('tabular-nums', className)}\n data-component=\"count-up\"\n >\n {prefix ?? ''}\n {formatNumber(current, decimals, separator)}\n {suffix ?? ''}\n </span>\n )\n }\n)\n","// countdown — countdown timer to a target date\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountdownProps = {\n targetDate: Date | string | number\n onComplete?: () => void\n showDays?: boolean\n showSeconds?: boolean\n className?: string\n}\n\ntype TimeRemaining = {\n days: number\n hours: number\n minutes: number\n seconds: number\n total: number\n}\n\nfunction calcRemaining(target: number): TimeRemaining {\n const total = Math.max(0, target - Date.now())\n const seconds = Math.floor((total / 1000) % 60)\n const minutes = Math.floor((total / 1000 / 60) % 60)\n const hours = Math.floor((total / 1000 / 60 / 60) % 24)\n const days = Math.floor(total / 1000 / 60 / 60 / 24)\n return { days, hours, minutes, seconds, total }\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nexport const Countdown = forwardRef<HTMLDivElement, CountdownProps>(\n function Countdown(\n { targetDate, onComplete, showDays = true, showSeconds = true, className },\n ref\n ) {\n const target = new Date(targetDate).getTime()\n const [remaining, setRemaining] = useState<TimeRemaining>(() =>\n calcRemaining(target)\n )\n\n useEffect(() => {\n if (remaining.total <= 0) return\n\n const interval = setInterval(() => {\n const next = calcRemaining(target)\n setRemaining(next)\n if (next.total <= 0) {\n clearInterval(interval)\n if (onComplete !== undefined) onComplete()\n }\n }, 1000)\n\n return () => clearInterval(interval)\n }, [target, onComplete, remaining.total])\n\n const segments: Array<{ label: string; value: string }> = []\n\n if (showDays) {\n segments.push({ label: 'D', value: pad(remaining.days) })\n }\n segments.push({ label: 'H', value: pad(remaining.hours) })\n segments.push({ label: 'M', value: pad(remaining.minutes) })\n if (showSeconds) {\n segments.push({ label: 'S', value: pad(remaining.seconds) })\n }\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"countdown\"\n >\n {segments.map((seg, i) => (\n <div key={seg.label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <span\n className=\"text-fg-muted gds-text-body\"\n data-testid=\"separator\"\n >\n :\n </span>\n )}\n <span\n className=\"bg-bg-tertiary gds-radius-button gds-text-body text-fg inline-flex items-center justify-center rounded px-1.5 py-0.5 tabular-nums\"\n data-testid={`segment-${seg.label}`}\n >\n {seg.value}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","// countdown-badge — badge showing a count with max overflow\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst countdownBadgeVariants = cva(\n 'inline-flex select-none items-center justify-center rounded-full text-[10px] font-bold text-accent-fg min-w-[18px] h-[18px] px-1',\n {\n defaultVariants: { variant: 'default' },\n variants: {\n variant: {\n danger: 'bg-danger animate-pulse',\n default: 'bg-accent',\n },\n },\n }\n)\n\ntype CountdownBadgeProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof countdownBadgeVariants> & {\n count: number\n max?: number\n }\n\nexport const CountdownBadge = forwardRef<HTMLSpanElement, CountdownBadgeProps>(\n function CountdownBadge(\n { className, count, max = 99, variant, ...props },\n ref\n ) {\n if (count <= 0) return null\n\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <span\n className={cx(countdownBadgeVariants({ variant }), className)}\n data-component=\"countdown-badge\"\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport { countdownBadgeVariants }\nexport type { CountdownBadgeProps }\n","import { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\n\ntype CursorFollowProps = React.HTMLAttributes<HTMLDivElement> & {\n offset?: { x?: number; y?: number }\n smooth?: boolean\n}\n\nexport const CursorFollow = forwardRef<HTMLDivElement, CursorFollowProps>(\n function CursorFollow(\n { children, className, offset, smooth = true, ...props },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ x: 0, y: 0 })\n\n const ox = offset?.x ?? 0\n const oy = offset?.y ?? 0\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = containerRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setPos({ x: e.clientX - rect.left + ox, y: e.clientY - rect.top + oy })\n },\n [ox, oy]\n )\n\n return (\n <div\n className={cx('relative', className)}\n data-component=\"cursor-follow\"\n onMouseMove={handleMouseMove}\n ref={mergeRefs(containerRef, ref)}\n {...props}\n >\n <div\n className=\"pointer-events-none absolute\"\n style={{\n transform: `translate(${pos.x}px, ${pos.y}px)`,\n transition: smooth ? 'transform 80ms ease-out' : undefined,\n }}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\nexport type { CursorFollowProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DiffIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n inverted?: boolean\n unit?: string\n value: number\n}\n\nexport const DiffIndicator = forwardRef<HTMLSpanElement, DiffIndicatorProps>(\n function DiffIndicator(\n { className, inverted = false, unit, value, ...props },\n ref\n ) {\n const isPositive = value > 0\n const isNegative = value < 0\n // inverted: lower is good (e.g. error rate), so positive = bad, negative = good\n const isGood = inverted ? isNegative : isPositive\n const isBad = inverted ? isPositive : isNegative\n\n const colorCls = isGood\n ? 'text-success'\n : isBad\n ? 'text-danger'\n : 'text-fg-muted'\n const arrow = isPositive ? '\\u2191' : isNegative ? '\\u2193' : ''\n const sign = isPositive ? '+' : ''\n const display = `${arrow}${sign}${value}${unit !== undefined ? unit : ''}`\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-0.5 text-sm font-medium tabular-nums',\n colorCls,\n className\n )}\n data-component=\"diff-indicator\"\n data-direction={isPositive ? 'up' : isNegative ? 'down' : 'neutral'}\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { DiffIndicatorProps }\n","// glow-dot — colored dot with glow effect (LED indicator)\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype GlowDotColor = 'accent' | 'danger' | 'success' | 'warning'\ntype GlowDotSize = 'default' | 'lg' | 'sm'\n\ntype GlowDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n color?: GlowDotColor\n /** Enable pulse animation for attention states */\n pulse?: boolean\n size?: GlowDotSize\n}\n\nconst colorMap: Record<GlowDotColor, string> = {\n accent: 'bg-accent shadow-[0_0_6px_var(--color-accent)]',\n success: 'bg-success shadow-[0_0_6px_var(--color-success)]',\n warning: 'bg-warning shadow-[0_0_6px_var(--color-warning)]',\n danger: 'bg-danger shadow-[0_0_6px_var(--color-danger)]',\n}\n\nconst sizeMap: Record<GlowDotSize, string> = {\n sm: 'h-1.5 w-1.5',\n default: 'h-2.5 w-2.5',\n lg: 'h-3.5 w-3.5',\n}\n\nexport const GlowDot = forwardRef<HTMLSpanElement, GlowDotProps>(\n function GlowDot(\n { color = 'accent', pulse, size = 'default', className, ...props },\n ref\n ) {\n return (\n <span\n ref={ref}\n className={cx(\n 'inline-block rounded-full',\n colorMap[color],\n sizeMap[size],\n pulse === true && 'animate-pulse',\n className\n )}\n data-component=\"glow-dot\"\n data-variant={color}\n {...props}\n />\n )\n }\n)\n\nexport type { GlowDotColor, GlowDotProps, GlowDotSize }\n","// gradient-text — text with gradient color fill\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype GradientTextProps = React.HTMLAttributes<HTMLSpanElement> & {\n children: string\n from?: string\n to?: string\n}\n\nexport const GradientText = forwardRef<HTMLSpanElement, GradientTextProps>(\n function GradientText(\n { children, className, from = '#6366f1', to = '#ec4899', ...props },\n ref\n ) {\n return (\n <span\n className={cx('inline-block bg-clip-text text-transparent', className)}\n data-component=\"gradient-text\"\n ref={ref}\n style={{\n backgroundImage: `linear-gradient(to right, ${from}, ${to})`,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { GradientTextProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype HeatCellProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n max?: number\n showValue?: boolean\n size?: number\n value: number\n}\n\nconst HeatCell = forwardRef<HTMLDivElement, HeatCellProps>(function HeatCell(\n {\n className,\n color = 'var(--color-accent)',\n max = 100,\n showValue = false,\n size = 32,\n value,\n ...props\n },\n ref\n) {\n const intensity = max > 0 ? Math.min(Math.max(value / max, 0), 1) : 0\n\n return (\n <div\n className={cx(\n 'inline-flex items-center justify-center rounded text-[10px] font-medium',\n className\n )}\n data-component=\"heat-cell\"\n ref={ref}\n style={{\n backgroundColor: color,\n height: size,\n opacity: 0.1 + intensity * 0.9,\n width: size,\n }}\n {...props}\n >\n {showValue && (\n <span className=\"text-white mix-blend-difference\">{value}</span>\n )}\n </div>\n )\n})\n\nexport { HeatCell }\nexport type { HeatCellProps }\n","// hotkey — keyboard shortcut key combination display\nimport { forwardRef } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype HotkeyProps = React.HTMLAttributes<HTMLSpanElement> & {\n keys: string[]\n}\n\nexport const Hotkey = forwardRef<HTMLSpanElement, HotkeyProps>(function Hotkey(\n { className, keys, ...props },\n ref\n) {\n return (\n <span\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"hotkey\"\n ref={ref}\n {...props}\n >\n {keys.map((key, i) => (\n <span className=\"contents\" key={i}>\n {i > 0 && <span className=\"text-fg-muted text-[10px]\">+</span>}\n <Kbd>{key}</Kbd>\n </span>\n ))}\n </span>\n )\n})\n\nexport type { HotkeyProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Tooltip } from './tooltip'\n\ntype InfoTipProps = React.HTMLAttributes<HTMLDivElement> & {\n content: ReactNode\n size?: 'default' | 'sm'\n}\n\nconst sizeClasses = {\n default: 'h-4 w-4',\n sm: 'h-3.5 w-3.5',\n} as const\n\nexport const InfoTip = forwardRef<HTMLDivElement, InfoTipProps>(\n function InfoTip({ className, content, size = 'default', ...props }, ref) {\n return (\n <Tooltip content={content} ref={ref} {...props}>\n <span\n className={cx(\n 'text-fg-muted/60 hover:text-fg-muted inline-flex cursor-help items-center',\n className\n )}\n data-component=\"info-tip\"\n >\n <svg\n className={sizeClasses[size]}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4M12 8h.01\" />\n </svg>\n </span>\n </Tooltip>\n )\n }\n)\n\nexport type { InfoTipProps }\n","// key-value — simple inline key: value pair for compact data display\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype KeyValueProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n mono?: boolean\n value: ReactNode\n}\n\nexport const KeyValue = forwardRef<HTMLDivElement, KeyValueProps>(\n function KeyValue({ label, value, mono = false, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body inline-flex items-baseline gap-1.5',\n className\n )}\n data-component=\"key-value\"\n {...props}\n >\n <span className=\"text-fg-muted gds-text-caption shrink-0\">{label}</span>\n <span className={cx('text-fg', mono && 'font-mono')}>{value}</span>\n </div>\n )\n }\n)\n\nexport type { KeyValueProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype KeyboardShortcutProps = {\n keys: string\n onTrigger: () => void\n showBadge?: boolean\n disabled?: boolean\n className?: string\n}\n\nfunction parseKeys(keys: string) {\n const parts = keys.toLowerCase().split('+')\n const modifiers = {\n ctrl: false,\n meta: false,\n shift: false,\n alt: false,\n }\n let mainKey = ''\n\n for (const part of parts) {\n if (part === 'ctrl') {\n modifiers.ctrl = true\n } else if (part === 'meta' || part === 'cmd') {\n modifiers.meta = true\n } else if (part === 'shift') {\n modifiers.shift = true\n } else if (part === 'alt') {\n modifiers.alt = true\n } else {\n mainKey = part\n }\n }\n\n return { modifiers, mainKey }\n}\n\nfunction formatKeyLabel(part: string): string {\n const map: Record<string, string> = {\n ctrl: 'Ctrl',\n meta: '\\u2318',\n cmd: '\\u2318',\n shift: '\\u21E7',\n alt: 'Alt',\n }\n return map[part.toLowerCase()] ?? part.toUpperCase()\n}\n\nexport const KeyboardShortcut = forwardRef<\n HTMLSpanElement,\n KeyboardShortcutProps\n>(function KeyboardShortcut(\n { keys, onTrigger, showBadge = false, disabled = false, className },\n ref\n) {\n const { modifiers, mainKey } = parseKeys(keys)\n\n const handler = useCallback(\n (e: KeyboardEvent) => {\n if (disabled) return\n if (e.ctrlKey !== modifiers.ctrl) return\n if (e.metaKey !== modifiers.meta) return\n if (e.shiftKey !== modifiers.shift) return\n if (e.altKey !== modifiers.alt) return\n if (e.key.toLowerCase() !== mainKey) return\n\n e.preventDefault()\n onTrigger()\n },\n [\n disabled,\n modifiers.ctrl,\n modifiers.meta,\n modifiers.shift,\n modifiers.alt,\n mainKey,\n onTrigger,\n ]\n )\n\n useEffect(() => {\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [handler])\n\n if (!showBadge) return null\n\n const parts = keys.split('+')\n const badges: ReactNode[] = parts.map((part, i) => (\n <Kbd key={i}>{formatKeyLabel(part)}</Kbd>\n ))\n\n return (\n <span\n ref={ref}\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"keyboard-shortcut\"\n >\n {badges}\n </span>\n )\n})\n\nexport type { KeyboardShortcutProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LiveDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n}\n\nexport const LiveDot = forwardRef<HTMLSpanElement, LiveDotProps>(\n function LiveDot({ className, label = 'LIVE', ...props }, ref) {\n return (\n <span\n className={cx('inline-flex items-center gap-1.5', className)}\n data-component=\"live-dot\"\n ref={ref}\n {...props}\n >\n <span className=\"relative flex h-2 w-2\">\n <span className=\"bg-danger absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\" />\n <span className=\"bg-danger relative inline-flex h-2 w-2 rounded-full\" />\n </span>\n <span className=\"text-danger text-xs font-bold tracking-wide uppercase\">\n {label}\n </span>\n </span>\n )\n }\n)\n\nexport type { LiveDotProps }\n","// magnetic-button — element that subtly moves toward the cursor when hovering\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\n\nexport type MagneticButtonProps = {\n children: React.ReactNode\n strength?: number\n radius?: number\n className?: string\n}\n\nexport const MagneticButton = forwardRef<HTMLDivElement, MagneticButtonProps>(\n function MagneticButton(\n { children, strength = 0.3, radius = 100, className },\n ref\n ) {\n const innerRef = useRef<HTMLDivElement>(null)\n const [transform, setTransform] = useState({ x: 0, y: 0 })\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const el = innerRef.current\n if (el === null) return\n const rect = el.getBoundingClientRect()\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dx = e.clientX - cx\n const dy = e.clientY - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist > radius) {\n setTransform({ x: 0, y: 0 })\n return\n }\n setTransform({ x: dx * strength, y: dy * strength })\n },\n [strength, radius]\n )\n\n const handleMouseLeave = useCallback(() => {\n setTransform({ x: 0, y: 0 })\n }, [])\n\n return (\n <div\n ref={mergeRefs(innerRef, ref)}\n data-component=\"magnetic-button\"\n className={cx('inline-block', className)}\n style={{\n transform: `translate(${transform.x}px, ${transform.y}px)`,\n transition: 'transform 200ms ease-out',\n }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </div>\n )\n }\n)\n","// marquee — infinite horizontal scrolling content\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MarqueeProps = {\n children: React.ReactNode\n speed?: number\n direction?: 'left' | 'right'\n pauseOnHover?: boolean\n className?: string\n}\n\nexport const Marquee = forwardRef<HTMLDivElement, MarqueeProps>(\n function Marquee(\n {\n children,\n speed = 30,\n direction = 'left',\n pauseOnHover = true,\n className,\n },\n ref\n ) {\n const innerRef = useRef<HTMLDivElement>(null)\n const [duration, setDuration] = useState(10)\n\n useEffect(() => {\n if (innerRef.current === null) return\n const width = innerRef.current.scrollWidth / 2\n if (width > 0) setDuration(width / speed)\n }, [speed, children])\n\n const translateFrom = direction === 'left' ? '0%' : '-50%'\n const translateTo = direction === 'left' ? '-50%' : '0%'\n\n return (\n <div\n ref={ref}\n className={cx('overflow-hidden', className)}\n data-component=\"marquee\"\n >\n <div\n ref={innerRef}\n className={cx(\n 'inline-flex will-change-transform',\n pauseOnHover && 'hover:[animation-play-state:paused]'\n )}\n style={\n {\n animation: `marquee-scroll ${duration}s linear infinite`,\n '--marquee-from': translateFrom,\n '--marquee-to': translateTo,\n } as React.CSSProperties\n }\n >\n <div className=\"flex shrink-0\">{children}</div>\n <div className=\"flex shrink-0\" aria-hidden>\n {children}\n </div>\n </div>\n </div>\n )\n }\n)\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst meterVariants = cva('overflow-hidden gds-radius-badge bg-bg-tertiary', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-2.5',\n lg: 'h-4',\n sm: 'h-1.5',\n },\n },\n})\n\nconst variantColors: Record<string, string> = {\n danger: 'bg-danger',\n default: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n}\n\nfunction getAutoColor(pct: number): string {\n if (pct >= 0.8) return 'bg-danger'\n if (pct >= 0.6) return 'bg-warning'\n if (pct >= 0.4) return 'bg-accent'\n return 'bg-success'\n}\n\ntype MeterProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof meterVariants> & {\n label?: string\n max?: number\n min?: number\n showValue?: boolean\n value: number\n variant?: 'auto' | 'danger' | 'default' | 'success' | 'warning'\n }\n\nexport const Meter = forwardRef<HTMLDivElement, MeterProps>(function Meter(\n {\n className,\n label,\n max = 100,\n min = 0,\n showValue = true,\n size,\n value,\n variant = 'auto',\n ...props\n },\n ref\n) {\n const range = max - min\n const pct = range > 0 ? Math.max(0, Math.min(1, (value - min) / range)) : 0\n const barColor =\n variant === 'auto'\n ? getAutoColor(pct)\n : (variantColors[variant] ?? 'bg-accent')\n\n return (\n <div\n className={cx('w-full', className)}\n data-component=\"meter\"\n ref={ref}\n {...props}\n >\n {(label !== undefined || showValue) && (\n <div className=\"mb-1 flex items-center justify-between\">\n {label !== undefined && (\n <span className=\"gds-text-body text-fg font-medium\">{label}</span>\n )}\n {showValue && (\n <span className=\"gds-text-label text-fg-muted font-mono tabular-nums\">\n {Math.round(pct * 100)}%\n </span>\n )}\n </div>\n )}\n <div\n aria-label={label}\n aria-valuemax={max}\n aria-valuemin={min}\n aria-valuenow={value}\n className={meterVariants({ size })}\n role=\"meter\"\n >\n <div\n className={cx(\n 'gds-radius-badge h-full transition-all duration-500',\n barColor\n )}\n style={{ width: `${pct * 100}%` }}\n />\n </div>\n </div>\n )\n})\n\nexport { meterVariants }\nexport type { MeterProps }\n","import { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NumberFlowProps = {\n className?: string\n format?: (n: number) => string\n value: number\n}\n\nexport const NumberFlow = forwardRef<HTMLSpanElement, NumberFlowProps>(\n function NumberFlow({ className, format = String, value }, ref) {\n const chars = useMemo(() => format(value).split(''), [value, format])\n return (\n <span\n className={cx(\n 'inline-flex items-center tabular-nums select-none',\n className\n )}\n data-component=\"number-flow\"\n ref={ref}\n >\n {chars.map((char, i) => {\n if (char >= '0' && char <= '9') {\n return (\n <span\n className=\"inline-block overflow-hidden\"\n key={`${i}-slot`}\n style={{ lineHeight: 1 }}\n >\n <span className=\"inline-block transition-transform duration-300 ease-out\">\n {char}\n </span>\n </span>\n )\n }\n return <span key={`${i}-static`}>{char}</span>\n })}\n </span>\n )\n }\n)\n\nexport type { NumberFlowProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype OnlineIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n online: boolean\n}\n\nexport const OnlineIndicator = forwardRef<\n HTMLSpanElement,\n OnlineIndicatorProps\n>(function OnlineIndicator({ className, label, online, ...props }, ref) {\n const dotCls = online ? 'bg-success' : 'bg-fg-muted/40'\n const text = label ?? (online ? 'Online' : 'Offline')\n\n return (\n <span\n className={cx('gds-gap-sm inline-flex items-center', className)}\n data-component=\"online-indicator\"\n ref={ref}\n {...props}\n >\n <span className={cx('h-2 w-2 shrink-0 rounded-full', dotCls)} />\n <span className=\"gds-text-label text-fg-muted\">{text}</span>\n </span>\n )\n})\n\nexport type { OnlineIndicatorProps }\n","import type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype OrbitProps = {\n children: ReactNode[]\n className?: string\n duration?: number\n radius?: number\n}\n\nexport function Orbit({\n children,\n className,\n duration = 10,\n radius = 100,\n}: OrbitProps) {\n const count = children.length\n return (\n <div\n className={cx('relative select-none', className)}\n data-component=\"orbit\"\n style={{ height: radius * 2, width: radius * 2 }}\n >\n {children.map((child, i) => {\n const angle = (360 / count) * i\n return (\n <div\n className=\"absolute top-1/2 left-1/2\"\n key={i}\n style={{\n animation: `orbit-spin ${duration}s linear infinite`,\n animationDelay: `${-(duration / count) * i}s`,\n height: 0,\n width: 0,\n }}\n >\n <div\n className=\"-translate-x-1/2 -translate-y-1/2\"\n style={{\n transform: `rotate(${angle}deg) translateX(${radius}px) rotate(-${angle}deg)`,\n }}\n >\n {child}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport type { OrbitProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PercentageProps = React.HTMLAttributes<HTMLSpanElement> & {\n precision?: number\n showSign?: boolean\n value: number\n}\n\nexport const Percentage = forwardRef<HTMLSpanElement, PercentageProps>(\n function Percentage(\n { className, precision = 1, showSign = false, value, ...props },\n ref\n ) {\n const isPositive = value > 0\n const isNegative = value < 0\n const colorCls = isPositive\n ? 'text-success'\n : isNegative\n ? 'text-danger'\n : 'text-fg-muted'\n const sign = showSign && isPositive ? '+' : ''\n const display = `${sign}${value.toFixed(precision)}%`\n\n return (\n <span\n className={cx(\n 'inline-flex text-sm font-medium tabular-nums',\n colorCls,\n className\n )}\n data-component=\"percentage\"\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { PercentageProps }\n","// percentage-circle — circular percentage display with color coding\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PercentageCircleProps = React.HTMLAttributes<HTMLDivElement> & {\n size?: 'default' | 'lg' | 'sm'\n value: number\n}\n\nconst sizeClasses = {\n default: 'h-16 w-16 text-lg',\n lg: 'h-20 w-20 text-xl',\n sm: 'h-12 w-12 text-sm',\n} as const\n\nconst strokeWidths = {\n default: 3,\n lg: 3.5,\n sm: 2.5,\n} as const\n\nexport const PercentageCircle = forwardRef<\n HTMLDivElement,\n PercentageCircleProps\n>(function PercentageCircle(\n { className, size = 'default', value, ...props },\n ref\n) {\n const clamped = Math.max(0, Math.min(100, value))\n\n const colorClass = useMemo(() => {\n if (clamped >= 80) return 'text-success'\n if (clamped >= 50) return 'text-warning'\n return 'text-danger'\n }, [clamped])\n\n const radius = 18\n const circumference = 2 * Math.PI * radius\n const offset = circumference - (clamped / 100) * circumference\n\n return (\n <div\n className={cx(\n 'relative inline-flex items-center justify-center select-none',\n sizeClasses[size],\n className\n )}\n data-component=\"percentage-circle\"\n ref={ref}\n {...props}\n >\n <svg\n className=\"absolute inset-0 h-full w-full -rotate-90\"\n viewBox=\"0 0 40 40\"\n >\n <circle\n className=\"text-fg-muted/10\"\n cx=\"20\"\n cy=\"20\"\n fill=\"none\"\n r={radius}\n stroke=\"currentColor\"\n strokeWidth={strokeWidths[size]}\n />\n <circle\n className={cx('transition-all duration-500', colorClass)}\n cx=\"20\"\n cy=\"20\"\n fill=\"none\"\n r={radius}\n stroke=\"currentColor\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidths[size]}\n />\n </svg>\n <span className={cx('font-mono font-bold', colorClass)}>{clamped}%</span>\n </div>\n )\n})\n\nexport type { PercentageCircleProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PriceProps = React.HTMLAttributes<HTMLSpanElement> & {\n currency?: string\n showSign?: boolean\n value: number\n}\n\nexport const Price = forwardRef<HTMLSpanElement, PriceProps>(function Price(\n { className, currency = '\\u00a5', showSign = false, value, ...props },\n ref\n) {\n const isNeg = value < 0\n const isPos = value > 0\n const colorCls = isNeg ? 'text-danger' : isPos ? 'text-success' : 'text-fg'\n const sign = showSign && isPos ? '+' : ''\n const formatted = Math.abs(value).toLocaleString()\n\n return (\n <span\n className={cx('tabular-nums', colorCls, className)}\n data-component=\"price\"\n ref={ref}\n {...props}\n >\n {isNeg ? '-' : sign}\n {currency}\n {formatted}\n </span>\n )\n})\n\nexport type { PriceProps }\n","// progress-circle — circular progress indicator using SVG\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantColors: Record<string, string> = {\n accent: 'stroke-accent',\n danger: 'stroke-danger',\n success: 'stroke-success',\n warning: 'stroke-warning',\n}\n\ntype ProgressCircleProps = {\n value: number\n size?: number\n strokeWidth?: number\n showValue?: boolean\n variant?: 'accent' | 'danger' | 'success' | 'warning'\n className?: string\n}\n\nconst ProgressCircle = forwardRef<SVGSVGElement, ProgressCircleProps>(\n function ProgressCircle(\n {\n value,\n size = 64,\n strokeWidth = 4,\n showValue = true,\n variant = 'accent',\n className,\n },\n ref\n ) {\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const clamped = Math.max(0, Math.min(100, value))\n const offset = circumference * (1 - clamped / 100)\n const center = size / 2\n const colorCls = variantColors[variant] ?? 'stroke-accent'\n\n return (\n <svg\n ref={ref}\n className={cx('shrink-0', className)}\n data-component=\"progress-circle\"\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n width={size}\n >\n <circle\n className=\"stroke-border/30\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeWidth={strokeWidth}\n />\n <circle\n className={cx('transition-all duration-500', colorCls)}\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n style={{ transform: 'rotate(-90deg)', transformOrigin: 'center' }}\n />\n {showValue && (\n <text\n className=\"fill-fg font-medium\"\n dominantBaseline=\"central\"\n fontSize={size * 0.22}\n textAnchor=\"middle\"\n x={center}\n y={center}\n >\n {Math.round(clamped)}%\n </text>\n )}\n </svg>\n )\n }\n)\n\nexport { ProgressCircle }\nexport type { ProgressCircleProps }\n","// progress-ring — circular progress indicator with percentage label\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ProgressRingProps = React.HTMLAttributes<HTMLDivElement> & {\n size?: number\n strokeWidth?: number\n value: number\n}\n\nexport const ProgressRing = forwardRef<HTMLDivElement, ProgressRingProps>(\n function ProgressRing(\n { className, size = 48, strokeWidth = 4, value, ...props },\n ref\n ) {\n const clamped = Math.max(0, Math.min(100, value))\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference * (1 - clamped / 100)\n const center = size / 2\n\n return (\n <div\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={clamped}\n className={cx(\n 'inline-flex items-center justify-center select-none',\n className\n )}\n data-component=\"progress-ring\"\n ref={ref}\n role=\"progressbar\"\n {...props}\n >\n <svg\n className=\"rotate-[-90deg]\"\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n width={size}\n >\n <circle\n className=\"stroke-bg-tertiary\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeWidth={strokeWidth}\n />\n <circle\n className=\"stroke-accent transition-all duration-500\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n />\n </svg>\n <span\n className=\"text-fg absolute font-mono text-xs font-bold\"\n style={{ fontSize: size * 0.22 }}\n >\n {clamped}%\n </span>\n </div>\n )\n }\n)\n\nexport type { ProgressRingProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst colorMap = {\n accent: 'bg-accent',\n danger: 'bg-danger',\n success: 'bg-success',\n warning: 'bg-warning',\n} as const\n\nconst sizeMap = {\n default: 'h-2.5 w-2.5',\n lg: 'h-3.5 w-3.5',\n sm: 'h-2 w-2',\n} as const\n\ntype PulseIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n color?: 'accent' | 'danger' | 'success' | 'warning'\n label?: string\n size?: 'default' | 'lg' | 'sm'\n}\n\nexport const PulseIndicator = forwardRef<HTMLSpanElement, PulseIndicatorProps>(\n function PulseIndicator(\n { className, color = 'success', label, size = 'default', ...props },\n ref\n ) {\n return (\n <span\n className={cx(\n 'inline-flex items-center',\n label !== undefined && 'gds-gap-sm',\n className\n )}\n data-component=\"pulse-indicator\"\n ref={ref}\n {...props}\n >\n <span className=\"relative inline-flex\">\n <span\n className={cx('rounded-full', colorMap[color], sizeMap[size])}\n />\n <span\n className={cx(\n 'absolute inset-0 animate-ping rounded-full opacity-50',\n colorMap[color]\n )}\n />\n </span>\n {label !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nexport type { PulseIndicatorProps }\n","// pulse-ring — concentric pulsing ring animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PulseRingProps = React.HTMLAttributes<HTMLDivElement> & {\n active?: boolean\n color?: string\n count?: number\n size?: number\n}\n\nexport const PulseRing = forwardRef<HTMLDivElement, PulseRingProps>(\n function PulseRing(\n { active = true, className, color, count = 3, size = 80, ...props },\n ref\n ) {\n if (!active) {\n return (\n <div\n className={cx('relative inline-flex', className)}\n data-component=\"pulse-ring\"\n ref={ref}\n {...props}\n />\n )\n }\n\n const rings = Array.from({ length: count }, (_, i) => i)\n\n return (\n <div\n className={cx(\n 'relative inline-flex items-center justify-center',\n className\n )}\n data-component=\"pulse-ring\"\n ref={ref}\n style={{ height: size, width: size }}\n {...props}\n >\n {rings.map((i) => (\n <span\n className=\"absolute inset-0 rounded-full border-2 opacity-0\"\n key={i}\n style={{\n animation: `gds-pulse-ring ${1.5 + count * 0.2}s ease-out ${i * (1.5 / count)}s infinite`,\n borderColor: color ?? 'var(--color-accent)',\n }}\n />\n ))}\n <style>{`\n @keyframes gds-pulse-ring {\n 0% { transform: scale(0.3); opacity: 0.8; }\n 100% { transform: scale(1); opacity: 0; }\n }\n `}</style>\n </div>\n )\n }\n)\n\nexport type { PulseRingProps }\n","// qr-code — decorative data matrix visualization using SVG\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type QRCodeProps = {\n value: string\n size?: number\n color?: string\n bgColor?: string\n className?: string\n}\n\n// simple hash from string to seed deterministic pattern\nfunction hashStr(str: string): number {\n let hash = 5381\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0\n }\n return Math.abs(hash)\n}\n\n// seeded pseudo-random\nfunction seededRand(seed: number): () => number {\n let s = seed\n return () => {\n s = (s * 1103515245 + 12345) & 0x7fffffff\n return s / 0x7fffffff\n }\n}\n\nconst GRID = 21\nconst MODULE = 1\n\n// draw a finder pattern (7x7) at position\nfunction finderPattern(\n ox: number,\n oy: number\n): Array<{ x: number; y: number }> {\n const cells: Array<{ x: number; y: number }> = []\n for (let r = 0; r < 7; r++) {\n for (let c = 0; c < 7; c++) {\n const isOuter = r === 0 || r === 6 || c === 0 || c === 6\n const isInner = r >= 2 && r <= 4 && c >= 2 && c <= 4\n if (isOuter || isInner) {\n cells.push({ x: ox + c, y: oy + r })\n }\n }\n }\n return cells\n}\n\nexport const QRCode = forwardRef<SVGSVGElement, QRCodeProps>(function QRCode(\n {\n value,\n size = 128,\n color = 'currentColor',\n bgColor = 'transparent',\n className,\n },\n ref\n) {\n const cells = useMemo(() => {\n const result: Array<{ x: number; y: number }> = []\n\n // finder patterns\n result.push(...finderPattern(0, 0))\n result.push(...finderPattern(GRID - 7, 0))\n result.push(...finderPattern(0, GRID - 7))\n\n // data area — hash-based fill\n const rand = seededRand(hashStr(value))\n for (let r = 0; r < GRID; r++) {\n for (let c = 0; c < GRID; c++) {\n const inFinder =\n (r < 8 && c < 8) ||\n (r < 8 && c >= GRID - 8) ||\n (r >= GRID - 8 && c < 8)\n if (inFinder) continue\n if (rand() > 0.55) {\n result.push({ x: c, y: r })\n }\n }\n }\n return result\n }, [value])\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={`0 0 ${GRID} ${GRID}`}\n className={cx('shrink-0', className)}\n data-component=\"qr-code\"\n data-testid=\"qr-code-svg\"\n role=\"img\"\n aria-label={`QR code for: ${value}`}\n >\n <rect width={GRID} height={GRID} fill={bgColor} />\n {cells.map((cell, i) => (\n <rect\n key={i}\n x={cell.x}\n y={cell.y}\n width={MODULE}\n height={MODULE}\n fill={color}\n />\n ))}\n </svg>\n )\n})\n","// quick-action — floating action button / quick action shortcut\nimport { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst quickActionVariants = cva(\n 'inline-flex shrink-0 select-none items-center justify-center rounded-full transition-transform active:scale-95 hover:scale-105',\n {\n defaultVariants: { size: 'default', variant: 'primary' },\n variants: {\n variant: {\n primary: 'bg-accent text-accent-fg gds-shadow-lg',\n secondary: 'border border-border bg-surface text-fg gds-shadow-md',\n },\n size: {\n default: 'h-11 w-11',\n lg: 'h-14 w-14',\n sm: 'h-9 w-9',\n },\n },\n }\n)\n\ntype QuickActionProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> &\n VariantProps<typeof quickActionVariants> & {\n icon: ReactNode\n label?: string\n }\n\nexport const QuickAction = forwardRef<HTMLButtonElement, QuickActionProps>(\n function QuickAction(\n { className, disabled, icon, label, onClick, size, variant, ...props },\n ref\n ) {\n return (\n <div className=\"inline-flex flex-col items-center gap-1\">\n <button\n className={cx(\n quickActionVariants({ size, variant }),\n focusCls,\n disabled === true && 'pointer-events-none opacity-40',\n className\n )}\n data-component=\"quick-action\"\n data-variant={variant ?? 'primary'}\n disabled={disabled}\n onClick={onClick}\n ref={ref}\n type=\"button\"\n {...props}\n >\n <span className=\"gds-icon-child\">{icon}</span>\n </button>\n {label !== undefined && (\n <span className=\"text-fg-muted text-[10px] select-none\">{label}</span>\n )}\n </div>\n )\n }\n)\n\nexport { quickActionVariants }\nexport type { QuickActionProps }\n","import { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype RadioOption = {\n disabled?: boolean\n label: string\n value: string\n}\n\ntype RadioGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n direction?: 'horizontal' | 'vertical'\n disabled?: boolean\n onChange?: (value: string) => void\n options: RadioOption[]\n value?: string\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(\n {\n className,\n direction = 'vertical',\n disabled = false,\n onChange,\n options,\n value,\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-gap flex',\n direction === 'vertical' ? 'flex-col' : 'flex-row flex-wrap',\n className\n )}\n data-component=\"radio-group\"\n ref={ref}\n role=\"radiogroup\"\n {...props}\n >\n {options.map((opt) => {\n const selected = opt.value === value\n const isDisabled = disabled || opt.disabled === true\n\n return (\n <button\n aria-checked={selected}\n className={cx(\n 'gds-gap-sm gds-text-body inline-flex items-center select-none',\n focusCls,\n isDisabled && 'cursor-not-allowed opacity-50'\n )}\n disabled={isDisabled}\n key={opt.value}\n onClick={() => onChange?.(opt.value)}\n role=\"radio\"\n type=\"button\"\n >\n <span\n className={cx(\n 'gds-icon gds-radius-badge inline-flex shrink-0 items-center justify-center border transition-colors',\n selected\n ? 'border-accent'\n : 'border-border hover:border-accent/50'\n )}\n >\n {selected && (\n <span className=\"gds-radius-badge bg-accent h-2 w-2\" />\n )}\n </span>\n <span className=\"text-fg\">{opt.label}</span>\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { RadioGroupProps, RadioOption }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nconst sizeMap = {\n default: 'gds-sq-xs',\n lg: 'gds-sq-sm',\n sm: 'gds-icon',\n}\n\n// default star SVG\nfunction DefaultStar({ filled }: { filled: boolean }) {\n return (\n <svg\n className={cx(\n sizeMap.default,\n filled ? 'fill-warning text-warning' : 'text-fg-muted/20'\n )}\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={1.5}\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\ntype RatingProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n max?: number\n onChange?: (value: number) => void\n readonly?: boolean\n renderStar?: (filled: boolean, index: number) => ReactNode\n size?: 'default' | 'lg' | 'sm'\n value: number\n}\n\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(function Rating(\n {\n className,\n max = 5,\n onChange,\n readonly = false,\n renderStar,\n size = 'default',\n value,\n ...props\n },\n ref\n) {\n const [hovered, setHovered] = useState<number | null>(null)\n\n const handleLeave = useCallback(() => setHovered(null), [])\n\n return (\n <div\n className={cx('gds-gap-xs inline-flex', className)}\n data-component=\"rating\"\n onMouseLeave={readonly ? undefined : handleLeave}\n ref={ref}\n role=\"group\"\n {...props}\n >\n {Array.from({ length: max }, (_, i) => {\n const starIndex = i + 1\n const filled =\n hovered !== null ? starIndex <= hovered : starIndex <= value\n\n if (readonly) {\n return (\n <span className={sizeMap[size]} key={i}>\n {renderStar !== undefined ? (\n renderStar(filled, i)\n ) : (\n <DefaultStar filled={filled} />\n )}\n </span>\n )\n }\n\n return (\n <button\n className={cx('transition-transform hover:scale-110', focusCls)}\n key={i}\n onClick={() => onChange?.(starIndex)}\n onMouseEnter={() => setHovered(starIndex)}\n type=\"button\"\n >\n <span className={sizeMap[size]}>\n {renderStar !== undefined ? (\n renderStar(filled, i)\n ) : (\n <DefaultStar filled={filled} />\n )}\n </span>\n </button>\n )\n })}\n </div>\n )\n})\n\nexport type { RatingProps }\n","// relative-time — live-updating relative time display\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RelativeTimeProps = React.HTMLAttributes<HTMLTimeElement> & {\n date: Date | number | string\n prefix?: string\n}\n\nfunction formatRelativeTime(date: Date | number | string): string {\n const d = date instanceof Date ? date : new Date(date)\n const now = Date.now()\n const diffMs = now - d.getTime()\n const seconds = Math.floor(diffMs / 1000)\n\n if (seconds < 60) return 'just now'\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n const days = Math.floor(hours / 24)\n if (days === 1) return 'yesterday'\n if (days < 30) return `${days}d ago`\n const months = Math.floor(days / 30)\n if (months < 12) return `${months}mo ago`\n return `${Math.floor(months / 12)}y ago`\n}\n\nfunction formatDateTime(date: Date): string {\n return date.toLocaleString()\n}\n\nexport const RelativeTime = forwardRef<HTMLTimeElement, RelativeTimeProps>(\n function RelativeTime({ className, date, prefix, ...props }, ref) {\n const [text, setText] = useState(() => formatRelativeTime(date))\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n setText(formatRelativeTime(date))\n intervalRef.current = setInterval(() => {\n setText(formatRelativeTime(date))\n }, 30_000)\n return () => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n }\n }\n }, [date])\n\n const d = date instanceof Date ? date : new Date(date)\n const fullDateTime = formatDateTime(d)\n\n return (\n <time\n className={cx('text-fg-muted font-mono', className)}\n data-component=\"relative-time\"\n dateTime={d.toISOString()}\n ref={ref}\n title={fullDateTime}\n {...props}\n >\n {prefix !== undefined ? `${prefix} ${text}` : text}\n </time>\n )\n }\n)\n\nexport type { RelativeTimeProps }\n","// ribbon — corner ribbon/banner for containers\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent text-accent-fg',\n danger: 'bg-danger text-white',\n success: 'bg-success text-white',\n warning: 'bg-warning text-white',\n} as const\n\ntype RibbonProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n label: string\n variant?: 'accent' | 'danger' | 'success' | 'warning'\n position?: 'top-left' | 'top-right'\n}\n\nexport const Ribbon = forwardRef<HTMLDivElement, RibbonProps>(function Ribbon(\n {\n children,\n label,\n variant = 'accent',\n position = 'top-right',\n className,\n ...props\n },\n ref\n) {\n const isRight = position === 'top-right'\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden', className)}\n data-component=\"ribbon\"\n {...props}\n >\n <div\n className={cx(\n 'pointer-events-none absolute top-3 z-10 px-6 py-0.5 text-[10px] font-bold tracking-wider uppercase shadow-sm',\n variantMap[variant],\n isRight ? '-right-6 rotate-45' : '-left-6 -rotate-45'\n )}\n >\n {label}\n </div>\n {children}\n </div>\n )\n})\n\nexport type { RibbonProps }\n","// ribbon-banner — corner ribbon overlay for containers\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RibbonBannerProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n position?: 'top-left' | 'top-right'\n text: string\n}\n\nexport const RibbonBanner = forwardRef<HTMLDivElement, RibbonBannerProps>(\n function RibbonBanner(\n { className, color, position = 'top-right', text, ...props },\n ref\n ) {\n const isRight = position === 'top-right'\n\n return (\n <div\n className={cx(\n 'absolute top-0 z-10 overflow-hidden',\n isRight ? 'right-0' : 'left-0',\n className\n )}\n data-component=\"ribbon-banner\"\n ref={ref}\n style={{ height: 80, width: 80 }}\n {...props}\n >\n <div\n className=\"text-accent-fg flex items-center justify-center text-xs font-bold select-none\"\n style={{\n backgroundColor: color ?? 'var(--color-accent)',\n left: isRight ? undefined : -20,\n position: 'absolute',\n right: isRight ? -20 : undefined,\n top: 16,\n transform: isRight ? 'rotate(45deg)' : 'rotate(-45deg)',\n width: 120,\n }}\n >\n {text}\n </div>\n </div>\n )\n }\n)\n\nexport type { RibbonBannerProps }\n","// ripple-effect — material design ripple on click\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype Ripple = { id: number; x: number; y: number; size: number }\n\nexport type RippleEffectProps = {\n children: React.ReactNode\n color?: string\n disabled?: boolean\n className?: string\n}\n\nlet nextId = 0\n\nexport const RippleEffect = forwardRef<HTMLDivElement, RippleEffectProps>(\n function RippleEffect(\n { children, color = 'currentColor', disabled = false, className },\n ref\n ) {\n const [ripples, setRipples] = useState<Ripple[]>([])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const size = Math.max(rect.width, rect.height) * 2\n setRipples((prev) => [...prev, { id: nextId++, x, y, size }])\n },\n [disabled]\n )\n\n const removeRipple = useCallback((id: number) => {\n setRipples((prev) => prev.filter((r) => r.id !== id))\n }, [])\n\n return (\n <div\n ref={ref}\n data-component=\"ripple-effect\"\n className={cx('relative overflow-hidden', className)}\n onPointerDown={handlePointerDown}\n >\n {children}\n {ripples.map((r) => (\n <span\n key={r.id}\n className=\"animate-ripple pointer-events-none absolute rounded-full\"\n style={{\n left: r.x - r.size / 2,\n top: r.y - r.size / 2,\n width: r.size,\n height: r.size,\n backgroundColor: color,\n }}\n onAnimationEnd={() => removeRipple(r.id)}\n />\n ))}\n </div>\n )\n }\n)\n","// scroll-progress — page scroll progress bar\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ScrollProgressProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n height?: number\n}\n\nexport const ScrollProgress = forwardRef<HTMLDivElement, ScrollProgressProps>(\n function ScrollProgress({ className, color, height = 3, ...props }, ref) {\n const [progress, setProgress] = useState(0)\n\n const handleScroll = useCallback(() => {\n const scrollTop = document.documentElement.scrollTop\n const scrollHeight =\n document.documentElement.scrollHeight -\n document.documentElement.clientHeight\n if (scrollHeight > 0) {\n setProgress((scrollTop / scrollHeight) * 100)\n }\n }, [])\n\n useEffect(() => {\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [handleScroll])\n\n return (\n <div\n className={cx('fixed top-0 right-0 left-0 z-50', className)}\n data-component=\"scroll-progress\"\n ref={ref}\n style={{ height: `${height}px` }}\n {...props}\n >\n <div\n className=\"bg-accent h-full transition-[width] duration-100 ease-out\"\n style={{\n width: `${progress}%`,\n ...(color !== undefined ? { backgroundColor: color } : {}),\n }}\n />\n </div>\n )\n }\n)\n\nexport type { ScrollProgressProps }\n","// scroll-to-top — floating button that appears when scrolled down\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type ScrollToTopProps = {\n threshold?: number\n smooth?: boolean\n className?: string\n}\n\nexport const ScrollToTop = forwardRef<HTMLButtonElement, ScrollToTopProps>(\n function ScrollToTop({ threshold = 300, smooth = true, className }, ref) {\n const [visible, setVisible] = useState(() => {\n if (typeof window === 'undefined') return false\n return window.scrollY >= threshold\n })\n\n useEffect(() => {\n const handler = () => setVisible(window.scrollY >= threshold)\n window.addEventListener('scroll', handler, { passive: true })\n return () => window.removeEventListener('scroll', handler)\n }, [threshold])\n\n if (!visible) return null\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label=\"Scroll to top\"\n onClick={() =>\n window.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' })\n }\n className={cx(\n 'bg-accent text-accent-fg hover:bg-accent/90 fixed right-6 bottom-6 z-40 flex h-10 w-10 items-center justify-center rounded-full shadow-lg transition-opacity',\n focusCls,\n className\n )}\n data-component=\"scroll-to-top\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 12V4M4 7l4-3 4 3\" />\n </svg>\n </button>\n )\n }\n)\n","// segmented-control — mutually exclusive button group (iOS-style)\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype SegmentedControlOption = {\n value: string\n label: string\n}\n\ntype SegmentedControlSize = 'default' | 'sm'\n\ntype SegmentedControlProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n options: SegmentedControlOption[]\n value: string\n onChange: (value: string) => void\n size?: SegmentedControlSize\n disabled?: boolean\n glass?: boolean\n}\n\nconst sizeClasses: Record<SegmentedControlSize, string> = {\n default: 'px-3 py-1.5 text-xs',\n sm: 'px-2 py-1 text-[11px]',\n}\n\nconst SegmentedControl = forwardRef<HTMLDivElement, SegmentedControlProps>(\n function SegmentedControl(\n {\n options,\n value,\n onChange,\n size = 'default',\n disabled,\n glass,\n className,\n ...props\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-button bg-bg-tertiary inline-flex p-0.5 select-none',\n glass === true && glassClass(glass),\n disabled === true && 'pointer-events-none opacity-50',\n className\n )}\n data-component=\"segmented-control\"\n data-state={disabled === true ? 'disabled' : 'enabled'}\n role=\"radiogroup\"\n {...props}\n >\n {options.map((option) => {\n const isActive = option.value === value\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={disabled}\n onClick={() => {\n if (!isActive) {\n onChange(option.value)\n }\n }}\n className={cx(\n 'gds-radius-button transition-all',\n sizeClasses[size ?? 'default'],\n focusCls,\n isActive\n ? 'bg-bg text-fg gds-shadow-sm font-medium'\n : 'text-fg-muted hover:text-fg'\n )}\n >\n {option.label}\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport { SegmentedControl }\nexport type {\n SegmentedControlOption,\n SegmentedControlProps,\n SegmentedControlSize,\n}\n","// shortcut-display — keyboard shortcut with optional description\nimport { forwardRef } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype ShortcutDisplayProps = React.HTMLAttributes<HTMLSpanElement> & {\n description?: string\n keys: string[]\n}\n\nexport const ShortcutDisplay = forwardRef<\n HTMLSpanElement,\n ShortcutDisplayProps\n>(function ShortcutDisplay({ className, description, keys, ...props }, ref) {\n return (\n <span\n className={cx('inline-flex items-center gap-2', className)}\n data-component=\"shortcut-display\"\n ref={ref}\n {...props}\n >\n <span className=\"inline-flex items-center gap-0.5\">\n {keys.map((key, i) => (\n <Kbd key={i}>{key}</Kbd>\n ))}\n </span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs\">{description}</span>\n )}\n </span>\n )\n})\n\nexport type { ShortcutDisplayProps }\n","// skeleton-group — predefined skeleton layouts for common loading patterns\nimport { forwardRef } from 'react'\n\nimport { Skeleton } from '../l2-primitives/skeleton'\nimport { cx } from '../utils/cx'\n\ntype SkeletonGroupVariant = 'avatar-text' | 'card' | 'form-field'\n\ntype SkeletonGroupProps = {\n className?: string\n count?: number\n variant?: SkeletonGroupVariant\n}\n\nconst layouts: Record<SkeletonGroupVariant, () => React.ReactNode> = {\n 'avatar-text': () => (\n <div className=\"flex items-center gap-3\">\n <Skeleton variant=\"circle\" />\n <div className=\"flex flex-1 flex-col gap-2\">\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"40%\" />\n </div>\n </div>\n ),\n card: () => (\n <div className=\"flex flex-col gap-3\">\n <Skeleton variant=\"rect\" />\n <Skeleton variant=\"text\" />\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"50%\" />\n </div>\n ),\n 'form-field': () => (\n <div className=\"flex flex-col gap-2\">\n <Skeleton variant=\"text\" width=\"30%\" />\n <Skeleton variant=\"rect\" height={36} />\n </div>\n ),\n}\n\nexport const SkeletonGroup = forwardRef<HTMLDivElement, SkeletonGroupProps>(\n function SkeletonGroup(\n { className, count = 1, variant = 'avatar-text' },\n ref\n ) {\n const render = layouts[variant]\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"skeleton-group\"\n data-variant={variant}\n >\n {Array.from({ length: count }, (_, i) => (\n <div key={i}>{render()}</div>\n ))}\n </div>\n )\n }\n)\n\nexport type { SkeletonGroupProps, SkeletonGroupVariant }\n","// sparkle — animated sparkle/star particles around a child element\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type SparkleProps = {\n children: React.ReactNode\n active?: boolean\n count?: number\n color?: string\n className?: string\n}\n\nconst STAR_PATH = 'M12 0l3 9 9 3-9 3-3 9-3-9-9-3 9-3z'\n\nfunction starStyle(i: number, count: number): React.CSSProperties {\n const angle = (360 / count) * i\n const rad = (angle * Math.PI) / 180\n const dist = 70 + (i % 3) * 15\n const x = Math.cos(rad) * dist\n const y = Math.sin(rad) * dist\n return {\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: 10,\n height: 10,\n transform: `translate(${x}%, ${y}%)`,\n animation: `gds-sparkle 1.4s ease-in-out ${i * 0.2}s infinite`,\n opacity: 0,\n }\n}\n\nexport const Sparkle = forwardRef<HTMLSpanElement, SparkleProps>(\n function Sparkle(\n {\n children,\n active = true,\n count = 3,\n color = 'var(--gds-accent)',\n className,\n },\n ref\n ) {\n const particles = Array.from({ length: count }, (_, i) => i)\n\n return (\n <span\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"sparkle\"\n >\n {children}\n {active &&\n particles.map((i) => (\n <svg\n key={i}\n viewBox=\"0 0 24 24\"\n fill={color}\n style={starStyle(i, count)}\n aria-hidden=\"true\"\n >\n <path d={STAR_PATH} />\n </svg>\n ))}\n {active && (\n <style>{`\n @keyframes gds-sparkle {\n 0%, 100% { opacity: 0; transform: scale(0) rotate(0deg); }\n 50% { opacity: 1; transform: scale(1) rotate(180deg); }\n }\n `}</style>\n )}\n </span>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { Children } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StaggerProps = {\n animation?: 'fade' | 'scale' | 'slide-up'\n children: ReactNode[]\n className?: string\n delay?: number\n}\n\nconst animationClasses: Record<string, string> = {\n fade: 'animate-[stagger-fade_0.4s_ease_both]',\n scale: 'animate-[stagger-scale_0.4s_ease_both]',\n 'slide-up': 'animate-[stagger-slide-up_0.4s_ease_both]',\n}\n\nexport function Stagger({\n animation = 'fade',\n children,\n className,\n delay = 80,\n}: StaggerProps) {\n const items = Children.toArray(children)\n return (\n <div className={cx('', className)} data-component=\"stagger\">\n {items.map((child, i) => (\n <div\n className={animationClasses[animation]}\n key={i}\n style={{ animationDelay: `${i * delay}ms` }}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport type { StaggerProps }\n","// star-rating — read-only star rating display with half-star support\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst sizeMap = { sm: 14, default: 18, lg: 24 }\nconst STAR_D =\n 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z'\n\ntype StarRatingProps = {\n value: number\n max?: number\n size?: 'sm' | 'default' | 'lg'\n color?: string\n className?: string\n}\n\nfunction StarIcon({\n fill,\n s,\n color,\n}: {\n fill: 'full' | 'half' | 'empty'\n s: number\n color: string\n}) {\n const id = `half-${Math.random().toString(36).slice(2, 8)}`\n if (fill === 'full') {\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill={color}\n stroke={color}\n strokeWidth={1}\n >\n <path d={STAR_D} />\n </svg>\n )\n }\n if (fill === 'half') {\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n stroke={color}\n strokeWidth={1}\n >\n <defs>\n <clipPath id={id}>\n <rect x=\"0\" y=\"0\" width=\"12\" height=\"24\" />\n </clipPath>\n </defs>\n <path d={STAR_D} fill=\"none\" />\n <path d={STAR_D} fill={color} clipPath={`url(#${id})`} />\n </svg>\n )\n }\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1}\n className=\"text-fg-muted/30\"\n >\n <path d={STAR_D} />\n </svg>\n )\n}\n\nconst StarRating = forwardRef<HTMLDivElement, StarRatingProps>(\n function StarRating(\n { value, max = 5, size = 'default', color = 'currentColor', className },\n ref\n ) {\n const s = sizeMap[size]\n const c = color === 'currentColor' ? 'var(--color-warning)' : color\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-0.5', className)}\n data-component=\"star-rating\"\n role=\"img\"\n aria-label={`${value} out of ${max} stars`}\n >\n {Array.from({ length: max }, (_, i) => {\n const diff = value - i\n const fill = diff >= 1 ? 'full' : diff >= 0.5 ? 'half' : 'empty'\n return <StarIcon key={i} fill={fill} s={s} color={c} />\n })}\n </div>\n )\n }\n)\n\nexport { StarRating }\nexport type { StarRatingProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype StatusType =\n | 'active'\n | 'draft'\n | 'error'\n | 'inactive'\n | 'pending'\n | 'warning'\n\nconst statusColorMap: Record<StatusType, string> = {\n active: 'bg-success/10 text-success',\n draft: 'bg-fg-muted/10 text-fg-muted',\n error: 'bg-danger/10 text-danger',\n inactive: 'bg-fg-muted/10 text-fg-muted',\n pending: 'bg-warning/10 text-warning',\n warning: 'bg-warning/10 text-warning',\n}\n\ntype StatusBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n glass?: boolean\n icon?: ReactNode\n label?: string\n size?: 'default' | 'sm'\n status: StatusType\n}\n\nexport const StatusBadge = forwardRef<HTMLSpanElement, StatusBadgeProps>(\n function StatusBadge(\n { className, glass, icon, label, size = 'default', status, ...props },\n ref\n ) {\n const displayLabel = label ?? status\n const sizeClasses =\n size === 'sm'\n ? 'gds-pad-x-sm py-px gds-text-caption'\n : 'gds-pad-x-sm gds-pad-y-sm gds-text-body'\n\n return (\n <span\n className={cx(\n 'gds-gap-xs gds-radius-badge inline-flex items-center font-medium select-none',\n sizeClasses,\n statusColorMap[status],\n glassClass(glass),\n glass === true && 'border border-white/10 bg-white/5',\n className\n )}\n data-component=\"status-badge\"\n data-state={status}\n ref={ref}\n {...props}\n >\n {icon !== undefined && (\n <span className=\"gds-icon-child-sm\">{icon}</span>\n )}\n {displayLabel}\n </span>\n )\n }\n)\n\nconst statusBadgeVariants = {\n status: statusColorMap,\n size: {\n default: 'gds-pad-x-sm gds-pad-y-sm gds-text-body',\n sm: 'gds-pad-x-sm py-px gds-text-caption',\n },\n} as const\n\nexport { statusBadgeVariants }\nexport type { StatusBadgeProps, StatusType }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StatusDotStatus = 'connected' | 'connecting' | 'disconnected'\n\ntype StatusDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n status: StatusDotStatus\n}\n\nconst dotCls: Record<StatusDotStatus, string> = {\n connected: 'bg-success',\n connecting: 'bg-warning animate-pulse',\n disconnected: 'bg-danger',\n}\n\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n function StatusDot({ className, label, status, ...props }, ref) {\n return (\n <span\n className={cx('gds-gap-sm inline-flex items-center', className)}\n data-component=\"status-dot\"\n data-state={status}\n ref={ref}\n {...props}\n >\n <span className={cx('h-2 w-2 shrink-0 rounded-full', dotCls[status])} />\n {label !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nconst statusDotVariants = {\n status: dotCls,\n} as const\n\nexport { statusDotVariants }\nexport type { StatusDotProps, StatusDotStatus }\n","// switch-group — list of labeled switches for settings pages\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Switch } from './switch'\n\ntype SwitchGroupItem = {\n checked: boolean\n description?: string\n id: string\n label: string\n}\n\ntype SwitchGroupProps = {\n className?: string\n disabled?: boolean\n items: SwitchGroupItem[]\n onChange: (id: string, checked: boolean) => void\n}\n\nexport const SwitchGroup = forwardRef<HTMLDivElement, SwitchGroupProps>(\n function SwitchGroup({ className, disabled = false, items, onChange }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-3', className)}\n data-component=\"switch-group\"\n role=\"group\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n className=\"gds-pad-x gds-pad-y-sm flex items-center justify-between gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-text-body text-fg font-medium\">\n {item.label}\n </div>\n {item.description !== undefined && (\n <div className=\"gds-text-caption text-fg-muted mt-0.5\">\n {item.description}\n </div>\n )}\n </div>\n <Switch\n checked={item.checked}\n disabled={disabled}\n onChange={(checked) => onChange(item.id, checked)}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { SwitchGroupItem, SwitchGroupProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent/15 text-accent',\n danger: 'bg-danger/15 text-danger',\n muted: 'bg-fg-muted/10 text-fg-muted',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n} as const\n\nconst sizeMap = {\n default: 'px-1.5 py-0.5 text-[10px]',\n sm: 'px-1 py-px text-[9px]',\n} as const\n\ntype TextBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n label: string\n size?: 'default' | 'sm'\n variant?: 'accent' | 'danger' | 'muted' | 'success' | 'warning'\n}\n\nexport const TextBadge = forwardRef<HTMLSpanElement, TextBadgeProps>(\n function TextBadge(\n { className, label, size = 'default', variant = 'accent', ...props },\n ref\n ) {\n return (\n <span\n className={cx(\n 'inline-flex items-center rounded-full leading-none font-bold tracking-wider uppercase select-none',\n variantMap[variant],\n sizeMap[size],\n className\n )}\n data-component=\"text-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n {label}\n </span>\n )\n }\n)\n\nexport type { TextBadgeProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TextEffectType = 'glow' | 'gradient' | 'highlight'\n\ntype TextEffectProps = React.HTMLAttributes<HTMLSpanElement> & {\n children: string\n effect: TextEffectType\n gradientFrom?: string\n gradientTo?: string\n}\n\nexport const TextEffect = forwardRef<HTMLSpanElement, TextEffectProps>(\n function TextEffect(\n { children, className, effect, gradientFrom, gradientTo, style, ...props },\n ref\n ) {\n const from = gradientFrom ?? 'var(--gds-accent)'\n const to = gradientTo ?? 'var(--gds-success)'\n\n if (effect === 'gradient') {\n return (\n <span\n className={cx('bg-clip-text text-transparent', className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={{\n backgroundImage: `linear-gradient(135deg, ${from}, ${to})`,\n ...style,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (effect === 'highlight') {\n return (\n <span\n className={cx('bg-accent/20 box-decoration-clone px-1', className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={style}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n // glow\n return (\n <span\n className={cx(className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={{\n textShadow: `0 0 8px var(--gds-accent), 0 0 16px var(--gds-accent)`,\n ...style,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { TextEffectProps, TextEffectType }\n","// textarea-counter — textarea with character count display\nimport { forwardRef } from 'react'\n\nimport type { TextareaProps } from '../l2-primitives/textarea'\nimport { Textarea } from '../l2-primitives/textarea'\nimport { cx } from '../utils/cx'\n\ntype TextareaCounterProps = Omit<TextareaProps, 'onChange'> & {\n maxLength?: number\n onChange: (value: string) => void\n value: string\n}\n\nexport const TextareaCounter = forwardRef<\n HTMLTextAreaElement,\n TextareaCounterProps\n>(function TextareaCounter(\n { className, error, maxLength, onChange, value, ...props },\n ref\n) {\n const count = value.length\n const nearLimit = maxLength !== undefined && count >= maxLength * 0.9\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"textarea-counter\"\n >\n <Textarea\n error={error ?? nearLimit}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n ref={ref}\n value={value}\n {...props}\n />\n <div\n className={cx(\n 'mt-1 text-right text-[11px]',\n nearLimit ? 'text-danger' : 'text-fg-muted'\n )}\n >\n {maxLength !== undefined ? `${count} / ${maxLength}` : count}\n </div>\n </div>\n )\n})\n\nexport type { TextareaCounterProps }\n","// theme-toggle — dark/light mode toggle with icon transition\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype ThemeToggleMode = 'dark' | 'light'\n\nexport type ThemeToggleProps = {\n mode: ThemeToggleMode\n onChange: (mode: ThemeToggleMode) => void\n size?: 'default' | 'sm'\n className?: string\n}\n\nconst sizeMap = {\n default: 'h-8 w-8',\n sm: 'h-6 w-6',\n}\n\nconst iconSizeMap = {\n default: 16,\n sm: 14,\n}\n\nexport const ThemeToggle = forwardRef<HTMLButtonElement, ThemeToggleProps>(\n function ThemeToggle({ mode, onChange, size = 'default', className }, ref) {\n const isDark = mode === 'dark'\n const iconSize = iconSizeMap[size]\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}\n onClick={() => onChange(isDark ? 'light' : 'dark')}\n className={cx(\n 'text-fg-muted hover:text-fg inline-flex items-center justify-center rounded-full transition-colors select-none',\n sizeMap[size],\n focusCls,\n className\n )}\n data-component=\"theme-toggle\"\n data-state={mode}\n >\n {isDark ? (\n // sun icon — shown in dark mode, click to switch to light\n <svg\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"transition-transform duration-200\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <path d=\"M8 1v2M8 13v2M1 8h2M13 8h2M3.05 3.05l1.41 1.41M11.54 11.54l1.41 1.41M3.05 12.95l1.41-1.41M11.54 4.46l1.41-1.41\" />\n </svg>\n ) : (\n // moon icon — shown in light mode, click to switch to dark\n <svg\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"transition-transform duration-200\"\n >\n <path d=\"M13.5 8.5a5.5 5.5 0 01-7-7A5.5 5.5 0 108 14a5.48 5.48 0 005.5-5.5z\" />\n </svg>\n )}\n </button>\n )\n }\n)\n","// toggle-group — group of toggle buttons, one or more can be active\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype ToggleGroupItem = {\n value: string\n label: ReactNode\n}\n\ntype ToggleGroupSize = 'default' | 'lg' | 'sm'\n\ntype ToggleGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n items: ToggleGroupItem[]\n value: string[]\n onChange: (value: string[]) => void\n exclusive?: boolean\n size?: ToggleGroupSize\n disabled?: boolean\n}\n\nconst toggleGroupVariants = {\n size: {\n sm: 'px-2 py-1 text-[11px]',\n default: 'px-3 py-1.5 text-xs',\n lg: 'px-4 py-2 text-sm',\n },\n} as const\n\nconst toggleItemVariants = toggleGroupVariants\n\nconst ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(\n function ToggleGroup(\n {\n items,\n value,\n onChange,\n exclusive,\n size = 'default',\n disabled,\n className,\n ...props\n },\n ref\n ) {\n function handleClick(itemValue: string) {\n if (exclusive === true) {\n // exclusive: always select the clicked one (no deselect)\n if (!value.includes(itemValue)) {\n onChange([itemValue])\n }\n return\n }\n // multi: toggle\n if (value.includes(itemValue)) {\n onChange(value.filter((v) => v !== itemValue))\n } else {\n onChange([...value, itemValue])\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-button border-border bg-bg inline-flex overflow-hidden border select-none',\n disabled === true && 'pointer-events-none opacity-50',\n className\n )}\n data-component=\"toggle-group\"\n data-state={disabled === true ? 'disabled' : 'enabled'}\n role=\"group\"\n {...props}\n >\n {items.map((item, index) => {\n const isActive = value.includes(item.value)\n const isLast = index === items.length - 1\n return (\n <button\n key={item.value}\n aria-pressed={isActive}\n className={cx(\n 'transition-colors',\n toggleGroupVariants.size[size ?? 'default'],\n !isLast && 'border-border border-r',\n focusCls,\n isActive\n ? 'bg-accent/10 text-accent'\n : 'text-fg-muted hover:bg-bg-tertiary'\n )}\n disabled={disabled}\n onClick={() => handleClick(item.value)}\n type=\"button\"\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport { ToggleGroup, toggleGroupVariants, toggleItemVariants }\nexport type { ToggleGroupItem, ToggleGroupProps, ToggleGroupSize }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TrendArrowDirection = 'up' | 'down' | 'flat'\ntype TrendArrowSize = 'sm' | 'default'\n\ntype TrendArrowProps = React.HTMLAttributes<HTMLSpanElement> & {\n direction: TrendArrowDirection\n size?: TrendArrowSize\n}\n\nconst sizeMap: Record<TrendArrowSize, number> = { sm: 12, default: 16 }\n\nconst TrendArrow = forwardRef<HTMLSpanElement, TrendArrowProps>(\n function TrendArrow(\n { className, direction, size = 'default', ...props },\n ref\n ) {\n const s = sizeMap[size]\n const colorCls =\n direction === 'up'\n ? 'text-success'\n : direction === 'down'\n ? 'text-danger'\n : 'text-fg-muted'\n\n return (\n <span\n className={cx('inline-flex', colorCls, className)}\n data-component=\"trend-arrow\"\n data-direction={direction}\n ref={ref}\n {...props}\n >\n <svg\n fill=\"none\"\n height={s}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n width={s}\n >\n {direction === 'up' && <path d=\"M12 19V5M5 12l7-7 7 7\" />}\n {direction === 'down' && <path d=\"M12 5v14M19 12l-7 7-7-7\" />}\n {direction === 'flat' && <path d=\"M5 12h14\" />}\n </svg>\n </span>\n )\n }\n)\n\nexport { TrendArrow }\nexport type { TrendArrowDirection, TrendArrowProps, TrendArrowSize }\n","import { cx } from '../utils/cx'\n\ntype TrendIndicatorProps = {\n className?: string\n inverse?: boolean\n label?: string\n value: number\n}\n\nexport function TrendIndicator({\n className,\n inverse = false,\n label,\n value,\n}: TrendIndicatorProps) {\n const isPositive = value > 0\n const isNegative = value < 0\n const isZero = value === 0\n\n const colorClass = isZero\n ? 'text-fg-muted'\n : isPositive\n ? inverse\n ? 'text-danger'\n : 'text-success'\n : inverse\n ? 'text-success'\n : 'text-danger'\n\n const arrow = isPositive ? '\\u25B2' : isNegative ? '\\u25BC' : '\\u2500'\n const sign = isPositive ? '+' : ''\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1 text-sm font-medium select-none',\n colorClass,\n className\n )}\n data-component=\"trend-indicator\"\n >\n <span className=\"text-[10px]\">{arrow}</span>\n <span>\n {sign}\n {value}%\n </span>\n {label !== undefined && (\n <span className=\"text-fg-muted text-xs font-normal\">{label}</span>\n )}\n </span>\n )\n}\n\nexport type { TrendIndicatorProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TruncatedListProps = React.HTMLAttributes<HTMLDivElement> & {\n items: ReactNode[]\n max?: number\n moreLabel?: (count: number) => string\n}\n\nexport const TruncatedList = forwardRef<HTMLDivElement, TruncatedListProps>(\n function TruncatedList(\n { className, items, max = 3, moreLabel, ...props },\n ref\n ) {\n const visible = items.slice(0, max)\n const remaining = items.length - max\n\n return (\n <div\n className={cx(\n 'gds-gap-sm inline-flex flex-wrap items-center',\n className\n )}\n data-component=\"truncated-list\"\n ref={ref}\n {...props}\n >\n {visible.map((item, i) => (\n <span key={i}>{item}</span>\n ))}\n {remaining > 0 && (\n <span className=\"gds-text-label text-fg-muted\">\n {moreLabel !== undefined\n ? moreLabel(remaining)\n : `+${remaining} more`}\n </span>\n )}\n </div>\n )\n }\n)\n\nexport type { TruncatedListProps }\n","// typewriter — characters appear one by one\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TypewriterProps = {\n text: string\n speed?: number\n delay?: number\n cursor?: boolean\n onComplete?: () => void\n className?: string\n}\n\nexport const Typewriter = forwardRef<HTMLSpanElement, TypewriterProps>(\n function Typewriter(\n { text, speed = 50, delay = 0, cursor = true, onComplete, className },\n ref\n ) {\n const [length, setLength] = useState(0)\n const [started, setStarted] = useState(delay <= 0)\n\n useEffect(() => {\n if (delay <= 0) return\n const timer = setTimeout(() => setStarted(true), delay)\n return () => clearTimeout(timer)\n }, [delay])\n\n useEffect(() => {\n if (!started) return\n if (length >= text.length) {\n if (onComplete !== undefined) onComplete()\n return\n }\n const timer = setTimeout(() => setLength((prev) => prev + 1), speed)\n return () => clearTimeout(timer)\n }, [length, text.length, speed, started, onComplete])\n\n // reset when text changes\n useEffect(() => {\n setLength(0)\n if (delay <= 0) setStarted(true)\n }, [text, delay])\n\n return (\n <span ref={ref} className={cx(className)} data-component=\"typewriter\">\n {text.slice(0, length)}\n {cursor && (\n <span\n className=\"inline-block animate-pulse\"\n data-testid=\"cursor\"\n aria-hidden\n >\n |\n </span>\n )}\n </span>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VerifiedBadgeVariant = 'default' | 'gold' | 'official'\n\ntype VerifiedBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n size?: 'default' | 'sm'\n variant?: VerifiedBadgeVariant\n}\n\nconst variantColors: Record<VerifiedBadgeVariant, string> = {\n default: 'text-accent',\n gold: 'text-warning',\n official: 'text-success',\n}\n\nconst sizeMap = { default: 16, sm: 12 } as const\n\nexport const VerifiedBadge = forwardRef<HTMLSpanElement, VerifiedBadgeProps>(\n function VerifiedBadge(\n { className, size = 'default', variant = 'default', ...props },\n ref\n ) {\n const s = sizeMap[size]\n return (\n <span\n className={cx(\n 'inline-flex shrink-0 items-center',\n variantColors[variant],\n className\n )}\n data-component=\"verified-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n <svg fill=\"currentColor\" height={s} viewBox=\"0 0 24 24\" width={s}>\n <path d=\"M12 1l3.09 2.26L19 3.27l.01 3.91L22 10.18 19.82 13l.18 3.91-3.91 1.01L13.09 21 12 23l-3.09-2.26L5 21.73l-.01-3.91L2 14.82 4.18 12l-.18-3.91 3.91-1.01L10.91 4 12 1zm-1.5 12.5l5-5-1.41-1.41L10.5 10.67 8.41 8.59 7 10l3.5 3.5z\" />\n </svg>\n </span>\n )\n }\n)\n\nexport type { VerifiedBadgeProps, VerifiedBadgeVariant }\n","// visual-counter — number display with +/- controls\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype VisualCounterProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n value: number\n onChange: (value: number) => void\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n}\n\nexport const VisualCounter = forwardRef<HTMLDivElement, VisualCounterProps>(\n function VisualCounter(\n {\n value,\n onChange,\n min,\n max,\n step = 1,\n disabled = false,\n className,\n ...props\n },\n ref\n ) {\n const atMin = min !== undefined && value <= min\n const atMax = max !== undefined && value >= max\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-1 select-none', className)}\n data-component=\"visual-counter\"\n {...props}\n >\n <button\n type=\"button\"\n className={cx(\n 'border-border text-fg-muted hover:bg-bg-tertiary flex h-7 w-7 items-center justify-center rounded-md border transition-colors disabled:opacity-40',\n focusCls\n )}\n disabled={disabled || atMin}\n onClick={() => onChange(Math.max(min ?? -Infinity, value - step))}\n >\n −\n </button>\n <span className=\"gds-text text-fg min-w-[2rem] text-center tabular-nums\">\n {value}\n </span>\n <button\n type=\"button\"\n className={cx(\n 'border-border text-fg-muted hover:bg-bg-tertiary flex h-7 w-7 items-center justify-center rounded-md border transition-colors disabled:opacity-40',\n focusCls\n )}\n disabled={disabled || atMax}\n onClick={() => onChange(Math.min(max ?? Infinity, value + step))}\n >\n +\n </button>\n </div>\n )\n }\n)\n\nexport type { VisualCounterProps }\n","import { useCallback } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VolumeSliderProps = {\n className?: string\n onChange: (v: number) => void\n value: number\n}\n\nconst TOTAL_BARS = 10\n\nexport function VolumeSlider({\n className,\n onChange,\n value,\n}: VolumeSliderProps) {\n const filledBars = Math.round((value / 100) * TOTAL_BARS)\n\n const handleBarClick = useCallback(\n (barIndex: number) => {\n onChange(Math.round(((barIndex + 1) / TOTAL_BARS) * 100))\n },\n [onChange]\n )\n\n return (\n <div\n className={cx(\n 'inline-flex flex-col-reverse items-center gap-1 select-none',\n className\n )}\n data-component=\"volume-slider\"\n >\n {Array.from({ length: TOTAL_BARS }, (_, i) => (\n <button\n className={cx(\n 'h-2 w-8 cursor-pointer rounded-sm transition-colors',\n i < filledBars ? 'bg-accent' : 'bg-bg-tertiary'\n )}\n key={i}\n onClick={() => handleBarClick(i)}\n type=\"button\"\n />\n ))}\n </div>\n )\n}\n\nexport type { VolumeSliderProps }\n","// zoom-on-hover — wrapper that scales content on hover\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ZoomOnHoverProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n duration?: number\n scale?: number\n}\n\nexport const ZoomOnHover = forwardRef<HTMLDivElement, ZoomOnHoverProps>(\n function ZoomOnHover(\n { children, className, duration = 300, scale = 1.1, ...props },\n ref\n ) {\n return (\n <div\n className={cx('overflow-hidden', className)}\n data-component=\"zoom-on-hover\"\n ref={ref}\n {...props}\n >\n <div\n className=\"transition-transform ease-out\"\n style={{ transitionDuration: `${duration}ms` }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = `scale(${scale})`\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n }}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\nexport type { ZoomOnHoverProps }\n"],"mappings":"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"}
1
+ {"version":3,"file":"l3-atoms-BCJNqPHk.js","names":[],"sources":["../src/l3-atoms/animated-border.tsx","../src/l3-atoms/animated-counter.tsx","../src/l3-atoms/animated-number.tsx","../src/l3-atoms/avatar-badge.tsx","../src/l3-atoms/barcode.tsx","../src/l3-atoms/blinking.tsx","../src/l3-atoms/bounce-dot.tsx","../src/l3-atoms/checkbox-group.tsx","../src/l3-atoms/color-swatch.tsx","../src/l3-atoms/copy-button.tsx","../src/l3-atoms/count-badge.tsx","../src/l3-atoms/count-up.tsx","../src/l3-atoms/countdown.tsx","../src/l3-atoms/countdown-badge.tsx","../src/l3-atoms/cursor-follow.tsx","../src/l3-atoms/diff-indicator.tsx","../src/l3-atoms/glow-dot.tsx","../src/l3-atoms/gradient-text.tsx","../src/l3-atoms/heat-cell.tsx","../src/l3-atoms/hotkey.tsx","../src/l3-atoms/info-tip.tsx","../src/l3-atoms/key-value.tsx","../src/l3-atoms/keyboard-shortcut.tsx","../src/l3-atoms/live-dot.tsx","../src/l3-atoms/magnetic-button.tsx","../src/l3-atoms/marquee.tsx","../src/l3-atoms/meter.tsx","../src/l3-atoms/number-flow.tsx","../src/l3-atoms/online-indicator.tsx","../src/l3-atoms/orbit.tsx","../src/l3-atoms/percentage.tsx","../src/l3-atoms/percentage-circle.tsx","../src/l3-atoms/price.tsx","../src/l3-atoms/progress-circle.tsx","../src/l3-atoms/progress-ring.tsx","../src/l3-atoms/pulse-indicator.tsx","../src/l3-atoms/pulse-ring.tsx","../src/l3-atoms/qr-code.tsx","../src/l3-atoms/quick-action.tsx","../src/l3-atoms/radio-group.tsx","../src/l3-atoms/rating.tsx","../src/l3-atoms/relative-time.tsx","../src/l3-atoms/ribbon.tsx","../src/l3-atoms/ribbon-banner.tsx","../src/l3-atoms/ripple-effect.tsx","../src/l3-atoms/scroll-progress.tsx","../src/l3-atoms/scroll-to-top.tsx","../src/l3-atoms/segmented-control.tsx","../src/l3-atoms/shortcut-display.tsx","../src/l3-atoms/skeleton-group.tsx","../src/l3-atoms/sparkle.tsx","../src/l3-atoms/stagger.tsx","../src/l3-atoms/star-rating.tsx","../src/l3-atoms/status-badge.tsx","../src/l3-atoms/status-dot.tsx","../src/l3-atoms/switch-group.tsx","../src/l3-atoms/text-badge.tsx","../src/l3-atoms/text-effect.tsx","../src/l3-atoms/textarea-counter.tsx","../src/l3-atoms/theme-toggle.tsx","../src/l3-atoms/toggle-group.tsx","../src/l3-atoms/trend-arrow.tsx","../src/l3-atoms/trend-indicator.tsx","../src/l3-atoms/truncated-list.tsx","../src/l3-atoms/typewriter.tsx","../src/l3-atoms/verified-badge.tsx","../src/l3-atoms/visual-counter.tsx","../src/l3-atoms/volume-slider.tsx","../src/l3-atoms/zoom-on-hover.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedBorderProps = {\n children: ReactNode\n className?: string\n variant?: 'dash' | 'gradient' | 'pulse'\n}\n\nconst variantClasses = {\n dash: 'border-2 border-dashed border-accent/40 animate-[dash-march_1s_linear_infinite]',\n gradient:\n 'border-0 bg-gradient-to-r from-accent via-success to-accent bg-[length:200%_100%] animate-[gradient-shift_3s_ease_infinite] p-[2px]',\n pulse:\n 'border-2 border-accent animate-[border-pulse_2s_ease-in-out_infinite]',\n}\n\nexport function AnimatedBorder({\n children,\n className,\n variant = 'gradient',\n}: AnimatedBorderProps) {\n if (variant === 'gradient') {\n return (\n <div\n className={cx('rounded-lg', variantClasses.gradient, className)}\n data-component=\"animated-border\"\n >\n <div className=\"bg-bg rounded-[calc(0.5rem-2px)]\">{children}</div>\n </div>\n )\n }\n return (\n <div\n className={cx('rounded-lg', variantClasses[variant], className)}\n data-component=\"animated-border\"\n >\n {children}\n </div>\n )\n}\n\nexport type { AnimatedBorderProps }\n","// animated-counter — number display with animated transitions\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedCounterProps = React.HTMLAttributes<HTMLSpanElement> & {\n duration?: number\n format?: (n: number) => string\n prefix?: string\n suffix?: string\n value: number\n}\n\nconst defaultFormat = (n: number): string => {\n if (Number.isInteger(n)) return n.toLocaleString()\n return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n}\n\nexport const AnimatedCounter = forwardRef<\n HTMLSpanElement,\n AnimatedCounterProps\n>(function AnimatedCounter(\n {\n className,\n duration = 500,\n format = defaultFormat,\n prefix,\n suffix,\n value,\n ...props\n },\n ref\n) {\n const [display, setDisplay] = useState(value)\n const prevRef = useRef(value)\n const rafRef = useRef<number>(0)\n\n useEffect(() => {\n const from = prevRef.current\n const to = value\n prevRef.current = to\n\n if (from === to) return\n\n const startTime = performance.now()\n const diff = to - from\n\n const animate = (now: number) => {\n const elapsed = now - startTime\n const progress = Math.min(1, elapsed / duration)\n // ease out cubic\n const eased = 1 - Math.pow(1 - progress, 3)\n setDisplay(from + diff * eased)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setDisplay(to)\n }\n }\n\n rafRef.current = requestAnimationFrame(animate)\n return () => cancelAnimationFrame(rafRef.current)\n }, [value, duration])\n\n return (\n <span\n className={cx('tabular-nums select-none', className)}\n data-component=\"animated-counter\"\n ref={ref}\n {...props}\n >\n {prefix !== undefined && <span>{prefix}</span>}\n {format(display)}\n {suffix !== undefined && <span>{suffix}</span>}\n </span>\n )\n})\n\nexport type { AnimatedCounterProps }\n","// animated-number — number display that animates when value changes\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type AnimatedNumberProps = {\n value: number\n duration?: number\n format?: (n: number) => string\n className?: string\n}\n\nfunction defaultFormat(n: number): string {\n return n.toLocaleString()\n}\n\nfunction easeOut(t: number): number {\n return 1 - Math.pow(1 - t, 3)\n}\n\nexport const AnimatedNumber = forwardRef<HTMLSpanElement, AnimatedNumberProps>(\n function AnimatedNumber(\n { value, duration = 500, format = defaultFormat, className },\n ref\n ) {\n const [display, setDisplay] = useState(value)\n const prevRef = useRef(value)\n\n useEffect(() => {\n const from = prevRef.current\n prevRef.current = value\n\n if (duration <= 0) {\n setDisplay(value)\n return\n }\n\n const start = performance.now()\n let raf: number\n\n function tick(now: number) {\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n setDisplay(from + (value - from) * easeOut(progress))\n if (progress < 1) {\n raf = requestAnimationFrame(tick)\n }\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, duration])\n\n return (\n <span\n ref={ref}\n className={cx('tabular-nums', className)}\n data-component=\"animated-number\"\n >\n {format(display)}\n </span>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { cx } from '../utils/cx'\nimport type { AvatarProps } from './avatar'\nimport { Avatar } from './avatar'\n\ntype AvatarBadgeProps = AvatarProps & {\n count?: number\n maxCount?: number\n}\n\nexport const AvatarBadge = forwardRef<HTMLSpanElement, AvatarBadgeProps>(\n function AvatarBadge(\n { count, maxCount = 99, className, ...avatarProps },\n ref\n ) {\n const showBadge = count !== undefined && count > 0\n\n return (\n <span\n className={cx('relative inline-flex', className)}\n data-component=\"avatar-badge\"\n ref={ref}\n >\n <Avatar {...avatarProps} />\n {showBadge && (\n <Badge\n className=\"absolute -top-1 -right-1 z-10\"\n count={count}\n countMax={maxCount}\n />\n )}\n </span>\n )\n }\n)\n\nexport type { AvatarBadgeProps }\n","// barcode — simple barcode display using SVG (code 128 style appearance)\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type BarcodeProps = {\n value: string\n width?: number\n height?: number\n showValue?: boolean\n color?: string\n className?: string\n}\n\n// generate bar pattern from character codes\nfunction generateBars(value: string): number[] {\n const bars: number[] = []\n\n // start pattern — thick bars\n bars.push(3, 1, 1, 1, 3, 1)\n\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i)\n // alternate thick/thin based on char code bits\n bars.push(\n (code & 1) !== 0 ? 2 : 1,\n (code & 2) !== 0 ? 2 : 1,\n (code & 4) !== 0 ? 2 : 1,\n (code & 8) !== 0 ? 2 : 1,\n (code & 16) !== 0 ? 2 : 1,\n 1\n )\n }\n\n // stop pattern — thick bars\n bars.push(3, 1, 1, 1, 3)\n\n return bars\n}\n\nexport const Barcode = forwardRef<SVGSVGElement, BarcodeProps>(function Barcode(\n {\n value,\n width = 200,\n height = 60,\n showValue = true,\n color = 'currentColor',\n className,\n },\n ref\n) {\n const bars = useMemo(() => generateBars(value), [value])\n\n const totalUnits = bars.reduce((sum, b) => sum + b, 0)\n const barHeight = showValue ? height - 16 : height\n const unitWidth = width / totalUnits\n\n let x = 0\n const rects: Array<{ x: number; w: number }> = []\n for (let i = 0; i < bars.length; i++) {\n const w = bars[i] * unitWidth\n // even indices are bars, odd are spaces\n if (i % 2 === 0) {\n rects.push({ x, w })\n }\n x += w\n }\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cx('shrink-0', className)}\n data-component=\"barcode\"\n data-testid=\"barcode-svg\"\n role=\"img\"\n aria-label={`Barcode: ${value}`}\n >\n {rects.map((r, i) => (\n <rect\n key={i}\n x={r.x}\n y={0}\n width={r.w}\n height={barHeight}\n fill={color}\n />\n ))}\n {showValue && (\n <text\n x={width / 2}\n y={height - 2}\n textAnchor=\"middle\"\n fontSize={11}\n fill={color}\n fontFamily=\"monospace\"\n data-testid=\"barcode-text\"\n >\n {value}\n </text>\n )}\n </svg>\n )\n})\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst speedMap = {\n default: 'animate-pulse',\n fast: 'animate-pulse [animation-duration:0.5s]',\n slow: 'animate-pulse [animation-duration:3s]',\n} as const\n\ntype BlinkingSpeed = 'slow' | 'default' | 'fast'\n\ntype BlinkingProps = React.HTMLAttributes<HTMLSpanElement> & {\n active?: boolean\n speed?: BlinkingSpeed\n}\n\nexport const Blinking = forwardRef<HTMLSpanElement, BlinkingProps>(\n function Blinking(\n { active = true, children, className, speed = 'default', ...props },\n ref\n ) {\n return (\n <span\n className={cx(active && speedMap[speed], className)}\n data-component=\"blinking\"\n ref={ref}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { BlinkingProps, BlinkingSpeed }\n","// bounce-dot — bouncing dot loader animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype BounceDotProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n count?: number\n size?: 'default' | 'lg' | 'sm'\n}\n\nconst sizeClasses = {\n default: 'h-2 w-2',\n lg: 'h-3 w-3',\n sm: 'h-1.5 w-1.5',\n} as const\n\nexport const BounceDot = forwardRef<HTMLDivElement, BounceDotProps>(\n function BounceDot(\n { className, color, count = 3, size = 'default', ...props },\n ref\n ) {\n const dots = Array.from({ length: count }, (_, i) => i)\n\n return (\n <div\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"bounce-dot\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n {dots.map((i) => (\n <span\n className={cx(\n 'bg-fg-muted animate-[bounce-dot_1.4s_ease-in-out_infinite] rounded-full',\n sizeClasses[size]\n )}\n key={i}\n style={{\n animationDelay: `${i * 160}ms`,\n ...(color !== undefined ? { backgroundColor: color } : {}),\n }}\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { BounceDotProps }\n","// checkbox-group — group of checkboxes with optional select-all\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Checkbox } from './checkbox'\n\ntype CheckboxGroupOption = {\n label: string\n value: string\n}\n\ntype CheckboxGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n disabled?: boolean\n onChange: (value: string[]) => void\n options: CheckboxGroupOption[]\n selectAll?: boolean\n value: string[]\n}\n\nexport const CheckboxGroup = forwardRef<HTMLDivElement, CheckboxGroupProps>(\n function CheckboxGroup(\n {\n className,\n disabled = false,\n onChange,\n options,\n selectAll = false,\n value,\n ...props\n },\n ref\n ) {\n const allSelected =\n options.length > 0 && options.every((o) => value.includes(o.value))\n\n const handleToggle = (optValue: string, checked: boolean) => {\n if (checked) {\n onChange([...value, optValue])\n } else {\n onChange(value.filter((v) => v !== optValue))\n }\n }\n\n const handleSelectAll = (checked: boolean) => {\n if (checked) {\n onChange(options.map((o) => o.value))\n } else {\n onChange([])\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('gds-gap flex flex-col', className)}\n data-component=\"checkbox-group\"\n role=\"group\"\n {...props}\n >\n {selectAll && (\n <Checkbox\n checked={allSelected}\n disabled={disabled}\n label=\"Select all\"\n onChange={handleSelectAll}\n />\n )}\n {options.map((opt) => (\n <Checkbox\n checked={value.includes(opt.value)}\n disabled={disabled}\n key={opt.value}\n label={opt.label}\n onChange={(checked) => handleToggle(opt.value, checked)}\n />\n ))}\n </div>\n )\n }\n)\n\nexport type { CheckboxGroupOption, CheckboxGroupProps }\n","// color-swatch — color display block with optional copy-to-clipboard\nimport { cva } from 'class-variance-authority'\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst colorSwatchVariants = cva('rounded-md', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-10 w-10',\n lg: 'h-14 w-14',\n sm: 'h-7 w-7',\n },\n },\n})\n\ntype ColorSwatchProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof colorSwatchVariants> & {\n color: string\n copyable?: boolean\n label?: string\n }\n\nexport const ColorSwatch = forwardRef<HTMLSpanElement, ColorSwatchProps>(\n function ColorSwatch(\n { className, color, copyable = false, label, size, ...props },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleClick = useCallback(async () => {\n if (!copyable) return\n await navigator.clipboard.writeText(color)\n setCopied(true)\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n timerRef.current = setTimeout(() => {\n setCopied(false)\n timerRef.current = null\n }, 2000)\n }, [color, copyable])\n\n const swatchEl = (\n <span\n className={cx(colorSwatchVariants({ size }), 'block')}\n style={{ backgroundColor: color }}\n />\n )\n\n return (\n <span\n className={cx('inline-flex flex-col items-center gap-1', className)}\n data-component=\"color-swatch\"\n ref={ref}\n {...props}\n >\n {copyable ? (\n <button\n aria-label={`Copy ${color}`}\n className={cx('rounded-md select-none', focusCls)}\n onClick={handleClick}\n type=\"button\"\n >\n {swatchEl}\n </button>\n ) : (\n swatchEl\n )}\n <span className=\"text-fg-muted font-mono text-[10px]\">\n {copied ? 'Copied!' : color}\n </span>\n {label !== undefined && (\n <span className=\"text-fg-muted/60 text-[10px]\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nexport { colorSwatchVariants }\nexport type { ColorSwatchProps }\n","// copy-button — button that copies text to clipboard with feedback\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\n\nexport type CopyButtonProps = {\n text: string\n label?: string\n copiedLabel?: string\n variant?: 'default' | 'ghost'\n size?: 'default' | 'sm'\n className?: string\n}\n\nexport const CopyButton = forwardRef<HTMLButtonElement, CopyButtonProps>(\n function CopyButton(\n {\n text,\n label = 'Copy',\n copiedLabel = 'Copied!',\n variant = 'default',\n size = 'default',\n className,\n },\n ref\n ) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(text).catch(() => {})\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setCopied(false), 1500)\n }, [text])\n\n const buttonVariant = variant === 'ghost' ? 'ghost' : 'secondary'\n\n return (\n <Button\n ref={ref}\n variant={buttonVariant}\n size={size}\n className={cx(className)}\n onClick={handleCopy}\n data-component=\"copy-button\"\n icon={\n copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 7l3 3 7-7\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10 4V2.5A1.5 1.5 0 008.5 1h-6A1.5 1.5 0 001 2.5v6A1.5 1.5 0 002.5 10H4\" />\n </svg>\n )\n }\n >\n {copied ? copiedLabel : label}\n </Button>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent text-accent-fg',\n danger: 'bg-danger text-white',\n success: 'bg-success text-white',\n} as const\n\ntype CountBadgeVariant = 'accent' | 'danger' | 'success'\n\ntype CountBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n count: number\n max?: number\n variant?: CountBadgeVariant\n}\n\nexport const CountBadge = forwardRef<HTMLSpanElement, CountBadgeProps>(\n function CountBadge(\n { className, count, max = 99, variant = 'danger', ...props },\n ref\n ) {\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <span\n className={cx(\n 'inline-flex min-w-5 items-center justify-center rounded-full px-1.5 py-0.5 text-[10px] leading-none font-bold select-none',\n variantMap[variant],\n className\n )}\n data-component=\"count-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { CountBadgeProps, CountBadgeVariant }\n","// count-up — animated number counter from 0 to target\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountUpProps = {\n value: number\n duration?: number\n decimals?: number\n prefix?: string\n suffix?: string\n separator?: string\n className?: string\n}\n\nfunction formatNumber(n: number, decimals: number, separator: string): string {\n const fixed = n.toFixed(decimals)\n if (separator === '') return fixed\n\n const [intPart, decPart] = fixed.split('.')\n const formatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n if (decPart !== undefined) return `${formatted}.${decPart}`\n return formatted\n}\n\n// ease-out cubic\nfunction easeOut(t: number): number {\n const t1 = t - 1\n return t1 * t1 * t1 + 1\n}\n\nexport const CountUp = forwardRef<HTMLSpanElement, CountUpProps>(\n function CountUp(\n {\n value,\n duration = 1500,\n decimals = 0,\n prefix,\n suffix,\n separator = ',',\n className,\n },\n ref\n ) {\n const [current, setCurrent] = useState(0)\n\n useEffect(() => {\n if (duration <= 0) {\n setCurrent(value)\n return\n }\n const start = performance.now()\n let raf: number\n\n function tick(now: number) {\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n setCurrent(easeOut(progress) * value)\n if (progress < 1) {\n raf = requestAnimationFrame(tick)\n }\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, duration])\n\n return (\n <span\n ref={ref}\n className={cx('tabular-nums', className)}\n data-component=\"count-up\"\n >\n {prefix ?? ''}\n {formatNumber(current, decimals, separator)}\n {suffix ?? ''}\n </span>\n )\n }\n)\n","// countdown — countdown timer to a target date\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type CountdownProps = {\n targetDate: Date | string | number\n onComplete?: () => void\n showDays?: boolean\n showSeconds?: boolean\n className?: string\n}\n\ntype TimeRemaining = {\n days: number\n hours: number\n minutes: number\n seconds: number\n total: number\n}\n\nfunction calcRemaining(target: number): TimeRemaining {\n const total = Math.max(0, target - Date.now())\n const seconds = Math.floor((total / 1000) % 60)\n const minutes = Math.floor((total / 1000 / 60) % 60)\n const hours = Math.floor((total / 1000 / 60 / 60) % 24)\n const days = Math.floor(total / 1000 / 60 / 60 / 24)\n return { days, hours, minutes, seconds, total }\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nexport const Countdown = forwardRef<HTMLDivElement, CountdownProps>(\n function Countdown(\n { targetDate, onComplete, showDays = true, showSeconds = true, className },\n ref\n ) {\n const target = new Date(targetDate).getTime()\n const [remaining, setRemaining] = useState<TimeRemaining>(() =>\n calcRemaining(target)\n )\n\n useEffect(() => {\n if (remaining.total <= 0) return\n\n const interval = setInterval(() => {\n const next = calcRemaining(target)\n setRemaining(next)\n if (next.total <= 0) {\n clearInterval(interval)\n if (onComplete !== undefined) onComplete()\n }\n }, 1000)\n\n return () => clearInterval(interval)\n }, [target, onComplete, remaining.total])\n\n const segments: Array<{ label: string; value: string }> = []\n\n if (showDays) {\n segments.push({ label: 'D', value: pad(remaining.days) })\n }\n segments.push({ label: 'H', value: pad(remaining.hours) })\n segments.push({ label: 'M', value: pad(remaining.minutes) })\n if (showSeconds) {\n segments.push({ label: 'S', value: pad(remaining.seconds) })\n }\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"countdown\"\n >\n {segments.map((seg, i) => (\n <div key={seg.label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <span\n className=\"text-fg-muted gds-text-body\"\n data-testid=\"separator\"\n >\n :\n </span>\n )}\n <span\n className=\"bg-bg-tertiary gds-radius-button gds-text-body text-fg inline-flex items-center justify-center rounded px-1.5 py-0.5 tabular-nums\"\n data-testid={`segment-${seg.label}`}\n >\n {seg.value}\n </span>\n </div>\n ))}\n </div>\n )\n }\n)\n","// countdown-badge — badge showing a count with max overflow\nimport { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst countdownBadgeVariants = cva(\n 'inline-flex select-none items-center justify-center rounded-full text-[10px] font-bold text-accent-fg min-w-[18px] h-[18px] px-1',\n {\n defaultVariants: { variant: 'default' },\n variants: {\n variant: {\n danger: 'bg-danger animate-pulse',\n default: 'bg-accent',\n },\n },\n }\n)\n\ntype CountdownBadgeProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof countdownBadgeVariants> & {\n count: number\n max?: number\n }\n\nexport const CountdownBadge = forwardRef<HTMLSpanElement, CountdownBadgeProps>(\n function CountdownBadge(\n { className, count, max = 99, variant, ...props },\n ref\n ) {\n if (count <= 0) return null\n\n const display = count > max ? `${max}+` : String(count)\n\n return (\n <span\n className={cx(countdownBadgeVariants({ variant }), className)}\n data-component=\"countdown-badge\"\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport { countdownBadgeVariants }\nexport type { CountdownBadgeProps }\n","import { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\n\ntype CursorFollowProps = React.HTMLAttributes<HTMLDivElement> & {\n offset?: { x?: number; y?: number }\n smooth?: boolean\n}\n\nexport const CursorFollow = forwardRef<HTMLDivElement, CursorFollowProps>(\n function CursorFollow(\n { children, className, offset, smooth = true, ...props },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState({ x: 0, y: 0 })\n\n const ox = offset?.x ?? 0\n const oy = offset?.y ?? 0\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = containerRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setPos({ x: e.clientX - rect.left + ox, y: e.clientY - rect.top + oy })\n },\n [ox, oy]\n )\n\n return (\n <div\n className={cx('relative', className)}\n data-component=\"cursor-follow\"\n onMouseMove={handleMouseMove}\n ref={mergeRefs(containerRef, ref)}\n {...props}\n >\n <div\n className=\"pointer-events-none absolute\"\n style={{\n transform: `translate(${pos.x}px, ${pos.y}px)`,\n transition: smooth ? 'transform 80ms ease-out' : undefined,\n }}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\nexport type { CursorFollowProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype DiffIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n inverted?: boolean\n unit?: string\n value: number\n}\n\nexport const DiffIndicator = forwardRef<HTMLSpanElement, DiffIndicatorProps>(\n function DiffIndicator(\n { className, inverted = false, unit, value, ...props },\n ref\n ) {\n const isPositive = value > 0\n const isNegative = value < 0\n // inverted: lower is good (e.g. error rate), so positive = bad, negative = good\n const isGood = inverted ? isNegative : isPositive\n const isBad = inverted ? isPositive : isNegative\n\n const colorCls = isGood\n ? 'text-success'\n : isBad\n ? 'text-danger'\n : 'text-fg-muted'\n const arrow = isPositive ? '\\u2191' : isNegative ? '\\u2193' : ''\n const sign = isPositive ? '+' : ''\n const display = `${arrow}${sign}${value}${unit !== undefined ? unit : ''}`\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-0.5 text-sm font-medium tabular-nums',\n colorCls,\n className\n )}\n data-component=\"diff-indicator\"\n data-direction={isPositive ? 'up' : isNegative ? 'down' : 'neutral'}\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { DiffIndicatorProps }\n","// glow-dot — colored dot with glow effect (LED indicator)\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype GlowDotColor = 'accent' | 'danger' | 'success' | 'warning'\ntype GlowDotSize = 'default' | 'lg' | 'sm'\n\ntype GlowDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n color?: GlowDotColor\n /** Enable pulse animation for attention states */\n pulse?: boolean\n size?: GlowDotSize\n}\n\nconst colorMap: Record<GlowDotColor, string> = {\n accent: 'bg-accent shadow-[0_0_6px_var(--color-accent)]',\n success: 'bg-success shadow-[0_0_6px_var(--color-success)]',\n warning: 'bg-warning shadow-[0_0_6px_var(--color-warning)]',\n danger: 'bg-danger shadow-[0_0_6px_var(--color-danger)]',\n}\n\nconst sizeMap: Record<GlowDotSize, string> = {\n sm: 'h-1.5 w-1.5',\n default: 'h-2.5 w-2.5',\n lg: 'h-3.5 w-3.5',\n}\n\nexport const GlowDot = forwardRef<HTMLSpanElement, GlowDotProps>(\n function GlowDot(\n { color = 'accent', pulse, size = 'default', className, ...props },\n ref\n ) {\n return (\n <span\n ref={ref}\n className={cx(\n 'inline-block rounded-full',\n colorMap[color],\n sizeMap[size],\n pulse === true && 'animate-pulse',\n className\n )}\n data-component=\"glow-dot\"\n data-variant={color}\n {...props}\n />\n )\n }\n)\n\nexport type { GlowDotColor, GlowDotProps, GlowDotSize }\n","// gradient-text — text with gradient color fill\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype GradientTextProps = React.HTMLAttributes<HTMLSpanElement> & {\n children: string\n from?: string\n to?: string\n}\n\nexport const GradientText = forwardRef<HTMLSpanElement, GradientTextProps>(\n function GradientText(\n { children, className, from = '#6366f1', to = '#ec4899', ...props },\n ref\n ) {\n return (\n <span\n className={cx('inline-block bg-clip-text text-transparent', className)}\n data-component=\"gradient-text\"\n ref={ref}\n style={{\n backgroundImage: `linear-gradient(to right, ${from}, ${to})`,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { GradientTextProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype HeatCellProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n max?: number\n showValue?: boolean\n size?: number\n value: number\n}\n\nconst HeatCell = forwardRef<HTMLDivElement, HeatCellProps>(function HeatCell(\n {\n className,\n color = 'var(--color-accent)',\n max = 100,\n showValue = false,\n size = 32,\n value,\n ...props\n },\n ref\n) {\n const intensity = max > 0 ? Math.min(Math.max(value / max, 0), 1) : 0\n\n return (\n <div\n className={cx(\n 'inline-flex items-center justify-center rounded text-[10px] font-medium',\n className\n )}\n data-component=\"heat-cell\"\n ref={ref}\n style={{\n backgroundColor: color,\n height: size,\n opacity: 0.1 + intensity * 0.9,\n width: size,\n }}\n {...props}\n >\n {showValue && (\n <span className=\"text-white mix-blend-difference\">{value}</span>\n )}\n </div>\n )\n})\n\nexport { HeatCell }\nexport type { HeatCellProps }\n","// hotkey — keyboard shortcut key combination display\nimport { forwardRef } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype HotkeyProps = React.HTMLAttributes<HTMLSpanElement> & {\n keys: string[]\n}\n\nexport const Hotkey = forwardRef<HTMLSpanElement, HotkeyProps>(function Hotkey(\n { className, keys, ...props },\n ref\n) {\n return (\n <span\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"hotkey\"\n ref={ref}\n {...props}\n >\n {keys.map((key, i) => (\n <span className=\"contents\" key={i}>\n {i > 0 && <span className=\"text-fg-muted text-[10px]\">+</span>}\n <Kbd>{key}</Kbd>\n </span>\n ))}\n </span>\n )\n})\n\nexport type { HotkeyProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Tooltip } from './tooltip'\n\ntype InfoTipProps = React.HTMLAttributes<HTMLDivElement> & {\n content: ReactNode\n size?: 'default' | 'sm'\n}\n\nconst sizeClasses = {\n default: 'h-4 w-4',\n sm: 'h-3.5 w-3.5',\n} as const\n\nexport const InfoTip = forwardRef<HTMLDivElement, InfoTipProps>(\n function InfoTip({ className, content, size = 'default', ...props }, ref) {\n return (\n <Tooltip content={content} ref={ref} {...props}>\n <span\n className={cx(\n 'text-fg-muted/60 hover:text-fg-muted inline-flex cursor-help items-center',\n className\n )}\n data-component=\"info-tip\"\n >\n <svg\n className={sizeClasses[size]}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4M12 8h.01\" />\n </svg>\n </span>\n </Tooltip>\n )\n }\n)\n\nexport type { InfoTipProps }\n","// key-value — simple inline key: value pair for compact data display\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype KeyValueProps = React.HTMLAttributes<HTMLDivElement> & {\n label: string\n mono?: boolean\n value: ReactNode\n}\n\nexport const KeyValue = forwardRef<HTMLDivElement, KeyValueProps>(\n function KeyValue({ label, value, mono = false, className, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-text-body inline-flex items-baseline gap-1.5',\n className\n )}\n data-component=\"key-value\"\n {...props}\n >\n <span className=\"text-fg-muted gds-text-caption shrink-0\">{label}</span>\n <span className={cx('text-fg', mono && 'font-mono')}>{value}</span>\n </div>\n )\n }\n)\n\nexport type { KeyValueProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype KeyboardShortcutProps = {\n keys: string\n onTrigger: () => void\n showBadge?: boolean\n disabled?: boolean\n className?: string\n}\n\nfunction parseKeys(keys: string) {\n const parts = keys.toLowerCase().split('+')\n const modifiers = {\n ctrl: false,\n meta: false,\n shift: false,\n alt: false,\n }\n let mainKey = ''\n\n for (const part of parts) {\n if (part === 'ctrl') {\n modifiers.ctrl = true\n } else if (part === 'meta' || part === 'cmd') {\n modifiers.meta = true\n } else if (part === 'shift') {\n modifiers.shift = true\n } else if (part === 'alt') {\n modifiers.alt = true\n } else {\n mainKey = part\n }\n }\n\n return { modifiers, mainKey }\n}\n\nfunction formatKeyLabel(part: string): string {\n const map: Record<string, string> = {\n ctrl: 'Ctrl',\n meta: '\\u2318',\n cmd: '\\u2318',\n shift: '\\u21E7',\n alt: 'Alt',\n }\n return map[part.toLowerCase()] ?? part.toUpperCase()\n}\n\nexport const KeyboardShortcut = forwardRef<\n HTMLSpanElement,\n KeyboardShortcutProps\n>(function KeyboardShortcut(\n { keys, onTrigger, showBadge = false, disabled = false, className },\n ref\n) {\n const { modifiers, mainKey } = parseKeys(keys)\n\n const handler = useCallback(\n (e: KeyboardEvent) => {\n if (disabled) return\n if (e.ctrlKey !== modifiers.ctrl) return\n if (e.metaKey !== modifiers.meta) return\n if (e.shiftKey !== modifiers.shift) return\n if (e.altKey !== modifiers.alt) return\n if (e.key.toLowerCase() !== mainKey) return\n\n e.preventDefault()\n onTrigger()\n },\n [\n disabled,\n modifiers.ctrl,\n modifiers.meta,\n modifiers.shift,\n modifiers.alt,\n mainKey,\n onTrigger,\n ]\n )\n\n useEffect(() => {\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [handler])\n\n if (!showBadge) return null\n\n const parts = keys.split('+')\n const badges: ReactNode[] = parts.map((part, i) => (\n <Kbd key={i}>{formatKeyLabel(part)}</Kbd>\n ))\n\n return (\n <span\n ref={ref}\n className={cx('inline-flex items-center gap-1', className)}\n data-component=\"keyboard-shortcut\"\n >\n {badges}\n </span>\n )\n})\n\nexport type { KeyboardShortcutProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LiveDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n}\n\nexport const LiveDot = forwardRef<HTMLSpanElement, LiveDotProps>(\n function LiveDot({ className, label = 'LIVE', ...props }, ref) {\n return (\n <span\n className={cx('inline-flex items-center gap-1.5', className)}\n data-component=\"live-dot\"\n ref={ref}\n {...props}\n >\n <span className=\"relative flex h-2 w-2\">\n <span className=\"bg-danger absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\" />\n <span className=\"bg-danger relative inline-flex h-2 w-2 rounded-full\" />\n </span>\n <span className=\"text-danger text-xs font-bold tracking-wide uppercase\">\n {label}\n </span>\n </span>\n )\n }\n)\n\nexport type { LiveDotProps }\n","// magnetic-button — element that subtly moves toward the cursor when hovering\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\n\nexport type MagneticButtonProps = {\n children: React.ReactNode\n strength?: number\n radius?: number\n className?: string\n}\n\nexport const MagneticButton = forwardRef<HTMLDivElement, MagneticButtonProps>(\n function MagneticButton(\n { children, strength = 0.3, radius = 100, className },\n ref\n ) {\n const innerRef = useRef<HTMLDivElement>(null)\n const [transform, setTransform] = useState({ x: 0, y: 0 })\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const el = innerRef.current\n if (el === null) return\n const rect = el.getBoundingClientRect()\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dx = e.clientX - cx\n const dy = e.clientY - cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist > radius) {\n setTransform({ x: 0, y: 0 })\n return\n }\n setTransform({ x: dx * strength, y: dy * strength })\n },\n [strength, radius]\n )\n\n const handleMouseLeave = useCallback(() => {\n setTransform({ x: 0, y: 0 })\n }, [])\n\n return (\n <div\n ref={mergeRefs(innerRef, ref)}\n data-component=\"magnetic-button\"\n className={cx('inline-block', className)}\n style={{\n transform: `translate(${transform.x}px, ${transform.y}px)`,\n transition: 'transform 200ms ease-out',\n }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </div>\n )\n }\n)\n","// marquee — infinite horizontal scrolling content\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MarqueeProps = {\n children: React.ReactNode\n speed?: number\n direction?: 'left' | 'right'\n pauseOnHover?: boolean\n className?: string\n}\n\nexport const Marquee = forwardRef<HTMLDivElement, MarqueeProps>(\n function Marquee(\n {\n children,\n speed = 30,\n direction = 'left',\n pauseOnHover = true,\n className,\n },\n ref\n ) {\n const innerRef = useRef<HTMLDivElement>(null)\n const [duration, setDuration] = useState(10)\n\n useEffect(() => {\n if (innerRef.current === null) return\n const width = innerRef.current.scrollWidth / 2\n if (width > 0) setDuration(width / speed)\n }, [speed, children])\n\n const translateFrom = direction === 'left' ? '0%' : '-50%'\n const translateTo = direction === 'left' ? '-50%' : '0%'\n\n return (\n <div\n ref={ref}\n className={cx('overflow-hidden', className)}\n data-component=\"marquee\"\n >\n <div\n ref={innerRef}\n className={cx(\n 'inline-flex will-change-transform',\n pauseOnHover && 'hover:[animation-play-state:paused]'\n )}\n style={\n {\n animation: `marquee-scroll ${duration}s linear infinite`,\n '--marquee-from': translateFrom,\n '--marquee-to': translateTo,\n } as React.CSSProperties\n }\n >\n <div className=\"flex shrink-0\">{children}</div>\n <div className=\"flex shrink-0\" aria-hidden>\n {children}\n </div>\n </div>\n </div>\n )\n }\n)\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst meterVariants = cva('overflow-hidden gds-radius-badge bg-bg-tertiary', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-2.5',\n lg: 'h-4',\n sm: 'h-1.5',\n },\n },\n})\n\nconst variantColors: Record<string, string> = {\n danger: 'bg-danger',\n default: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n}\n\nfunction getAutoColor(pct: number): string {\n if (pct >= 0.8) return 'bg-danger'\n if (pct >= 0.6) return 'bg-warning'\n if (pct >= 0.4) return 'bg-accent'\n return 'bg-success'\n}\n\ntype MeterProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof meterVariants> & {\n label?: string\n max?: number\n min?: number\n showValue?: boolean\n value: number\n variant?: 'auto' | 'danger' | 'default' | 'success' | 'warning'\n }\n\nexport const Meter = forwardRef<HTMLDivElement, MeterProps>(function Meter(\n {\n className,\n label,\n max = 100,\n min = 0,\n showValue = true,\n size,\n value,\n variant = 'auto',\n ...props\n },\n ref\n) {\n const range = max - min\n const pct = range > 0 ? Math.max(0, Math.min(1, (value - min) / range)) : 0\n const barColor =\n variant === 'auto'\n ? getAutoColor(pct)\n : (variantColors[variant] ?? 'bg-accent')\n\n return (\n <div\n className={cx('w-full', className)}\n data-component=\"meter\"\n ref={ref}\n {...props}\n >\n {(label !== undefined || showValue) && (\n <div className=\"mb-1 flex items-center justify-between\">\n {label !== undefined && (\n <span className=\"gds-text-body text-fg font-medium\">{label}</span>\n )}\n {showValue && (\n <span className=\"gds-text-label text-fg-muted font-mono tabular-nums\">\n {Math.round(pct * 100)}%\n </span>\n )}\n </div>\n )}\n <div\n aria-label={label}\n aria-valuemax={max}\n aria-valuemin={min}\n aria-valuenow={value}\n className={meterVariants({ size })}\n role=\"meter\"\n >\n <div\n className={cx(\n 'gds-radius-badge h-full transition-all duration-500',\n barColor\n )}\n style={{ width: `${pct * 100}%` }}\n />\n </div>\n </div>\n )\n})\n\nexport { meterVariants }\nexport type { MeterProps }\n","import { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype NumberFlowProps = {\n className?: string\n format?: (n: number) => string\n value: number\n}\n\nexport const NumberFlow = forwardRef<HTMLSpanElement, NumberFlowProps>(\n function NumberFlow({ className, format = String, value }, ref) {\n const chars = useMemo(() => format(value).split(''), [value, format])\n return (\n <span\n className={cx(\n 'inline-flex items-center tabular-nums select-none',\n className\n )}\n data-component=\"number-flow\"\n ref={ref}\n >\n {chars.map((char, i) => {\n if (char >= '0' && char <= '9') {\n return (\n <span\n className=\"inline-block overflow-hidden\"\n key={`${i}-slot`}\n style={{ lineHeight: 1 }}\n >\n <span className=\"inline-block transition-transform duration-300 ease-out\">\n {char}\n </span>\n </span>\n )\n }\n return <span key={`${i}-static`}>{char}</span>\n })}\n </span>\n )\n }\n)\n\nexport type { NumberFlowProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype OnlineIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n online: boolean\n}\n\nexport const OnlineIndicator = forwardRef<\n HTMLSpanElement,\n OnlineIndicatorProps\n>(function OnlineIndicator({ className, label, online, ...props }, ref) {\n const dotCls = online ? 'bg-success' : 'bg-fg-muted/40'\n const text = label ?? (online ? 'Online' : 'Offline')\n\n return (\n <span\n className={cx('gds-gap-sm inline-flex items-center', className)}\n data-component=\"online-indicator\"\n ref={ref}\n {...props}\n >\n <span className={cx('h-2 w-2 shrink-0 rounded-full', dotCls)} />\n <span className=\"gds-text-label text-fg-muted\">{text}</span>\n </span>\n )\n})\n\nexport type { OnlineIndicatorProps }\n","import type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype OrbitProps = {\n children: ReactNode[]\n className?: string\n duration?: number\n radius?: number\n}\n\nexport function Orbit({\n children,\n className,\n duration = 10,\n radius = 100,\n}: OrbitProps) {\n const count = children.length\n return (\n <div\n className={cx('relative select-none', className)}\n data-component=\"orbit\"\n style={{ height: radius * 2, width: radius * 2 }}\n >\n {children.map((child, i) => {\n const angle = (360 / count) * i\n return (\n <div\n className=\"absolute top-1/2 left-1/2\"\n key={i}\n style={{\n animation: `orbit-spin ${duration}s linear infinite`,\n animationDelay: `${-(duration / count) * i}s`,\n height: 0,\n width: 0,\n }}\n >\n <div\n className=\"-translate-x-1/2 -translate-y-1/2\"\n style={{\n transform: `rotate(${angle}deg) translateX(${radius}px) rotate(-${angle}deg)`,\n }}\n >\n {child}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport type { OrbitProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PercentageProps = React.HTMLAttributes<HTMLSpanElement> & {\n precision?: number\n showSign?: boolean\n value: number\n}\n\nexport const Percentage = forwardRef<HTMLSpanElement, PercentageProps>(\n function Percentage(\n { className, precision = 1, showSign = false, value, ...props },\n ref\n ) {\n const isPositive = value > 0\n const isNegative = value < 0\n const colorCls = isPositive\n ? 'text-success'\n : isNegative\n ? 'text-danger'\n : 'text-fg-muted'\n const sign = showSign && isPositive ? '+' : ''\n const display = `${sign}${value.toFixed(precision)}%`\n\n return (\n <span\n className={cx(\n 'inline-flex text-sm font-medium tabular-nums',\n colorCls,\n className\n )}\n data-component=\"percentage\"\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n)\n\nexport type { PercentageProps }\n","// percentage-circle — circular percentage display with color coding\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PercentageCircleProps = React.HTMLAttributes<HTMLDivElement> & {\n size?: 'default' | 'lg' | 'sm'\n value: number\n}\n\nconst sizeClasses = {\n default: 'h-16 w-16 text-lg',\n lg: 'h-20 w-20 text-xl',\n sm: 'h-12 w-12 text-sm',\n} as const\n\nconst strokeWidths = {\n default: 3,\n lg: 3.5,\n sm: 2.5,\n} as const\n\nexport const PercentageCircle = forwardRef<\n HTMLDivElement,\n PercentageCircleProps\n>(function PercentageCircle(\n { className, size = 'default', value, ...props },\n ref\n) {\n const clamped = Math.max(0, Math.min(100, value))\n\n const colorClass = useMemo(() => {\n if (clamped >= 80) return 'text-success'\n if (clamped >= 50) return 'text-warning'\n return 'text-danger'\n }, [clamped])\n\n const radius = 18\n const circumference = 2 * Math.PI * radius\n const offset = circumference - (clamped / 100) * circumference\n\n return (\n <div\n className={cx(\n 'relative inline-flex items-center justify-center select-none',\n sizeClasses[size],\n className\n )}\n data-component=\"percentage-circle\"\n ref={ref}\n {...props}\n >\n <svg\n className=\"absolute inset-0 h-full w-full -rotate-90\"\n viewBox=\"0 0 40 40\"\n >\n <circle\n className=\"text-fg-muted/10\"\n cx=\"20\"\n cy=\"20\"\n fill=\"none\"\n r={radius}\n stroke=\"currentColor\"\n strokeWidth={strokeWidths[size]}\n />\n <circle\n className={cx('transition-all duration-500', colorClass)}\n cx=\"20\"\n cy=\"20\"\n fill=\"none\"\n r={radius}\n stroke=\"currentColor\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidths[size]}\n />\n </svg>\n <span className={cx('font-mono font-bold', colorClass)}>{clamped}%</span>\n </div>\n )\n})\n\nexport type { PercentageCircleProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PriceProps = React.HTMLAttributes<HTMLSpanElement> & {\n currency?: string\n showSign?: boolean\n value: number\n}\n\nexport const Price = forwardRef<HTMLSpanElement, PriceProps>(function Price(\n { className, currency = '\\u00a5', showSign = false, value, ...props },\n ref\n) {\n const isNeg = value < 0\n const isPos = value > 0\n const colorCls = isNeg ? 'text-danger' : isPos ? 'text-success' : 'text-fg'\n const sign = showSign && isPos ? '+' : ''\n const formatted = Math.abs(value).toLocaleString()\n\n return (\n <span\n className={cx('tabular-nums', colorCls, className)}\n data-component=\"price\"\n ref={ref}\n {...props}\n >\n {isNeg ? '-' : sign}\n {currency}\n {formatted}\n </span>\n )\n})\n\nexport type { PriceProps }\n","// progress-circle — circular progress indicator using SVG\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantColors: Record<string, string> = {\n accent: 'stroke-accent',\n danger: 'stroke-danger',\n success: 'stroke-success',\n warning: 'stroke-warning',\n}\n\ntype ProgressCircleProps = {\n value: number\n size?: number\n strokeWidth?: number\n showValue?: boolean\n variant?: 'accent' | 'danger' | 'success' | 'warning'\n className?: string\n}\n\nconst ProgressCircle = forwardRef<SVGSVGElement, ProgressCircleProps>(\n function ProgressCircle(\n {\n value,\n size = 64,\n strokeWidth = 4,\n showValue = true,\n variant = 'accent',\n className,\n },\n ref\n ) {\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const clamped = Math.max(0, Math.min(100, value))\n const offset = circumference * (1 - clamped / 100)\n const center = size / 2\n const colorCls = variantColors[variant] ?? 'stroke-accent'\n\n return (\n <svg\n ref={ref}\n className={cx('shrink-0', className)}\n data-component=\"progress-circle\"\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n width={size}\n >\n <circle\n className=\"stroke-border/30\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeWidth={strokeWidth}\n />\n <circle\n className={cx('transition-all duration-500', colorCls)}\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n style={{ transform: 'rotate(-90deg)', transformOrigin: 'center' }}\n />\n {showValue && (\n <text\n className=\"fill-fg font-medium\"\n dominantBaseline=\"central\"\n fontSize={size * 0.22}\n textAnchor=\"middle\"\n x={center}\n y={center}\n >\n {Math.round(clamped)}%\n </text>\n )}\n </svg>\n )\n }\n)\n\nexport { ProgressCircle }\nexport type { ProgressCircleProps }\n","// progress-ring — circular progress indicator with percentage label\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ProgressRingProps = React.HTMLAttributes<HTMLDivElement> & {\n size?: number\n strokeWidth?: number\n value: number\n}\n\nexport const ProgressRing = forwardRef<HTMLDivElement, ProgressRingProps>(\n function ProgressRing(\n { className, size = 48, strokeWidth = 4, value, ...props },\n ref\n ) {\n const clamped = Math.max(0, Math.min(100, value))\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference * (1 - clamped / 100)\n const center = size / 2\n\n return (\n <div\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={clamped}\n className={cx(\n 'inline-flex items-center justify-center select-none',\n className\n )}\n data-component=\"progress-ring\"\n ref={ref}\n role=\"progressbar\"\n {...props}\n >\n <svg\n className=\"rotate-[-90deg]\"\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n width={size}\n >\n <circle\n className=\"stroke-bg-tertiary\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeWidth={strokeWidth}\n />\n <circle\n className=\"stroke-accent transition-all duration-500\"\n cx={center}\n cy={center}\n fill=\"none\"\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n strokeWidth={strokeWidth}\n />\n </svg>\n <span\n className=\"text-fg absolute font-mono text-xs font-bold\"\n style={{ fontSize: size * 0.22 }}\n >\n {clamped}%\n </span>\n </div>\n )\n }\n)\n\nexport type { ProgressRingProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst colorMap = {\n accent: 'bg-accent',\n danger: 'bg-danger',\n success: 'bg-success',\n warning: 'bg-warning',\n} as const\n\nconst sizeMap = {\n default: 'h-2.5 w-2.5',\n lg: 'h-3.5 w-3.5',\n sm: 'h-2 w-2',\n} as const\n\ntype PulseIndicatorProps = React.HTMLAttributes<HTMLSpanElement> & {\n color?: 'accent' | 'danger' | 'success' | 'warning'\n label?: string\n size?: 'default' | 'lg' | 'sm'\n}\n\nexport const PulseIndicator = forwardRef<HTMLSpanElement, PulseIndicatorProps>(\n function PulseIndicator(\n { className, color = 'success', label, size = 'default', ...props },\n ref\n ) {\n return (\n <span\n className={cx(\n 'inline-flex items-center',\n label !== undefined && 'gds-gap-sm',\n className\n )}\n data-component=\"pulse-indicator\"\n ref={ref}\n {...props}\n >\n <span className=\"relative inline-flex\">\n <span\n className={cx('rounded-full', colorMap[color], sizeMap[size])}\n />\n <span\n className={cx(\n 'absolute inset-0 animate-ping rounded-full opacity-50',\n colorMap[color]\n )}\n />\n </span>\n {label !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nexport type { PulseIndicatorProps }\n","// pulse-ring — concentric pulsing ring animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PulseRingProps = React.HTMLAttributes<HTMLDivElement> & {\n active?: boolean\n color?: string\n count?: number\n size?: number\n}\n\nexport const PulseRing = forwardRef<HTMLDivElement, PulseRingProps>(\n function PulseRing(\n { active = true, className, color, count = 3, size = 80, ...props },\n ref\n ) {\n if (!active) {\n return (\n <div\n className={cx('relative inline-flex', className)}\n data-component=\"pulse-ring\"\n ref={ref}\n {...props}\n />\n )\n }\n\n const rings = Array.from({ length: count }, (_, i) => i)\n\n return (\n <div\n className={cx(\n 'relative inline-flex items-center justify-center',\n className\n )}\n data-component=\"pulse-ring\"\n ref={ref}\n style={{ height: size, width: size }}\n {...props}\n >\n {rings.map((i) => (\n <span\n className=\"absolute inset-0 rounded-full border-2 opacity-0\"\n key={i}\n style={{\n animation: `gds-pulse-ring ${1.5 + count * 0.2}s ease-out ${i * (1.5 / count)}s infinite`,\n borderColor: color ?? 'var(--color-accent)',\n }}\n />\n ))}\n <style>{`\n @keyframes gds-pulse-ring {\n 0% { transform: scale(0.3); opacity: 0.8; }\n 100% { transform: scale(1); opacity: 0; }\n }\n `}</style>\n </div>\n )\n }\n)\n\nexport type { PulseRingProps }\n","// qr-code — decorative data matrix visualization using SVG\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type QRCodeProps = {\n value: string\n size?: number\n color?: string\n bgColor?: string\n className?: string\n}\n\n// simple hash from string to seed deterministic pattern\nfunction hashStr(str: string): number {\n let hash = 5381\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0\n }\n return Math.abs(hash)\n}\n\n// seeded pseudo-random\nfunction seededRand(seed: number): () => number {\n let s = seed\n return () => {\n s = (s * 1103515245 + 12345) & 0x7fffffff\n return s / 0x7fffffff\n }\n}\n\nconst GRID = 21\nconst MODULE = 1\n\n// draw a finder pattern (7x7) at position\nfunction finderPattern(\n ox: number,\n oy: number\n): Array<{ x: number; y: number }> {\n const cells: Array<{ x: number; y: number }> = []\n for (let r = 0; r < 7; r++) {\n for (let c = 0; c < 7; c++) {\n const isOuter = r === 0 || r === 6 || c === 0 || c === 6\n const isInner = r >= 2 && r <= 4 && c >= 2 && c <= 4\n if (isOuter || isInner) {\n cells.push({ x: ox + c, y: oy + r })\n }\n }\n }\n return cells\n}\n\nexport const QRCode = forwardRef<SVGSVGElement, QRCodeProps>(function QRCode(\n {\n value,\n size = 128,\n color = 'currentColor',\n bgColor = 'transparent',\n className,\n },\n ref\n) {\n const cells = useMemo(() => {\n const result: Array<{ x: number; y: number }> = []\n\n // finder patterns\n result.push(...finderPattern(0, 0))\n result.push(...finderPattern(GRID - 7, 0))\n result.push(...finderPattern(0, GRID - 7))\n\n // data area — hash-based fill\n const rand = seededRand(hashStr(value))\n for (let r = 0; r < GRID; r++) {\n for (let c = 0; c < GRID; c++) {\n const inFinder =\n (r < 8 && c < 8) ||\n (r < 8 && c >= GRID - 8) ||\n (r >= GRID - 8 && c < 8)\n if (inFinder) continue\n if (rand() > 0.55) {\n result.push({ x: c, y: r })\n }\n }\n }\n return result\n }, [value])\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={`0 0 ${GRID} ${GRID}`}\n className={cx('shrink-0', className)}\n data-component=\"qr-code\"\n data-testid=\"qr-code-svg\"\n role=\"img\"\n aria-label={`QR code for: ${value}`}\n >\n <rect width={GRID} height={GRID} fill={bgColor} />\n {cells.map((cell, i) => (\n <rect\n key={i}\n x={cell.x}\n y={cell.y}\n width={MODULE}\n height={MODULE}\n fill={color}\n />\n ))}\n </svg>\n )\n})\n","// quick-action — floating action button / quick action shortcut\nimport { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst quickActionVariants = cva(\n 'inline-flex shrink-0 select-none items-center justify-center rounded-full transition-transform active:scale-95 hover:scale-105',\n {\n defaultVariants: { size: 'default', variant: 'primary' },\n variants: {\n variant: {\n primary: 'bg-accent text-accent-fg gds-shadow-lg',\n secondary: 'border border-border bg-surface text-fg gds-shadow-md',\n },\n size: {\n default: 'h-11 w-11',\n lg: 'h-14 w-14',\n sm: 'h-9 w-9',\n },\n },\n }\n)\n\ntype QuickActionProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> &\n VariantProps<typeof quickActionVariants> & {\n icon: ReactNode\n label?: string\n }\n\nexport const QuickAction = forwardRef<HTMLButtonElement, QuickActionProps>(\n function QuickAction(\n { className, disabled, icon, label, onClick, size, variant, ...props },\n ref\n ) {\n return (\n <div className=\"inline-flex flex-col items-center gap-1\">\n <button\n className={cx(\n quickActionVariants({ size, variant }),\n focusCls,\n disabled === true && 'pointer-events-none opacity-40',\n className\n )}\n data-component=\"quick-action\"\n data-variant={variant ?? 'primary'}\n disabled={disabled}\n onClick={onClick}\n ref={ref}\n type=\"button\"\n {...props}\n >\n <span className=\"gds-icon-child\">{icon}</span>\n </button>\n {label !== undefined && (\n <span className=\"text-fg-muted text-[10px] select-none\">{label}</span>\n )}\n </div>\n )\n }\n)\n\nexport { quickActionVariants }\nexport type { QuickActionProps }\n","import { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype RadioOption = {\n disabled?: boolean\n label: string\n value: string\n}\n\ntype RadioGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n direction?: 'horizontal' | 'vertical'\n disabled?: boolean\n onChange?: (value: string) => void\n options: RadioOption[]\n value?: string\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(\n {\n className,\n direction = 'vertical',\n disabled = false,\n onChange,\n options,\n value,\n ...props\n },\n ref\n ) {\n return (\n <div\n className={cx(\n 'gds-gap flex',\n direction === 'vertical' ? 'flex-col' : 'flex-row flex-wrap',\n className\n )}\n data-component=\"radio-group\"\n ref={ref}\n role=\"radiogroup\"\n {...props}\n >\n {options.map((opt) => {\n const selected = opt.value === value\n const isDisabled = disabled || opt.disabled === true\n\n return (\n <button\n aria-checked={selected}\n className={cx(\n 'gds-gap-sm gds-text-body inline-flex items-center select-none',\n focusCls,\n isDisabled && 'cursor-not-allowed opacity-50'\n )}\n disabled={isDisabled}\n key={opt.value}\n onClick={() => onChange?.(opt.value)}\n role=\"radio\"\n type=\"button\"\n >\n <span\n className={cx(\n 'gds-icon gds-radius-badge inline-flex shrink-0 items-center justify-center border transition-colors',\n selected\n ? 'border-accent'\n : 'border-border hover:border-accent/50'\n )}\n >\n {selected && (\n <span className=\"gds-radius-badge bg-accent h-2 w-2\" />\n )}\n </span>\n <span className=\"text-fg\">{opt.label}</span>\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { RadioGroupProps, RadioOption }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nconst sizeMap = {\n default: 'gds-sq-xs',\n lg: 'gds-sq-sm',\n sm: 'gds-icon',\n}\n\n// default star SVG\nfunction DefaultStar({ filled }: { filled: boolean }) {\n return (\n <svg\n className={cx(\n sizeMap.default,\n filled ? 'fill-warning text-warning' : 'text-fg-muted/20'\n )}\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={1.5}\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\ntype RatingProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n max?: number\n onChange?: (value: number) => void\n readonly?: boolean\n renderStar?: (filled: boolean, index: number) => ReactNode\n size?: 'default' | 'lg' | 'sm'\n value: number\n}\n\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(function Rating(\n {\n className,\n max = 5,\n onChange,\n readonly = false,\n renderStar,\n size = 'default',\n value,\n ...props\n },\n ref\n) {\n const [hovered, setHovered] = useState<number | null>(null)\n\n const handleLeave = useCallback(() => setHovered(null), [])\n\n return (\n <div\n className={cx('gds-gap-xs inline-flex', className)}\n data-component=\"rating\"\n onMouseLeave={readonly ? undefined : handleLeave}\n ref={ref}\n role=\"group\"\n {...props}\n >\n {Array.from({ length: max }, (_, i) => {\n const starIndex = i + 1\n const filled =\n hovered !== null ? starIndex <= hovered : starIndex <= value\n\n if (readonly) {\n return (\n <span className={sizeMap[size]} key={i}>\n {renderStar !== undefined ? (\n renderStar(filled, i)\n ) : (\n <DefaultStar filled={filled} />\n )}\n </span>\n )\n }\n\n return (\n <button\n className={cx('transition-transform hover:scale-110', focusCls)}\n key={i}\n onClick={() => onChange?.(starIndex)}\n onMouseEnter={() => setHovered(starIndex)}\n type=\"button\"\n >\n <span className={sizeMap[size]}>\n {renderStar !== undefined ? (\n renderStar(filled, i)\n ) : (\n <DefaultStar filled={filled} />\n )}\n </span>\n </button>\n )\n })}\n </div>\n )\n})\n\nexport type { RatingProps }\n","// relative-time — live-updating relative time display\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RelativeTimeProps = React.HTMLAttributes<HTMLTimeElement> & {\n date: Date | number | string\n prefix?: string\n}\n\nfunction formatRelativeTime(date: Date | number | string): string {\n const d = date instanceof Date ? date : new Date(date)\n const now = Date.now()\n const diffMs = now - d.getTime()\n const seconds = Math.floor(diffMs / 1000)\n\n if (seconds < 60) return 'just now'\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n const days = Math.floor(hours / 24)\n if (days === 1) return 'yesterday'\n if (days < 30) return `${days}d ago`\n const months = Math.floor(days / 30)\n if (months < 12) return `${months}mo ago`\n return `${Math.floor(months / 12)}y ago`\n}\n\nfunction formatDateTime(date: Date): string {\n return date.toLocaleString()\n}\n\nexport const RelativeTime = forwardRef<HTMLTimeElement, RelativeTimeProps>(\n function RelativeTime({ className, date, prefix, ...props }, ref) {\n const [text, setText] = useState(() => formatRelativeTime(date))\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n setText(formatRelativeTime(date))\n intervalRef.current = setInterval(() => {\n setText(formatRelativeTime(date))\n }, 30_000)\n return () => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n }\n }\n }, [date])\n\n const d = date instanceof Date ? date : new Date(date)\n const fullDateTime = formatDateTime(d)\n\n return (\n <time\n className={cx('text-fg-muted font-mono', className)}\n data-component=\"relative-time\"\n dateTime={d.toISOString()}\n ref={ref}\n title={fullDateTime}\n {...props}\n >\n {prefix !== undefined ? `${prefix} ${text}` : text}\n </time>\n )\n }\n)\n\nexport type { RelativeTimeProps }\n","// ribbon — corner ribbon/banner for containers\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent text-accent-fg',\n danger: 'bg-danger text-white',\n success: 'bg-success text-white',\n warning: 'bg-warning text-white',\n} as const\n\ntype RibbonProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n label: string\n variant?: 'accent' | 'danger' | 'success' | 'warning'\n position?: 'top-left' | 'top-right'\n}\n\nexport const Ribbon = forwardRef<HTMLDivElement, RibbonProps>(function Ribbon(\n {\n children,\n label,\n variant = 'accent',\n position = 'top-right',\n className,\n ...props\n },\n ref\n) {\n const isRight = position === 'top-right'\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden', className)}\n data-component=\"ribbon\"\n {...props}\n >\n <div\n className={cx(\n 'pointer-events-none absolute top-3 z-10 px-6 py-0.5 text-[10px] font-bold tracking-wider uppercase shadow-sm',\n variantMap[variant],\n isRight ? '-right-6 rotate-45' : '-left-6 -rotate-45'\n )}\n >\n {label}\n </div>\n {children}\n </div>\n )\n})\n\nexport type { RibbonProps }\n","// ribbon-banner — corner ribbon overlay for containers\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RibbonBannerProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n position?: 'top-left' | 'top-right'\n text: string\n}\n\nexport const RibbonBanner = forwardRef<HTMLDivElement, RibbonBannerProps>(\n function RibbonBanner(\n { className, color, position = 'top-right', text, ...props },\n ref\n ) {\n const isRight = position === 'top-right'\n\n return (\n <div\n className={cx(\n 'absolute top-0 z-10 overflow-hidden',\n isRight ? 'right-0' : 'left-0',\n className\n )}\n data-component=\"ribbon-banner\"\n ref={ref}\n style={{ height: 80, width: 80 }}\n {...props}\n >\n <div\n className=\"text-accent-fg flex items-center justify-center text-xs font-bold select-none\"\n style={{\n backgroundColor: color ?? 'var(--color-accent)',\n left: isRight ? undefined : -20,\n position: 'absolute',\n right: isRight ? -20 : undefined,\n top: 16,\n transform: isRight ? 'rotate(45deg)' : 'rotate(-45deg)',\n width: 120,\n }}\n >\n {text}\n </div>\n </div>\n )\n }\n)\n\nexport type { RibbonBannerProps }\n","// ripple-effect — material design ripple on click\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype Ripple = { id: number; x: number; y: number; size: number }\n\nexport type RippleEffectProps = {\n children: React.ReactNode\n color?: string\n disabled?: boolean\n className?: string\n}\n\nlet nextId = 0\n\nexport const RippleEffect = forwardRef<HTMLDivElement, RippleEffectProps>(\n function RippleEffect(\n { children, color = 'currentColor', disabled = false, className },\n ref\n ) {\n const [ripples, setRipples] = useState<Ripple[]>([])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n const size = Math.max(rect.width, rect.height) * 2\n setRipples((prev) => [...prev, { id: nextId++, x, y, size }])\n },\n [disabled]\n )\n\n const removeRipple = useCallback((id: number) => {\n setRipples((prev) => prev.filter((r) => r.id !== id))\n }, [])\n\n return (\n <div\n ref={ref}\n data-component=\"ripple-effect\"\n className={cx('relative overflow-hidden', className)}\n onPointerDown={handlePointerDown}\n >\n {children}\n {ripples.map((r) => (\n <span\n key={r.id}\n className=\"animate-ripple pointer-events-none absolute rounded-full\"\n style={{\n left: r.x - r.size / 2,\n top: r.y - r.size / 2,\n width: r.size,\n height: r.size,\n backgroundColor: color,\n }}\n onAnimationEnd={() => removeRipple(r.id)}\n />\n ))}\n </div>\n )\n }\n)\n","// scroll-progress — page scroll progress bar\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ScrollProgressProps = React.HTMLAttributes<HTMLDivElement> & {\n color?: string\n height?: number\n}\n\nexport const ScrollProgress = forwardRef<HTMLDivElement, ScrollProgressProps>(\n function ScrollProgress({ className, color, height = 3, ...props }, ref) {\n const [progress, setProgress] = useState(0)\n\n const handleScroll = useCallback(() => {\n const scrollTop = document.documentElement.scrollTop\n const scrollHeight =\n document.documentElement.scrollHeight -\n document.documentElement.clientHeight\n if (scrollHeight > 0) {\n setProgress((scrollTop / scrollHeight) * 100)\n }\n }, [])\n\n useEffect(() => {\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [handleScroll])\n\n return (\n <div\n className={cx('fixed top-0 right-0 left-0 z-50', className)}\n data-component=\"scroll-progress\"\n ref={ref}\n style={{ height: `${height}px` }}\n {...props}\n >\n <div\n className=\"bg-accent h-full transition-[width] duration-100 ease-out\"\n style={{\n width: `${progress}%`,\n ...(color !== undefined ? { backgroundColor: color } : {}),\n }}\n />\n </div>\n )\n }\n)\n\nexport type { ScrollProgressProps }\n","// scroll-to-top — floating button that appears when scrolled down\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type ScrollToTopProps = {\n threshold?: number\n smooth?: boolean\n className?: string\n}\n\nexport const ScrollToTop = forwardRef<HTMLButtonElement, ScrollToTopProps>(\n function ScrollToTop({ threshold = 300, smooth = true, className }, ref) {\n const [visible, setVisible] = useState(() => {\n if (typeof window === 'undefined') return false\n return window.scrollY >= threshold\n })\n\n useEffect(() => {\n const handler = () => setVisible(window.scrollY >= threshold)\n window.addEventListener('scroll', handler, { passive: true })\n return () => window.removeEventListener('scroll', handler)\n }, [threshold])\n\n if (!visible) return null\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label=\"Scroll to top\"\n onClick={() =>\n window.scrollTo({ top: 0, behavior: smooth ? 'smooth' : 'auto' })\n }\n className={cx(\n 'bg-accent text-accent-fg hover:bg-accent/90 fixed right-6 bottom-6 z-40 flex h-10 w-10 items-center justify-center rounded-full shadow-lg transition-opacity',\n focusCls,\n className\n )}\n data-component=\"scroll-to-top\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 12V4M4 7l4-3 4 3\" />\n </svg>\n </button>\n )\n }\n)\n","// segmented-control — mutually exclusive button group (iOS-style)\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype SegmentedControlOption = {\n value: string\n label: string\n}\n\ntype SegmentedControlSize = 'default' | 'sm'\n\ntype SegmentedControlProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n options: SegmentedControlOption[]\n value: string\n onChange: (value: string) => void\n size?: SegmentedControlSize\n disabled?: boolean\n glass?: boolean\n}\n\nconst sizeClasses: Record<SegmentedControlSize, string> = {\n default: 'px-3 py-1.5 text-xs',\n sm: 'px-2 py-1 text-[11px]',\n}\n\nconst SegmentedControl = forwardRef<HTMLDivElement, SegmentedControlProps>(\n function SegmentedControl(\n {\n options,\n value,\n onChange,\n size = 'default',\n disabled,\n glass,\n className,\n ...props\n },\n ref\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-button bg-bg-tertiary inline-flex p-0.5 select-none',\n glass === true && glassClass(glass),\n disabled === true && 'pointer-events-none opacity-50',\n className\n )}\n data-component=\"segmented-control\"\n data-state={disabled === true ? 'disabled' : 'enabled'}\n role=\"radiogroup\"\n {...props}\n >\n {options.map((option) => {\n const isActive = option.value === value\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={disabled}\n onClick={() => {\n if (!isActive) {\n onChange(option.value)\n }\n }}\n className={cx(\n 'gds-radius-button transition-all',\n sizeClasses[size ?? 'default'],\n focusCls,\n isActive\n ? 'bg-bg text-fg gds-shadow-sm font-medium'\n : 'text-fg-muted hover:text-fg'\n )}\n >\n {option.label}\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport { SegmentedControl }\nexport type {\n SegmentedControlOption,\n SegmentedControlProps,\n SegmentedControlSize,\n}\n","// shortcut-display — keyboard shortcut with optional description\nimport { forwardRef } from 'react'\n\nimport { Kbd } from '../l2-primitives/kbd'\nimport { cx } from '../utils/cx'\n\ntype ShortcutDisplayProps = React.HTMLAttributes<HTMLSpanElement> & {\n description?: string\n keys: string[]\n}\n\nexport const ShortcutDisplay = forwardRef<\n HTMLSpanElement,\n ShortcutDisplayProps\n>(function ShortcutDisplay({ className, description, keys, ...props }, ref) {\n return (\n <span\n className={cx('inline-flex items-center gap-2', className)}\n data-component=\"shortcut-display\"\n ref={ref}\n {...props}\n >\n <span className=\"inline-flex items-center gap-0.5\">\n {keys.map((key, i) => (\n <Kbd key={i}>{key}</Kbd>\n ))}\n </span>\n {description !== undefined && (\n <span className=\"text-fg-muted text-xs\">{description}</span>\n )}\n </span>\n )\n})\n\nexport type { ShortcutDisplayProps }\n","// skeleton-group — predefined skeleton layouts for common loading patterns\nimport { forwardRef } from 'react'\n\nimport { Skeleton } from '../l2-primitives/skeleton'\nimport { cx } from '../utils/cx'\n\ntype SkeletonGroupVariant = 'avatar-text' | 'card' | 'form-field'\n\ntype SkeletonGroupProps = {\n className?: string\n count?: number\n variant?: SkeletonGroupVariant\n}\n\nconst layouts: Record<SkeletonGroupVariant, () => React.ReactNode> = {\n 'avatar-text': () => (\n <div className=\"flex items-center gap-3\">\n <Skeleton variant=\"circle\" />\n <div className=\"flex flex-1 flex-col gap-2\">\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"40%\" />\n </div>\n </div>\n ),\n card: () => (\n <div className=\"flex flex-col gap-3\">\n <Skeleton variant=\"rect\" />\n <Skeleton variant=\"text\" />\n <Skeleton variant=\"text\" width=\"80%\" />\n <Skeleton variant=\"text\" width=\"50%\" />\n </div>\n ),\n 'form-field': () => (\n <div className=\"flex flex-col gap-2\">\n <Skeleton variant=\"text\" width=\"30%\" />\n <Skeleton variant=\"rect\" height={36} />\n </div>\n ),\n}\n\nexport const SkeletonGroup = forwardRef<HTMLDivElement, SkeletonGroupProps>(\n function SkeletonGroup(\n { className, count = 1, variant = 'avatar-text' },\n ref\n ) {\n const render = layouts[variant]\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"skeleton-group\"\n data-variant={variant}\n >\n {Array.from({ length: count }, (_, i) => (\n <div key={i}>{render()}</div>\n ))}\n </div>\n )\n }\n)\n\nexport type { SkeletonGroupProps, SkeletonGroupVariant }\n","// sparkle — animated sparkle/star particles around a child element\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type SparkleProps = {\n children: React.ReactNode\n active?: boolean\n count?: number\n color?: string\n className?: string\n}\n\nconst STAR_PATH = 'M12 0l3 9 9 3-9 3-3 9-3-9-9-3 9-3z'\n\nfunction starStyle(i: number, count: number): React.CSSProperties {\n const angle = (360 / count) * i\n const rad = (angle * Math.PI) / 180\n const dist = 70 + (i % 3) * 15\n const x = Math.cos(rad) * dist\n const y = Math.sin(rad) * dist\n return {\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: 10,\n height: 10,\n transform: `translate(${x}%, ${y}%)`,\n animation: `gds-sparkle 1.4s ease-in-out ${i * 0.2}s infinite`,\n opacity: 0,\n }\n}\n\nexport const Sparkle = forwardRef<HTMLSpanElement, SparkleProps>(\n function Sparkle(\n {\n children,\n active = true,\n count = 3,\n color = 'var(--gds-accent)',\n className,\n },\n ref\n ) {\n const particles = Array.from({ length: count }, (_, i) => i)\n\n return (\n <span\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"sparkle\"\n >\n {children}\n {active &&\n particles.map((i) => (\n <svg\n key={i}\n viewBox=\"0 0 24 24\"\n fill={color}\n style={starStyle(i, count)}\n aria-hidden=\"true\"\n >\n <path d={STAR_PATH} />\n </svg>\n ))}\n {active && (\n <style>{`\n @keyframes gds-sparkle {\n 0%, 100% { opacity: 0; transform: scale(0) rotate(0deg); }\n 50% { opacity: 1; transform: scale(1) rotate(180deg); }\n }\n `}</style>\n )}\n </span>\n )\n }\n)\n","import type { ReactNode } from 'react'\nimport { Children } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StaggerProps = {\n animation?: 'fade' | 'scale' | 'slide-up'\n children: ReactNode[]\n className?: string\n delay?: number\n}\n\nconst animationClasses: Record<string, string> = {\n fade: 'animate-[stagger-fade_0.4s_ease_both]',\n scale: 'animate-[stagger-scale_0.4s_ease_both]',\n 'slide-up': 'animate-[stagger-slide-up_0.4s_ease_both]',\n}\n\nexport function Stagger({\n animation = 'fade',\n children,\n className,\n delay = 80,\n}: StaggerProps) {\n const items = Children.toArray(children)\n return (\n <div className={cx('', className)} data-component=\"stagger\">\n {items.map((child, i) => (\n <div\n className={animationClasses[animation]}\n key={i}\n style={{ animationDelay: `${i * delay}ms` }}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport type { StaggerProps }\n","// star-rating — read-only star rating display with half-star support\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst sizeMap = { sm: 14, default: 18, lg: 24 }\nconst STAR_D =\n 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z'\n\ntype StarRatingProps = {\n value: number\n max?: number\n size?: 'sm' | 'default' | 'lg'\n color?: string\n className?: string\n}\n\nfunction StarIcon({\n fill,\n s,\n color,\n}: {\n fill: 'full' | 'half' | 'empty'\n s: number\n color: string\n}) {\n const id = `half-${Math.random().toString(36).slice(2, 8)}`\n if (fill === 'full') {\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill={color}\n stroke={color}\n strokeWidth={1}\n >\n <path d={STAR_D} />\n </svg>\n )\n }\n if (fill === 'half') {\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n stroke={color}\n strokeWidth={1}\n >\n <defs>\n <clipPath id={id}>\n <rect x=\"0\" y=\"0\" width=\"12\" height=\"24\" />\n </clipPath>\n </defs>\n <path d={STAR_D} fill=\"none\" />\n <path d={STAR_D} fill={color} clipPath={`url(#${id})`} />\n </svg>\n )\n }\n return (\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1}\n className=\"text-fg-muted/30\"\n >\n <path d={STAR_D} />\n </svg>\n )\n}\n\nconst StarRating = forwardRef<HTMLDivElement, StarRatingProps>(\n function StarRating(\n { value, max = 5, size = 'default', color = 'currentColor', className },\n ref\n ) {\n const s = sizeMap[size]\n const c = color === 'currentColor' ? 'var(--color-warning)' : color\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-0.5', className)}\n data-component=\"star-rating\"\n role=\"img\"\n aria-label={`${value} out of ${max} stars`}\n >\n {Array.from({ length: max }, (_, i) => {\n const diff = value - i\n const fill = diff >= 1 ? 'full' : diff >= 0.5 ? 'half' : 'empty'\n return <StarIcon key={i} fill={fill} s={s} color={c} />\n })}\n </div>\n )\n }\n)\n\nexport { StarRating }\nexport type { StarRatingProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype StatusType =\n | 'active'\n | 'draft'\n | 'error'\n | 'inactive'\n | 'pending'\n | 'warning'\n\nconst statusColorMap: Record<StatusType, string> = {\n active: 'bg-success/10 text-success',\n draft: 'bg-fg-muted/10 text-fg-muted',\n error: 'bg-danger/10 text-danger',\n inactive: 'bg-fg-muted/10 text-fg-muted',\n pending: 'bg-warning/10 text-warning',\n warning: 'bg-warning/10 text-warning',\n}\n\ntype StatusBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n glass?: boolean\n icon?: ReactNode\n label?: string\n size?: 'default' | 'sm'\n status: StatusType\n}\n\nexport const StatusBadge = forwardRef<HTMLSpanElement, StatusBadgeProps>(\n function StatusBadge(\n { className, glass, icon, label, size = 'default', status, ...props },\n ref\n ) {\n const displayLabel = label ?? status\n const sizeClasses =\n size === 'sm'\n ? 'gds-pad-x-sm py-px gds-text-caption'\n : 'gds-pad-x-sm gds-pad-y-sm gds-text-body'\n\n return (\n <span\n className={cx(\n 'gds-gap-xs gds-radius-badge inline-flex items-center font-medium select-none',\n sizeClasses,\n statusColorMap[status],\n glassClass(glass),\n glass === true && 'border border-white/10 bg-white/5',\n className\n )}\n data-component=\"status-badge\"\n data-state={status}\n ref={ref}\n {...props}\n >\n {icon !== undefined && (\n <span className=\"gds-icon-child-sm\">{icon}</span>\n )}\n {displayLabel}\n </span>\n )\n }\n)\n\nconst statusBadgeVariants = {\n status: statusColorMap,\n size: {\n default: 'gds-pad-x-sm gds-pad-y-sm gds-text-body',\n sm: 'gds-pad-x-sm py-px gds-text-caption',\n },\n} as const\n\nexport { statusBadgeVariants }\nexport type { StatusBadgeProps, StatusType }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype StatusDotStatus = 'connected' | 'connecting' | 'disconnected'\n\ntype StatusDotProps = React.HTMLAttributes<HTMLSpanElement> & {\n label?: string\n status: StatusDotStatus\n}\n\nconst dotCls: Record<StatusDotStatus, string> = {\n connected: 'bg-success',\n connecting: 'bg-warning animate-pulse',\n disconnected: 'bg-danger',\n}\n\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n function StatusDot({ className, label, status, ...props }, ref) {\n return (\n <span\n className={cx('gds-gap-sm inline-flex items-center', className)}\n data-component=\"status-dot\"\n data-state={status}\n ref={ref}\n {...props}\n >\n <span className={cx('h-2 w-2 shrink-0 rounded-full', dotCls[status])} />\n {label !== undefined && (\n <span className=\"gds-text-label text-fg-muted\">{label}</span>\n )}\n </span>\n )\n }\n)\n\nconst statusDotVariants = {\n status: dotCls,\n} as const\n\nexport { statusDotVariants }\nexport type { StatusDotProps, StatusDotStatus }\n","// switch-group — list of labeled switches for settings pages\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { Switch } from './switch'\n\ntype SwitchGroupItem = {\n checked: boolean\n description?: string\n id: string\n label: string\n}\n\ntype SwitchGroupProps = {\n className?: string\n disabled?: boolean\n items: SwitchGroupItem[]\n onChange: (id: string, checked: boolean) => void\n}\n\nexport const SwitchGroup = forwardRef<HTMLDivElement, SwitchGroupProps>(\n function SwitchGroup({ className, disabled = false, items, onChange }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-3', className)}\n data-component=\"switch-group\"\n role=\"group\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n className=\"gds-pad-x gds-pad-y-sm flex items-center justify-between gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-text-body text-fg font-medium\">\n {item.label}\n </div>\n {item.description !== undefined && (\n <div className=\"gds-text-caption text-fg-muted mt-0.5\">\n {item.description}\n </div>\n )}\n </div>\n <Switch\n checked={item.checked}\n disabled={disabled}\n onChange={(checked) => onChange(item.id, checked)}\n />\n </div>\n ))}\n </div>\n )\n }\n)\n\nexport type { SwitchGroupItem, SwitchGroupProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst variantMap = {\n accent: 'bg-accent/15 text-accent',\n danger: 'bg-danger/15 text-danger',\n muted: 'bg-fg-muted/10 text-fg-muted',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n} as const\n\nconst sizeMap = {\n default: 'px-1.5 py-0.5 text-[10px]',\n sm: 'px-1 py-px text-[9px]',\n} as const\n\ntype TextBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n label: string\n size?: 'default' | 'sm'\n variant?: 'accent' | 'danger' | 'muted' | 'success' | 'warning'\n}\n\nexport const TextBadge = forwardRef<HTMLSpanElement, TextBadgeProps>(\n function TextBadge(\n { className, label, size = 'default', variant = 'accent', ...props },\n ref\n ) {\n return (\n <span\n className={cx(\n 'inline-flex items-center rounded-full leading-none font-bold tracking-wider uppercase select-none',\n variantMap[variant],\n sizeMap[size],\n className\n )}\n data-component=\"text-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n {label}\n </span>\n )\n }\n)\n\nexport type { TextBadgeProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TextEffectType = 'glow' | 'gradient' | 'highlight'\n\ntype TextEffectProps = React.HTMLAttributes<HTMLSpanElement> & {\n children: string\n effect: TextEffectType\n gradientFrom?: string\n gradientTo?: string\n}\n\nexport const TextEffect = forwardRef<HTMLSpanElement, TextEffectProps>(\n function TextEffect(\n { children, className, effect, gradientFrom, gradientTo, style, ...props },\n ref\n ) {\n const from = gradientFrom ?? 'var(--gds-accent)'\n const to = gradientTo ?? 'var(--gds-success)'\n\n if (effect === 'gradient') {\n return (\n <span\n className={cx('bg-clip-text text-transparent', className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={{\n backgroundImage: `linear-gradient(135deg, ${from}, ${to})`,\n ...style,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (effect === 'highlight') {\n return (\n <span\n className={cx('bg-accent/20 box-decoration-clone px-1', className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={style}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n // glow\n return (\n <span\n className={cx(className)}\n data-component=\"text-effect\"\n data-variant={effect}\n ref={ref}\n style={{\n textShadow: `0 0 8px var(--gds-accent), 0 0 16px var(--gds-accent)`,\n ...style,\n }}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nexport type { TextEffectProps, TextEffectType }\n","// textarea-counter — textarea with character count display\nimport { forwardRef } from 'react'\n\nimport type { TextareaProps } from '../l2-primitives/textarea'\nimport { Textarea } from '../l2-primitives/textarea'\nimport { cx } from '../utils/cx'\n\ntype TextareaCounterProps = Omit<TextareaProps, 'onChange'> & {\n maxLength?: number\n onChange: (value: string) => void\n value: string\n}\n\nexport const TextareaCounter = forwardRef<\n HTMLTextAreaElement,\n TextareaCounterProps\n>(function TextareaCounter(\n { className, error, maxLength, onChange, value, ...props },\n ref\n) {\n const count = value.length\n const nearLimit = maxLength !== undefined && count >= maxLength * 0.9\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"textarea-counter\"\n >\n <Textarea\n error={error ?? nearLimit}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n ref={ref}\n value={value}\n {...props}\n />\n <div\n className={cx(\n 'mt-1 text-right text-[11px]',\n nearLimit ? 'text-danger' : 'text-fg-muted'\n )}\n >\n {maxLength !== undefined ? `${count} / ${maxLength}` : count}\n </div>\n </div>\n )\n})\n\nexport type { TextareaCounterProps }\n","// theme-toggle — dark/light mode toggle with icon transition\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type ThemeToggleMode = 'dark' | 'light'\n\nexport type ThemeToggleProps = {\n mode: ThemeToggleMode\n onChange: (mode: ThemeToggleMode) => void\n size?: 'default' | 'sm'\n className?: string\n}\n\nconst sizeMap = {\n default: 'h-8 w-8',\n sm: 'h-6 w-6',\n}\n\nconst iconSizeMap = {\n default: 16,\n sm: 14,\n}\n\nexport const ThemeToggle = forwardRef<HTMLButtonElement, ThemeToggleProps>(\n function ThemeToggle({ mode, onChange, size = 'default', className }, ref) {\n const isDark = mode === 'dark'\n const iconSize = iconSizeMap[size]\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}\n onClick={() => onChange(isDark ? 'light' : 'dark')}\n className={cx(\n 'text-fg-muted hover:text-fg inline-flex items-center justify-center rounded-full transition-colors select-none',\n sizeMap[size],\n focusCls,\n className\n )}\n data-component=\"theme-toggle\"\n data-state={mode}\n >\n {isDark ? (\n // sun icon — shown in dark mode, click to switch to light\n <svg\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"transition-transform duration-200\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" />\n <path d=\"M8 1v2M8 13v2M1 8h2M13 8h2M3.05 3.05l1.41 1.41M11.54 11.54l1.41 1.41M3.05 12.95l1.41-1.41M11.54 4.46l1.41-1.41\" />\n </svg>\n ) : (\n // moon icon — shown in light mode, click to switch to dark\n <svg\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n className=\"transition-transform duration-200\"\n >\n <path d=\"M13.5 8.5a5.5 5.5 0 01-7-7A5.5 5.5 0 108 14a5.48 5.48 0 005.5-5.5z\" />\n </svg>\n )}\n </button>\n )\n }\n)\n","// toggle-group — group of toggle buttons, one or more can be active\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype ToggleGroupItem = {\n value: string\n label: ReactNode\n}\n\ntype ToggleGroupSize = 'default' | 'lg' | 'sm'\n\ntype ToggleGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n items: ToggleGroupItem[]\n value: string[]\n onChange: (value: string[]) => void\n exclusive?: boolean\n size?: ToggleGroupSize\n disabled?: boolean\n}\n\nconst toggleGroupVariants = {\n size: {\n sm: 'px-2 py-1 text-[11px]',\n default: 'px-3 py-1.5 text-xs',\n lg: 'px-4 py-2 text-sm',\n },\n} as const\n\nconst toggleItemVariants = toggleGroupVariants\n\nconst ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(\n function ToggleGroup(\n {\n items,\n value,\n onChange,\n exclusive,\n size = 'default',\n disabled,\n className,\n ...props\n },\n ref\n ) {\n function handleClick(itemValue: string) {\n if (exclusive === true) {\n // exclusive: always select the clicked one (no deselect)\n if (!value.includes(itemValue)) {\n onChange([itemValue])\n }\n return\n }\n // multi: toggle\n if (value.includes(itemValue)) {\n onChange(value.filter((v) => v !== itemValue))\n } else {\n onChange([...value, itemValue])\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-button border-border bg-bg inline-flex overflow-hidden border select-none',\n disabled === true && 'pointer-events-none opacity-50',\n className\n )}\n data-component=\"toggle-group\"\n data-state={disabled === true ? 'disabled' : 'enabled'}\n role=\"group\"\n {...props}\n >\n {items.map((item, index) => {\n const isActive = value.includes(item.value)\n const isLast = index === items.length - 1\n return (\n <button\n key={item.value}\n aria-pressed={isActive}\n className={cx(\n 'transition-colors',\n toggleGroupVariants.size[size ?? 'default'],\n !isLast && 'border-border border-r',\n focusCls,\n isActive\n ? 'bg-accent/10 text-accent'\n : 'text-fg-muted hover:bg-bg-tertiary'\n )}\n disabled={disabled}\n onClick={() => handleClick(item.value)}\n type=\"button\"\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n }\n)\n\nexport { ToggleGroup, toggleGroupVariants, toggleItemVariants }\nexport type { ToggleGroupItem, ToggleGroupProps, ToggleGroupSize }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TrendArrowDirection = 'up' | 'down' | 'flat'\ntype TrendArrowSize = 'sm' | 'default'\n\ntype TrendArrowProps = React.HTMLAttributes<HTMLSpanElement> & {\n direction: TrendArrowDirection\n size?: TrendArrowSize\n}\n\nconst sizeMap: Record<TrendArrowSize, number> = { sm: 12, default: 16 }\n\nconst TrendArrow = forwardRef<HTMLSpanElement, TrendArrowProps>(\n function TrendArrow(\n { className, direction, size = 'default', ...props },\n ref\n ) {\n const s = sizeMap[size]\n const colorCls =\n direction === 'up'\n ? 'text-success'\n : direction === 'down'\n ? 'text-danger'\n : 'text-fg-muted'\n\n return (\n <span\n className={cx('inline-flex', colorCls, className)}\n data-component=\"trend-arrow\"\n data-direction={direction}\n ref={ref}\n {...props}\n >\n <svg\n fill=\"none\"\n height={s}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n width={s}\n >\n {direction === 'up' && <path d=\"M12 19V5M5 12l7-7 7 7\" />}\n {direction === 'down' && <path d=\"M12 5v14M19 12l-7 7-7-7\" />}\n {direction === 'flat' && <path d=\"M5 12h14\" />}\n </svg>\n </span>\n )\n }\n)\n\nexport { TrendArrow }\nexport type { TrendArrowDirection, TrendArrowProps, TrendArrowSize }\n","import { cx } from '../utils/cx'\n\ntype TrendIndicatorProps = {\n className?: string\n inverse?: boolean\n label?: string\n value: number\n}\n\nexport function TrendIndicator({\n className,\n inverse = false,\n label,\n value,\n}: TrendIndicatorProps) {\n const isPositive = value > 0\n const isNegative = value < 0\n const isZero = value === 0\n\n const colorClass = isZero\n ? 'text-fg-muted'\n : isPositive\n ? inverse\n ? 'text-danger'\n : 'text-success'\n : inverse\n ? 'text-success'\n : 'text-danger'\n\n const arrow = isPositive ? '\\u25B2' : isNegative ? '\\u25BC' : '\\u2500'\n const sign = isPositive ? '+' : ''\n\n return (\n <span\n className={cx(\n 'inline-flex items-center gap-1 text-sm font-medium select-none',\n colorClass,\n className\n )}\n data-component=\"trend-indicator\"\n >\n <span className=\"text-[10px]\">{arrow}</span>\n <span>\n {sign}\n {value}%\n </span>\n {label !== undefined && (\n <span className=\"text-fg-muted text-xs font-normal\">{label}</span>\n )}\n </span>\n )\n}\n\nexport type { TrendIndicatorProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype TruncatedListProps = React.HTMLAttributes<HTMLDivElement> & {\n items: ReactNode[]\n max?: number\n moreLabel?: (count: number) => string\n}\n\nexport const TruncatedList = forwardRef<HTMLDivElement, TruncatedListProps>(\n function TruncatedList(\n { className, items, max = 3, moreLabel, ...props },\n ref\n ) {\n const visible = items.slice(0, max)\n const remaining = items.length - max\n\n return (\n <div\n className={cx(\n 'gds-gap-sm inline-flex flex-wrap items-center',\n className\n )}\n data-component=\"truncated-list\"\n ref={ref}\n {...props}\n >\n {visible.map((item, i) => (\n <span key={i}>{item}</span>\n ))}\n {remaining > 0 && (\n <span className=\"gds-text-label text-fg-muted\">\n {moreLabel !== undefined\n ? moreLabel(remaining)\n : `+${remaining} more`}\n </span>\n )}\n </div>\n )\n }\n)\n\nexport type { TruncatedListProps }\n","// typewriter — characters appear one by one\nimport { forwardRef, useEffect, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TypewriterProps = {\n text: string\n speed?: number\n delay?: number\n cursor?: boolean\n onComplete?: () => void\n className?: string\n}\n\nexport const Typewriter = forwardRef<HTMLSpanElement, TypewriterProps>(\n function Typewriter(\n { text, speed = 50, delay = 0, cursor = true, onComplete, className },\n ref\n ) {\n const [length, setLength] = useState(0)\n const [started, setStarted] = useState(delay <= 0)\n\n useEffect(() => {\n if (delay <= 0) return\n const timer = setTimeout(() => setStarted(true), delay)\n return () => clearTimeout(timer)\n }, [delay])\n\n useEffect(() => {\n if (!started) return\n if (length >= text.length) {\n if (onComplete !== undefined) onComplete()\n return\n }\n const timer = setTimeout(() => setLength((prev) => prev + 1), speed)\n return () => clearTimeout(timer)\n }, [length, text.length, speed, started, onComplete])\n\n // reset when text changes\n useEffect(() => {\n setLength(0)\n if (delay <= 0) setStarted(true)\n }, [text, delay])\n\n return (\n <span ref={ref} className={cx(className)} data-component=\"typewriter\">\n {text.slice(0, length)}\n {cursor && (\n <span\n className=\"inline-block animate-pulse\"\n data-testid=\"cursor\"\n aria-hidden\n >\n |\n </span>\n )}\n </span>\n )\n }\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VerifiedBadgeVariant = 'default' | 'gold' | 'official'\n\ntype VerifiedBadgeProps = React.HTMLAttributes<HTMLSpanElement> & {\n size?: 'default' | 'sm'\n variant?: VerifiedBadgeVariant\n}\n\nconst variantColors: Record<VerifiedBadgeVariant, string> = {\n default: 'text-accent',\n gold: 'text-warning',\n official: 'text-success',\n}\n\nconst sizeMap = { default: 16, sm: 12 } as const\n\nexport const VerifiedBadge = forwardRef<HTMLSpanElement, VerifiedBadgeProps>(\n function VerifiedBadge(\n { className, size = 'default', variant = 'default', ...props },\n ref\n ) {\n const s = sizeMap[size]\n return (\n <span\n className={cx(\n 'inline-flex shrink-0 items-center',\n variantColors[variant],\n className\n )}\n data-component=\"verified-badge\"\n data-variant={variant}\n ref={ref}\n {...props}\n >\n <svg fill=\"currentColor\" height={s} viewBox=\"0 0 24 24\" width={s}>\n <path d=\"M12 1l3.09 2.26L19 3.27l.01 3.91L22 10.18 19.82 13l.18 3.91-3.91 1.01L13.09 21 12 23l-3.09-2.26L5 21.73l-.01-3.91L2 14.82 4.18 12l-.18-3.91 3.91-1.01L10.91 4 12 1zm-1.5 12.5l5-5-1.41-1.41L10.5 10.67 8.41 8.59 7 10l3.5 3.5z\" />\n </svg>\n </span>\n )\n }\n)\n\nexport type { VerifiedBadgeProps, VerifiedBadgeVariant }\n","// visual-counter — number display with +/- controls\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype VisualCounterProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> & {\n value: number\n onChange: (value: number) => void\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n}\n\nexport const VisualCounter = forwardRef<HTMLDivElement, VisualCounterProps>(\n function VisualCounter(\n {\n value,\n onChange,\n min,\n max,\n step = 1,\n disabled = false,\n className,\n ...props\n },\n ref\n ) {\n const atMin = min !== undefined && value <= min\n const atMax = max !== undefined && value >= max\n\n return (\n <div\n ref={ref}\n className={cx('inline-flex items-center gap-1 select-none', className)}\n data-component=\"visual-counter\"\n {...props}\n >\n <button\n type=\"button\"\n className={cx(\n 'border-border text-fg-muted hover:bg-bg-tertiary flex h-7 w-7 items-center justify-center rounded-md border transition-colors disabled:opacity-40',\n focusCls\n )}\n disabled={disabled || atMin}\n onClick={() => onChange(Math.max(min ?? -Infinity, value - step))}\n >\n −\n </button>\n <span className=\"gds-text text-fg min-w-[2rem] text-center tabular-nums\">\n {value}\n </span>\n <button\n type=\"button\"\n className={cx(\n 'border-border text-fg-muted hover:bg-bg-tertiary flex h-7 w-7 items-center justify-center rounded-md border transition-colors disabled:opacity-40',\n focusCls\n )}\n disabled={disabled || atMax}\n onClick={() => onChange(Math.min(max ?? Infinity, value + step))}\n >\n +\n </button>\n </div>\n )\n }\n)\n\nexport type { VisualCounterProps }\n","import { useCallback } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype VolumeSliderProps = {\n className?: string\n onChange: (v: number) => void\n value: number\n}\n\nconst TOTAL_BARS = 10\n\nexport function VolumeSlider({\n className,\n onChange,\n value,\n}: VolumeSliderProps) {\n const filledBars = Math.round((value / 100) * TOTAL_BARS)\n\n const handleBarClick = useCallback(\n (barIndex: number) => {\n onChange(Math.round(((barIndex + 1) / TOTAL_BARS) * 100))\n },\n [onChange]\n )\n\n return (\n <div\n className={cx(\n 'inline-flex flex-col-reverse items-center gap-1 select-none',\n className\n )}\n data-component=\"volume-slider\"\n >\n {Array.from({ length: TOTAL_BARS }, (_, i) => (\n <button\n className={cx(\n 'h-2 w-8 cursor-pointer rounded-sm transition-colors',\n i < filledBars ? 'bg-accent' : 'bg-bg-tertiary'\n )}\n key={i}\n onClick={() => handleBarClick(i)}\n type=\"button\"\n />\n ))}\n </div>\n )\n}\n\nexport type { VolumeSliderProps }\n","// zoom-on-hover — wrapper that scales content on hover\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ZoomOnHoverProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n duration?: number\n scale?: number\n}\n\nexport const ZoomOnHover = forwardRef<HTMLDivElement, ZoomOnHoverProps>(\n function ZoomOnHover(\n { children, className, duration = 300, scale = 1.1, ...props },\n ref\n ) {\n return (\n <div\n className={cx('overflow-hidden', className)}\n data-component=\"zoom-on-hover\"\n ref={ref}\n {...props}\n >\n <div\n className=\"transition-transform ease-out\"\n style={{ transitionDuration: `${duration}ms` }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = `scale(${scale})`\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n }}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\nexport type { ZoomOnHoverProps }\n"],"mappings":"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"}