@goliapkg/gds 2.0.0 → 2.0.1

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 (554) hide show
  1. package/dist/{avatar-l3SaMCmU.js → avatar-Ct8OOGx6.js} +5 -5
  2. package/dist/avatar-Ct8OOGx6.js.map +1 -0
  3. package/dist/{badge-DTJq6AXr.js → badge-BCvi5RVF.js} +4 -4
  4. package/dist/badge-BCvi5RVF.js.map +1 -0
  5. package/dist/{button-avu-rQU4.js → button-BD3VHhwq.js} +2 -2
  6. package/dist/button-BD3VHhwq.js.map +1 -0
  7. package/dist/fonts.css +77 -11
  8. package/dist/gesture-I79dlTuS.js.map +1 -1
  9. package/dist/highlight-BAGZc-4h.js.map +1 -1
  10. package/dist/hooks-BE-_EmDI.js.map +1 -1
  11. package/dist/{icon-button-YatlVZnz.js → icon-button-Bns79124.js} +3 -3
  12. package/dist/icon-button-Bns79124.js.map +1 -0
  13. package/dist/index.d.ts +3 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +21 -21
  16. package/dist/l0-tokens/color-derive.d.ts.map +1 -1
  17. package/dist/l0-tokens/color-health.d.ts.map +1 -1
  18. package/dist/l0-tokens/color-math.d.ts.map +1 -1
  19. package/dist/l0-tokens/deps.d.ts.map +1 -1
  20. package/dist/l0-tokens/font-system.d.ts.map +1 -1
  21. package/dist/l0-tokens/generate-defaults.d.ts.map +1 -1
  22. package/dist/l0-tokens/glass-system.d.ts.map +1 -1
  23. package/dist/l0-tokens/index.d.ts +12 -12
  24. package/dist/l0-tokens/index.d.ts.map +1 -1
  25. package/dist/l0-tokens/motion-system.d.ts.map +1 -1
  26. package/dist/l0-tokens/shadow-system.d.ts.map +1 -1
  27. package/dist/l0-tokens/size-system.d.ts.map +1 -1
  28. package/dist/l0-tokens-DZkyVlac.js.map +1 -1
  29. package/dist/l1-systems/index.d.ts +2 -2
  30. package/dist/l1-systems/index.d.ts.map +1 -1
  31. package/dist/l1-systems/index.js +9 -9
  32. package/dist/l1-systems/theme.d.ts +2 -2
  33. package/dist/l1-systems/theme.d.ts.map +1 -1
  34. package/dist/l1-systems/use-theme.d.ts.map +1 -1
  35. package/dist/l2-primitives/aspect-ratio.d.ts.map +1 -1
  36. package/dist/l2-primitives/badge-dot.d.ts.map +1 -1
  37. package/dist/l2-primitives/badge.d.ts.map +1 -1
  38. package/dist/l2-primitives/button.d.ts.map +1 -1
  39. package/dist/l2-primitives/divider.d.ts.map +1 -1
  40. package/dist/l2-primitives/dot.d.ts.map +1 -1
  41. package/dist/l2-primitives/focus-ring.d.ts.map +1 -1
  42. package/dist/l2-primitives/glow-effect.d.ts.map +1 -1
  43. package/dist/l2-primitives/gradient-border.d.ts.map +1 -1
  44. package/dist/l2-primitives/highlight.d.ts.map +1 -1
  45. package/dist/l2-primitives/index.js +8 -8
  46. package/dist/l2-primitives/input.d.ts.map +1 -1
  47. package/dist/l2-primitives/kbd.d.ts.map +1 -1
  48. package/dist/l2-primitives/label.d.ts.map +1 -1
  49. package/dist/l2-primitives/loading.d.ts.map +1 -1
  50. package/dist/l2-primitives/number-input.d.ts.map +1 -1
  51. package/dist/l2-primitives/number-stepper.d.ts.map +1 -1
  52. package/dist/l2-primitives/progress.d.ts.map +1 -1
  53. package/dist/l2-primitives/scroll-area.d.ts.map +1 -1
  54. package/dist/l2-primitives/separator.d.ts.map +1 -1
  55. package/dist/l2-primitives/shimmer.d.ts.map +1 -1
  56. package/dist/l2-primitives/skeleton.d.ts.map +1 -1
  57. package/dist/l2-primitives/slider.d.ts.map +1 -1
  58. package/dist/l2-primitives/spinner.d.ts.map +1 -1
  59. package/dist/l2-primitives/truncate.d.ts.map +1 -1
  60. package/dist/l2-primitives/visually-hidden.d.ts.map +1 -1
  61. package/dist/{l2-primitives-DdQHMJRE.js → l2-primitives-Cn0KNxbB.js} +31 -31
  62. package/dist/l2-primitives-Cn0KNxbB.js.map +1 -0
  63. package/dist/l3-atoms/animated-border.d.ts +1 -1
  64. package/dist/l3-atoms/animated-border.d.ts.map +1 -1
  65. package/dist/l3-atoms/animated-counter.d.ts.map +1 -1
  66. package/dist/l3-atoms/animated-number.d.ts.map +1 -1
  67. package/dist/l3-atoms/avatar-badge.d.ts.map +1 -1
  68. package/dist/l3-atoms/avatar.d.ts.map +1 -1
  69. package/dist/l3-atoms/barcode.d.ts.map +1 -1
  70. package/dist/l3-atoms/blinking.d.ts.map +1 -1
  71. package/dist/l3-atoms/bounce-dot.d.ts.map +1 -1
  72. package/dist/l3-atoms/checkbox-group.d.ts.map +1 -1
  73. package/dist/l3-atoms/checkbox.d.ts.map +1 -1
  74. package/dist/l3-atoms/chip.d.ts.map +1 -1
  75. package/dist/l3-atoms/color-swatch.d.ts.map +1 -1
  76. package/dist/l3-atoms/copy-button.d.ts.map +1 -1
  77. package/dist/l3-atoms/count-badge.d.ts.map +1 -1
  78. package/dist/l3-atoms/count-up.d.ts.map +1 -1
  79. package/dist/l3-atoms/countdown-badge.d.ts.map +1 -1
  80. package/dist/l3-atoms/countdown.d.ts.map +1 -1
  81. package/dist/l3-atoms/cursor-follow.d.ts.map +1 -1
  82. package/dist/l3-atoms/diff-indicator.d.ts.map +1 -1
  83. package/dist/l3-atoms/glow-dot.d.ts.map +1 -1
  84. package/dist/l3-atoms/gradient-text.d.ts.map +1 -1
  85. package/dist/l3-atoms/heat-cell.d.ts.map +1 -1
  86. package/dist/l3-atoms/hotkey.d.ts.map +1 -1
  87. package/dist/l3-atoms/index.d.ts +4 -4
  88. package/dist/l3-atoms/index.d.ts.map +1 -1
  89. package/dist/l3-atoms/index.js +5 -5
  90. package/dist/l3-atoms/info-tip.d.ts.map +1 -1
  91. package/dist/l3-atoms/key-value.d.ts.map +1 -1
  92. package/dist/l3-atoms/keyboard-shortcut.d.ts.map +1 -1
  93. package/dist/l3-atoms/live-dot.d.ts.map +1 -1
  94. package/dist/l3-atoms/loading-dots.d.ts.map +1 -1
  95. package/dist/l3-atoms/magnetic-button.d.ts.map +1 -1
  96. package/dist/l3-atoms/marquee.d.ts.map +1 -1
  97. package/dist/l3-atoms/meter.d.ts.map +1 -1
  98. package/dist/l3-atoms/number-flow.d.ts.map +1 -1
  99. package/dist/l3-atoms/online-indicator.d.ts.map +1 -1
  100. package/dist/l3-atoms/orbit.d.ts +1 -1
  101. package/dist/l3-atoms/orbit.d.ts.map +1 -1
  102. package/dist/l3-atoms/percentage-circle.d.ts.map +1 -1
  103. package/dist/l3-atoms/percentage.d.ts.map +1 -1
  104. package/dist/l3-atoms/price.d.ts.map +1 -1
  105. package/dist/l3-atoms/progress-circle.d.ts.map +1 -1
  106. package/dist/l3-atoms/progress-ring.d.ts.map +1 -1
  107. package/dist/l3-atoms/pulse-indicator.d.ts.map +1 -1
  108. package/dist/l3-atoms/pulse-ring.d.ts.map +1 -1
  109. package/dist/l3-atoms/qr-code.d.ts.map +1 -1
  110. package/dist/l3-atoms/quick-action.d.ts.map +1 -1
  111. package/dist/l3-atoms/radio-group.d.ts.map +1 -1
  112. package/dist/l3-atoms/range-slider.d.ts.map +1 -1
  113. package/dist/l3-atoms/rating.d.ts.map +1 -1
  114. package/dist/l3-atoms/ribbon-banner.d.ts.map +1 -1
  115. package/dist/l3-atoms/ribbon.d.ts.map +1 -1
  116. package/dist/l3-atoms/ripple-effect.d.ts.map +1 -1
  117. package/dist/l3-atoms/scroll-to-top.d.ts.map +1 -1
  118. package/dist/l3-atoms/segmented-control.d.ts +1 -1
  119. package/dist/l3-atoms/segmented-control.d.ts.map +1 -1
  120. package/dist/l3-atoms/shortcut-display.d.ts.map +1 -1
  121. package/dist/l3-atoms/skeleton-group.d.ts.map +1 -1
  122. package/dist/l3-atoms/sparkle.d.ts.map +1 -1
  123. package/dist/l3-atoms/stagger.d.ts +1 -1
  124. package/dist/l3-atoms/stagger.d.ts.map +1 -1
  125. package/dist/l3-atoms/star-rating.d.ts.map +1 -1
  126. package/dist/l3-atoms/status-badge.d.ts.map +1 -1
  127. package/dist/l3-atoms/status-dot.d.ts.map +1 -1
  128. package/dist/l3-atoms/switch-group.d.ts.map +1 -1
  129. package/dist/l3-atoms/switch.d.ts.map +1 -1
  130. package/dist/l3-atoms/text-badge.d.ts.map +1 -1
  131. package/dist/l3-atoms/text-effect.d.ts.map +1 -1
  132. package/dist/l3-atoms/textarea-counter.d.ts.map +1 -1
  133. package/dist/l3-atoms/theme-toggle.d.ts.map +1 -1
  134. package/dist/l3-atoms/toggle-group.d.ts.map +1 -1
  135. package/dist/l3-atoms/tooltip.d.ts.map +1 -1
  136. package/dist/l3-atoms/trend-arrow.d.ts.map +1 -1
  137. package/dist/l3-atoms/trend-indicator.d.ts +1 -1
  138. package/dist/l3-atoms/trend-indicator.d.ts.map +1 -1
  139. package/dist/l3-atoms/truncated-list.d.ts.map +1 -1
  140. package/dist/l3-atoms/verified-badge.d.ts.map +1 -1
  141. package/dist/l3-atoms/visual-counter.d.ts.map +1 -1
  142. package/dist/l3-atoms/volume-slider.d.ts +1 -1
  143. package/dist/l3-atoms/volume-slider.d.ts.map +1 -1
  144. package/dist/l3-atoms/zoom-on-hover.d.ts.map +1 -1
  145. package/dist/{l3-atoms-BGwlQvjl.js → l3-atoms-BCJNqPHk.js} +57 -57
  146. package/dist/l3-atoms-BCJNqPHk.js.map +1 -0
  147. package/dist/l4-molecules/accordion.d.ts +2 -2
  148. package/dist/l4-molecules/accordion.d.ts.map +1 -1
  149. package/dist/l4-molecules/action-card.d.ts.map +1 -1
  150. package/dist/l4-molecules/action-menu.d.ts.map +1 -1
  151. package/dist/l4-molecules/activity-log.d.ts.map +1 -1
  152. package/dist/l4-molecules/alert.d.ts.map +1 -1
  153. package/dist/l4-molecules/audit-entry.d.ts.map +1 -1
  154. package/dist/l4-molecules/banner.d.ts.map +1 -1
  155. package/dist/l4-molecules/before-after.d.ts.map +1 -1
  156. package/dist/l4-molecules/breadcrumb.d.ts.map +1 -1
  157. package/dist/l4-molecules/bulk-action-bar.d.ts.map +1 -1
  158. package/dist/l4-molecules/callout.d.ts.map +1 -1
  159. package/dist/l4-molecules/card.d.ts +1 -1
  160. package/dist/l4-molecules/card.d.ts.map +1 -1
  161. package/dist/l4-molecules/category-tag.d.ts.map +1 -1
  162. package/dist/l4-molecules/cert-badge.d.ts.map +1 -1
  163. package/dist/l4-molecules/chip-group.d.ts.map +1 -1
  164. package/dist/l4-molecules/circular-menu.d.ts.map +1 -1
  165. package/dist/l4-molecules/code-block.d.ts.map +1 -1
  166. package/dist/l4-molecules/code-snippet.d.ts.map +1 -1
  167. package/dist/l4-molecules/collapsible.d.ts +1 -1
  168. package/dist/l4-molecules/collapsible.d.ts.map +1 -1
  169. package/dist/l4-molecules/color-picker.d.ts.map +1 -1
  170. package/dist/l4-molecules/combobox-list.d.ts.map +1 -1
  171. package/dist/l4-molecules/combobox.d.ts.map +1 -1
  172. package/dist/l4-molecules/command-bar-float.d.ts.map +1 -1
  173. package/dist/l4-molecules/command-bar.d.ts.map +1 -1
  174. package/dist/l4-molecules/command-menu.d.ts.map +1 -1
  175. package/dist/l4-molecules/comparison-bar.d.ts.map +1 -1
  176. package/dist/l4-molecules/confirm-dialog.d.ts.map +1 -1
  177. package/dist/l4-molecules/context-menu.d.ts +1 -1
  178. package/dist/l4-molecules/context-menu.d.ts.map +1 -1
  179. package/dist/l4-molecules/copy-field.d.ts.map +1 -1
  180. package/dist/l4-molecules/copy-to-clipboard.d.ts.map +1 -1
  181. package/dist/l4-molecules/countdown-timer.d.ts.map +1 -1
  182. package/dist/l4-molecules/currency-display.d.ts.map +1 -1
  183. package/dist/l4-molecules/currency-input.d.ts.map +1 -1
  184. package/dist/l4-molecules/data-card.d.ts.map +1 -1
  185. package/dist/l4-molecules/date-display.d.ts.map +1 -1
  186. package/dist/l4-molecules/date-range-input.d.ts.map +1 -1
  187. package/dist/l4-molecules/description.d.ts.map +1 -1
  188. package/dist/l4-molecules/dialog.d.ts.map +1 -1
  189. package/dist/l4-molecules/dock.d.ts.map +1 -1
  190. package/dist/l4-molecules/download-button.d.ts.map +1 -1
  191. package/dist/l4-molecules/drawer.d.ts.map +1 -1
  192. package/dist/l4-molecules/drop-zone.d.ts.map +1 -1
  193. package/dist/l4-molecules/dropdown.d.ts +1 -1
  194. package/dist/l4-molecules/dropdown.d.ts.map +1 -1
  195. package/dist/l4-molecules/editable.d.ts.map +1 -1
  196. package/dist/l4-molecules/email-composer-field.d.ts.map +1 -1
  197. package/dist/l4-molecules/emoji-picker.d.ts.map +1 -1
  198. package/dist/l4-molecules/empty-placeholder.d.ts.map +1 -1
  199. package/dist/l4-molecules/empty-search.d.ts.map +1 -1
  200. package/dist/l4-molecules/environment-badge.d.ts.map +1 -1
  201. package/dist/l4-molecules/feature-flag.d.ts.map +1 -1
  202. package/dist/l4-molecules/field-group.d.ts.map +1 -1
  203. package/dist/l4-molecules/file-upload.d.ts.map +1 -1
  204. package/dist/l4-molecules/filter-bar.d.ts.map +1 -1
  205. package/dist/l4-molecules/flip-card.d.ts.map +1 -1
  206. package/dist/l4-molecules/form-actions.d.ts.map +1 -1
  207. package/dist/l4-molecules/form-field.d.ts.map +1 -1
  208. package/dist/l4-molecules/glass-button.d.ts.map +1 -1
  209. package/dist/l4-molecules/glass-card.d.ts.map +1 -1
  210. package/dist/l4-molecules/glitch-text.d.ts.map +1 -1
  211. package/dist/l4-molecules/hover-card.d.ts.map +1 -1
  212. package/dist/l4-molecules/index.d.ts +6 -6
  213. package/dist/l4-molecules/index.d.ts.map +1 -1
  214. package/dist/l4-molecules/index.js +3 -3
  215. package/dist/l4-molecules/info-row.d.ts.map +1 -1
  216. package/dist/l4-molecules/inline-edit.d.ts.map +1 -1
  217. package/dist/l4-molecules/input-group.d.ts.map +1 -1
  218. package/dist/l4-molecules/input-with-button.d.ts.map +1 -1
  219. package/dist/l4-molecules/key-value-list.d.ts.map +1 -1
  220. package/dist/l4-molecules/kv-table.d.ts.map +1 -1
  221. package/dist/l4-molecules/link-preview.d.ts.map +1 -1
  222. package/dist/l4-molecules/list-item.d.ts.map +1 -1
  223. package/dist/l4-molecules/live-metric.d.ts.map +1 -1
  224. package/dist/l4-molecules/matrix-rain.d.ts.map +1 -1
  225. package/dist/l4-molecules/media-container.d.ts.map +1 -1
  226. package/dist/l4-molecules/media-object.d.ts.map +1 -1
  227. package/dist/l4-molecules/mention-input.d.ts.map +1 -1
  228. package/dist/l4-molecules/mention-list.d.ts +1 -1
  229. package/dist/l4-molecules/mention-list.d.ts.map +1 -1
  230. package/dist/l4-molecules/metric-row.d.ts.map +1 -1
  231. package/dist/l4-molecules/metric-tile.d.ts.map +1 -1
  232. package/dist/l4-molecules/morphing-shape.d.ts.map +1 -1
  233. package/dist/l4-molecules/multi-select-list.d.ts.map +1 -1
  234. package/dist/l4-molecules/multi-select.d.ts.map +1 -1
  235. package/dist/l4-molecules/nav-item.d.ts.map +1 -1
  236. package/dist/l4-molecules/network-status.d.ts.map +1 -1
  237. package/dist/l4-molecules/noise-overlay.d.ts.map +1 -1
  238. package/dist/l4-molecules/notification-bell.d.ts.map +1 -1
  239. package/dist/l4-molecules/notification-dot.d.ts.map +1 -1
  240. package/dist/l4-molecules/notification.d.ts.map +1 -1
  241. package/dist/l4-molecules/num-table.d.ts.map +1 -1
  242. package/dist/l4-molecules/otp-input.d.ts.map +1 -1
  243. package/dist/l4-molecules/overflow-menu.d.ts.map +1 -1
  244. package/dist/l4-molecules/page-nav.d.ts.map +1 -1
  245. package/dist/l4-molecules/pagination.d.ts.map +1 -1
  246. package/dist/l4-molecules/panel.d.ts.map +1 -1
  247. package/dist/l4-molecules/particle-field.d.ts.map +1 -1
  248. package/dist/l4-molecules/password-input.d.ts.map +1 -1
  249. package/dist/l4-molecules/phone-input.d.ts.map +1 -1
  250. package/dist/l4-molecules/pin-input.d.ts.map +1 -1
  251. package/dist/l4-molecules/popover.d.ts.map +1 -1
  252. package/dist/l4-molecules/progress-steps.d.ts.map +1 -1
  253. package/dist/l4-molecules/quick-stat.d.ts.map +1 -1
  254. package/dist/l4-molecules/radio-card.d.ts.map +1 -1
  255. package/dist/l4-molecules/reveal.d.ts.map +1 -1
  256. package/dist/l4-molecules/scoreboard.d.ts.map +1 -1
  257. package/dist/l4-molecules/search-input.d.ts.map +1 -1
  258. package/dist/l4-molecules/select.d.ts.map +1 -1
  259. package/dist/l4-molecules/sheet.d.ts.map +1 -1
  260. package/dist/l4-molecules/slider-field.d.ts.map +1 -1
  261. package/dist/l4-molecules/sortable-header.d.ts.map +1 -1
  262. package/dist/l4-molecules/split-button.d.ts +1 -1
  263. package/dist/l4-molecules/split-button.d.ts.map +1 -1
  264. package/dist/l4-molecules/stacked-progress.d.ts.map +1 -1
  265. package/dist/l4-molecules/stat-comparison.d.ts.map +1 -1
  266. package/dist/l4-molecules/stat-trend.d.ts.map +1 -1
  267. package/dist/l4-molecules/status-bar-component.d.ts.map +1 -1
  268. package/dist/l4-molecules/stepper.d.ts.map +1 -1
  269. package/dist/l4-molecules/tab-group.d.ts +1 -1
  270. package/dist/l4-molecules/tab-group.d.ts.map +1 -1
  271. package/dist/l4-molecules/tabs.d.ts +1 -1
  272. package/dist/l4-molecules/tabs.d.ts.map +1 -1
  273. package/dist/l4-molecules/tag-input.d.ts.map +1 -1
  274. package/dist/l4-molecules/task-item.d.ts.map +1 -1
  275. package/dist/l4-molecules/text-reveal.d.ts.map +1 -1
  276. package/dist/l4-molecules/text-scramble.d.ts.map +1 -1
  277. package/dist/l4-molecules/tilt-card.d.ts.map +1 -1
  278. package/dist/l4-molecules/time-picker-grid.d.ts.map +1 -1
  279. package/dist/l4-molecules/time-picker.d.ts.map +1 -1
  280. package/dist/l4-molecules/timeline-item.d.ts.map +1 -1
  281. package/dist/l4-molecules/toast-provider.d.ts.map +1 -1
  282. package/dist/l4-molecules/toast-store.d.ts.map +1 -1
  283. package/dist/l4-molecules/toast.d.ts.map +1 -1
  284. package/dist/l4-molecules/toggle-field.d.ts.map +1 -1
  285. package/dist/l4-molecules/toolbar-generic.d.ts.map +1 -1
  286. package/dist/l4-molecules/upload-progress.d.ts.map +1 -1
  287. package/dist/l4-molecules/user-card.d.ts.map +1 -1
  288. package/dist/l4-molecules/user-info.d.ts.map +1 -1
  289. package/dist/l4-molecules/user-menu.d.ts.map +1 -1
  290. package/dist/l4-molecules/version-badge.d.ts.map +1 -1
  291. package/dist/l4-molecules/watermark.d.ts.map +1 -1
  292. package/dist/l4-molecules/wizard.d.ts.map +1 -1
  293. package/dist/{l4-molecules-HRbUopGS.js → l4-molecules-DtNnQaFU.js} +347 -346
  294. package/dist/l4-molecules-DtNnQaFU.js.map +1 -0
  295. package/dist/l5-organisms/activity-feed.d.ts.map +1 -1
  296. package/dist/l5-organisms/animate-presence.d.ts.map +1 -1
  297. package/dist/l5-organisms/audio-player.d.ts.map +1 -1
  298. package/dist/l5-organisms/audit-log.d.ts.map +1 -1
  299. package/dist/l5-organisms/avatar-list.d.ts.map +1 -1
  300. package/dist/l5-organisms/calendar-utils.d.ts.map +1 -1
  301. package/dist/l5-organisms/calendar.d.ts.map +1 -1
  302. package/dist/l5-organisms/carousel.d.ts.map +1 -1
  303. package/dist/l5-organisms/changelog.d.ts.map +1 -1
  304. package/dist/l5-organisms/command-palette-list.d.ts.map +1 -1
  305. package/dist/l5-organisms/command-palette.d.ts.map +1 -1
  306. package/dist/l5-organisms/comment-thread.d.ts.map +1 -1
  307. package/dist/l5-organisms/confetti.d.ts.map +1 -1
  308. package/dist/l5-organisms/contact-card.d.ts.map +1 -1
  309. package/dist/l5-organisms/container-list.d.ts.map +1 -1
  310. package/dist/l5-organisms/cookie-banner.d.ts.map +1 -1
  311. package/dist/l5-organisms/cron-schedule.d.ts.map +1 -1
  312. package/dist/l5-organisms/data-grid.d.ts.map +1 -1
  313. package/dist/l5-organisms/data-list.d.ts.map +1 -1
  314. package/dist/l5-organisms/data-table/data-table-body.d.ts.map +1 -1
  315. package/dist/l5-organisms/data-table/data-table-head.d.ts.map +1 -1
  316. package/dist/l5-organisms/data-table/data-table-pagination.d.ts.map +1 -1
  317. package/dist/l5-organisms/data-table/data-table-toolbar.d.ts.map +1 -1
  318. package/dist/l5-organisms/data-table/data-table-types.d.ts +1 -1
  319. package/dist/l5-organisms/data-table/data-table-types.d.ts.map +1 -1
  320. package/dist/l5-organisms/data-table/data-table.d.ts.map +1 -1
  321. package/dist/l5-organisms/data-table/index.d.ts +1 -1
  322. package/dist/l5-organisms/data-table/index.d.ts.map +1 -1
  323. package/dist/l5-organisms/date-picker.d.ts.map +1 -1
  324. package/dist/l5-organisms/deploy-log.d.ts.map +1 -1
  325. package/dist/l5-organisms/description-list.d.ts.map +1 -1
  326. package/dist/l5-organisms/diff-algorithm.d.ts.map +1 -1
  327. package/dist/l5-organisms/diff-viewer.d.ts.map +1 -1
  328. package/dist/l5-organisms/email-composer.d.ts.map +1 -1
  329. package/dist/l5-organisms/email-list-item.d.ts.map +1 -1
  330. package/dist/l5-organisms/email-thread.d.ts.map +1 -1
  331. package/dist/l5-organisms/embed.d.ts.map +1 -1
  332. package/dist/l5-organisms/employee-card.d.ts.map +1 -1
  333. package/dist/l5-organisms/error-boundary.d.ts.map +1 -1
  334. package/dist/l5-organisms/file-browser.d.ts.map +1 -1
  335. package/dist/l5-organisms/file-card.d.ts.map +1 -1
  336. package/dist/l5-organisms/form-builder.d.ts.map +1 -1
  337. package/dist/l5-organisms/gantt-chart/gantt-chart-utils.d.ts.map +1 -1
  338. package/dist/l5-organisms/gantt-chart/gantt-chart.d.ts.map +1 -1
  339. package/dist/l5-organisms/gantt-chart/index.d.ts +1 -1
  340. package/dist/l5-organisms/gantt-chart/index.d.ts.map +1 -1
  341. package/dist/l5-organisms/heatmap-table.d.ts.map +1 -1
  342. package/dist/l5-organisms/image-preview.d.ts.map +1 -1
  343. package/dist/l5-organisms/index.d.ts +15 -15
  344. package/dist/l5-organisms/index.d.ts.map +1 -1
  345. package/dist/l5-organisms/index.js +1 -1
  346. package/dist/l5-organisms/infinite-scroll.d.ts.map +1 -1
  347. package/dist/l5-organisms/json-node.d.ts +1 -1
  348. package/dist/l5-organisms/json-node.d.ts.map +1 -1
  349. package/dist/l5-organisms/kanban.d.ts +2 -2
  350. package/dist/l5-organisms/kanban.d.ts.map +1 -1
  351. package/dist/l5-organisms/markdown-editor.d.ts.map +1 -1
  352. package/dist/l5-organisms/markdown-parser.d.ts.map +1 -1
  353. package/dist/l5-organisms/markdown-preview.d.ts.map +1 -1
  354. package/dist/l5-organisms/notification-center.d.ts.map +1 -1
  355. package/dist/l5-organisms/notification-toast.d.ts.map +1 -1
  356. package/dist/l5-organisms/parallax.d.ts.map +1 -1
  357. package/dist/l5-organisms/payslip-card.d.ts.map +1 -1
  358. package/dist/l5-organisms/permission-matrix.d.ts.map +1 -1
  359. package/dist/l5-organisms/progress-timeline.d.ts.map +1 -1
  360. package/dist/l5-organisms/property-editor.d.ts.map +1 -1
  361. package/dist/l5-organisms/quick-links.d.ts.map +1 -1
  362. package/dist/l5-organisms/recent-activity.d.ts.map +1 -1
  363. package/dist/l5-organisms/responsive-stack.d.ts.map +1 -1
  364. package/dist/l5-organisms/responsive-table.d.ts.map +1 -1
  365. package/dist/l5-organisms/rich-select-list.d.ts +1 -1
  366. package/dist/l5-organisms/rich-select-list.d.ts.map +1 -1
  367. package/dist/l5-organisms/rich-select.d.ts.map +1 -1
  368. package/dist/l5-organisms/rich-text-editor.d.ts.map +1 -1
  369. package/dist/l5-organisms/search-results.d.ts.map +1 -1
  370. package/dist/l5-organisms/service-card.d.ts.map +1 -1
  371. package/dist/l5-organisms/signature-drawing.d.ts +1 -1
  372. package/dist/l5-organisms/signature-drawing.d.ts.map +1 -1
  373. package/dist/l5-organisms/signature-pad.d.ts.map +1 -1
  374. package/dist/l5-organisms/sortable-table.d.ts.map +1 -1
  375. package/dist/l5-organisms/spotlight.d.ts.map +1 -1
  376. package/dist/l5-organisms/stacked-list.d.ts.map +1 -1
  377. package/dist/l5-organisms/step-form.d.ts.map +1 -1
  378. package/dist/l5-organisms/system-health.d.ts.map +1 -1
  379. package/dist/l5-organisms/table.d.ts.map +1 -1
  380. package/dist/l5-organisms/task-board.d.ts.map +1 -1
  381. package/dist/l5-organisms/timeline.d.ts +1 -1
  382. package/dist/l5-organisms/timeline.d.ts.map +1 -1
  383. package/dist/l5-organisms/tour.d.ts.map +1 -1
  384. package/dist/l5-organisms/transaction-list.d.ts.map +1 -1
  385. package/dist/l5-organisms/tree.d.ts.map +1 -1
  386. package/dist/l5-organisms/video-controls.d.ts.map +1 -1
  387. package/dist/l5-organisms/video-player.d.ts.map +1 -1
  388. package/dist/l5-organisms/virtual-list.d.ts.map +1 -1
  389. package/dist/l5-organisms/weather-widget.d.ts.map +1 -1
  390. package/dist/{l5-organisms-BA62NsFK.js → l5-organisms-Bu2Z8LSj.js} +1826 -1822
  391. package/dist/l5-organisms-Bu2Z8LSj.js.map +1 -0
  392. package/dist/l6-charts/annotated-chart.d.ts +1 -1
  393. package/dist/l6-charts/annotated-chart.d.ts.map +1 -1
  394. package/dist/l6-charts/area-chart.d.ts.map +1 -1
  395. package/dist/l6-charts/bar-chart.d.ts.map +1 -1
  396. package/dist/l6-charts/box-plot.d.ts.map +1 -1
  397. package/dist/l6-charts/bullet-chart.d.ts.map +1 -1
  398. package/dist/l6-charts/bump-chart.d.ts.map +1 -1
  399. package/dist/l6-charts/calendar-heatmap.d.ts.map +1 -1
  400. package/dist/l6-charts/candlestick-chart.d.ts.map +1 -1
  401. package/dist/l6-charts/chord-diagram.d.ts.map +1 -1
  402. package/dist/l6-charts/chord-math.d.ts.map +1 -1
  403. package/dist/l6-charts/choropleth-map.d.ts +1 -1
  404. package/dist/l6-charts/choropleth-map.d.ts.map +1 -1
  405. package/dist/l6-charts/combo-chart.d.ts.map +1 -1
  406. package/dist/l6-charts/donut-gauge.d.ts.map +1 -1
  407. package/dist/l6-charts/flame-chart.d.ts.map +1 -1
  408. package/dist/l6-charts/flow-chart.d.ts.map +1 -1
  409. package/dist/l6-charts/funnel-chart.d.ts.map +1 -1
  410. package/dist/l6-charts/gauge.d.ts.map +1 -1
  411. package/dist/l6-charts/heatmap-chart.d.ts.map +1 -1
  412. package/dist/l6-charts/heatmap-utils.d.ts.map +1 -1
  413. package/dist/l6-charts/histogram.d.ts.map +1 -1
  414. package/dist/l6-charts/index.d.ts +1 -1
  415. package/dist/l6-charts/index.d.ts.map +1 -1
  416. package/dist/l6-charts/index.js +1 -1
  417. package/dist/l6-charts/line-chart.d.ts.map +1 -1
  418. package/dist/l6-charts/network-graph.d.ts.map +1 -1
  419. package/dist/l6-charts/order-book-chart.d.ts.map +1 -1
  420. package/dist/l6-charts/pie-chart.d.ts.map +1 -1
  421. package/dist/l6-charts/polar-area-chart.d.ts +1 -1
  422. package/dist/l6-charts/polar-area-chart.d.ts.map +1 -1
  423. package/dist/l6-charts/radar-chart.d.ts.map +1 -1
  424. package/dist/l6-charts/radial-bar-chart.d.ts.map +1 -1
  425. package/dist/l6-charts/realtime-chart.d.ts.map +1 -1
  426. package/dist/l6-charts/sankey-chart.d.ts.map +1 -1
  427. package/dist/l6-charts/scatter-chart.d.ts.map +1 -1
  428. package/dist/l6-charts/sparkline.d.ts.map +1 -1
  429. package/dist/l6-charts/stock-ticker.d.ts.map +1 -1
  430. package/dist/l6-charts/stream-chart.d.ts.map +1 -1
  431. package/dist/l6-charts/sunburst-chart.d.ts.map +1 -1
  432. package/dist/l6-charts/sunburst-math.d.ts.map +1 -1
  433. package/dist/l6-charts/timeline-chart.d.ts.map +1 -1
  434. package/dist/l6-charts/treemap-chart.d.ts.map +1 -1
  435. package/dist/l6-charts/violin-plot.d.ts.map +1 -1
  436. package/dist/l6-charts/waffle-chart.d.ts.map +1 -1
  437. package/dist/l6-charts/waterfall-chart.d.ts.map +1 -1
  438. package/dist/l6-charts/word-cloud.d.ts.map +1 -1
  439. package/dist/{l6-charts-DzRRfX8J.js → l6-charts-ngP5gbBh.js} +51 -51
  440. package/dist/l6-charts-ngP5gbBh.js.map +1 -0
  441. package/dist/l7-patterns/admin-layout.d.ts.map +1 -1
  442. package/dist/l7-patterns/analytics-dashboard.d.ts.map +1 -1
  443. package/dist/l7-patterns/app-shell.d.ts.map +1 -1
  444. package/dist/l7-patterns/bento-grid.d.ts.map +1 -1
  445. package/dist/l7-patterns/calendar-view.d.ts.map +1 -1
  446. package/dist/l7-patterns/comparison-table.d.ts.map +1 -1
  447. package/dist/l7-patterns/composition-pattern.d.ts.map +1 -1
  448. package/dist/l7-patterns/cta-banner.d.ts.map +1 -1
  449. package/dist/l7-patterns/dashboard-layout.d.ts.map +1 -1
  450. package/dist/l7-patterns/data-export-card.d.ts.map +1 -1
  451. package/dist/l7-patterns/devops-layout.d.ts.map +1 -1
  452. package/dist/l7-patterns/empty-state.d.ts.map +1 -1
  453. package/dist/l7-patterns/faq.d.ts.map +1 -1
  454. package/dist/l7-patterns/feature-card.d.ts.map +1 -1
  455. package/dist/l7-patterns/footer.d.ts.map +1 -1
  456. package/dist/l7-patterns/form-layout.d.ts.map +1 -1
  457. package/dist/l7-patterns/form-pattern.d.ts.map +1 -1
  458. package/dist/l7-patterns/glass-panel.d.ts.map +1 -1
  459. package/dist/l7-patterns/grid-layout.d.ts.map +1 -1
  460. package/dist/l7-patterns/hero.d.ts.map +1 -1
  461. package/dist/l7-patterns/hr-dashboard.d.ts.map +1 -1
  462. package/dist/l7-patterns/inbox-layout.d.ts.map +1 -1
  463. package/dist/l7-patterns/index.d.ts +2 -2
  464. package/dist/l7-patterns/index.d.ts.map +1 -1
  465. package/dist/l7-patterns/index.js +1 -1
  466. package/dist/l7-patterns/kpi-dashboard.d.ts.map +1 -1
  467. package/dist/l7-patterns/loading-states.d.ts.map +1 -1
  468. package/dist/l7-patterns/login-form.d.ts.map +1 -1
  469. package/dist/l7-patterns/mail-composer.d.ts.map +1 -1
  470. package/dist/l7-patterns/masonry.d.ts.map +1 -1
  471. package/dist/l7-patterns/media-grid.d.ts.map +1 -1
  472. package/dist/l7-patterns/metric-card.d.ts.map +1 -1
  473. package/dist/l7-patterns/nav-bar.d.ts.map +1 -1
  474. package/dist/l7-patterns/notification-list.d.ts.map +1 -1
  475. package/dist/l7-patterns/onboarding-card.d.ts.map +1 -1
  476. package/dist/l7-patterns/page-header.d.ts.map +1 -1
  477. package/dist/l7-patterns/panel-group.d.ts.map +1 -1
  478. package/dist/l7-patterns/payroll-dashboard.d.ts.map +1 -1
  479. package/dist/l7-patterns/pricing-card.d.ts.map +1 -1
  480. package/dist/l7-patterns/profile-card.d.ts.map +1 -1
  481. package/dist/l7-patterns/project-dashboard.d.ts.map +1 -1
  482. package/dist/l7-patterns/responsive-container.d.ts.map +1 -1
  483. package/dist/l7-patterns/server-overview.d.ts.map +1 -1
  484. package/dist/l7-patterns/settings-layout.d.ts.map +1 -1
  485. package/dist/l7-patterns/sidebar.d.ts +1 -1
  486. package/dist/l7-patterns/sidebar.d.ts.map +1 -1
  487. package/dist/l7-patterns/skeleton-pattern.d.ts.map +1 -1
  488. package/dist/l7-patterns/splash-screen.d.ts.map +1 -1
  489. package/dist/l7-patterns/split-view.d.ts.map +1 -1
  490. package/dist/l7-patterns/stat.d.ts.map +1 -1
  491. package/dist/l7-patterns/stats-card.d.ts.map +1 -1
  492. package/dist/l7-patterns/status-page.d.ts.map +1 -1
  493. package/dist/l7-patterns/stepper-form.d.ts.map +1 -1
  494. package/dist/l7-patterns/sticky-header.d.ts.map +1 -1
  495. package/dist/l7-patterns/testimonial.d.ts.map +1 -1
  496. package/dist/l7-patterns/timeline-steps.d.ts.map +1 -1
  497. package/dist/l7-patterns/toolbar.d.ts.map +1 -1
  498. package/dist/l7-patterns/wizard-layout.d.ts.map +1 -1
  499. package/dist/{l7-patterns-Dn7X2pQC.js → l7-patterns-CwonNW9o.js} +198 -198
  500. package/dist/l7-patterns-CwonNW9o.js.map +1 -0
  501. package/dist/{loading-dots-Dz79qOGY.js → loading-dots-C1LPHGa0.js} +3 -3
  502. package/dist/loading-dots-C1LPHGa0.js.map +1 -0
  503. package/dist/motion-DUPegem-.js.map +1 -1
  504. package/dist/portal-Bbl6F_Wj.js.map +1 -1
  505. package/dist/{progress-wAKN3Czz.js → progress-dZIQEiTw.js} +5 -5
  506. package/dist/progress-dZIQEiTw.js.map +1 -0
  507. package/dist/{resize-handle-ilSc7QRM.js → resize-handle-BjSNhgJK.js} +5 -5
  508. package/dist/resize-handle-BjSNhgJK.js.map +1 -0
  509. package/dist/sanitize-BF45M9xp.js.map +1 -1
  510. package/dist/scales-DlVrSOA2.js.map +1 -1
  511. package/dist/{separator-Dqs23A9D.js → separator-CRll1Ycp.js} +5 -5
  512. package/dist/separator-CRll1Ycp.js.map +1 -0
  513. package/dist/skeleton-C9FFZSYN.js.map +1 -1
  514. package/dist/{spinner-DyrwL4JQ.js → spinner-C15eER04.js} +13 -13
  515. package/dist/spinner-C15eER04.js.map +1 -0
  516. package/dist/{stepper-DKJuH1ws.js → stepper-DJ8pn-9D.js} +16 -16
  517. package/dist/stepper-DJ8pn-9D.js.map +1 -0
  518. package/dist/{switch-DC85Os9r.js → switch-BAS-GXJV.js} +6 -6
  519. package/dist/switch-BAS-GXJV.js.map +1 -0
  520. package/dist/{textarea-BJCl_aH2.js → textarea-Btdu41rY.js} +4 -4
  521. package/dist/textarea-Btdu41rY.js.map +1 -0
  522. package/dist/{toast-DTuqMdrj.js → toast-QxCZG0Oy.js} +35 -35
  523. package/dist/toast-QxCZG0Oy.js.map +1 -0
  524. package/dist/tokens.css +464 -104
  525. package/dist/{use-theme-BI1t0nvJ.js → use-theme-D_THp_K2.js} +72 -76
  526. package/dist/use-theme-D_THp_K2.js.map +1 -0
  527. package/dist/utils/gesture.d.ts.map +1 -1
  528. package/dist/utils/hooks.d.ts.map +1 -1
  529. package/dist/utils/index.d.ts.map +1 -1
  530. package/dist/utils/sanitize.d.ts.map +1 -1
  531. package/dist/utils/tiptap.d.ts +1 -1
  532. package/dist/utils/tiptap.d.ts.map +1 -1
  533. package/dist/utils/types.d.ts.map +1 -1
  534. package/package.json +64 -37
  535. package/dist/avatar-l3SaMCmU.js.map +0 -1
  536. package/dist/badge-DTJq6AXr.js.map +0 -1
  537. package/dist/button-avu-rQU4.js.map +0 -1
  538. package/dist/icon-button-YatlVZnz.js.map +0 -1
  539. package/dist/l2-primitives-DdQHMJRE.js.map +0 -1
  540. package/dist/l3-atoms-BGwlQvjl.js.map +0 -1
  541. package/dist/l4-molecules-HRbUopGS.js.map +0 -1
  542. package/dist/l5-organisms-BA62NsFK.js.map +0 -1
  543. package/dist/l6-charts-DzRRfX8J.js.map +0 -1
  544. package/dist/l7-patterns-Dn7X2pQC.js.map +0 -1
  545. package/dist/loading-dots-Dz79qOGY.js.map +0 -1
  546. package/dist/progress-wAKN3Czz.js.map +0 -1
  547. package/dist/resize-handle-ilSc7QRM.js.map +0 -1
  548. package/dist/separator-Dqs23A9D.js.map +0 -1
  549. package/dist/spinner-DyrwL4JQ.js.map +0 -1
  550. package/dist/stepper-DKJuH1ws.js.map +0 -1
  551. package/dist/switch-DC85Os9r.js.map +0 -1
  552. package/dist/textarea-BJCl_aH2.js.map +0 -1
  553. package/dist/toast-DTuqMdrj.js.map +0 -1
  554. package/dist/use-theme-BI1t0nvJ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"l5-organisms-BA62NsFK.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../src/l5-organisms/activity-feed.tsx","../src/l5-organisms/animate-presence.tsx","../src/l5-organisms/animated-list.tsx","../src/l5-organisms/audio-player.tsx","../src/l5-organisms/audit-log.tsx","../src/l5-organisms/avatar-list.tsx","../src/l5-organisms/calendar-utils.ts","../src/l5-organisms/calendar.tsx","../src/l5-organisms/carousel.tsx","../src/l5-organisms/changelog.tsx","../src/l5-organisms/command-palette-list.tsx","../src/l5-organisms/command-palette.tsx","../src/l5-organisms/comment-thread.tsx","../src/l5-organisms/confetti-physics.ts","../src/l5-organisms/confetti.tsx","../src/l5-organisms/contact-card.tsx","../src/l5-organisms/container-list.tsx","../src/l5-organisms/cookie-banner.tsx","../src/l5-organisms/cron-schedule.tsx","../src/l5-organisms/data-grid.tsx","../src/l5-organisms/data-list.tsx","../src/l5-organisms/data-table/data-table-utils.ts","../src/l5-organisms/data-table/data-table-body.tsx","../src/l5-organisms/data-table/data-table-head.tsx","../src/l5-organisms/data-table/data-table-pagination.tsx","../src/l5-organisms/data-table/data-table-toolbar.tsx","../src/l5-organisms/data-table/data-table.tsx","../src/l5-organisms/date-picker.tsx","../src/l5-organisms/deploy-log.tsx","../src/l5-organisms/description-list.tsx","../src/l5-organisms/diff-algorithm.ts","../src/l5-organisms/diff-viewer.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/download.js","../node_modules/lucide-react/dist/esm/icons/file-text.js","../node_modules/lucide-react/dist/esm/icons/forward.js","../node_modules/lucide-react/dist/esm/icons/image.js","../node_modules/lucide-react/dist/esm/icons/paperclip.js","../node_modules/lucide-react/dist/esm/icons/reply-all.js","../node_modules/lucide-react/dist/esm/icons/reply.js","../node_modules/lucide-react/dist/esm/icons/send.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/x.js","../src/l5-organisms/rich-text-editor.tsx","../src/l5-organisms/email-composer.tsx","../src/l5-organisms/email-list-item.tsx","../src/l5-organisms/email-thread.tsx","../src/l5-organisms/embed.tsx","../src/l5-organisms/employee-card.tsx","../src/l5-organisms/error-boundary.tsx","../src/l5-organisms/file-browser.tsx","../src/l5-organisms/file-card.tsx","../src/l5-organisms/form-builder.tsx","../src/l5-organisms/gantt-chart/gantt-chart-utils.ts","../src/l5-organisms/gantt-chart/gantt-chart.tsx","../src/l5-organisms/heatmap-table.tsx","../src/l5-organisms/image-preview.tsx","../src/l5-organisms/infinite-scroll.tsx","../src/l5-organisms/json-node.tsx","../src/l5-organisms/json-viewer.tsx","../src/l5-organisms/kanban.tsx","../src/l5-organisms/markdown-parser.ts","../src/l5-organisms/markdown-preview.tsx","../src/l5-organisms/markdown-editor.tsx","../src/l5-organisms/masonry-grid.tsx","../src/l5-organisms/notification-center.tsx","../src/l5-organisms/notification-toast.tsx","../src/l5-organisms/parallax.tsx","../src/l5-organisms/payslip-card.tsx","../src/l5-organisms/permission-matrix.tsx","../src/l5-organisms/progress-timeline.tsx","../src/l5-organisms/property-editor.tsx","../src/l5-organisms/quick-links.tsx","../src/l5-organisms/recent-activity.tsx","../src/l5-organisms/responsive-stack.tsx","../src/l5-organisms/table.tsx","../src/l5-organisms/responsive-table.tsx","../src/l5-organisms/rich-select-list.tsx","../src/l5-organisms/rich-select.tsx","../src/l5-organisms/search-results.tsx","../src/l5-organisms/service-card.tsx","../src/l5-organisms/signature-drawing.ts","../src/l5-organisms/signature-pad.tsx","../src/l5-organisms/sortable-list.tsx","../src/l5-organisms/sortable-table.tsx","../src/l5-organisms/spotlight.tsx","../src/l5-organisms/stacked-list.tsx","../src/l5-organisms/step-form.tsx","../src/l5-organisms/system-health.tsx","../src/l5-organisms/tag-cloud.tsx","../src/l5-organisms/task-board.tsx","../src/l5-organisms/timeline.tsx","../src/l5-organisms/tour.tsx","../src/l5-organisms/transaction-list.tsx","../src/l5-organisms/tree.tsx","../src/l5-organisms/video-controls.tsx","../src/l5-organisms/video-player.tsx","../src/l5-organisms/virtual-list.tsx","../src/l5-organisms/weather-widget.tsx"],"sourcesContent":["// activity-feed — timestamped event log with avatars\nimport { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { cx } from '../utils/cx'\n\ntype ActivityFeedItem = {\n action: string\n avatar?: string\n id: string\n target?: string\n timestamp: string\n user: string\n}\n\ntype ActivityFeedProps = {\n className?: string\n items: ActivityFeedItem[]\n}\n\nexport const ActivityFeed = forwardRef<HTMLDivElement, ActivityFeedProps>(\n function ActivityFeed({ className, items }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col', className)}\n data-component=\"activity-feed\"\n role=\"list\"\n >\n {items.map((item) => (\n <div\n key={item.id}\n className=\"flex items-start gap-3 gds-pad-x gds-pad-y-sm\"\n role=\"listitem\"\n >\n <Avatar name={item.user} src={item.avatar} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"gds-text-body\">\n <span className=\"font-medium text-fg\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n {item.target !== undefined && (\n <span className=\"font-medium text-fg\"> {item.target}</span>\n )}\n </div>\n <div className=\"mt-0.5 gds-text-caption text-fg-muted\">{item.timestamp}</div>\n </div>\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { ActivityFeedItem, ActivityFeedProps }\n","// animate-presence — animates children on mount/unmount\nimport type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatePresenceAnimation = 'fade' | 'scale' | 'slide-up' | 'slide-down'\n\nexport type AnimatePresenceProps = {\n children: ReactNode\n animation?: AnimatePresenceAnimation\n duration?: number\n className?: string\n}\n\nconst enterClassMap: Record<AnimatePresenceAnimation, string> = {\n fade: 'animate-fade-in',\n scale: 'animate-scale-in',\n 'slide-up': 'animate-slide-up',\n 'slide-down': 'animate-slide-down',\n}\n\nconst exitClassMap: Record<AnimatePresenceAnimation, string> = {\n fade: 'animate-fade-out',\n scale: 'animate-scale-out',\n 'slide-up': 'animate-slide-down',\n 'slide-down': 'animate-slide-up',\n}\n\nexport const AnimatePresence = forwardRef<HTMLDivElement, AnimatePresenceProps>(\n function AnimatePresence(\n { children, animation = 'fade', duration = 200, className },\n ref,\n ) {\n const [rendered, setRendered] = useState(children !== null && children !== undefined && children !== false)\n const [exiting, setExiting] = useState(false)\n const prevChildrenRef = useRef<ReactNode>(children)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const hasChildren = children !== null && children !== undefined && children !== false\n\n useEffect(() => {\n if (hasChildren) {\n // entering\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n setExiting(false)\n setRendered(true)\n prevChildrenRef.current = children\n } else if (rendered && !exiting) {\n // exiting\n setExiting(true)\n timerRef.current = setTimeout(() => {\n setRendered(false)\n setExiting(false)\n timerRef.current = null\n }, duration)\n }\n }, [hasChildren, children, duration, rendered, exiting])\n\n // cleanup timer on unmount\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }\n }, [])\n\n if (!rendered) return null\n\n const animClass = exiting ? exitClassMap[animation] : enterClassMap[animation]\n const displayChildren = exiting ? prevChildrenRef.current : children\n\n return (\n <div\n ref={ref}\n className={cx(animClass, className)}\n style={{ animationDuration: `${duration}ms` }}\n data-component=\"animate-presence\"\n data-state={exiting ? 'exiting' : 'entering'}\n >\n {displayChildren}\n </div>\n )\n },\n)\n","import type { ReactNode } from 'react'\nimport { Children, forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AnimatedListAnimation = 'fade' | 'scale' | 'slide-left' | 'slide-up'\n\ntype AnimatedListProps = React.HTMLAttributes<HTMLDivElement> & {\n animation?: AnimatedListAnimation\n children: ReactNode\n stagger?: number\n}\n\nconst animationClassMap: Record<AnimatedListAnimation, string> = {\n fade: 'animate-fade-in',\n scale: 'animate-scale-in',\n 'slide-left': 'animate-slide-left',\n 'slide-up': 'animate-slide-up',\n}\n\nexport const AnimatedList = forwardRef<HTMLDivElement, AnimatedListProps>(\n function AnimatedList(\n { animation = 'slide-up', children, className, stagger = 50, ...props },\n ref,\n ) {\n const items = Children.toArray(children)\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"animated-list\"\n ref={ref}\n {...props}\n >\n {items.map((child, index) => (\n <div\n key={index}\n className={animationClassMap[animation]}\n style={{ animationDelay: `${index * stagger}ms` }}\n >\n {child}\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { AnimatedListAnimation, AnimatedListProps }\n","// audio-player — compact audio player with progress bar\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type AudioPlayerProps = {\n src: string\n title?: string\n glass?: boolean\n className?: string\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60)\n const s = Math.floor(seconds % 60)\n return `${m}:${s.toString().padStart(2, '0')}`\n}\n\nexport const AudioPlayer = forwardRef<HTMLDivElement, AudioPlayerProps>(\n function AudioPlayer({ src, title, glass, className }, ref) {\n const audioRef = useRef<HTMLAudioElement>(null)\n const [playing, setPlaying] = useState(false)\n const [currentTime, setCurrentTime] = useState(0)\n const [duration, setDuration] = useState(0)\n\n const togglePlay = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n if (audio.paused) {\n audio.play().catch(() => {})\n setPlaying(true)\n } else {\n audio.pause()\n setPlaying(false)\n }\n }, [])\n\n const handleTimeUpdate = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n setCurrentTime(audio.currentTime)\n }, [])\n\n const handleLoadedMetadata = useCallback(() => {\n const audio = audioRef.current\n if (audio === null) return\n setDuration(audio.duration)\n }, [])\n\n const handleEnded = useCallback(() => {\n setPlaying(false)\n }, [])\n\n const handleSeek = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const audio = audioRef.current\n if (audio === null) return\n const rect = e.currentTarget.getBoundingClientRect()\n const ratio = (e.clientX - rect.left) / rect.width\n audio.currentTime = ratio * duration\n },\n [duration],\n )\n\n const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-2 gds-radius-card gds-pad-x gds-pad-y',\n 'border border-border bg-bg-secondary',\n glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n className,\n )}\n data-component=\"audio-player\"\n >\n <audio\n ref={audioRef}\n src={src}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n />\n\n {/* play/pause */}\n <button\n type=\"button\"\n onClick={togglePlay}\n className={cx('shrink-0 text-fg', focusCls)}\n aria-label={playing ? 'Pause' : 'Play'}\n data-testid=\"play-button\"\n >\n {playing ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"3\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n <rect x=\"9\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4 2l10 6-10 6V2z\" />\n </svg>\n )}\n </button>\n\n {/* title */}\n {title !== undefined && (\n <span className=\"shrink-0 select-none text-xs text-fg-muted\" data-testid=\"title\">\n {title}\n </span>\n )}\n\n {/* progress bar */}\n <div\n className={cx('relative h-1 flex-1 cursor-pointer rounded-full bg-bg-tertiary', focusCls)}\n onClick={handleSeek}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.floor(duration)}\n aria-valuenow={Math.floor(currentTime)}\n tabIndex={0}\n data-testid=\"progress-bar\"\n >\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-accent\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n\n {/* time */}\n <span className=\"shrink-0 select-none text-xs tabular-nums text-fg-muted\" data-testid=\"time-display\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { AuditEntry } from '../l4-molecules/audit-entry'\nimport { cx } from '../utils/cx'\n\ntype AuditLogEntry = {\n action: string\n id: string\n target?: string\n timestamp: string\n user: string\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\ntype AuditLogProps = React.HTMLAttributes<HTMLDivElement> & {\n entries: AuditLogEntry[]\n}\n\nexport const AuditLog = forwardRef<HTMLDivElement, AuditLogProps>(\n function AuditLog({ className, entries, ...props }, ref) {\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"audit-log\"\n ref={ref}\n {...props}\n >\n {entries.map((entry, i) => (\n <div key={entry.id} className={cx('gds-pad-x gds-pad-y', i % 2 === 1 && 'bg-surface/50')}>\n <AuditEntry\n action={entry.action}\n target={entry.target}\n timestamp={entry.timestamp}\n user={entry.user}\n variant={entry.variant ?? 'default'}\n />\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { AuditLogEntry, AuditLogProps }\n","import { forwardRef } from 'react'\n\nimport { Avatar } from '../l3-atoms/avatar'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype AvatarListUser = {\n name: string\n role?: string\n src?: string\n status?: 'away' | 'busy' | 'offline' | 'online'\n}\n\ntype AvatarListProps = React.HTMLAttributes<HTMLDivElement> & {\n users: AvatarListUser[]\n onSelect?: (name: string) => void\n compact?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const AvatarList = forwardRef<HTMLDivElement, AvatarListProps>(\n function AvatarList({ users, onSelect, compact = false, glass, className, ...props }, ref) {\n return (\n <div\n className={cx(\n 'gds-radius-popover overflow-hidden border border-border',\n glassClass(glass),\n className,\n )}\n data-component=\"avatar-list\"\n ref={ref}\n {...props}\n >\n {users.map((user) => {\n const content = (\n <>\n <Avatar name={user.name} src={user.src} status={user.status} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate gds-text-body font-medium text-fg\">{user.name}</div>\n {compact !== true && user.role !== undefined && (\n <div className=\"truncate gds-text-caption text-fg-muted\">{user.role}</div>\n )}\n </div>\n </>\n )\n\n const rowCls = cx(\n 'flex items-center gds-gap gds-pad-x gds-pad-y',\n 'border-b border-border last:border-b-0',\n onSelect !== undefined && `cursor-pointer transition-colors hover:bg-bg-tertiary/30 ${focusCls}`,\n )\n\n if (onSelect !== undefined) {\n return (\n <button\n key={user.name}\n type=\"button\"\n className={cx(rowCls, 'w-full text-left')}\n onClick={() => onSelect(user.name)}\n >\n {content}\n </button>\n )\n }\n\n return (\n <div key={user.name} className={rowCls}>\n {content}\n </div>\n )\n })}\n </div>\n )\n },\n)\n\nexport type { AvatarListProps, AvatarListUser }\n","// calendar-utils — date grid computation for calendar component\n\nexport const WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\nexport const MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear()\n && a.getMonth() === b.getMonth()\n && a.getDate() === b.getDate()\n}\n\nexport function isDisabled(day: Date, min?: Date, max?: Date): boolean {\n if (min !== undefined && day < new Date(min.getFullYear(), min.getMonth(), min.getDate())) {\n return true\n }\n if (max !== undefined && day > new Date(max.getFullYear(), max.getMonth(), max.getDate())) {\n return true\n }\n return false\n}\n\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = []\n const date = new Date(year, month, 1)\n while (date.getMonth() === month) {\n days.push(new Date(date))\n date.setDate(date.getDate() + 1)\n }\n return days\n}\n\nexport function getCalendarGrid(year: number, month: number): (Date | null)[] {\n const days = getDaysInMonth(year, month)\n const firstDow = days[0].getDay()\n const grid: (Date | null)[] = Array.from({ length: firstDow }, () => null)\n grid.push(...days)\n while (grid.length < 42) {\n grid.push(null)\n }\n return grid\n}\n","// calendar — month grid with day selection, min/max constraints\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { getCalendarGrid, isDisabled, isSameDay, MONTHS, WEEKDAYS } from './calendar-utils'\n\nexport type CalendarProps = {\n value?: Date\n onChange?: (date: Date) => void\n min?: Date\n max?: Date\n className?: string\n}\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n function Calendar({ value, onChange, min, max, className }, ref) {\n const today = new Date()\n const initial = value ?? today\n const [viewYear, setViewYear] = useState(initial.getFullYear())\n const [viewMonth, setViewMonth] = useState(initial.getMonth())\n\n const grid = getCalendarGrid(viewYear, viewMonth)\n\n const prevMonth = () => {\n if (viewMonth === 0) {\n setViewYear((y) => y - 1)\n setViewMonth(11)\n } else {\n setViewMonth((m) => m - 1)\n }\n }\n\n const nextMonth = () => {\n if (viewMonth === 11) {\n setViewYear((y) => y + 1)\n setViewMonth(0)\n } else {\n setViewMonth((m) => m + 1)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('w-64 gds-radius-popover border border-border bg-surface gds-pad-x gds-pad-y select-none', className)}\n data-component=\"calendar\"\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={cx('rounded p-1 text-fg-muted hover:bg-bg-secondary hover:text-fg', focusCls)}\n onClick={prevMonth}\n aria-label=\"Previous month\"\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10 4L6 8L10 12\" />\n </svg>\n </button>\n <span className=\"text-sm font-medium text-fg\">\n {MONTHS[viewMonth]} {viewYear}\n </span>\n <button\n type=\"button\"\n className={cx('rounded p-1 text-fg-muted hover:bg-bg-secondary hover:text-fg', focusCls)}\n onClick={nextMonth}\n aria-label=\"Next month\"\n >\n <svg className=\"h-4 w-4\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M6 4L10 8L6 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"grid grid-cols-7 gds-gap-xs text-center gds-text-body text-fg-muted\">\n {WEEKDAYS.map((d) => (\n <div key={d} className=\"gds-pad-y-sm font-medium\">{d}</div>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7 gds-gap-xs text-center gds-text-body\">\n {grid.map((day, i) => {\n if (day === null) {\n return <div key={`e-${i}`} className=\"gds-pad-y-sm\" />\n }\n const disabled = isDisabled(day, min, max)\n const selected = value !== undefined && isSameDay(day, value)\n const isToday = isSameDay(day, today)\n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'gds-radius-badge gds-pad-y-sm transition-colors',\n focusCls,\n disabled && 'cursor-not-allowed opacity-30',\n !disabled && !selected && 'hover:bg-bg-secondary',\n selected && 'bg-accent text-accent-fg',\n !selected && isToday && 'ring-1 ring-accent',\n !disabled && 'text-fg',\n )}\n onClick={() => {\n if (!disabled && onChange !== undefined) onChange(day)\n }}\n >\n {day.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n )\n },\n)\n","// carousel — horizontal slide carousel with prev/next navigation\nimport type { ReactNode } from 'react'\nimport { Children, forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type CarouselProps = {\n children: ReactNode\n autoPlay?: boolean\n interval?: number\n showDots?: boolean\n showArrows?: boolean\n glass?: boolean\n className?: string\n}\n\nconst ArrowLeft = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 3L5 8l5 5\" />\n </svg>\n)\n\nconst ArrowRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3l5 5-5 5\" />\n </svg>\n)\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n function Carousel({ children, autoPlay = false, interval = 5000, showDots = true, showArrows = true, glass = false, className }, ref) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [activeIndex, setActiveIndex] = useState(0)\n const hoverRef = useRef(false)\n const touchStartRef = useRef<number | null>(null)\n\n const goTo = useCallback((index: number) => {\n const next = ((index % count) + count) % count\n setActiveIndex(next)\n }, [count])\n\n const goPrev = useCallback(() => goTo(activeIndex - 1), [activeIndex, goTo])\n const goNext = useCallback(() => goTo(activeIndex + 1), [activeIndex, goTo])\n\n // auto-play\n useEffect(() => {\n if (!autoPlay || count <= 1) return\n const id = setInterval(() => {\n if (!hoverRef.current) {\n setActiveIndex((prev) => (prev + 1) % count)\n }\n }, interval)\n return () => clearInterval(id)\n }, [autoPlay, interval, count])\n\n // touch handling\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n touchStartRef.current = e.touches[0].clientX\n }, [])\n\n const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n if (touchStartRef.current === null) return\n const diff = e.changedTouches[0].clientX - touchStartRef.current\n if (Math.abs(diff) > 50) {\n if (diff < 0) goNext()\n else goPrev()\n }\n touchStartRef.current = null\n }, [goNext, goPrev])\n\n return (\n <div\n ref={ref}\n className={cx('relative overflow-hidden gds-radius', glass && glassClass(glass), className)}\n data-component=\"carousel\"\n onMouseEnter={() => { hoverRef.current = true }}\n onMouseLeave={() => { hoverRef.current = false }}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {/* slides track */}\n <div\n className=\"flex transition-transform duration-300 ease-out\"\n style={{ transform: `translateX(-${activeIndex * 100}%)` }}\n >\n {slides.map((slide, i) => (\n <div key={i} className=\"w-full shrink-0\" data-slide={i}>\n {slide}\n </div>\n ))}\n </div>\n\n {/* arrows */}\n {showArrows && count > 1 && (\n <>\n <button\n type=\"button\"\n onClick={goPrev}\n className={cx(\n 'absolute left-2 top-1/2 -translate-y-1/2 rounded-full border border-border bg-bg/80 p-1.5 text-fg transition-colors hover:bg-bg',\n focusCls,\n )}\n aria-label=\"Previous slide\"\n >\n <ArrowLeft />\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className={cx(\n 'absolute right-2 top-1/2 -translate-y-1/2 rounded-full border border-border bg-bg/80 p-1.5 text-fg transition-colors hover:bg-bg',\n focusCls,\n )}\n aria-label=\"Next slide\"\n >\n <ArrowRight />\n </button>\n </>\n )}\n\n {/* dots */}\n {showDots && count > 1 && (\n <div className=\"absolute bottom-2 left-1/2 flex -translate-x-1/2 gap-1.5\" role=\"tablist\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => goTo(i)}\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Slide ${i + 1}`}\n className={cx(\n 'h-2 w-2 rounded-full transition-all',\n i === activeIndex ? 'bg-accent scale-125' : 'bg-fg-muted/30 hover:bg-fg-muted/50',\n focusCls,\n )}\n />\n ))}\n </div>\n )}\n </div>\n )\n },\n)\n","// changelog — versioned changelog display\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nconst typeColors = {\n added: 'bg-success/15 text-success',\n changed: 'bg-accent/15 text-accent',\n fixed: 'bg-warning/15 text-warning',\n removed: 'bg-danger/15 text-danger',\n} as const\n\ntype ChangeType = 'added' | 'changed' | 'fixed' | 'removed'\n\ntype ChangelogChange = {\n type: ChangeType\n text: string\n}\n\ntype ChangelogEntry = {\n version: string\n date: string\n changes: ChangelogChange[]\n}\n\ntype ChangelogProps = React.HTMLAttributes<HTMLDivElement> & {\n entries: ChangelogEntry[]\n}\n\nexport const Changelog = forwardRef<HTMLDivElement, ChangelogProps>(\n function Changelog({ entries, className, ...props }, ref) {\n return (\n <div ref={ref} className={cx('flex flex-col gap-6', className)} data-component=\"changelog\" {...props}>\n {entries.map((entry) => (\n <div key={entry.version} className=\"flex flex-col gap-2\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"font-semibold text-fg gds-heading\">{entry.version}</span>\n <span className=\"text-xs text-fg-muted\">{entry.date}</span>\n </div>\n <ul className=\"flex flex-col gap-1\">\n {entry.changes.map((change, i) => (\n <li key={`${change.type}-${i}`} className=\"flex items-start gap-2 gds-text text-fg\">\n <span className={cx(\n 'mt-0.5 shrink-0 rounded-full px-1.5 py-px text-[9px] font-bold uppercase leading-tight',\n typeColors[change.type],\n )}>\n {change.type}\n </span>\n <span>{change.text}</span>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { ChangelogChange, ChangelogEntry, ChangelogProps, ChangeType }\n","// command-palette-list — grouped results list (internal)\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { CommandItem } from './command-palette'\nimport { fuzzyMatchIndices } from './command-palette'\n\ntype CommandPaletteListProps = {\n groups: Map<string, CommandItem[]>\n activeIndex: number\n filteredCount: number\n onSelect: (id: string) => void\n query?: string\n fuzzy?: boolean\n}\n\nfunction highlightLabel(label: string, query: string, fuzzy: boolean): ReactNode {\n if (query === '') return label\n if (fuzzy) {\n const indices = new Set(fuzzyMatchIndices(label, query))\n if (indices.size === 0) return label\n return (\n <>\n {label.split('').map((char, i) => {\n if (indices.has(i)) {\n return <span key={i} className=\"font-semibold text-accent\">{char}</span>\n }\n return char\n })}\n </>\n )\n }\n // substring highlight\n const lower = label.toLowerCase()\n const idx = lower.indexOf(query.toLowerCase())\n if (idx < 0) return label\n return (\n <>\n {label.slice(0, idx)}\n <span className=\"font-semibold text-accent\">{label.slice(idx, idx + query.length)}</span>\n {label.slice(idx + query.length)}\n </>\n )\n}\n\nfunction CommandPaletteList({\n groups,\n activeIndex,\n filteredCount,\n onSelect,\n query = '',\n fuzzy = true,\n}: CommandPaletteListProps) {\n let flatIndex = -1\n\n if (filteredCount === 0) {\n return (\n <div className=\"py-8 text-center text-sm text-fg-muted/40\">No results found</div>\n )\n }\n\n return (\n <>\n {Array.from(groups.entries()).map(([group, groupItems]) => (\n <div key={group}>\n {group !== '' && (\n <div className=\"px-3 pb-1 pt-3 text-[10px] font-semibold uppercase tracking-[0.1em] text-fg-muted/30\">\n {group}\n </div>\n )}\n {groupItems.map((item) => {\n flatIndex++\n const isActive = flatIndex === activeIndex\n return (\n <button\n key={item.id}\n className={cx(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-[13px] transition-colors select-none',\n isActive ? 'bg-accent/15 text-accent' : 'text-fg hover:bg-white/[0.04]',\n )}\n onClick={() => onSelect(item.id)}\n data-active={isActive}\n >\n {item.icon !== undefined && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center text-fg-muted/50\">{item.icon}</span>\n )}\n <span className=\"flex-1 truncate\">{highlightLabel(item.label, query, fuzzy)}</span>\n {item.group !== undefined && (\n <span className=\"shrink-0 text-[11px] text-fg-muted/25\">{item.group}</span>\n )}\n {item.shortcut !== undefined && (\n <kbd className=\"shrink-0 rounded border border-white/[0.06] bg-white/[0.03] px-1.5 py-px text-[10px] text-fg-muted/30\">\n {item.shortcut}\n </kbd>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </>\n )\n}\n\nexport { CommandPaletteList }\nexport type { CommandPaletteListProps }\n","// command-palette — searchable command launcher overlay\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { useEscapeKey, useScrollLock } from '../utils/hooks'\nimport { renderPortal } from '../utils/portal'\nimport { CommandPaletteList } from './command-palette-list'\n\nexport type CommandItem = {\n id: string\n label: string\n icon?: ReactNode\n shortcut?: string\n group?: string\n description?: string\n disabled?: boolean\n action?: () => void\n}\n\nexport type CommandPaletteProps = {\n open: boolean\n onClose: () => void\n items: CommandItem[]\n onSelect: (id: string) => void\n placeholder?: string\n className?: string\n // v2: fuzzy search\n fuzzy?: boolean\n maxResults?: number\n // v2: recent history\n recentItems?: CommandItem[]\n maxRecent?: number\n onExecute?: (id: string) => void\n}\n\n// fuzzy match scoring: consecutive chars score higher than scattered\nfunction fuzzyScore(label: string, query: string): number {\n const lower = label.toLowerCase()\n const q = query.toLowerCase()\n let score = 0\n let queryIdx = 0\n let consecutive = 0\n let firstMatchBonus = 0\n\n for (let i = 0; i < lower.length && queryIdx < q.length; i++) {\n if (lower[i] === q[queryIdx]) {\n if (queryIdx === 0 && i === 0) firstMatchBonus = 10\n consecutive++\n score += consecutive * 2 // reward consecutive matches\n queryIdx++\n } else {\n consecutive = 0\n }\n }\n if (queryIdx < q.length) return -1 // not all query chars matched\n return score + firstMatchBonus\n}\n\nexport function fuzzyMatchIndices(label: string, query: string): number[] {\n const lower = label.toLowerCase()\n const q = query.toLowerCase()\n const indices: number[] = []\n let queryIdx = 0\n for (let i = 0; i < lower.length && queryIdx < q.length; i++) {\n if (lower[i] === q[queryIdx]) {\n indices.push(i)\n queryIdx++\n }\n }\n return indices\n}\n\nexport function CommandPalette({\n open,\n onClose,\n items,\n onSelect,\n placeholder = 'Search components, patterns, tokens...',\n className,\n fuzzy = true,\n maxResults = 50,\n recentItems,\n maxRecent = 5,\n onExecute,\n}: CommandPaletteProps) {\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n // reset + focus on open\n useEffect(() => {\n if (open) {\n setQuery('')\n setActiveIndex(0)\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n }, [open])\n\n const filtered = useMemo(() => {\n // show recent items when query is empty\n if (query === '') {\n if (recentItems !== undefined && recentItems.length > 0) {\n const recents = recentItems.slice(0, maxRecent).map(r => ({ ...r, group: 'Recent' }))\n return [...recents, ...items]\n }\n return items\n }\n\n if (fuzzy) {\n // fuzzy scoring — rank by match quality\n const scored = items\n .map(item => ({ item, score: fuzzyScore(item.label, query) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n return scored.slice(0, maxResults).map(({ item }) => item)\n }\n\n // fallback: substring match\n const lower = query.toLowerCase()\n return items.filter((item) => item.label.toLowerCase().includes(lower)).slice(0, maxResults)\n }, [items, query, fuzzy, maxResults, recentItems, maxRecent])\n\n // group items\n const groups = useMemo(() => {\n const map = new Map<string, CommandItem[]>()\n for (const item of filtered) {\n const group = item.group ?? ''\n const list = map.get(group)\n if (list !== undefined) {\n list.push(item)\n } else {\n map.set(group, [item])\n }\n }\n return map\n }, [filtered])\n\n // scroll active item into view\n useEffect(() => {\n const el = listRef.current?.querySelector('[data-active=\"true\"]')\n if (el !== null && el !== undefined) {\n el.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex])\n\n const handleSelect = useCallback((id: string) => {\n // fire action if item has one\n const item = filtered.find(i => i.id === id)\n if (item?.disabled) return\n if (item?.action !== undefined) {\n item.action()\n }\n onSelect(id)\n if (onExecute !== undefined) onExecute(id)\n onClose()\n }, [onSelect, onClose, onExecute, filtered])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n } else if (e.key === 'Enter' && filtered[activeIndex] !== undefined) {\n e.preventDefault()\n handleSelect(filtered[activeIndex].id)\n }\n }, [filtered, activeIndex, handleSelect])\n\n if (!open) return null\n\n return renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-start justify-center bg-black/60 pt-[15vh]\"\n data-component=\"command-palette\"\n data-state=\"open\"\n onClick={(e) => { if (e.target === e.currentTarget) onClose() }}\n onKeyDown={handleKeyDown}\n >\n <div\n className={cx(\n 'w-full max-w-xl animate-scale-in rounded-xl border border-white/[0.06] bg-bg-secondary shadow-2xl',\n className,\n )}\n >\n {/* search bar */}\n <div className=\"flex items-center gap-3 border-b border-white/[0.06] px-4\">\n <svg className=\"h-4 w-4 shrink-0 text-fg-muted/40\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.35-4.35\" strokeLinecap=\"round\" />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => { setQuery(e.target.value); setActiveIndex(0) }}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent py-3.5 text-sm text-fg placeholder:text-fg-muted/30 outline-none\"\n />\n <kbd className=\"shrink-0 rounded border border-white/[0.08] bg-white/[0.04] px-1.5 py-0.5 text-[10px] font-medium text-fg-muted/40\">\n ESC\n </kbd>\n </div>\n\n {/* results */}\n <div ref={listRef} className=\"max-h-80 overflow-y-auto p-1.5\">\n <CommandPaletteList\n groups={groups}\n activeIndex={activeIndex}\n filteredCount={filtered.length}\n onSelect={handleSelect}\n query={query}\n fuzzy={fuzzy}\n />\n </div>\n\n {/* footer hints */}\n <div className=\"flex items-center justify-between border-t border-white/[0.06] px-4 py-2 text-[10px] text-fg-muted/25\">\n <div className=\"flex items-center gap-3\">\n <span>↑↓ navigate</span>\n <span>↵ select</span>\n <span>esc close</span>\n </div>\n <span>{items.length} commands</span>\n </div>\n </div>\n </div>,\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CommentData = {\n author: string\n avatar?: string\n content: string\n id: string\n replies?: CommentData[]\n timestamp: string\n}\n\ntype CommentThreadProps = React.HTMLAttributes<HTMLDivElement> & {\n comments: CommentData[]\n}\n\nfunction CommentNode({ comment, depth = 0 }: { comment: CommentData; depth?: number }) {\n return (\n <div className={cx(depth > 0 && 'ml-8 border-l border-border pl-4')}>\n <div className=\"flex items-start gds-gap\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-accent/10 text-xs font-medium text-accent\">\n {comment.avatar ?? comment.author.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gds-gap-sm\">\n <span className=\"text-sm font-medium text-fg\">{comment.author}</span>\n <span className=\"gds-text-label text-fg-muted\">{comment.timestamp}</span>\n </div>\n <p className=\"mt-1 text-sm text-fg-muted\">{comment.content}</p>\n </div>\n </div>\n {comment.replies !== undefined && comment.replies.length > 0 && (\n <div className=\"mt-3 flex flex-col gds-gap\">\n {comment.replies.map((reply) => (\n <CommentNode comment={reply} depth={depth + 1} key={reply.id} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const CommentThread = forwardRef<HTMLDivElement, CommentThreadProps>(\n function CommentThread({ className, comments, ...props }, ref) {\n return (\n <div\n className={cx('flex flex-col gds-gap', className)}\n data-component=\"comment-thread\"\n ref={ref}\n role=\"list\"\n {...props}\n >\n {comments.map((comment) => (\n <div key={comment.id} role=\"listitem\">\n <CommentNode comment={comment} />\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { CommentData, CommentThreadProps }\n","// confetti-physics — particle creation, update, and rendering\n\nexport type Particle = {\n color: string\n drag: number\n gravity: number\n rotation: number\n rotationSpeed: number\n size: number\n vx: number\n vy: number\n x: number\n y: number\n}\n\nexport function createParticle(\n canvasWidth: number,\n colors: string[],\n): Particle {\n return {\n x: Math.random() * canvasWidth,\n y: -10,\n vx: (Math.random() - 0.5) * 8,\n vy: Math.random() * -6 - 4,\n size: Math.random() * 6 + 4,\n color: colors[Math.floor(Math.random() * colors.length)],\n rotation: Math.random() * 360,\n rotationSpeed: (Math.random() - 0.5) * 10,\n gravity: 0.15,\n drag: 0.98,\n }\n}\n\nexport function updateParticle(p: Particle): Particle {\n return {\n ...p,\n x: p.x + p.vx,\n y: p.y + p.vy,\n vx: p.vx * p.drag,\n vy: (p.vy + p.gravity) * p.drag,\n rotation: p.rotation + p.rotationSpeed,\n }\n}\n\nexport function drawParticle(ctx: CanvasRenderingContext2D, p: Particle): void {\n ctx.save()\n ctx.translate(p.x, p.y)\n ctx.rotate((p.rotation * Math.PI) / 180)\n ctx.fillStyle = p.color\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6)\n ctx.restore()\n}\n","// confetti — canvas-based celebration particle animation\nimport { useEffect, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\nimport type { Particle } from './confetti-physics'\nimport { createParticle, drawParticle, updateParticle } from './confetti-physics'\n\ntype ConfettiProps = {\n active: boolean\n className?: string\n colors?: string[]\n duration?: number\n particleCount?: number\n}\n\nconst DEFAULT_COLORS = [\n '#6366f1', '#ec4899', '#14b8a6', '#f59e0b',\n '#8b5cf6', '#ef4444', '#22c55e', '#3b82f6',\n]\n\nexport function Confetti({\n active,\n className,\n colors = DEFAULT_COLORS,\n duration = 3000,\n particleCount = 100,\n}: ConfettiProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const particlesRef = useRef<Particle[]>([])\n const rafRef = useRef<number>(0)\n const startTimeRef = useRef<number>(0)\n\n useEffect(() => {\n if (!active) {\n particlesRef.current = []\n return\n }\n\n const canvas = canvasRef.current\n if (canvas === null) return\n\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n\n // size canvas to viewport\n canvas.width = window.innerWidth\n canvas.height = window.innerHeight\n\n particlesRef.current = []\n startTimeRef.current = performance.now()\n let spawnedCount = 0\n\n function animate(now: number) {\n if (canvas === null || ctx === null) return\n\n const elapsed = now - startTimeRef.current\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n // spawn particles over time\n if (elapsed < duration) {\n const targetSpawned = Math.min(\n particleCount,\n Math.floor((elapsed / duration) * particleCount),\n )\n while (spawnedCount < targetSpawned) {\n particlesRef.current = [\n ...particlesRef.current,\n createParticle(canvas.width, colors),\n ]\n spawnedCount += 1\n }\n }\n\n // update and draw\n particlesRef.current = particlesRef.current\n .map(updateParticle)\n .filter((p) => p.y < canvas.height + 20)\n\n for (const p of particlesRef.current) {\n drawParticle(ctx, p)\n }\n\n // keep animating if there are still particles\n if (particlesRef.current.length > 0 || elapsed < duration) {\n rafRef.current = requestAnimationFrame(animate)\n }\n }\n\n rafRef.current = requestAnimationFrame(animate)\n\n return () => {\n cancelAnimationFrame(rafRef.current)\n }\n }, [active, colors, duration, particleCount])\n\n if (!active) return null\n\n return renderPortal(\n <canvas\n ref={canvasRef}\n className={cx('fixed inset-0 pointer-events-none z-[9999]', className)}\n data-component=\"confetti\"\n />,\n )\n}\n\nexport type { ConfettiProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ContactCardProps = React.HTMLAttributes<HTMLDivElement> & {\n actions?: ReactNode\n avatar?: string\n email?: string\n name: string\n phone?: string\n role?: string\n}\n\nexport const ContactCard = forwardRef<HTMLDivElement, ContactCardProps>(\n function ContactCard({ actions, avatar, className, email, name, phone, role, ...props }, ref) {\n const initials = name\n .split(' ')\n .map((w) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <div\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad text-center', className)}\n data-component=\"contact-card\"\n ref={ref}\n {...props}\n >\n {avatar !== undefined ? (\n <img src={avatar} alt={name} className=\"mx-auto h-14 w-14 rounded-full object-cover\" />\n ) : (\n <div className=\"mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent\">\n {initials}\n </div>\n )}\n <div className=\"mt-3 font-semibold text-fg\">{name}</div>\n {role !== undefined && <div className=\"mt-0.5 text-xs text-fg-muted\">{role}</div>}\n {email !== undefined && (\n <div className=\"mt-2 text-xs text-fg-muted\">{email}</div>\n )}\n {phone !== undefined && (\n <div className=\"mt-0.5 text-xs text-fg-muted\">{phone}</div>\n )}\n {actions !== undefined && <div className=\"mt-3 flex justify-center gap-2\">{actions}</div>}\n </div>\n )\n },\n)\n\nexport type { ContactCardProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ContainerStatus = 'paused' | 'running' | 'stopped'\n\ntype ContainerInfo = {\n image: string\n name: string\n ports?: string\n status: ContainerStatus\n}\n\ntype ContainerListProps = React.HTMLAttributes<HTMLDivElement> & {\n containers: ContainerInfo[]\n}\n\nconst dotCls: Record<ContainerStatus, string> = {\n running: 'bg-success',\n stopped: 'bg-danger',\n paused: 'bg-warning',\n}\n\nexport const ContainerList = forwardRef<HTMLDivElement, ContainerListProps>(\n function ContainerList({ className, containers, ...props }, ref) {\n return (\n <div\n className={cx('gds-radius-popover overflow-hidden border border-border', className)}\n data-component=\"container-list\"\n ref={ref}\n {...props}\n >\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-bg-tertiary/50 text-left gds-text-body text-fg-muted\">\n <th className=\"px-3 py-1.5 font-medium\">Name</th>\n <th className=\"px-3 py-1.5 font-medium\">Image</th>\n <th className=\"px-3 py-1.5 font-medium\">Status</th>\n <th className=\"px-3 py-1.5 font-medium\">Ports</th>\n </tr>\n </thead>\n <tbody>\n {containers.map((c) => (\n <tr key={c.name} className=\"border-t border-border gds-text-body hover:bg-bg-tertiary/30 transition-colors\">\n <td className=\"px-3 py-1.5 font-medium text-fg\">{c.name}</td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted text-xs\">{c.image}</td>\n <td className=\"px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className={cx('h-2 w-2 rounded-full', dotCls[c.status])} />\n <span className=\"text-fg-muted\">{c.status}</span>\n </span>\n </td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted text-xs\">{c.ports ?? '—'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n\nexport type { ContainerInfo, ContainerListProps, ContainerStatus }\n","// cookie-banner — GDPR-style consent banner with accept/reject\nimport { forwardRef } from 'react'\n\nimport { Button } from '../l2-primitives/button'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype CookieBannerProps = {\n onAccept: () => void\n onReject?: () => void\n message?: string\n className?: string\n}\n\nconst defaultMessage = 'We use cookies to improve your experience. By continuing to use this site, you agree to our use of cookies.'\n\nconst CookieBannerInner = forwardRef<HTMLDivElement, CookieBannerProps>(\n function CookieBannerInner({ onAccept, onReject, message, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'fixed inset-x-0 bottom-0 z-50 flex items-center justify-between gap-4 border-t border-border bg-surface/80 px-6 py-4 backdrop-blur-lg',\n className,\n )}\n data-component=\"cookie-banner\"\n role=\"banner\"\n >\n <p className=\"text-sm text-fg-muted flex-1\">{message ?? defaultMessage}</p>\n <div className=\"flex shrink-0 gap-2\">\n {onReject !== undefined && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReject}>Reject</Button>\n )}\n <Button variant=\"primary\" size=\"sm\" onClick={onAccept}>Accept</Button>\n </div>\n </div>\n )\n },\n)\n\nconst CookieBanner = forwardRef<HTMLDivElement, CookieBannerProps>(\n function CookieBanner(props, ref) {\n return renderPortal(<CookieBannerInner {...props} ref={ref} />)\n },\n)\n\nexport { CookieBanner }\nexport type { CookieBannerProps }\n","// cron-schedule — human-readable display of a cron expression\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype CronScheduleProps = React.HTMLAttributes<HTMLDivElement> & {\n expression: string\n}\n\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n\nfunction parseCron(expr: string): string {\n const parts = expr.trim().split(/\\s+/)\n if (parts.length !== 5) return `Cron: ${expr}`\n\n const [minute, hour, dayOfMonth, , dayOfWeek] = parts\n\n const time = hour !== '*' && minute !== '*'\n ? `${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`\n : null\n\n if (dayOfWeek !== '*' && dayOfWeek !== '?') {\n const dayNum = parseInt(dayOfWeek, 10)\n const dayName = !isNaN(dayNum) ? DAYS[dayNum % 7] ?? dayOfWeek : dayOfWeek\n return time !== null ? `Every ${dayName} at ${time}` : `Every ${dayName}`\n }\n\n if (dayOfMonth !== '*' && dayOfMonth !== '?') {\n return time !== null ? `Day ${dayOfMonth} of every month at ${time}` : `Day ${dayOfMonth} of every month`\n }\n\n if (hour === '*' && minute === '*') return 'Every minute'\n if (hour === '*') return `Every hour at minute ${minute}`\n if (minute === '0' && hour === '0') return 'Every day at midnight'\n\n return time !== null ? `Every day at ${time}` : `Cron: ${expr}`\n}\n\nconst CronSchedule = forwardRef<HTMLDivElement, CronScheduleProps>(\n function CronSchedule({ expression, className, ...props }, ref) {\n const description = useMemo(() => parseCron(expression), [expression])\n\n return (\n <div ref={ref} className={cx('flex items-center gap-3', className)} data-component=\"cron-schedule\" {...props}>\n <code className=\"rounded bg-bg-secondary px-2 py-1 text-xs text-fg-muted font-mono\">{expression}</code>\n <span className=\"gds-text-body text-fg\">{description}</span>\n </div>\n )\n },\n)\n\nexport { CronSchedule }\nexport type { CronScheduleProps }\n","// data-grid — simple table grid with typed columns, optional striping and compact mode\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DataGridColumn = {\n key: string\n label: string\n align?: 'center' | 'left' | 'right'\n width?: string\n}\n\nexport type DataGridProps = {\n columns: DataGridColumn[]\n rows: Record<string, ReactNode>[]\n compact?: boolean\n striped?: boolean\n glass?: boolean\n className?: string\n}\n\nconst alignClasses: Record<string, string> = {\n center: 'text-center',\n left: 'text-left',\n right: 'text-right',\n}\n\nexport const DataGrid = forwardRef<HTMLTableElement, DataGridProps>(\n function DataGrid({ columns, rows, compact = false, striped = false, glass, className }, ref) {\n const cellPadding = compact ? 'px-3 py-1' : 'px-3 py-2'\n\n return (\n <div\n className={cx(\n 'w-full overflow-auto',\n glass === true && glassClass(glass),\n className,\n )}\n data-component=\"data-grid\"\n >\n <table className=\"w-full text-sm\" ref={ref}>\n <thead>\n <tr className=\"border-b border-border/40\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'font-medium text-fg-muted select-none',\n cellPadding,\n alignClasses[col.align ?? 'left'],\n )}\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td className=\"px-3 py-8 text-center text-fg-muted\" colSpan={columns.length}>\n No data\n </td>\n </tr>\n )}\n {rows.map((row, i) => (\n <tr\n key={`${String(row[columns[0]?.key ?? ''] ?? '')}-${i}`}\n className={cx(\n 'border-b border-border/20',\n striped && i % 2 === 1 && 'bg-bg-secondary/30',\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx('text-fg', cellPadding, alignClasses[col.align ?? 'left'])}\n >\n {row[col.key]}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n","// data-list — key-value list display for structured data\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type DataListItem = {\n label: string\n value: ReactNode\n}\n\nexport type DataListProps = {\n items: DataListItem[]\n layout?: 'vertical' | 'horizontal'\n striped?: boolean\n glass?: boolean\n className?: string\n}\n\nexport function DataList({\n items,\n layout = 'vertical',\n striped = false,\n glass,\n className,\n}: DataListProps) {\n const isHorizontal = layout === 'horizontal'\n\n return (\n <div\n className={cx(\n 'gds-radius-popover border border-border overflow-hidden',\n glass !== undefined && glass !== false\n ? cx('border-white/10 bg-bg/60', glassClass(glass))\n : '',\n className,\n )}\n data-component=\"data-list\"\n data-variant={layout}\n >\n {items.map((item, i) => (\n <div\n key={item.label}\n className={cx(\n 'gds-pad-x gds-pad-y-sm',\n i < items.length - 1 ? 'border-b border-border' : '',\n isHorizontal ? 'flex items-center justify-between gap-4' : '',\n striped && i % 2 === 1 ? 'bg-bg-tertiary/20' : '',\n )}\n >\n <div className=\"gds-text-body font-medium text-fg-muted\">{item.label}</div>\n <div className={cx('text-fg gds-text-body', isHorizontal ? '' : 'mt-1')}>\n {item.value}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import type { AggregateFunction, DataColumn, Density } from './data-table-types'\n\n// resolve column label (backward compat: label ?? header)\nexport function getLabel<T>(col: DataColumn<T>): string {\n return col.label ?? col.header ?? col.key\n}\n\n// resolve row key\nexport function resolveRowKey<T>(\n row: T,\n rowKey: string | ((row: T, index: number) => string) | undefined,\n index: number,\n): string {\n if (rowKey === undefined) {\n const r = row as Record<string, unknown>\n return String(r['id'] ?? index)\n }\n if (typeof rowKey === 'function') return rowKey(row, index)\n return String((row as Record<string, unknown>)[rowKey] ?? index)\n}\n\n// density padding classes\ntype DensityClasses = { td: string; th: string }\n\nconst densityMap: Record<Density, DensityClasses> = {\n compact: { td: 'px-1.5 py-0.5 text-[11px]', th: 'px-1.5 py-1 text-[11px]' },\n default: { td: 'px-2.5 py-1.5 text-xs', th: 'px-2.5 py-1.5 text-xs' },\n comfortable: { td: 'px-3 py-2.5 text-sm', th: 'px-3 py-2 text-xs' },\n}\n\nexport function getDensity(density: Density = 'default'): DensityClasses {\n return densityMap[density]\n}\n\n// compute aggregate\nexport function computeAggregate<T>(\n rows: T[],\n key: string,\n fn: AggregateFunction,\n): number | null {\n const values = rows\n .map((r) => {\n const v = (r as Record<string, unknown>)[key]\n return typeof v === 'number' ? v : null\n })\n .filter((v): v is number => v !== null)\n\n if (values.length === 0) return null\n\n if (fn === 'count') return values.length\n if (fn === 'sum') return values.reduce((a, b) => a + b, 0)\n if (fn === 'avg') return values.reduce((a, b) => a + b, 0) / values.length\n if (fn === 'min') return Math.min(...values)\n if (fn === 'max') return Math.max(...values)\n return null\n}\n\n// csv export\nexport function downloadCsv<T>(\n columns: DataColumn<T>[],\n rows: T[],\n filename: string,\n): void {\n const visibleCols = columns.filter((c) => c.hidden !== true)\n const header = visibleCols.map((c) => getLabel(c))\n const csvRows = rows.map((row) =>\n visibleCols.map((col) => {\n const v = (row as Record<string, unknown>)[col.key]\n const str = String(v ?? '')\n // escape quotes in csv\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n }),\n )\n const csv = [header.join(','), ...csvRows.map((r) => r.join(','))].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// cell value extraction\nexport function getCellValue<T>(row: T, key: string): unknown {\n return (row as Record<string, unknown>)[key]\n}\n","import type { ReactNode } from 'react'\n\nimport { cx } from '../../utils/cx'\nimport type { DataColumn, Density } from './data-table-types'\nimport { computeAggregate, getCellValue, getDensity, resolveRowKey } from './data-table-utils'\n\n// skeleton loading rows\nfunction SkeletonRows<T>({\n columns,\n count,\n density,\n hasSelection,\n rowNumbers,\n hasActions,\n bordered,\n}: {\n columns: DataColumn<T>[]\n count: number\n density?: Density\n hasSelection?: boolean\n rowNumbers?: boolean\n hasActions?: boolean\n bordered?: boolean\n}) {\n const d = getDensity(density)\n const borderCls = bordered === true ? 'border border-border' : ''\n const totalCols = columns.length + (hasSelection ? 1 : 0) + (rowNumbers ? 1 : 0) + (hasActions ? 1 : 0)\n return (\n <>\n {Array.from({ length: count }, (_, i) => (\n <tr key={i} className=\"border-b border-border\">\n {Array.from({ length: totalCols }, (_, j) => (\n <td key={j} className={cx(d.td, borderCls)}>\n <div className=\"h-4 animate-pulse rounded bg-bg-tertiary\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n\n// empty state\nfunction EmptyState({\n colSpan,\n message,\n icon,\n}: {\n colSpan: number\n message: string\n icon?: ReactNode\n}) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"py-12 text-center text-sm text-fg-muted\">\n {icon !== undefined && <div className=\"mb-2 flex justify-center text-fg-muted/30\">{icon}</div>}\n {message}\n </td>\n </tr>\n )\n}\n\n// error state\nfunction ErrorState({ colSpan, error }: { colSpan: number; error: ReactNode }) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"py-8 text-center text-sm text-danger\">\n {error}\n </td>\n </tr>\n )\n}\n\n// render cell content\nfunction renderCell<T>(col: DataColumn<T>, row: T, index: number, highlightQuery?: string): ReactNode {\n const value = getCellValue(row, col.key)\n\n // render has full control — support both (value, row, index) and legacy (row) signatures\n if (col.render !== undefined) {\n if (col.render.length <= 1) {\n return (col.render as (row: T) => ReactNode)(row)\n }\n return (col.render as (value: unknown, row: T, index: number) => ReactNode)(value, row, index)\n }\n\n // format returns ReactNode\n if (col.format !== undefined) return col.format(value, row)\n\n const str = String(value ?? '')\n\n // highlight matches\n if (highlightQuery !== undefined && highlightQuery !== '' && str !== '') {\n const lowerStr = str.toLowerCase()\n const lowerQuery = highlightQuery.toLowerCase()\n const idx = lowerStr.indexOf(lowerQuery)\n if (idx >= 0) {\n return (\n <>\n {str.slice(0, idx)}\n <mark className=\"bg-warning/30 text-fg\">{str.slice(idx, idx + highlightQuery.length)}</mark>\n {str.slice(idx + highlightQuery.length)}\n </>\n )\n }\n }\n\n return str\n}\n\ntype DataTableBodyProps<T> = {\n columns: DataColumn<T>[]\n rows: T[]\n density?: Density\n loading?: boolean\n loadingRows?: number\n error?: ReactNode\n emptyMessage?: string\n emptyIcon?: ReactNode\n striped?: boolean\n bordered?: boolean\n highlightOnHover?: boolean\n rowNumbers?: boolean\n rowKey?: string | ((row: T, index: number) => string)\n getRowClassName?: (row: T, index: number) => string | undefined\n onRowClick?: (row: T) => void\n // selection\n hasSelection?: boolean\n selectedKeys?: Set<string>\n onToggleSelect?: (key: string, row: T) => void\n // expand\n expandedKeys?: Set<string>\n onToggleExpand?: (key: string) => void\n renderExpanded?: (row: T) => ReactNode\n // actions\n actions?: (row: T) => ReactNode\n // highlight\n highlightQuery?: string\n // page offset for row numbers\n pageOffset?: number\n}\n\nexport function DataTableBody<T>({\n columns,\n rows,\n density,\n loading,\n loadingRows = 5,\n error,\n emptyMessage = 'No data',\n emptyIcon,\n striped,\n bordered,\n highlightOnHover = true,\n rowNumbers,\n rowKey,\n getRowClassName,\n onRowClick,\n hasSelection,\n selectedKeys,\n onToggleSelect,\n expandedKeys,\n onToggleExpand,\n renderExpanded,\n actions,\n highlightQuery,\n pageOffset = 0,\n}: DataTableBodyProps<T>) {\n const d = getDensity(density)\n const borderCls = bordered === true ? 'border border-border' : ''\n const hasExpand = renderExpanded !== undefined && onToggleExpand !== undefined\n const totalCols = columns.length + (hasExpand ? 1 : 0) + (hasSelection ? 1 : 0) + (rowNumbers ? 1 : 0) + (actions !== undefined ? 1 : 0)\n const hasAggregate = columns.some((c) => c.aggregate !== undefined)\n\n return (\n <tbody>\n {loading === true && (\n <SkeletonRows\n columns={columns}\n count={loadingRows}\n density={density}\n hasSelection={hasSelection}\n rowNumbers={rowNumbers}\n hasActions={actions !== undefined}\n bordered={bordered}\n />\n )}\n {loading !== true && error !== undefined && (\n <ErrorState colSpan={totalCols} error={error} />\n )}\n {loading !== true && error === undefined && rows.length === 0 && (\n <EmptyState colSpan={totalCols} message={emptyMessage} icon={emptyIcon} />\n )}\n {loading !== true && error === undefined && rows.map((row, i) => {\n const key = resolveRowKey(row, rowKey, pageOffset + i)\n const isSelected = selectedKeys !== undefined && selectedKeys.has(key)\n const isExpanded = expandedKeys !== undefined && expandedKeys.has(key)\n const customCls = getRowClassName !== undefined ? getRowClassName(row, pageOffset + i) : undefined\n\n return (\n <RowFragment key={key}>\n <tr\n className={cx(\n 'border-b border-border transition-colors',\n striped === true && i % 2 === 1 && 'bg-bg-secondary/30',\n highlightOnHover && 'hover:bg-bg-secondary/60',\n isSelected && 'bg-accent/5',\n onRowClick !== undefined && 'cursor-pointer',\n customCls,\n )}\n onClick={onRowClick !== undefined ? () => onRowClick(row) : undefined}\n >\n {hasExpand && (\n <td className={cx(d.td, borderCls, 'w-8 text-center')}>\n <button\n className=\"text-fg-muted/50 transition-transform hover:text-fg-muted\"\n onClick={(e) => { e.stopPropagation(); onToggleExpand?.(key) }}\n style={{ transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)' }}\n type=\"button\"\n >\n &#9654;\n </button>\n </td>\n )}\n {hasSelection && (\n <td className={cx(d.td, borderCls, 'w-8 text-center')}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation()\n onToggleSelect?.(key, row)\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"accent-accent\"\n />\n </td>\n )}\n {rowNumbers === true && (\n <td className={cx(d.td, borderCls, 'w-8 text-center text-fg-muted/50 tabular-nums')}>\n {pageOffset + i + 1}\n </td>\n )}\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx(\n d.td,\n borderCls,\n 'text-fg',\n col.align === 'right' && 'text-right tabular-nums',\n col.align === 'center' && 'text-center',\n col.muted === true && 'text-fg-muted',\n )}\n >\n {renderCell(col, row, pageOffset + i, highlightQuery)}\n </td>\n ))}\n {actions !== undefined && (\n <td className={cx(d.td, borderCls, 'w-12 text-center')} onClick={(e) => e.stopPropagation()}>\n {actions(row)}\n </td>\n )}\n </tr>\n {isExpanded && renderExpanded !== undefined && (\n <tr className=\"border-b border-border bg-bg-secondary/20\">\n <td colSpan={totalCols} className=\"px-4 py-3\">\n {renderExpanded(row)}\n </td>\n </tr>\n )}\n </RowFragment>\n )\n })}\n {loading !== true && error === undefined && hasAggregate && rows.length > 0 && (\n <tr className=\"border-t-2 border-border bg-bg-secondary/50 font-semibold\">\n {hasExpand && <td className={cx(d.td, borderCls)} />}\n {hasSelection && <td className={cx(d.td, borderCls)} />}\n {rowNumbers === true && <td className={cx(d.td, borderCls)} />}\n {columns.map((col) => (\n <td\n key={col.key}\n className={cx(\n d.td,\n borderCls,\n 'text-fg',\n col.align === 'right' && 'text-right tabular-nums',\n )}\n >\n {col.aggregate !== undefined\n ? (computeAggregate(rows, col.key, col.aggregate)?.toLocaleString() ?? '')\n : (col.key === columns[0]?.key ? `Total (${rows.length})` : '')}\n </td>\n ))}\n {actions !== undefined && <td className={cx(d.td, borderCls)} />}\n </tr>\n )}\n </tbody>\n )\n}\n\n// fragment wrapper for expand rows (two <tr> per row)\nfunction RowFragment({ children }: { children: ReactNode }) {\n return <>{children}</>\n}\n","import { cx } from '../../utils/cx'\nimport type { DataColumn, Density, SortDir } from './data-table-types'\nimport { getDensity, getLabel } from './data-table-utils'\n\nfunction SortIcon({ dir }: { dir?: SortDir | null }) {\n if (dir === undefined || dir === null) {\n return (\n <svg className=\"ml-1 inline h-3 w-3 text-fg-muted/40\" fill=\"currentColor\" viewBox=\"0 0 12 12\">\n <path d=\"M6 2L9 5H3L6 2Z\" />\n <path d=\"M6 10L3 7H9L6 10Z\" />\n </svg>\n )\n }\n return (\n <svg className=\"ml-1 inline h-3 w-3 text-fg-muted\" fill=\"currentColor\" viewBox=\"0 0 12 12\">\n {dir === 'asc' ? <path d=\"M6 2L9 5H3L6 2Z\" /> : <path d=\"M6 10L3 7H9L6 10Z\" />}\n </svg>\n )\n}\n\ntype DataTableHeadProps<T> = {\n columns: DataColumn<T>[]\n density?: Density\n sortKey?: string | null\n sortDir?: SortDir | null\n onSort?: (key: string) => void\n stickyHeader?: boolean\n rowNumbers?: boolean\n hasSelection?: boolean\n allSelected?: boolean\n someSelected?: boolean\n onToggleSelectAll?: () => void\n hasActions?: boolean\n hasExpand?: boolean\n bordered?: boolean\n // column filters\n columnFilters?: Record<string, string>\n onColumnFilterChange?: (key: string, value: string) => void\n}\n\nexport function DataTableHead<T>({\n columns,\n density,\n sortKey,\n sortDir,\n onSort,\n stickyHeader,\n rowNumbers,\n hasSelection,\n allSelected,\n someSelected,\n onToggleSelectAll,\n hasActions,\n hasExpand,\n bordered,\n columnFilters,\n onColumnFilterChange,\n}: DataTableHeadProps<T>) {\n const d = getDensity(density)\n const borderCls = bordered === true ? 'border border-border' : 'border-b border-border'\n const hasFilters = columns.some((c) => c.filterable === true) && onColumnFilterChange !== undefined\n\n return (\n <thead>\n <tr className={cx('bg-bg-secondary/50', stickyHeader === true && 'sticky top-0 z-10')}>\n {hasExpand === true && <th className={cx(d.th, borderCls, 'w-8')} />}\n {hasSelection && (\n <th className={cx(d.th, borderCls, 'w-8 text-center')}>\n <input\n type=\"checkbox\"\n checked={allSelected === true}\n ref={(el) => { if (el !== null) el.indeterminate = someSelected === true && allSelected !== true }}\n onChange={() => onToggleSelectAll?.()}\n className=\"accent-accent\"\n />\n </th>\n )}\n {rowNumbers === true && (\n <th className={cx(d.th, borderCls, 'w-8 text-center font-medium text-fg-muted select-none')}>#</th>\n )}\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n d.th,\n borderCls,\n 'font-semibold tracking-wide text-fg-muted select-none whitespace-nowrap',\n col.align === 'right' && 'text-right',\n col.align === 'center' && 'text-center',\n col.sortable === true && onSort !== undefined && 'cursor-pointer hover:text-fg',\n )}\n style={{\n width: col.width,\n minWidth: col.minWidth,\n }}\n onClick={() => {\n if (col.sortable === true && onSort !== undefined) {\n onSort(col.key)\n }\n }}\n >\n {getLabel(col)}\n {col.sortable === true && (\n <SortIcon dir={sortKey === col.key ? sortDir : undefined} />\n )}\n </th>\n ))}\n {hasActions && (\n <th className={cx(d.th, borderCls, 'w-12')} />\n )}\n </tr>\n {hasFilters && (\n <tr className=\"bg-bg-secondary/30\">\n {hasExpand === true && <th className={cx(d.th, borderCls)} />}\n {hasSelection && <th className={cx(d.th, borderCls)} />}\n {rowNumbers === true && <th className={cx(d.th, borderCls)} />}\n {columns.map((col) => (\n <th key={col.key} className={cx('px-1 py-1', borderCls)}>\n {col.filterable === true ? (\n col.filterOptions !== undefined ? (\n <select\n className=\"w-full rounded border border-border bg-bg px-1.5 py-0.5 text-[11px] text-fg outline-none\"\n value={columnFilters?.[col.key] ?? ''}\n onChange={(e) => onColumnFilterChange?.(col.key, e.target.value)}\n >\n <option value=\"\">All</option>\n {col.filterOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n ) : (\n <input\n className=\"w-full rounded border border-border bg-bg px-1.5 py-0.5 text-[11px] text-fg outline-none placeholder:text-fg-muted/50\"\n placeholder=\"Filter...\"\n value={columnFilters?.[col.key] ?? ''}\n onChange={(e) => onColumnFilterChange?.(col.key, e.target.value)}\n />\n )\n ) : null}\n </th>\n ))}\n {hasActions && <th className={cx(d.th, borderCls)} />}\n </tr>\n )}\n </thead>\n )\n}\n","import { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\n\ntype DataTablePaginationProps = {\n currentPage: number\n totalPages: number\n totalRows: number\n pageSize: number\n pageSizeOptions?: number[]\n visibleRowCount: number\n onPageChange: (page: number) => void\n onPageSizeChange?: (size: number) => void\n}\n\nexport function DataTablePagination({\n currentPage,\n totalPages,\n totalRows,\n pageSize,\n pageSizeOptions,\n visibleRowCount,\n onPageChange,\n onPageSizeChange,\n}: DataTablePaginationProps) {\n const start = (currentPage - 1) * pageSize + 1\n const end = Math.min(currentPage * pageSize, totalRows)\n\n return (\n <div className=\"flex items-center justify-between border-t border-border px-3 py-2\">\n <div className=\"flex items-center gap-2 text-[11px] text-fg-muted\">\n <span>\n {visibleRowCount === 0 ? '0 rows' : `${start}–${end} of ${totalRows}`}\n </span>\n {pageSizeOptions !== undefined && onPageSizeChange !== undefined && (\n <select\n className=\"rounded border border-border bg-bg px-1.5 py-0.5 text-[11px] text-fg outline-none\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>{opt} / page</option>\n ))}\n </select>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <PageButton\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n label=\"Previous\"\n >\n <svg className=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M15 19l-7-7 7-7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </PageButton>\n <span className=\"px-2 text-[11px] text-fg-muted tabular-nums\">\n {currentPage} / {totalPages}\n </span>\n <PageButton\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n label=\"Next\"\n >\n <svg className=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M9 5l7 7-7 7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </PageButton>\n </div>\n </div>\n )\n}\n\nfunction PageButton({\n children,\n disabled,\n onClick,\n label,\n}: {\n children: React.ReactNode\n disabled: boolean\n onClick: () => void\n label: string\n}) {\n return (\n <button\n aria-label={label}\n className={cx(\n 'rounded p-1 text-fg-muted transition-colors',\n focusCls,\n disabled ? 'cursor-not-allowed opacity-30' : 'hover:bg-bg-tertiary hover:text-fg',\n )}\n disabled={disabled}\n onClick={onClick}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import { useState } from 'react'\n\nimport { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\nimport type { BatchAction, DataColumn } from './data-table-types'\nimport { getLabel } from './data-table-utils'\n\ntype DataTableToolbarProps<T> = {\n // global filter\n globalFilter?: boolean\n globalFilterValue?: string\n globalFilterPlaceholder?: string\n onGlobalFilterChange?: (value: string) => void\n // column toggle\n columnToggle?: boolean\n columns?: DataColumn<T>[]\n hiddenColumns?: Set<string>\n onToggleColumn?: (key: string) => void\n // export\n exportCsv?: boolean\n onExport?: () => void\n // batch actions\n batchActions?: BatchAction[]\n selectedKeys?: Set<string>\n // caption\n caption?: React.ReactNode\n title?: string\n subtitle?: string\n toolbarActions?: React.ReactNode\n}\n\nexport function DataTableToolbar<T>({\n globalFilter,\n globalFilterValue,\n globalFilterPlaceholder = 'Search...',\n onGlobalFilterChange,\n columnToggle,\n columns,\n hiddenColumns,\n onToggleColumn,\n exportCsv,\n onExport,\n batchActions,\n selectedKeys,\n caption,\n title,\n subtitle,\n toolbarActions,\n}: DataTableToolbarProps<T>) {\n const [showColumnMenu, setShowColumnMenu] = useState(false)\n const someSelected = selectedKeys !== undefined && selectedKeys.size > 0\n\n const hasContent = globalFilter === true\n || columnToggle === true\n || exportCsv === true\n || caption !== undefined\n || title !== undefined\n || toolbarActions !== undefined\n || someSelected\n\n if (!hasContent) return null\n\n return (\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n {caption !== undefined && (\n <span className=\"text-xs font-semibold text-fg\">{caption}</span>\n )}\n {caption === undefined && title !== undefined && (\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-xs font-semibold text-fg\">{title}</span>\n {subtitle !== undefined && <span className=\"text-[11px] text-fg-muted\">{subtitle}</span>}\n </div>\n )}\n {toolbarActions !== undefined && (\n <div className=\"flex items-center gap-1\">{toolbarActions}</div>\n )}\n\n {someSelected && batchActions !== undefined && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[11px] text-fg-muted\">{selectedKeys.size} selected</span>\n {batchActions.map((action) => (\n <button\n key={action.label}\n className={cx(\n 'rounded px-2 py-0.5 text-[11px] font-medium transition-colors',\n focusCls,\n action.variant === 'danger'\n ? 'text-danger hover:bg-danger/10'\n : 'text-fg hover:bg-bg-tertiary',\n )}\n onClick={() => action.onClick(selectedKeys)}\n type=\"button\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"ml-auto flex items-center gap-2\">\n {globalFilter === true && (\n <input\n className={cx(\n 'w-48 rounded border border-border bg-bg px-2.5 py-1 text-[11px] text-fg outline-none placeholder:text-fg-muted/50',\n focusCls,\n )}\n placeholder={globalFilterPlaceholder}\n value={globalFilterValue ?? ''}\n onChange={(e) => onGlobalFilterChange?.(e.target.value)}\n />\n )}\n\n {columnToggle === true && columns !== undefined && (\n <div className=\"relative\">\n <button\n className={cx(\n 'rounded p-1 text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={() => setShowColumnMenu((v) => !v)}\n title=\"Toggle columns\"\n type=\"button\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M12 3v18M3 12h18\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {showColumnMenu && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-40 rounded border border-border bg-bg p-1 shadow-lg\">\n {columns.map((col) => (\n <label key={col.key} className=\"flex items-center gap-2 rounded px-2 py-1 text-[11px] text-fg hover:bg-bg-tertiary\">\n <input\n type=\"checkbox\"\n checked={hiddenColumns === undefined || !hiddenColumns.has(col.key)}\n onChange={() => onToggleColumn?.(col.key)}\n className=\"accent-accent\"\n />\n {getLabel(col)}\n </label>\n ))}\n </div>\n )}\n </div>\n )}\n\n {exportCsv === true && (\n <button\n className={cx(\n 'rounded p-1 text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={onExport}\n title=\"Export CSV\"\n type=\"button\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )\n}\n","// data-table — feature-rich data table with sorting, pagination, selection, filtering\nimport type { ReactNode } from 'react'\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../../utils/cx'\nimport { glassSurface } from '../../utils/glass'\nimport { DataTableBody } from './data-table-body'\nimport { DataTableHead } from './data-table-head'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableToolbar } from './data-table-toolbar'\nimport type { DataTableProps } from './data-table-types'\nimport { downloadCsv, resolveRowKey } from './data-table-utils'\n\nfunction DataTableInner<T>(\n props: DataTableProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n columns: allColumns,\n className,\n glass,\n // backward compat\n rows: rowsProp,\n data: dataProp,\n emptyMessage: emptyMessageProp,\n emptyText: emptyTextProp,\n // sort\n sortKey,\n sortDir,\n onSort,\n // pagination\n page: pageProp,\n pageSize: pageSizeProp,\n pageSizeOptions,\n totalRows: totalRowsProp,\n onPageChange,\n onPageSizeChange,\n // selection\n selectable,\n selectedKeys,\n onToggleSelect,\n onToggleSelectAll,\n // global filter\n globalFilter,\n globalFilterValue,\n globalFilterPlaceholder,\n onGlobalFilterChange,\n highlightMatches,\n // column filters\n columnFilters,\n onColumnFilterChange,\n // expand\n expandedKeys,\n onToggleExpand,\n renderExpanded,\n // batch actions\n batchActions,\n // column toggle\n columnToggle,\n // csv export\n exportCsv,\n exportFilename = 'export',\n // density\n density,\n // visual\n striped,\n bordered,\n stickyHeader,\n rowNumbers,\n highlightOnHover,\n // row customization\n rowKey,\n getRowClassName,\n getRowHidden,\n onRowClick,\n // states\n loading,\n loadingRows,\n error,\n emptyIcon,\n // structural\n caption,\n title,\n subtitle,\n toolbarActions,\n footer,\n // actions\n actions,\n } = props\n\n // backward compat\n const resolvedRows = rowsProp ?? dataProp\n const allRows = useMemo(() => (resolvedRows ?? []) as T[], [resolvedRows])\n const emptyMessage = emptyMessageProp ?? emptyTextProp ?? 'No data'\n\n // column toggle state (local)\n const [hiddenColumns, setHiddenColumns] = useState<Set<string>>(new Set())\n\n function handleToggleColumn(key: string) {\n setHiddenColumns((prev) => {\n const next = new Set(prev)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n return next\n })\n }\n\n // visible columns\n const visibleColumns = useMemo(\n () => allColumns.filter((c) => c.hidden !== true && !hiddenColumns.has(c.key)),\n [allColumns, hiddenColumns],\n )\n\n // filter hidden rows\n const filteredRows = useMemo(() => {\n if (getRowHidden === undefined) return allRows\n return allRows.filter((r) => !getRowHidden(r))\n }, [allRows, getRowHidden])\n\n // pagination\n const hasPagination = pageSizeProp !== undefined && onPageChange !== undefined\n const currentPage = pageProp ?? 1\n const pageSize = pageSizeProp ?? filteredRows.length\n const totalRows = totalRowsProp ?? filteredRows.length\n const totalPages = Math.max(1, Math.ceil(totalRows / pageSize))\n\n const displayRows = useMemo(() => {\n if (!hasPagination) return filteredRows\n // only slice if not server-side (totalRowsProp means server handles slicing)\n if (totalRowsProp !== undefined) return filteredRows\n const start = (currentPage - 1) * pageSize\n return filteredRows.slice(start, start + pageSize)\n }, [filteredRows, hasPagination, currentPage, pageSize, totalRowsProp])\n\n const pageOffset = hasPagination && totalRowsProp === undefined ? (currentPage - 1) * pageSize : 0\n\n // selection\n const hasSelection = selectable === true && onToggleSelect !== undefined\n const allRowKeys = useMemo(\n () => displayRows.map((r, i) => resolveRowKey(r, rowKey, pageOffset + i)),\n [displayRows, rowKey, pageOffset],\n )\n const allSelected = hasSelection && selectedKeys !== undefined && selectedKeys.size > 0 && allRowKeys.every((k) => selectedKeys.has(k))\n const someSelected = hasSelection && selectedKeys !== undefined && selectedKeys.size > 0\n\n function handleToggleSelectAll() {\n if (onToggleSelectAll !== undefined) {\n onToggleSelectAll(allSelected)\n }\n }\n\n // highlight\n const highlightQuery = highlightMatches !== false && globalFilter === true ? globalFilterValue : undefined\n\n // export\n function handleExport() {\n downloadCsv(visibleColumns, filteredRows, exportFilename)\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-hidden gds-radius-popover border',\n glass === true\n ? cx(glassSurface(glass), 'bg-bg/60')\n : 'border-border bg-surface',\n className,\n )}\n data-component=\"data-table\"\n data-state={loading === true ? 'loading' : undefined}\n >\n <DataTableToolbar\n globalFilter={globalFilter}\n globalFilterValue={globalFilterValue}\n globalFilterPlaceholder={globalFilterPlaceholder}\n onGlobalFilterChange={onGlobalFilterChange}\n columnToggle={columnToggle}\n columns={allColumns}\n hiddenColumns={hiddenColumns}\n onToggleColumn={handleToggleColumn}\n exportCsv={exportCsv}\n onExport={handleExport}\n batchActions={batchActions}\n selectedKeys={selectedKeys}\n caption={caption}\n title={title}\n subtitle={subtitle}\n toolbarActions={toolbarActions}\n />\n\n <div className=\"overflow-auto\">\n <table className=\"w-full border-collapse\">\n <DataTableHead\n columns={visibleColumns}\n density={density}\n sortKey={sortKey}\n sortDir={sortDir}\n onSort={onSort}\n stickyHeader={stickyHeader}\n rowNumbers={rowNumbers}\n hasSelection={hasSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onToggleSelectAll={handleToggleSelectAll}\n hasActions={actions !== undefined}\n hasExpand={renderExpanded !== undefined && onToggleExpand !== undefined}\n bordered={bordered}\n columnFilters={columnFilters}\n onColumnFilterChange={onColumnFilterChange}\n />\n <DataTableBody\n columns={visibleColumns}\n rows={displayRows}\n density={density}\n loading={loading}\n loadingRows={loadingRows}\n error={error}\n emptyMessage={emptyMessage}\n emptyIcon={emptyIcon}\n striped={striped}\n bordered={bordered}\n highlightOnHover={highlightOnHover}\n rowNumbers={rowNumbers}\n rowKey={rowKey}\n getRowClassName={getRowClassName}\n onRowClick={onRowClick}\n hasSelection={hasSelection}\n selectedKeys={selectedKeys}\n onToggleSelect={onToggleSelect}\n expandedKeys={expandedKeys}\n onToggleExpand={onToggleExpand}\n renderExpanded={renderExpanded}\n actions={actions}\n highlightQuery={highlightQuery}\n pageOffset={pageOffset}\n />\n </table>\n </div>\n\n {footer !== undefined && (\n <div className=\"border-t border-border px-3 py-2 text-xs text-fg-muted\">{footer}</div>\n )}\n\n {hasPagination && (\n <DataTablePagination\n currentPage={currentPage}\n totalPages={totalPages}\n totalRows={totalRows}\n pageSize={pageSize}\n pageSizeOptions={pageSizeOptions}\n visibleRowCount={displayRows.length}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n )}\n </div>\n )\n}\n\nexport const DataTable = forwardRef(DataTableInner) as <T = Record<string, unknown>>(\n props: DataTableProps<T> & { ref?: React.Ref<HTMLDivElement> },\n) => ReactNode\n","// date-picker — input with calendar dropdown\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { useClickOutside, useEscapeKey } from '../utils/hooks'\nimport { Calendar } from './calendar'\n\nexport type DatePickerProps = {\n value?: Date\n onChange?: (date: Date) => void\n placeholder?: string\n min?: Date\n max?: Date\n glass?: boolean\n className?: string\n}\n\nfunction formatDate(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n function DatePicker({ value, onChange, placeholder = 'Select date', min, max, glass, className }, ref) {\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const close = useCallback(() => setOpen(false), [])\n useClickOutside(containerRef, open, close)\n useEscapeKey(open, close)\n\n const handleSelect = (date: Date) => {\n if (onChange !== undefined) onChange(date)\n setOpen(false)\n }\n\n return (\n <div\n ref={ref}\n className={cx('relative inline-block', className)}\n data-component=\"date-picker\"\n data-state={open ? 'open' : 'closed'}\n >\n <div ref={containerRef}>\n <button\n type=\"button\"\n className={cx(\n 'flex gds-h-lg items-center gds-gap-sm gds-radius-button border gds-pad-x text-sm transition-colors',\n focusCls,\n glass === true\n ? cx(glassClass(glass), 'border-white/10 bg-bg/60')\n : 'border-border bg-surface',\n value !== undefined ? 'text-fg' : 'text-fg-muted',\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <svg className=\"h-4 w-4 text-fg-muted\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"1.5\" />\n <path d=\"M2 6.5H14M5 1.5V4M11 1.5V4\" />\n </svg>\n {value !== undefined ? formatDate(value) : placeholder}\n </button>\n\n {open && (\n <div className=\"absolute left-0 top-full z-50 mt-1 animate-popup\">\n <Calendar\n value={value}\n onChange={handleSelect}\n min={min}\n max={max}\n />\n </div>\n )}\n </div>\n </div>\n )\n },\n)\n","// deploy-log — CI/deploy log table with status badges\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DeployLogEntry = { project: string; device: string; version: string; status: 'failure' | 'pending' | 'success'; timestamp: string }\nexport type DeployLogProps = { entries: DeployLogEntry[]; className?: string }\n\nconst statusCls: Record<DeployLogEntry['status'], string> = { success: 'bg-success/15 text-success', failure: 'bg-danger/15 text-danger', pending: 'bg-warning/15 text-warning' }\n\nexport const DeployLog = forwardRef<HTMLDivElement, DeployLogProps>(\n function DeployLog({ entries, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-radius-popover overflow-hidden border border-border', className)}\n data-component=\"deploy-log\"\n >\n <table className=\"w-full\">\n <thead>\n <tr className=\"bg-bg-tertiary/50 text-left gds-text-body text-fg-muted\">\n <th className=\"px-3 py-1.5 font-medium\">Project</th>\n <th className=\"px-3 py-1.5 font-medium\">Device</th>\n <th className=\"px-3 py-1.5 font-medium\">Version</th>\n <th className=\"px-3 py-1.5 font-medium\">Status</th>\n <th className=\"px-3 py-1.5 font-medium\">Time</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((e, i) => (\n <tr key={`${e.project}-${e.timestamp}-${i}`} className=\"border-t border-border gds-text-body hover:bg-bg-tertiary/30 transition-colors\">\n <td className=\"px-3 py-1.5 font-medium text-fg\">{e.project}</td>\n <td className=\"px-3 py-1.5 text-fg-muted\">{e.device}</td>\n <td className=\"px-3 py-1.5 font-mono text-fg-muted\">{e.version}</td>\n <td className=\"px-3 py-1.5\">\n <span className={cx('rounded-full px-2 py-0.5 text-[10px] font-medium', statusCls[e.status])}>\n {e.status}\n </span>\n </td>\n <td className=\"px-3 py-1.5 text-fg-muted\">{e.timestamp}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n","// description-list — semantic dt/dd pairs with layout options\nimport type { ReactNode } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type DescriptionListItem = {\n term: string\n description: ReactNode\n}\n\nexport type DescriptionListProps = {\n items: DescriptionListItem[]\n layout?: 'stacked' | 'horizontal'\n dividers?: boolean\n className?: string\n}\n\nexport function DescriptionList({\n items,\n layout = 'stacked',\n dividers = true,\n className,\n}: DescriptionListProps) {\n const isHorizontal = layout === 'horizontal'\n\n return (\n <dl\n className={cx('gds-text-body', className)}\n data-component=\"description-list\"\n data-variant={layout}\n >\n {items.map((item, i) => (\n <div\n key={item.term}\n className={cx(\n 'gds-pad-x gds-pad-y-sm',\n isHorizontal && 'grid grid-cols-[1fr_2fr] gap-4',\n dividers && i < items.length - 1 && 'border-b border-border',\n )}\n >\n <dt className=\"font-medium text-fg-muted\">{item.term}</dt>\n <dd className={cx('text-fg', isHorizontal ? '' : 'mt-1')}>{item.description}</dd>\n </div>\n ))}\n </dl>\n )\n}\n","// diff-algorithm — pure LCS diff computation (no React dependency)\n\ntype DiffLine = {\n type: 'added' | 'removed' | 'unchanged'\n content: string\n oldLineNum: number | null\n newLineNum: number | null\n}\n\n// simple line-by-line diff using longest common subsequence\nfunction computeLcs(oldLines: string[], newLines: string[]): DiffLine[] {\n const m = oldLines.length\n const n = newLines.length\n\n // build LCS table\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0))\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (oldLines[i - 1] === newLines[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])\n }\n }\n }\n\n // backtrack to produce diff\n const result: DiffLine[] = []\n let i = m\n let j = n\n while (i > 0 && j > 0) {\n if (oldLines[i - 1] === newLines[j - 1]) {\n result.unshift({ type: 'unchanged', content: oldLines[i - 1], oldLineNum: i, newLineNum: j })\n i--\n j--\n } else if (dp[i - 1][j] >= dp[i][j - 1]) {\n result.unshift({ type: 'removed', content: oldLines[i - 1], oldLineNum: i, newLineNum: null })\n i--\n } else {\n result.unshift({ type: 'added', content: newLines[j - 1], oldLineNum: null, newLineNum: j })\n j--\n }\n }\n while (i > 0) {\n result.unshift({ type: 'removed', content: oldLines[i - 1], oldLineNum: i, newLineNum: null })\n i--\n }\n while (j > 0) {\n result.unshift({ type: 'added', content: newLines[j - 1], oldLineNum: null, newLineNum: j })\n j--\n }\n\n return result\n}\n\nfunction lineClass(type: DiffLine['type']): string {\n if (type === 'added') return 'bg-success/10'\n if (type === 'removed') return 'bg-danger/10'\n return ''\n}\n\nfunction linePrefix(type: DiffLine['type']): string {\n if (type === 'added') return '+'\n if (type === 'removed') return '-'\n return ' '\n}\n\nexport { computeLcs, lineClass, linePrefix }\nexport type { DiffLine }\n","// diff-viewer — side-by-side or unified text diff viewer\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { DiffLine } from './diff-algorithm'\nimport { computeLcs, lineClass, linePrefix } from './diff-algorithm'\n\nexport type DiffViewerProps = {\n oldText: string\n newText: string\n mode?: 'split' | 'unified'\n oldTitle?: string\n newTitle?: string\n glass?: boolean\n className?: string\n}\n\nfunction UnifiedView({ lines }: { lines: DiffLine[] }) {\n return (\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {lines.map((line, idx) => (\n <tr key={idx} className={lineClass(line.type)}>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line.oldLineNum ?? ''}\n </td>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line.newLineNum ?? ''}\n </td>\n <td className=\"w-4 select-none text-center text-fg-muted/70\">\n {linePrefix(line.type)}\n </td>\n <td className=\"whitespace-pre px-2\">{line.content}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nfunction SplitView({ lines, oldTitle, newTitle }: {\n lines: DiffLine[]\n oldTitle: string\n newTitle: string\n}) {\n // separate into old and new columns\n const oldLines: Array<DiffLine | null> = []\n const newLines: Array<DiffLine | null> = []\n\n for (const line of lines) {\n if (line.type === 'unchanged') {\n oldLines.push(line)\n newLines.push(line)\n } else if (line.type === 'removed') {\n oldLines.push(line)\n newLines.push(null)\n } else {\n oldLines.push(null)\n newLines.push(line)\n }\n }\n\n return (\n <div className=\"grid grid-cols-2 divide-x divide-border\">\n <div>\n <div className=\"border-b border-border px-3 py-1.5 text-[10px] font-medium text-fg-muted select-none\">\n {oldTitle}\n </div>\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {oldLines.map((line, idx) => (\n <tr key={idx} className={line !== null ? lineClass(line.type) : ''}>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line?.oldLineNum ?? ''}\n </td>\n <td className=\"whitespace-pre px-2\">{line?.content ?? ''}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div>\n <div className=\"border-b border-border px-3 py-1.5 text-[10px] font-medium text-fg-muted select-none\">\n {newTitle}\n </div>\n <table className=\"w-full border-collapse font-mono text-xs\">\n <tbody>\n {newLines.map((line, idx) => (\n <tr key={idx} className={line !== null ? lineClass(line.type) : ''}>\n <td className=\"w-10 select-none pr-2 text-right text-fg-muted/50\">\n {line?.newLineNum ?? ''}\n </td>\n <td className=\"whitespace-pre px-2\">{line?.content ?? ''}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport const DiffViewer = forwardRef<HTMLDivElement, DiffViewerProps>(\n function DiffViewer(\n { oldText, newText, mode = 'unified', oldTitle = 'Old', newTitle = 'New', glass, className },\n ref,\n ) {\n const lines = useMemo(() => {\n const oldLines = oldText.split('\\n')\n const newLines = newText.split('\\n')\n return computeLcs(oldLines, newLines)\n }, [oldText, newText])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-auto gds-radius-popover border border-border',\n glass === true && 'bg-white/5 backdrop-blur-md',\n glass !== true && 'bg-bg-secondary',\n className,\n )}\n data-component=\"diff-viewer\"\n data-variant={mode}\n >\n {mode === 'split' ? (\n <SplitView lines={lines} oldTitle={oldTitle} newTitle={newTitle} />\n ) : (\n <UnifiedView lines={lines} />\n )}\n </div>\n )\n },\n)\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 17 5-5-5-5\", key: \"nf172w\" }],\n [\"path\", { d: \"M4 18v-2a4 4 0 0 1 4-4h12\", key: \"jmiej9\" }]\n];\nconst Forward = createLucideIcon(\"forward\", __iconNode);\n\nexport { __iconNode, Forward as default };\n//# sourceMappingURL=forward.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\",\n key: \"1miecu\"\n }\n ]\n];\nconst Paperclip = createLucideIcon(\"paperclip\", __iconNode);\n\nexport { __iconNode, Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m12 17-5-5 5-5\", key: \"1s3y5u\" }],\n [\"path\", { d: \"M22 18v-2a4 4 0 0 0-4-4H7\", key: \"1fcyog\" }],\n [\"path\", { d: \"m7 17-5-5 5-5\", key: \"1ed8i2\" }]\n];\nconst ReplyAll = createLucideIcon(\"reply-all\", __iconNode);\n\nexport { __iconNode, ReplyAll as default };\n//# sourceMappingURL=reply-all.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M20 18v-2a4 4 0 0 0-4-4H4\", key: \"5vmcpk\" }],\n [\"path\", { d: \"m9 17-5-5 5-5\", key: \"nvlc11\" }]\n];\nconst Reply = createLucideIcon(\"reply\", __iconNode);\n\nexport { __iconNode, Reply as default };\n//# sourceMappingURL=reply.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","// rich-text-editor — Tiptap-based WYSIWYG editor\n// wraps Tiptap via anti-corruption layer (utils/tiptap)\n// supports full mode (all extensions) and minimal mode (basic formatting)\n// mailrs uses this for email composition and signature editing\n\nimport type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { Editor } from '../utils/tiptap'\nimport {\n EditorContent,\n ExtCodeBlockLowlight,\n ExtImage,\n ExtLink,\n ExtPlaceholder,\n ExtTable,\n ExtTableCell,\n ExtTableHeader,\n ExtTableRow,\n ExtTaskItem,\n ExtTaskList,\n ExtUnderline,\n StarterKit,\n useEditor,\n} from '../utils/tiptap'\n\n// ---- types ----\n\nexport type ToolbarItem =\n | 'bold' | 'italic' | 'underline' | 'strikethrough'\n | 'code' | 'codeBlock'\n | 'heading'\n | 'blockquote'\n | 'bulletList' | 'orderedList' | 'taskList'\n | 'link' | 'image'\n | 'table'\n | 'divider'\n | '|'\n\nexport type RichTextEditorHandle = {\n focus: () => void\n getHTML: () => string\n getText: () => string\n getEditor: () => Editor | null\n setContent: (html: string) => void\n clearContent: () => void\n isEmpty: () => boolean\n}\n\nexport type RichTextEditorProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n /** HTML string, controlled */\n value?: string\n /** HTML string, uncontrolled */\n defaultValue?: string\n /** Fires on content change */\n onChange?: (html: string, text: string) => void\n placeholder?: string\n\n /** full = all extensions, minimal = basic formatting only */\n mode?: 'full' | 'minimal'\n\n /** show/hide toolbar, default true */\n toolbar?: boolean\n /** override default toolbar items */\n toolbarItems?: ToolbarItem[]\n\n /** image upload handler — returns URL or null on failure */\n onImageUpload?: (file: File) => Promise<string | null>\n\n /** Ctrl/Cmd+Enter handler */\n onSubmit?: () => void\n\n /** frosted glass effect */\n glass?: boolean\n className?: string\n}\n\n// ---- toolbar button config ----\n\ntype ToolbarButton = {\n key: ToolbarItem\n label: string\n shortcut?: string\n icon: ReactNode\n action: (editor: Editor) => void\n isActive: (editor: Editor) => boolean\n}\n\nfunction makeToolbarButtons(): ToolbarButton[] {\n return [\n {\n key: 'bold', label: 'Bold', shortcut: 'Ctrl+B',\n icon: <span className=\"font-bold\">B</span>,\n action: (e) => e.chain().focus().toggleBold().run(),\n isActive: (e) => e.isActive('bold'),\n },\n {\n key: 'italic', label: 'Italic', shortcut: 'Ctrl+I',\n icon: <span className=\"italic\">I</span>,\n action: (e) => e.chain().focus().toggleItalic().run(),\n isActive: (e) => e.isActive('italic'),\n },\n {\n key: 'underline', label: 'Underline', shortcut: 'Ctrl+U',\n icon: <span className=\"underline\">U</span>,\n action: (e) => e.chain().focus().toggleUnderline().run(),\n isActive: (e) => e.isActive('underline'),\n },\n {\n key: 'strikethrough', label: 'Strikethrough',\n icon: <span className=\"line-through\">S</span>,\n action: (e) => e.chain().focus().toggleStrike().run(),\n isActive: (e) => e.isActive('strike'),\n },\n {\n key: 'code', label: 'Inline Code',\n icon: <span className=\"font-mono text-[11px]\">&lt;/&gt;</span>,\n action: (e) => e.chain().focus().toggleCode().run(),\n isActive: (e) => e.isActive('code'),\n },\n {\n key: 'codeBlock', label: 'Code Block',\n icon: <span className=\"font-mono text-[10px]\">{'{ }'}</span>,\n action: (e) => e.chain().focus().toggleCodeBlock().run(),\n isActive: (e) => e.isActive('codeBlock'),\n },\n {\n key: 'heading', label: 'Heading',\n icon: <span className=\"font-bold text-[11px]\">H</span>,\n action: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (e) => e.isActive('heading'),\n },\n {\n key: 'blockquote', label: 'Blockquote',\n icon: <span className=\"text-[13px]\">\"</span>,\n action: (e) => e.chain().focus().toggleBlockquote().run(),\n isActive: (e) => e.isActive('blockquote'),\n },\n {\n key: 'bulletList', label: 'Bullet List',\n icon: <span className=\"text-[11px]\">•</span>,\n action: (e) => e.chain().focus().toggleBulletList().run(),\n isActive: (e) => e.isActive('bulletList'),\n },\n {\n key: 'orderedList', label: 'Ordered List',\n icon: <span className=\"text-[11px]\">1.</span>,\n action: (e) => e.chain().focus().toggleOrderedList().run(),\n isActive: (e) => e.isActive('orderedList'),\n },\n {\n key: 'taskList', label: 'Task List',\n icon: <span className=\"text-[11px]\">☑</span>,\n action: (e) => e.chain().focus().toggleTaskList().run(),\n isActive: (e) => e.isActive('taskList'),\n },\n {\n key: 'link', label: 'Link',\n icon: <span className=\"text-[11px]\">🔗</span>,\n action: (e) => {\n if (typeof window === 'undefined') return\n const url = window.prompt('Enter URL')\n if (url !== null && url !== '') {\n e.chain().focus().setLink({ href: url }).run()\n }\n },\n isActive: (e) => e.isActive('link'),\n },\n {\n key: 'image', label: 'Image',\n icon: <span className=\"text-[11px]\">🖼</span>,\n action: (e) => {\n if (typeof window === 'undefined') return\n const url = window.prompt('Enter image URL')\n if (url !== null && url !== '') {\n e.chain().focus().setImage({ src: url }).run()\n }\n },\n isActive: () => false,\n },\n {\n key: 'table', label: 'Table',\n icon: <span className=\"text-[10px]\">⊞</span>,\n action: (e) => e.chain().focus().insertTable({ rows: 3, cols: 3 }).run(),\n isActive: () => false,\n },\n {\n key: 'divider', label: 'Divider',\n icon: <span className=\"text-[11px]\">—</span>,\n action: (e) => e.chain().focus().setHorizontalRule().run(),\n isActive: () => false,\n },\n ]\n}\n\nconst DEFAULT_FULL_ITEMS: ToolbarItem[] = [\n 'bold', 'italic', 'underline', 'strikethrough',\n '|', 'code', 'codeBlock',\n '|', 'heading', 'blockquote',\n '|', 'bulletList', 'orderedList', 'taskList',\n '|', 'link', 'image', 'table', 'divider',\n]\n\nconst DEFAULT_MINIMAL_ITEMS: ToolbarItem[] = [\n 'bold', 'italic', 'underline',\n '|', 'link',\n]\n\n// ---- component ----\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(\n function RichTextEditor({\n value,\n defaultValue,\n onChange,\n placeholder,\n mode = 'full',\n toolbar: showToolbar = true,\n toolbarItems,\n onImageUpload,\n onSubmit,\n glass,\n className,\n ...props\n }, ref) {\n const isControlled = value !== undefined\n const initialContent = value ?? defaultValue ?? ''\n\n // build extensions based on mode\n const extensions = useMemo(() => {\n if (mode === 'minimal') {\n return [\n StarterKit.configure({\n code: false,\n codeBlock: false,\n heading: false,\n blockquote: false,\n }),\n ExtLink.configure({ autolink: true, openOnClick: false }),\n ExtUnderline,\n ExtPlaceholder.configure({ placeholder: placeholder ?? '' }),\n ]\n }\n // full mode\n return [\n StarterKit.configure({ codeBlock: false }),\n ExtCodeBlockLowlight.configure({}),\n ExtImage.configure({ inline: true }),\n ExtLink.configure({\n autolink: true,\n openOnClick: false,\n HTMLAttributes: { target: '_blank', rel: 'noopener noreferrer' },\n }),\n ExtTable.configure({ resizable: true }),\n ExtTableRow,\n ExtTableCell,\n ExtTableHeader,\n ExtTaskList,\n ExtTaskItem.configure({ nested: true }),\n ExtUnderline,\n ExtPlaceholder.configure({ placeholder: placeholder ?? '' }),\n ]\n }, [mode, placeholder])\n\n const editor = useEditor({\n extensions,\n content: initialContent,\n onUpdate: ({ editor: e }) => {\n if (onChange !== undefined) {\n onChange(e.getHTML(), e.getText())\n }\n },\n })\n\n // sync controlled value\n useEffect(() => {\n if (isControlled && editor !== null && value !== editor.getHTML()) {\n editor.commands.setContent(value, { emitUpdate: false })\n }\n }, [isControlled, value, editor])\n\n // Ctrl/Cmd+Enter submit\n useEffect(() => {\n if (editor === null || onSubmit === undefined) return\n const handleKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n onSubmit()\n }\n }\n const el = editor.view.dom\n el.addEventListener('keydown', handleKeyDown)\n return () => el.removeEventListener('keydown', handleKeyDown)\n }, [editor, onSubmit])\n\n // image drop/paste handling\n useEffect(() => {\n if (editor === null || onImageUpload === undefined) return\n const handleDrop = async (event: DragEvent) => {\n const files = event.dataTransfer?.files\n if (files === undefined || files.length === 0) return\n for (const file of Array.from(files)) {\n if (file.type.startsWith('image/')) {\n event.preventDefault()\n const url = await onImageUpload(file)\n if (url !== null) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n }\n }\n const handlePaste = async (event: ClipboardEvent) => {\n const files = event.clipboardData?.files\n if (files === undefined || files.length === 0) return\n for (const file of Array.from(files)) {\n if (file.type.startsWith('image/')) {\n event.preventDefault()\n const url = await onImageUpload(file)\n if (url !== null) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n }\n }\n const el = editor.view.dom\n const dropHandler = (event: DragEvent) => { void handleDrop(event) }\n const pasteHandler = (event: ClipboardEvent) => { void handlePaste(event) }\n el.addEventListener('drop', dropHandler)\n el.addEventListener('paste', pasteHandler)\n return () => {\n el.removeEventListener('drop', dropHandler)\n el.removeEventListener('paste', pasteHandler)\n }\n }, [editor, onImageUpload])\n\n // imperative handle\n useImperativeHandle(ref, () => ({\n focus: () => editor?.commands.focus(),\n getHTML: () => editor?.getHTML() ?? '',\n getText: () => editor?.getText() ?? '',\n getEditor: () => editor,\n setContent: (html: string) => editor?.commands.setContent(html),\n clearContent: () => editor?.commands.clearContent(),\n isEmpty: () => editor?.isEmpty ?? true,\n }), [editor])\n\n // toolbar items\n const allButtons = useMemo(() => makeToolbarButtons(), [])\n const items = toolbarItems ?? (mode === 'full' ? DEFAULT_FULL_ITEMS : DEFAULT_MINIMAL_ITEMS)\n\n return (\n <div\n {...props}\n className={cx(\n 'flex flex-col border border-border gds-radius-input bg-surface overflow-hidden',\n glass === true && glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n className,\n )}\n data-component=\"rich-text-editor\"\n data-variant={mode}\n >\n {/* toolbar */}\n {showToolbar && editor !== null && (\n <div className=\"flex items-center flex-wrap gap-0.5 border-b border-border bg-bg-secondary px-2 py-1.5\" role=\"toolbar\" aria-label=\"Formatting options\">\n {items.map((item, i) => {\n if (item === '|') {\n return <div key={`sep-${i}`} className=\"mx-1 h-4 w-px bg-border\" role=\"separator\" />\n }\n const btn = allButtons.find(b => b.key === item)\n if (btn === undefined) return null\n const active = btn.isActive(editor)\n return (\n <button\n key={btn.key}\n type=\"button\"\n className={cx(\n 'flex items-center justify-center rounded px-1.5 py-1 text-xs transition-colors select-none',\n active\n ? 'bg-accent/15 text-accent'\n : 'text-fg-muted hover:bg-white/[0.04] hover:text-fg',\n )}\n onClick={() => btn.action(editor)}\n title={btn.shortcut !== undefined ? `${btn.label} (${btn.shortcut})` : btn.label}\n aria-pressed={active}\n aria-label={btn.label}\n >\n {btn.icon}\n </button>\n )\n })}\n </div>\n )}\n\n {/* editor content */}\n <div className=\"flex-1 min-h-[120px] overflow-y-auto\" data-selectable>\n <EditorContent\n editor={editor}\n className={cx(\n 'prose prose-sm max-w-none px-3 py-2 text-fg',\n 'prose-headings:text-fg prose-p:text-fg prose-a:text-accent',\n 'prose-strong:text-fg prose-em:text-fg',\n 'prose-code:bg-bg-tertiary prose-code:rounded prose-code:px-1 prose-code:text-[0.85em]',\n 'prose-pre:bg-bg-tertiary prose-pre:rounded-lg',\n 'prose-blockquote:border-accent/30',\n '[&_.tiptap]:outline-none [&_.tiptap]:min-h-[100px]',\n '[&_.tiptap_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)] [&_.tiptap_p.is-editor-empty:first-child::before]:text-fg-muted/30 [&_.tiptap_p.is-editor-empty:first-child::before]:float-left [&_.tiptap_p.is-editor-empty:first-child::before]:pointer-events-none [&_.tiptap_p.is-editor-empty:first-child::before]:h-0',\n )}\n />\n </div>\n </div>\n )\n },\n)\n","// email-composer — full-featured block-based email composition\n// supports new/reply/reply-all/forward modes with rich text editing\n// uses RichTextEditor for body, EmailComposerField for recipients\n\nimport { Paperclip, Send, X } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { EmailContact } from '../l4-molecules/email-composer-field'\nimport { EmailComposerField } from '../l4-molecules/email-composer-field'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { sanitizeEmailHtml } from '../utils/sanitize'\nimport type { RichTextEditorHandle } from './rich-text-editor'\nimport { RichTextEditor } from './rich-text-editor'\n\n// ---- types ----\n\nexport type EmailComposerMode = 'forward' | 'new' | 'reply' | 'reply-all'\n\nexport type ComposerBlock =\n | { type: 'text'; id: string; html: string; text: string }\n | { type: 'attachment'; id: string; file: File; name: string; size: number; mimeType: string }\n | { type: 'quote'; id: string; html: string; headerText: string; collapsed: boolean }\n | { type: 'signature'; id: string; html: string; text: string }\n | { type: 'divider'; id: string }\n\nexport type AssembledEmail = {\n html: string\n text: string\n attachments: File[]\n}\n\nexport type EmailComposerHandle = {\n focus: () => void\n getAssembled: () => AssembledEmail\n getEditorRef: () => RichTextEditorHandle | null\n addAttachment: (file: File) => void\n clearContent: () => void\n}\n\nexport type EmailComposerProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'ref'> & {\n /** compose mode */\n mode: EmailComposerMode\n\n /** recipients (controlled) */\n to: EmailContact[]\n onToChange: (contacts: EmailContact[]) => void\n cc?: EmailContact[]\n onCcChange?: (contacts: EmailContact[]) => void\n bcc?: EmailContact[]\n onBccChange?: (contacts: EmailContact[]) => void\n showCc?: boolean\n showBcc?: boolean\n\n /** subject */\n subject: string\n onSubjectChange: (subject: string) => void\n\n /** contact search */\n onContactSearch: (query: string) => Promise<EmailContact[]>\n\n /** image upload (passed to RichTextEditor) */\n onImageUpload?: (file: File) => Promise<string | null>\n\n /** initial quoted content (for reply/forward) */\n quotedHtml?: string\n quotedHeader?: string\n /** HTML signature */\n signature?: string\n\n /** actions */\n onSend: (email: AssembledEmail) => void\n onDiscard?: () => void\n onSaveDraft?: (email: AssembledEmail) => void\n\n /** submit button config */\n submitLabel?: string\n submitShortcut?: string\n\n /** extra action buttons in footer (e.g. AI Suggest, Polish) */\n footerActions?: ReactNode\n\n /** frosted glass effect */\n glass?: boolean\n className?: string\n}\n\n// ---- helpers ----\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction assembleEmail(\n bodyHtml: string,\n bodyText: string,\n attachments: File[],\n quotedHtml?: string,\n quotedHeader?: string,\n signatureHtml?: string,\n): AssembledEmail {\n const htmlParts: string[] = []\n const textParts: string[] = []\n\n // body\n htmlParts.push(bodyHtml)\n textParts.push(bodyText)\n\n // signature\n if (signatureHtml !== undefined && signatureHtml !== '') {\n htmlParts.push('<div style=\"margin-top:16px;border-top:1px solid #e5e5e5;padding-top:12px\">')\n htmlParts.push(signatureHtml)\n htmlParts.push('</div>')\n textParts.push('\\n-- \\n')\n }\n\n // quoted content\n if (quotedHtml !== undefined && quotedHtml !== '') {\n const header = quotedHeader ?? ''\n htmlParts.push(`<div style=\"margin-top:16px;padding-left:12px;border-left:3px solid #d1d5db;color:#6b7280\">`)\n if (header !== '') htmlParts.push(`<p style=\"margin-bottom:8px\">${header}</p>`)\n htmlParts.push(quotedHtml)\n htmlParts.push('</div>')\n if (header !== '') textParts.push(`\\n${header}\\n`)\n textParts.push('> (quoted content)')\n }\n\n return {\n html: htmlParts.join('\\n'),\n text: textParts.join('\\n'),\n attachments,\n }\n}\n\n// ---- component ----\n\nexport const EmailComposer = forwardRef<EmailComposerHandle, EmailComposerProps>(\n function EmailComposer({\n mode,\n to, onToChange,\n cc, onCcChange,\n bcc, onBccChange,\n showCc: initialShowCc,\n showBcc: initialShowBcc,\n subject, onSubjectChange,\n onContactSearch,\n onImageUpload,\n quotedHtml,\n quotedHeader,\n signature,\n onSend,\n onDiscard,\n onSaveDraft: _onSaveDraft,\n submitLabel,\n submitShortcut,\n footerActions,\n glass,\n className,\n ...props\n }, ref) {\n const [showCc, setShowCc] = useState(initialShowCc === true)\n const [showBcc, setShowBcc] = useState(initialShowBcc === true)\n const [attachments, setAttachments] = useState<File[]>([])\n const [quoteCollapsed, setQuoteCollapsed] = useState(true)\n const editorRef = useRef<RichTextEditorHandle>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // sanitize quoted HTML to prevent XSS\n const sanitizedQuotedHtml = useMemo(() => {\n if (quotedHtml === undefined || quotedHtml === '') return quotedHtml\n return sanitizeEmailHtml(quotedHtml)\n }, [quotedHtml])\n\n // assemble and send\n const handleSend = useCallback(() => {\n const html = editorRef.current?.getHTML() ?? ''\n const text = editorRef.current?.getText() ?? ''\n const email = assembleEmail(html, text, attachments, quotedHtml, quotedHeader, signature)\n onSend(email)\n }, [attachments, quotedHtml, quotedHeader, signature, onSend])\n\n // Ctrl/Cmd+Enter from anywhere in composer\n useEffect(() => {\n const handleKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n handleSend()\n }\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [handleSend])\n\n // file attachment\n const addFiles = useCallback((files: FileList | File[]) => {\n setAttachments(prev => [...prev, ...Array.from(files)])\n }, [])\n\n const removeAttachment = useCallback((index: number) => {\n setAttachments(prev => {\n const next = [...prev]\n next.splice(index, 1)\n return next\n })\n }, [])\n\n // drag drop on entire composer\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n const files = e.dataTransfer.files\n if (files.length > 0) addFiles(files)\n }, [addFiles])\n\n // imperative handle\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getAssembled: () => {\n const html = editorRef.current?.getHTML() ?? ''\n const text = editorRef.current?.getText() ?? ''\n return assembleEmail(html, text, attachments, quotedHtml, quotedHeader, signature)\n },\n getEditorRef: () => editorRef.current,\n addAttachment: (file: File) => setAttachments(prev => [...prev, file]),\n clearContent: () => {\n editorRef.current?.clearContent()\n setAttachments([])\n },\n }), [attachments, quotedHtml, quotedHeader, signature])\n\n const sendLabel = submitLabel ?? 'Send'\n const shortcutHint = submitShortcut ?? 'Ctrl+Enter'\n\n return (\n <div\n {...props}\n className={cx(\n 'flex flex-col border border-border gds-radius-card bg-surface overflow-hidden',\n glass === true && glassClass(glass),\n glass === true && 'border-white/10 bg-bg/60',\n className,\n )}\n data-component=\"email-composer\"\n data-variant={mode}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n >\n {/* recipient fields */}\n <div className=\"flex flex-col border-b border-border\">\n <div className=\"flex items-center\">\n <div className=\"flex-1\">\n <EmailComposerField\n label=\"To\"\n value={to}\n onChange={onToChange}\n onSearch={onContactSearch}\n />\n </div>\n {!showCc && !showBcc && (\n <div className=\"shrink-0 flex gap-1.5 px-2\">\n <button\n type=\"button\"\n className=\"gds-text-label text-fg-muted hover:text-accent transition-colors\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n <button\n type=\"button\"\n className=\"gds-text-label text-fg-muted hover:text-accent transition-colors\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n </div>\n )}\n </div>\n\n {showCc && onCcChange !== undefined && (\n <EmailComposerField\n label=\"Cc\"\n value={cc ?? []}\n onChange={onCcChange}\n onSearch={onContactSearch}\n />\n )}\n\n {showBcc && onBccChange !== undefined && (\n <EmailComposerField\n label=\"Bcc\"\n value={bcc ?? []}\n onChange={onBccChange}\n onSearch={onContactSearch}\n />\n )}\n </div>\n\n {/* subject */}\n <div className=\"border-b border-border\">\n <input\n type=\"text\"\n value={subject}\n onChange={(e) => onSubjectChange(e.target.value)}\n placeholder=\"Subject\"\n className=\"w-full bg-transparent px-3 py-2.5 gds-text-body text-fg placeholder:text-fg-muted/30 outline-none\"\n />\n </div>\n\n {/* rich text body */}\n <div className=\"flex-1 min-h-0\">\n <RichTextEditor\n ref={editorRef}\n mode=\"full\"\n placeholder=\"Write your message...\"\n onImageUpload={onImageUpload}\n onSubmit={handleSend}\n className=\"border-0 rounded-none\"\n />\n </div>\n\n {/* attachments */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2 border-t border-border px-3 py-2\">\n {attachments.map((file, i) => (\n <div\n key={`${file.name}-${i}`}\n className=\"flex items-center gap-1.5 rounded-md bg-bg-secondary px-2 py-1 gds-text-label\"\n >\n <Paperclip className=\"h-3 w-3 text-fg-muted\" />\n <span className=\"truncate max-w-[140px] text-fg\">{file.name}</span>\n <span className=\"text-fg-muted\">{formatFileSize(file.size)}</span>\n <button\n type=\"button\"\n className=\"text-fg-muted hover:text-danger transition-colors\"\n onClick={() => removeAttachment(i)}\n aria-label={`Remove ${file.name}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* quoted content (reply/forward) */}\n {sanitizedQuotedHtml !== undefined && sanitizedQuotedHtml !== '' && (\n <div className=\"border-t border-border\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 w-full px-3 py-1.5 gds-text-label text-fg-muted hover:text-fg transition-colors\"\n onClick={() => setQuoteCollapsed(prev => !prev)}\n aria-expanded={!quoteCollapsed}\n aria-label={quoteCollapsed ? 'Show original message' : 'Hide original message'}\n >\n <svg\n className={cx('h-3 w-3 transition-transform', !quoteCollapsed && 'rotate-90')}\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n {quoteCollapsed ? 'Show original' : 'Hide original'}\n </button>\n {!quoteCollapsed && (\n <div\n className=\"px-3 pb-3 border-l-2 border-accent/20 ml-3 text-fg-muted gds-text-body\"\n dangerouslySetInnerHTML={{ __html: sanitizedQuotedHtml }}\n />\n )}\n </div>\n )}\n\n {/* footer: actions + send */}\n <div className=\"flex items-center justify-between border-t border-border px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* attachment button */}\n <button\n type=\"button\"\n className=\"flex items-center justify-center rounded p-1.5 text-fg-muted hover:text-fg hover:bg-white/[0.04] transition-colors\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach file\"\n aria-label=\"Attach file\"\n >\n <Paperclip className=\"h-4 w-4\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Choose files to attach\"\n onChange={(e) => {\n if (e.target.files !== null && e.target.files.length > 0) {\n addFiles(e.target.files)\n e.target.value = ''\n }\n }}\n />\n\n {/* extra footer actions (AI Suggest, Polish, etc.) */}\n {footerActions}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {onDiscard !== undefined && (\n <button\n type=\"button\"\n className=\"gds-text-body text-fg-muted hover:text-fg transition-colors px-2 py-1\"\n onClick={onDiscard}\n >\n Cancel\n </button>\n )}\n\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 gds-text-body font-medium text-accent-fg hover:bg-accent-hover transition-colors\"\n onClick={handleSend}\n title={`${sendLabel} (${shortcutHint})`}\n >\n <Send className=\"h-3.5 w-3.5\" />\n {sendLabel}\n </button>\n </div>\n </div>\n </div>\n )\n },\n)\n","// email-list-item — inbox list entry with sender, subject, preview, timestamp\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmailListItemProps = {\n sender: string\n senderAvatar?: string\n subject: string\n preview?: string\n timestamp: string\n unread?: boolean\n starred?: boolean\n selected?: boolean\n onClick?: () => void\n className?: string\n}\n\nexport const EmailListItem = forwardRef<HTMLDivElement, EmailListItemProps>(\n function EmailListItem({ sender, senderAvatar, subject, preview, timestamp, unread, starred, selected, onClick, className }, ref) {\n const isUnread = unread === true\n const avatarText = senderAvatar ?? sender.charAt(0).toUpperCase()\n\n return (\n <div\n ref={ref}\n role={onClick !== undefined ? 'button' : undefined}\n tabIndex={onClick !== undefined ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick !== undefined ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick()\n }\n } : undefined}\n className={cx(\n 'flex items-start gap-3 gds-pad-x gds-pad-y-sm gds-text-body select-none',\n onClick !== undefined && 'cursor-pointer hover:bg-bg-tertiary',\n selected === true && 'bg-accent/5',\n className,\n )}\n data-component=\"email-list-item\"\n data-state={isUnread ? 'unread' : 'read'}\n >\n {/* avatar */}\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-tertiary text-xs font-semibold text-fg-muted\">\n {avatarText}\n </div>\n\n {/* body */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {isUnread && <span className=\"h-2 w-2 shrink-0 rounded-full bg-accent\" />}\n <span className={cx('truncate', isUnread ? 'font-semibold text-fg' : 'text-fg')}>{sender}</span>\n {starred === true && <span className=\"shrink-0 text-warning\">★</span>}\n </div>\n <div className={cx('truncate', isUnread ? 'font-medium text-fg' : 'text-fg-muted')}>{subject}</div>\n {preview !== undefined && (\n <div className=\"truncate text-fg-muted/60\">{preview}</div>\n )}\n </div>\n\n {/* timestamp */}\n <span className=\"shrink-0 text-xs text-fg-muted\">{timestamp}</span>\n </div>\n )\n },\n)\n","// email-thread — renders email conversation threads with message bubbles,\n// HTML/text rendering, attachments, expand/collapse, and AI analysis panel\n\nimport {\n ChevronDown,\n ChevronRight,\n Download,\n FileText,\n Forward,\n Image as ImageIcon,\n Paperclip,\n Reply,\n ReplyAll,\n Sparkles,\n Trash2,\n} from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useMemo, useState } from 'react'\n\nimport { IconButton } from '../l2-primitives/icon-button'\nimport { Avatar } from '../l3-atoms/avatar'\nimport { Tooltip } from '../l3-atoms/tooltip'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { sanitizeEmailHtml } from '../utils/sanitize'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype EmailAttachment = {\n index: number\n filename: string\n mimeType: string\n size: number\n contentId?: string\n thumbnailUrl?: string\n}\n\ntype EmailAiAnalysis = {\n summary?: string\n people?: Array<{ name: string; role?: string; email?: string }>\n dates?: Array<{ text: string; context?: string }>\n amounts?: Array<{ value: string; currency?: string; context?: string }>\n actionItems?: string[]\n deadline?: string\n riskScore?: number\n riskReason?: string\n}\n\ntype EmailMessage = {\n id: string\n from: string\n fromName?: string\n to: string[]\n cc?: string[]\n date: string\n subject?: string\n textBody: string | null\n htmlBody: string | null\n isOwn: boolean\n attachments?: EmailAttachment[]\n aiAnalysis?: EmailAiAnalysis | null\n}\n\ntype EmailThreadProps = React.HTMLAttributes<HTMLDivElement> & {\n messages: EmailMessage[]\n\n defaultExpandedIds?: Set<string>\n expandAll?: boolean\n\n onReply?: (message: EmailMessage) => void\n onReplyAll?: (message: EmailMessage) => void\n onForward?: (message: EmailMessage) => void\n onDelete?: (message: EmailMessage) => void\n onPrint?: (message: EmailMessage) => void\n onDownloadRaw?: (message: EmailMessage) => void\n\n onAttachmentClick?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentDownload?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentExtractText?: (message: EmailMessage, attachment: EmailAttachment) => void\n\n showAiAnalysis?: boolean\n\n renderMessageActions?: (message: EmailMessage) => ReactNode\n renderAttachment?: (attachment: EmailAttachment, message: EmailMessage) => ReactNode\n\n glass?: boolean\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n const now = new Date()\n const diffMs = now.getTime() - d.getTime()\n const diffMin = Math.floor(diffMs / 60_000)\n if (diffMin < 1) return 'just now'\n if (diffMin < 60) return `${diffMin}m ago`\n const diffHr = Math.floor(diffMin / 60)\n if (diffHr < 24) return `${diffHr}h ago`\n const diffDay = Math.floor(diffHr / 24)\n if (diffDay < 7) return `${diffDay}d ago`\n return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' })\n}\n\nfunction isImageMime(mime: string): boolean {\n return mime.startsWith('image/')\n}\n\nfunction isPdfMime(mime: string): boolean {\n return mime === 'application/pdf'\n}\n\n// ---------------------------------------------------------------------------\n// EmailAttachmentPreview (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailAttachmentPreview({\n attachment,\n message,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n renderAttachment,\n}: {\n attachment: EmailAttachment\n message: EmailMessage\n onAttachmentClick?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentDownload?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentExtractText?: (message: EmailMessage, attachment: EmailAttachment) => void\n renderAttachment?: (attachment: EmailAttachment, message: EmailMessage) => ReactNode\n}) {\n if (renderAttachment !== undefined) {\n return <>{renderAttachment(attachment, message)}</>\n }\n\n const isImage = isImageMime(attachment.mimeType)\n const isPdf = isPdfMime(attachment.mimeType)\n\n return (\n <div\n className={cx(\n 'flex items-center gap-2 rounded-md border border-border bg-bg-secondary p-2',\n onAttachmentClick !== undefined && 'cursor-pointer hover:bg-bg-tertiary',\n )}\n role={onAttachmentClick !== undefined ? 'button' : undefined}\n tabIndex={onAttachmentClick !== undefined ? 0 : undefined}\n onClick={onAttachmentClick !== undefined ? () => onAttachmentClick(message, attachment) : undefined}\n onKeyDown={onAttachmentClick !== undefined ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onAttachmentClick(message, attachment)\n }\n } : undefined}\n data-component=\"email-attachment-preview\"\n >\n {isImage && attachment.thumbnailUrl !== undefined ? (\n <img\n src={attachment.thumbnailUrl}\n alt={attachment.filename}\n className=\"h-10 w-10 rounded object-cover\"\n />\n ) : (\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded bg-bg-tertiary text-fg-muted\">\n {isImage && <ImageIcon size={18} />}\n {!isImage && isPdf && <FileText size={18} />}\n {!isImage && !isPdf && <Paperclip size={18} />}\n </span>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-fg\">{attachment.filename}</div>\n <div className=\"text-xs text-fg-muted\">{formatFileSize(attachment.size)}</div>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n {isPdf && onAttachmentExtractText !== undefined && (\n <Tooltip content=\"Extract text\">\n <IconButton\n size=\"sm\"\n icon={<FileText size={14} />}\n tooltip=\"Extract text\"\n onClick={(e) => {\n e.stopPropagation()\n onAttachmentExtractText(message, attachment)\n }}\n />\n </Tooltip>\n )}\n {onAttachmentDownload !== undefined && (\n <Tooltip content=\"Download\">\n <IconButton\n size=\"sm\"\n icon={<Download size={14} />}\n tooltip=\"Download attachment\"\n onClick={(e) => {\n e.stopPropagation()\n onAttachmentDownload(message, attachment)\n }}\n />\n </Tooltip>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailAiPanel (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailAiPanel({ analysis }: { analysis: EmailAiAnalysis }) {\n const [expanded, setExpanded] = useState(false)\n\n const hasSummary = analysis.summary !== undefined && analysis.summary.length > 0\n const hasDetails =\n (analysis.people !== undefined && analysis.people.length > 0) ||\n (analysis.dates !== undefined && analysis.dates.length > 0) ||\n (analysis.amounts !== undefined && analysis.amounts.length > 0) ||\n (analysis.actionItems !== undefined && analysis.actionItems.length > 0) ||\n analysis.deadline !== undefined ||\n analysis.riskScore !== undefined\n\n if (!hasSummary && !hasDetails) return null\n\n return (\n <div\n className=\"mt-2 rounded-md border border-accent/20 bg-accent/5 p-3\"\n data-component=\"email-ai-panel\"\n >\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 text-left text-xs font-medium text-accent\"\n onClick={() => setExpanded((p) => !p)}\n aria-expanded={expanded}\n aria-label=\"AI Analysis\"\n >\n <Sparkles size={14} />\n <span className=\"flex-1\">AI Analysis</span>\n {hasDetails && (expanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />)}\n </button>\n\n {hasSummary && (\n <p className=\"mt-1 text-xs text-fg-muted\">{analysis.summary}</p>\n )}\n\n {expanded && hasDetails && (\n <div className=\"mt-2 flex flex-col gap-2 text-xs\">\n {analysis.people !== undefined && analysis.people.length > 0 && (\n <div>\n <span className=\"font-medium text-fg\">People:</span>\n <ul className=\"mt-0.5 list-inside list-disc text-fg-muted\">\n {analysis.people.map((p, i) => (\n <li key={i}>\n {p.name}\n {p.role !== undefined && <span className=\"text-fg-muted/60\"> — {p.role}</span>}\n {p.email !== undefined && <span className=\"text-fg-muted/60\"> ({p.email})</span>}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.dates !== undefined && analysis.dates.length > 0 && (\n <div>\n <span className=\"font-medium text-fg\">Dates:</span>\n <ul className=\"mt-0.5 list-inside list-disc text-fg-muted\">\n {analysis.dates.map((d, i) => (\n <li key={i}>\n {d.text}\n {d.context !== undefined && <span className=\"text-fg-muted/60\"> — {d.context}</span>}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.amounts !== undefined && analysis.amounts.length > 0 && (\n <div>\n <span className=\"font-medium text-fg\">Amounts:</span>\n <ul className=\"mt-0.5 list-inside list-disc text-fg-muted\">\n {analysis.amounts.map((a, i) => (\n <li key={i}>\n {a.value}\n {a.currency !== undefined && <span> {a.currency}</span>}\n {a.context !== undefined && <span className=\"text-fg-muted/60\"> — {a.context}</span>}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.actionItems !== undefined && analysis.actionItems.length > 0 && (\n <div>\n <span className=\"font-medium text-fg\">Action Items:</span>\n <ul className=\"mt-0.5 list-inside list-disc text-fg-muted\">\n {analysis.actionItems.map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n </div>\n )}\n\n {analysis.deadline !== undefined && (\n <div>\n <span className=\"font-medium text-danger\">Deadline:</span>{' '}\n <span className=\"text-danger\">{analysis.deadline}</span>\n </div>\n )}\n\n {analysis.riskScore !== undefined && (\n <div>\n <span className=\"font-medium text-warning\">Risk: {analysis.riskScore}/10</span>\n {analysis.riskReason !== undefined && (\n <span className=\"text-fg-muted\"> — {analysis.riskReason}</span>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailMessageBubble (internal)\n// ---------------------------------------------------------------------------\n\nfunction EmailMessageBubble({\n message,\n isExpanded,\n onToggleExpand,\n onReply,\n onReplyAll,\n onForward,\n onDelete,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n showAiAnalysis,\n renderMessageActions,\n renderAttachment,\n}: {\n message: EmailMessage\n isExpanded: boolean\n onToggleExpand: () => void\n onReply?: (message: EmailMessage) => void\n onReplyAll?: (message: EmailMessage) => void\n onForward?: (message: EmailMessage) => void\n onDelete?: (message: EmailMessage) => void\n onAttachmentClick?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentDownload?: (message: EmailMessage, attachment: EmailAttachment) => void\n onAttachmentExtractText?: (message: EmailMessage, attachment: EmailAttachment) => void\n showAiAnalysis?: boolean\n renderMessageActions?: (message: EmailMessage) => ReactNode\n renderAttachment?: (attachment: EmailAttachment, message: EmailMessage) => ReactNode\n}) {\n const displayName = message.fromName ?? message.from\n const hasAttachments = message.attachments !== undefined && message.attachments.length > 0\n const hasAiAnalysis = showAiAnalysis === true && message.aiAnalysis !== undefined && message.aiAnalysis !== null\n\n // Build sanitized HTML content\n const sanitizedHtml = useMemo(() => {\n if (message.htmlBody === null) return null\n return sanitizeEmailHtml(message.htmlBody)\n }, [message.htmlBody])\n\n // Render body content\n const bodyContent = useMemo(() => {\n if (sanitizedHtml !== null) {\n return (\n <div\n className=\"prose prose-sm max-w-none dark:prose-invert break-words [&_img]:max-w-full [&_img]:h-auto [&_table]:text-xs\"\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n />\n )\n }\n if (message.textBody !== null) {\n return (\n <pre className=\"whitespace-pre-wrap break-words text-sm text-fg font-sans leading-relaxed\">\n {message.textBody}\n </pre>\n )\n }\n return <p className=\"text-sm italic text-fg-muted\">No content</p>\n }, [sanitizedHtml, message.textBody])\n\n // Collapsed preview: first line of text\n const collapsedPreview = useMemo(() => {\n if (message.textBody !== null) {\n const lines = message.textBody.split('\\n').filter((l) => l.trim().length > 0)\n const preview = lines.slice(0, 3).join(' ')\n if (preview.length > 200) return `${preview.slice(0, 200)}…`\n return preview\n }\n if (message.htmlBody !== null) {\n // Strip tags for preview\n const text = message.htmlBody.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (text.length > 200) return `${text.slice(0, 200)}…`\n return text\n }\n return ''\n }, [message.textBody, message.htmlBody])\n\n const avatarEl = (\n <Avatar\n name={displayName}\n size=\"default\"\n />\n )\n\n const headerEl = (\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left\"\n onClick={onToggleExpand}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? `Collapse message from ${displayName}` : `Expand message from ${displayName}`}\n >\n {isExpanded ? <ChevronDown size={14} className=\"shrink-0 text-fg-muted\" /> : <ChevronRight size={14} className=\"shrink-0 text-fg-muted\" />}\n <span className=\"truncate text-sm font-medium text-fg\">{displayName}</span>\n <span className=\"truncate text-xs text-fg-muted\">&lt;{message.from}&gt;</span>\n </button>\n <span className=\"shrink-0 text-xs text-fg-muted\">{formatDate(message.date)}</span>\n </div>\n )\n\n const actionBar = renderMessageActions !== undefined ? (\n renderMessageActions(message)\n ) : (\n <div className=\"flex items-center gap-0.5\">\n {onReply !== undefined && (\n <Tooltip content=\"Reply\">\n <IconButton size=\"sm\" icon={<Reply size={14} />} tooltip=\"Reply\" onClick={() => onReply(message)} />\n </Tooltip>\n )}\n {onReplyAll !== undefined && (\n <Tooltip content=\"Reply All\">\n <IconButton size=\"sm\" icon={<ReplyAll size={14} />} tooltip=\"Reply all\" onClick={() => onReplyAll(message)} />\n </Tooltip>\n )}\n {onForward !== undefined && (\n <Tooltip content=\"Forward\">\n <IconButton size=\"sm\" icon={<Forward size={14} />} tooltip=\"Forward\" onClick={() => onForward(message)} />\n </Tooltip>\n )}\n {onDelete !== undefined && (\n <Tooltip content=\"Delete\">\n <IconButton size=\"sm\" variant=\"danger\" icon={<Trash2 size={14} />} tooltip=\"Delete\" onClick={() => onDelete(message)} />\n </Tooltip>\n )}\n </div>\n )\n\n const hasAnyAction = onReply !== undefined || onReplyAll !== undefined || onForward !== undefined || onDelete !== undefined || renderMessageActions !== undefined\n\n return (\n <div\n className={cx(\n 'flex gap-3',\n message.isOwn && 'flex-row-reverse',\n )}\n data-component=\"email-message-bubble\"\n data-state={isExpanded ? 'expanded' : 'collapsed'}\n data-own={message.isOwn ? 'true' : 'false'}\n >\n {/* Avatar */}\n <div className=\"shrink-0 pt-1\">{avatarEl}</div>\n\n {/* Content */}\n <div\n className={cx(\n 'min-w-0 flex-1 rounded-lg border gds-pad',\n message.isOwn\n ? 'border-accent/20 bg-accent/5'\n : 'border-border bg-bg-secondary',\n )}\n >\n {/* Header */}\n <div className=\"flex items-start gap-2\">\n {headerEl}\n {isExpanded && hasAnyAction && (\n <div className=\"shrink-0\">{actionBar}</div>\n )}\n </div>\n\n {/* Recipients (expanded only) */}\n {isExpanded && (\n <div className=\"mt-1 text-xs text-fg-muted\">\n <span>To: {message.to.join(', ')}</span>\n {message.cc !== undefined && message.cc.length > 0 && (\n <span className=\"ml-2\">Cc: {message.cc.join(', ')}</span>\n )}\n </div>\n )}\n\n {/* Body */}\n <div className=\"mt-2\">\n {isExpanded ? bodyContent : (\n <button\n type=\"button\"\n className=\"w-full text-left text-sm text-fg-muted\"\n onClick={onToggleExpand}\n aria-expanded={false}\n aria-label={`Expand message from ${displayName}`}\n >\n <span className=\"line-clamp-2\">{collapsedPreview}</span>\n <span className=\"text-xs text-accent\"> Show more</span>\n </button>\n )}\n </div>\n\n {/* Attachments (expanded only) */}\n {isExpanded && hasAttachments && (\n <div className=\"mt-3\">\n <div className=\"mb-1.5 flex items-center gap-1 text-xs font-medium text-fg-muted\">\n <Paperclip size={12} />\n <span>{message.attachments?.length ?? 0} attachment{(message.attachments?.length ?? 0) > 1 ? 's' : ''}</span>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {(message.attachments ?? []).map((att) => (\n <EmailAttachmentPreview\n key={att.index}\n attachment={att}\n message={message}\n onAttachmentClick={onAttachmentClick}\n onAttachmentDownload={onAttachmentDownload}\n onAttachmentExtractText={onAttachmentExtractText}\n renderAttachment={renderAttachment}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* AI Analysis (expanded only) */}\n {isExpanded && hasAiAnalysis && message.aiAnalysis !== undefined && message.aiAnalysis !== null && (\n <EmailAiPanel analysis={message.aiAnalysis} />\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailThread (exported)\n// ---------------------------------------------------------------------------\n\nconst EmailThread = forwardRef<HTMLDivElement, EmailThreadProps>(\n function EmailThread(\n {\n messages,\n defaultExpandedIds,\n expandAll,\n onReply,\n onReplyAll,\n onForward,\n onDelete,\n onPrint: _onPrint,\n onDownloadRaw: _onDownloadRaw,\n onAttachmentClick,\n onAttachmentDownload,\n onAttachmentExtractText,\n showAiAnalysis,\n renderMessageActions,\n renderAttachment,\n glass,\n className,\n ...props\n },\n ref,\n ) {\n // Build initial expanded set: default last message expanded\n const initialExpanded = useMemo(() => {\n if (expandAll === true) return new Set(messages.map((m) => m.id))\n if (defaultExpandedIds !== undefined) return new Set(defaultExpandedIds)\n // Default: expand last message\n if (messages.length > 0) return new Set([messages[messages.length - 1].id])\n return new Set<string>()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally stable, only computed once on mount\n }, [])\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(initialExpanded)\n\n // When expandAll changes, override local state\n const effectiveExpanded = expandAll === true\n ? new Set(messages.map((m) => m.id))\n : expandedIds\n\n const toggleExpand = useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n if (messages.length === 0) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col items-center justify-center py-12 text-fg-muted gds-text-body',\n glass === true && glassClass(glass),\n className,\n )}\n data-component=\"email-thread\"\n data-state=\"empty\"\n {...props}\n >\n <p>No messages</p>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col gds-gap',\n glass === true && glassClass(glass),\n className,\n )}\n data-component=\"email-thread\"\n role=\"list\"\n aria-label=\"Email thread\"\n {...props}\n >\n {messages.map((message) => (\n <div key={message.id} role=\"listitem\">\n <EmailMessageBubble\n message={message}\n isExpanded={effectiveExpanded.has(message.id)}\n onToggleExpand={() => toggleExpand(message.id)}\n onReply={onReply}\n onReplyAll={onReplyAll}\n onForward={onForward}\n onDelete={onDelete}\n onAttachmentClick={onAttachmentClick}\n onAttachmentDownload={onAttachmentDownload}\n onAttachmentExtractText={onAttachmentExtractText}\n showAiAnalysis={showAiAnalysis}\n renderMessageActions={renderMessageActions}\n renderAttachment={renderAttachment}\n />\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport { EmailThread }\nexport type { EmailAiAnalysis, EmailAttachment, EmailMessage, EmailThreadProps }\n","// embed — responsive embed container for iframes (videos, maps, etc)\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type EmbedProps = {\n src: string\n title?: string\n ratio?: number\n allowFullscreen?: boolean\n sandbox?: string\n loading?: 'eager' | 'lazy'\n glass?: boolean\n className?: string\n}\n\nexport const Embed = forwardRef<HTMLDivElement, EmbedProps>(\n function Embed(\n {\n src,\n title,\n ratio = 16 / 9,\n allowFullscreen = true,\n sandbox,\n loading = 'lazy',\n glass = false,\n className,\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n className={cx(\n 'relative w-full overflow-hidden border border-white/[0.06] gds-radius-card',\n glass && 'gds-glass',\n className,\n )}\n data-component=\"embed\"\n style={{ aspectRatio: ratio }}\n >\n <iframe\n src={src}\n title={title}\n className=\"absolute inset-0 h-full w-full border-none\"\n allowFullScreen={allowFullscreen}\n sandbox={sandbox}\n loading={loading}\n data-testid=\"embed-iframe\"\n />\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype EmployeeStatus = 'active' | 'inactive' | 'onboarding'\n\ntype EmployeeCardProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n department?: string\n email?: string\n name: string\n phone?: string\n role?: string\n status?: EmployeeStatus\n}\n\nconst statusCls: Record<EmployeeStatus, string> = {\n active: 'bg-success/15 text-success',\n inactive: 'bg-danger/15 text-danger',\n onboarding: 'bg-warning/15 text-warning',\n}\n\nexport const EmployeeCard = forwardRef<HTMLDivElement, EmployeeCardProps>(\n function EmployeeCard({ avatar, className, department, email, name, phone, role, status, ...props }, ref) {\n const initials = name.split(' ').map((w) => w[0]).join('').slice(0, 2).toUpperCase()\n\n return (\n <div\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\n data-component=\"employee-card\"\n ref={ref}\n {...props}\n >\n <div className=\"flex items-center gds-gap\">\n {avatar !== undefined ? (\n <img src={avatar} alt={name} className=\"h-12 w-12 rounded-full object-cover\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent\">\n {initials}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-semibold text-fg truncate\">{name}</div>\n {role !== undefined && <div className=\"text-xs text-fg-muted truncate\">{role}</div>}\n {department !== undefined && <div className=\"text-xs text-fg-muted truncate\">{department}</div>}\n </div>\n {status !== undefined && (\n <span className={cx('shrink-0 rounded-full px-2 py-0.5 text-xs font-medium', statusCls[status])}>\n {status}\n </span>\n )}\n </div>\n {(email !== undefined || phone !== undefined) && (\n <div className=\"mt-3 space-y-0.5 text-xs text-fg-muted\">\n {email !== undefined && <div>{email}</div>}\n {phone !== undefined && <div>{phone}</div>}\n </div>\n )}\n </div>\n )\n },\n)\n\nexport type { EmployeeCardProps, EmployeeStatus }\n","// error-boundary — catches render errors and shows fallback UI\nimport type { ErrorInfo, ReactNode } from 'react'\nimport { Component } from 'react'\n\nexport type ErrorBoundaryProps = {\n children: ReactNode\n fallback?: ReactNode | ((error: Error) => ReactNode)\n onError?: (error: Error, info: ErrorInfo) => void\n}\n\ntype ErrorBoundaryState = {\n error: Error | null\n}\n\nclass ErrorBoundaryClass extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n if (this.props.onError !== undefined) {\n this.props.onError(error, info)\n }\n }\n\n render() {\n const { error } = this.state\n const { children, fallback } = this.props\n\n if (error === null) {\n return children\n }\n\n if (fallback !== undefined) {\n if (typeof fallback === 'function') {\n return fallback(error)\n }\n return fallback\n }\n\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-2 gds-pad gds-text-body text-danger\"\n data-component=\"error-boundary\"\n >\n <p className=\"font-semibold\">Something went wrong</p>\n <p className=\"text-fg-muted gds-text-caption\">{error.message}</p>\n </div>\n )\n }\n}\n\nexport { ErrorBoundaryClass as ErrorBoundary }\n","// file-browser — table layout for file/folder navigation\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FileNode = {\n id: string\n name: string\n type: 'file' | 'folder'\n size?: number\n modified?: string\n icon?: ReactNode\n}\n\nexport type FileBrowserProps = {\n files: FileNode[]\n onNavigate?: (id: string) => void\n onSelect?: (id: string) => void\n selected?: string\n className?: string\n}\n\nfunction FolderIcon() {\n return (\n <svg className=\"h-4 w-4 text-warning\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1 3.5A1.5 1.5 0 012.5 2h3.379a1.5 1.5 0 011.06.44L8.062 3.5H13.5A1.5 1.5 0 0115 5v7.5a1.5 1.5 0 01-1.5 1.5h-11A1.5 1.5 0 011 12.5v-9z\" />\n </svg>\n )\n}\n\nfunction FileIcon() {\n return (\n <svg className=\"h-4 w-4 text-fg-muted\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\">\n <path d=\"M4 1.5h5l3.5 3.5V14a.5.5 0 01-.5.5H4a.5.5 0 01-.5-.5V2a.5.5 0 01.5-.5z\" />\n <path d=\"M9 1.5V5h3.5\" />\n </svg>\n )\n}\n\nfunction formatSize(bytes?: number): string {\n if (bytes === undefined) return '—'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport const FileBrowser = forwardRef<HTMLDivElement, FileBrowserProps>(\n function FileBrowser({ files, onNavigate, onSelect, selected, className }, ref) {\n const handleClick = (node: FileNode) => {\n if (node.type === 'folder' && onNavigate !== undefined) {\n onNavigate(node.id)\n } else if (node.type === 'file' && onSelect !== undefined) {\n onSelect(node.id)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('overflow-auto gds-radius-popover border border-border bg-surface', className)}\n data-component=\"file-browser\"\n >\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border bg-bg-secondary/50\">\n <th className=\"gds-pad-x gds-pad-y text-left gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Name\n </th>\n <th className=\"w-24 gds-pad-x gds-pad-y text-right gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Size\n </th>\n <th className=\"w-32 gds-pad-x gds-pad-y text-right gds-text-body font-medium uppercase tracking-wider text-fg-muted select-none\">\n Modified\n </th>\n </tr>\n </thead>\n <tbody>\n {files.length === 0 && (\n <tr>\n <td colSpan={3} className=\"gds-pad-x py-12 text-center text-sm text-fg-muted\">\n Empty folder\n </td>\n </tr>\n )}\n {files.map((node) => (\n <tr\n key={node.id}\n className={cx(\n 'border-b border-border transition-colors',\n focusCls,\n selected === node.id && 'bg-accent/10',\n selected !== node.id && 'hover:bg-bg-secondary/60',\n 'cursor-pointer',\n )}\n onClick={() => handleClick(node)}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick(node)\n }}\n >\n <td className=\"gds-pad-x gds-pad-y\">\n <div className=\"flex items-center gds-gap-sm text-fg\">\n {node.icon ?? (node.type === 'folder' ? <FolderIcon /> : <FileIcon />)}\n <span className={node.type === 'folder' ? 'font-medium' : ''}>\n {node.name}\n </span>\n </div>\n </td>\n <td className=\"gds-pad-x gds-pad-y text-right text-fg-muted\">\n {node.type === 'folder' ? '—' : formatSize(node.size)}\n </td>\n <td className=\"gds-pad-x gds-pad-y text-right text-fg-muted\">\n {node.modified ?? '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n","// file-card — file/document card with thumbnail, name, size, type badge, and actions\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { cx } from '../utils/cx'\n\ntype FileCardProps = {\n name: string\n size?: string\n type?: string\n thumbnail?: string\n actions?: ReactNode\n onClick?: () => void\n className?: string\n}\n\nconst FileCard = forwardRef<HTMLDivElement, FileCardProps>(\n function FileCard({ name, size, type, thumbnail, actions, onClick, className }, ref) {\n const isClickable = onClick !== undefined\n\n return (\n <div\n ref={ref}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={isClickable ? onClick : undefined}\n onKeyDown={isClickable ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick() }\n } : undefined}\n className={cx(\n 'gds-ctx gds-radius-card border border-border bg-surface overflow-hidden select-none',\n isClickable && 'cursor-pointer hover:border-accent/40 transition-colors',\n className,\n )}\n data-component=\"file-card\"\n >\n {thumbnail !== undefined && (\n <div className=\"flex h-28 items-center justify-center bg-bg-tertiary\">\n <img src={thumbnail} alt={name} className=\"h-full w-full object-cover\" />\n </div>\n )}\n <div className=\"gds-pad\">\n <div className=\"truncate font-medium text-fg gds-text-body\">{name}</div>\n <div className=\"mt-1 flex items-center gap-2\">\n {size !== undefined && <span className=\"text-fg-muted gds-text-caption\">{size}</span>}\n {type !== undefined && <Badge>{type}</Badge>}\n </div>\n {actions !== undefined && <div className=\"mt-2 flex gap-1\">{actions}</div>}\n </div>\n </div>\n )\n },\n)\n\nexport { FileCard }\nexport type { FileCardProps }\n","// form-builder — schema-driven form renderer\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FormField = {\n id: string\n label: string\n type: 'checkbox' | 'number' | 'select' | 'text' | 'textarea'\n options?: string[]\n required?: boolean\n placeholder?: string\n}\n\nexport type FormBuilderProps = {\n fields: FormField[]\n values: Record<string, unknown>\n onChange: (id: string, value: unknown) => void\n className?: string\n}\n\nconst inputCls = cx(\n 'w-full gds-radius-button border border-border bg-bg gds-pad-x gds-pad-y-sm text-sm text-fg',\n 'placeholder:text-fg-muted/50',\n focusCls,\n)\n\nfunction renderField(\n field: FormField,\n value: unknown,\n onChange: (id: string, value: unknown) => void,\n) {\n const id = `form-field-${field.id}`\n\n if (field.type === 'checkbox') {\n return (\n <label htmlFor={id} className=\"flex cursor-pointer items-center gds-gap-sm select-none\">\n <input\n id={id}\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(field.id, e.target.checked)}\n className={cx('h-4 w-4 rounded border-border', focusCls)}\n />\n <span className=\"text-sm text-fg\">{field.label}</span>\n {field.required === true && <span className=\"text-danger\">*</span>}\n </label>\n )\n }\n\n if (field.type === 'textarea') {\n return (\n <div className=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\n </label>\n <textarea\n id={id}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n onChange={(e) => onChange(field.id, e.target.value)}\n className={cx(inputCls, 'min-h-[72px] resize-y')}\n rows={3}\n />\n </div>\n )\n }\n\n if (field.type === 'select') {\n return (\n <div className=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\n </label>\n <select\n id={id}\n value={String(value ?? '')}\n onChange={(e) => onChange(field.id, e.target.value)}\n className={cx(inputCls, 'cursor-pointer')}\n >\n <option value=\"\">{field.placeholder ?? 'Select...'}</option>\n {field.options?.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n </div>\n )\n }\n\n // text or number\n return (\n <div className=\"flex flex-col gds-gap-xs\">\n <label htmlFor={id} className=\"gds-text-body font-medium text-fg-muted select-none\">\n {field.label}\n {field.required === true && <span className=\"ml-0.5 text-danger\">*</span>}\n </label>\n <input\n id={id}\n type={field.type}\n value={String(value ?? '')}\n placeholder={field.placeholder}\n onChange={(e) => {\n if (field.type === 'number') {\n onChange(field.id, e.target.value === '' ? '' : Number(e.target.value))\n } else {\n onChange(field.id, e.target.value)\n }\n }}\n className={inputCls}\n />\n </div>\n )\n}\n\nexport const FormBuilder = forwardRef<HTMLDivElement, FormBuilderProps>(\n function FormBuilder({ fields, values, onChange, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-4', className)}\n data-component=\"form-builder\"\n >\n {fields.map((field) => (\n <div key={field.id}>\n {renderField(field, values[field.id], onChange)}\n </div>\n ))}\n </div>\n )\n },\n)\n","import type { GanttTask, GanttViewMode } from './gantt-chart-types'\n\nexport const PALETTE = [\n 'var(--gds-palette-0)', 'var(--gds-palette-1)', 'var(--gds-palette-2)', 'var(--gds-palette-3)',\n 'var(--gds-palette-4)', 'var(--gds-palette-5)', 'var(--gds-palette-6)', 'var(--gds-palette-7)',\n]\n\nexport const DAY_MS = 86400000\nexport const RESIZE_HANDLE_WIDTH = 6\n\nexport const toTs = (d: Date | string): number => new Date(d).getTime()\n\nexport const fmtDate = (d: Date): string => {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nconst shortMonth = (d: Date): string =>\n d.toLocaleDateString('en-US', { month: 'short' })\n\nconst startOfWeek = (d: Date): Date => {\n const result = new Date(d)\n const day = result.getDay()\n const diff = day === 0 ? -6 : 1 - day\n result.setDate(result.getDate() + diff)\n result.setHours(0, 0, 0, 0)\n return result\n}\n\nconst startOfMonth = (d: Date): Date => {\n const result = new Date(d)\n result.setDate(1)\n result.setHours(0, 0, 0, 0)\n return result\n}\n\nexport const generateColumns = (minDate: Date, maxDate: Date, viewMode: GanttViewMode): Date[] => {\n const cols: Date[] = []\n const end = maxDate.getTime() + DAY_MS\n\n if (viewMode === 'day') {\n const d = new Date(minDate)\n d.setHours(0, 0, 0, 0)\n while (d.getTime() <= end) { cols.push(new Date(d)); d.setDate(d.getDate() + 1) }\n } else if (viewMode === 'week') {\n const d = startOfWeek(minDate)\n while (d.getTime() <= end) { cols.push(new Date(d)); d.setDate(d.getDate() + 7) }\n } else {\n const d = startOfMonth(minDate)\n while (d.getTime() <= end) { cols.push(new Date(d)); d.setMonth(d.getMonth() + 1) }\n }\n return cols\n}\n\nexport const colWidth = (mode: GanttViewMode): number => {\n if (mode === 'day') return 36\n if (mode === 'week') return 80\n return 120\n}\n\nexport const colLabel = (d: Date, mode: GanttViewMode): string => {\n if (mode === 'day') return String(d.getDate())\n if (mode === 'week') return `${shortMonth(d)} ${d.getDate()}`\n return `${shortMonth(d)} ${d.getFullYear()}`\n}\n\nexport const computeCriticalPath = (tasks: GanttTask[]): Set<string> => {\n const taskMap = new Map<string, GanttTask>()\n tasks.forEach((t) => taskMap.set(t.id, t))\n\n const hasDependents = new Set<string>()\n tasks.forEach((t) => {\n if (t.dependencies !== undefined) {\n t.dependencies.forEach((depId) => hasDependents.add(depId))\n }\n })\n\n const endTasks = tasks.filter((t) => !hasDependents.has(t.id))\n const cache = new Map<string, { chain: string[]; duration: number }>()\n\n const longestChain = (taskId: string): { chain: string[]; duration: number } => {\n const cached = cache.get(taskId)\n if (cached !== undefined) return cached\n\n const task = taskMap.get(taskId)\n if (task === undefined) {\n const empty = { chain: [], duration: 0 }\n cache.set(taskId, empty)\n return empty\n }\n\n const taskDuration = toTs(task.end) - toTs(task.start)\n\n if (task.dependencies === undefined || task.dependencies.length === 0) {\n const result = { chain: [taskId], duration: taskDuration }\n cache.set(taskId, result)\n return result\n }\n\n let bestDep = { chain: [] as string[], duration: 0 }\n task.dependencies.forEach((depId) => {\n const dep = longestChain(depId)\n if (dep.duration > bestDep.duration) {\n bestDep = dep\n }\n })\n\n const result = { chain: [...bestDep.chain, taskId], duration: taskDuration + bestDep.duration }\n cache.set(taskId, result)\n return result\n }\n\n let longestPath = { chain: [] as string[], duration: 0 }\n endTasks.forEach((t) => {\n const result = longestChain(t.id)\n if (result.duration > longestPath.duration) {\n longestPath = result\n }\n })\n\n return new Set(longestPath.chain)\n}\n","// gantt-chart — interactive timeline chart with task bars, milestones, dependencies\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { focusCls } from '../../utils/a11y'\nimport { cx } from '../../utils/cx'\nimport type { DragState, GanttChartProps, GanttTask, GroupedRow, TooltipState } from './gantt-chart-types'\nimport {\n colLabel, colWidth, computeCriticalPath, DAY_MS, fmtDate,\n generateColumns, PALETTE, RESIZE_HANDLE_WIDTH, toTs,\n} from './gantt-chart-utils'\n\nexport function GanttChart({\n className,\n editable = false,\n headerHeight = 40,\n height: customHeight,\n labelWidth = 180,\n onTaskClick,\n onTaskMove,\n onTaskResize,\n rowHeight = 36,\n showCriticalPath = false,\n showDependencies = true,\n showProgress = true,\n showToday = true,\n tasks,\n viewMode = 'week',\n}: GanttChartProps) {\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(() => new Set())\n const [tooltip, setTooltip] = useState<TooltipState>(null)\n const [drag, setDrag] = useState<DragState>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const toggleGroup = useCallback((group: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev)\n if (next.has(group)) { next.delete(group) } else { next.add(group) }\n return next\n })\n }, [])\n\n const criticalPathIds = useMemo(() => {\n if (!showCriticalPath) return new Set<string>()\n return computeCriticalPath(tasks)\n }, [tasks, showCriticalPath])\n\n // build grouped rows\n const rows = useMemo((): GroupedRow[] => {\n const result: GroupedRow[] = []\n const grouped = new Map<string, GanttTask[]>()\n const ungrouped: GanttTask[] = []\n\n tasks.forEach((task) => {\n if (task.group !== undefined) {\n const list = grouped.get(task.group)\n if (list !== undefined) { list.push(task) } else { grouped.set(task.group, [task]) }\n } else {\n ungrouped.push(task)\n }\n })\n\n let idx = 0\n grouped.forEach((groupTasks, groupName) => {\n const collapsed = collapsedGroups.has(groupName)\n result.push({ collapsed, kind: 'group', label: groupName })\n if (!collapsed) {\n groupTasks.forEach((task) => { result.push({ index: idx++, kind: 'task', task }) })\n }\n })\n ungrouped.forEach((task) => { result.push({ index: idx++, kind: 'task', task }) })\n return result\n }, [tasks, collapsedGroups])\n\n // compute date range and columns\n const { columns, timelineStart, timelineWidth, totalWidth } = useMemo(() => {\n if (tasks.length === 0) {\n return { columns: [] as Date[], timelineStart: 0, timelineWidth: 0, totalWidth: labelWidth }\n }\n let minTs = Infinity\n let maxTs = -Infinity\n tasks.forEach((t) => {\n const s = toTs(t.start)\n const e = toTs(t.end)\n if (s < minTs) minTs = s\n if (e > maxTs) maxTs = e\n })\n const padMs = viewMode === 'day' ? DAY_MS * 2 : viewMode === 'week' ? DAY_MS * 7 : DAY_MS * 30\n const minDate = new Date(minTs - padMs)\n const maxDate = new Date(maxTs + padMs)\n const cols = generateColumns(minDate, maxDate, viewMode)\n const cw = colWidth(viewMode)\n const tw = cols.length * cw\n return { columns: cols, timelineStart: cols.length > 0 ? cols[0].getTime() : 0, timelineWidth: tw, totalWidth: labelWidth + tw }\n }, [tasks, viewMode, labelWidth])\n\n const timelineEnd = useMemo(() => {\n if (columns.length === 0) return 0\n const lastCol = columns[columns.length - 1]\n if (viewMode === 'day') return lastCol.getTime() + DAY_MS\n if (viewMode === 'week') return lastCol.getTime() + DAY_MS * 7\n const next = new Date(lastCol)\n next.setMonth(next.getMonth() + 1)\n return next.getTime()\n }, [columns, viewMode])\n\n const totalDuration = timelineEnd - timelineStart\n\n const pxToMs = useMemo(() => {\n if (timelineWidth <= 0) return 0\n return totalDuration / timelineWidth\n }, [totalDuration, timelineWidth])\n\n const taskX = useCallback(\n (date: Date | string): number => {\n if (totalDuration <= 0) return 0\n const ts = toTs(date)\n return ((ts - timelineStart) / totalDuration) * timelineWidth\n },\n [timelineStart, totalDuration, timelineWidth],\n )\n\n const taskPositions = useMemo(() => {\n const map = new Map<string, { w: number; x: number; y: number }>()\n let rowIdx = 0\n rows.forEach((row) => {\n if (row.kind === 'group') { rowIdx++; return }\n const t = row.task\n const x = taskX(t.start)\n const endX = t.milestone ? x : taskX(t.end)\n const w = Math.max(endX - x, 2)\n const y = headerHeight + rowIdx * rowHeight + rowHeight / 2\n map.set(t.id, { w, x, y })\n rowIdx++\n })\n return map\n }, [rows, taskX, headerHeight, rowHeight])\n\n const todayX = useMemo(() => {\n if (!showToday) return null\n const now = new Date()\n now.setHours(12, 0, 0, 0)\n const ts = now.getTime()\n if (ts < timelineStart || ts > timelineEnd) return null\n return ((ts - timelineStart) / totalDuration) * timelineWidth\n }, [showToday, timelineStart, timelineEnd, totalDuration, timelineWidth])\n\n const chartHeight = customHeight ?? headerHeight + rows.length * rowHeight + 8\n const barHeight = Math.round(rowHeight * 0.56)\n const barOffset = Math.round((rowHeight - barHeight) / 2)\n\n // drag handlers\n const handleDragStart = useCallback(\n (taskId: string, type: 'move' | 'resize', e: React.MouseEvent) => {\n if (!editable) return\n e.preventDefault()\n e.stopPropagation()\n const task = tasks.find((t) => t.id === taskId)\n if (task === undefined) return\n setDrag({ origEnd: new Date(task.end), origStart: new Date(task.start), startX: e.clientX, taskId, type })\n setTooltip(null)\n },\n [editable, tasks],\n )\n\n const dragDelta = useRef(0)\n\n useEffect(() => {\n if (drag === null) return\n const handleMouseMove = (e: MouseEvent) => {\n dragDelta.current = e.clientX - drag.startX\n setDrag((prev) => (prev !== null ? { ...prev } : null))\n }\n const handleMouseUp = (e: MouseEvent) => {\n const deltaMs = Math.round((e.clientX - drag.startX) * pxToMs)\n if (drag.type === 'move') {\n const newStart = new Date(drag.origStart.getTime() + deltaMs)\n const newEnd = new Date(drag.origEnd.getTime() + deltaMs)\n onTaskMove?.(drag.taskId, newStart, newEnd)\n } else {\n const newEndMs = Math.max(drag.origStart.getTime() + DAY_MS, drag.origEnd.getTime() + deltaMs)\n onTaskResize?.(drag.taskId, new Date(newEndMs))\n }\n dragDelta.current = 0\n setDrag(null)\n }\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n return () => { window.removeEventListener('mousemove', handleMouseMove); window.removeEventListener('mouseup', handleMouseUp) }\n }, [drag, pxToMs, onTaskMove, onTaskResize])\n\n const ghostBar = useMemo(() => {\n if (drag === null) return null\n const deltaMs = Math.round(dragDelta.current * pxToMs)\n if (drag.type === 'move') {\n return { end: new Date(drag.origEnd.getTime() + deltaMs), start: new Date(drag.origStart.getTime() + deltaMs), taskId: drag.taskId }\n }\n const newEndMs = Math.max(drag.origStart.getTime() + DAY_MS, drag.origEnd.getTime() + deltaMs)\n return { end: new Date(newEndMs), start: drag.origStart, taskId: drag.taskId }\n }, [drag, pxToMs])\n\n const handleMouseEnter = useCallback(\n (task: GanttTask, e: React.MouseEvent) => {\n if (drag !== null) return\n const rect = containerRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setTooltip({ task, x: e.clientX - rect.left + 12, y: e.clientY - rect.top - 8 })\n },\n [drag],\n )\n\n const handleMouseLeave = useCallback(() => { setTooltip(null) }, [])\n\n const cWidth = colWidth(viewMode)\n\n return (\n <div\n className={cx('relative overflow-hidden rounded border border-border bg-bg select-none', className)}\n data-component=\"gantt-chart\"\n ref={containerRef}\n style={{ height: chartHeight }}\n >\n {/* label column header */}\n <div\n className=\"sticky left-0 z-20 border-r border-b border-border bg-surface\"\n style={{ height: headerHeight, position: 'absolute', top: 0, width: labelWidth }}\n >\n <div className=\"flex h-full items-center px-3 text-xs font-semibold text-fg-muted\">Task</div>\n </div>\n\n {/* scrollable area */}\n <div className=\"overflow-x-auto\" style={{ height: chartHeight }}>\n <div style={{ minHeight: chartHeight, position: 'relative', width: totalWidth }}>\n {/* timeline header */}\n <div\n className=\"border-b border-border bg-surface\"\n style={{ height: headerHeight, marginLeft: labelWidth, position: 'sticky', top: 0, width: timelineWidth, zIndex: 15 }}\n >\n <div className=\"relative flex h-full\">\n {columns.map((col, i) => (\n <div\n className={cx('flex shrink-0 items-center justify-center border-r border-border text-[10px] text-fg-muted', i % 2 === 0 ? 'bg-surface' : 'bg-bg')}\n key={col.getTime()}\n style={{ height: headerHeight, width: cWidth }}\n >\n {colLabel(col, viewMode)}\n </div>\n ))}\n </div>\n </div>\n\n {/* label column */}\n <div\n className=\"sticky left-0 z-10 border-r border-border bg-bg\"\n style={{ position: 'absolute', top: headerHeight, width: labelWidth }}\n >\n {rows.map((row, i) => {\n if (row.kind === 'group') {\n return (\n <button\n className={cx('flex w-full items-center gap-1.5 border-b border-border bg-surface/60 px-3 text-xs font-semibold text-fg', focusCls)}\n key={`group-${row.label}`}\n onClick={() => toggleGroup(row.label)}\n style={{ height: rowHeight }}\n type=\"button\"\n >\n <span className=\"text-[10px] text-fg-muted transition-transform\" style={{ transform: row.collapsed ? 'rotate(-90deg)' : 'rotate(0deg)' }}>\n &#9660;\n </span>\n {row.label}\n </button>\n )\n }\n return (\n <div\n className={cx('flex items-center border-b border-border px-3 text-xs text-fg', i % 2 === 0 ? 'bg-bg' : 'bg-surface/30')}\n key={row.task.id}\n style={{ height: rowHeight }}\n >\n <span className=\"truncate\">{row.task.label}</span>\n </div>\n )\n })}\n </div>\n\n {/* timeline body */}\n <div style={{ left: labelWidth, position: 'absolute', top: headerHeight, width: timelineWidth }}>\n {/* grid background */}\n {rows.map((_row, i) => (\n <div className={cx('flex border-b border-border', i % 2 === 0 ? 'bg-bg' : 'bg-surface/30')} key={`row-bg-${i}`} style={{ height: rowHeight }}>\n {columns.map((col, ci) => (\n <div\n className=\"shrink-0 border-r border-border/30\"\n key={col.getTime()}\n style={{ backgroundColor: ci % 2 === 0 ? 'transparent' : 'var(--gds-surface)', height: rowHeight, opacity: ci % 2 === 0 ? 1 : 0.15, width: cWidth }}\n />\n ))}\n </div>\n ))}\n\n {/* svg overlay */}\n <svg className=\"pointer-events-none absolute top-0 left-0\" data-testid=\"gantt-svg\" height={rows.length * rowHeight} width={timelineWidth}>\n {/* dependency arrows */}\n {showDependencies && rows.map((row) => {\n if (row.kind !== 'task') return null\n const t = row.task\n if (t.dependencies === undefined || t.dependencies.length === 0) return null\n const target = taskPositions.get(t.id)\n if (target === undefined) return null\n return t.dependencies.map((depId) => {\n const source = taskPositions.get(depId)\n if (source === undefined) return null\n const sx = source.x + source.w\n const sy = source.y - headerHeight\n const tx = target.x\n const ty = target.y - headerHeight\n const midX = sx + (tx - sx) / 2\n return (\n <g data-dependency={`${depId}->${t.id}`} key={`dep-${depId}-${t.id}`}>\n <path d={`M ${sx} ${sy} C ${midX} ${sy}, ${midX} ${ty}, ${tx} ${ty}`} fill=\"none\" stroke=\"var(--gds-fg-muted)\" strokeOpacity={0.4} strokeWidth={1.5} />\n <polygon fill=\"var(--gds-fg-muted)\" fillOpacity={0.4} points={`${tx},${ty} ${tx - 5},${ty - 3} ${tx - 5},${ty + 3}`} />\n </g>\n )\n })\n })}\n\n {/* task bars and milestones */}\n {rows.map((row, i) => {\n if (row.kind !== 'task') return null\n const t = row.task\n const isGhost = ghostBar !== null && ghostBar.taskId === t.id\n const effectiveStart = isGhost ? ghostBar.start : t.start\n const effectiveEnd = isGhost ? ghostBar.end : t.end\n const x = taskX(effectiveStart)\n const endX = taskX(effectiveEnd)\n const y = i * rowHeight + barOffset\n const color = t.color ?? PALETTE[row.index % PALETTE.length]\n const isCritical = criticalPathIds.has(t.id)\n\n if (t.milestone) {\n const size = barHeight * 0.5\n const cy = y + barHeight / 2\n return (\n <g className=\"pointer-events-auto cursor-pointer\" data-critical-path={isCritical ? 'true' : undefined} data-milestone={t.id} key={t.id}\n onClick={() => onTaskClick?.(t)} onMouseEnter={(e) => handleMouseEnter(t, e)} onMouseLeave={handleMouseLeave}>\n {isCritical && <rect fill=\"var(--gds-danger)\" fillOpacity={0.25} height={size * 2 + 4} rx={2} width={size * 2 + 4} x={x - size - 2} y={cy - size - 2} />}\n <rect fill={color} height={size * 2} rx={2} transform={`rotate(45 ${x} ${cy})`} width={size * 2} x={x - size} y={cy - size} />\n </g>\n )\n }\n\n const w = Math.max(endX - x, 2)\n const progressW = showProgress && t.progress !== undefined ? (t.progress / 100) * w : 0\n const isDragging = drag !== null && drag.taskId === t.id\n\n return (\n <g\n className={cx('pointer-events-auto', editable ? 'cursor-grab' : 'cursor-pointer', isDragging && 'cursor-grabbing')}\n data-critical-path={isCritical ? 'true' : undefined}\n data-task={t.id}\n key={t.id}\n onClick={() => { if (drag === null) onTaskClick?.(t) }}\n onMouseDown={(e) => handleDragStart(t.id, 'move', e)}\n onMouseEnter={(e) => handleMouseEnter(t, e)}\n onMouseLeave={handleMouseLeave}\n >\n {isCritical && <rect data-testid={`critical-border-${t.id}`} fill=\"var(--gds-danger)\" height={barHeight} rx={3} width={3} x={x} y={y} />}\n <rect fill={color} fillOpacity={isDragging ? 0.5 : 0.3} height={barHeight} rx={3} width={w} x={x} y={y} />\n {progressW > 0 && <rect data-progress={t.progress} fill={color} fillOpacity={0.85} height={barHeight} rx={3} width={Math.min(progressW, w)} x={x} y={y} />}\n {editable && !t.milestone && (\n <rect className=\"cursor-ew-resize\" data-resize-handle={t.id} fill=\"transparent\" height={barHeight}\n onMouseDown={(e) => { e.stopPropagation(); handleDragStart(t.id, 'resize', e) }}\n width={RESIZE_HANDLE_WIDTH} x={x + w - RESIZE_HANDLE_WIDTH} y={y} />\n )}\n {t.assignee !== undefined && (\n <text dominantBaseline=\"middle\" fill=\"var(--gds-fg-muted)\" fontSize={9} x={x + w + 6} y={y + barHeight / 2}>\n {t.assignee}\n </text>\n )}\n </g>\n )\n })}\n\n {/* today line */}\n {todayX !== null && (\n <line data-testid=\"today-line\" stroke=\"var(--gds-danger)\" strokeDasharray=\"4,3\" strokeWidth={1.5} x1={todayX} x2={todayX} y1={0} y2={rows.length * rowHeight} />\n )}\n </svg>\n </div>\n </div>\n </div>\n\n {/* tooltip */}\n {tooltip !== null && (\n <div className=\"pointer-events-none absolute z-30 rounded border border-border bg-surface px-3 py-2 shadow-lg\" style={{ left: tooltip.x, top: tooltip.y }}>\n <div className=\"text-xs font-semibold text-fg\">{tooltip.task.label}</div>\n <div className=\"mt-0.5 text-[10px] text-fg-muted\">\n {fmtDate(new Date(tooltip.task.start))} &mdash; {fmtDate(new Date(tooltip.task.end))}\n </div>\n {tooltip.task.progress !== undefined && (\n <div className=\"mt-0.5 text-[10px] text-fg-muted\">Progress: {tooltip.task.progress}%</div>\n )}\n {tooltip.task.assignee !== undefined && (\n <div className=\"mt-0.5 text-[10px] text-fg-muted\">Assignee: {tooltip.task.assignee}</div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype HeatmapRow = {\n label: string\n values: number[]\n}\n\ntype HeatmapTableProps = React.HTMLAttributes<HTMLTableElement> & {\n headers: string[]\n maxValue?: number\n rows: HeatmapRow[]\n}\n\nexport const HeatmapTable = forwardRef<HTMLTableElement, HeatmapTableProps>(\n function HeatmapTable({ className, headers, maxValue, rows, ...props }, ref) {\n const resolvedMax = maxValue ?? Math.max(1, ...rows.flatMap((r) => r.values))\n\n return (\n <table\n className={cx('w-full border-collapse text-xs', className)}\n data-component=\"heatmap-table\"\n ref={ref}\n {...props}\n >\n <thead>\n <tr>\n <th className=\"p-1.5 text-left font-medium text-fg-muted\" />\n {headers.map((h) => (\n <th className=\"p-1.5 text-center font-medium text-fg-muted\" key={h}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"p-1.5 font-medium text-fg\">{row.label}</td>\n {row.values.map((val, i) => {\n const intensity = Math.min(val / resolvedMax, 1)\n return (\n <td\n className=\"p-1.5 text-center tabular-nums text-fg\"\n key={i}\n style={{ backgroundColor: `color-mix(in srgb, var(--color-accent) ${Math.round(intensity * 20)}%, transparent)` }}\n >\n {val}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )\n },\n)\n\nexport type { HeatmapRow, HeatmapTableProps }\n","// image-preview — lightbox image viewer with fullscreen overlay\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\nexport type ImagePreviewProps = {\n src: string\n alt?: string\n thumbnailClassName?: string\n className?: string\n}\n\nexport const ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(\n function ImagePreview({ src, alt = '', thumbnailClassName, className }, ref) {\n const [open, setOpen] = useState(false)\n\n const handleOpen = useCallback(() => setOpen(true), [])\n const handleClose = useCallback(() => setOpen(false), [])\n\n // escape key to close\n useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open, handleClose])\n\n // scroll lock when open\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => { document.body.style.overflow = prev }\n }, [open])\n\n return (\n <div ref={ref} className={cx('inline-block', className)} data-component=\"image-preview\">\n {/* thumbnail */}\n <button\n type=\"button\"\n onClick={handleOpen}\n className={cx('cursor-pointer border-0 bg-transparent p-0', focusCls)}\n aria-label={`Preview ${alt}`}\n >\n <img\n src={src}\n alt={alt}\n className={cx('gds-radius object-cover', thumbnailClassName)}\n data-testid=\"thumbnail\"\n />\n </button>\n\n {/* lightbox overlay */}\n {open && renderPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\"\n onClick={(e) => { if (e.target === e.currentTarget) handleClose() }}\n data-testid=\"lightbox\"\n >\n {/* close button */}\n <button\n type=\"button\"\n onClick={handleClose}\n className={cx(\n 'absolute right-4 top-4 rounded-full bg-white/10 p-2 text-white transition-colors hover:bg-white/20',\n focusCls,\n )}\n aria-label=\"Close preview\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M3 3l10 10M13 3L3 13\" />\n </svg>\n </button>\n\n {/* full image */}\n <img\n src={src}\n alt={alt}\n className=\"max-h-[90vh] max-w-[90vw] object-contain\"\n />\n </div>,\n )}\n </div>\n )\n },\n)\n","import type { ReactNode } from 'react'\nimport { forwardRef, useEffect, useRef } from 'react'\n\nimport { LoadingDots } from '../l3-atoms/loading-dots'\nimport { cx } from '../utils/cx'\n\ntype InfiniteScrollProps = React.HTMLAttributes<HTMLDivElement> & {\n onLoadMore: () => void\n hasMore: boolean\n loading?: boolean\n threshold?: number\n loader?: ReactNode\n}\n\nexport const InfiniteScroll = forwardRef<HTMLDivElement, InfiniteScrollProps>(\n function InfiniteScroll(\n {\n children,\n className,\n hasMore,\n loader,\n loading,\n onLoadMore,\n threshold = 0.8,\n ...props\n },\n ref,\n ) {\n const sentinelRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const sentinel = sentinelRef.current\n if (sentinel === null) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry !== undefined && entry.isIntersecting && hasMore && !loading) {\n onLoadMore()\n }\n },\n { threshold },\n )\n\n observer.observe(sentinel)\n return () => observer.disconnect()\n }, [hasMore, loading, onLoadMore, threshold])\n\n return (\n <div\n className={cx('relative', className)}\n data-component=\"infinite-scroll\"\n ref={ref}\n {...props}\n >\n {children}\n\n {loading === true && (\n <div className=\"flex items-center justify-center py-4\">\n {loader ?? <LoadingDots />}\n </div>\n )}\n\n <div ref={sentinelRef} data-sentinel=\"true\" className=\"h-px w-full\" />\n </div>\n )\n },\n)\n\nexport type { InfiniteScrollProps }\n","// json-node — recursive tree node for json-viewer\nimport { useCallback, useState } from 'react'\n\ntype NodeProps = {\n value: unknown\n keyName?: string\n depth: number\n defaultExpanded: boolean | number\n}\n\nfunction isExpandedAtDepth(defaultExpanded: boolean | number, depth: number): boolean {\n if (defaultExpanded === true) return true\n if (defaultExpanded === false) return false\n return depth < defaultExpanded\n}\n\nfunction JsonString({ value }: { value: string }) {\n return <span className=\"text-success\">\"{value}\"</span>\n}\n\nfunction JsonNumber({ value }: { value: number }) {\n return <span className=\"text-accent\">{String(value)}</span>\n}\n\nfunction JsonBoolean({ value }: { value: boolean }) {\n return <span className=\"text-[#c084fc]\">{String(value)}</span>\n}\n\nfunction JsonNull() {\n return <span className=\"text-fg-muted\">null</span>\n}\n\nexport type { NodeProps as JsonNodeProps }\n\nexport function JsonNode({ value, keyName, depth, defaultExpanded }: NodeProps) {\n const [expanded, setExpanded] = useState(() => isExpandedAtDepth(defaultExpanded, depth))\n\n const handleToggle = useCallback(() => {\n setExpanded((prev) => !prev)\n }, [])\n\n // render key prefix\n const keyPrefix = keyName !== undefined ? (\n <span className=\"text-fg\">{keyName}: </span>\n ) : null\n\n // primitives\n if (value === null || value === undefined) {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonNull /></div>\n }\n if (typeof value === 'string') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonString value={value} /></div>\n }\n if (typeof value === 'number') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonNumber value={value} /></div>\n }\n if (typeof value === 'boolean') {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}<JsonBoolean value={value} /></div>\n }\n\n // arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}[]</div>\n }\n\n if (!expanded) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n [...{value.length} items]\n </button>\n </div>\n )\n }\n\n return (\n <div>\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n [\n </button>\n </div>\n {value.map((item, idx) => (\n <JsonNode key={idx} value={item} depth={depth + 1} defaultExpanded={defaultExpanded} />\n ))}\n <div style={{ paddingLeft: `${depth * 16}px` }}>]</div>\n </div>\n )\n }\n\n // objects\n if (typeof value === 'object') {\n const entries = Object.entries(value)\n if (entries.length === 0) {\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}{'{}'}</div>\n }\n\n if (!expanded) {\n return (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n {'{'} ...{entries.length} keys {'}'}\n </button>\n </div>\n )\n }\n\n return (\n <div>\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n {keyPrefix}\n <button\n className=\"cursor-pointer text-fg-muted hover:text-fg\"\n onClick={handleToggle}\n data-testid=\"toggle\"\n >\n {'{'}\n </button>\n </div>\n {entries.map(([k, v]) => (\n <JsonNode key={k} value={v} keyName={k} depth={depth + 1} defaultExpanded={defaultExpanded} />\n ))}\n <div style={{ paddingLeft: `${depth * 16}px` }}>{'}'}</div>\n </div>\n )\n }\n\n // fallback\n return <div style={{ paddingLeft: `${depth * 16}px` }}>{keyPrefix}{String(value)}</div>\n}\n","// json-viewer — interactive collapsible JSON tree viewer\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { JsonNode } from './json-node'\n\nexport type JsonViewerProps = {\n data: unknown\n defaultExpanded?: boolean | number\n glass?: boolean\n className?: string\n}\n\nexport const JsonViewer = forwardRef<HTMLDivElement, JsonViewerProps>(\n function JsonViewer({ data, defaultExpanded = 2, glass, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-auto gds-radius-popover border border-border gds-pad-x gds-pad-y font-mono text-xs leading-5',\n glass === true && 'bg-white/5 backdrop-blur-md',\n glass !== true && 'bg-bg-secondary',\n className,\n )}\n data-component=\"json-viewer\"\n >\n <JsonNode value={data} depth={0} defaultExpanded={defaultExpanded} />\n </div>\n )\n },\n)\n","// kanban — column-based board layout for items\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type KanbanItem = {\n id: string\n title: string\n description?: string\n tags?: string[]\n}\n\nexport type KanbanColumn = {\n id: string\n title: string\n items: KanbanItem[]\n}\n\nexport type KanbanProps = {\n columns: KanbanColumn[]\n onMoveItem?: (itemId: string, fromCol: string, toCol: string) => void\n renderItem?: (item: KanbanItem) => ReactNode\n className?: string\n}\n\nfunction KanbanTag({ label }: { label: string }) {\n return (\n <span className=\"inline-block gds-radius-badge bg-bg-tertiary gds-pad-x-sm py-0.5 gds-text-caption font-medium text-fg-muted\">\n {label}\n </span>\n )\n}\n\nexport type KanbanCardProps = { className?: string; description?: string; tags?: string[]; title: string }\n\nexport function KanbanCard({ className, description, tags, title }: KanbanCardProps) {\n return (\n <div className={cx('gds-radius-popover border border-border bg-surface gds-pad-x gds-pad-y transition-colors hover:border-fg-muted/30', className)} data-component=\"kanban-card\">\n <div className=\"text-sm font-medium text-fg\">{title}</div>\n {description !== undefined && <p className=\"mt-1 gds-text-body text-fg-muted\">{description}</p>}\n {tags !== undefined && tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gds-gap-xs\">\n {tags.map((tag) => <KanbanTag key={tag} label={tag} />)}\n </div>\n )}\n </div>\n )\n}\n\nexport type KanbanColumnComponentProps = { children?: ReactNode; className?: string; title: string }\n\nexport function KanbanColumnComponent({ children, className, title }: KanbanColumnComponentProps) {\n return (\n <div className={cx('flex w-72 shrink-0 flex-col gds-radius-popover bg-bg-secondary/50 gds-pad-x-sm gds-pad-y', className)} data-component=\"kanban-column\">\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <h3 className=\"gds-text-body font-semibold uppercase tracking-wider text-fg-muted\">{title}</h3>\n </div>\n <div className=\"flex flex-1 flex-col gds-gap-sm overflow-y-auto\">{children}</div>\n </div>\n )\n}\n\n// internal card used by data-driven Kanban\nfunction KanbanCardInternal({ item }: { item: KanbanItem }) {\n return (\n <div className=\"gds-radius-popover border border-border bg-surface gds-pad-x gds-pad-y transition-colors hover:border-fg-muted/30\">\n <div className=\"text-sm font-medium text-fg\">{item.title}</div>\n {item.description !== undefined && (\n <p className=\"mt-1 gds-text-body text-fg-muted\">{item.description}</p>\n )}\n {item.tags !== undefined && item.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gds-gap-xs\">\n {item.tags.map((tag) => (\n <KanbanTag key={tag} label={tag} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction KanbanColumnView({\n column,\n renderItem,\n}: {\n column: KanbanColumn\n renderItem?: (item: KanbanItem) => ReactNode\n}) {\n return (\n <div className=\"flex w-72 shrink-0 flex-col gds-radius-popover bg-bg-secondary/50 gds-pad-x-sm gds-pad-y\">\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <h3 className=\"gds-text-body font-semibold uppercase tracking-wider text-fg-muted\">\n {column.title}\n </h3>\n <span className=\"gds-text-body text-fg-muted/60\">{column.items.length}</span>\n </div>\n <div className=\"flex flex-1 flex-col gds-gap-sm overflow-y-auto\">\n {column.items.map((item) => (\n <div key={item.id}>\n {renderItem !== undefined ? renderItem(item) : <KanbanCardInternal item={item} />}\n </div>\n ))}\n {column.items.length === 0 && (\n <div className=\"py-8 text-center gds-text-body text-fg-muted/40\">\n No items\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport const Kanban = forwardRef<HTMLDivElement, KanbanProps>(\n function Kanban({ columns, renderItem, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex gds-gap overflow-x-auto p-1', className)}\n data-component=\"kanban\"\n >\n {columns.map((col) => (\n <KanbanColumnView\n key={col.id}\n column={col}\n renderItem={renderItem}\n />\n ))}\n </div>\n )\n },\n)\n","// markdown-parser — pure markdown-to-html conversion without external deps\n\nfunction sanitize(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<script[^>]*>/gi, '')\n .replace(/\\son\\w+\\s*=\\s*\"[^\"]*\"/gi, '')\n .replace(/\\son\\w+\\s*=\\s*'[^']*'/gi, '')\n .replace(/\\son\\w+\\s*=\\s*[^\\s>]*/gi, '')\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction parseInline(text: string): string {\n let result = escapeHtml(text)\n // code (backtick) — must come before bold/italic\n result = result.replace(/`([^`]+)`/g, '<code class=\"rounded bg-bg-tertiary px-1 py-0.5 font-mono text-[0.85em]\">$1</code>')\n // bold\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n // italic\n result = result.replace(/\\*([^*]+)\\*/g, '<em>$1</em>')\n // links\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-accent hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n )\n return result\n}\n\nexport function parseMarkdown(content: string): string {\n const lines = content.split('\\n')\n const output: string[] = []\n let inCodeBlock = false\n let codeLines: string[] = []\n let inList = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n\n // fenced code blocks\n if (line.trimStart().startsWith('```')) {\n if (inCodeBlock) {\n output.push(\n `<pre class=\"overflow-auto rounded-lg bg-bg-tertiary p-3 font-mono text-xs\"><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`,\n )\n codeLines = []\n inCodeBlock = false\n } else {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n inCodeBlock = true\n }\n continue\n }\n\n if (inCodeBlock) {\n codeLines.push(line)\n continue\n }\n\n // horizontal rule\n if (/^---+$/.test(line.trim())) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n output.push('<hr class=\"my-3 border-border\" />')\n continue\n }\n\n // headings\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/)\n if (headingMatch !== null) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n const level = headingMatch[1].length\n const sizes = ['text-xl', 'text-lg', 'text-base', 'text-sm', 'text-xs', 'text-xs']\n const margins = ['mt-4 mb-2', 'mt-3 mb-2', 'mt-3 mb-1', 'mt-2 mb-1', 'mt-2 mb-1', 'mt-2 mb-1']\n output.push(\n `<h${level} class=\"font-semibold ${sizes[level - 1]} ${margins[level - 1]}\">${parseInline(headingMatch[2])}</h${level}>`,\n )\n continue\n }\n\n // blockquote\n if (line.trimStart().startsWith('> ')) {\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n const text = line.replace(/^>\\s*/, '')\n output.push(\n `<blockquote class=\"border-l-2 border-accent/30 pl-3 text-fg-muted italic\">${parseInline(text)}</blockquote>`,\n )\n continue\n }\n\n // unordered list\n const listMatch = line.match(/^(\\s*)[-*]\\s+(.+)$/)\n if (listMatch !== null) {\n if (!inList) {\n output.push('<ul class=\"list-disc pl-5 space-y-0.5\">')\n inList = true\n }\n output.push(`<li>${parseInline(listMatch[2])}</li>`)\n continue\n }\n\n // close list if non-list line\n if (inList) {\n output.push('</ul>')\n inList = false\n }\n\n // empty line\n if (line.trim() === '') {\n continue\n }\n\n // paragraph\n output.push(`<p class=\"mb-2\">${parseInline(line)}</p>`)\n }\n\n // close dangling blocks\n if (inCodeBlock) {\n output.push(\n `<pre class=\"overflow-auto rounded-lg bg-bg-tertiary p-3 font-mono text-xs\"><code>${escapeHtml(codeLines.join('\\n'))}</code></pre>`,\n )\n }\n if (inList) {\n output.push('</ul>')\n }\n\n return sanitize(output.join('\\n'))\n}\n","// markdown-preview — simple markdown renderer with DOMPurify sanitization\nimport { forwardRef, useMemo } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { sanitizeHtml } from '../utils/sanitize'\nimport { parseMarkdown } from './markdown-parser'\n\nexport type MarkdownPreviewProps = {\n content: string\n glass?: boolean\n className?: string\n /** v2: sanitize HTML output via DOMPurify, default true */\n sanitize?: boolean\n /** v2: DOMPurify config override */\n sanitizeConfig?: Record<string, unknown>\n /** v2: enable GFM features (tables, strikethrough, task lists), default true */\n gfm?: boolean\n}\n\nexport const MarkdownPreview = forwardRef<HTMLDivElement, MarkdownPreviewProps>(\n function MarkdownPreview({ content, glass, className, sanitize: shouldSanitize = true }, ref) {\n const html = useMemo(() => {\n const raw = parseMarkdown(content)\n if (!shouldSanitize) return raw\n try {\n return sanitizeHtml(raw, { ADD_ATTR: ['target', 'rel'] })\n } catch {\n // DOMPurify not installed — strip all HTML tags to prevent XSS\n return raw.replace(/<[^>]*>/g, '')\n }\n }, [content, shouldSanitize])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'gds-radius-popover gds-pad-x gds-pad-y text-sm text-fg leading-relaxed',\n glass === true && 'bg-white/5 backdrop-blur-md',\n className,\n )}\n data-component=\"markdown-preview\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n },\n)\n","// markdown-editor — split pane editor with live preview\nimport { forwardRef, useCallback } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { MarkdownPreview } from './markdown-preview'\n\ntype MarkdownEditorProps = {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n className?: string\n}\n\nconst MarkdownEditor = forwardRef<HTMLDivElement, MarkdownEditorProps>(\n function MarkdownEditor({ value, onChange, placeholder, className }, ref) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value),\n [onChange],\n )\n\n return (\n <div\n ref={ref}\n className={cx('flex gap-px rounded-lg border border-border bg-surface overflow-hidden', className)}\n data-component=\"markdown-editor\"\n >\n <textarea\n className=\"flex-1 resize-none bg-transparent p-3 text-sm text-fg outline-none font-mono min-h-[200px]\"\n value={value}\n onChange={handleChange}\n placeholder={placeholder}\n />\n <div className=\"w-px bg-border\" />\n <div className=\"flex-1 overflow-auto min-h-[200px]\">\n <MarkdownPreview content={value} className=\"h-full\" />\n </div>\n </div>\n )\n },\n)\n\nexport { MarkdownEditor }\nexport type { MarkdownEditorProps }\n","// masonry-grid — CSS column-based masonry layout\nimport type { ReactNode } from 'react'\nimport { Children, forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type MasonryGridProps = {\n children: ReactNode\n columns?: number\n gap?: number\n className?: string\n}\n\nexport const MasonryGrid = forwardRef<HTMLDivElement, MasonryGridProps>(\n function MasonryGrid({ children, columns = 3, gap = 16, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(className)}\n data-component=\"masonry-grid\"\n style={{ columnCount: columns, columnGap: `${gap}px` }}\n >\n {Children.map(children, (child) => (\n <div style={{ breakInside: 'avoid', marginBottom: `${gap}px` }}>\n {child}\n </div>\n ))}\n </div>\n )\n },\n)\n","// notification-center — notification list panel with dismiss and clear\nimport { forwardRef } from 'react'\n\nimport { Notification } from '../l4-molecules/notification'\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype NotificationItem = {\n id: string\n message?: string\n timestamp?: string\n title: string\n variant?: 'danger' | 'info' | 'success' | 'warning'\n}\n\nexport type NotificationCenterProps = React.HTMLAttributes<HTMLDivElement> & {\n emptyMessage?: string\n glass?: boolean\n notifications: NotificationItem[]\n onClear?: () => void\n onClose?: (id: string) => void\n}\n\nexport const NotificationCenter = forwardRef<HTMLDivElement, NotificationCenterProps>(\n function NotificationCenter(\n {\n className,\n emptyMessage = 'No notifications',\n glass,\n notifications,\n onClear,\n onClose,\n ...props\n },\n ref,\n ) {\n const hasItems = notifications.length > 0\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col gds-radius-popover border border-border',\n glass === true ? cx(glassClass(glass), 'border-white/10 bg-bg/60') : 'bg-surface',\n className,\n )}\n data-component=\"notification-center\"\n {...props}\n >\n <div className=\"flex items-center justify-between border-b border-border gds-pad-x gds-pad-y-sm\">\n <span className=\"gds-text-body font-medium text-fg select-none\">Notifications</span>\n {hasItems && onClear !== undefined && (\n <button\n type=\"button\"\n onClick={onClear}\n className={cx('gds-text-label text-accent hover:text-accent-hover', focusCls)}\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {hasItems ? (\n <div className=\"flex flex-col gds-gap-sm gds-pad\">\n {notifications.map((n) => (\n <Notification\n key={n.id}\n title={n.title}\n description={n.message}\n variant={n.variant ?? 'info'}\n onClose={onClose !== undefined ? () => onClose(n.id) : undefined}\n />\n ))}\n </div>\n ) : (\n <div className=\"flex items-center justify-center gds-pad-lg\">\n <span className=\"gds-text-label text-fg-muted\">{emptyMessage}</span>\n </div>\n )}\n </div>\n </div>\n )\n },\n)\n\nexport type { NotificationItem }\n","// notification-toast — renders stacked toasts with auto-dismiss via portal\nimport { forwardRef, useEffect } from 'react'\n\nimport { Toast } from '../l4-molecules/toast'\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype ToastEntry = {\n id: string\n message?: string\n title: string\n variant?: 'danger' | 'info' | 'success' | 'warning'\n}\n\ntype NotificationToastPosition = 'bottom-right' | 'top-right'\n\ntype NotificationToastProps = {\n className?: string\n onClose: (id: string) => void\n position?: NotificationToastPosition\n toasts: ToastEntry[]\n}\n\nconst positionMap: Record<NotificationToastPosition, string> = {\n 'top-right': 'top-4 right-4',\n 'bottom-right': 'bottom-4 right-4',\n}\n\nconst variantToToast = (v?: ToastEntry['variant']) => {\n if (v === 'info') return 'default'\n return v ?? 'default'\n}\n\nexport const NotificationToast = forwardRef<HTMLDivElement, NotificationToastProps>(\n function NotificationToast({ toasts, onClose, position = 'top-right', className }, ref) {\n useEffect(() => {\n const timers = toasts.map((t) =>\n window.setTimeout(() => onClose(t.id), 5000),\n )\n return () => timers.forEach((id) => window.clearTimeout(id))\n }, [toasts, onClose])\n\n if (toasts.length === 0) return null\n\n return renderPortal(\n <div\n ref={ref}\n className={cx('fixed z-50 flex w-80 flex-col gap-2', positionMap[position], className)}\n data-component=\"notification-toast\"\n >\n {toasts.map((t) => (\n <Toast key={t.id} title={t.title} description={t.message} variant={variantToToast(t.variant)} onClose={() => onClose(t.id)} />\n ))}\n </div>,\n )\n },\n)\n\nexport type { NotificationToastPosition, NotificationToastProps, ToastEntry }\n","// parallax — container where children move at different speeds on scroll\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ParallaxProps = {\n children: ReactNode\n speed?: number\n direction?: 'horizontal' | 'vertical'\n disabled?: boolean\n className?: string\n}\n\nexport const Parallax = forwardRef<HTMLDivElement, ParallaxProps>(\n function Parallax({ children, speed = 0.5, direction = 'vertical', disabled = false, className }, ref) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [offset, setOffset] = useState(0)\n const rafRef = useRef<number>(0)\n\n const handleScroll = useCallback(() => {\n if (rafRef.current !== 0) return\n rafRef.current = requestAnimationFrame(() => {\n const el = innerRef.current\n if (el !== null) {\n const rect = el.getBoundingClientRect()\n const scrollOffset = direction === 'vertical'\n ? -rect.top * speed\n : -rect.left * speed\n setOffset(scrollOffset)\n }\n rafRef.current = 0\n })\n }, [speed, direction])\n\n useEffect(() => {\n if (disabled) return\n window.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll()\n return () => {\n window.removeEventListener('scroll', handleScroll)\n if (rafRef.current !== 0) {\n cancelAnimationFrame(rafRef.current)\n }\n }\n }, [disabled, handleScroll])\n\n // check prefers-reduced-motion\n const prefersReducedMotion = useRef(false)\n useEffect(() => {\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)')\n prefersReducedMotion.current = mq.matches\n }, [])\n\n const shouldDisable = disabled || prefersReducedMotion.current\n\n const transform = shouldDisable\n ? undefined\n : direction === 'vertical'\n ? `translateY(${offset}px)`\n : `translateX(${offset}px)`\n\n return (\n <div\n ref={(node) => {\n innerRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }\n }}\n className={cx('will-change-transform', className)}\n style={transform !== undefined ? { transform } : undefined}\n data-component=\"parallax\"\n >\n {children}\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PayslipDeduction = { label: string; amount: number }\n\ntype PayslipCardProps = React.HTMLAttributes<HTMLDivElement> & {\n currency?: string\n deductions: PayslipDeduction[]\n gross: number\n net: number\n period: string\n}\n\nexport const PayslipCard = forwardRef<HTMLDivElement, PayslipCardProps>(\n function PayslipCard({ className, currency = '\\u00a5', deductions, gross, net, period, ...props }, ref) {\n const fmt = (n: number) => `${currency}${n.toLocaleString()}`\n\n return (\n <div\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\n data-component=\"payslip-card\"\n ref={ref}\n {...props}\n >\n <div className=\"mb-3 font-semibold text-fg\">{period}</div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-fg-muted\">Gross</span>\n <span className=\"text-fg\">{fmt(gross)}</span>\n </div>\n {deductions.map((d) => (\n <div key={d.label} className=\"flex justify-between text-sm\">\n <span className=\"text-fg-muted\">{d.label}</span>\n <span className=\"text-danger\">-{fmt(d.amount)}</span>\n </div>\n ))}\n <div className=\"my-2 border-t border-border\" />\n <div className=\"flex justify-between font-bold\">\n <span className=\"text-fg\">Net Pay</span>\n <span className=\"text-fg\">{fmt(net)}</span>\n </div>\n </div>\n )\n },\n)\n\nexport type { PayslipCardProps, PayslipDeduction }\n","// permission-matrix — role/permission grid with checkbox intersections\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype PermissionMatrixProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n roles: string[]\n permissions: string[]\n values: boolean[][]\n onChange?: (perm: number, role: number, value: boolean) => void\n readonly?: boolean\n}\n\nconst PermissionMatrix = forwardRef<HTMLDivElement, PermissionMatrixProps>(\n function PermissionMatrix({ roles, permissions, values, onChange, readonly, className, ...props }, ref) {\n return (\n <div ref={ref} className={cx('overflow-auto', className)} data-component=\"permission-matrix\" {...props}>\n <table className=\"w-full border-collapse gds-text-body\">\n <thead>\n <tr>\n <th className=\"border border-border bg-bg-secondary px-3 py-2 text-left text-fg-muted font-medium select-none\">Permission</th>\n {roles.map((role) => (\n <th key={role} className=\"border border-border bg-bg-secondary px-3 py-2 text-center text-fg-muted font-medium select-none\">{role}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {permissions.map((perm, pi) => (\n <tr key={perm}>\n <td className=\"border border-border px-3 py-2 text-fg select-none\">{perm}</td>\n {roles.map((_, ri) => {\n const checked = values[pi]?.[ri] ?? false\n return (\n <td key={ri} className=\"border border-border px-3 py-2 text-center\">\n {readonly === true ? (\n <span className={checked ? 'text-success' : 'text-fg-muted'}>{checked ? '✓' : '—'}</span>\n ) : (\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange?.(pi, ri, e.target.checked)}\n className=\"cursor-pointer accent-accent\"\n aria-label={`${perm} - ${roles[ri]}`}\n />\n )}\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n\nexport { PermissionMatrix }\nexport type { PermissionMatrixProps }\n","// progress-timeline — horizontal milestone tracker with progress line\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type Milestone = {\n label: string\n date: string\n completed: boolean\n}\n\nexport type ProgressTimelineProps = {\n milestones: Milestone[]\n className?: string\n}\n\nexport const ProgressTimeline = forwardRef<HTMLDivElement, ProgressTimelineProps>(\n function ProgressTimeline({ milestones, className }, ref) {\n const lastCompletedIdx = milestones.reduce(\n (acc, m, i) => (m.completed ? i : acc),\n -1,\n )\n\n return (\n <div\n ref={ref}\n className={cx('select-none', className)}\n data-component=\"progress-timeline\"\n >\n <div className=\"relative flex items-start justify-between\">\n {/* background line */}\n <div className=\"absolute top-3 right-4 left-4 h-0.5 bg-border\" />\n\n {/* progress line */}\n {lastCompletedIdx >= 0 && milestones.length > 1 && (\n <div\n className=\"absolute top-3 left-4 h-0.5 bg-accent\"\n style={{\n width: `${(lastCompletedIdx / (milestones.length - 1)) * 100}%`,\n }}\n />\n )}\n\n {milestones.map((milestone, i) => (\n <div\n key={`${milestone.label}-${i}`}\n className=\"relative z-10 flex flex-col items-center gap-1\"\n >\n {/* circle */}\n <div\n className={cx(\n 'h-6 w-6 rounded-full border-2 transition-colors',\n milestone.completed\n ? 'border-accent bg-accent'\n : 'border-border bg-bg',\n )}\n data-completed={milestone.completed}\n />\n {/* label */}\n <span className=\"text-xs font-medium text-fg\">\n {milestone.label}\n </span>\n {/* date */}\n <span className=\"gds-text-body text-fg-muted\">{milestone.date}</span>\n </div>\n ))}\n </div>\n </div>\n )\n },\n)\n","// property-editor — key-value property editor with inline editing\nimport { forwardRef } from 'react'\n\nimport { InlineEdit } from '../l4-molecules/inline-edit'\nimport { cx } from '../utils/cx'\n\ntype PropertyItem = {\n editable?: boolean\n key: string\n value: string\n}\n\ntype PropertyEditorProps = {\n className?: string\n onChange?: (key: string, value: string) => void\n properties: PropertyItem[]\n}\n\nexport const PropertyEditor = forwardRef<HTMLDivElement, PropertyEditorProps>(\n function PropertyEditor({ className, onChange, properties }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-radius-popover border border-border overflow-hidden', className)}\n data-component=\"property-editor\"\n >\n {properties.map((prop, i) => (\n <div\n key={prop.key}\n className={cx(\n 'flex items-center justify-between gds-pad-x gds-pad-y-sm',\n i < properties.length - 1 && 'border-b border-border',\n )}\n >\n <span className=\"gds-text-body font-medium text-fg-muted\">{prop.key}</span>\n <div className=\"text-right\">\n {prop.editable === true && onChange !== undefined ? (\n <InlineEdit\n onSave={(v) => onChange(prop.key, v)}\n value={prop.value}\n />\n ) : (\n <span className=\"gds-text-body text-fg\">{prop.value}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { PropertyEditorProps, PropertyItem }\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype QuickLink = {\n href?: string\n icon?: ReactNode\n label: string\n onClick?: () => void\n}\n\ntype QuickLinksProps = React.HTMLAttributes<HTMLDivElement> & {\n columns?: number\n links: QuickLink[]\n}\n\nexport const QuickLinks = forwardRef<HTMLDivElement, QuickLinksProps>(\n function QuickLinks({ className, columns = 4, links, ...props }, ref) {\n return (\n <div\n className={cx('grid gap-3', className)}\n data-component=\"quick-links\"\n ref={ref}\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n {...props}\n >\n {links.map((link) => {\n const Tag = link.href !== undefined ? 'a' : 'button'\n return (\n <Tag\n key={link.label}\n className={cx(\n 'flex flex-col items-center gap-2 rounded-lg border border-border bg-surface p-4 text-fg transition-colors hover:bg-bg-secondary',\n focusCls,\n )}\n {...(link.href !== undefined ? { href: link.href } : {})}\n onClick={link.onClick}\n >\n {link.icon !== undefined && <div className=\"text-fg-muted\">{link.icon}</div>}\n <span className=\"text-xs font-medium select-none\">{link.label}</span>\n </Tag>\n )\n })}\n </div>\n )\n },\n)\n\nexport type { QuickLink, QuickLinksProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype RecentActivityItem = {\n action: string\n timestamp: string\n user: string\n}\n\ntype RecentActivityProps = React.HTMLAttributes<HTMLDivElement> & {\n items: RecentActivityItem[]\n title?: string\n}\n\nconst RecentActivity = forwardRef<HTMLDivElement, RecentActivityProps>(\n function RecentActivity({ className, items, title = 'Recent Activity', ...props }, ref) {\n return (\n <div className={cx('flex flex-col', className)} data-component=\"recent-activity\" ref={ref} {...props}>\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-fg-muted\">{title}</h3>\n <div className=\"flex flex-col gap-1\">\n {items.map((item, i) => (\n <div className=\"flex items-baseline justify-between gap-2 py-1 text-sm\" key={i}>\n <div className=\"min-w-0 truncate\">\n <span className=\"font-medium text-fg\">{item.user}</span>\n <span className=\"text-fg-muted\"> {item.action}</span>\n </div>\n <span className=\"shrink-0 text-xs text-fg-muted\">{item.timestamp}</span>\n </div>\n ))}\n {items.length === 0 && (\n <p className=\"py-2 text-center text-xs text-fg-muted\">No activity</p>\n )}\n </div>\n </div>\n )\n },\n)\n\nexport { RecentActivity }\nexport type { RecentActivityItem, RecentActivityProps }\n","// responsive-stack — column-to-row layout that switches at a breakpoint\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ResponsiveStackProps = {\n children: ReactNode\n breakpoint?: 'sm' | 'md' | 'lg'\n gap?: 'sm' | 'default' | 'lg'\n align?: 'start' | 'center' | 'end' | 'stretch'\n className?: string\n}\n\nconst breakpointMap = {\n sm: 'sm:flex-row',\n md: 'md:flex-row',\n lg: 'lg:flex-row',\n} as const\n\nconst gapMap = {\n sm: 'gap-2',\n default: 'gap-4',\n lg: 'gap-6',\n} as const\n\nconst alignMap = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n} as const\n\nexport const ResponsiveStack = forwardRef<HTMLDivElement, ResponsiveStackProps>(\n function ResponsiveStack({ children, breakpoint = 'md', gap = 'default', align = 'stretch', className }, ref) {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col',\n breakpointMap[breakpoint],\n gapMap[gap],\n alignMap[align],\n className,\n )}\n data-component=\"responsive-stack\"\n >\n {children}\n </div>\n )\n },\n)\n","// table — lightweight styled table wrapper\n// for when DataTable is overkill — just semantic HTML table elements with styling\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\nexport type TableProps = React.HTMLAttributes<HTMLTableElement> & {\n striped?: boolean\n compact?: boolean\n hoverable?: boolean\n glass?: boolean\n className?: string\n}\n\n// semantic sub-components for manual table composition\n\nexport const Thead = forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function Thead({ className, ...props }, ref) {\n return <thead ref={ref} className={className} {...props} />\n },\n)\n\nexport const Tbody = forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function Tbody({ className, ...props }, ref) {\n return <tbody ref={ref} className={className} {...props} />\n },\n)\n\nexport const Tfoot = forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function Tfoot({ className, ...props }, ref) {\n return <tfoot ref={ref} className={cx('bg-bg-secondary font-semibold', className)} {...props} />\n },\n)\n\nexport const Tr = forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n function Tr({ className, ...props }, ref) {\n return <tr ref={ref} className={cx('transition-colors', className)} {...props} />\n },\n)\n\nexport const Th = forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n function Th({ className, ...props }, ref) {\n return <th ref={ref} className={cx('border border-border bg-bg-secondary px-2.5 py-1.5 text-left text-xs font-semibold tracking-wide whitespace-nowrap text-fg-muted', className)} {...props} />\n },\n)\n\nexport const Td = forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n function Td({ className, ...props }, ref) {\n return <td ref={ref} className={cx('border border-border/60 px-2.5 py-1.5 text-xs whitespace-nowrap text-fg', className)} {...props} />\n },\n)\n\nexport const ThNum = forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n function ThNum({ className, ...props }, ref) {\n return <th ref={ref} className={cx('border border-border bg-bg-secondary px-2.5 py-1.5 text-right text-xs font-semibold tracking-wide whitespace-nowrap text-fg-muted', className)} {...props} />\n },\n)\n\nexport const TdNum = forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n function TdNum({ className, ...props }, ref) {\n return <td ref={ref} className={cx('border border-border/60 px-2.5 py-1.5 text-right text-xs tabular-nums whitespace-nowrap text-fg', className)} {...props} />\n },\n)\n\nexport const TdMuted = forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n function TdMuted({ className, ...props }, ref) {\n return <td ref={ref} className={cx('border border-border/60 px-2.5 py-1.5 text-xs whitespace-nowrap text-fg-muted', className)} {...props} />\n },\n)\n\nexport const TdFoot = forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n function TdFoot({ className, ...props }, ref) {\n return <td ref={ref} className={cx('border border-border bg-bg-secondary px-2.5 py-1.5 text-xs font-semibold whitespace-nowrap text-fg', className)} {...props} />\n },\n)\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n function TableCaption({ className, ...props }, ref) {\n return <caption ref={ref} className={cx('mt-2 text-xs text-fg-muted', className)} {...props} />\n },\n)\n\nexport const TableFooter = forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function TableFooter({ className, ...props }, ref) {\n return <tfoot ref={ref} className={cx('bg-bg-secondary font-semibold', className)} {...props} />\n },\n)\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n function Table({ striped, compact, hoverable = true, glass, className, children, ...props }, ref) {\n return (\n <div\n data-component=\"table\"\n data-striped={striped ?? undefined}\n data-compact={compact ?? undefined}\n className={cx(\n 'gds-radius-popover overflow-hidden border border-border',\n glassClass(glass),\n striped && '[&_tbody_tr:nth-child(even)]:bg-bg-secondary/30',\n compact && '[&_th]:px-2 [&_th]:py-1 [&_td]:px-2 [&_td]:py-1',\n !compact && '[&_th]:gds-pad-x [&_th]:py-1.5 [&_td]:gds-pad-x [&_td]:gds-pad-y',\n hoverable && '[&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-bg-tertiary/30',\n '[&_th]:bg-bg-tertiary/50 [&_th]:text-left [&_th]:font-medium [&_th]:text-fg-muted [&_th]:border-b [&_th]:border-border [&_th]:gds-text-body',\n '[&_td]:border-b [&_td]:border-border [&_td]:gds-text-body [&_tbody_tr:last-child_td]:border-0',\n className,\n )}\n >\n <table ref={ref} className=\"w-full\" {...props}>\n {children}\n </table>\n </div>\n )\n },\n)\n","import { forwardRef, useSyncExternalStore } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport { Table } from './table'\n\ntype ResponsiveTableColumn = { key: string; header: string }\n\ntype ResponsiveTableProps = React.HTMLAttributes<HTMLDivElement> & {\n columns: ResponsiveTableColumn[]\n data: Record<string, unknown>[]\n glass?: boolean\n className?: string\n}\n\n// simple media query hook without useEffect\nconst mobileQuery = typeof window !== 'undefined' ? window.matchMedia('(max-width: 1023px)') : null\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener('change', cb)\n return () => mobileQuery?.removeEventListener('change', cb)\n}\n\nfunction getIsMobile() {\n return mobileQuery?.matches ?? false\n}\n\nexport const ResponsiveTable = forwardRef<HTMLDivElement, ResponsiveTableProps>(\n function ResponsiveTable({ columns, data, glass, className, ...props }, ref) {\n const isMobile = useSyncExternalStore(subscribeMobile, getIsMobile, () => false)\n\n if (isMobile) {\n return (\n <div\n className={cx('flex flex-col gds-gap', className)}\n data-component=\"responsive-table\"\n data-mode=\"cards\"\n ref={ref}\n {...props}\n >\n {data.map((row, i) => (\n <div\n key={i}\n className={cx(\n 'gds-radius-popover border border-border gds-pad',\n glassClass(glass),\n )}\n >\n {columns.map((col) => (\n <div key={col.key} className=\"flex justify-between gds-pad-y-sm\">\n <span className=\"gds-text-caption font-medium text-fg-muted\">{col.header}</span>\n <span className=\"gds-text-body text-fg\">{String(row[col.key] ?? '')}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div data-component=\"responsive-table\" data-mode=\"table\" ref={ref} {...props}>\n <Table glass={glass} className={className}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th key={col.key}>{col.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, i) => (\n <tr key={i}>\n {columns.map((col) => (\n <td key={col.key}>{String(row[col.key] ?? '')}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </Table>\n </div>\n )\n },\n)\n\nexport type { ResponsiveTableColumn, ResponsiveTableProps }\n","// rich-select-list — option list dropdown for rich-select\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { RichSelectOption } from './rich-select'\n\ntype RichSelectListProps = {\n options: RichSelectOption[]\n value: string | null\n focusedIndex: number\n glass?: boolean\n onSelect: (value: string) => void\n onFocus: (index: number) => void\n}\n\nexport type { RichSelectListProps }\n\nexport function RichSelectList({ options, value, focusedIndex, glass, onSelect, onFocus }: RichSelectListProps) {\n return (\n <div\n role=\"listbox\"\n className={cx(\n 'absolute z-50 mt-1 w-full gds-radius-popover border border-border bg-bg shadow-lg overflow-auto max-h-60',\n glassClass(glass),\n )}\n >\n {options.map((opt, i) => (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n data-focused={i === focusedIndex ? '' : undefined}\n className={cx(\n 'flex items-start gap-2 px-3 py-2 cursor-pointer transition-colors',\n opt.value === value && 'bg-accent/10 text-accent',\n i === focusedIndex && 'bg-bg-tertiary/50',\n opt.value !== value && i !== focusedIndex && 'hover:bg-bg-tertiary/30',\n )}\n onClick={() => onSelect(opt.value)}\n onMouseEnter={() => onFocus(i)}\n >\n {opt.icon !== undefined && <span className=\"mt-0.5 shrink-0\">{opt.icon}</span>}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm truncate\">{opt.label}</div>\n {opt.description !== undefined && (\n <div className=\"text-xs text-fg-muted truncate\">{opt.description}</div>\n )}\n </div>\n {opt.badge !== undefined && (\n <span className=\"shrink-0 rounded-full bg-bg-tertiary px-2 py-0.5 text-[10px] text-fg-muted\">\n {opt.badge}\n </span>\n )}\n </div>\n ))}\n </div>\n )\n}\n","// rich-select — dropdown with icons, descriptions, and badges per option\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { RichSelectList } from './rich-select-list'\n\nexport type RichSelectOption = {\n value: string\n label: string\n description?: string\n icon?: React.ReactNode\n badge?: string\n}\n\nexport type RichSelectProps = {\n options: RichSelectOption[]\n value: string | null\n onChange: (value: string | null) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const RichSelect = forwardRef<HTMLDivElement, RichSelectProps>(\n function RichSelect({ options, value, onChange, placeholder, disabled, error, glass, className }, ref) {\n const [open, setOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const selected = options.find((o) => o.value === value)\n\n // close on outside click\n useEffect(() => {\n if (!open) return\n function handleClick(e: MouseEvent) {\n if (containerRef.current !== null && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return\n\n if (e.key === 'Escape') {\n setOpen(false)\n return\n }\n\n if (!open) {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n setOpen(true)\n setFocusedIndex(0)\n }\n return\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setFocusedIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1))\n } else if (e.key === 'Enter') {\n e.preventDefault()\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n onChange(options[focusedIndex].value)\n setOpen(false)\n }\n }\n },\n [disabled, open, options, focusedIndex, onChange],\n )\n\n const handleSelect = useCallback((val: string) => {\n onChange(val)\n setOpen(false)\n }, [onChange])\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n data-component=\"rich-select\"\n data-state={open ? 'open' : 'closed'}\n className={cx('relative', className)}\n onKeyDown={handleKeyDown}\n >\n <button\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'flex w-full items-center gap-2 gds-radius-input border gds-pad-x gds-h-lg text-sm text-left transition-colors',\n error ? 'border-danger' : 'border-border hover:border-fg-muted',\n disabled && 'opacity-50 cursor-not-allowed',\n glassClass(glass),\n focusCls,\n )}\n onClick={() => setOpen((p) => !p)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n >\n {selected !== undefined ? (\n <>\n {selected.icon !== undefined && <span className=\"shrink-0\">{selected.icon}</span>}\n <span className=\"flex-1 truncate text-fg\">{selected.label}</span>\n </>\n ) : (\n <span className=\"flex-1 truncate text-fg-muted\">{placeholder ?? 'Select...'}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 shrink-0 text-fg-muted\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 4.5l3 3 3-3\" />\n </svg>\n </button>\n\n {open && (\n <RichSelectList\n options={options}\n value={value}\n focusedIndex={focusedIndex}\n glass={glass}\n onSelect={handleSelect}\n onFocus={setFocusedIndex}\n />\n )}\n </div>\n )\n },\n)\n","// search-results — list of search results with query highlighting and category badges\nimport { forwardRef } from 'react'\n\nimport { Badge } from '../l2-primitives/badge'\nimport { Highlight } from '../l2-primitives/highlight'\nimport { cx } from '../utils/cx'\n\ntype SearchResult = {\n id: string\n title: string\n description?: string\n category?: string\n url?: string\n}\n\ntype SearchResultsProps = {\n results: SearchResult[]\n query: string\n total?: number\n onSelect?: (id: string) => void\n className?: string\n}\n\nconst SearchResults = forwardRef<HTMLDivElement, SearchResultsProps>(\n function SearchResults({ results, query, total, onSelect, className }, ref) {\n return (\n <div ref={ref} className={cx('flex flex-col', className)} data-component=\"search-results\">\n {total !== undefined && (\n <div className=\"gds-pad-x py-2 text-xs text-fg-muted\">\n {total} result{total !== 1 ? 's' : ''} found\n </div>\n )}\n {results.map((result) => (\n <div\n key={result.id}\n role={onSelect !== undefined ? 'button' : undefined}\n tabIndex={onSelect !== undefined ? 0 : undefined}\n onClick={onSelect !== undefined ? () => onSelect(result.id) : undefined}\n onKeyDown={onSelect !== undefined ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelect(result.id) }\n } : undefined}\n className={cx(\n 'gds-pad-x gds-pad-y border-b border-border last:border-b-0',\n onSelect !== undefined && 'cursor-pointer hover:bg-bg-tertiary transition-colors',\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Highlight text={result.title} query={query} className=\"font-medium text-fg gds-text-body\" />\n {result.category !== undefined && <Badge>{result.category}</Badge>}\n </div>\n {result.description !== undefined && (\n <Highlight text={result.description} query={query} className=\"mt-0.5 text-fg-muted gds-text-caption line-clamp-2\" />\n )}\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport { SearchResults }\nexport type { SearchResult, SearchResultsProps }\n","// service-card — service/server status card with health, metrics, and tags\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type ServiceCardStatus = 'error' | 'healthy' | 'offline' | 'warning'\n\nexport type ServiceCardProps = {\n name: string\n description?: string\n status: ServiceCardStatus\n metrics?: { label: string; value: string }[]\n tags?: string[]\n url?: string\n className?: string\n}\n\nconst statusDot: Record<ServiceCardStatus, string> = {\n healthy: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-danger',\n offline: 'bg-fg-muted/40',\n}\n\nconst statusLabel: Record<ServiceCardStatus, string> = {\n healthy: 'Healthy',\n warning: 'Warning',\n error: 'Error',\n offline: 'Offline',\n}\n\nexport const ServiceCard = forwardRef<HTMLDivElement, ServiceCardProps>(\n function ServiceCard({ name, description, status, metrics, tags, url, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('gds-ctx gds-radius-card border border-border bg-surface gds-pad', className)}\n data-component=\"service-card\"\n data-state={status}\n >\n {/* header */}\n <div className=\"flex items-center gap-2\">\n <span className={cx('h-2.5 w-2.5 rounded-full', statusDot[status])} />\n <span className=\"font-semibold text-fg\">{name}</span>\n <span className=\"ml-auto text-xs text-fg-muted\">{statusLabel[status]}</span>\n </div>\n\n {description !== undefined && (\n <p className=\"mt-1.5 gds-text-body text-fg-muted\">{description}</p>\n )}\n\n {/* metrics */}\n {metrics !== undefined && metrics.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n {metrics.map((m) => (\n <div key={m.label} className=\"flex gap-1\">\n <span className=\"text-fg-muted\">{m.label}</span>\n <span className=\"font-medium text-fg\">{m.value}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* tags + url */}\n {(tags !== undefined || url !== undefined) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-1.5\">\n {tags?.map((tag) => (\n <span key={tag} className=\"rounded-full bg-bg-tertiary px-2 py-0.5 text-[10px] text-fg-muted\">\n {tag}\n </span>\n ))}\n {url !== undefined && (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className=\"ml-auto text-xs text-accent hover:underline\">\n {url}\n </a>\n )}\n </div>\n )}\n </div>\n )\n },\n)\n","// signature-drawing — pure canvas drawing utilities (no React dependency)\n\ntype Point = { x: number; y: number }\n\ntype DrawConfig = {\n strokeColor: string\n strokeWidth: number\n}\n\nfunction getCanvasPosition(\n canvas: HTMLCanvasElement,\n clientX: number,\n clientY: number,\n): Point {\n const rect = canvas.getBoundingClientRect()\n return {\n x: (clientX - rect.left) * (canvas.width / rect.width),\n y: (clientY - rect.top) * (canvas.height / rect.height),\n }\n}\n\nfunction beginStroke(\n ctx: CanvasRenderingContext2D,\n point: Point,\n config: DrawConfig,\n): void {\n ctx.strokeStyle = config.strokeColor\n ctx.lineWidth = config.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.beginPath()\n ctx.moveTo(point.x, point.y)\n}\n\nfunction continueStroke(\n ctx: CanvasRenderingContext2D,\n point: Point,\n): void {\n ctx.lineTo(point.x, point.y)\n ctx.stroke()\n}\n\nfunction clearCanvas(canvas: HTMLCanvasElement): void {\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n}\n\nfunction canvasToDataUrl(canvas: HTMLCanvasElement): string {\n return canvas.toDataURL('image/png')\n}\n\nexport { beginStroke, canvasToDataUrl, clearCanvas, continueStroke, getCanvasPosition }\nexport type { DrawConfig, Point }\n","// signature-pad — canvas-based signature capture\nimport { forwardRef, useCallback, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { beginStroke, canvasToDataUrl, clearCanvas, continueStroke, getCanvasPosition } from './signature-drawing'\n\ntype SignaturePadProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n disabled?: boolean\n height?: number\n onSign: (dataUrl: string) => void\n strokeColor?: string\n strokeWidth?: number\n width?: number\n}\n\nexport const SignaturePad = forwardRef<HTMLDivElement, SignaturePadProps>(\n function SignaturePad(\n {\n className,\n disabled,\n height = 200,\n onSign,\n strokeColor = 'var(--gds-fg)',\n strokeWidth = 2,\n width = 400,\n ...props\n },\n ref,\n ) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const isDrawingRef = useRef(false)\n const [isEmpty, setIsEmpty] = useState(true)\n\n const startDraw = useCallback(\n (clientX: number, clientY: number) => {\n if (disabled === true) return\n const canvas = canvasRef.current\n if (canvas === null) return\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n isDrawingRef.current = true\n const pos = getCanvasPosition(canvas, clientX, clientY)\n beginStroke(ctx, pos, { strokeColor, strokeWidth })\n },\n [disabled, strokeColor, strokeWidth],\n )\n\n const draw = useCallback(\n (clientX: number, clientY: number) => {\n if (!isDrawingRef.current) return\n const canvas = canvasRef.current\n if (canvas === null) return\n const ctx = canvas.getContext('2d')\n if (ctx === null) return\n const pos = getCanvasPosition(canvas, clientX, clientY)\n continueStroke(ctx, pos)\n setIsEmpty(false)\n },\n [],\n )\n\n const endDraw = useCallback(() => {\n if (!isDrawingRef.current) return\n isDrawingRef.current = false\n const canvas = canvasRef.current\n if (canvas !== null) {\n onSign(canvasToDataUrl(canvas))\n }\n }, [onSign])\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n startDraw(e.clientX, e.clientY)\n },\n [startDraw],\n )\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n draw(e.clientX, e.clientY)\n },\n [draw],\n )\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n const touch = e.touches[0]\n if (touch === undefined) return\n startDraw(touch.clientX, touch.clientY)\n },\n [startDraw],\n )\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n const touch = e.touches[0]\n if (touch === undefined) return\n draw(touch.clientX, touch.clientY)\n },\n [draw],\n )\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n endDraw()\n },\n [endDraw],\n )\n\n const handleClear = useCallback(() => {\n const canvas = canvasRef.current\n if (canvas === null) return\n clearCanvas(canvas)\n setIsEmpty(true)\n }, [])\n\n return (\n <div\n className={cx(\n 'gds-ctx inline-flex flex-col gap-2 gds-radius-popover border border-border bg-surface p-3',\n disabled === true && 'pointer-events-none opacity-40',\n className,\n )}\n data-component=\"signature-pad\"\n ref={ref}\n {...props}\n >\n <div className=\"relative\">\n <canvas\n className=\"block cursor-crosshair rounded border border-border/50 bg-bg\"\n height={height}\n onMouseDown={handleMouseDown}\n onMouseLeave={endDraw}\n onMouseMove={handleMouseMove}\n onMouseUp={endDraw}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onTouchStart={handleTouchStart}\n ref={canvasRef}\n style={{ width, height }}\n width={width}\n />\n {isEmpty && (\n <div className=\"pointer-events-none absolute inset-0 flex items-end justify-center pb-4\">\n <span className=\"select-none text-xs text-fg-muted/50\">Sign above</span>\n </div>\n )}\n </div>\n <div className=\"flex justify-end\">\n <button\n className={cx(\n 'rounded px-2.5 py-1 text-xs text-fg-muted transition-colors hover:bg-fg-muted/10 hover:text-fg',\n focusCls,\n )}\n onClick={handleClear}\n type=\"button\"\n >\n Clear\n </button>\n </div>\n </div>\n )\n },\n)\n\nexport type { SignaturePadProps }\n","import type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SortableItem = {\n id: string\n content: ReactNode\n}\n\ntype SortableListProps = React.HTMLAttributes<HTMLDivElement> & {\n items: SortableItem[]\n onReorder: (items: SortableItem[]) => void\n disabled?: boolean\n itemClassName?: string\n}\n\n// grip icon inline svg\nfunction GripIcon() {\n return (\n <svg\n className=\"h-4 w-4 text-fg-muted/50\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <circle cx=\"5\" cy=\"3\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"3\" r=\"1.2\" />\n <circle cx=\"5\" cy=\"8\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"8\" r=\"1.2\" />\n <circle cx=\"5\" cy=\"13\" r=\"1.2\" />\n <circle cx=\"11\" cy=\"13\" r=\"1.2\" />\n </svg>\n )\n}\n\nexport const SortableList = forwardRef<HTMLDivElement, SortableListProps>(\n function SortableList(\n { className, disabled, itemClassName, items, onReorder, ...props },\n ref,\n ) {\n const [dragIndex, setDragIndex] = useState<number | null>(null)\n const [dropIndex, setDropIndex] = useState<number | null>(null)\n\n function handleDragStart(index: number) {\n if (disabled) return\n setDragIndex(index)\n }\n\n function handleDragOver(e: React.DragEvent, index: number) {\n e.preventDefault()\n setDropIndex(index)\n }\n\n function handleDragLeave() {\n setDropIndex(null)\n }\n\n function handleDrop(e: React.DragEvent, targetIndex: number) {\n e.preventDefault()\n if (dragIndex === null || dragIndex === targetIndex) {\n setDragIndex(null)\n setDropIndex(null)\n return\n }\n\n const reordered = [...items]\n const [moved] = reordered.splice(dragIndex, 1)\n if (moved !== undefined) {\n reordered.splice(targetIndex, 0, moved)\n }\n onReorder(reordered)\n setDragIndex(null)\n setDropIndex(null)\n }\n\n function handleDragEnd() {\n setDragIndex(null)\n setDropIndex(null)\n }\n\n return (\n <div\n className={cx('flex flex-col', className)}\n data-component=\"sortable-list\"\n ref={ref}\n {...props}\n >\n {items.map((item, index) => (\n <div\n className={cx(\n 'flex items-center gds-gap border-b border-border px-2 py-2 transition-opacity',\n dragIndex === index && 'opacity-50',\n dropIndex === index && 'border-t-2 border-t-accent',\n disabled !== true && 'cursor-grab active:cursor-grabbing',\n disabled === true && 'pointer-events-none opacity-60',\n itemClassName,\n )}\n data-item-id={item.id}\n draggable={disabled !== true}\n key={item.id}\n onDragEnd={handleDragEnd}\n onDragLeave={handleDragLeave}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragStart={() => handleDragStart(index)}\n onDrop={(e) => handleDrop(e, index)}\n >\n {disabled !== true && (\n <span className=\"flex-shrink-0 select-none\">\n <GripIcon />\n </span>\n )}\n <div className=\"flex-1\">{item.content}</div>\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport type { SortableItem, SortableListProps }\n","// sortable-table — table with client-side column sorting\nimport { forwardRef, useMemo, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SortableColumn = {\n key: string\n header: string\n sortable?: boolean\n}\n\ntype SortState = {\n key: string\n dir: 'asc' | 'desc'\n}\n\ntype SortableTableProps = React.HTMLAttributes<HTMLDivElement> & {\n columns: SortableColumn[]\n data: Record<string, unknown>[]\n defaultSort?: SortState\n}\n\nexport const SortableTable = forwardRef<HTMLDivElement, SortableTableProps>(\n function SortableTable({ columns, data, defaultSort, className, ...props }, ref) {\n const [sort, setSort] = useState<SortState | undefined>(defaultSort)\n\n const sorted = useMemo(() => {\n if (sort === undefined) return data\n return [...data].sort((a, b) => {\n const av = String(a[sort.key] ?? '')\n const bv = String(b[sort.key] ?? '')\n const cmp = av.localeCompare(bv, undefined, { numeric: true })\n return sort.dir === 'asc' ? cmp : -cmp\n })\n }, [data, sort])\n\n function toggleSort(key: string) {\n if (sort?.key === key) {\n setSort({ key, dir: sort.dir === 'asc' ? 'desc' : 'asc' })\n } else {\n setSort({ key, dir: 'asc' })\n }\n }\n\n return (\n <div ref={ref} className={cx('overflow-hidden rounded-lg border border-border', className)} data-component=\"sortable-table\" {...props}>\n <table className=\"w-full text-left gds-text\">\n <thead>\n <tr className=\"border-b border-border bg-bg-tertiary/50\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cx(\n 'px-3 py-1.5 font-medium text-fg-muted',\n col.sortable !== false && 'cursor-pointer select-none hover:text-fg',\n )}\n onClick={col.sortable !== false ? () => toggleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {sort?.key === col.key && (\n <span className=\"text-[10px]\">{sort.dir === 'asc' ? '▲' : '▼'}</span>\n )}\n </span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.map((row, i) => (\n <tr key={`${String(row[columns[0]?.key ?? ''] ?? '')}-${i}`} className=\"border-b border-border last:border-0 transition-colors hover:bg-bg-tertiary/30\">\n {columns.map((col) => (\n <td key={col.key} className=\"px-3 py-1.5 text-fg\">\n {String(row[col.key] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n },\n)\n\nexport type { SortableColumn, SortableTableProps, SortState }\n","// spotlight — dims everything except a target element for onboarding/tutorials\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { renderPortal } from '../utils/portal'\n\ntype Rect = { top: number; left: number; width: number; height: number }\n\nexport type SpotlightProps = {\n active: boolean\n targetRef: React.RefObject<HTMLElement | null>\n title?: string\n description?: string\n placement?: 'top' | 'bottom' | 'left' | 'right'\n onClose?: () => void\n className?: string\n}\n\nfunction useTargetRect(\n targetRef: React.RefObject<HTMLElement | null>,\n active: boolean,\n): Rect | null {\n const [rect, setRect] = useState<Rect | null>(null)\n\n useEffect(() => {\n if (!active) {\n setRect(null)\n return\n }\n const el = targetRef.current\n if (el === null) return\n\n const measure = () => {\n const r = el.getBoundingClientRect()\n setRect({ top: r.top, left: r.left, width: r.width, height: r.height })\n }\n measure()\n\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => {\n window.removeEventListener('resize', measure)\n window.removeEventListener('scroll', measure, true)\n }\n }, [active, targetRef])\n\n return rect\n}\n\nfunction computeCardStyle(\n rect: Rect,\n placement: 'top' | 'bottom' | 'left' | 'right',\n): React.CSSProperties {\n const gap = 12\n const base: React.CSSProperties = { position: 'fixed' }\n\n if (placement === 'bottom') {\n return { ...base, top: rect.top + rect.height + gap, left: rect.left }\n }\n if (placement === 'top') {\n return { ...base, bottom: window.innerHeight - rect.top + gap, left: rect.left }\n }\n if (placement === 'left') {\n return { ...base, top: rect.top, right: window.innerWidth - rect.left + gap }\n }\n // right\n return { ...base, top: rect.top, left: rect.left + rect.width + gap }\n}\n\nexport function Spotlight({\n active,\n targetRef,\n title,\n description,\n placement = 'bottom',\n onClose,\n className,\n}: SpotlightProps): ReactNode {\n const rect = useTargetRect(targetRef, active)\n\n // escape key\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n\n const handleEscape = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && onCloseRef.current !== undefined) {\n onCloseRef.current()\n }\n }, [])\n\n useEffect(() => {\n if (!active) return\n window.addEventListener('keydown', handleEscape)\n return () => window.removeEventListener('keydown', handleEscape)\n }, [active, handleEscape])\n\n if (!active || rect === null) return null\n\n const pad = 6\n const overlay = (\n <div\n className={cx('fixed inset-0 z-[9998]', className)}\n data-component=\"spotlight\"\n onClick={onClose}\n >\n {/* highlight hole via box-shadow */}\n <div\n className=\"absolute rounded-md\"\n style={{\n top: rect.top - pad,\n left: rect.left - pad,\n width: rect.width + pad * 2,\n height: rect.height + pad * 2,\n boxShadow: '0 0 0 9999px rgba(0,0,0,0.6)',\n pointerEvents: 'none',\n }}\n />\n\n {/* tooltip card */}\n <div\n className=\"z-[9999] max-w-xs rounded-lg border border-white/10 bg-bg-secondary p-4 shadow-lg\"\n style={computeCardStyle(rect, placement)}\n onClick={(e) => e.stopPropagation()}\n >\n {title !== undefined && (\n <p className=\"text-sm font-semibold text-fg\">{title}</p>\n )}\n {description !== undefined && (\n <p className=\"mt-1 text-xs text-fg-muted\">{description}</p>\n )}\n {onClose !== undefined && (\n <button\n className=\"mt-3 text-xs font-medium text-accent hover:text-accent/80\"\n onClick={onClose}\n >\n Got it\n </button>\n )}\n </div>\n </div>\n )\n\n return renderPortal(overlay)\n}\n","// stacked-list — vertical list with header, footer, and selectable items\nimport type { ReactNode } from 'react'\n\nimport { ListItem } from '../l4-molecules/list-item'\nimport { cx } from '../utils/cx'\n\nexport type StackedListItem = {\n id: string\n title: string\n description?: string\n icon?: ReactNode\n trailing?: ReactNode\n}\n\nexport type StackedListProps = {\n items: StackedListItem[]\n header?: ReactNode\n footer?: ReactNode\n onSelect?: (id: string) => void\n selectedId?: string\n dividers?: boolean\n glass?: boolean\n className?: string\n}\n\nexport function StackedList({\n items,\n header,\n footer,\n onSelect,\n selectedId,\n dividers = true,\n glass,\n className,\n}: StackedListProps) {\n return (\n <div\n data-component=\"stacked-list\"\n className={cx(\n 'overflow-hidden gds-radius-card border border-border',\n glass === true && 'bg-white/5 backdrop-blur-md',\n className,\n )}\n >\n {header !== undefined && (\n <div className=\"border-b border-border bg-bg-tertiary/30 px-4 py-2.5\">{header}</div>\n )}\n <div>\n {items.map((item, i) => (\n <ListItem\n key={item.id}\n icon={item.icon}\n title={item.title}\n description={item.description}\n trailing={item.trailing}\n active={selectedId === item.id}\n onClick={onSelect !== undefined ? () => onSelect(item.id) : undefined}\n className={cx(\n dividers === true && i < items.length - 1 && 'border-b border-border/50',\n )}\n />\n ))}\n </div>\n {footer !== undefined && (\n <div className=\"border-t border-border px-4 py-2.5\">{footer}</div>\n )}\n </div>\n )\n}\n","// step-form — multi-step form wizard with stepper header and navigation buttons\nimport type { ReactNode } from 'react'\nimport { forwardRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type FormStep = {\n label: string\n description?: string\n content: ReactNode\n}\n\nexport type StepFormProps = {\n steps: FormStep[]\n onComplete: () => void\n className?: string\n}\n\nexport const StepForm = forwardRef<HTMLDivElement, StepFormProps>(\n function StepForm({ steps, onComplete, className }, ref) {\n const [current, setCurrent] = useState(0)\n const isFirst = current === 0\n const isLast = current === steps.length - 1\n\n const handleNext = () => {\n if (isLast) {\n onComplete()\n return\n }\n setCurrent((prev) => prev + 1)\n }\n\n const handleBack = () => {\n setCurrent((prev) => prev - 1)\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-6 select-none', className)}\n data-component=\"step-form\"\n >\n {/* step indicators */}\n <div className=\"flex items-center gap-2\">\n {steps.map((step, i) => (\n <div key={`${step.label}-${i}`} className=\"flex items-center gap-2\">\n {i > 0 && <div className={cx('h-px w-8', i <= current ? 'bg-accent' : 'bg-border')} />}\n <div className=\"flex items-center gap-2\">\n <div\n className={cx(\n 'flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium',\n i < current && 'bg-accent text-accent-fg',\n i === current && 'border-2 border-accent text-accent',\n i > current && 'border border-border text-fg-muted',\n )}\n >\n {i < current ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7l3 3 5-6\" />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span className={cx('text-xs', i === current ? 'font-medium text-fg' : 'text-fg-muted')}>\n {step.label}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* content */}\n <div className=\"min-h-[120px]\">{steps[current].content}</div>\n\n {/* navigation */}\n <div className=\"flex items-center justify-end gap-2\">\n {!isFirst && (\n <button\n type=\"button\"\n className={cx(\n 'h-8 gds-radius-button px-3 text-xs font-medium text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={handleBack}\n >\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'h-8 gds-radius-button bg-accent px-3 text-xs font-medium text-accent-fg transition-colors hover:bg-accent/90',\n focusCls,\n )}\n onClick={handleNext}\n >\n {isLast ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { Progress } from '../l2-primitives/progress'\nimport { cx } from '../utils/cx'\n\ntype HealthMetric = {\n label: string\n max?: number\n unit?: string\n value: number\n}\n\ntype SystemHealthProps = React.HTMLAttributes<HTMLDivElement> & {\n metrics: HealthMetric[]\n}\n\nfunction barVariant(pct: number): 'danger' | 'default' | 'success' | 'warning' {\n if (pct >= 90) return 'danger'\n if (pct >= 70) return 'warning'\n return 'success'\n}\n\nexport const SystemHealth = forwardRef<HTMLDivElement, SystemHealthProps>(\n function SystemHealth({ className, metrics, ...props }, ref) {\n return (\n <div\n className={cx('flex flex-col gds-gap', className)}\n data-component=\"system-health\"\n ref={ref}\n {...props}\n >\n {metrics.map((m) => {\n const max = m.max ?? 100\n const pct = max > 0 ? Math.round((m.value / max) * 100) : 0\n return (\n <div key={m.label} className=\"flex flex-col gap-1\">\n <div className=\"flex items-center justify-between gds-text-label\">\n <span className=\"text-fg\">{m.label}</span>\n <span className=\"text-fg-muted font-mono tabular-nums\">\n {m.value}{m.unit ?? ''} / {max}{m.unit ?? ''} ({pct}%)\n </span>\n </div>\n <Progress value={pct} variant={barVariant(pct)} size=\"sm\" />\n </div>\n )\n })}\n </div>\n )\n },\n)\n\nexport type { HealthMetric, SystemHealthProps }\n","// tag-cloud — interactive tag cloud with counts and selection\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TagCloudTag = {\n label: string\n count: number\n}\n\nexport type TagCloudProps = {\n tags: TagCloudTag[]\n selected?: string[]\n onToggle?: (label: string) => void\n className?: string\n}\n\nexport const TagCloud = forwardRef<HTMLDivElement, TagCloudProps>(\n function TagCloud({ tags, selected, onToggle, className }, ref) {\n const selectedSet = new Set(selected ?? [])\n return (\n <div\n ref={ref}\n className={cx('flex flex-wrap gap-2', className)}\n data-component=\"tag-cloud\"\n >\n {tags.map((tag) => {\n const isSelected = selectedSet.has(tag.label)\n return (\n <button\n key={tag.label}\n type=\"button\"\n onClick={() => onToggle?.(tag.label)}\n className={cx(\n 'rounded-full px-3 py-1 gds-text-body font-medium transition-colors select-none',\n isSelected\n ? 'bg-accent/15 text-accent'\n : 'bg-bg-tertiary text-fg-muted hover:bg-bg-tertiary/80',\n )}\n >\n {tag.label}\n <span className=\"ml-1.5 text-[10px] opacity-60\">{tag.count}</span>\n </button>\n )\n })}\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { TaskItem } from '../l4-molecules/task-item'\nimport { cx } from '../utils/cx'\n\ntype TaskBoardItem = {\n completed?: boolean\n id: string\n priority?: 'low' | 'medium' | 'high' | 'critical'\n title: string\n}\n\ntype TaskBoardSection = {\n id: string\n items: TaskBoardItem[]\n title: string\n}\n\ntype TaskBoardProps = React.HTMLAttributes<HTMLDivElement> & {\n onToggle?: (sectionId: string, itemId: string) => void\n sections: TaskBoardSection[]\n}\n\nconst TaskBoard = forwardRef<HTMLDivElement, TaskBoardProps>(\n function TaskBoard({ className, onToggle, sections, ...props }, ref) {\n return (\n <div className={cx('flex flex-col gds-gap', className)} data-component=\"task-board\" ref={ref} {...props}>\n {sections.map((section) => (\n <div className=\"rounded-lg border border-border bg-surface gds-pad\" key={section.id}>\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-fg-muted\">{section.title}</h3>\n <div className=\"flex flex-col gap-0.5\">\n {section.items.map((item) => (\n <TaskItem\n completed={item.completed}\n key={item.id}\n onToggle={onToggle !== undefined ? () => onToggle(section.id, item.id) : undefined}\n priority={item.priority}\n title={item.title}\n />\n ))}\n {section.items.length === 0 && (\n <p className=\"py-2 text-center text-xs text-fg-muted\">No items</p>\n )}\n </div>\n </div>\n ))}\n </div>\n )\n },\n)\n\nexport { TaskBoard }\nexport type { TaskBoardItem, TaskBoardProps, TaskBoardSection }\n","// timeline — vertical event timeline with variant-colored nodes\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type TimelineItem = {\n id: string\n title: string\n description?: string\n date?: string\n icon?: ReactNode\n variant?: 'danger' | 'default' | 'success' | 'warning'\n}\n\nexport type TimelineProps = {\n items: TimelineItem[]\n orientation?: 'vertical'\n className?: string\n}\n\nconst dotColors: Record<string, string> = {\n default: 'bg-fg-muted',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n}\n\n// composition sub-components\n\nexport type TimelineGroupProps = {\n children: ReactNode\n className?: string\n label: string\n}\n\nexport function TimelineGroup({ children, className, label }: TimelineGroupProps) {\n return (\n <div className={cx('', className)}>\n <div className=\"mb-2 pl-6 text-xs font-semibold text-fg-muted\">{label}</div>\n <div className=\"flex flex-col gap-4\">{children}</div>\n </div>\n )\n}\n\nexport type TimelineItemComponentProps = {\n children?: ReactNode\n className?: string\n description?: ReactNode\n icon?: ReactNode\n status?: 'danger' | 'default' | 'success' | 'warning'\n timestamp?: string\n title: ReactNode\n}\n\nexport function TimelineItemComponent({\n children,\n className,\n description,\n icon,\n status = 'default',\n timestamp,\n title,\n}: TimelineItemComponentProps) {\n return (\n <div className={cx('relative flex gds-gap pl-6', className)}>\n <div className=\"absolute left-0 top-1.5\">\n {icon !== undefined ? (\n <span className=\"flex h-[15px] w-[15px] items-center justify-center text-fg-muted\">{icon}</span>\n ) : (\n <span className={cx('block h-[15px] w-[15px] gds-radius-badge border-2 border-bg', dotColors[status])} />\n )}\n </div>\n <div className=\"min-w-0 flex-1 pb-1\">\n <div className=\"flex items-baseline justify-between gds-gap-sm\">\n <span className=\"text-sm font-medium text-fg\">{title}</span>\n {timestamp !== undefined && <span className=\"shrink-0 gds-text-body text-fg-muted\">{timestamp}</span>}\n </div>\n {description !== undefined && <p className=\"mt-0.5 gds-text-body text-fg-muted\">{description}</p>}\n {children}\n </div>\n </div>\n )\n}\n\nexport const Timeline = forwardRef<HTMLDivElement, TimelineProps>(\n function Timeline({ items, className }, ref) {\n return (\n <div\n ref={ref}\n className={cx('relative', className)}\n data-component=\"timeline\"\n >\n {/* vertical line */}\n <div className=\"absolute left-[7px] top-2 bottom-2 w-px bg-border\" />\n\n <div className=\"flex flex-col gap-4\">\n {items.map((item) => {\n const variant = item.variant ?? 'default'\n return (\n <div key={item.id} className=\"relative flex gds-gap pl-6\">\n {/* dot */}\n <div className=\"absolute left-0 top-1.5\">\n {item.icon !== undefined ? (\n <span className=\"flex h-[15px] w-[15px] items-center justify-center text-fg-muted\">\n {item.icon}\n </span>\n ) : (\n <span className={cx(\n 'block h-[15px] w-[15px] gds-radius-badge border-2 border-bg',\n dotColors[variant],\n )} />\n )}\n </div>\n\n {/* content */}\n <div className=\"min-w-0 flex-1 pb-1\">\n <div className=\"flex items-baseline justify-between gds-gap-sm\">\n <span className=\"text-sm font-medium text-fg\">{item.title}</span>\n {item.date !== undefined && (\n <span className=\"shrink-0 gds-text-body text-fg-muted\">{item.date}</span>\n )}\n </div>\n {item.description !== undefined && (\n <p className=\"mt-0.5 gds-text-body text-fg-muted\">{item.description}</p>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n },\n)\n","// tour — guided product tour with spotlight highlighting and step navigation\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type TourStep = {\n title: string\n description: string\n target?: string\n placement?: 'top' | 'bottom' | 'left' | 'right'\n image?: string\n}\n\nexport type TourProps = {\n steps: TourStep[]\n active: boolean\n onComplete: () => void\n onSkip?: () => void\n className?: string\n}\n\nexport const Tour = forwardRef<HTMLDivElement, TourProps>(\n function Tour({ steps, active, onComplete, onSkip, className }, ref) {\n const [current, setCurrent] = useState(0)\n const [entering, setEntering] = useState(true)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const cardRef = useRef<HTMLDivElement>(null)\n\n // reset to first step when tour activates\n useEffect(() => {\n if (!active) return\n setCurrent(0)\n setEntering(true)\n const timer = setTimeout(() => setEntering(false), 300)\n return () => clearTimeout(timer)\n }, [active])\n\n // find and highlight target element\n useEffect(() => {\n if (!active) return\n const step = steps[current]\n if (step?.target === undefined) {\n setTargetRect(null)\n return\n }\n try {\n const el = document.querySelector(step.target)\n if (el !== null) {\n const rect = el.getBoundingClientRect()\n setTargetRect(rect)\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n } else {\n setTargetRect(null)\n }\n } catch {\n setTargetRect(null)\n }\n }, [active, current, steps])\n\n const handleNext = useCallback(() => {\n if (current >= steps.length - 1) {\n onComplete()\n return\n }\n setEntering(true)\n setCurrent((p) => p + 1)\n setTimeout(() => setEntering(false), 200)\n }, [current, steps.length, onComplete])\n\n const handlePrev = useCallback(() => {\n if (current <= 0) return\n setEntering(true)\n setCurrent((p) => p - 1)\n setTimeout(() => setEntering(false), 200)\n }, [current])\n\n const handleSkip = useCallback(() => {\n onSkip?.()\n }, [onSkip])\n\n // keyboard navigation\n useEffect(() => {\n if (!active) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleSkip()\n if (e.key === 'ArrowRight') handleNext()\n if (e.key === 'ArrowLeft') handlePrev()\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [active, handleNext, handlePrev, handleSkip])\n\n if (!active) return null\n\n const step = steps[current]\n if (step === undefined) return null\n\n const isFirst = current === 0\n const isLast = current === steps.length - 1\n const progress = ((current + 1) / steps.length) * 100\n\n // calculate card position near target\n const cardStyle = (() => {\n if (targetRect === null) return undefined\n const placement = step.placement ?? 'bottom'\n const padding = 16\n\n if (placement === 'bottom') {\n return {\n position: 'fixed' as const,\n top: `${targetRect.bottom + padding}px`,\n left: `${Math.max(16, targetRect.left + targetRect.width / 2 - 200)}px`,\n }\n }\n if (placement === 'top') {\n return {\n position: 'fixed' as const,\n bottom: `${window.innerHeight - targetRect.top + padding}px`,\n left: `${Math.max(16, targetRect.left + targetRect.width / 2 - 200)}px`,\n }\n }\n if (placement === 'right') {\n return {\n position: 'fixed' as const,\n top: `${Math.max(16, targetRect.top + targetRect.height / 2 - 80)}px`,\n left: `${targetRect.right + padding}px`,\n }\n }\n // left\n return {\n position: 'fixed' as const,\n top: `${Math.max(16, targetRect.top + targetRect.height / 2 - 80)}px`,\n right: `${window.innerWidth - targetRect.left + padding}px`,\n }\n })()\n\n return (\n <div\n ref={ref}\n className={cx('fixed inset-0 z-50', className)}\n data-component=\"tour\"\n >\n {/* backdrop with spotlight cutout */}\n <svg\n className=\"absolute inset-0 h-full w-full\"\n style={{ pointerEvents: 'none' }}\n >\n <defs>\n <mask id=\"tour-mask\">\n <rect fill=\"white\" height=\"100%\" width=\"100%\" x=\"0\" y=\"0\" />\n {targetRect !== null && (\n <rect\n fill=\"black\"\n height={targetRect.height + 16}\n rx=\"8\"\n width={targetRect.width + 16}\n x={targetRect.left - 8}\n y={targetRect.top - 8}\n />\n )}\n </mask>\n </defs>\n <rect\n className=\"fill-fg/40\"\n height=\"100%\"\n mask=\"url(#tour-mask)\"\n width=\"100%\"\n x=\"0\"\n y=\"0\"\n />\n </svg>\n\n {/* target highlight ring */}\n {targetRect !== null && (\n <div\n className=\"pointer-events-none fixed gds-radius ring-2 ring-accent ring-offset-2 ring-offset-transparent transition-all duration-300\"\n style={{\n top: targetRect.top - 4,\n left: targetRect.left - 4,\n width: targetRect.width + 8,\n height: targetRect.height + 8,\n }}\n />\n )}\n\n {/* tour card */}\n <div\n ref={cardRef}\n className={cx(\n 'w-96 gds-radius border border-border bg-surface shadow-2xl transition-all duration-200 select-none',\n entering ? 'scale-95 opacity-0' : 'scale-100 opacity-100',\n targetRect === null && 'fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n )}\n role=\"dialog\"\n style={cardStyle}\n >\n {/* progress bar */}\n <div className=\"h-1 overflow-hidden rounded-t-xl bg-bg-tertiary\">\n <div\n className=\"h-full bg-accent transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n\n {/* header */}\n <div className=\"flex items-center justify-between px-5 pt-4 pb-1\">\n <span className=\"text-[10px] tracking-widest text-fg-muted/40 uppercase\">\n Step {current + 1} of {steps.length}\n </span>\n {onSkip !== undefined && (\n <button\n type=\"button\"\n className={cx('gds-radius-button p-1 text-fg-muted/40 transition-colors hover:text-fg', focusCls)}\n onClick={handleSkip}\n aria-label=\"Close tour\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* content */}\n <div className=\"px-5 pb-2\">\n <div className=\"text-base font-semibold text-fg\">{step.title}</div>\n <p className=\"mt-2 text-sm leading-relaxed text-fg-muted\">\n {step.description}\n </p>\n {step.image !== undefined && (\n <div className=\"mt-3 overflow-hidden gds-radius border border-border/30\">\n <img alt={step.title} className=\"w-full\" src={step.image} />\n </div>\n )}\n </div>\n\n {/* footer */}\n <div className=\"flex items-center justify-between px-5 pt-2 pb-4\">\n {/* dots */}\n <div className=\"flex gap-1.5\">\n {steps.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n className={cx(\n 'h-2 rounded-full transition-all',\n i === current\n ? 'w-5 bg-accent'\n : 'w-2 bg-fg-muted/20 hover:bg-fg-muted/40',\n )}\n onClick={() => {\n setEntering(true)\n setCurrent(i)\n setTimeout(() => setEntering(false), 200)\n }}\n />\n ))}\n </div>\n\n {/* nav buttons */}\n <div className=\"flex items-center gap-2\">\n {!isFirst && (\n <button\n type=\"button\"\n className={cx(\n 'flex h-8 items-center gap-1 gds-radius-button px-3 text-xs text-fg-muted transition-colors hover:bg-bg-tertiary hover:text-fg',\n focusCls,\n )}\n onClick={handlePrev}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 3L5 8l5 5\" />\n </svg>\n Back\n </button>\n )}\n <button\n type=\"button\"\n className={cx(\n 'flex h-8 items-center gap-1 gds-radius-button bg-accent px-4 text-xs font-medium text-accent-fg transition-colors hover:bg-accent/90',\n focusCls,\n )}\n onClick={handleNext}\n >\n {isLast ? 'Done' : 'Next'}\n {!isLast && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3l5 5-5 5\" />\n </svg>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype Transaction = {\n amount: number\n currency?: string\n date: string\n description: string\n id: string\n}\n\ntype TransactionListProps = React.HTMLAttributes<HTMLDivElement> & {\n transactions: Transaction[]\n}\n\nfunction formatAmount(amount: number, currency: string): string {\n const sign = amount >= 0 ? '+' : ''\n return `${sign}${currency}${Math.abs(amount).toLocaleString()}`\n}\n\nexport const TransactionList = forwardRef<HTMLDivElement, TransactionListProps>(\n function TransactionList({ className, transactions, ...props }, ref) {\n return (\n <div\n className={cx('flex flex-col divide-y divide-border', className)}\n data-component=\"transaction-list\"\n ref={ref}\n {...props}\n >\n {transactions.map((tx) => {\n const currency = tx.currency ?? '\\u00a5'\n const isPositive = tx.amount >= 0\n return (\n <div className=\"flex items-center justify-between px-3 py-2.5\" key={tx.id}>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-fg\">{tx.description}</span>\n <span className=\"text-xs text-fg-muted\">{tx.date}</span>\n </div>\n <span\n className={cx(\n 'text-sm font-semibold tabular-nums',\n isPositive ? 'text-success' : 'text-danger',\n )}\n >\n {formatAmount(tx.amount, currency)}\n </span>\n </div>\n )\n })}\n </div>\n )\n },\n)\n\nexport type { Transaction, TransactionListProps }\n","// tree — recursive collapsible tree view\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\nexport type TreeNode = {\n id: string\n label: string\n icon?: ReactNode\n children?: TreeNode[]\n disabled?: boolean\n}\n\nexport type TreeProps = {\n nodes: TreeNode[]\n onSelect?: (id: string) => void\n selected?: string\n defaultExpanded?: string[]\n className?: string\n}\n\nfunction ChevronSvg({ expanded }: { expanded: boolean }) {\n return (\n <svg\n className={cx('h-3 w-3 shrink-0 text-fg-muted transition-transform', expanded && 'rotate-90')}\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n >\n <path d=\"M4 2L8 6L4 10V2Z\" />\n </svg>\n )\n}\n\nfunction TreeNodeItem({\n node,\n depth,\n selected,\n expanded,\n onToggle,\n onSelect,\n}: {\n node: TreeNode\n depth: number\n selected?: string\n expanded: Set<string>\n onToggle: (id: string) => void\n onSelect?: (id: string) => void\n}) {\n const hasChildren = node.children !== undefined && node.children.length > 0\n const isExpanded = expanded.has(node.id)\n const isSelected = selected === node.id\n const isDisabled = node.disabled === true\n\n const handleClick = () => {\n if (isDisabled) return\n if (hasChildren) {\n onToggle(node.id)\n }\n if (onSelect !== undefined) {\n onSelect(node.id)\n }\n }\n\n return (\n <div>\n <button\n className={cx(\n 'flex w-full items-center gds-gap-sm gds-radius-button gds-pad-x-sm gds-pad-y-sm text-sm select-none',\n isSelected ? 'bg-accent/10 text-accent' : 'text-fg hover:bg-bg-secondary',\n isDisabled && 'cursor-not-allowed opacity-50',\n focusCls,\n )}\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={handleClick}\n disabled={isDisabled}\n data-state={isSelected ? 'selected' : undefined}\n >\n {hasChildren ? (\n <ChevronSvg expanded={isExpanded} />\n ) : (\n <span className=\"h-3 w-3 shrink-0\" />\n )}\n {node.icon !== undefined && (\n <span className=\"shrink-0 text-fg-muted\">{node.icon}</span>\n )}\n <span className=\"truncate\">{node.label}</span>\n </button>\n {hasChildren && isExpanded && (\n <div>\n {node.children?.map((child) => (\n <TreeNodeItem\n key={child.id}\n node={child}\n depth={depth + 1}\n selected={selected}\n expanded={expanded}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const Tree = forwardRef<HTMLDivElement, TreeProps>(\n function Tree({ nodes, onSelect, selected, defaultExpanded, className }, ref) {\n const [expanded, setExpanded] = useState<Set<string>>(\n () => new Set(defaultExpanded ?? []),\n )\n\n const handleToggle = useCallback((id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gds-gap-xs', className)}\n data-component=\"tree\"\n role=\"tree\"\n >\n {nodes.map((node) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n depth={0}\n selected={selected}\n expanded={expanded}\n onToggle={handleToggle}\n onSelect={onSelect}\n />\n ))}\n </div>\n )\n },\n)\n","// video-controls — custom controls bar for video player (internal)\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype VideoControlsProps = {\n currentTime: number\n duration: number\n playing: boolean\n isMuted: boolean\n showControls: boolean\n onTogglePlay: () => void\n onToggleMute: () => void\n onSeek: (e: React.MouseEvent<HTMLDivElement>) => void\n onFullscreen: () => void\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60)\n const s = Math.floor(seconds % 60)\n return `${m}:${s.toString().padStart(2, '0')}`\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M4 2l10 6-10 6V2z\" />\n </svg>\n )\n}\n\nfunction PauseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"3\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n <rect x=\"9\" y=\"2\" width=\"4\" height=\"12\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction MuteIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 5h3l4-3v12l-4-3H2V5z\" />\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"11\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\n\nfunction UnmuteIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 5h3l4-3v12l-4-3H2V5z\" />\n <path d=\"M11 4c1.5 1 2 2.5 2 4s-.5 3-2 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\n\nfunction FullscreenIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M2 6V2h4M10 2h4v4M14 10v4h-4M6 14H2v-4\" />\n </svg>\n )\n}\n\nfunction VideoControls({\n currentTime,\n duration,\n playing,\n isMuted,\n showControls,\n onTogglePlay,\n onToggleMute,\n onSeek,\n onFullscreen,\n}: VideoControlsProps) {\n const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0\n\n return (\n <div\n className={cx(\n 'absolute inset-x-0 bottom-0 flex items-center gap-2 bg-black/60 px-3 py-2 transition-opacity duration-200',\n showControls ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n data-testid=\"controls\"\n >\n <button\n type=\"button\"\n onClick={onTogglePlay}\n className={cx('text-white', focusCls)}\n aria-label={playing ? 'Pause' : 'Play'}\n data-testid=\"play-button\"\n >\n {playing ? <PauseIcon /> : <PlayIcon />}\n </button>\n\n <div\n className={cx('relative h-1 flex-1 cursor-pointer rounded-full bg-white/30', focusCls)}\n onClick={onSeek}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin={0}\n aria-valuemax={Math.floor(duration)}\n aria-valuenow={Math.floor(currentTime)}\n tabIndex={0}\n data-testid=\"progress-bar\"\n >\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-white\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n\n <span className=\"select-none text-xs text-white/80\" data-testid=\"time-display\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n\n <button\n type=\"button\"\n onClick={onToggleMute}\n className={cx('text-white', focusCls)}\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n data-testid=\"mute-button\"\n >\n {isMuted ? <MuteIcon /> : <UnmuteIcon />}\n </button>\n\n <button\n type=\"button\"\n onClick={onFullscreen}\n className={cx('text-white', focusCls)}\n aria-label=\"Fullscreen\"\n data-testid=\"fullscreen-button\"\n >\n <FullscreenIcon />\n </button>\n </div>\n )\n}\n\nexport { VideoControls }\nexport type { VideoControlsProps }\n","// video-player — styled html5 video player with custom controls\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { cx } from '../utils/cx'\nimport { VideoControls } from './video-controls'\n\nexport type VideoPlayerProps = {\n src: string\n poster?: string\n autoPlay?: boolean\n muted?: boolean\n loop?: boolean\n controls?: boolean\n glass?: boolean\n className?: string\n}\n\nexport const VideoPlayer = forwardRef<HTMLDivElement, VideoPlayerProps>(\n function VideoPlayer(\n {\n src,\n poster,\n autoPlay = false,\n muted: mutedProp = false,\n loop = false,\n controls = true,\n glass = false,\n className,\n },\n ref,\n ) {\n const videoRef = useRef<HTMLVideoElement>(null)\n const hideTimerRef = useRef<ReturnType<typeof setTimeout>>(null)\n\n const [playing, setPlaying] = useState(false)\n const [currentTime, setCurrentTime] = useState(0)\n const [duration, setDuration] = useState(0)\n const [isMuted, setIsMuted] = useState(mutedProp)\n const [showControls, setShowControls] = useState(true)\n\n const resetHideTimer = useCallback(() => {\n setShowControls(true)\n if (hideTimerRef.current !== null) {\n clearTimeout(hideTimerRef.current)\n }\n hideTimerRef.current = setTimeout(() => {\n if (playing) setShowControls(false)\n }, 3000)\n }, [playing])\n\n // auto-hide controls\n useEffect(() => {\n if (!controls) return\n resetHideTimer()\n return () => {\n if (hideTimerRef.current !== null) clearTimeout(hideTimerRef.current)\n }\n }, [controls, resetHideTimer])\n\n const togglePlay = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n if (video.paused) {\n video.play().catch(() => {})\n setPlaying(true)\n } else {\n video.pause()\n setPlaying(false)\n }\n }, [])\n\n const toggleMute = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n video.muted = !video.muted\n setIsMuted(video.muted)\n }, [])\n\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n setCurrentTime(video.currentTime)\n }, [])\n\n const handleLoadedMetadata = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n setDuration(video.duration)\n }, [])\n\n const handleSeek = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const video = videoRef.current\n if (video === null) return\n const rect = e.currentTarget.getBoundingClientRect()\n const ratio = (e.clientX - rect.left) / rect.width\n video.currentTime = ratio * duration\n },\n [duration],\n )\n\n const handleFullscreen = useCallback(() => {\n const video = videoRef.current\n if (video === null) return\n if (document.fullscreenElement !== null) {\n document.exitFullscreen().catch(() => {})\n } else {\n video.requestFullscreen().catch(() => {})\n }\n }, [])\n\n const handleEnded = useCallback(() => {\n setPlaying(false)\n setShowControls(true)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx(\n 'relative overflow-hidden gds-radius-card',\n glass && 'gds-glass',\n className,\n )}\n data-component=\"video-player\"\n onMouseMove={controls ? resetHideTimer : undefined}\n onMouseLeave={controls ? () => setShowControls(false) : undefined}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n muted={isMuted}\n loop={loop}\n className=\"block h-full w-full object-cover\"\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"video-element\"\n />\n\n {controls && (\n <VideoControls\n currentTime={currentTime}\n duration={duration}\n playing={playing}\n isMuted={isMuted}\n showControls={showControls}\n onTogglePlay={togglePlay}\n onToggleMute={toggleMute}\n onSeek={handleSeek}\n onFullscreen={handleFullscreen}\n />\n )}\n </div>\n )\n },\n)\n","// virtual-list — windowed list rendering for large datasets\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useMemo, useRef, useState } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type VirtualListProps<T> = {\n items: T[]\n itemHeight: number\n renderItem: (item: T, index: number) => ReactNode\n overscan?: number\n className?: string\n height?: number | string\n}\n\nfunction VirtualListInner<T>(\n {\n items,\n itemHeight,\n renderItem,\n overscan = 3,\n className,\n height = 400,\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const [scrollTop, setScrollTop] = useState(0)\n const innerRef = useRef<HTMLDivElement>(null)\n\n const totalHeight = items.length * itemHeight\n\n const containerHeight = typeof height === 'number' ? height : undefined\n\n const { visibleItems } = useMemo(() => {\n const viewportHeight = containerHeight ?? 400\n const rawStart = Math.floor(scrollTop / itemHeight)\n const rawEnd = Math.ceil((scrollTop + viewportHeight) / itemHeight)\n const start = Math.max(0, rawStart - overscan)\n const end = Math.min(items.length, rawEnd + overscan)\n\n const visible: Array<{ item: T; index: number }> = []\n for (let i = start; i < end; i++) {\n visible.push({ item: items[i], index: i })\n }\n\n return { startIndex: start, endIndex: end, visibleItems: visible }\n }, [items, itemHeight, scrollTop, containerHeight, overscan])\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n return (\n <div\n ref={ref}\n className={cx('overflow-y-auto', className)}\n style={{ height }}\n onScroll={handleScroll}\n data-component=\"virtual-list\"\n >\n <div\n ref={innerRef}\n style={{ height: totalHeight, position: 'relative' }}\n >\n {visibleItems.map(({ item, index }) => (\n <div\n key={index}\n style={{\n position: 'absolute',\n top: index * itemHeight,\n left: 0,\n right: 0,\n height: itemHeight,\n }}\n >\n {renderItem(item, index)}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.Ref<HTMLDivElement> },\n) => ReactNode\n","import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype WeatherWidgetProps = React.HTMLAttributes<HTMLDivElement> & {\n condition: string\n icon?: ReactNode\n location: string\n temp: number\n unit?: 'C' | 'F'\n}\n\nexport const WeatherWidget = forwardRef<HTMLDivElement, WeatherWidgetProps>(\n function WeatherWidget({ className, condition, icon, location, temp, unit = 'C', ...props }, ref) {\n return (\n <div\n className={cx(\n 'inline-flex items-center gap-4 rounded-xl border border-border bg-surface p-4 select-none',\n className,\n )}\n data-component=\"weather-widget\"\n ref={ref}\n {...props}\n >\n {icon !== undefined && <div className=\"text-2xl text-fg-muted\">{icon}</div>}\n <div className=\"flex flex-col\">\n <span className=\"text-2xl font-bold text-fg leading-tight\">\n {temp}&deg;{unit}\n </span>\n <span className=\"text-sm text-fg-muted\">{condition}</span>\n <span className=\"text-xs text-fg-muted/70\">{location}</span>\n </div>\n </div>\n )\n },\n)\n\nexport type { WeatherWidgetProps }\n"],"x_google_ignoreList":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"mappings":"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"}