@goliapkg/gds 0.9.4 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/avatar-By0U5Vts.js +74 -0
  2. package/dist/avatar-By0U5Vts.js.map +1 -0
  3. package/dist/badge-DTJq6AXr.js +59 -0
  4. package/dist/badge-DTJq6AXr.js.map +1 -0
  5. package/dist/button-avu-rQU4.js +99 -0
  6. package/dist/button-avu-rQU4.js.map +1 -0
  7. package/dist/dom-17XgfxMq.js +20 -0
  8. package/dist/dom-17XgfxMq.js.map +1 -0
  9. package/dist/gesture-BCGijGek.js +104 -0
  10. package/dist/gesture-BCGijGek.js.map +1 -0
  11. package/dist/gesture-system-v-bjvnCe.js +56 -0
  12. package/dist/gesture-system-v-bjvnCe.js.map +1 -0
  13. package/dist/glass-CQTlX7IO.js +1702 -0
  14. package/dist/glass-CQTlX7IO.js.map +1 -0
  15. package/dist/highlight-BAGZc-4h.js +28 -0
  16. package/dist/highlight-BAGZc-4h.js.map +1 -0
  17. package/dist/hooks-BE-_EmDI.js +87 -0
  18. package/dist/hooks-BE-_EmDI.js.map +1 -0
  19. package/dist/icon-button-YatlVZnz.js +44 -0
  20. package/dist/icon-button-YatlVZnz.js.map +1 -0
  21. package/dist/index.d.ts +8 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +32 -18495
  24. package/dist/l0-tokens/deps.d.ts +5 -0
  25. package/dist/l0-tokens/deps.d.ts.map +1 -1
  26. package/dist/l0-tokens/index.js +4 -0
  27. package/dist/l0-tokens-DZkyVlac.js +296 -0
  28. package/dist/l0-tokens-DZkyVlac.js.map +1 -0
  29. package/dist/l1-systems/index.js +2 -0
  30. package/dist/l2-primitives/index.js +11 -0
  31. package/dist/l2-primitives/screen-overlay.d.ts.map +1 -1
  32. package/dist/l2-primitives/truncate.d.ts +2 -1
  33. package/dist/l2-primitives/truncate.d.ts.map +1 -1
  34. package/dist/l2-primitives-CqrezrJ4.js +482 -0
  35. package/dist/l2-primitives-CqrezrJ4.js.map +1 -0
  36. package/dist/l3-atoms/index.js +6 -0
  37. package/dist/l3-atoms/keyboard-shortcut.d.ts +1 -1
  38. package/dist/l3-atoms/keyboard-shortcut.d.ts.map +1 -1
  39. package/dist/l3-atoms/sparkle.d.ts +1 -1
  40. package/dist/l3-atoms/sparkle.d.ts.map +1 -1
  41. package/dist/l3-atoms-CsN9IA9J.js +1794 -0
  42. package/dist/l3-atoms-CsN9IA9J.js.map +1 -0
  43. package/dist/l4-molecules/dialog.d.ts.map +1 -1
  44. package/dist/l4-molecules/index.js +4 -0
  45. package/dist/l4-molecules-DCc074MJ.js +4048 -0
  46. package/dist/l4-molecules-DCc074MJ.js.map +1 -0
  47. package/dist/l5-organisms/command-palette.d.ts.map +1 -1
  48. package/dist/l5-organisms/confetti.d.ts.map +1 -1
  49. package/dist/l5-organisms/cookie-banner.d.ts.map +1 -1
  50. package/dist/l5-organisms/image-preview.d.ts.map +1 -1
  51. package/dist/l5-organisms/index.js +2 -0
  52. package/dist/l5-organisms/notification-toast.d.ts.map +1 -1
  53. package/dist/l5-organisms-8KB_8a-H.js +3798 -0
  54. package/dist/l5-organisms-8KB_8a-H.js.map +1 -0
  55. package/dist/l6-charts/candlestick-chart.d.ts.map +1 -1
  56. package/dist/l6-charts/index.js +2 -0
  57. package/dist/l6-charts-DYnr5B9X.js +1743 -0
  58. package/dist/l6-charts-DYnr5B9X.js.map +1 -0
  59. package/dist/l7-patterns/index.js +2 -0
  60. package/dist/l7-patterns-DZXveS4Y.js +1826 -0
  61. package/dist/l7-patterns-DZXveS4Y.js.map +1 -0
  62. package/dist/loading-dots-fB4X_Zh0.js +24 -0
  63. package/dist/loading-dots-fB4X_Zh0.js.map +1 -0
  64. package/dist/motion-DUPegem-.js +22 -0
  65. package/dist/motion-DUPegem-.js.map +1 -0
  66. package/dist/portal-Bbl6F_Wj.js +9 -0
  67. package/dist/portal-Bbl6F_Wj.js.map +1 -0
  68. package/dist/progress-wAKN3Czz.js +44 -0
  69. package/dist/progress-wAKN3Czz.js.map +1 -0
  70. package/dist/resize-handle-CktEYqwi.js +77 -0
  71. package/dist/resize-handle-CktEYqwi.js.map +1 -0
  72. package/dist/scales-C80FTPsL.js +1299 -0
  73. package/dist/scales-C80FTPsL.js.map +1 -0
  74. package/dist/separator-Dqs23A9D.js +65 -0
  75. package/dist/separator-Dqs23A9D.js.map +1 -0
  76. package/dist/skeleton-C9FFZSYN.js +43 -0
  77. package/dist/skeleton-C9FFZSYN.js.map +1 -0
  78. package/dist/spinner-D8Ti-TFe.js +101 -0
  79. package/dist/spinner-D8Ti-TFe.js.map +1 -0
  80. package/dist/stepper-DhpGORX8.js +140 -0
  81. package/dist/stepper-DhpGORX8.js.map +1 -0
  82. package/dist/switch-DC85Os9r.js +130 -0
  83. package/dist/switch-DC85Os9r.js.map +1 -0
  84. package/dist/textarea-BJCl_aH2.js +40 -0
  85. package/dist/textarea-BJCl_aH2.js.map +1 -0
  86. package/dist/toast-DN5xANLM.js +442 -0
  87. package/dist/toast-DN5xANLM.js.map +1 -0
  88. package/dist/use-theme-C0aWVw70.js +203 -0
  89. package/dist/use-theme-C0aWVw70.js.map +1 -0
  90. package/dist/utils/index.d.ts +1 -0
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +7 -0
  93. package/dist/utils/portal.d.ts +3 -0
  94. package/dist/utils/portal.d.ts.map +1 -0
  95. package/package.json +37 -1
  96. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scales-C80FTPsL.js","names":[],"sources":["../src/l0-tokens/color-math.ts","../src/l0-tokens/color-health.ts","../src/l0-tokens/color-derive.ts","../src/l0-tokens/size-system.ts","../src/l0-tokens/radius-system.ts","../src/l0-tokens/shadow-system.ts","../src/l0-tokens/glass-system.ts","../src/l0-tokens/motion-system.ts","../src/l0-tokens/font-system.ts","../src/l0-tokens/generate-defaults.ts","../src/l0-tokens/scales.ts"],"sourcesContent":["// L0 — pure color math\n// hex ↔ rgb ↔ hsl conversion, manipulation, contrast\n\nexport type Rgb = { r: number, g: number, b: number }\nexport type Hsl = { h: number, s: number, l: number }\n\n// hex → rgb\nexport function hexToRgb(hex: string): Rgb {\n const h = hex.replace('#', '')\n const n = parseInt(h.length === 3 ? h.split('').map(c => c + c).join('') : h, 16)\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 }\n}\n\n// rgb → hex\nexport function rgbToHex(rgb: Rgb): string {\n const c = (v: number) => Math.round(Math.min(255, Math.max(0, v))).toString(16).padStart(2, '0')\n return `#${c(rgb.r)}${c(rgb.g)}${c(rgb.b)}`\n}\n\n// rgb → hsl\nexport function rgbToHsl(rgb: Rgb): Hsl {\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n if (max === min) return { h: 0, s: 0, l }\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n const h = max === r\n ? ((g - b) / d + (g < b ? 6 : 0)) / 6\n : max === g\n ? ((b - r) / d + 2) / 6\n : ((r - g) / d + 4) / 6\n return { h: h * 360, s, l }\n}\n\n// hsl → rgb\nexport function hslToRgb(hsl: Hsl): Rgb {\n const { h, s, l } = hsl\n if (s === 0) {\n const v = Math.round(l * 255)\n return { r: v, g: v, b: v }\n }\n const hue2rgb = (p: number, q: number, t: number) => {\n const tt = t < 0 ? t + 1 : t > 1 ? t - 1 : t\n if (tt < 1 / 6) return p + (q - p) * 6 * tt\n if (tt < 1 / 2) return q\n if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6\n return p\n }\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n const hNorm = h / 360\n return {\n r: Math.round(hue2rgb(p, q, hNorm + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, hNorm) * 255),\n b: Math.round(hue2rgb(p, q, hNorm - 1 / 3) * 255),\n }\n}\n\n// hex → hsl shortcut\nexport function hexToHsl(hex: string): Hsl {\n return rgbToHsl(hexToRgb(hex))\n}\n\n// hsl → hex shortcut\nexport function hslToHex(hsl: Hsl): string {\n return rgbToHex(hslToRgb(hsl))\n}\n\n// relative luminance (WCAG 2.1)\nexport function luminance(rgb: Rgb): number {\n const srgb = [rgb.r, rgb.g, rgb.b].map((v) => {\n const s = v / 255\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * srgb[0] + 0.7152 * srgb[1] + 0.0722 * srgb[2]\n}\n\n// WCAG contrast ratio between two colors\nexport function contrastRatio(a: Rgb, b: Rgb): number {\n const la = luminance(a)\n const lb = luminance(b)\n const lighter = Math.max(la, lb)\n const darker = Math.min(la, lb)\n return (lighter + 0.05) / (darker + 0.05)\n}\n\n// interpolate between two hex colors (0=a, 1=b)\nexport function lerpColor(a: string, b: string, t: number): string {\n const ca = hexToRgb(a)\n const cb = hexToRgb(b)\n return rgbToHex({\n r: Math.round(ca.r + (cb.r - ca.r) * t),\n g: Math.round(ca.g + (cb.g - ca.g) * t),\n b: Math.round(ca.b + (cb.b - ca.b) * t),\n })\n}\n\n// manipulation: lighten\nexport function lighten(hex: string, amount: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({ ...hsl, l: Math.min(1, hsl.l + amount) })\n}\n\n// manipulation: darken\nexport function darken(hex: string, amount: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({ ...hsl, l: Math.max(0, hsl.l - amount) })\n}\n\n// manipulation: adjust saturation\nexport function saturate(hex: string, amount: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({ ...hsl, s: Math.min(1, Math.max(0, hsl.s + amount)) })\n}\n\n// manipulation: shift hue\nexport function hueShift(hex: string, degrees: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({ ...hsl, h: (hsl.h + degrees + 360) % 360 })\n}\n\n// manipulation: with alpha → rgba string\nexport function withAlpha(hex: string, alpha: number): string {\n const { r, g, b } = hexToRgb(hex)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n// complementary color (180° hue shift)\nexport function complement(hex: string): string {\n return hueShift(hex, 180)\n}\n\n// analogous colors (±30° hue shift)\nexport function analogous(hex: string): [string, string] {\n return [hueShift(hex, -30), hueShift(hex, 30)]\n}\n\n// triadic colors (120° apart)\nexport function triadic(hex: string): [string, string] {\n return [hueShift(hex, 120), hueShift(hex, 240)]\n}\n","// L0 — primary color health scoring\n// validates a candidate primary color against dark/light backgrounds\n// scores 0-100, with diagnostic feedback\n\nimport type { Rgb } from './color-math'\nimport { contrastRatio, hexToHsl, hexToRgb, hslToHex } from './color-math'\n\nexport type HealthLevel = 'rejected' | 'warning' | 'good' | 'excellent'\n\nexport type HealthDiagnostic = {\n id: string\n severity: 'error' | 'info' | 'warning'\n message: string\n suggestion: string\n}\n\nexport type HealthReport = {\n score: number // 0-100\n level: HealthLevel // rejected(<60) / warning(60-80) / good(80-90) / excellent(90+)\n diagnostics: HealthDiagnostic[]\n details: {\n contrastOnDark: number\n contrastOnLight: number\n contrastWhiteOnColor: number\n contrastBlackOnColor: number\n saturation: number\n lightness: number\n hue: number\n semanticConflict: string | null\n }\n}\n\n// fixed reference colors\nconst DARK_BG: Rgb = { r: 15, g: 23, b: 42 }\nconst LIGHT_BG: Rgb = { r: 255, g: 255, b: 255 }\nconst WHITE: Rgb = { r: 255, g: 255, b: 255 }\nconst BLACK: Rgb = { r: 0, g: 0, b: 0 }\n\n// semantic color hue ranges to check conflicts\nconst SEMANTIC_RANGES: { name: string; hueMin: number; hueMax: number }[] = [\n { name: 'danger (red)', hueMin: 340, hueMax: 360 },\n { name: 'danger (red)', hueMin: 0, hueMax: 20 },\n { name: 'warning (amber)', hueMin: 30, hueMax: 55 },\n { name: 'success (green)', hueMin: 100, hueMax: 150 },\n]\n\n// individual scoring checks — each returns penalty points\nfunction checkContrastOnDark(rgb: Rgb, d: HealthDiagnostic[]): number {\n const ratio = contrastRatio(rgb, DARK_BG)\n if (ratio < 2.5) {\n d.push({ id: 'contrast-dark-fail', severity: 'error', message: `contrast on dark background too low (${ratio.toFixed(1)}:1)`, suggestion: 'lighten the color or increase saturation' })\n return 30\n }\n if (ratio < 3.5) {\n d.push({ id: 'contrast-dark-low', severity: 'warning', message: `contrast on dark background is marginal (${ratio.toFixed(1)}:1)`, suggestion: 'consider a slightly lighter variant for better readability' })\n return 15\n }\n return 0\n}\n\nfunction checkContrastOnLight(rgb: Rgb, d: HealthDiagnostic[]): number {\n const ratio = contrastRatio(rgb, LIGHT_BG)\n if (ratio < 2.5) {\n d.push({ id: 'contrast-light-fail', severity: 'warning', message: `contrast on light background too low (${ratio.toFixed(1)}:1)`, suggestion: 'darken the color for light mode usage' })\n return 15\n }\n return 0\n}\n\nfunction checkTextOnColor(rgb: Rgb, d: HealthDiagnostic[]): number {\n const whiteC = contrastRatio(WHITE, rgb)\n const blackC = contrastRatio(BLACK, rgb)\n const best = Math.max(whiteC, blackC)\n if (best < 3) {\n d.push({ id: 'text-on-color-fail', severity: 'error', message: `neither white nor black text is readable on this color (best: ${best.toFixed(1)}:1)`, suggestion: 'adjust lightness — avoid the 40-60% lightness midrange' })\n return 20\n }\n if (best < 4.5) {\n d.push({ id: 'text-on-color-low', severity: 'warning', message: `text on this color has limited contrast (${best.toFixed(1)}:1)`, suggestion: 'push lightness below 40% or above 60% for clearer text' })\n return 8\n }\n return 0\n}\n\nfunction checkSaturation(s: number, d: HealthDiagnostic[]): number {\n if (s < 0.2) {\n d.push({ id: 'saturation-low', severity: 'warning', message: `saturation too low (${(s * 100).toFixed(0)}%) — color appears grayish`, suggestion: 'increase saturation above 30% for a vibrant primary' })\n return 15\n }\n if (s > 0.95) {\n d.push({ id: 'saturation-high', severity: 'info', message: `very high saturation (${(s * 100).toFixed(0)}%) — may cause eye strain`, suggestion: 'reduce to 70-90% for comfortable prolonged viewing' })\n return 5\n }\n return 0\n}\n\nfunction checkLightness(l: number, d: HealthDiagnostic[]): number {\n if (l < 0.15) {\n d.push({ id: 'lightness-too-dark', severity: 'error', message: `color is too dark (L=${(l * 100).toFixed(0)}%) — invisible on dark mode`, suggestion: 'increase lightness above 30%' })\n return 20\n }\n if (l > 0.85) {\n d.push({ id: 'lightness-too-light', severity: 'warning', message: `color is too light (L=${(l * 100).toFixed(0)}%) — weak on light mode`, suggestion: 'decrease lightness below 70%' })\n return 15\n }\n return 0\n}\n\nfunction checkSemanticConflict(h: number, s: number, d: HealthDiagnostic[]): string | null {\n if (s <= 0.4) return null\n for (const range of SEMANTIC_RANGES) {\n if (h >= range.hueMin && h <= range.hueMax) {\n d.push({ id: 'semantic-conflict', severity: 'warning', message: `hue (${h.toFixed(0)}°) overlaps with ${range.name} semantic color`, suggestion: 'users may confuse accent with status colors — shift hue away from red/amber/green zones' })\n return range.name\n }\n }\n return null\n}\n\nfunction levelFromScore(score: number): HealthLevel {\n if (score < 60) return 'rejected'\n if (score < 80) return 'warning'\n if (score < 90) return 'good'\n return 'excellent'\n}\n\nexport function scoreColor(hex: string): HealthReport {\n const rgb = hexToRgb(hex)\n const hsl = hexToHsl(hex)\n const diagnostics: HealthDiagnostic[] = []\n\n const penalty =\n checkContrastOnDark(rgb, diagnostics) +\n checkContrastOnLight(rgb, diagnostics) +\n checkTextOnColor(rgb, diagnostics) +\n checkSaturation(hsl.s, diagnostics) +\n checkLightness(hsl.l, diagnostics)\n\n const semanticConflict = checkSemanticConflict(hsl.h, hsl.s, diagnostics)\n const semanticPenalty = semanticConflict !== null ? 10 : 0\n\n const score = Math.max(0, Math.min(100, 100 - penalty - semanticPenalty))\n\n return {\n score,\n level: levelFromScore(score),\n diagnostics,\n details: {\n contrastOnDark: contrastRatio(rgb, DARK_BG),\n contrastOnLight: contrastRatio(rgb, LIGHT_BG),\n contrastWhiteOnColor: contrastRatio(WHITE, rgb),\n contrastBlackOnColor: contrastRatio(BLACK, rgb),\n saturation: hsl.s,\n lightness: hsl.l,\n hue: hsl.h,\n semanticConflict,\n },\n }\n}\n\n// determine best text color (white or black) for a given background\nexport function bestTextColor(bgHex: string): '#000000' | '#ffffff' {\n const rgb = hexToRgb(bgHex)\n const whiteContrast = contrastRatio(WHITE, rgb)\n const blackContrast = contrastRatio(BLACK, rgb)\n // prefer white if it passes minimum readability (3:1)\n if (whiteContrast >= 3) return '#ffffff'\n if (blackContrast >= 3) return '#000000'\n return whiteContrast > blackContrast ? '#ffffff' : '#000000'\n}\n\n// auto-fix: take any color → return the highest-scoring version\nexport function autoFixColor(hex: string): string {\n const hsl = hexToHsl(hex)\n let bestHex = hex\n let bestScore = scoreColor(hex).score\n\n const fixedS = Math.max(0.45, Math.min(0.85, hsl.s))\n\n for (let l = 0.40; l <= 0.70; l += 0.02) {\n let h = hsl.h\n\n // shift hue away from semantic conflict zones\n for (const range of SEMANTIC_RANGES) {\n if (h >= range.hueMin && h <= range.hueMax) {\n const distToMin = Math.abs(h - range.hueMin)\n const distToMax = Math.abs(h - range.hueMax)\n if (distToMin < distToMax) {\n h = range.hueMin - 10\n } else {\n h = range.hueMax + 10\n }\n h = (h + 360) % 360\n break\n }\n }\n\n const candidate = hslToHex({ h, s: fixedS, l })\n const candidateScore = scoreColor(candidate).score\n if (candidateScore > bestScore) {\n bestScore = candidateScore\n bestHex = candidate\n }\n }\n\n return bestHex\n}\n","// L0 — derive full color palette from a single primary color\n// two categories: fixed (never change) and derived f(pc)\n\nimport { bestTextColor } from './color-health'\nimport { darken, hexToHsl, hslToHex, hslToRgb, lighten, withAlpha } from './color-math'\n\n// fixed colors — these NEVER change regardless of primary color\n// they are semantic constants anchored to universal meaning\nexport const FIXED_COLORS = {\n // danger = red — universal stop/error/destructive\n danger: { dark: '#ef4444', light: '#dc2626' },\n // warning = amber — universal caution\n warning: { dark: '#f59e0b', light: '#d97706' },\n // success = green — universal positive/go\n success: { dark: '#22c55e', light: '#16a34a' },\n\n // status — organizational meaning, stable across themes\n statusActive: '#22c55e',\n statusInactive: '#94a3b8',\n statusPending: '#f59e0b',\n statusDraft: '#64748b',\n\n // priority — severity scale, stable\n priorityCritical: '#ef4444',\n priorityHigh: '#f97316',\n priorityMedium: '#f59e0b',\n priorityLow: '#22c55e',\n\n // action icons — create/update/delete, stable\n actionCreate: '#22c55e',\n actionUpdate: '#3b82f6',\n actionDelete: '#ef4444',\n\n // notification dot\n dot: '#ef4444',\n} as const\n\n// tint intensity — how much primaryColor bleeds into base surfaces\n// dark mode can take more chroma; light mode must be near-invisible\nconst TINT_S_DARK = 0.06 // 6% saturation on dark surfaces\nconst TINT_S_LIGHT = 0.03 // 3% saturation on light surfaces — barely there\n\n// derived color set — everything computed from primary color\nexport type DerivedPalette = {\n // accent family\n accent: string\n accentHover: string\n accentFg: string\n accentMuted: string // rgba(accent, 0.1) — for subtle backgrounds\n accentSubtle: string // rgba(accent, 0.05) — for hover tints\n\n // base surfaces — tinted by primaryColor hue, very restrained\n bg: string\n bgSecondary: string\n bgTertiary: string\n fg: string\n fgSecondary: string\n fgMuted: string\n border: string\n borderStrong: string\n surface: string\n surfaceRaised: string\n overlay: string\n\n // categorical palette\n palette: string[]\n}\n\n// derive full palette for dark mode\nexport function deriveDarkPalette(primaryHex: string): DerivedPalette {\n const hsl = hexToHsl(primaryHex)\n const h = hsl.h\n const ts = TINT_S_DARK // tint saturation\n\n // accent — tuned for dark bg: bright enough to see, dark enough for white text on top\n // L=0.45-0.55 ensures white text passes WCAG AA (≥4.5:1)\n const accent = hslToHex({ h, s: Math.max(0.55, Math.min(0.85, hsl.s)), l: Math.max(0.45, Math.min(0.55, hsl.l)) })\n const accentHover = lighten(accent, 0.1)\n const accentFg = bestTextColor(accent)\n const accentMuted = withAlpha(accent, 0.12)\n const accentSubtle = withAlpha(accent, 0.05)\n\n // base surfaces — dark with barely-perceptible hue from primaryColor\n // the tint is what makes a blue-primary app feel \"cool\" and a green-primary feel \"fresh\"\n // glass surfaces are semi-transparent over these — so the tint bleeds through the blur naturally\n const bg = hslToHex({ h, s: ts, l: 0.06 }) // near-black, micro tint\n const bgSecondary = hslToHex({ h, s: ts, l: 0.11 }) // card/sidebar bg\n const bgTertiary = hslToHex({ h, s: ts, l: 0.20 }) // hover/active states\n const surface = hslToHex({ h, s: ts, l: 0.11 }) // = bgSecondary (glass base)\n const surfaceRaised= hslToHex({ h, s: ts, l: 0.20 }) // elevated panels\n\n // fg — high contrast, same hue as bg but at 2-3% saturation\n // entire bg→fg scale shares one hue channel — cohesive under glass\n const fg = hslToHex({ h, s: 0.02, l: 0.95 }) // near-white, whisper of hue\n const fgSecondary = hslToHex({ h, s: 0.03, l: 0.82 }) // secondary text\n const fgMuted = hslToHex({ h, s: 0.04, l: 0.62 }) // muted/placeholder\n\n // borders — subtle, tinted\n const border = hslToHex({ h, s: ts, l: 0.20 })\n const borderStrong = hslToHex({ h, s: ts, l: 0.28 })\n\n const overlay = `rgba(${Math.round(hslToRgb({ h, s: ts, l: 0.04 }).r)}, ${Math.round(hslToRgb({ h, s: ts, l: 0.04 }).g)}, ${Math.round(hslToRgb({ h, s: ts, l: 0.04 }).b)}, 0.6)`\n\n return {\n accent, accentHover, accentFg, accentMuted, accentSubtle,\n bg, bgSecondary, bgTertiary, fg, fgSecondary, fgMuted,\n border, borderStrong, surface, surfaceRaised, overlay,\n palette: generatePalette(h, 'dark'),\n }\n}\n\n// derive full palette for light mode\nexport function deriveLightPalette(primaryHex: string): DerivedPalette {\n const hsl = hexToHsl(primaryHex)\n const h = hsl.h\n const ts = TINT_S_LIGHT // less tint — white shows chroma more obviously\n\n // accent — saturated enough to pop on white\n const accent = hslToHex({ h, s: Math.max(0.6, Math.min(0.9, hsl.s)), l: Math.max(0.42, Math.min(0.55, hsl.l)) })\n const accentHover = darken(accent, 0.06)\n const accentFg = bestTextColor(accent)\n const accentMuted = withAlpha(accent, 0.1)\n const accentSubtle = withAlpha(accent, 0.04)\n\n // base surfaces — white or near-white, micro tint on secondaries only\n // bg stays pure white — tint on white at any amount looks \"off\"\n // glass over white is beautiful because backdrop-filter picks up content behind\n const bg = '#ffffff'\n const bgSecondary = hslToHex({ h, s: ts, l: 0.97 }) // barely warm/cool\n const bgTertiary = hslToHex({ h, s: ts, l: 0.95 })\n const surface = '#ffffff'\n const surfaceRaised= '#ffffff'\n\n // fg — dark text, whisper of hue for cohesion\n const fg = hslToHex({ h, s: 0.02, l: 0.12 })\n const fgSecondary = hslToHex({ h, s: 0.03, l: 0.30 })\n const fgMuted = hslToHex({ h, s: 0.03, l: 0.42 })\n\n // borders\n const border = hslToHex({ h, s: ts, l: 0.90 })\n const borderStrong = hslToHex({ h, s: ts, l: 0.83 })\n\n const overlay = 'rgba(0, 0, 0, 0.5)'\n\n return {\n accent, accentHover, accentFg, accentMuted, accentSubtle,\n bg, bgSecondary, bgTertiary, fg, fgSecondary, fgMuted,\n border, borderStrong, surface, surfaceRaised, overlay,\n palette: generatePalette(h, 'light'),\n }\n}\n\n// generate 10-color categorical palette from a base hue\n// [0]=primary, [1..9]=evenly spaced hues with adjusted lightness\nfunction generatePalette(baseHue: number, mode: 'dark' | 'light'): string[] {\n // dark: bright enough to read on dark bg; light: saturated but not muddy\n const lightness = mode === 'dark' ? 0.65 : 0.55\n const saturation = mode === 'dark' ? 0.7 : 0.75\n\n // golden angle distribution — visually distinct hue spacing\n const hueOffsets = [0, 137.5, 275, 52.5, 190, 327.5, 95, 232.5, 10, 170]\n\n return hueOffsets.map((offset) =>\n hslToHex({\n h: (baseHue + offset) % 360,\n s: saturation,\n l: lightness,\n })\n )\n}\n\n// convert derived palette to CSS variable overrides — complete color system\nexport function paletteToVars(\n palette: DerivedPalette,\n mode: 'dark' | 'light',\n): Record<string, string> {\n const fc = FIXED_COLORS\n const isDark = mode === 'dark'\n\n const vars: Record<string, string> = {\n // base surfaces — tinted by primaryColor\n '--gds-bg': palette.bg,\n '--gds-bg-secondary': palette.bgSecondary,\n '--gds-bg-tertiary': palette.bgTertiary,\n '--gds-surface': palette.surface,\n '--gds-surface-raised': palette.surfaceRaised,\n\n // foreground\n '--gds-fg': palette.fg,\n '--gds-fg-secondary': palette.fgSecondary,\n '--gds-fg-muted': palette.fgMuted,\n\n // borders\n '--gds-border': palette.border,\n '--gds-border-strong': palette.borderStrong,\n\n // accent family — derived from primaryColor\n '--gds-accent': palette.accent,\n '--gds-accent-hover': palette.accentHover,\n '--gds-accent-fg': palette.accentFg,\n\n // overlay\n '--gds-overlay': palette.overlay,\n\n // fixed semantic colors — NEVER change per primaryColor\n '--gds-danger': isDark ? fc.danger.dark : fc.danger.light,\n '--gds-warning': isDark ? fc.warning.dark : fc.warning.light,\n '--gds-success': isDark ? fc.success.dark : fc.success.light,\n\n // fixed status\n '--gds-status-active': fc.statusActive,\n '--gds-status-inactive': fc.statusInactive,\n '--gds-status-pending': fc.statusPending,\n '--gds-status-draft': fc.statusDraft,\n\n // fixed priority\n '--gds-priority-critical': fc.priorityCritical,\n '--gds-priority-high': fc.priorityHigh,\n '--gds-priority-medium': fc.priorityMedium,\n '--gds-priority-low': fc.priorityLow,\n\n // fixed action\n '--gds-action-create': fc.actionCreate,\n '--gds-action-update': fc.actionUpdate,\n '--gds-action-delete': fc.actionDelete,\n\n // fixed dot\n '--gds-dot': fc.dot,\n }\n\n // categorical palette (10 colors)\n palette.palette.forEach((color, i) => {\n vars[`--gds-palette-${i}`] = color\n })\n\n return vars\n}\n","// L0 — sizing system\n// component heights, icon sizes, touch targets, spacing\n// all derived from a base unit, scaled by density axis\n\n// base unit = 4px, all sizes are multiples\nconst BASE = 4\n\n// spacing scale — matches tokens.css --gds-space-* vars\nexport const spacing = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 7: 32,\n 8: 40,\n 9: 48,\n 10: 64,\n} as const\n\nexport type SpaceScale = keyof typeof spacing\n\n// component height scale — used by Button, Input, Select, etc.\n// formula: base * multiplier\nexport const componentHeight = {\n xs: BASE * 6, // 24px — icon buttons, compact tags\n sm: BASE * 7, // 28px — compact inputs, small buttons\n default: BASE * 8, // 32px — standard inputs, buttons\n lg: BASE * 10, // 40px — comfortable inputs, large buttons\n xl: BASE * 12, // 48px — hero actions, mobile-friendly\n} as const\n\n// icon size scale — matched to component heights\nexport const iconSize = {\n xs: 12,\n sm: 14,\n default: 16,\n lg: 20,\n xl: 24,\n} as const\n\n// touch target minimums (mobile = 44px per Apple HIG)\nexport const touchTarget = {\n desktop: 32,\n mobile: 44,\n} as const\n\n// content width constraints\nexport const contentWidth = {\n input: { min: 120, max: 480 },\n dialog: { sm: 320, md: 384, lg: 480, xl: 600 },\n sheet: { sm: 280, md: 320, lg: 400 },\n dropdown: { min: 160, max: 320 },\n} as const\n\n// density → size mapping\n// density axis adjusts which height/spacing tier components use\nexport type SizeTier = 'xs' | 'sm' | 'default' | 'lg' | 'xl'\n\nexport const densitySizeMap: Record<string, {\n component: SizeTier\n icon: SizeTier\n gap: number\n pad: number\n text: number\n}> = {\n compact: {\n component: 'sm',\n icon: 'sm',\n gap: BASE * 1.5, // 6px\n pad: BASE * 2, // 8px\n text: 11,\n },\n default: {\n component: 'default',\n icon: 'default',\n gap: BASE * 3, // 12px\n pad: BASE * 4, // 16px\n text: 13,\n },\n comfortable: {\n component: 'lg',\n icon: 'lg',\n gap: BASE * 4, // 16px\n pad: BASE * 6, // 24px\n text: 14,\n },\n}\n\n// density-relative height scale\n// all tiers shift together when density changes\nconst densityHeightScale: Record<string, Record<string, number>> = {\n compact: { xs: 20, sm: 24, default: 28, lg: 32, xl: 36 },\n default: { xs: 24, sm: 28, default: 32, lg: 36, xl: 40 },\n comfortable: { xs: 28, sm: 32, default: 36, lg: 40, xl: 48 },\n}\n\n// density-relative icon scale\nconst densityIconScale: Record<string, Record<string, number>> = {\n compact: { xs: 10, sm: 12, default: 14, lg: 16 },\n default: { xs: 12, sm: 14, default: 16, lg: 20 },\n comfortable: { xs: 14, sm: 16, default: 20, lg: 24 },\n}\n\n// density-relative text scale\nconst densityTextScale: Record<string, Record<string, number>> = {\n compact: { caption: 9, label: 10, body: 11 },\n default: { caption: 10, label: 11, body: 13 },\n comfortable: { caption: 11, label: 12, body: 14 },\n}\n\n// density-relative gap scale\nconst densityGapScale: Record<string, Record<string, number>> = {\n compact: { xs: 2, sm: 4, default: 6, lg: 8 },\n default: { xs: 4, sm: 6, default: 8, lg: 12 },\n comfortable: { xs: 6, sm: 8, default: 12, lg: 16 },\n}\n\n// density-relative padding scale\nconst densityPadScale: Record<string, Record<string, { x: number, y: number }>> = {\n compact: { sm: { x: 4, y: 2 }, default: { x: 8, y: 4 }, lg: { x: 12, y: 6 } },\n default: { sm: { x: 8, y: 4 }, default: { x: 12, y: 6 }, lg: { x: 16, y: 8 } },\n comfortable: { sm: { x: 10, y: 6 }, default: { x: 16, y: 8 }, lg: { x: 20, y: 12 } },\n}\n\n// generate CSS vars for a density tier\nexport function sizeToCssVars(density: string): Record<string, string> {\n const d = density in densityHeightScale ? density : 'default'\n const tier = densitySizeMap[d] ?? densitySizeMap.default\n const h = densityHeightScale[d]\n const ic = densityIconScale[d]\n const tx = densityTextScale[d]\n const gp = densityGapScale[d]\n const pd = densityPadScale[d]\n\n return {\n // backward-compat aliases\n '--gds-component-height': `${componentHeight[tier.component]}px`,\n '--gds-icon-size': `${iconSize[tier.icon]}px`,\n '--gds-density-gap': `${tier.gap}px`,\n '--gds-density-pad': `${tier.pad}px`,\n '--gds-density-text': `${tier.text}px`,\n\n // density-relative height scale\n '--gds-h-xs': `${h.xs}px`,\n '--gds-h-sm': `${h.sm}px`,\n '--gds-h': `${h.default}px`,\n '--gds-h-lg': `${h.lg}px`,\n '--gds-h-xl': `${h.xl}px`,\n\n // density-relative icon scale\n '--gds-icon-xs': `${ic.xs}px`,\n '--gds-icon-sm': `${ic.sm}px`,\n '--gds-icon': `${ic.default}px`,\n '--gds-icon-lg': `${ic.lg}px`,\n\n // density-relative text scale\n '--gds-text-caption': `${tx.caption}px`,\n '--gds-text-label': `${tx.label}px`,\n '--gds-text-body': `${tx.body}px`,\n\n // density-relative gap scale\n '--gds-gap-xs': `${gp.xs}px`,\n '--gds-gap-sm': `${gp.sm}px`,\n '--gds-gap': `${gp.default}px`,\n '--gds-gap-lg': `${gp.lg}px`,\n\n // density-relative padding scale\n '--gds-pad-x-sm': `${pd.sm.x}px`,\n '--gds-pad-x': `${pd.default.x}px`,\n '--gds-pad-x-lg': `${pd.lg.x}px`,\n '--gds-pad-y-sm': `${pd.sm.y}px`,\n '--gds-pad-y': `${pd.default.y}px`,\n '--gds-pad-y-lg': `${pd.lg.y}px`,\n }\n}\n","// L0 — radius system\n// mathematical radius scale, shaped by the shape axis\n// formula: base_radius * shape_factor, with golden ratio progression\n\n// golden ratio progression: each step ≈ 1.5× the previous\n// seed: 4px → 6px → 8px → 12px (approximately 1.5× each)\nconst RADIUS_STEPS = [4, 6, 8, 12] as const\n\n// shape factor — multiplies the base scale\nconst SHAPE_FACTOR: Record<string, number> = {\n sharp: 0.5, // halves all radii → 2/3/4/6\n default: 1.0, // base → 4/6/8/12\n rounded: 2.0, // doubles → 8/12/16/24\n}\n\nexport function radiusScale(shape: string): {\n sm: number\n md: number\n lg: number\n xl: number\n full: number\n} {\n const factor = SHAPE_FACTOR[shape] ?? 1\n return {\n sm: Math.round(RADIUS_STEPS[0] * factor),\n md: Math.round(RADIUS_STEPS[1] * factor),\n lg: Math.round(RADIUS_STEPS[2] * factor),\n xl: Math.round(RADIUS_STEPS[3] * factor),\n full: 9999,\n }\n}\n\nexport function radiusToCssVars(shape: string): Record<string, string> {\n const scale = radiusScale(shape)\n return {\n // base scale\n '--gds-radius-sm': `${scale.sm}px`,\n '--gds-radius-md': `${scale.md}px`,\n '--gds-radius-lg': `${scale.lg}px`,\n '--gds-radius-xl': `${scale.xl}px`,\n '--gds-radius-full': `${scale.full}px`,\n\n // semantic aliases — components use these\n '--gds-radius-button': `${scale.md}px`,\n '--gds-radius-input': `${scale.md}px`,\n '--gds-radius-badge': `${scale.full}px`,\n '--gds-radius-card': `${scale.xl}px`,\n '--gds-radius-modal': `${scale.xl}px`,\n '--gds-radius-popover': `${scale.lg}px`,\n '--gds-radius-tooltip': `${scale.md}px`,\n }\n}\n","// L0 — shadow system\n// elevation-aware shadows with dark mode adaptation\n// formula: each tier doubles blur radius, increases spread\n\ntype ShadowTier = { blur: number, spread: number, yOffset: number, opacity: number }\n\n// base shadow parameters — each tier escalates geometrically\nconst SHADOW_TIERS: Record<string, ShadowTier[]> = {\n xs: [{ blur: 1, spread: 0, yOffset: 1, opacity: 0.03 }],\n sm: [{ blur: 2, spread: 0, yOffset: 1, opacity: 0.05 }],\n md: [\n { blur: 6, spread: -1, yOffset: 4, opacity: 0.1 },\n { blur: 4, spread: -2, yOffset: 2, opacity: 0.1 },\n ],\n lg: [\n { blur: 15, spread: -3, yOffset: 10, opacity: 0.1 },\n { blur: 6, spread: -4, yOffset: 4, opacity: 0.1 },\n ],\n xl: [\n { blur: 25, spread: -5, yOffset: 20, opacity: 0.1 },\n { blur: 10, spread: -6, yOffset: 8, opacity: 0.1 },\n ],\n}\n\n// elevation factor — scales opacity\nconst ELEVATION_FACTOR: Record<string, number> = {\n flat: 0, // no shadows at all\n subtle: 0.6, // reduced shadows\n raised: 1.0, // full shadows\n}\n\n// dark mode multiplier — darker mode needs stronger shadows\nconst MODE_FACTOR: Record<string, number> = {\n dark: 3.0,\n light: 1.0,\n}\n\nfunction tierToString(tier: ShadowTier, elevFactor: number, modeFactor: number): string {\n if (elevFactor === 0) return 'none'\n const opacity = Math.min(1, tier.opacity * elevFactor * modeFactor)\n return `0 ${tier.yOffset}px ${tier.blur}px ${tier.spread}px rgb(0 0 0 / ${opacity.toFixed(2)})`\n}\n\nexport function shadowValue(\n level: string,\n elevation: string,\n mode: string,\n): string {\n const tiers = SHADOW_TIERS[level]\n if (tiers === undefined) return 'none'\n const ef = ELEVATION_FACTOR[elevation] ?? 1\n if (ef === 0) return 'none'\n const mf = MODE_FACTOR[mode] ?? 1\n return tiers.map(t => tierToString(t, ef, mf)).join(', ')\n}\n\nexport function shadowToCssVars(elevation: string, mode: string): Record<string, string> {\n return {\n '--gds-shadow-xs': shadowValue('xs', elevation, mode),\n '--gds-shadow-sm': shadowValue('sm', elevation, mode),\n '--gds-shadow-md': shadowValue('md', elevation, mode),\n '--gds-shadow-lg': shadowValue('lg', elevation, mode),\n '--gds-shadow-xl': shadowValue('xl', elevation, mode),\n }\n}\n","// L0 — glass material system\n// blur intensity, saturation, background opacity\n// adapts to glass axis + dark/light mode + capability detection\n\nexport type GlassLevel = 'off' | 'subtle' | 'full'\n\n// glass parameters — mathematically related\n// blur: geometric progression (0 → 4/12/24 → 8/20/40)\n// saturation: 100% base + boost (0 → +50/+60/+80 → +50/+80/+100)\n// bg-opacity: inverse of blur (more blur → less solid bg needed)\ntype GlassParams = {\n blurSm: number\n blurMd: number\n blurLg: number\n saturateSm: number\n saturateMd: number\n saturateLg: number\n bgOpacity: number\n}\n\nconst GLASS_LEVELS: Record<GlassLevel, GlassParams> = {\n off: {\n blurSm: 0, blurMd: 0, blurLg: 0,\n saturateSm: 100, saturateMd: 100, saturateLg: 100,\n bgOpacity: 0.95, // almost solid — glass is disabled\n },\n subtle: {\n blurSm: 4, blurMd: 12, blurLg: 24,\n saturateSm: 130, saturateMd: 150, saturateLg: 160,\n bgOpacity: 0.25,\n },\n full: {\n blurSm: 8, blurMd: 20, blurLg: 40,\n saturateSm: 150, saturateMd: 180, saturateLg: 200,\n bgOpacity: 0.15,\n },\n}\n\n// dark mode reduces bg opacity further (more translucent)\n// light mode increases it (needs more solid for readability)\nconst MODE_BG_ADJUST: Record<string, number> = {\n dark: -0.05,\n light: +0.1,\n}\n\nexport function glassParams(level: GlassLevel, mode: string): GlassParams {\n const base = GLASS_LEVELS[level]\n const adjust = MODE_BG_ADJUST[mode] ?? 0\n return {\n ...base,\n bgOpacity: Math.min(0.95, Math.max(0.05, base.bgOpacity + adjust)),\n }\n}\n\nexport function glassToCssVars(level: GlassLevel, mode: string): Record<string, string> {\n const p = glassParams(level, mode)\n return {\n '--gds-glass-blur-sm': `${p.blurSm}px`,\n '--gds-glass-blur-md': `${p.blurMd}px`,\n '--gds-glass-blur-lg': `${p.blurLg}px`,\n '--gds-glass-saturate-sm': `${p.saturateSm}%`,\n '--gds-glass-saturate-md': `${p.saturateMd}%`,\n '--gds-glass-saturate-lg': `${p.saturateLg}%`,\n '--gds-glass-bg-opacity': `${p.bgOpacity}`,\n }\n}\n\n// capability detection — check if backdrop-filter is supported\nexport function supportsBackdropFilter(): boolean {\n if (typeof CSS === 'undefined') return false\n return CSS.supports('backdrop-filter', 'blur(1px)')\n || CSS.supports('-webkit-backdrop-filter', 'blur(1px)')\n}\n","// L0 — motion system\n// duration scale, easing presets, spring configs\n// adapts to motion axis (off/reduced/full)\n\nexport type MotionLevel = 'full' | 'off' | 'reduced'\n\n// duration scale — geometric progression from a base\n// base=100ms, each tier ≈ 2× (100 → 200 → 300 → 500)\nconst DURATION_BASE = 100\n\nconst DURATION_MULTIPLIERS = {\n fast: 1, // 100ms — hover, micro-feedback\n normal: 2, // 200ms — panel expand, tab switch\n slow: 3, // 300ms — modal, page transition\n slower: 5, // 500ms — complex orchestration\n} as const\n\n// motion level factor — scales all durations\nconst LEVEL_FACTOR: Record<MotionLevel, number> = {\n off: 0, // instant — 0ms everything\n reduced: 0.5, // halved — still perceptible but quick\n full: 1.0, // standard\n}\n\nexport function duration(tier: keyof typeof DURATION_MULTIPLIERS, level: MotionLevel): number {\n return Math.round(DURATION_BASE * DURATION_MULTIPLIERS[tier] * LEVEL_FACTOR[level])\n}\n\n// easing presets — CSS cubic-bezier\nexport const easing = {\n default: 'cubic-bezier(0.4, 0, 0.2, 1)', // material standard\n in: 'cubic-bezier(0.4, 0, 1, 1)', // accelerate\n out: 'cubic-bezier(0, 0, 0.2, 1)', // decelerate\n inOut: 'cubic-bezier(0.4, 0, 0.2, 1)', // symmetric\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // overshoot bounce\n bounce: 'cubic-bezier(0.68, -0.55, 0.27, 1.55)', // elastic\n} as const\n\n// spring physics presets — tension / friction pairs\n// formula: force = (target - current) × tension - velocity × friction\nexport const springPresets = {\n default: { tension: 170, friction: 26 }, // balanced, general purpose\n gentle: { tension: 120, friction: 14 }, // slow, floaty\n bouncy: { tension: 300, friction: 10 }, // snappy with overshoot\n stiff: { tension: 400, friction: 28 }, // fast, no overshoot\n slow: { tension: 100, friction: 20 }, // deliberate, heavy\n} as const\n\nexport type SpringPresetId = keyof typeof springPresets\n\n// keyframe presets — named animation patterns\nexport const keyframePresets = {\n fadeIn: { from: { opacity: 0 }, to: { opacity: 1 } },\n fadeOut: { from: { opacity: 1 }, to: { opacity: 0 } },\n scaleIn: { from: { opacity: 0, transform: 'scale(0.95)' }, to: { opacity: 1, transform: 'scale(1)' } },\n scaleOut: { from: { opacity: 1, transform: 'scale(1)' }, to: { opacity: 0, transform: 'scale(0.95)' } },\n slideUp: { from: { opacity: 0, transform: 'translateY(8px)' }, to: { opacity: 1, transform: 'translateY(0)' } },\n slideDown: { from: { opacity: 0, transform: 'translateY(-8px)' }, to: { opacity: 1, transform: 'translateY(0)' } },\n slideLeft: { from: { opacity: 0, transform: 'translateX(8px)' }, to: { opacity: 1, transform: 'translateX(0)' } },\n slideRight: { from: { opacity: 0, transform: 'translateX(-8px)' }, to: { opacity: 1, transform: 'translateX(0)' } },\n} as const\n\nexport type KeyframePresetId = keyof typeof keyframePresets\n\nexport function motionToCssVars(level: MotionLevel): Record<string, string> {\n return {\n '--gds-duration-fast': `${duration('fast', level)}ms`,\n '--gds-duration-normal': `${duration('normal', level)}ms`,\n '--gds-duration-slow': `${duration('slow', level)}ms`,\n '--gds-duration-slower': `${duration('slower', level)}ms`,\n '--gds-ease-default': easing.default,\n '--gds-ease-in': easing.in,\n '--gds-ease-out': easing.out,\n '--gds-ease-spring': easing.spring,\n }\n}\n","// L0 — font system\n// 3 stacks × font presets for every use case\n// supports CJK 4-language (en, zh, ja, ko) mixed typesetting\n\n// === 3 font stacks, each irreplaceable ===\nexport const fontStack = {\n // proportional body text: headings, paragraphs, CJK mixed content\n sans: [\n 'Inter',\n '\"Noto Sans SC\"', // chinese simplified\n '\"Noto Sans JP\"', // japanese\n '\"Noto Sans KR\"', // korean\n 'system-ui',\n '-apple-system',\n 'sans-serif',\n ].join(', '),\n\n // code and terminal: always monospaced, coding ligatures, slashed zero\n mono: [\n '\"JetBrains Mono\"',\n '\"Noto Sans Mono\"',\n 'ui-monospace',\n 'Consolas',\n 'monospace',\n ].join(', '),\n\n // UI equal-width without code aesthetic: Roboto Flex with variable MONO axis\n // MONO=0 → proportional (like sans), MONO=1 → equal-width (like mono, but sans-serif style)\n // use for: table headers, dashboard numbers, badges, aligned labels\n flex: [\n '\"Roboto Flex\"',\n 'system-ui',\n 'sans-serif',\n ].join(', '),\n} as const\n\n// Roboto Flex MONO axis: 0 = proportional, 1 = monospaced\n// use via font-variation-settings: 'MONO' <value>\nexport const flexMono = {\n proportional: \"'MONO' 0\",\n half: \"'MONO' 0.5\",\n full: \"'MONO' 1\",\n} as const\n\n// === font weights ===\nexport const fontWeight = {\n light: 300, // placeholder, secondary caption, fine print\n regular: 400, // body text, default\n medium: 500, // labels, buttons, emphasis\n semibold: 600, // headings, table headers, strong labels\n bold: 700, // primary headings, hero text\n} as const\n\nexport type FontWeightKey = keyof typeof fontWeight\n\n// === OpenType features ===\nexport const fontFeature = {\n tabular: \"'tnum' 1\", // fixed-width digits (tables, prices)\n slashedZero: \"'zero' 1\", // distinguish 0 from O\n tabularSlashed: \"'tnum' 1, 'zero' 1\", // both — finance, code-like data\n proportional: \"'pnum' 1\", // proportional digits (body text)\n ligatures: \"'liga' 1, 'calt' 1\", // code ligatures (!=, =>, ->)\n cjkPunct: \"'halt' 1\", // CJK punctuation half-width\n} as const\n\n// === font presets — complete recipe for each use case ===\n// preset = stack + weight + size + leading + tracking + features\nexport type FontPreset = {\n family: 'flex' | 'mono' | 'sans'\n weight: number\n size: string\n leading: number\n tracking: string\n features: string\n italic?: boolean\n variation?: string // font-variation-settings (for Roboto Flex MONO axis)\n}\n\nexport const fontPreset: Record<string, FontPreset> = {\n // headings — sans, proportional\n h1: { family: 'sans', weight: 700, size: '1.5rem', leading: 1.2, tracking: '-0.025em', features: '' },\n h2: { family: 'sans', weight: 600, size: '1.25rem', leading: 1.25, tracking: '-0.02em', features: '' },\n h3: { family: 'sans', weight: 600, size: '1.125rem', leading: 1.3, tracking: '-0.015em', features: '' },\n h4: { family: 'sans', weight: 600, size: '1rem', leading: 1.35, tracking: '-0.01em', features: '' },\n h5: { family: 'sans', weight: 600, size: '0.875rem', leading: 1.4, tracking: '0', features: '' },\n h6: { family: 'sans', weight: 600, size: '0.75rem', leading: 1.4, tracking: '0.01em', features: '' },\n\n // body text — sans, proportional, relaxed reading\n body: { family: 'sans', weight: 400, size: '0.875rem', leading: 1.6, tracking: '0', features: '' },\n bodySmall:{ family: 'sans', weight: 400, size: '0.8125rem', leading: 1.5, tracking: '0', features: '' },\n\n // ui elements — flex with MONO=1 for equal-width alignment\n label: { family: 'flex', weight: 500, size: '0.75rem', leading: 1.4, tracking: '0.01em', features: '', variation: flexMono.full },\n caption: { family: 'sans', weight: 400, size: '0.6875rem', leading: 1.4, tracking: '0.01em', features: '' },\n badge: { family: 'flex', weight: 600, size: '0.625rem', leading: 1, tracking: '0.03em', features: '', variation: flexMono.full },\n button: { family: 'sans', weight: 500, size: '0.8125rem', leading: 1, tracking: '0.01em', features: '' },\n\n // code / terminal — mono, always equal-width, code aesthetic\n code: { family: 'mono', weight: 400, size: '0.8125rem', leading: 1.6, tracking: '0', features: fontFeature.ligatures },\n codeSmall:{ family: 'mono', weight: 400, size: '0.6875rem', leading: 1.5, tracking: '0', features: fontFeature.ligatures },\n\n // finance / tabular data — flex with MONO for column alignment\n finance: { family: 'flex', weight: 400, size: '0.875rem', leading: 1.4, tracking: '0', features: '', variation: flexMono.full },\n price: { family: 'flex', weight: 600, size: '1rem', leading: 1, tracking: '-0.01em', features: '', variation: flexMono.full },\n tableNum: { family: 'flex', weight: 400, size: '0.75rem', leading: 1.4, tracking: '0', features: '', variation: flexMono.full },\n tableHead:{ family: 'flex', weight: 500, size: '0.6875rem', leading: 1.4, tracking: '0.02em', features: '', variation: flexMono.full },\n\n // japanese fullwidth context\n jpFull: { family: 'sans', weight: 400, size: '0.875rem', leading: 1.8, tracking: '0.05em', features: fontFeature.cjkPunct },\n} as const\n\nexport type FontPresetKey = keyof typeof fontPreset\n\n// semantic symbol constants — used inline in text\n// ensures consistency across all components (everyone uses the same ✓)\nexport const symbols = {\n // status indicators\n check: '\\u2713', // ✓\n cross: '\\u2715', // ✕\n dot: '\\u25CF', // ●\n ring: '\\u25CB', // ○\n triangle: '\\u25B2', // ▲\n triangleDown: '\\u25BC', // ▼\n diamond: '\\u25C6', // ◆\n square: '\\u25A0', // ■\n\n // arrows\n arrowUp: '\\u2191', // ↑\n arrowDown: '\\u2193', // ↓\n arrowLeft: '\\u2190', // ←\n arrowRight: '\\u2192', // →\n arrowUpDown: '\\u2195', // ↕\n\n // keyboard\n command: '\\u2318', // ⌘\n shift: '\\u21E7', // ⇧\n option: '\\u2325', // ⌥\n control: '\\u2303', // ⌃\n enter: '\\u23CE', // ⏎\n tab: '\\u21E5', // ⇥\n escape: '\\u238B', // ⎋\n backspace: '\\u232B', // ⌫\n delete: '\\u2326', // ⌦\n space: '\\u2423', // ␣\n\n // punctuation / typography\n ellipsis: '\\u2026', // …\n bullet: '\\u2022', // •\n dash: '\\u2014', // —\n ndash: '\\u2013', // –\n middot: '\\u00B7', // ·\n times: '\\u00D7', // ×\n minus: '\\u2212', // − (true minus, not hyphen)\n plus: '+',\n} as const\n\nexport type SymbolKey = keyof typeof symbols\n\n// CSS variable output for font tokens\nexport function fontToCssVars(): Record<string, string> {\n return {\n '--gds-font-sans': fontStack.sans,\n '--gds-font-mono': fontStack.mono,\n '--gds-font-flex': fontStack.flex,\n '--gds-font-light': `${fontWeight.light}`,\n '--gds-font-regular': `${fontWeight.regular}`,\n '--gds-font-medium': `${fontWeight.medium}`,\n '--gds-font-semibold': `${fontWeight.semibold}`,\n '--gds-font-bold': `${fontWeight.bold}`,\n }\n}\n\n// helper: convert a preset to inline CSS style object\nexport function presetToStyle(key: FontPresetKey): React.CSSProperties {\n const p = fontPreset[key]\n return {\n fontFamily: `var(--gds-font-${p.family})`,\n fontWeight: p.weight,\n fontSize: p.size,\n lineHeight: p.leading,\n letterSpacing: p.tracking,\n ...(p.features ? { fontFeatureSettings: p.features } : {}),\n ...(p.variation ? { fontVariationSettings: p.variation } : {}),\n ...(p.italic ? { fontStyle: 'italic' } : {}),\n }\n}\n","// L0 — generate complete CSS variable set from system functions\n// single source of truth: all dynamic tokens computed here\n// used by: L1 theme (runtime injection), SSR fallback, snapshot tests\n\nimport { deriveDarkPalette, deriveLightPalette, paletteToVars } from './color-derive'\nimport { fontToCssVars } from './font-system'\nimport { glassToCssVars } from './glass-system'\nimport { motionToCssVars } from './motion-system'\nimport { radiusToCssVars } from './radius-system'\nimport { shadowToCssVars } from './shadow-system'\nimport { sizeToCssVars } from './size-system'\n\n// default primary color (blue-500)\nconst DEFAULT_PRIMARY = '#3b82f6'\n\n// generate all dynamic CSS variables for a given mode\n// uses default axis values: shape=default, density=default, elevation=raised, glass=full, motion=full\nexport function generateDefaultCssVars(mode: 'dark' | 'light'): Record<string, string> {\n const palette = mode === 'dark'\n ? deriveDarkPalette(DEFAULT_PRIMARY)\n : deriveLightPalette(DEFAULT_PRIMARY)\n\n return {\n // color (from primaryColor derivation)\n ...paletteToVars(palette, mode),\n // font stacks + weights\n ...fontToCssVars(),\n // radius (shape=default)\n ...radiusToCssVars('default'),\n // size (density=default)\n ...sizeToCssVars('default'),\n // shadow (elevation=raised, mode-aware)\n ...shadowToCssVars('raised', mode),\n // glass (level=full, mode-aware)\n ...glassToCssVars('full', mode),\n // motion (level=full)\n ...motionToCssVars('full'),\n }\n}\n\n// apply CSS variables to a DOM element (usually document.documentElement)\nexport function applyDefaultCssVars(\n element: HTMLElement,\n mode: 'dark' | 'light',\n): void {\n const vars = generateDefaultCssVars(mode)\n for (const [key, val] of Object.entries(vars)) {\n element.style.setProperty(key, val)\n }\n}\n\nexport { DEFAULT_PRIMARY }\n","// L0 — theme axis types + unified resolve\n// axis types are the public API, system functions do the math\n// no hardcoded values here — all delegated to *-system.ts modules\n\nimport { glassToCssVars } from './glass-system'\nimport { motionToCssVars } from './motion-system'\nimport { radiusToCssVars } from './radius-system'\nimport { shadowToCssVars } from './shadow-system'\nimport { sizeToCssVars } from './size-system'\n\n// constrained axis types — the only valid selections\nexport type ThemeShape = 'default' | 'rounded' | 'sharp'\nexport type ThemeDensity = 'comfortable' | 'compact' | 'default'\nexport type ThemeElevation = 'flat' | 'raised' | 'subtle'\nexport type ThemeGlass = 'full' | 'off' | 'subtle'\nexport type ThemeMotion = 'full' | 'off' | 'reduced'\n\n// re-export spring presets from motion system (backward compat)\nexport type { KeyframePresetId, SpringPresetId } from './motion-system'\nexport { easing, springPresets } from './motion-system'\n\n// resolve a complete set of axis selections → flat CSS vars\n// this is the single function L1 theme calls\nexport function resolveAxesToCssVars(\n shape: ThemeShape,\n density: ThemeDensity,\n elevation: ThemeElevation,\n glass: ThemeGlass,\n motion: ThemeMotion,\n mode: 'dark' | 'light',\n): Record<string, string> {\n return {\n ...radiusToCssVars(shape),\n ...sizeToCssVars(density),\n ...shadowToCssVars(elevation, mode),\n ...glassToCssVars(glass, mode),\n ...motionToCssVars(motion),\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { r as e } from "./glass-CQTlX7IO.js";
2
+ import { r as t } from "./button-avu-rQU4.js";
3
+ import { forwardRef as n } from "react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/l2-primitives/aspect-ratio.tsx
6
+ var a = n(function({ children: t, className: n, ratio: i = 16 / 9, style: a, ...o }, s) {
7
+ return /* @__PURE__ */ r("div", {
8
+ className: e("relative w-full overflow-hidden", n),
9
+ "data-component": "aspect-ratio",
10
+ ref: s,
11
+ style: {
12
+ ...a,
13
+ aspectRatio: i
14
+ },
15
+ ...o,
16
+ children: t
17
+ });
18
+ }), o = t("border-border", {
19
+ defaultVariants: { variant: "solid" },
20
+ variants: { variant: {
21
+ dashed: "border-dashed",
22
+ dotted: "border-dotted",
23
+ solid: "border-solid"
24
+ } }
25
+ }), s = n(function({ className: t, label: n, orientation: a = "horizontal", variant: s = "solid", ...c }, l) {
26
+ return a === "vertical" ? /* @__PURE__ */ r("div", {
27
+ "aria-orientation": "vertical",
28
+ className: e("inline-block h-full border-l", o({ variant: s }), t),
29
+ "data-component": "separator",
30
+ ref: l,
31
+ role: "separator",
32
+ ...c
33
+ }) : n === void 0 ? s === "solid" ? /* @__PURE__ */ r("div", {
34
+ className: e("h-px w-full shrink-0 bg-border", t),
35
+ "data-component": "separator",
36
+ ref: l,
37
+ role: "separator",
38
+ ...c
39
+ }) : /* @__PURE__ */ r("div", {
40
+ "aria-orientation": "horizontal",
41
+ className: e("border-t", o({ variant: s }), t),
42
+ "data-component": "separator",
43
+ ref: l,
44
+ role: "separator",
45
+ ...c
46
+ }) : /* @__PURE__ */ i("div", {
47
+ className: e("flex items-center gds-gap select-none", t),
48
+ "data-component": "separator",
49
+ ref: l,
50
+ role: "separator",
51
+ ...c,
52
+ children: [
53
+ /* @__PURE__ */ r("div", { className: e("flex-1 border-t", o({ variant: s })) }),
54
+ /* @__PURE__ */ r("span", {
55
+ className: "shrink-0 gds-text-caption font-semibold tracking-widest text-fg-muted/40 uppercase",
56
+ children: n
57
+ }),
58
+ /* @__PURE__ */ r("div", { className: e("flex-1 border-t", o({ variant: s })) })
59
+ ]
60
+ });
61
+ });
62
+ //#endregion
63
+ export { o as n, a as r, s as t };
64
+
65
+ //# sourceMappingURL=separator-Dqs23A9D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"separator-Dqs23A9D.js","names":[],"sources":["../src/l2-primitives/aspect-ratio.tsx","../src/l2-primitives/separator.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AspectRatioProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n ratio?: number\n}\n\nexport const AspectRatio = forwardRef<HTMLDivElement, AspectRatioProps>(\n function AspectRatio({ children, className, ratio = 16 / 9, style, ...props }, ref) {\n return (\n <div\n className={cx('relative w-full overflow-hidden', className)}\n data-component=\"aspect-ratio\"\n ref={ref}\n style={{ ...style, aspectRatio: ratio }}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type { AspectRatioProps }\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 separatorVariants = cva('border-border', {\n defaultVariants: { variant: 'solid' },\n variants: {\n variant: {\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n solid: 'border-solid',\n },\n },\n})\n\ntype SeparatorProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof separatorVariants> & {\n label?: string\n orientation?: 'horizontal' | 'vertical'\n }\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n function Separator(\n { className, label, orientation = 'horizontal', variant = 'solid', ...props },\n ref,\n ) {\n if (orientation === 'vertical') {\n return (\n <div\n aria-orientation=\"vertical\"\n className={cx(\n 'inline-block h-full border-l',\n separatorVariants({ variant }),\n className,\n )}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n }\n\n if (label !== undefined) {\n return (\n <div\n className={cx('flex items-center gds-gap select-none', className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n >\n <div className={cx('flex-1 border-t', separatorVariants({ variant }))} />\n <span className=\"shrink-0 gds-text-caption font-semibold tracking-widest text-fg-muted/40 uppercase\">\n {label}\n </span>\n <div className={cx('flex-1 border-t', separatorVariants({ variant }))} />\n </div>\n )\n }\n\n if (variant === 'solid') {\n return (\n <div\n className={cx('h-px w-full shrink-0 bg-border', className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n }\n\n return (\n <div\n aria-orientation=\"horizontal\"\n className={cx('border-t', separatorVariants({ variant }), className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n },\n)\n\nexport { separatorVariants }\nexport type { SeparatorProps }\n"],"mappings":";;;;;AAUA,IAAa,IAAc,EACzB,SAAqB,EAAE,aAAU,cAAW,WAAQ,KAAK,GAAG,UAAO,GAAG,KAAS,GAAK;AAClF,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,mCAAmC,EAAU;EAC3D,kBAAe;EACV;EACL,OAAO;GAAE,GAAG;GAAO,aAAa;GAAO;EACvC,GAAI;EAEH;EACG,CAAA;EAGX,EClBK,IAAoB,EAAI,iBAAiB;CAC7C,iBAAiB,EAAE,SAAS,SAAS;CACrC,UAAU,EACR,SAAS;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACR,EACF;CACF,CAAC,EAQW,IAAY,EACvB,SACE,EAAE,cAAW,UAAO,iBAAc,cAAc,aAAU,SAAS,GAAG,KACtE,GACA;AAgDA,QA/CI,MAAgB,aAEhB,kBAAC,OAAD;EACE,oBAAiB;EACjB,WAAW,EACT,gCACA,EAAkB,EAAE,YAAS,CAAC,EAC9B,EACD;EACD,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GAIF,MAAU,KAAA,IAkBV,MAAY,UAEZ,kBAAC,OAAD;EACE,WAAW,EAAG,kCAAkC,EAAU;EAC1D,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GAKJ,kBAAC,OAAD;EACE,oBAAiB;EACjB,WAAW,EAAG,YAAY,EAAkB,EAAE,YAAS,CAAC,EAAE,EAAU;EACpE,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GApCA,kBAAC,OAAD;EACE,WAAW,EAAG,yCAAyC,EAAU;EACjE,kBAAe;EACV;EACL,MAAK;EACL,GAAI;YALN;GAOE,kBAAC,OAAD,EAAK,WAAW,EAAG,mBAAmB,EAAkB,EAAE,YAAS,CAAC,CAAC,EAAI,CAAA;GACzE,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GACP,kBAAC,OAAD,EAAK,WAAW,EAAG,mBAAmB,EAAkB,EAAE,YAAS,CAAC,CAAC,EAAI,CAAA;GACrE;;EA2Bb"}
@@ -0,0 +1,43 @@
1
+ import { r as e } from "./glass-CQTlX7IO.js";
2
+ import { forwardRef as t } from "react";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ //#region src/l2-primitives/skeleton.tsx
5
+ var r = {
6
+ backgroundImage: "linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.06) 40%, rgba(255,255,255,0.06) 60%, transparent 100%)",
7
+ backgroundSize: "200% 100%",
8
+ animation: "gds-shimmer 1.5s ease-in-out infinite"
9
+ }, i = {
10
+ text: "h-4 w-full rounded",
11
+ circle: "h-10 w-10 rounded-full",
12
+ rect: "h-20 w-full rounded-md"
13
+ }, a = t(function({ className: t, height: a, lines: o = 1, variant: s = "text", width: c }, l) {
14
+ let u = {};
15
+ c !== void 0 && (u.width = typeof c == "number" ? `${c}px` : c), a !== void 0 && (u.height = typeof a == "number" ? `${a}px` : a);
16
+ let d = e("bg-bg-tertiary", i[s]);
17
+ return s === "text" && o > 1 ? /* @__PURE__ */ n("div", {
18
+ ref: l,
19
+ className: e("flex flex-col gap-2", t),
20
+ "data-component": "skeleton",
21
+ "data-variant": s,
22
+ children: Array.from({ length: o }, (t, i) => /* @__PURE__ */ n("div", {
23
+ className: e(d, i === o - 1 && "w-3/4"),
24
+ style: {
25
+ ...u,
26
+ ...r
27
+ }
28
+ }, i))
29
+ }) : /* @__PURE__ */ n("div", {
30
+ ref: l,
31
+ className: e(d, t),
32
+ "data-component": "skeleton",
33
+ "data-variant": s,
34
+ style: {
35
+ ...u,
36
+ ...r
37
+ }
38
+ });
39
+ });
40
+ //#endregion
41
+ export { a as t };
42
+
43
+ //# sourceMappingURL=skeleton-C9FFZSYN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-C9FFZSYN.js","names":[],"sources":["../src/l2-primitives/skeleton.tsx"],"sourcesContent":["// skeleton — loading placeholder with shimmer animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SkeletonVariant = 'circle' | 'rect' | 'text'\n\ntype SkeletonProps = {\n className?: string\n height?: number | string\n lines?: number\n variant?: SkeletonVariant\n width?: number | string\n}\n\nconst shimmerStyle: React.CSSProperties = {\n backgroundImage:\n 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.06) 40%, rgba(255,255,255,0.06) 60%, transparent 100%)',\n backgroundSize: '200% 100%',\n animation: 'gds-shimmer 1.5s ease-in-out infinite',\n}\n\nconst variantDefaults: Record<SkeletonVariant, string> = {\n text: 'h-4 w-full rounded',\n circle: 'h-10 w-10 rounded-full',\n rect: 'h-20 w-full rounded-md',\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n function Skeleton({ className, height, lines = 1, variant = 'text', width }, ref) {\n const sizeStyle: React.CSSProperties = {}\n if (width !== undefined) sizeStyle.width = typeof width === 'number' ? `${width}px` : width\n if (height !== undefined) sizeStyle.height = typeof height === 'number' ? `${height}px` : height\n\n const baseClass = cx('bg-bg-tertiary', variantDefaults[variant])\n\n if (variant === 'text' && lines > 1) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-2', className)}\n data-component=\"skeleton\"\n data-variant={variant}\n >\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cx(baseClass, i === lines - 1 && 'w-3/4')}\n style={{ ...sizeStyle, ...shimmerStyle }}\n />\n ))}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(baseClass, className)}\n data-component=\"skeleton\"\n data-variant={variant}\n style={{ ...sizeStyle, ...shimmerStyle }}\n />\n )\n },\n)\n\nexport type { SkeletonProps, SkeletonVariant }\n"],"mappings":";;;;AAeA,IAAM,IAAoC;CACxC,iBACE;CACF,gBAAgB;CAChB,WAAW;CACZ,EAEK,IAAmD;CACvD,MAAM;CACN,QAAQ;CACR,MAAM;CACP,EAEY,IAAW,EACtB,SAAkB,EAAE,cAAW,WAAQ,WAAQ,GAAG,aAAU,QAAQ,YAAS,GAAK;CAChF,IAAM,IAAiC,EAAE;AAEzC,CADI,MAAU,KAAA,MAAW,EAAU,QAAQ,OAAO,KAAU,WAAW,GAAG,EAAM,MAAM,IAClF,MAAW,KAAA,MAAW,EAAU,SAAS,OAAO,KAAW,WAAW,GAAG,EAAO,MAAM;CAE1F,IAAM,IAAY,EAAG,kBAAkB,EAAgB,GAAS;AAqBhE,QAnBI,MAAY,UAAU,IAAQ,IAE9B,kBAAC,OAAD;EACO;EACL,WAAW,EAAG,uBAAuB,EAAU;EAC/C,kBAAe;EACf,gBAAc;YAEb,MAAM,KAAK,EAAE,QAAQ,GAAO,GAAG,GAAG,MACjC,kBAAC,OAAD;GAEE,WAAW,EAAG,GAAW,MAAM,IAAQ,KAAK,QAAQ;GACpD,OAAO;IAAE,GAAG;IAAW,GAAG;IAAc;GACxC,EAHK,EAGL,CACF;EACE,CAAA,GAKR,kBAAC,OAAD;EACO;EACL,WAAW,EAAG,GAAW,EAAU;EACnC,kBAAe;EACf,gBAAc;EACd,OAAO;GAAE,GAAG;GAAW,GAAG;GAAc;EACxC,CAAA;EAGP"}
@@ -0,0 +1,101 @@
1
+ import { r as e, t } from "./glass-CQTlX7IO.js";
2
+ import { r as n } from "./button-avu-rQU4.js";
3
+ import { r } from "./motion-DUPegem-.js";
4
+ import { forwardRef as i } from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ //#region src/l2-primitives/input.tsx
7
+ var s = n("w-full gds-radius-input border bg-bg text-fg transition-colors placeholder:text-fg-muted/50 outline-none disabled:cursor-not-allowed disabled:opacity-50 " + r, {
8
+ compoundVariants: [{
9
+ error: !0,
10
+ className: "focus-visible:ring-danger"
11
+ }],
12
+ defaultVariants: {
13
+ error: !1,
14
+ inputSize: "default"
15
+ },
16
+ variants: {
17
+ error: {
18
+ false: "border-border hover:border-border-strong",
19
+ true: "border-danger"
20
+ },
21
+ inputSize: {
22
+ default: "gds-h gds-text-body",
23
+ sm: "gds-h-sm gds-text-label"
24
+ }
25
+ }
26
+ }), c = i(function({ className: n, error: r, glass: i, icon: c, inputSize: l, rightIcon: u, ...d }, f) {
27
+ let p = c !== void 0, m = u !== void 0;
28
+ return !p && !m ? /* @__PURE__ */ a("input", {
29
+ className: e(s({
30
+ error: r,
31
+ inputSize: l
32
+ }), "gds-pad-x", t(i), i === !0 && "border-white/10 bg-bg/60", n),
33
+ "data-component": "input",
34
+ ref: f,
35
+ ...d
36
+ }) : /* @__PURE__ */ o("div", {
37
+ className: "relative",
38
+ "data-component": "input",
39
+ children: [
40
+ p && /* @__PURE__ */ a("span", {
41
+ className: "absolute top-1/2 left-2.5 -translate-y-1/2 text-fg-muted/50 gds-icon-child-sm",
42
+ children: c
43
+ }),
44
+ /* @__PURE__ */ a("input", {
45
+ className: e(s({
46
+ error: r,
47
+ inputSize: l
48
+ }), p ? "pl-8" : "gds-pad-x", m ? "pr-8" : "gds-pad-x", t(i), i === !0 && "border-white/10 bg-bg/60", n),
49
+ ref: f,
50
+ ...d
51
+ }),
52
+ m && /* @__PURE__ */ a("span", {
53
+ className: "absolute top-1/2 right-2.5 -translate-y-1/2 text-fg-muted/50 gds-icon-child-sm",
54
+ children: u
55
+ })
56
+ ]
57
+ });
58
+ }), l = i(function({ children: t, className: n, required: r = !1, ...i }, s) {
59
+ return /* @__PURE__ */ o("label", {
60
+ className: e("block select-none gds-text-body font-medium text-fg", n),
61
+ "data-component": "label",
62
+ ref: s,
63
+ ...i,
64
+ children: [t, r && /* @__PURE__ */ a("span", {
65
+ className: "ml-0.5 text-danger",
66
+ children: "*"
67
+ })]
68
+ });
69
+ }), u = n("animate-spin text-accent", {
70
+ defaultVariants: { size: "default" },
71
+ variants: { size: {
72
+ default: "gds-icon",
73
+ lg: "gds-icon-lg",
74
+ sm: "gds-icon-sm"
75
+ } }
76
+ }), d = i(function({ className: t, size: n }, r) {
77
+ return /* @__PURE__ */ o("svg", {
78
+ className: e(u({ size: n }), t),
79
+ "data-component": "spinner",
80
+ fill: "none",
81
+ ref: r,
82
+ role: "status",
83
+ viewBox: "0 0 24 24",
84
+ children: [/* @__PURE__ */ a("circle", {
85
+ className: "opacity-25",
86
+ cx: "12",
87
+ cy: "12",
88
+ r: "10",
89
+ stroke: "currentColor",
90
+ strokeWidth: "4"
91
+ }), /* @__PURE__ */ a("path", {
92
+ className: "opacity-75",
93
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z",
94
+ fill: "currentColor"
95
+ })]
96
+ });
97
+ });
98
+ //#endregion
99
+ export { s as a, c as i, u as n, l as r, d as t };
100
+
101
+ //# sourceMappingURL=spinner-D8Ti-TFe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-D8Ti-TFe.js","names":[],"sources":["../src/l2-primitives/input.tsx","../src/l2-primitives/label.tsx","../src/l2-primitives/spinner.tsx"],"sourcesContent":["import { 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 { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst inputVariants = cva(\n 'w-full gds-radius-input border bg-bg text-fg transition-colors placeholder:text-fg-muted/50 outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n focusCls,\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n variants: {\n error: {\n false: 'border-border hover:border-border-strong',\n true: 'border-danger',\n },\n inputSize: {\n default: 'gds-h gds-text-body',\n sm: 'gds-h-sm gds-text-label',\n },\n },\n },\n)\n\ntype InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> &\n VariantProps<typeof inputVariants> & {\n glass?: boolean\n icon?: ReactNode\n rightIcon?: ReactNode\n }\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n function Input(\n { className, error, glass, icon, inputSize, rightIcon, ...props },\n ref,\n ) {\n const hasLeft = icon !== undefined\n const hasRight = rightIcon !== undefined\n\n if (!hasLeft && !hasRight) {\n return (\n <input\n className={cx(\n inputVariants({ error, inputSize }),\n 'gds-pad-x',\n glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n className,\n )}\n data-component=\"input\"\n ref={ref}\n {...props}\n />\n )\n }\n\n return (\n <div className=\"relative\" data-component=\"input\">\n {hasLeft && (\n <span className=\"absolute top-1/2 left-2.5 -translate-y-1/2 text-fg-muted/50 gds-icon-child-sm\">\n {icon}\n </span>\n )}\n <input\n className={cx(\n inputVariants({ error, inputSize }),\n hasLeft ? 'pl-8' : 'gds-pad-x',\n hasRight ? 'pr-8' : 'gds-pad-x',\n glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n className,\n )}\n ref={ref}\n {...props}\n />\n {hasRight && (\n <span className=\"absolute top-1/2 right-2.5 -translate-y-1/2 text-fg-muted/50 gds-icon-child-sm\">\n {rightIcon}\n </span>\n )}\n </div>\n )\n },\n)\n\nexport { inputVariants }\nexport type { InputProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LabelProps = React.LabelHTMLAttributes<HTMLLabelElement> & {\n required?: boolean\n}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n function Label({ children, className, required = false, ...props }, ref) {\n return (\n <label\n className={cx('block select-none gds-text-body font-medium text-fg', className)}\n data-component=\"label\"\n ref={ref}\n {...props}\n >\n {children}\n {required && <span className=\"ml-0.5 text-danger\">*</span>}\n </label>\n )\n },\n)\n\nexport type { LabelProps }\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 spinnerVariants = cva('animate-spin text-accent', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'gds-icon',\n lg: 'gds-icon-lg',\n sm: 'gds-icon-sm',\n },\n },\n})\n\ntype SpinnerProps = VariantProps<typeof spinnerVariants> & {\n className?: string\n}\n\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(\n function Spinner({ className, size }, ref) {\n return (\n <svg\n className={cx(spinnerVariants({ size }), className)}\n data-component=\"spinner\"\n fill=\"none\"\n ref={ref}\n role=\"status\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n }\n)\n\nexport { spinnerVariants }\nexport type { SpinnerProps }\n"],"mappings":";;;;;;AASA,IAAM,IAAgB,EACpB,8JACE,GACF;CACE,kBAAkB,CAChB;EACE,OAAO;EACP,WAAW;EACZ,CACF;CACD,iBAAiB;EACf,OAAO;EACP,WAAW;EACZ;CACD,UAAU;EACR,OAAO;GACL,OAAO;GACP,MAAM;GACP;EACD,WAAW;GACT,SAAS;GACT,IAAI;GACL;EACF;CACF,CACF,EASY,IAAQ,EACnB,SACE,EAAE,cAAW,UAAO,UAAO,SAAM,cAAW,cAAW,GAAG,KAC1D,GACA;CACA,IAAM,IAAU,MAAS,KAAA,GACnB,IAAW,MAAc,KAAA;AAmB/B,QAjBI,CAAC,KAAW,CAAC,IAEb,kBAAC,SAAD;EACE,WAAW,EACT,EAAc;GAAE;GAAO;GAAW,CAAC,EACnC,aACA,EAAW,EAAM,EACjB,MAAU,MAAQ,4BAClB,EACD;EACD,kBAAe;EACV;EACL,GAAI;EACJ,CAAA,GAKJ,kBAAC,OAAD;EAAK,WAAU;EAAW,kBAAe;YAAzC;GACG,KACC,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GAET,kBAAC,SAAD;IACE,WAAW,EACT,EAAc;KAAE;KAAO;KAAW,CAAC,EACnC,IAAU,SAAS,aACnB,IAAW,SAAS,aACpB,EAAW,EAAM,EACjB,MAAU,MAAQ,4BAClB,EACD;IACI;IACL,GAAI;IACJ,CAAA;GACD,KACC,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GAEL;;EAGX,ECvFY,IAAQ,EACnB,SAAe,EAAE,aAAU,cAAW,cAAW,IAAO,GAAG,KAAS,GAAK;AACvE,QACE,kBAAC,SAAD;EACE,WAAW,EAAG,uDAAuD,EAAU;EAC/E,kBAAe;EACV;EACL,GAAI;YAJN,CAMG,GACA,KAAY,kBAAC,QAAD;GAAM,WAAU;aAAqB;GAAQ,CAAA,CACpD;;EAGb,EChBK,IAAkB,EAAI,4BAA4B;CACtD,iBAAiB,EAAE,MAAM,WAAW;CACpC,UAAU,EACR,MAAM;EACJ,SAAS;EACT,IAAI;EACJ,IAAI;EACL,EACF;CACF,CAAC,EAMW,IAAU,EACrB,SAAiB,EAAE,cAAW,WAAQ,GAAK;AACzC,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,EAAgB,EAAE,SAAM,CAAC,EAAE,EAAU;EACnD,kBAAe;EACf,MAAK;EACA;EACL,MAAK;EACL,SAAQ;YANV,CAQE,kBAAC,UAAD;GACE,WAAU;GACV,IAAG;GACH,IAAG;GACH,GAAE;GACF,QAAO;GACP,aAAY;GACZ,CAAA,EACF,kBAAC,QAAD;GACE,WAAU;GACV,GAAE;GACF,MAAK;GACL,CAAA,CACE;;EAGX"}
@@ -0,0 +1,140 @@
1
+ import { r as e } from "./glass-CQTlX7IO.js";
2
+ import { r as t } from "./motion-DUPegem-.js";
3
+ import { createContext as n, forwardRef as r, useContext as i, useState as a } from "react";
4
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
+ //#region src/l4-molecules/accordion.tsx
6
+ var c = n({
7
+ expanded: [],
8
+ toggle: () => {}
9
+ });
10
+ function l({ children: t, type: n = "single", defaultExpanded: r = [], className: i }) {
11
+ let [s, l] = a(r), u = (e) => {
12
+ l((t) => t.includes(e) ? t.filter((t) => t !== e) : n === "single" ? [e] : [...t, e]);
13
+ };
14
+ return /* @__PURE__ */ o("div", {
15
+ className: e("divide-y divide-border", i),
16
+ "data-component": "accordion",
17
+ children: /* @__PURE__ */ o(c.Provider, {
18
+ value: {
19
+ expanded: s,
20
+ toggle: u
21
+ },
22
+ children: t
23
+ })
24
+ });
25
+ }
26
+ function u({ id: n, title: r, children: a, disabled: l, className: u }) {
27
+ let { expanded: d, toggle: f } = i(c), p = d.includes(n);
28
+ return /* @__PURE__ */ s("div", {
29
+ className: e(u),
30
+ "data-state": p ? "open" : "closed",
31
+ children: [/* @__PURE__ */ s("button", {
32
+ type: "button",
33
+ disabled: l,
34
+ onClick: () => f(n),
35
+ className: e("flex w-full items-center justify-between gds-pad-y-lg text-left text-sm font-medium text-fg transition-colors", t, l === !0 && "pointer-events-none opacity-40"),
36
+ "aria-expanded": p,
37
+ children: [/* @__PURE__ */ o("span", { children: r }), /* @__PURE__ */ o("svg", {
38
+ width: "14",
39
+ height: "14",
40
+ viewBox: "0 0 14 14",
41
+ fill: "none",
42
+ stroke: "currentColor",
43
+ strokeWidth: "2",
44
+ strokeLinecap: "round",
45
+ className: e("shrink-0 transition-transform duration-200", p && "rotate-180"),
46
+ children: /* @__PURE__ */ o("path", { d: "M3.5 5.5l3.5 3 3.5-3" })
47
+ })]
48
+ }), p && /* @__PURE__ */ o("div", {
49
+ className: "pb-3 gds-text-body text-fg-muted",
50
+ children: a
51
+ })]
52
+ });
53
+ }
54
+ //#endregion
55
+ //#region src/l4-molecules/progress-steps.tsx
56
+ var d = r(function({ className: t, current: n, steps: r }, i) {
57
+ return /* @__PURE__ */ o("div", {
58
+ ref: i,
59
+ className: e("flex items-center", t),
60
+ "data-component": "progress-steps",
61
+ role: "list",
62
+ children: r.map((t, i) => {
63
+ let a = i < n, c = i === n;
64
+ return /* @__PURE__ */ s("div", {
65
+ className: "flex flex-1 items-center",
66
+ role: "listitem",
67
+ children: [/* @__PURE__ */ s("div", {
68
+ className: "flex flex-col items-center gap-1",
69
+ children: [/* @__PURE__ */ o("div", {
70
+ className: e("flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium", a && "bg-accent text-accent-fg", c && "border-2 border-accent bg-accent/10 text-accent", !a && !c && "border border-border bg-bg-secondary text-fg-muted"),
71
+ children: a ? /* @__PURE__ */ o("svg", {
72
+ className: "h-3.5 w-3.5",
73
+ fill: "none",
74
+ viewBox: "0 0 24 24",
75
+ stroke: "currentColor",
76
+ strokeWidth: 3,
77
+ children: /* @__PURE__ */ o("path", {
78
+ strokeLinecap: "round",
79
+ strokeLinejoin: "round",
80
+ d: "M5 13l4 4L19 7"
81
+ })
82
+ }) : i + 1
83
+ }), /* @__PURE__ */ o("span", {
84
+ className: e("text-center gds-text-caption", c ? "font-medium text-fg" : "text-fg-muted"),
85
+ children: t
86
+ })]
87
+ }), i < r.length - 1 && /* @__PURE__ */ o("div", { className: e("mx-2 h-px flex-1", a ? "bg-accent" : "bg-border") })]
88
+ }, i);
89
+ })
90
+ });
91
+ }), f = /* @__PURE__ */ o("svg", {
92
+ width: "14",
93
+ height: "14",
94
+ viewBox: "0 0 14 14",
95
+ fill: "none",
96
+ stroke: "currentColor",
97
+ strokeWidth: "2",
98
+ strokeLinecap: "round",
99
+ strokeLinejoin: "round",
100
+ children: /* @__PURE__ */ o("path", { d: "M3 7.5l3 3 5-6" })
101
+ }), p = r(function({ steps: t, current: n, orientation: r = "horizontal", className: i, ...a }, c) {
102
+ let l = r === "horizontal";
103
+ return /* @__PURE__ */ o("div", {
104
+ ref: c,
105
+ className: e("flex", l ? "items-start" : "flex-col", i),
106
+ "data-component": "stepper",
107
+ role: "list",
108
+ ...a,
109
+ children: t.map((r, i) => {
110
+ let a = i < n, c = i === n;
111
+ return /* @__PURE__ */ s("div", {
112
+ className: e("flex", l ? "flex-1 items-center" : "items-start"),
113
+ role: "listitem",
114
+ children: [/* @__PURE__ */ s("div", {
115
+ className: e("flex", l ? "flex-col items-center" : "items-start gds-gap"),
116
+ children: [/* @__PURE__ */ o("div", {
117
+ className: "flex items-center",
118
+ children: /* @__PURE__ */ o("div", {
119
+ className: e("flex gds-sq-sm shrink-0 items-center justify-center gds-radius-badge gds-text-body font-medium transition-colors", a && "bg-accent text-accent-fg", c && "border-2 border-accent bg-transparent text-accent ring-2 ring-accent/20", !a && !c && "bg-bg-tertiary text-fg-muted"),
120
+ children: a ? f : i + 1
121
+ })
122
+ }), /* @__PURE__ */ s("div", {
123
+ className: e(l ? "mt-2 text-center" : ""),
124
+ children: [/* @__PURE__ */ o("p", {
125
+ className: e("gds-text-body font-medium", c ? "text-fg" : "text-fg-muted"),
126
+ children: r.label
127
+ }), r.description !== void 0 && /* @__PURE__ */ o("p", {
128
+ className: "mt-0.5 gds-text-caption text-fg-muted",
129
+ children: r.description
130
+ })]
131
+ })]
132
+ }), i < t.length - 1 && (l ? /* @__PURE__ */ o("div", { className: e("mx-2 mt-3.5 h-px flex-1", a ? "bg-accent" : "bg-border") }) : /* @__PURE__ */ o("div", { className: e("ml-3.5 mt-1 mb-1 w-px", "min-h-6", a ? "bg-accent" : "bg-border") }))]
133
+ }, i);
134
+ })
135
+ });
136
+ });
137
+ //#endregion
138
+ export { u as i, d as n, l as r, p as t };
139
+
140
+ //# sourceMappingURL=stepper-DhpGORX8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-DhpGORX8.js","names":[],"sources":["../src/l4-molecules/accordion.tsx","../src/l4-molecules/progress-steps.tsx","../src/l4-molecules/stepper.tsx"],"sourcesContent":["// accordion — expandable sections with single/multiple mode\nimport type { ReactNode } from 'react'\nimport { createContext, useContext, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype AccordionType = 'multiple' | 'single'\n\ntype AccordionContextValue = {\n expanded: string[]\n toggle: (id: string) => void\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({\n expanded: [],\n toggle: () => {},\n})\n\nexport type AccordionProps = {\n children: ReactNode\n type?: AccordionType\n defaultExpanded?: string[]\n className?: string\n}\n\nexport function Accordion({ children, type = 'single', defaultExpanded = [], className }: AccordionProps) {\n const [expanded, setExpanded] = useState<string[]>(defaultExpanded)\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const isOpen = prev.includes(id)\n if (isOpen) return prev.filter((x) => x !== id)\n if (type === 'single') return [id]\n return [...prev, id]\n })\n }\n\n return (\n <div className={cx('divide-y divide-border', className)} data-component=\"accordion\">\n <AccordionContext.Provider value={{ expanded, toggle }}>\n {children}\n </AccordionContext.Provider>\n </div>\n )\n}\n\nexport type AccordionItemProps = {\n id: string\n title: string\n children: ReactNode\n disabled?: boolean\n className?: string\n}\n\nexport function AccordionItem({ id, title, children, disabled, className }: AccordionItemProps) {\n const { expanded, toggle } = useContext(AccordionContext)\n const isOpen = expanded.includes(id)\n\n return (\n <div className={cx(className)} data-state={isOpen ? 'open' : 'closed'}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => toggle(id)}\n className={cx(\n 'flex w-full items-center justify-between gds-pad-y-lg text-left text-sm font-medium text-fg transition-colors',\n focusCls,\n disabled === true && 'pointer-events-none opacity-40',\n )}\n aria-expanded={isOpen}\n >\n <span>{title}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={cx('shrink-0 transition-transform duration-200', isOpen && 'rotate-180')}\n >\n <path d=\"M3.5 5.5l3.5 3 3.5-3\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"pb-3 gds-text-body text-fg-muted\">{children}</div>\n )}\n </div>\n )\n}\n","// progress-steps — linear progress indicator with labeled steps\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ProgressStepsProps = {\n className?: string\n current: number\n steps: string[]\n}\n\nexport const ProgressSteps = forwardRef<HTMLDivElement, ProgressStepsProps>(\n function ProgressSteps({ className, current, steps }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex items-center', className)}\n data-component=\"progress-steps\"\n role=\"list\"\n >\n {steps.map((label, i) => {\n const isCompleted = i < current\n const isCurrent = i === current\n\n return (\n <div key={i} className=\"flex flex-1 items-center\" role=\"listitem\">\n <div className=\"flex flex-col items-center gap-1\">\n <div\n className={cx(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium',\n isCompleted && 'bg-accent text-accent-fg',\n isCurrent && 'border-2 border-accent bg-accent/10 text-accent',\n !isCompleted && !isCurrent && 'border border-border bg-bg-secondary text-fg-muted',\n )}\n >\n {isCompleted ? (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span className={cx(\n 'text-center gds-text-caption',\n isCurrent ? 'font-medium text-fg' : 'text-fg-muted',\n )}>\n {label}\n </span>\n </div>\n {i < steps.length - 1 && (\n <div className={cx(\n 'mx-2 h-px flex-1',\n isCompleted ? 'bg-accent' : 'bg-border',\n )} />\n )}\n </div>\n )\n })}\n </div>\n )\n },\n)\n\nexport type { ProgressStepsProps }\n","// stepper — multi-step progress indicator with connecting lines\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StepDef = {\n label: string\n description?: string\n}\n\nexport type StepperProps = React.HTMLAttributes<HTMLDivElement> & {\n steps: StepDef[]\n current: number\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst checkSvg = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n)\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n function Stepper({ steps, current, orientation = 'horizontal', className, ...props }, ref) {\n const isHoriz = orientation === 'horizontal'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex',\n isHoriz ? 'items-start' : 'flex-col',\n className,\n )}\n data-component=\"stepper\"\n role=\"list\"\n {...props}\n >\n {steps.map((step, i) => {\n const completed = i < current\n const active = i === current\n\n return (\n <div\n key={i}\n className={cx(\n 'flex',\n isHoriz ? 'flex-1 items-center' : 'items-start',\n )}\n role=\"listitem\"\n >\n <div className={cx('flex', isHoriz ? 'flex-col items-center' : 'items-start gds-gap')}>\n <div className=\"flex items-center\">\n {/* step circle */}\n <div\n className={cx(\n 'flex gds-sq-sm shrink-0 items-center justify-center gds-radius-badge gds-text-body font-medium transition-colors',\n completed && 'bg-accent text-accent-fg',\n active && 'border-2 border-accent bg-transparent text-accent ring-2 ring-accent/20',\n !completed && !active && 'bg-bg-tertiary text-fg-muted',\n )}\n >\n {completed ? checkSvg : i + 1}\n </div>\n </div>\n {/* label + description */}\n <div className={cx(isHoriz ? 'mt-2 text-center' : '')}>\n <p className={cx('gds-text-body font-medium', active ? 'text-fg' : 'text-fg-muted')}>{step.label}</p>\n {step.description !== undefined && (\n <p className=\"mt-0.5 gds-text-caption text-fg-muted\">{step.description}</p>\n )}\n </div>\n </div>\n\n {/* connecting line */}\n {i < steps.length - 1 && (\n isHoriz ? (\n <div className={cx(\n 'mx-2 mt-3.5 h-px flex-1',\n completed ? 'bg-accent' : 'bg-border',\n )} />\n ) : (\n <div className={cx(\n 'ml-3.5 mt-1 mb-1 w-px',\n 'min-h-6',\n completed ? 'bg-accent' : 'bg-border',\n )} />\n )\n )}\n </div>\n )\n })}\n </div>\n )\n },\n)\n"],"mappings":"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"}