@alfadocs/ui-kit 0.1.6 → 0.1.8

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 (634) hide show
  1. package/README.md +18 -0
  2. package/dist/_chunks/{balance-cell-renderer-BRWt3neo.js → balance-cell-renderer-BWm3knY9.js} +2 -2
  3. package/dist/_chunks/{chat-container-BZvQ3_yT.js → chat-container-Cm3SlR2p.js} +12 -12
  4. package/dist/_chunks/{chat-input-DsIrWM4f.js → chat-input-DreOPP8A.js} +36 -31
  5. package/dist/_chunks/{dropdown-menu-JNo66A-j.js → dropdown-menu-Cw3EyPZv.js} +35 -31
  6. package/dist/_chunks/{leo-sidebar-Bh3dPDTQ.js → leo-sidebar-nbHib2D-.js} +97 -89
  7. package/dist/_chunks/{notification-tray-Bq-08ReD.js → notification-tray-B7U5YZYg.js} +5 -2
  8. package/dist/_chunks/{patient-shell-DP54y6rc.js → patient-shell-7cXqIMFg.js} +2 -2
  9. package/dist/_chunks/{popover-DvAtFOi-.js → popover-C3CTUsqh.js} +20 -16
  10. package/dist/_chunks/{privacy-lock-DS6QRo2N.js → privacy-lock-CQpgkLec.js} +23 -23
  11. package/dist/_chunks/{suggestion-chip-6AB40rxz.js → suggestion-chip-BNJ2M8Os.js} +3 -3
  12. package/dist/_chunks/{theme-toggle-COHFwO2H.js → theme-toggle-BHiMMEQN.js} +2 -2
  13. package/dist/_chunks/{workflow-map-DGJwVcO-.js → workflow-map-XeqHDFvp.js} +2 -2
  14. package/dist/agent-catalog.json +1 -1
  15. package/dist/components/chat-container/index.js +1 -1
  16. package/dist/components/chat-input/index.js +1 -1
  17. package/dist/components/data-table/index.js +1 -1
  18. package/dist/components/dropdown-menu/index.js +1 -1
  19. package/dist/components/notification-tray/index.js +1 -1
  20. package/dist/components/popover/index.js +1 -1
  21. package/dist/components/privacy-lock/index.js +1 -1
  22. package/dist/components/suggestion-chip/index.js +1 -1
  23. package/dist/components/theme-toggle/index.js +1 -1
  24. package/dist/components/workflow/index.js +1 -1
  25. package/dist/index.js +12 -12
  26. package/dist/patterns/leo-assistant/index.js +1 -1
  27. package/dist/patterns/patient-shell/index.js +1 -1
  28. package/dist/tokens.css +1 -1
  29. package/package.json +1 -1
  30. package/dist/_chunks/accordion-B6fyINUk.js.map +0 -1
  31. package/dist/_chunks/accordion.agent-Cz-yglRa.js.map +0 -1
  32. package/dist/_chunks/agenda-card-DIWDvWum.js.map +0 -1
  33. package/dist/_chunks/agenda-tray-BqQZwiHc.js.map +0 -1
  34. package/dist/_chunks/ai-prompt-input-CI27KmZ1.js.map +0 -1
  35. package/dist/_chunks/alert-BlOUMkXj.js.map +0 -1
  36. package/dist/_chunks/apexcharts-theme-BkSShpEy.js.map +0 -1
  37. package/dist/_chunks/app-frame-6d7Lu4ea.js.map +0 -1
  38. package/dist/_chunks/aspect-ratio-CxsdG8vk.js.map +0 -1
  39. package/dist/_chunks/audio-recorder-B-8SKgKn.js.map +0 -1
  40. package/dist/_chunks/audio-visualiser-CeMPCZkd.js.map +0 -1
  41. package/dist/_chunks/autocomplete.agent-DqOy0_1P.js.map +0 -1
  42. package/dist/_chunks/avatar-Dcr6XuDQ.js.map +0 -1
  43. package/dist/_chunks/badge-mrstWxve.js.map +0 -1
  44. package/dist/_chunks/balance-cell-renderer-BRWt3neo.js.map +0 -1
  45. package/dist/_chunks/breadcrumb-D6xpsP7n.js.map +0 -1
  46. package/dist/_chunks/button-7mLWcMp_.js.map +0 -1
  47. package/dist/_chunks/button-group-CONver7M.js.map +0 -1
  48. package/dist/_chunks/button.agent-BuGZBktn.js.map +0 -1
  49. package/dist/_chunks/calendar-nGEgelJs.js.map +0 -1
  50. package/dist/_chunks/card-BEy58ZKp.js.map +0 -1
  51. package/dist/_chunks/chart.agent-BdS-_8MO.js.map +0 -1
  52. package/dist/_chunks/chat-container-BZvQ3_yT.js.map +0 -1
  53. package/dist/_chunks/chat-container.agent-Dhw9xCJt.js.map +0 -1
  54. package/dist/_chunks/chat-input-DsIrWM4f.js.map +0 -1
  55. package/dist/_chunks/chat-message-ByouZpPP.js.map +0 -1
  56. package/dist/_chunks/check-DPdL_Sm7.js.map +0 -1
  57. package/dist/_chunks/checkbox-DNK4qS2_.js.map +0 -1
  58. package/dist/_chunks/checkbox-group-CWpGZEF6.js.map +0 -1
  59. package/dist/_chunks/chevron-down-BX_NP2Yh.js.map +0 -1
  60. package/dist/_chunks/chevron-left-CX1jqD2M.js.map +0 -1
  61. package/dist/_chunks/chevron-right-BrpYejk0.js.map +0 -1
  62. package/dist/_chunks/chevron-up-zOEDrmBB.js.map +0 -1
  63. package/dist/_chunks/chevrons-right-d9MwesPG.js.map +0 -1
  64. package/dist/_chunks/circle-BkqTgYmt.js.map +0 -1
  65. package/dist/_chunks/circle-alert-ChA9opNA.js.map +0 -1
  66. package/dist/_chunks/circle-check-9AeSgJD_.js.map +0 -1
  67. package/dist/_chunks/circle-x-Du2CmjaU.js.map +0 -1
  68. package/dist/_chunks/clock-21AGPWJ5.js.map +0 -1
  69. package/dist/_chunks/collapsible-D4LOdLxp.js.map +0 -1
  70. package/dist/_chunks/color-picker-e9PmpaGH.js.map +0 -1
  71. package/dist/_chunks/combobox.agent-ByobCLJ_.js.map +0 -1
  72. package/dist/_chunks/command-palette.agent-js2rxgeR.js.map +0 -1
  73. package/dist/_chunks/compose-refs-C0k0tdqF.js.map +0 -1
  74. package/dist/_chunks/copy-B00HK7tj.js.map +0 -1
  75. package/dist/_chunks/createLucideIcon-CrFbzy84.js.map +0 -1
  76. package/dist/_chunks/date-picker-DYXNsWmM.js.map +0 -1
  77. package/dist/_chunks/date-range-picker-BcNDJI7m.js.map +0 -1
  78. package/dist/_chunks/date-time-picker-CmGiTU__.js.map +0 -1
  79. package/dist/_chunks/description-list-DvJbp6Yg.js.map +0 -1
  80. package/dist/_chunks/dialog.agent-DEG_fVzG.js.map +0 -1
  81. package/dist/_chunks/dropdown-menu-JNo66A-j.js.map +0 -1
  82. package/dist/_chunks/dropdown-menu.agent-Cry4Nmes.js.map +0 -1
  83. package/dist/_chunks/ellipsis-rgGdiK_9.js.map +0 -1
  84. package/dist/_chunks/empty-state-DQPtRp2b.js.map +0 -1
  85. package/dist/_chunks/eye-off-xEXDAh5z.js.map +0 -1
  86. package/dist/_chunks/file-text-DSNuv2B8.js.map +0 -1
  87. package/dist/_chunks/file-upload.agent-B9AN82LA.js.map +0 -1
  88. package/dist/_chunks/flag-DZ6V7-hU.js.map +0 -1
  89. package/dist/_chunks/floating-action-button-Cnw-f6AG.js.map +0 -1
  90. package/dist/_chunks/form-field-BfsPLTSc.js.map +0 -1
  91. package/dist/_chunks/form-field-context-94LwgYTQ.js.map +0 -1
  92. package/dist/_chunks/freemium-paywall-CkefGLM_.js.map +0 -1
  93. package/dist/_chunks/globe-BkEFMNSg.js.map +0 -1
  94. package/dist/_chunks/group-options-BvKhQ3xb.js.map +0 -1
  95. package/dist/_chunks/header-BGn1mRp8.js.map +0 -1
  96. package/dist/_chunks/icon-button-Wnnde5lc.js.map +0 -1
  97. package/dist/_chunks/icon-button-group-DeV3FpNY.js.map +0 -1
  98. package/dist/_chunks/index-4xgbg-sn.js.map +0 -1
  99. package/dist/_chunks/index-CJE9uQmb.js.map +0 -1
  100. package/dist/_chunks/index-CeY1nNvd.js.map +0 -1
  101. package/dist/_chunks/index-D2ZczOXr.js.map +0 -1
  102. package/dist/_chunks/info-B9XNKn05.js.map +0 -1
  103. package/dist/_chunks/input-surface-u4QB0lxe.js.map +0 -1
  104. package/dist/_chunks/isSameDay-ecuM8PBB.js.map +0 -1
  105. package/dist/_chunks/isSameMonth-5wNF2f4I.js.map +0 -1
  106. package/dist/_chunks/kbd-8baVw3KU.js.map +0 -1
  107. package/dist/_chunks/key-value-pair-JRFS9Xrh.js.map +0 -1
  108. package/dist/_chunks/leo-sidebar-Bh3dPDTQ.js.map +0 -1
  109. package/dist/_chunks/list-B1ozIjQe.js.map +0 -1
  110. package/dist/_chunks/live-region-C41SO3cA.js.map +0 -1
  111. package/dist/_chunks/log-out-616hnn2-.js.map +0 -1
  112. package/dist/_chunks/logo-BpFoCL-s.js.map +0 -1
  113. package/dist/_chunks/mail-C8irm52s.js.map +0 -1
  114. package/dist/_chunks/matrix-rain-BEkvux64.js.map +0 -1
  115. package/dist/_chunks/message-card-qAp2-WQK.js.map +0 -1
  116. package/dist/_chunks/message-tray-VaLpQU5t.js.map +0 -1
  117. package/dist/_chunks/multi-select.agent-CNsyW3n9.js.map +0 -1
  118. package/dist/_chunks/navigation-menu-EVFau1O2.js.map +0 -1
  119. package/dist/_chunks/normalize-diacritics-BNGbFNlJ.js.map +0 -1
  120. package/dist/_chunks/notification-card-BF2_veHy.js.map +0 -1
  121. package/dist/_chunks/notification-tray-Bq-08ReD.js.map +0 -1
  122. package/dist/_chunks/number-input-DjpT_RXJ.js.map +0 -1
  123. package/dist/_chunks/otp-input-De5_Ih7B.js.map +0 -1
  124. package/dist/_chunks/pagination.agent-oEaqmtx5.js.map +0 -1
  125. package/dist/_chunks/password-input-DJDVznWH.js.map +0 -1
  126. package/dist/_chunks/patient-shell-DP54y6rc.js.map +0 -1
  127. package/dist/_chunks/payment-form-hcl-gGrp.js.map +0 -1
  128. package/dist/_chunks/payment-form.agent-BkEnRerR.js.map +0 -1
  129. package/dist/_chunks/pdf-viewer.agent-CfIHhcHx.js.map +0 -1
  130. package/dist/_chunks/phone-input-DE_39q65.js.map +0 -1
  131. package/dist/_chunks/plus-CYKNmfuA.js.map +0 -1
  132. package/dist/_chunks/popover-DvAtFOi-.js.map +0 -1
  133. package/dist/_chunks/popover.agent-C0qOx9WT.js.map +0 -1
  134. package/dist/_chunks/printer-CeVEWfQq.js.map +0 -1
  135. package/dist/_chunks/privacy-lock-DS6QRo2N.js.map +0 -1
  136. package/dist/_chunks/progress-B4Of_pzz.js.map +0 -1
  137. package/dist/_chunks/progress.agent-CXkHURjX.js.map +0 -1
  138. package/dist/_chunks/purify.es-DpIUMBYC.js.map +0 -1
  139. package/dist/_chunks/radio-cs8N1wJi.js.map +0 -1
  140. package/dist/_chunks/radio-group-BIUbpWml.js.map +0 -1
  141. package/dist/_chunks/react-day-picker-C04L_28V.js.map +0 -1
  142. package/dist/_chunks/registry-C9nwlNyL.js.map +0 -1
  143. package/dist/_chunks/resizable.agent-DBpPGNdy.js.map +0 -1
  144. package/dist/_chunks/rich-text-editor.agent-COSb5_2D.js.map +0 -1
  145. package/dist/_chunks/safe-image-src-DstKgCo7.js.map +0 -1
  146. package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +0 -1
  147. package/dist/_chunks/search-BonnQsHv.js.map +0 -1
  148. package/dist/_chunks/search-bar-fcGqDFW3.js.map +0 -1
  149. package/dist/_chunks/search-input-BVMCONyN.js.map +0 -1
  150. package/dist/_chunks/select-IY_JQa-F.js.map +0 -1
  151. package/dist/_chunks/send-CySZIRPJ.js.map +0 -1
  152. package/dist/_chunks/separator-B4wXDLNC.js.map +0 -1
  153. package/dist/_chunks/sheet-BhNpLHc9.js.map +0 -1
  154. package/dist/_chunks/sheet.agent-DwQlBqK9.js.map +0 -1
  155. package/dist/_chunks/sidebar-OVzwN3jE.js.map +0 -1
  156. package/dist/_chunks/sidebar.agent-B0fnH9CC.js.map +0 -1
  157. package/dist/_chunks/sign-in-with-alfadocs-button-BN_FPGHT.js.map +0 -1
  158. package/dist/_chunks/signature-capture.agent-C38VPXxg.js.map +0 -1
  159. package/dist/_chunks/skeleton-dtqyF09N.js.map +0 -1
  160. package/dist/_chunks/skip-link-DmZ3c6cb.js.map +0 -1
  161. package/dist/_chunks/slider-DjyRt3Mp.js.map +0 -1
  162. package/dist/_chunks/slot-grid-D_l5VsHG.js.map +0 -1
  163. package/dist/_chunks/sparkline.agent-C_xp3NRB.js.map +0 -1
  164. package/dist/_chunks/spinner-GCcv67vh.js.map +0 -1
  165. package/dist/_chunks/square-CZoGU14v.js.map +0 -1
  166. package/dist/_chunks/square-check-big-Jr-0202D.js.map +0 -1
  167. package/dist/_chunks/stat-DUB6g90R.js.map +0 -1
  168. package/dist/_chunks/stepper-C-sIpRRU.js.map +0 -1
  169. package/dist/_chunks/stepper-accordion-CGog0JSF.js.map +0 -1
  170. package/dist/_chunks/stepper-calendar-_fLOAjus.js.map +0 -1
  171. package/dist/_chunks/stepper-progress-rE7tn7WY.js.map +0 -1
  172. package/dist/_chunks/streaming-text-BgjCTVOw.js.map +0 -1
  173. package/dist/_chunks/suggestion-chip-6AB40rxz.js.map +0 -1
  174. package/dist/_chunks/switch-aN2EYxHh.js.map +0 -1
  175. package/dist/_chunks/tabs.agent-BpbVA-Zh.js.map +0 -1
  176. package/dist/_chunks/tag-BqidXKo3.js.map +0 -1
  177. package/dist/_chunks/task-card-yW7tKlG4.js.map +0 -1
  178. package/dist/_chunks/task-tray-BzahI5FQ.js.map +0 -1
  179. package/dist/_chunks/text-area-DmKSd2DG.js.map +0 -1
  180. package/dist/_chunks/text-input-CRHvl5zk.js.map +0 -1
  181. package/dist/_chunks/theme-root-DDb0TJjd.js.map +0 -1
  182. package/dist/_chunks/theme-toggle-COHFwO2H.js.map +0 -1
  183. package/dist/_chunks/time-picker-D-EueWUG.js.map +0 -1
  184. package/dist/_chunks/timeline-RgAIzpMd.js.map +0 -1
  185. package/dist/_chunks/timestamp-BV2lC-wV.js.map +0 -1
  186. package/dist/_chunks/toast-lOhJDKOH.js.map +0 -1
  187. package/dist/_chunks/tooltip-DHik5yRI.js.map +0 -1
  188. package/dist/_chunks/tooth-scheme.agent-BlDyu-Gx.js.map +0 -1
  189. package/dist/_chunks/transcript-panel-CNbVGG9L.js.map +0 -1
  190. package/dist/_chunks/triangle-alert-CBPUIzQo.js.map +0 -1
  191. package/dist/_chunks/typing-indicator-CbUBf-Dx.js.map +0 -1
  192. package/dist/_chunks/use-debounced-callback-BisrB-Fq.js.map +0 -1
  193. package/dist/_chunks/use-direction-D6rvvG9G.js.map +0 -1
  194. package/dist/_chunks/use-locale-BuXR_Zl9.js.map +0 -1
  195. package/dist/_chunks/use-prefers-reduced-motion-BMwIQRjB.js.map +0 -1
  196. package/dist/_chunks/use-theme-BMUhembX.js.map +0 -1
  197. package/dist/_chunks/user-CPxpqFjJ.js.map +0 -1
  198. package/dist/_chunks/visually-hidden-Bw7vBHLm.js.map +0 -1
  199. package/dist/_chunks/warning-stack-8Pa3pekh.js.map +0 -1
  200. package/dist/_chunks/workflow-map-DGJwVcO-.js.map +0 -1
  201. package/dist/_chunks/x-CCcI3eJp.js.map +0 -1
  202. package/dist/agent/index.d.ts.map +0 -1
  203. package/dist/agent/registry.d.ts.map +0 -1
  204. package/dist/agent/types.d.ts.map +0 -1
  205. package/dist/brand/logo-asset/Alfadocs_Logo_BW.d.ts.map +0 -1
  206. package/dist/brand/logo-asset/Alfadocs_Logo_Main.d.ts.map +0 -1
  207. package/dist/brand/logo-asset/Alfadocs_Logo_Mark.d.ts.map +0 -1
  208. package/dist/brand/logo-asset/Alfadocs_Logo_Neg.d.ts.map +0 -1
  209. package/dist/brand/logo-asset/Alfadocs_Logo_Purple.d.ts.map +0 -1
  210. package/dist/brand/logo-asset/index.d.ts.map +0 -1
  211. package/dist/components/_shared/calendar-chevron.d.ts.map +0 -1
  212. package/dist/components/_shared/compose-refs.d.ts.map +0 -1
  213. package/dist/components/_shared/date-locale.d.ts.map +0 -1
  214. package/dist/components/_shared/date-picker-variants.d.ts.map +0 -1
  215. package/dist/components/_shared/date-utils.d.ts.map +0 -1
  216. package/dist/components/_shared/group-options.d.ts.map +0 -1
  217. package/dist/components/_shared/index.d.ts.map +0 -1
  218. package/dist/components/_shared/input-surface.d.ts.map +0 -1
  219. package/dist/components/_shared/normalize-diacritics.d.ts.map +0 -1
  220. package/dist/components/_shared/option.d.ts.map +0 -1
  221. package/dist/components/_shared/safe-html.d.ts.map +0 -1
  222. package/dist/components/_shared/safe-image-src.d.ts.map +0 -1
  223. package/dist/components/_shared/stepper.d.ts.map +0 -1
  224. package/dist/components/_shared/time.d.ts.map +0 -1
  225. package/dist/components/_shared/use-debounced-callback.d.ts.map +0 -1
  226. package/dist/components/_shared/use-direction.d.ts.map +0 -1
  227. package/dist/components/_shared/use-focus-trap.d.ts.map +0 -1
  228. package/dist/components/_shared/use-neutralize-hidden-focus.d.ts.map +0 -1
  229. package/dist/components/accordion/accordion.agent.d.ts.map +0 -1
  230. package/dist/components/accordion/accordion.d.ts.map +0 -1
  231. package/dist/components/accordion/index.d.ts.map +0 -1
  232. package/dist/components/accordion/index.js.map +0 -1
  233. package/dist/components/agenda-card/agenda-card.d.ts.map +0 -1
  234. package/dist/components/agenda-card/index.d.ts.map +0 -1
  235. package/dist/components/agenda-card/index.js.map +0 -1
  236. package/dist/components/agenda-tray/agenda-tray.d.ts.map +0 -1
  237. package/dist/components/agenda-tray/index.d.ts.map +0 -1
  238. package/dist/components/agenda-tray/index.js.map +0 -1
  239. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +0 -1
  240. package/dist/components/ai-prompt-input/index.d.ts.map +0 -1
  241. package/dist/components/ai-prompt-input/index.js.map +0 -1
  242. package/dist/components/alert/alert.d.ts.map +0 -1
  243. package/dist/components/alert/index.d.ts.map +0 -1
  244. package/dist/components/alert/index.js.map +0 -1
  245. package/dist/components/app-frame/app-frame.d.ts.map +0 -1
  246. package/dist/components/app-frame/index.d.ts.map +0 -1
  247. package/dist/components/app-frame/index.js.map +0 -1
  248. package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +0 -1
  249. package/dist/components/aspect-ratio/index.d.ts.map +0 -1
  250. package/dist/components/aspect-ratio/index.js.map +0 -1
  251. package/dist/components/audio-recorder/audio-recorder.d.ts.map +0 -1
  252. package/dist/components/audio-recorder/index.d.ts.map +0 -1
  253. package/dist/components/audio-recorder/index.js.map +0 -1
  254. package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +0 -1
  255. package/dist/components/audio-visualiser/index.d.ts.map +0 -1
  256. package/dist/components/audio-visualiser/index.js.map +0 -1
  257. package/dist/components/autocomplete/autocomplete.agent.d.ts.map +0 -1
  258. package/dist/components/autocomplete/autocomplete.d.ts.map +0 -1
  259. package/dist/components/autocomplete/index.d.ts.map +0 -1
  260. package/dist/components/autocomplete/index.js.map +0 -1
  261. package/dist/components/avatar/avatar.d.ts.map +0 -1
  262. package/dist/components/avatar/index.d.ts.map +0 -1
  263. package/dist/components/avatar/index.js.map +0 -1
  264. package/dist/components/badge/badge.d.ts.map +0 -1
  265. package/dist/components/badge/index.d.ts.map +0 -1
  266. package/dist/components/badge/index.js.map +0 -1
  267. package/dist/components/breadcrumb/breadcrumb.d.ts.map +0 -1
  268. package/dist/components/breadcrumb/index.d.ts.map +0 -1
  269. package/dist/components/breadcrumb/index.js.map +0 -1
  270. package/dist/components/button/button.agent.d.ts.map +0 -1
  271. package/dist/components/button/button.d.ts.map +0 -1
  272. package/dist/components/button/icon-button.d.ts.map +0 -1
  273. package/dist/components/button/index.d.ts.map +0 -1
  274. package/dist/components/button/index.js.map +0 -1
  275. package/dist/components/button-group/button-group.d.ts.map +0 -1
  276. package/dist/components/button-group/index.d.ts.map +0 -1
  277. package/dist/components/button-group/index.js.map +0 -1
  278. package/dist/components/calendar/calendar.agent.d.ts.map +0 -1
  279. package/dist/components/calendar/calendar.d.ts.map +0 -1
  280. package/dist/components/calendar/contrast-warning.d.ts.map +0 -1
  281. package/dist/components/calendar/index.d.ts.map +0 -1
  282. package/dist/components/calendar/index.js.map +0 -1
  283. package/dist/components/card/card.d.ts.map +0 -1
  284. package/dist/components/card/index.d.ts.map +0 -1
  285. package/dist/components/card/index.js.map +0 -1
  286. package/dist/components/chart/chart.agent.d.ts.map +0 -1
  287. package/dist/components/chart/chart.d.ts.map +0 -1
  288. package/dist/components/chart/index.d.ts.map +0 -1
  289. package/dist/components/chart/index.js.map +0 -1
  290. package/dist/components/chat-container/chat-container.agent.d.ts.map +0 -1
  291. package/dist/components/chat-container/chat-container.d.ts.map +0 -1
  292. package/dist/components/chat-container/index.d.ts.map +0 -1
  293. package/dist/components/chat-container/index.js.map +0 -1
  294. package/dist/components/chat-input/chat-input.d.ts.map +0 -1
  295. package/dist/components/chat-input/index.d.ts.map +0 -1
  296. package/dist/components/chat-input/index.js.map +0 -1
  297. package/dist/components/chat-message/chat-message.d.ts.map +0 -1
  298. package/dist/components/chat-message/index.d.ts.map +0 -1
  299. package/dist/components/chat-message/index.js.map +0 -1
  300. package/dist/components/checkbox/checkbox-group-context.d.ts.map +0 -1
  301. package/dist/components/checkbox/checkbox.d.ts.map +0 -1
  302. package/dist/components/checkbox/index.d.ts.map +0 -1
  303. package/dist/components/checkbox/index.js.map +0 -1
  304. package/dist/components/checkbox-group/checkbox-group.d.ts.map +0 -1
  305. package/dist/components/checkbox-group/index.d.ts.map +0 -1
  306. package/dist/components/checkbox-group/index.js.map +0 -1
  307. package/dist/components/collapsible/collapsible.d.ts.map +0 -1
  308. package/dist/components/collapsible/index.d.ts.map +0 -1
  309. package/dist/components/collapsible/index.js.map +0 -1
  310. package/dist/components/color-picker/color-picker.d.ts.map +0 -1
  311. package/dist/components/color-picker/color-utils.d.ts.map +0 -1
  312. package/dist/components/color-picker/index.d.ts.map +0 -1
  313. package/dist/components/color-picker/index.js.map +0 -1
  314. package/dist/components/color-picker/palettes.d.ts.map +0 -1
  315. package/dist/components/combobox/combobox.agent.d.ts.map +0 -1
  316. package/dist/components/combobox/combobox.d.ts.map +0 -1
  317. package/dist/components/combobox/index.d.ts.map +0 -1
  318. package/dist/components/combobox/index.js.map +0 -1
  319. package/dist/components/command-palette/command-palette.agent.d.ts.map +0 -1
  320. package/dist/components/command-palette/command-palette.d.ts.map +0 -1
  321. package/dist/components/command-palette/index.d.ts.map +0 -1
  322. package/dist/components/command-palette/index.js.map +0 -1
  323. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +0 -1
  324. package/dist/components/data-table/cell-renderers/balance-cell-renderer.d.ts.map +0 -1
  325. package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +0 -1
  326. package/dist/components/data-table/cell-renderers/currency-cell-renderer.d.ts.map +0 -1
  327. package/dist/components/data-table/cell-renderers/date-cell-renderer.d.ts.map +0 -1
  328. package/dist/components/data-table/cell-renderers/link-cell-renderer.d.ts.map +0 -1
  329. package/dist/components/data-table/cell-renderers/status-cell-renderer.d.ts.map +0 -1
  330. package/dist/components/data-table/cell-renderers/tag-list-cell-renderer.d.ts.map +0 -1
  331. package/dist/components/data-table/cell-renderers/toggle-cell-renderer.d.ts.map +0 -1
  332. package/dist/components/data-table/cell-renderers/user-cell-renderer.d.ts.map +0 -1
  333. package/dist/components/data-table/data-table.agent.d.ts.map +0 -1
  334. package/dist/components/data-table/data-table.d.ts.map +0 -1
  335. package/dist/components/data-table/hooks/use-total-row.d.ts.map +0 -1
  336. package/dist/components/data-table/index.d.ts.map +0 -1
  337. package/dist/components/data-table/index.js.map +0 -1
  338. package/dist/components/data-table/toolbar.d.ts.map +0 -1
  339. package/dist/components/date-picker/date-picker.d.ts.map +0 -1
  340. package/dist/components/date-picker/index.d.ts.map +0 -1
  341. package/dist/components/date-picker/index.js.map +0 -1
  342. package/dist/components/date-range-picker/date-range-picker.d.ts.map +0 -1
  343. package/dist/components/date-range-picker/index.d.ts.map +0 -1
  344. package/dist/components/date-range-picker/index.js.map +0 -1
  345. package/dist/components/date-time-picker/date-time-picker.d.ts.map +0 -1
  346. package/dist/components/date-time-picker/index.d.ts.map +0 -1
  347. package/dist/components/date-time-picker/index.js.map +0 -1
  348. package/dist/components/description-list/description-list.d.ts.map +0 -1
  349. package/dist/components/description-list/index.d.ts.map +0 -1
  350. package/dist/components/description-list/index.js.map +0 -1
  351. package/dist/components/dialog/dialog.agent.d.ts.map +0 -1
  352. package/dist/components/dialog/dialog.d.ts.map +0 -1
  353. package/dist/components/dialog/index.d.ts.map +0 -1
  354. package/dist/components/dialog/index.js.map +0 -1
  355. package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +0 -1
  356. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +0 -1
  357. package/dist/components/dropdown-menu/index.d.ts.map +0 -1
  358. package/dist/components/dropdown-menu/index.js.map +0 -1
  359. package/dist/components/empty-state/empty-state.d.ts.map +0 -1
  360. package/dist/components/empty-state/index.d.ts.map +0 -1
  361. package/dist/components/empty-state/index.js.map +0 -1
  362. package/dist/components/file-upload/file-upload.agent.d.ts.map +0 -1
  363. package/dist/components/file-upload/file-upload.d.ts.map +0 -1
  364. package/dist/components/file-upload/index.d.ts.map +0 -1
  365. package/dist/components/file-upload/index.js.map +0 -1
  366. package/dist/components/flag/flag.d.ts.map +0 -1
  367. package/dist/components/flag/index.d.ts.map +0 -1
  368. package/dist/components/flag/index.js.map +0 -1
  369. package/dist/components/floating-action-button/floating-action-button.d.ts.map +0 -1
  370. package/dist/components/floating-action-button/index.d.ts.map +0 -1
  371. package/dist/components/floating-action-button/index.js.map +0 -1
  372. package/dist/components/form-field/form-field-context.d.ts.map +0 -1
  373. package/dist/components/form-field/form-field.d.ts.map +0 -1
  374. package/dist/components/form-field/index.d.ts.map +0 -1
  375. package/dist/components/form-field/index.js.map +0 -1
  376. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +0 -1
  377. package/dist/components/freemium-paywall/index.d.ts.map +0 -1
  378. package/dist/components/freemium-paywall/index.js.map +0 -1
  379. package/dist/components/header/header.d.ts.map +0 -1
  380. package/dist/components/header/index.d.ts.map +0 -1
  381. package/dist/components/header/index.js.map +0 -1
  382. package/dist/components/icon-button/index.d.ts.map +0 -1
  383. package/dist/components/icon-button/index.js.map +0 -1
  384. package/dist/components/icon-button-group/icon-button-group.d.ts.map +0 -1
  385. package/dist/components/icon-button-group/index.d.ts.map +0 -1
  386. package/dist/components/icon-button-group/index.js.map +0 -1
  387. package/dist/components/index.d.ts.map +0 -1
  388. package/dist/components/kbd/index.d.ts.map +0 -1
  389. package/dist/components/kbd/index.js.map +0 -1
  390. package/dist/components/kbd/kbd.d.ts.map +0 -1
  391. package/dist/components/key-value-pair/index.d.ts.map +0 -1
  392. package/dist/components/key-value-pair/index.js.map +0 -1
  393. package/dist/components/key-value-pair/key-value-pair.d.ts.map +0 -1
  394. package/dist/components/list/index.d.ts.map +0 -1
  395. package/dist/components/list/index.js.map +0 -1
  396. package/dist/components/list/list.d.ts.map +0 -1
  397. package/dist/components/live-region/index.d.ts.map +0 -1
  398. package/dist/components/live-region/index.js.map +0 -1
  399. package/dist/components/live-region/live-region.d.ts.map +0 -1
  400. package/dist/components/logo/index.d.ts.map +0 -1
  401. package/dist/components/logo/index.js.map +0 -1
  402. package/dist/components/logo/logo.d.ts.map +0 -1
  403. package/dist/components/matrix-rain/index.d.ts.map +0 -1
  404. package/dist/components/matrix-rain/index.js.map +0 -1
  405. package/dist/components/matrix-rain/matrix-rain.d.ts.map +0 -1
  406. package/dist/components/message-card/index.d.ts.map +0 -1
  407. package/dist/components/message-card/index.js.map +0 -1
  408. package/dist/components/message-card/message-card.d.ts.map +0 -1
  409. package/dist/components/message-tray/index.d.ts.map +0 -1
  410. package/dist/components/message-tray/index.js.map +0 -1
  411. package/dist/components/message-tray/message-tray.d.ts.map +0 -1
  412. package/dist/components/multi-select/index.d.ts.map +0 -1
  413. package/dist/components/multi-select/index.js.map +0 -1
  414. package/dist/components/multi-select/multi-select.agent.d.ts.map +0 -1
  415. package/dist/components/multi-select/multi-select.d.ts.map +0 -1
  416. package/dist/components/navigation-menu/index.d.ts.map +0 -1
  417. package/dist/components/navigation-menu/index.js.map +0 -1
  418. package/dist/components/navigation-menu/navigation-menu.d.ts.map +0 -1
  419. package/dist/components/notification-card/index.d.ts.map +0 -1
  420. package/dist/components/notification-card/index.js.map +0 -1
  421. package/dist/components/notification-card/notification-card.d.ts.map +0 -1
  422. package/dist/components/notification-tray/index.d.ts.map +0 -1
  423. package/dist/components/notification-tray/index.js.map +0 -1
  424. package/dist/components/notification-tray/notification-tray.d.ts.map +0 -1
  425. package/dist/components/number-input/index.d.ts.map +0 -1
  426. package/dist/components/number-input/index.js.map +0 -1
  427. package/dist/components/number-input/number-input.d.ts.map +0 -1
  428. package/dist/components/number-input/use-locale-number.d.ts.map +0 -1
  429. package/dist/components/otp-input/index.d.ts.map +0 -1
  430. package/dist/components/otp-input/index.js.map +0 -1
  431. package/dist/components/otp-input/otp-input.d.ts.map +0 -1
  432. package/dist/components/pagination/index.d.ts.map +0 -1
  433. package/dist/components/pagination/index.js.map +0 -1
  434. package/dist/components/pagination/pagination.agent.d.ts.map +0 -1
  435. package/dist/components/pagination/pagination.d.ts.map +0 -1
  436. package/dist/components/password-input/index.d.ts.map +0 -1
  437. package/dist/components/password-input/index.js.map +0 -1
  438. package/dist/components/password-input/password-input.d.ts.map +0 -1
  439. package/dist/components/payment-form/index.d.ts.map +0 -1
  440. package/dist/components/payment-form/index.js.map +0 -1
  441. package/dist/components/payment-form/payment-form.agent.d.ts.map +0 -1
  442. package/dist/components/payment-form/payment-form.d.ts.map +0 -1
  443. package/dist/components/pdf-viewer/index.d.ts.map +0 -1
  444. package/dist/components/pdf-viewer/index.js.map +0 -1
  445. package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +0 -1
  446. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +0 -1
  447. package/dist/components/phone-input/index.d.ts.map +0 -1
  448. package/dist/components/phone-input/index.js.map +0 -1
  449. package/dist/components/phone-input/phone-input.d.ts.map +0 -1
  450. package/dist/components/popover/index.d.ts.map +0 -1
  451. package/dist/components/popover/index.js.map +0 -1
  452. package/dist/components/popover/popover.agent.d.ts.map +0 -1
  453. package/dist/components/popover/popover.d.ts.map +0 -1
  454. package/dist/components/privacy-lock/index.d.ts.map +0 -1
  455. package/dist/components/privacy-lock/index.js.map +0 -1
  456. package/dist/components/privacy-lock/privacy-lock.d.ts.map +0 -1
  457. package/dist/components/progress/index.d.ts.map +0 -1
  458. package/dist/components/progress/index.js.map +0 -1
  459. package/dist/components/progress/progress.agent.d.ts.map +0 -1
  460. package/dist/components/progress/progress.d.ts.map +0 -1
  461. package/dist/components/radio/index.d.ts.map +0 -1
  462. package/dist/components/radio/index.js.map +0 -1
  463. package/dist/components/radio-group/index.d.ts.map +0 -1
  464. package/dist/components/radio-group/index.js.map +0 -1
  465. package/dist/components/radio-group/radio-group-context.d.ts.map +0 -1
  466. package/dist/components/radio-group/radio-group.d.ts.map +0 -1
  467. package/dist/components/radio-group/radio.d.ts.map +0 -1
  468. package/dist/components/resizable/index.d.ts.map +0 -1
  469. package/dist/components/resizable/index.js.map +0 -1
  470. package/dist/components/resizable/resizable-context.d.ts.map +0 -1
  471. package/dist/components/resizable/resizable.agent.d.ts.map +0 -1
  472. package/dist/components/resizable/resizable.d.ts.map +0 -1
  473. package/dist/components/rich-text-editor/index.d.ts.map +0 -1
  474. package/dist/components/rich-text-editor/index.js.map +0 -1
  475. package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +0 -1
  476. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +0 -1
  477. package/dist/components/scroll-area/index.d.ts.map +0 -1
  478. package/dist/components/scroll-area/index.js.map +0 -1
  479. package/dist/components/scroll-area/scroll-area.d.ts.map +0 -1
  480. package/dist/components/search-bar/index.d.ts.map +0 -1
  481. package/dist/components/search-bar/index.js.map +0 -1
  482. package/dist/components/search-bar/search-bar.d.ts.map +0 -1
  483. package/dist/components/search-input/index.d.ts.map +0 -1
  484. package/dist/components/search-input/index.js.map +0 -1
  485. package/dist/components/search-input/search-input.d.ts.map +0 -1
  486. package/dist/components/select/index.d.ts.map +0 -1
  487. package/dist/components/select/index.js.map +0 -1
  488. package/dist/components/select/select.d.ts.map +0 -1
  489. package/dist/components/separator/index.d.ts.map +0 -1
  490. package/dist/components/separator/index.js.map +0 -1
  491. package/dist/components/separator/separator.d.ts.map +0 -1
  492. package/dist/components/sheet/index.d.ts.map +0 -1
  493. package/dist/components/sheet/index.js.map +0 -1
  494. package/dist/components/sheet/sheet.agent.d.ts.map +0 -1
  495. package/dist/components/sheet/sheet.d.ts.map +0 -1
  496. package/dist/components/sidebar/index.d.ts.map +0 -1
  497. package/dist/components/sidebar/index.js.map +0 -1
  498. package/dist/components/sidebar/sidebar.agent.d.ts.map +0 -1
  499. package/dist/components/sidebar/sidebar.d.ts.map +0 -1
  500. package/dist/components/sign-in-with-alfadocs-button/index.d.ts.map +0 -1
  501. package/dist/components/sign-in-with-alfadocs-button/index.js.map +0 -1
  502. package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +0 -1
  503. package/dist/components/signature-capture/index.d.ts.map +0 -1
  504. package/dist/components/signature-capture/index.js.map +0 -1
  505. package/dist/components/signature-capture/signature-capture.agent.d.ts.map +0 -1
  506. package/dist/components/signature-capture/signature-capture.d.ts.map +0 -1
  507. package/dist/components/skeleton/index.d.ts.map +0 -1
  508. package/dist/components/skeleton/index.js.map +0 -1
  509. package/dist/components/skeleton/skeleton.d.ts.map +0 -1
  510. package/dist/components/skip-link/index.d.ts.map +0 -1
  511. package/dist/components/skip-link/index.js.map +0 -1
  512. package/dist/components/skip-link/skip-link.d.ts.map +0 -1
  513. package/dist/components/slider/index.d.ts.map +0 -1
  514. package/dist/components/slider/index.js.map +0 -1
  515. package/dist/components/slider/slider.d.ts.map +0 -1
  516. package/dist/components/slot-grid/index.d.ts.map +0 -1
  517. package/dist/components/slot-grid/index.js.map +0 -1
  518. package/dist/components/slot-grid/slot-grid.d.ts.map +0 -1
  519. package/dist/components/sparkline/index.d.ts.map +0 -1
  520. package/dist/components/sparkline/index.js.map +0 -1
  521. package/dist/components/sparkline/sparkline.agent.d.ts.map +0 -1
  522. package/dist/components/sparkline/sparkline.d.ts.map +0 -1
  523. package/dist/components/sparkline/use-linear-trend.d.ts.map +0 -1
  524. package/dist/components/spinner/index.d.ts.map +0 -1
  525. package/dist/components/spinner/index.js.map +0 -1
  526. package/dist/components/spinner/spinner.d.ts.map +0 -1
  527. package/dist/components/stat/index.d.ts.map +0 -1
  528. package/dist/components/stat/index.js.map +0 -1
  529. package/dist/components/stat/stat.d.ts.map +0 -1
  530. package/dist/components/stepper-accordion/index.d.ts.map +0 -1
  531. package/dist/components/stepper-accordion/index.js.map +0 -1
  532. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +0 -1
  533. package/dist/components/stepper-calendar/index.d.ts.map +0 -1
  534. package/dist/components/stepper-calendar/index.js.map +0 -1
  535. package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +0 -1
  536. package/dist/components/stepper-progress/index.d.ts.map +0 -1
  537. package/dist/components/stepper-progress/index.js.map +0 -1
  538. package/dist/components/stepper-progress/stepper-progress.d.ts.map +0 -1
  539. package/dist/components/streaming-text/index.d.ts.map +0 -1
  540. package/dist/components/streaming-text/index.js.map +0 -1
  541. package/dist/components/streaming-text/streaming-text.d.ts.map +0 -1
  542. package/dist/components/suggestion-chip/index.d.ts.map +0 -1
  543. package/dist/components/suggestion-chip/index.js.map +0 -1
  544. package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +0 -1
  545. package/dist/components/switch/index.d.ts.map +0 -1
  546. package/dist/components/switch/index.js.map +0 -1
  547. package/dist/components/switch/switch.d.ts.map +0 -1
  548. package/dist/components/tabs/index.d.ts.map +0 -1
  549. package/dist/components/tabs/index.js.map +0 -1
  550. package/dist/components/tabs/tabs.agent.d.ts.map +0 -1
  551. package/dist/components/tabs/tabs.d.ts.map +0 -1
  552. package/dist/components/tag/index.d.ts.map +0 -1
  553. package/dist/components/tag/index.js.map +0 -1
  554. package/dist/components/tag/tag.d.ts.map +0 -1
  555. package/dist/components/task-card/index.d.ts.map +0 -1
  556. package/dist/components/task-card/index.js.map +0 -1
  557. package/dist/components/task-card/task-card.d.ts.map +0 -1
  558. package/dist/components/task-tray/index.d.ts.map +0 -1
  559. package/dist/components/task-tray/index.js.map +0 -1
  560. package/dist/components/task-tray/task-tray.d.ts.map +0 -1
  561. package/dist/components/text-area/index.d.ts.map +0 -1
  562. package/dist/components/text-area/index.js.map +0 -1
  563. package/dist/components/text-area/text-area.d.ts.map +0 -1
  564. package/dist/components/text-input/index.d.ts.map +0 -1
  565. package/dist/components/text-input/index.js.map +0 -1
  566. package/dist/components/text-input/text-input.d.ts.map +0 -1
  567. package/dist/components/theme-root/index.d.ts.map +0 -1
  568. package/dist/components/theme-root/index.js.map +0 -1
  569. package/dist/components/theme-root/theme-root.d.ts.map +0 -1
  570. package/dist/components/theme-toggle/index.d.ts.map +0 -1
  571. package/dist/components/theme-toggle/index.js.map +0 -1
  572. package/dist/components/theme-toggle/theme-toggle.d.ts.map +0 -1
  573. package/dist/components/time-picker/index.d.ts.map +0 -1
  574. package/dist/components/time-picker/index.js.map +0 -1
  575. package/dist/components/time-picker/time-picker.d.ts.map +0 -1
  576. package/dist/components/timeline/index.d.ts.map +0 -1
  577. package/dist/components/timeline/index.js.map +0 -1
  578. package/dist/components/timeline/timeline.d.ts.map +0 -1
  579. package/dist/components/timestamp/index.d.ts.map +0 -1
  580. package/dist/components/timestamp/index.js.map +0 -1
  581. package/dist/components/timestamp/timestamp.d.ts.map +0 -1
  582. package/dist/components/toast/index.d.ts.map +0 -1
  583. package/dist/components/toast/index.js.map +0 -1
  584. package/dist/components/toast/toast.d.ts.map +0 -1
  585. package/dist/components/tooltip/index.d.ts.map +0 -1
  586. package/dist/components/tooltip/index.js.map +0 -1
  587. package/dist/components/tooltip/tooltip.d.ts.map +0 -1
  588. package/dist/components/tooth-scheme/index.d.ts.map +0 -1
  589. package/dist/components/tooth-scheme/index.js.map +0 -1
  590. package/dist/components/tooth-scheme/tooth-data.d.ts.map +0 -1
  591. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +0 -1
  592. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +0 -1
  593. package/dist/components/transcript-panel/index.d.ts.map +0 -1
  594. package/dist/components/transcript-panel/index.js.map +0 -1
  595. package/dist/components/transcript-panel/transcript-panel.d.ts.map +0 -1
  596. package/dist/components/typing-indicator/index.d.ts.map +0 -1
  597. package/dist/components/typing-indicator/index.js.map +0 -1
  598. package/dist/components/typing-indicator/typing-indicator.d.ts.map +0 -1
  599. package/dist/components/visually-hidden/index.d.ts.map +0 -1
  600. package/dist/components/visually-hidden/index.js.map +0 -1
  601. package/dist/components/visually-hidden/visually-hidden.d.ts.map +0 -1
  602. package/dist/components/warning-stack/index.d.ts.map +0 -1
  603. package/dist/components/warning-stack/index.js.map +0 -1
  604. package/dist/components/warning-stack/warning-stack.d.ts.map +0 -1
  605. package/dist/components/workflow/index.d.ts.map +0 -1
  606. package/dist/components/workflow/index.js.map +0 -1
  607. package/dist/components/workflow/workflow-card.d.ts.map +0 -1
  608. package/dist/components/workflow/workflow-editor.d.ts.map +0 -1
  609. package/dist/components/workflow/workflow-map.d.ts.map +0 -1
  610. package/dist/components/workflow/workflow-types.d.ts.map +0 -1
  611. package/dist/hooks/index.d.ts.map +0 -1
  612. package/dist/hooks/index.js.map +0 -1
  613. package/dist/hooks/use-locale.d.ts.map +0 -1
  614. package/dist/hooks/use-media-query.d.ts.map +0 -1
  615. package/dist/hooks/use-prefers-reduced-motion.d.ts.map +0 -1
  616. package/dist/hooks/use-theme.d.ts.map +0 -1
  617. package/dist/i18n/config.d.ts.map +0 -1
  618. package/dist/i18n/config.js.map +0 -1
  619. package/dist/i18n/resources.d.ts.map +0 -1
  620. package/dist/index.js.map +0 -1
  621. package/dist/option/index.js.map +0 -1
  622. package/dist/patterns/leo-assistant/index.d.ts.map +0 -1
  623. package/dist/patterns/leo-assistant/index.js.map +0 -1
  624. package/dist/patterns/leo-assistant/leo-chat-surface.d.ts.map +0 -1
  625. package/dist/patterns/leo-assistant/leo-embedded.d.ts.map +0 -1
  626. package/dist/patterns/leo-assistant/leo-popout.d.ts.map +0 -1
  627. package/dist/patterns/leo-assistant/leo-sidebar.d.ts.map +0 -1
  628. package/dist/patterns/leo-assistant/leo-types.d.ts.map +0 -1
  629. package/dist/patterns/patient-shell/index.d.ts.map +0 -1
  630. package/dist/patterns/patient-shell/index.js.map +0 -1
  631. package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
  632. package/dist/safe-html/index.js.map +0 -1
  633. package/dist/tokens/apexcharts-theme.d.ts.map +0 -1
  634. package/dist/tokens/themes/bridges/stripe-appearance.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.agent-BpbVA-Zh.js","sources":["../../src/components/tabs/tabs.tsx","../../src/components/tabs/tabs.agent.ts"],"sourcesContent":["import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\nimport { X, ChevronDown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { Select, type SelectOption } from '../select/select';\n\n// ---------------------------------------------------------------------------\n// CVA recipes\n// ---------------------------------------------------------------------------\n\nexport const tabsListVariants = cva(\n 'ds:relative ds:flex',\n {\n variants: {\n variant: {\n // Shadcn-style segmented control: light container, white active card\n default: 'ds:flex-1 ds:min-w-0 ds:items-center ds:bg-muted/10 ds:rounded-[var(--radius-md)] ds:p-1',\n // Classic underline tabs: bottom border with colored active indicator\n underlined: 'ds:flex-1 ds:min-w-0 ds:items-end ds:[border-block-end:1px_solid_var(--border)]',\n // Segmented control: warm secondary container, content-width\n pills: 'ds:items-center ds:bg-secondary ds:rounded-[var(--radius-md)] ds:p-1',\n },\n orientation: {\n horizontal: 'ds:flex-row ds:overflow-hidden',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n },\n);\n\nexport const tabsTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:whitespace-nowrap ds:border-0',\n 'ds:gap-2 ds:font-medium ds:transition-colors',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:cursor-pointer ds:select-none',\n 'ds:disabled:pointer-events-none ds:disabled:opacity-50',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n variant: {\n default: [\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-background ds:data-[state=active]:text-foreground',\n 'ds:data-[state=active]:shadow-sm',\n ].join(' '),\n underlined: [\n 'ds:bg-transparent ds:text-muted-foreground',\n 'ds:[border-block-end:2px_solid_transparent]',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:[border-block-end-color:var(--primary)]',\n 'ds:data-[state=active]:text-foreground ds:data-[state=active]:[margin-block-end:-1px]',\n ].join(' '),\n pills: [\n 'ds:rounded-[var(--radius-full)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/20 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-primary ds:data-[state=active]:text-primary-foreground',\n ].join(' '),\n },\n size: {\n sm: 'ds:h-8 ds:px-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-10 ds:px-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:px-[var(--spacing-lg)] ds:text-[length:var(--font-size-lg)]',\n },\n orientation: {\n horizontal: '',\n vertical: 'ds:w-full ds:justify-start',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype TabsOverflow = 'dropdown' | 'select';\n\ninterface TabsContextValue {\n variant: 'default' | 'underlined' | 'pills';\n size: 'sm' | 'md' | 'lg';\n orientation: 'horizontal' | 'vertical';\n overflow: TabsOverflow;\n value: string;\n setValue: (value: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n overflow: 'dropdown',\n value: '',\n setValue: () => {},\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TabsRootProps\n extends Omit<ComponentPropsWithoutRef<typeof TabsPrimitive.Root>, 'orientation'> {\n variant?: 'default' | 'underlined' | 'pills';\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /**\n * Strategy for tabs that don't fit horizontally.\n *\n * - `'dropdown'` (default) — overflowing tabs collapse into a \"More\"\n * `DropdownMenu` rendered next to the visible tab list. Most tabs\n * stay visible inline; the few that don't fit hide behind the menu.\n * Best when there are 5–7 tabs at moderately narrow viewports.\n * - `'select'` — at narrow container widths (under the `@md` breakpoint)\n * the entire tab strip collapses into a single `Select` whose value\n * is the active tab. Best when there are many tabs and the panel is\n * genuinely cramped (mobile, side-panel host). Above `@md`, the\n * inline tab list reappears unchanged.\n *\n * Limitation: the Select mirror builds option labels from each\n * `Tabs.Trigger`'s `children`. Plain string / number children are\n * used verbatim; richer children (icon + text, fragments) fall back\n * to the trigger's `value` so the option remains selectable. Prefer\n * plain-text trigger children when using `overflow=\"select\"`, or use\n * the trigger's `icon` prop for the icon and keep `children` a\n * plain string.\n *\n * @default 'dropdown'\n */\n overflow?: TabsOverflow;\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n 'aria-label'?: string;\n}\n\nexport interface TabsTriggerProps\n extends ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n icon?: ReactNode;\n badge?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport type TabsContentProps = ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\n// ---------------------------------------------------------------------------\n// TabsRoot\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(\n (\n {\n variant = 'default',\n size = 'md',\n orientation = 'horizontal',\n overflow = 'dropdown',\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n // Track the active tab so the `overflow=\"select\"` mirror can read it\n // without forcing consumers into controlled mode. If `value` is passed\n // we honour it; otherwise we manage internal state seeded from\n // `defaultValue` and notify consumers via `onValueChange`. Net effect\n // is identical to Radix's own controlled / uncontrolled split — we\n // just shadow the value into context so the Select can mirror it.\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue ?? '');\n const value = isControlled ? (valueProp ?? '') : internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const ctxValue = useMemo(\n () => ({ variant, size, orientation, overflow, value, setValue }),\n [variant, size, orientation, overflow, value, setValue],\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsPrimitive.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n // We always run Radix in controlled mode against our shadow state\n // (seeded from `defaultValue`) so the `overflow=\"select\"` mirror\n // can read the active value via context without DOM observation.\n value={value}\n onValueChange={setValue}\n data-component=\"tabs\"\n className={cx(\n 'ds:flex',\n orientation === 'vertical' ? 'ds:flex-row ds:gap-[var(--spacing-md)]' : 'ds:flex-col',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n );\n },\n);\nTabsRoot.displayName = 'Tabs';\n\n// ---------------------------------------------------------------------------\n// TabsList — with overflow detection\n// ---------------------------------------------------------------------------\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { variant, size, orientation, overflow, value, setValue } = useContext(TabsContext);\n const { t } = useTranslation('ui');\n\n const listRef = useRef<HTMLDivElement>(null);\n const [overflowTabs, setOverflowTabs] = useState<{ value: string; label: string }[]>([]);\n const isHorizontal = orientation === 'horizontal';\n // The `select` overflow strategy renders a Select mirror at narrow\n // container widths and skips the DropdownMenu overflow detector\n // (it's the wrong UX for that case — a select-and-a-dropdown would\n // double up). The dropdown detector only runs when `overflow` is\n // `dropdown` and the strip is horizontal.\n const isDropdownOverflow = overflow === 'dropdown' && isHorizontal;\n\n useEffect(() => {\n if (!isDropdownOverflow) {\n setOverflowTabs([]);\n return;\n }\n const el = listRef.current;\n if (!el) return;\n\n const detectOverflow = () => {\n const containerRight = el.getBoundingClientRect().right;\n const hidden: { value: string; label: string }[] = [];\n el.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]').forEach((tab) => {\n const rect = tab.getBoundingClientRect();\n if (rect.right > containerRight + 2) {\n const value = tab.getAttribute('data-value') ?? tab.dataset['value'] ?? '';\n const label = tab.textContent?.trim() ?? value;\n hidden.push({ value, label });\n }\n });\n setOverflowTabs(hidden);\n };\n\n const ro = new ResizeObserver(detectOverflow);\n ro.observe(el);\n detectOverflow();\n return () => ro.disconnect();\n }, [isDropdownOverflow, children]);\n\n const combinedRef = (node: HTMLDivElement | null) => {\n (listRef as MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // For `overflow=\"select\"` we mirror the Trigger children as Select\n // options. Triggers may carry icon + text; for the Select label we\n // prefer the trigger's plain-text children — anything else falls\n // back to the trigger's `value` so the option is at least selectable.\n const selectOptions = useMemo<SelectOption<string>[]>(() => {\n if (overflow !== 'select') return [];\n return Children.toArray(children)\n .filter((child): child is ReactElement<TabsTriggerProps> => isValidElement(child))\n .filter((child) => typeof child.props.value === 'string' && child.props.value.length > 0)\n .map((child) => {\n const triggerValue = child.props.value as string;\n const labelChild = child.props.children;\n const label =\n typeof labelChild === 'string'\n ? labelChild\n : typeof labelChild === 'number'\n ? String(labelChild)\n : triggerValue;\n return { value: triggerValue, label };\n });\n }, [children, overflow]);\n\n if (overflow === 'select' && isHorizontal) {\n // Container queries gate the swap: above `@md` (Tailwind v4 default\n // 28rem container width) the inline tab strip renders; below it,\n // the Select takes over. The Tabs.List markup stays mounted in\n // both modes so Radix's roving-tabindex / ARIA wiring is preserved\n // even when the strip is visually hidden — keyboard users who land\n // on the panel via skip-link still get to the active tab.\n return (\n <div className=\"ds:@container/tabs ds:relative ds:w-full\">\n {/* Select mirror — visible at narrow container widths only. */}\n <div className=\"ds:block ds:@md/tabs:hidden\">\n <Select\n options={selectOptions}\n value={value}\n onValueChange={(next) => {\n if (typeof next === 'string' && next.length > 0) setValue(next);\n }}\n size={size}\n aria-label={ariaLabel ?? t('tabs.selectLabel')}\n />\n </div>\n {/* Inline tab strip — visible at wider container widths. */}\n <div className=\"ds:hidden ds:@md/tabs:flex ds:relative ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:relative ds:flex ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n\n {isDropdownOverflow && overflowTabs.length > 0 && (\n <OverflowMenu tabs={overflowTabs} label={t('tabs.moreTabs')} size={size} />\n )}\n </div>\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\n// ---------------------------------------------------------------------------\n// OverflowMenu (internal)\n// ---------------------------------------------------------------------------\n\ninterface OverflowMenuProps {\n tabs: { value: string; label: string }[];\n label: string;\n size: 'sm' | 'md' | 'lg';\n}\n\nfunction OverflowMenu({ tabs, label, size }: OverflowMenuProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <DropdownMenuPrimitive.Root>\n <DropdownMenuPrimitive.Trigger\n className={cx(\n tabsTriggerVariants({ variant, size, orientation: 'horizontal' }),\n 'ds:shrink-0 ds:ms-1',\n )}\n aria-label={label}\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </DropdownMenuPrimitive.Trigger>\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n sideOffset={4}\n className={cx(\n 'ds:z-50 ds:min-w-40 ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-border ds:bg-popover ds:p-1 ds:shadow-md',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n )}\n >\n {tabs.map(({ value, label: tabLabel }) => (\n <DropdownMenuPrimitive.Item\n key={value}\n className={cx(\n 'ds:relative ds:flex ds:cursor-pointer ds:select-none ds:items-center',\n 'ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:text-[var(--font-size-sm)] ds:text-foreground ds:outline-none',\n 'ds:hover:bg-muted ds:focus:bg-muted',\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n )}\n onSelect={() => {\n const tab = document.querySelector<HTMLButtonElement>(\n `[role=\"tab\"][data-value=\"${CSS.escape(value)}\"]`,\n );\n tab?.click();\n tab?.scrollIntoView({ inline: 'nearest' });\n }}\n >\n {tabLabel}\n </DropdownMenuPrimitive.Item>\n ))}\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n </DropdownMenuPrimitive.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n (\n {\n variant: variantProp,\n size: sizeProp,\n orientation: orientationProp,\n icon,\n badge,\n dismissible = false,\n onDismiss,\n className,\n children,\n value,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TabsContext);\n const variant = variantProp ?? ctx.variant;\n const size = sizeProp ?? ctx.size;\n const orientation = orientationProp ?? ctx.orientation;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // APG dismissible-tab pattern: Delete/Backspace while trigger is focused closes the tab.\n // The visual X is pointer-only (aria-hidden) to avoid nested-interactive HTML violation.\n if (dismissible && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n onDismiss?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n value={value}\n data-value={value}\n className={tabsTriggerVariants({ variant, size, orientation, className })}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:size-4\">{icon}</span>}\n {children}\n {badge && <span className=\"ds:shrink-0\">{badge}</span>}\n {dismissible && (\n // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.\n // No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).\n <span\n aria-hidden=\"true\"\n className={cx(\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-6 ds:rounded-[var(--radius-sm)]',\n 'ds:hover:bg-muted-foreground/20',\n )}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDismiss?.();\n }}\n >\n <X className=\"ds:size-3.5\" />\n </span>\n )}\n </TabsPrimitive.Trigger>\n );\n },\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, children, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cx(\n 'ds:mt-[var(--spacing-sm)] ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Content>\n ),\n);\nTabsContent.displayName = 'TabsContent';\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = Object.assign(TabsRoot, {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n\nexport { TabsList, TabsTrigger, TabsContent };\n\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const tabsAgent: AgentAdapter<unknown> = {\n id: 'tabs',\n capabilities: ['select_single', 'navigate'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id. The agent reads this to identify the active tab via the DOM.',\n },\n },\n};\n"],"names":["tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","props","ref","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","value","setValue","useCallback","next","ctxValue","useMemo","jsx","TabsPrimitive","cx","TabsList","ariaLabel","useContext","t","useTranslation","listRef","overflowTabs","setOverflowTabs","isHorizontal","isDropdownOverflow","useEffect","el","detectOverflow","containerRight","hidden","tab","label","_a","ro","combinedRef","node","selectOptions","Children","child","isValidElement","triggerValue","labelChild","jsxs","Select","OverflowMenu","tabs","DropdownMenuPrimitive","ChevronDown","tabLabel","TabsTrigger","variantProp","sizeProp","orientationProp","icon","badge","dismissible","onDismiss","onKeyDown","ctx","handleKeyDown","e","X","TabsContent","Tabs","tabsAgent"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tag-BqidXKo3.js","sources":["../../src/components/tag/tag.tsx"],"sourcesContent":["import {\n forwardRef,\n useRef,\n useState,\n useEffect,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { Tooltip } from '../tooltip';\n\n/* ------------------------------------------------------------------ */\n/* CVA — tag pill */\n/* ------------------------------------------------------------------ */\n\nconst tagVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-eyebrow ds:whitespace-nowrap',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n brand: '',\n },\n fill: {\n solid: '',\n outline: 'ds:border ds:bg-transparent',\n },\n size: {\n // Symmetric start/end padding — close button uses negative margin to stay flush.\n // Size is the only eyebrow-role axis that varies per Tag size; weight, transform,\n // tracking, line-height, and features all come from `.type-eyebrow` on the base.\n sm: 'ds:h-[calc(var(--spacing)*4)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-[calc(var(--spacing)*5)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-[calc(var(--spacing)*6)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n },\n compoundVariants: [\n // Solid fills — foreground tokens adapt per theme\n { fill: 'solid', variant: 'neutral', className: 'ds:bg-muted/20 ds:text-muted-foreground' },\n { fill: 'solid', variant: 'info', className: 'ds:bg-info ds:text-[color:var(--info-solid-foreground)]' },\n { fill: 'solid', variant: 'success', className: 'ds:bg-success ds:text-[color:var(--success-solid-foreground)]' },\n { fill: 'solid', variant: 'warning', className: 'ds:bg-warning ds:text-foreground' },\n { fill: 'solid', variant: 'error', className: 'ds:bg-destructive ds:text-destructive-foreground' },\n { fill: 'solid', variant: 'brand', className: 'ds:bg-primary ds:text-primary-foreground' },\n // Outline fills\n { fill: 'outline', variant: 'neutral', className: 'ds:border-muted ds:text-muted-foreground' },\n { fill: 'outline', variant: 'info', className: 'ds:border-info ds:text-[var(--info-foreground)]' },\n { fill: 'outline', variant: 'success', className: 'ds:border-success ds:text-[var(--success-foreground)]' },\n { fill: 'outline', variant: 'warning', className: 'ds:border-warning ds:text-[var(--warning-foreground)]' },\n { fill: 'outline', variant: 'error', className: 'ds:border-destructive ds:text-[var(--error-foreground)]' },\n { fill: 'outline', variant: 'brand', className: 'ds:border-primary ds:text-primary' },\n ],\n defaultVariants: {\n variant: 'neutral',\n fill: 'solid',\n size: 'md',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — close button */\n/* ------------------------------------------------------------------ */\n\nconst closeButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full',\n // Negative end margin keeps the button flush with the pill edge\n 'ds:-me-[var(--spacing-xs)]',\n 'ds:hover:bg-foreground/10',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-1 ds:[&>svg]:size-3',\n md: 'ds:p-1 ds:[&>svg]:size-3.5',\n lg: 'ds:p-1.5 ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* TagProps */\n/* ------------------------------------------------------------------ */\n\nexport interface TagProps {\n /** The visible label text */\n label: string;\n /** Semantic colour variant */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'brand';\n /** Visual fill style */\n fill?: 'solid' | 'outline';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Leading slot — icon element or dot */\n leading?: ReactNode;\n /** Called when the tag is removed (enables close button + Backspace/Delete) */\n onRemove?: () => void;\n /** Called when the tag is clicked (non-removable interactive tag) */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Max inline size before truncation with tooltip — default 'none' */\n maxInlineSize?: string | 'none';\n /** Additional class names */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tag */\n/* ------------------------------------------------------------------ */\n\nexport const Tag = forwardRef<HTMLElement, TagProps>(\n (\n {\n label,\n variant = 'neutral',\n fill = 'solid',\n size = 'md',\n leading,\n onRemove,\n onClick,\n disabled = false,\n maxInlineSize = 'none',\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelRef = useRef<HTMLSpanElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n useEffect(() => {\n const el = labelRef.current;\n if (!el || maxInlineSize === 'none') return;\n\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n const observer = new ResizeObserver(check);\n observer.observe(el);\n check();\n return () => observer.disconnect();\n }, [maxInlineSize]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Backspace' || e.key === 'Delete') && onRemove && !disabled) {\n e.preventDefault();\n announce();\n // Delay gives the live region one render cycle before unmount\n setTimeout(onRemove, 100);\n }\n };\n\n const announce = () => {\n setAnnouncement(t('ui.tag.removed', { label }));\n };\n\n const handleRemove = () => {\n if (!disabled && onRemove) {\n announce();\n setTimeout(onRemove, 100);\n }\n };\n\n const isRemovable = !!onRemove;\n const isClickable = !!onClick && !isRemovable;\n\n const rootClasses = tagVariants({\n variant,\n fill,\n size,\n className: [\n isClickable && !disabled ? 'ds:hover:brightness-90 ds:cursor-pointer' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' '),\n });\n\n const leadingEl = leading ? (\n <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:inline-flex ds:items-center ds:[&>svg]:size-3.5\">\n {leading}\n </span>\n ) : null;\n\n // Consumer-controlled layout constraint — not a design token.\n // maxInlineSize is an arbitrary caller-supplied value that cannot be expressed\n // as a static Tailwind class; the style prop is the only cross-browser option.\n const labelEl = (\n <span\n ref={labelRef}\n className={\n maxInlineSize !== 'none'\n ? 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap'\n : undefined\n }\n // eslint-disable-next-line react/forbid-component-props\n style={maxInlineSize !== 'none' ? { maxInlineSize } : undefined}\n >\n {label}\n </span>\n );\n\n // Live region — only for removable tags; must be a sibling outside the button.\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcement}\n </span>\n );\n\n const closeButton = isRemovable ? (\n <button\n type=\"button\"\n aria-label={t('ui.tag.remove', { label })}\n onClick={handleRemove}\n disabled={disabled}\n // Intentionally excluded from tab order: Backspace/Delete on the focused\n // group element provides the same keyboard action.\n tabIndex={-1}\n className={closeButtonVariants({ size })}\n >\n <X aria-hidden=\"true\" />\n </button>\n ) : null;\n\n const shouldWrapTooltip = maxInlineSize !== 'none' && isOverflowing;\n\n // Clickable tag — renders as <button>; live region is a sibling, not inside button\n if (isClickable) {\n const tagEl = (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={!disabled ? onClick : undefined}\n disabled={disabled}\n data-component=\"tag\"\n className={rootClasses}\n >\n {leadingEl}\n {labelEl}\n </button>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n }\n\n // Removable tag — focusable <span> with embedded close button\n if (isRemovable) {\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n role=\"group\"\n aria-label={label}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n data-component=\"tag\"\n className={rootClasses}\n >\n {liveRegion}\n {leadingEl}\n {labelEl}\n {closeButton}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n }\n\n // Decorative tag — plain <span>, no interactive role\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n data-component=\"tag\"\n className={tagVariants({ variant, fill, size, className })}\n >\n {leadingEl}\n {labelEl}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n },\n);\n\nTag.displayName = 'Tag';\n"],"names":["tagVariants","cva","closeButtonVariants","Tag","forwardRef","label","variant","fill","size","leading","onRemove","onClick","disabled","maxInlineSize","className","ref","t","useTranslation","labelRef","useRef","isOverflowing","setIsOverflowing","useState","announcement","setAnnouncement","useEffect","el","check","observer","handleKeyDown","e","announce","handleRemove","isRemovable","isClickable","rootClasses","leadingEl","jsx","labelEl","liveRegion","closeButton","X","shouldWrapTooltip","tagEl","jsxs","Tooltip"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-card-yW7tKlG4.js","sources":["../../src/components/task-card/task-card.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CheckSquare, Square, AlertCircle, ChevronRight } from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type TaskStatus = 'open' | 'in-progress' | 'done';\nexport type TaskPriority = 'low' | 'normal' | 'high';\n\nexport interface TaskItem {\n /** Unique identifier for the task. */\n id: string;\n /** Title — single line, primary content. */\n title: string;\n /** Optional secondary line (e.g. \"Patient A · Due today\"). */\n description?: string;\n /**\n * Localised due-date hint (e.g. \"Due today\" / \"Tomorrow\"). Rendered as a\n * trailing eyebrow chip when set; consumers compute the bucket and pass\n * the localised string.\n */\n dueLabel?: string;\n /** Lifecycle state — drives the leading icon. */\n status?: TaskStatus;\n /** Priority — `high` colours the leading icon as `--destructive`. */\n priority?: TaskPriority;\n /** Optional deep link — when present the row is an anchor. */\n url?: string;\n}\n\nexport interface TaskCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof taskCardVariants> {\n /** The task to render. */\n item: TaskItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row is activated (click / Enter / Space). */\n onActivate?: (item: TaskItem) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start ds:group',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function isSafeTaskUrl(url: string): boolean {\n return /^(https?:\\/\\/(?!\\/)|\\/(?!\\/)|#)/.test(url);\n}\n\nfunction StatusIcon({ status, priority }: { status?: TaskStatus; priority?: TaskPriority }): ReactNode {\n const tone =\n priority === 'high'\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]';\n if (status === 'done') {\n return <CheckSquare aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n if (priority === 'high') {\n return <AlertCircle aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n return <Square aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskCard = forwardRef<HTMLDivElement, TaskCardProps>(\n ({ item, size = 'sm', onActivate, className, ...rest }, ref) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeTaskUrl(item.url);\n const ariaLabel = t('ui.taskCard.itemLabel', {\n title: item.title,\n due: item.dueLabel ?? '',\n defaultValue: '{{title}}{{due, prepend, \" · \"}}',\n });\n\n const titleNode = (\n <span className=\"ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]\">\n {item.title}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey) return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'}\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"task-card\"\n data-status={item.status ?? 'open'}\n data-priority={item.priority ?? 'normal'}\n className={taskCardVariants({ size, interactive, className })}\n {...rest}\n >\n <span className=\"ds:mt-[var(--spacing-2xs)] ds:shrink-0\">\n <StatusIcon status={item.status} priority={item.priority} />\n </span>\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {activator}\n {item.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:truncate\">\n {item.description}\n </span>\n ) : null}\n {item.dueLabel ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {item.dueLabel}\n </span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nTaskCard.displayName = 'TaskCard';\n"],"names":["taskCardVariants","cva","stretchedLinkClass","isSafeTaskUrl","url","StatusIcon","status","priority","tone","CheckSquare","AlertCircle","Square","TaskCard","forwardRef","item","size","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","ariaLabel","titleNode","jsx","activator","e","jsxs","ChevronRight"],"mappings":";;;;;;;;AAoDA,MAAMA,IAAmBC;AAAA,EACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,MAEN,aAAa;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEMC,IAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAMH,SAASC,EAAcC,GAAsB;AAClD,SAAO,kCAAkC,KAAKA,CAAG;AACnD;AAEA,SAASC,EAAW,EAAE,QAAAC,GAAQ,UAAAC,KAAyE;AACrG,QAAMC,IACJD,MAAa,SACT,uCACA;AACN,SAAID,MAAW,2BACLG,GAAA,EAAY,eAAY,QAAO,WAAW,aAAaD,CAAI,IAAI,IAErED,MAAa,2BACPG,GAAA,EAAY,eAAY,QAAO,WAAW,aAAaF,CAAI,IAAI,sBAEjEG,GAAA,EAAO,eAAY,QAAO,WAAW,aAAaH,CAAI,IAAI;AACpE;AAMO,MAAMI,IAAWC;AAAA,EACtB,CAAC,EAAE,MAAAC,GAAM,MAAAC,IAAO,MAAM,YAAAC,GAAY,WAAAC,GAAW,GAAGC,EAAA,GAAQC,MAAQ;AAC9D,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAc,CAAC,CAACN,GAChBO,IAAa,CAAC,CAACT,EAAK,OAAOX,EAAcW,EAAK,GAAG,GACjDU,IAAYJ,EAAE,yBAAyB;AAAA,MAC3C,OAAON,EAAK;AAAA,MACZ,KAAKA,EAAK,YAAY;AAAA,MACtB,cAAc;AAAA,IAAA,CACf,GAEKW,IACJ,gBAAAC,EAAC,QAAA,EAAK,WAAU,mFACb,YAAK,OACR;AAGF,QAAIC;AACJ,WAAIL,KAAeC,IACjBI,IACE,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAMZ,EAAK;AAAA,QACX,cAAYU;AAAA,QACZ,WAAWtB,IAAqB;AAAA,QAChC,SAAS,CAAC0B,MAAM;AACd,UAAIA,EAAE,oBAAoBA,EAAE,WAAWA,EAAE,WAAWA,EAAE,YACtDZ,KAAA,QAAAA,EAAaF;AAAA,QACf;AAAA,QAEC,UAAAW;AAAA,MAAA;AAAA,IAAA,IAGIH,IACTK,IACE,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAYF;AAAA,QACZ,WAAWtB,IAAqB;AAAA,QAChC,SAAS,MAAMc,KAAA,gBAAAA,EAAaF;AAAA,QAE3B,UAAAW;AAAA,MAAA;AAAA,IAAA,IAILE,IAAYF,GAIZ,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAV;AAAA,QACA,MAAK;AAAA,QACL,kBAAe;AAAA,QACf,eAAaL,EAAK,UAAU;AAAA,QAC5B,iBAAeA,EAAK,YAAY;AAAA,QAChC,WAAWd,EAAiB,EAAE,MAAAe,GAAM,aAAAO,GAAa,WAAAL,GAAW;AAAA,QAC3D,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAQ,EAAC,QAAA,EAAK,WAAU,0CACd,UAAA,gBAAAA,EAACrB,GAAA,EAAW,QAAQS,EAAK,QAAQ,UAAUA,EAAK,SAAA,CAAU,GAC5D;AAAA,UAEA,gBAAAe,EAAC,OAAA,EAAI,WAAU,wEACZ,UAAA;AAAA,YAAAF;AAAA,YACAb,EAAK,cACJ,gBAAAY,EAAC,QAAA,EAAK,WAAU,oEACb,UAAAZ,EAAK,aACR,IACE;AAAA,YACHA,EAAK,WACJ,gBAAAY,EAAC,QAAA,EAAK,WAAU,wDACb,UAAAZ,EAAK,UACR,IACE;AAAA,UAAA,GACN;AAAA,UAECQ,IACC,gBAAAI;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA,IAEV;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AAEAlB,EAAS,cAAc;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-tray-BzahI5FQ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-todo.js","../../src/components/task-tray/task-tray.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.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: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.js.map\n","import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ListTodo, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TaskTrayProps\n extends Omit<HTMLAttributes<HTMLElement>, 'onClick'>,\n VariantProps<typeof taskTrayVariants> {\n /** Tasks rendered inside the panel. */\n items: TaskItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Visual density forwarded to each TaskCard. */\n size?: 'sm' | 'md';\n /** Fires when the user activates a task (click / Enter / Space). */\n onOpenTask?: (item: TaskItem) => void;\n /** Fires when the user activates the header \"Add\" affordance. */\n onAddTask?: () => void;\n /** Localised label for the \"Add\" affordance. Defaults to `ui.taskTray.add`. */\n addLabel?: string;\n /** When true the panel renders skeleton placeholders. */\n loading?: boolean;\n /** Render an empty state when `items` is empty and `loading` is false. */\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskTray = forwardRef<HTMLElement, TaskTrayProps>(\n (\n {\n items,\n title,\n size = 'sm',\n onOpenTask,\n onAddTask,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('ui.taskTray.title', 'Tasks');\n const resolvedAddLabel = addLabel ?? t('ui.taskTray.add', 'Add task');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('ui.taskTray.empty.title', 'No tasks yet')}\n description={\n emptyDescription ??\n t('ui.taskTray.empty.description', 'New tasks will appear here.')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col\">\n {items.map((item) => (\n <TaskCard key={item.id} item={item} size={size} onActivate={onOpenTask} />\n ))}\n </ul>\n );\n }\n\n return (\n <section\n ref={ref}\n aria-label={heading}\n data-component=\"task-tray\"\n className={taskTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <ListTodo aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {onAddTask ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddTask}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nTaskTray.displayName = 'TaskTray';\n"],"names":["__iconNode","ListTodo","createLucideIcon","taskTrayVariants","cva","TaskTray","forwardRef","items","title","size","onOpenTask","onAddTask","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","TaskCard","jsxs","IconButton","Plus"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-area-DmKSd2DG.js","sources":["../../src/components/text-area/text-area.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\n\nconst textAreaVariants = cva(\n [\n 'ds:block ds:w-full ds:border ds:rounded-[var(--radius-sm)] ds:bg-background ds:text-foreground',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:focus:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:read-only:bg-muted ds:read-only:cursor-default',\n 'ds:transition-[height,color,background-color,border-color] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:placeholder:text-muted-foreground',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-[calc(var(--min-target-size)*1.5)] ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive',\n },\n resize: {\n auto: 'ds:resize-none',\n manual: 'ds:resize-y',\n },\n },\n defaultVariants: { size: 'md', tone: 'default', resize: 'manual' },\n },\n);\n\nconst counterToneClass = (ratio: number): string => {\n if (ratio >= 1) return 'ds:text-destructive';\n if (ratio >= 0.9) return 'ds:text-warning';\n return 'ds:text-muted-foreground';\n};\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'children' | 'size'\n>;\n\nexport interface TextAreaProps\n extends NativeTextareaProps,\n Pick<VariantProps<typeof textAreaVariants>, 'size' | 'tone'> {\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n autoResize?: boolean;\n minRows?: number;\n maxRows?: number;\n showCounter?: boolean;\n}\n\nconst codePointLength = (value: string): number => [...value].length;\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n size = 'md',\n tone = 'default',\n autoResize = false,\n minRows = 2,\n maxRows,\n showCounter,\n className,\n id,\n disabled,\n value,\n defaultValue,\n maxLength,\n rows,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n onInput,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const textAreaId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone: 'default' | 'error' = ctx.invalid ? 'error' : tone;\n\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const composingRef = useRef(false);\n\n const resizeTextArea = useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoResize) return;\n\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight);\n const paddingTop = parseFloat(styles.paddingTop);\n const paddingBottom = parseFloat(styles.paddingBottom);\n const borderTop = parseFloat(styles.borderTopWidth);\n const borderBottom = parseFloat(styles.borderBottomWidth);\n const verticalChrome =\n paddingTop + paddingBottom + borderTop + borderBottom;\n\n const minH =\n (Number.isFinite(lineHeight) ? lineHeight : 24) * minRows +\n verticalChrome;\n const maxH =\n typeof maxRows === 'number'\n ? (Number.isFinite(lineHeight) ? lineHeight : 24) * maxRows +\n verticalChrome\n : Number.POSITIVE_INFINITY;\n\n // EXCEPTION to constraint #4 (no inline styles): height is computed from\n // runtime scrollHeight and cannot be expressed as a static Tailwind class.\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n }, [autoResize, minRows, maxRows]);\n\n useLayoutEffect(() => {\n if (!autoResize) return;\n resizeTextArea();\n }, [autoResize, resizeTextArea, currentValue]);\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n if (composingRef.current) return;\n onChange?.(event);\n };\n\n const handleCompositionStart = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n const target = event.currentTarget;\n if (!isControlled) {\n setInternalValue(target.value);\n }\n // Synthesise a ChangeEvent from the CompositionEvent so consumers receive\n // a single post-IME change. nativeEvent is still the CompositionEvent, so\n // consumers inspecting `nativeEvent.inputType` will not find the usual\n // \"insertCompositionText\" value — documented as a known limitation.\n onChange?.({\n ...event,\n target,\n currentTarget: target,\n } as unknown as ChangeEvent<HTMLTextAreaElement>);\n if (autoResize) resizeTextArea();\n };\n\n const counterEnabled =\n typeof maxLength === 'number' &&\n (showCounter ?? true) &&\n maxLength > 0;\n\n const current = codePointLength(currentValue);\n const remaining = counterEnabled\n ? Math.max(0, (maxLength as number) - current)\n : 0;\n const ratio = counterEnabled ? current / (maxLength as number) : 0;\n\n const [announced, setAnnounced] = useState<string>('');\n useEffect(() => {\n if (!counterEnabled) return;\n const handle = window.setTimeout(() => {\n if (composingRef.current) return;\n setAnnounced(\n t('ui.inputs.textarea.charactersRemaining', {\n count: remaining,\n defaultValue: '{{count}} characters remaining',\n }),\n );\n }, 500);\n return () => window.clearTimeout(handle);\n }, [counterEnabled, remaining, t]);\n\n const counterId = counterEnabled ? `${textAreaId}-counter` : undefined;\n const describedBy =\n [ctx.describedBy || undefined, counterId].filter(Boolean).join(' ') ||\n undefined;\n\n const resizeVariant: 'auto' | 'manual' = autoResize ? 'auto' : 'manual';\n\n return (\n <div data-component=\"text-area\" className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <textarea\n ref={setRefs}\n id={textAreaId}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n maxLength={maxLength}\n rows={autoResize ? minRows : rows}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n onInput={onInput}\n className={textAreaVariants({\n size,\n tone: effectiveTone,\n resize: resizeVariant,\n className,\n })}\n {...props}\n />\n {counterEnabled ? (\n <div\n id={counterId}\n className=\"ds:flex ds:justify-end type-meta ds:tabular-nums\"\n >\n <span aria-hidden=\"true\" className={counterToneClass(ratio)}>\n {current} / {maxLength}\n </span>\n <span className=\"ds:sr-only\" aria-live=\"polite\">\n {announced}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nTextArea.displayName = 'TextArea';\n"],"names":["textAreaVariants","cva","counterToneClass","ratio","codePointLength","value","TextArea","forwardRef","size","tone","autoResize","minRows","maxRows","showCounter","className","id","disabled","defaultValue","maxLength","rows","onChange","onCompositionStart","onCompositionEnd","onInput","props","ref","t","useTranslation","ctx","useFormField","textAreaId","effectiveDisabled","effectiveTone","innerRef","useRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","composingRef","resizeTextArea","el","styles","lineHeight","paddingTop","paddingBottom","borderTop","borderBottom","verticalChrome","minH","maxH","next","useLayoutEffect","handleChange","event","handleCompositionStart","handleCompositionEnd","target","counterEnabled","current","remaining","announced","setAnnounced","useEffect","handle","counterId","describedBy","resizeVariant","jsxs","jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-input-CRHvl5zk.js","sources":["../../src/components/text-input/text-input.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type InputHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\nimport {\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\n\nconst wrapperVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:w-full',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid',\n 'ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-within:outline-[CanvasText]',\n 'ds:has-[:disabled]:cursor-not-allowed',\n ].join(' '),\n);\n\nconst inputVariants = cva(\n [\n 'ds:w-full ds:rounded-[var(--radius-sm)] ds:border ds:bg-background ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:read-only:bg-muted ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_TEXT.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_TEXT.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_TEXT.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n hasStart: {\n true: 'ds:ps-10',\n false: '',\n },\n hasEnd: {\n true: 'ds:pe-10',\n false: '',\n },\n },\n compoundVariants: [\n { size: 'sm', hasStart: false, class: 'ds:ps-3' },\n { size: 'md', hasStart: false, class: 'ds:ps-3' },\n { size: 'lg', hasStart: false, class: 'ds:ps-4' },\n { size: 'sm', hasEnd: false, class: 'ds:pe-3' },\n { size: 'md', hasEnd: false, class: 'ds:pe-3' },\n { size: 'lg', hasEnd: false, class: 'ds:pe-4' },\n ],\n defaultVariants: {\n size: 'md',\n tone: 'default',\n hasStart: false,\n hasEnd: false,\n },\n },\n);\n\nconst adornmentBase =\n 'ds:absolute ds:inset-y-0 ds:flex ds:items-center ds:pointer-events-none ds:text-muted-foreground';\n\nexport interface TextInputProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'onChange' | 'onCompositionStart' | 'onCompositionEnd'\n >,\n Pick<VariantProps<typeof inputVariants>, 'size' | 'tone'> {\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n startAdornment?: ReactNode;\n endAdornment?: ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n onCompositionStart?: (event: CompositionEvent<HTMLInputElement>) => void;\n onCompositionEnd?: (event: CompositionEvent<HTMLInputElement>) => void;\n}\n\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n size = 'md',\n tone = 'default',\n startAdornment,\n endAdornment,\n clearable = false,\n onClear,\n className,\n id,\n disabled,\n value,\n defaultValue,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inputId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : tone;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n const hasValue = currentValue.length > 0;\n\n const composingRef = useRef(false);\n const [composingState, setComposingState] = useState(false);\n\n const innerRef = useRef<HTMLInputElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const hasStart = Boolean(startAdornment);\n const showClear = clearable && hasValue && !effectiveDisabled && !props.readOnly;\n const hasEnd = Boolean(endAdornment) || showClear;\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n if (composingRef.current) return;\n onChange?.(event);\n };\n\n const handleCompositionStart = (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = true;\n setComposingState(true);\n onCompositionStart?.(event);\n };\n\n const handleCompositionEnd = (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = false;\n setComposingState(false);\n onCompositionEnd?.(event);\n const target = event.currentTarget;\n if (!isControlled) {\n setInternalValue(target.value);\n }\n // Synthesise a ChangeEvent from the CompositionEvent so consumers receive\n // a single post-IME change. nativeEvent is still the CompositionEvent, so\n // consumers inspecting `nativeEvent.inputType` will not find the usual\n // \"insertCompositionText\" value — documented as a known limitation.\n onChange?.({\n ...event,\n target,\n currentTarget: target,\n } as unknown as ChangeEvent<HTMLInputElement>);\n };\n\n const handleClear = () => {\n if (!isControlled) {\n setInternalValue('');\n }\n const node = innerRef.current;\n if (node && onChange) {\n // Drive the DOM value to '' via the prototype setter so downstream\n // reads of event.target.value see the cleared value, then forward a\n // synthesised ChangeEvent to consumers (form libraries drive state\n // from onChange, not onClear).\n const prototype = Object.getPrototypeOf(node) as HTMLInputElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, '');\n onChange({\n target: node,\n currentTarget: node,\n bubbles: true,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n preventDefault: () => {},\n stopPropagation: () => {},\n isDefaultPrevented: () => false,\n isPropagationStopped: () => false,\n persist: () => {},\n } as unknown as ChangeEvent<HTMLInputElement>);\n }\n onClear?.();\n node?.focus();\n };\n\n const handleWrapperClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === innerRef.current) return;\n if ((event.target as HTMLElement).closest('button')) return;\n innerRef.current?.focus();\n };\n\n return (\n <div\n className={wrapperVariants()}\n onClick={handleWrapperClick}\n data-component=\"text-input\"\n data-composing={composingState ? 'true' : undefined}\n >\n {startAdornment ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentBase} ds:start-0 ds:ps-3 ds:[&_svg]:size-4`}\n >\n {startAdornment}\n </span>\n ) : null}\n <input\n ref={setRefs}\n id={inputId}\n type=\"text\"\n value={currentValue}\n disabled={effectiveDisabled}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={inputVariants({\n size,\n tone: effectiveTone,\n hasStart,\n hasEnd,\n className,\n })}\n {...props}\n />\n {showClear ? (\n <button\n type=\"button\"\n aria-label={t('ui.inputs.text.clear', 'Clear input')}\n onClick={handleClear}\n className=\"ds:absolute ds:inset-y-0 ds:end-0 ds:pe-3 ds:flex ds:items-center ds:pointer-events-auto ds:text-muted-foreground ds:hover:text-foreground ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : endAdornment ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentBase} ds:end-0 ds:pe-3 ds:[&_svg]:size-4`}\n >\n {endAdornment}\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nTextInput.displayName = 'TextInput';\n"],"names":["wrapperVariants","cva","inputVariants","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","adornmentBase","TextInput","forwardRef","size","tone","startAdornment","endAdornment","clearable","onClear","className","id","disabled","value","defaultValue","onChange","onCompositionStart","onCompositionEnd","props","ref","t","useTranslation","ctx","useFormField","inputId","effectiveDisabled","effectiveTone","isControlled","internalValue","setInternalValue","useState","currentValue","hasValue","composingRef","useRef","composingState","setComposingState","innerRef","setRefs","useCallback","node","hasStart","showClear","hasEnd","handleChange","event","handleCompositionStart","handleCompositionEnd","target","handleClear","prototype","setter","_a","handleWrapperClick","jsxs","jsx","X"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-root-DDb0TJjd.js","sources":["../../src/components/theme-root/theme-root.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* ThemeRoot — declarative wrapper that activates a DS theme. */\n/* */\n/* DS themes are composed from two orthogonal axes (see 04-theming.mdx): */\n/* base: `theme-light` | `theme-dark` */\n/* modifier: `theme-accessible` (AAA contrast, larger target size, */\n/* 0ms animations, 18px base font) */\n/* */\n/* `<ThemeRoot>` owns the class combination so consuming apps don't */\n/* hand-assemble it (and get it wrong under `accessible + dark`, where */\n/* the selector is `.theme-dark.theme-accessible`, not a separate class).*/\n/* */\n/* Rendered as a `<div>` by default. Pass `asChild` to merge the theme */\n/* classes onto a caller-supplied element via Radix `<Slot>` — preserves */\n/* the child's props and correctly forwards refs. Used when the theme */\n/* root is <html> or <body> in a server-rendered layout. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, type HTMLAttributes } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nexport type ThemeBase = 'light' | 'dark';\n\nexport interface ThemeRootProps extends HTMLAttributes<HTMLDivElement> {\n /** Which colour-scheme base to activate. Default: `light`. */\n theme?: ThemeBase;\n /** Layer the AAA `theme-accessible` modifier on top of the base. */\n accessible?: boolean;\n /**\n * When true, merges the theme classes onto the single child element\n * instead of rendering a wrapping `<div>`. Useful when the theme root\n * is `<html>` or `<body>` in an app shell. Refs forward to the child.\n */\n asChild?: boolean;\n}\n\nfunction composeClassName(\n theme: ThemeBase,\n accessible: boolean,\n extra?: string,\n): string {\n const parts = [theme === 'dark' ? 'theme-dark' : 'theme-light'];\n if (accessible) parts.push('theme-accessible');\n if (extra) parts.push(extra);\n return parts.join(' ');\n}\n\nexport const ThemeRoot = forwardRef<HTMLDivElement, ThemeRootProps>(\n (\n { theme = 'light', accessible = false, asChild = false, className, children, ...rest },\n ref,\n ) => {\n const merged = composeClassName(theme, accessible, className);\n const Comp = asChild ? Slot : 'div';\n return (\n <Comp ref={ref} className={merged} data-component=\"theme-root\" {...rest}>\n {children}\n </Comp>\n );\n },\n);\nThemeRoot.displayName = 'ThemeRoot';\n"],"names":["composeClassName","theme","accessible","extra","parts","ThemeRoot","forwardRef","asChild","className","children","rest","ref","merged","jsx","Slot"],"mappings":";;;AAoCA,SAASA,EACPC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAQ,CAACH,MAAU,SAAS,eAAe,aAAa;AAC9D,SAAIC,KAAYE,EAAM,KAAK,kBAAkB,GACzCD,KAAOC,EAAM,KAAKD,CAAK,GACpBC,EAAM,KAAK,GAAG;AACvB;AAEO,MAAMC,IAAYC;AAAA,EACvB,CACE,EAAE,OAAAL,IAAQ,SAAS,YAAAC,IAAa,IAAO,SAAAK,IAAU,IAAO,WAAAC,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAChFC,MACG;AACH,UAAMC,IAASZ,EAAiBC,GAAOC,GAAYM,CAAS;AAE5D,WACE,gBAAAK,EAFWN,IAAUO,IAAO,SAEtB,KAAAH,GAAU,WAAWC,GAAQ,kBAAe,cAAc,GAAGF,GAChE,UAAAD,EAAA,CACH;AAAA,EAEJ;AACF;AACAJ,EAAU,cAAc;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-toggle-COHFwO2H.js","sources":["../../node_modules/lucide-react/dist/esm/icons/monitor.js","../../node_modules/lucide-react/dist/esm/icons/moon.js","../../node_modules/lucide-react/dist/esm/icons/sun.js","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.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: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n];\nconst Monitor = createLucideIcon(\"monitor\", __iconNode);\n\nexport { __iconNode, Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v1.8.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: \"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\",\n key: \"kfwtm\"\n }\n ]\n];\nconst Moon = createLucideIcon(\"moon\", __iconNode);\n\nexport { __iconNode, Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v1.8.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n];\nconst Sun = createLucideIcon(\"sun\", __iconNode);\n\nexport { __iconNode, Sun as default };\n//# sourceMappingURL=sun.js.map\n","import {\n forwardRef,\n useCallback,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('ui.navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) =>\n onValueChange(next ? 'accessible' : 'default')\n }\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' || state.resolvedTheme === 'dark-accessible'\n ? <Moon aria-hidden />\n : <Sun aria-hidden />;\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('ui.navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('ui.navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) =>\n state.setTheme(next as ThemePreference)\n }\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('ui.navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('ui.navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('ui.navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props;\n\n const state = useResolvedTheme(props);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={ref}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={ref}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={ref}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["__iconNode","Monitor","createLucideIcon","Moon","Sun","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","_theme","_accessibility","_onThemeChange","_onAccessibilityChange"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"time-picker-D-EueWUG.js","sources":["../../src/components/time-picker/time-picker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type FocusEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport type { TimeValue } from '../_shared/time';\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\n/** Detect 12h vs 24h from the browser locale. */\nfunction detectHour12(locale: string): boolean {\n try {\n const resolved = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n }).resolvedOptions();\n return resolved.hourCycle === 'h12' || resolved.hourCycle === 'h11';\n } catch {\n return false;\n }\n}\n\n/** Get localised AM/PM labels via Intl. */\nfunction getLocalePeriodLabels(locale: string): { am: string; pm: string } {\n try {\n const am = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n hour12: true,\n })\n .formatToParts(new Date(2000, 0, 1, 9))\n .find((p) => p.type === 'dayPeriod')?.value ?? 'AM';\n\n const pm = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n hour12: true,\n })\n .formatToParts(new Date(2000, 0, 1, 15))\n .find((p) => p.type === 'dayPeriod')?.value ?? 'PM';\n\n return { am, pm };\n } catch {\n return { am: 'AM', pm: 'PM' };\n }\n}\n\n/** Clamp a number between min and max. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Round to nearest step. */\nfunction roundToStep(value: number, step: number): number {\n return Math.round(value / step) * step;\n}\n\n/** Convert 24h hour to 12h display hour. */\nfunction to12Hour(h24: number): number {\n if (h24 === 0) return 12;\n if (h24 > 12) return h24 - 12;\n return h24;\n}\n\n/** Convert 12h display hour + period to 24h hour. */\nfunction to24Hour(h12: number, isPM: boolean): number {\n if (isPM) return h12 === 12 ? 12 : h12 + 12;\n return h12 === 12 ? 0 : h12;\n}\n\n/* -------------------------------------------------------------------------- */\n/* CVA variants */\n/* -------------------------------------------------------------------------- */\n\nconst wrapperVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid',\n 'ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-within:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-[var(--min-target-size)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive',\n },\n isDisabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n isDisabled: false,\n },\n },\n);\n\nconst segmentVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)] ds:text-center ds:tabular-nums',\n 'ds:bg-transparent ds:text-foreground',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:select-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-w-6 ds:h-6 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-w-8 ds:h-8 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-w-10 ds:h-10 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst periodButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)] ds:text-center',\n 'ds:bg-transparent ds:text-foreground ds:cursor-pointer',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:select-none',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-w-8 ds:h-6 ds:text-[length:var(--font-size-sm)] ds:ps-1 ds:pe-1',\n md: 'ds:min-w-10 ds:h-8 ds:text-[length:var(--font-size-base)] ds:ps-1.5 ds:pe-1.5',\n lg: 'ds:min-w-12 ds:h-10 ds:text-[length:var(--font-size-lg)] ds:ps-2 ds:pe-2',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst separatorVariants = cva('ds:text-muted-foreground ds:select-none', {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\ntype MinuteStep = 1 | 5 | 10 | 15 | 30;\n\nexport interface TimePickerProps\n extends Pick<VariantProps<typeof wrapperVariants>, 'size'> {\n /** Current value — controlled. */\n value?: TimeValue;\n /** Default value — uncontrolled. */\n defaultValue?: TimeValue;\n /** Called when the value changes. */\n onChange?: (value: TimeValue) => void;\n /** Force 12h/24h mode. Defaults to locale detection. */\n hour12?: boolean;\n /** Minute increment step. */\n minuteStep?: MinuteStep;\n /** Use full-width colon separator for CJK apps. */\n fullWidthSeparator?: boolean;\n /** Custom AM/PM labels. */\n periodLabels?: { am: string; pm: string };\n /** Component size. */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the input is disabled. */\n disabled?: boolean;\n /** Additional class names. */\n className?: string;\n /** id override. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n hour12: hour12Prop,\n minuteStep = 1,\n fullWidthSeparator = false,\n periodLabels: periodLabelsProp,\n size = 'md',\n disabled,\n className,\n id,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const effectiveId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : 'default';\n\n const isHour12 =\n hour12Prop !== undefined ? hour12Prop : detectHour12(i18n.language);\n const localePeriods = getLocalePeriodLabels(i18n.language);\n const periods = periodLabelsProp ?? localePeriods;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<TimeValue>(\n value ?? defaultValue ?? { hours: 0, minutes: 0 },\n );\n const currentValue: TimeValue = isControlled ? value : internalValue;\n\n const emit = useCallback(\n (next: TimeValue) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n // Segment refs\n const hourRef = useRef<HTMLSpanElement>(null);\n const minuteRef = useRef<HTMLSpanElement>(null);\n const periodRef = useRef<HTMLSpanElement>(null);\n\n // Typing buffer for each segment\n const [hourBuffer, setHourBuffer] = useState('');\n const [minuteBuffer, setMinuteBuffer] = useState('');\n const hourTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const minuteTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Clear buffers on blur\n const clearHourBuffer = useCallback(() => {\n setHourBuffer('');\n if (hourTimerRef.current) {\n clearTimeout(hourTimerRef.current);\n hourTimerRef.current = null;\n }\n }, []);\n\n const clearMinuteBuffer = useCallback(() => {\n setMinuteBuffer('');\n if (minuteTimerRef.current) {\n clearTimeout(minuteTimerRef.current);\n minuteTimerRef.current = null;\n }\n }, []);\n\n // Cleanup timers\n useEffect(() => {\n return () => {\n if (hourTimerRef.current) clearTimeout(hourTimerRef.current);\n if (minuteTimerRef.current) clearTimeout(minuteTimerRef.current);\n };\n }, []);\n\n const separator = fullWidthSeparator ? '\\uFF1A' : ':';\n\n // Display values\n const displayHour = isHour12\n ? String(to12Hour(currentValue.hours)).padStart(2, '0')\n : String(currentValue.hours).padStart(2, '0');\n const displayMinute = String(currentValue.minutes).padStart(2, '0');\n const isPM = currentValue.hours >= 12;\n\n // Hour segment keyboard handler\n const handleHourKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const maxH = 23;\n let newH = currentValue.hours + delta;\n if (newH < 0) newH = maxH;\n if (newH > maxH) newH = 0;\n emit({ ...currentValue, hours: newH });\n clearHourBuffer();\n return;\n }\n\n if (e.key === 'Tab' && !e.shiftKey) {\n e.preventDefault();\n minuteRef.current?.focus();\n clearHourBuffer();\n return;\n }\n\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const next = hourBuffer + e.key;\n setHourBuffer(next);\n\n if (hourTimerRef.current) clearTimeout(hourTimerRef.current);\n\n const num = parseInt(next, 10);\n const maxH = isHour12 ? 12 : 23;\n\n if (next.length >= 2) {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n minuteRef.current?.focus();\n } else {\n // If first digit makes it impossible to form a valid 2-digit number, commit now\n if (num > (isHour12 ? 1 : 2)) {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n minuteRef.current?.focus();\n } else {\n hourTimerRef.current = setTimeout(() => {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n }, 1000);\n }\n }\n }\n };\n\n // Minute segment keyboard handler\n const handleMinuteKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? minuteStep : -minuteStep;\n let newM = currentValue.minutes + delta;\n if (newM < 0) newM = 60 + newM;\n if (newM >= 60) newM = newM - 60;\n emit({ ...currentValue, minutes: newM });\n clearMinuteBuffer();\n return;\n }\n\n if (e.key === 'Tab' && !e.shiftKey && isHour12) {\n e.preventDefault();\n periodRef.current?.focus();\n clearMinuteBuffer();\n return;\n }\n\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n hourRef.current?.focus();\n clearMinuteBuffer();\n return;\n }\n\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const next = minuteBuffer + e.key;\n setMinuteBuffer(next);\n\n if (minuteTimerRef.current) clearTimeout(minuteTimerRef.current);\n\n const num = parseInt(next, 10);\n\n if (next.length >= 2) {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n if (isHour12) {\n periodRef.current?.focus();\n }\n } else {\n if (num > 5) {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n if (isHour12) {\n periodRef.current?.focus();\n }\n } else {\n minuteTimerRef.current = setTimeout(() => {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n }, 1000);\n }\n }\n }\n };\n\n // Period toggle handler\n const handlePeriodKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const newH = isPM\n ? currentValue.hours - 12\n : currentValue.hours + 12;\n emit({ ...currentValue, hours: clamp(newH, 0, 23) });\n return;\n }\n\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n minuteRef.current?.focus();\n return;\n }\n\n // a/p keys toggle AM/PM\n if (e.key === 'a' || e.key === 'A') {\n e.preventDefault();\n if (isPM) {\n emit({ ...currentValue, hours: currentValue.hours - 12 });\n }\n }\n if (e.key === 'p' || e.key === 'P') {\n e.preventDefault();\n if (!isPM) {\n emit({ ...currentValue, hours: currentValue.hours + 12 });\n }\n }\n };\n\n const handleHourBlur = (_e: FocusEvent) => {\n clearHourBuffer();\n };\n\n const handleMinuteBlur = () => {\n clearMinuteBuffer();\n // Round to step on blur\n const rounded = roundToStep(currentValue.minutes, minuteStep);\n if (rounded !== currentValue.minutes) {\n emit({ ...currentValue, minutes: rounded });\n }\n // Prevent blur from propagating if moving within the component\n };\n\n const hourLabel = t('ui.inputs.timePicker.hour', 'Hour');\n const minuteLabel = t('ui.inputs.timePicker.minute', 'Minute');\n const periodLabel = t('ui.inputs.timePicker.period', 'Period');\n const groupLabel = t('ui.inputs.timePicker.groupLabel', 'Time');\n\n return (\n <div\n ref={ref}\n id={effectiveId}\n role=\"group\"\n aria-label={groupLabel}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n // `aria-required` is not valid on `role=\"group\"` per ARIA 1.2 — the\n // FormField label's visible asterisk + `aria-describedby` link\n // communicate the required state instead.\n aria-disabled={effectiveDisabled || undefined}\n data-component=\"time-picker\"\n className={wrapperVariants({\n size,\n tone: effectiveTone,\n isDisabled: effectiveDisabled ?? false,\n className,\n })}\n >\n {/* Hour segment */}\n <span\n ref={hourRef}\n role=\"spinbutton\"\n aria-label={hourLabel}\n aria-valuemin={isHour12 ? 1 : 0}\n aria-valuemax={isHour12 ? 12 : 23}\n aria-valuenow={isHour12 ? to12Hour(currentValue.hours) : currentValue.hours}\n aria-valuetext={displayHour}\n tabIndex={effectiveDisabled ? -1 : 0}\n inputMode=\"numeric\"\n onKeyDown={handleHourKeyDown}\n onBlur={handleHourBlur}\n className={segmentVariants({ size })}\n >\n {displayHour}\n </span>\n\n {/* Separator */}\n <span aria-hidden=\"true\" className={separatorVariants({ size })}>\n {separator}\n </span>\n\n {/* Minute segment */}\n <span\n ref={minuteRef}\n role=\"spinbutton\"\n aria-label={minuteLabel}\n aria-valuemin={0}\n aria-valuemax={59}\n aria-valuenow={currentValue.minutes}\n aria-valuetext={displayMinute}\n tabIndex={effectiveDisabled ? -1 : 0}\n inputMode=\"numeric\"\n onKeyDown={handleMinuteKeyDown}\n onBlur={handleMinuteBlur}\n className={segmentVariants({ size })}\n >\n {displayMinute}\n </span>\n\n {/* AM/PM toggle (12h mode only) */}\n {isHour12 ? (\n <span\n ref={periodRef}\n role=\"spinbutton\"\n aria-label={periodLabel}\n aria-valuemin={0}\n aria-valuemax={1}\n aria-valuenow={isPM ? 1 : 0}\n aria-valuetext={isPM ? periods.pm : periods.am}\n tabIndex={effectiveDisabled ? -1 : 0}\n onKeyDown={handlePeriodKeyDown}\n className={periodButtonVariants({ size })}\n >\n {isPM ? periods.pm : periods.am}\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nTimePicker.displayName = 'TimePicker';\n"],"names":["detectHour12","locale","resolved","getLocalePeriodLabels","am","_a","p","pm","_b","clamp","value","min","max","roundToStep","step","to12Hour","h24","to24Hour","h12","isPM","wrapperVariants","cva","segmentVariants","periodButtonVariants","separatorVariants","TimePicker","forwardRef","defaultValue","onChange","hour12Prop","minuteStep","fullWidthSeparator","periodLabelsProp","size","disabled","className","id","ref","t","i18n","useTranslation","ctx","useFormField","effectiveId","effectiveDisabled","effectiveTone","isHour12","localePeriods","periods","isControlled","internalValue","setInternalValue","useState","currentValue","emit","useCallback","next","hourRef","useRef","minuteRef","periodRef","hourBuffer","setHourBuffer","minuteBuffer","setMinuteBuffer","hourTimerRef","minuteTimerRef","clearHourBuffer","clearMinuteBuffer","useEffect","separator","displayHour","displayMinute","handleHourKeyDown","delta","maxH","newH","num","clamped","_c","handleMinuteKeyDown","newM","rounded","_d","handlePeriodKeyDown","handleHourBlur","_e","handleMinuteBlur","hourLabel","minuteLabel","periodLabel","groupLabel","jsxs","jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline-RgAIzpMd.js","sources":["../../src/components/timeline/timeline.tsx"],"sourcesContent":["import { createContext, forwardRef, useContext, useMemo, type HTMLAttributes, type LiHTMLAttributes, type OlHTMLAttributes, type ReactNode, type TimeHTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertTriangle, Check, Circle, Info, X } from 'lucide-react';\nimport { Avatar } from '../avatar';\nimport { Card } from '../card';\nimport { Timestamp } from '../timestamp';\n\n// TODO: optional @tanstack/react-virtual integration for 500+ events\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ntype EventType = 'info' | 'success' | 'warning' | 'error' | 'neutral';\ntype Layout = 'rail-start' | 'rail-end' | 'alternating';\n\ninterface TimelineContextValue {\n layout: Layout;\n order: 'newest-first' | 'oldest-first';\n}\n\nconst TimelineContext = createContext<TimelineContextValue>({\n layout: 'rail-start',\n order: 'newest-first',\n});\n\ninterface TimelineEventContextValue {\n type: EventType;\n}\n\nconst TimelineEventContext = createContext<TimelineEventContextValue>({\n type: 'neutral',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — root */\n/* ------------------------------------------------------------------ */\n\nconst timelineVariants = cva('ds:flex ds:flex-col', {\n variants: {\n layout: {\n 'rail-start': 'ds:ps-4',\n 'rail-end': 'ds:pe-4',\n 'alternating': 'ds:grid ds:grid-cols-[1fr_2rem_1fr] ds:gap-x-[var(--spacing-md)]',\n },\n order: {\n 'newest-first': 'ds:flex-col',\n 'oldest-first': 'ds:flex-col-reverse',\n },\n },\n defaultVariants: { layout: 'rail-start', order: 'newest-first' },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — event item */\n/* ------------------------------------------------------------------ */\n\nconst eventVariants = cva(\n 'ds:relative ds:flex ds:gap-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n {\n variants: {\n layout: {\n 'rail-start': [\n 'ds:flex-row',\n // Rail: continuous border on the inline-start of the event list\n 'ds:before:absolute ds:before:top-8 ds:before:bottom-0',\n 'ds:before:border-inline-start-[2px] ds:before:border-[color:var(--border)]',\n 'ds:before:inset-inline-start-[-1rem]',\n 'ds:last:before:hidden',\n ].join(' '),\n 'rail-end': [\n 'ds:flex-row-reverse',\n 'ds:before:absolute ds:before:top-8 ds:before:bottom-0',\n 'ds:before:border-inline-end-[2px] ds:before:border-[color:var(--border)]',\n 'ds:before:inset-inline-end-[-1rem]',\n 'ds:last:before:hidden',\n ].join(' '),\n 'alternating': 'ds:contents',\n },\n },\n defaultVariants: { layout: 'rail-start' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — dot */\n/* ------------------------------------------------------------------ */\n\nconst dotVariants = cva(\n [\n 'ds:relative ds:z-10 ds:flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:shrink-0',\n 'ds:size-8',\n 'ds:ring-2 ds:ring-[var(--background)]',\n ].join(' '),\n {\n variants: {\n type: {\n info: 'ds:bg-[var(--info)] ds:text-[var(--info-solid-foreground)]',\n success: 'ds:bg-[var(--success)] ds:text-[var(--success-solid-foreground)]',\n warning: 'ds:bg-[var(--warning)] ds:text-[var(--warning-solid-foreground)]',\n error: 'ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n neutral: 'ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: { type: 'neutral' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface TimelineProps\n extends Omit<OlHTMLAttributes<HTMLOListElement>, 'color'>,\n VariantProps<typeof timelineVariants> {\n layout?: Layout;\n order?: 'newest-first' | 'oldest-first';\n children: ReactNode;\n className?: string;\n}\n\nexport interface TimelineEventProps\n extends LiHTMLAttributes<HTMLLIElement> {\n type?: EventType;\n children: ReactNode;\n className?: string;\n}\n\nexport interface TimelineDotProps\n extends HTMLAttributes<HTMLDivElement> {\n icon?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineContentProps\n extends HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: string;\n actor?: { name: string; src?: string };\n children?: ReactNode;\n className?: string;\n}\n\nexport interface TimelineTimestampProps\n extends TimeHTMLAttributes<HTMLTimeElement> {\n date: Date | string;\n relative?: boolean;\n format?: Intl.DateTimeFormatOptions;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Default icons per type */\n/* ------------------------------------------------------------------ */\n\nconst TYPE_ICONS: Record<EventType, ReactNode> = {\n info: <Info size={16} aria-hidden=\"true\" />,\n success: <Check size={16} aria-hidden=\"true\" />,\n warning: <AlertTriangle size={16} aria-hidden=\"true\" />,\n error: <X size={16} aria-hidden=\"true\" />,\n neutral: <Circle size={16} aria-hidden=\"true\" />,\n};\n\n/* ------------------------------------------------------------------ */\n/* Timeline root */\n/* ------------------------------------------------------------------ */\n\nconst TimelineRoot = forwardRef<HTMLOListElement, TimelineProps>(\n (\n {\n layout = 'rail-start',\n order = 'newest-first',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const ctx = useMemo(() => ({ layout, order }), [layout, order]);\n\n return (\n <TimelineContext.Provider value={ctx}>\n <ol\n ref={ref}\n data-component=\"timeline\"\n className={timelineVariants({ layout, order, className })}\n {...props}\n >\n {children}\n </ol>\n </TimelineContext.Provider>\n );\n },\n);\nTimelineRoot.displayName = 'Timeline';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Event */\n/* ------------------------------------------------------------------ */\n\nconst TimelineEvent = forwardRef<HTMLLIElement, TimelineEventProps>(\n ({ type = 'neutral', className, children, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n const { t } = useTranslation();\n\n const evtCtx = useMemo(() => ({ type }), [type]);\n\n if (layout === 'alternating') {\n // In alternating layout the <li> uses `contents` so its children\n // participate directly in the parent grid.\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n className={['ds:contents', className].filter(Boolean).join(' ')}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`ui.timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n }\n\n return (\n <TimelineEventContext.Provider value={evtCtx}>\n <li\n ref={ref}\n className={eventVariants({ layout, className })}\n {...props}\n >\n {/* Visually-hidden type prefix for screen readers */}\n <span className=\"ds:sr-only\">{t(`ui.timeline.type.${type}`)}</span>\n {children}\n </li>\n </TimelineEventContext.Provider>\n );\n },\n);\nTimelineEvent.displayName = 'Timeline.Event';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Dot */\n/* ------------------------------------------------------------------ */\n\nconst TimelineDot = forwardRef<HTMLDivElement, TimelineDotProps>(\n ({ icon, className, ...props }, ref) => {\n const { type } = useContext(TimelineEventContext);\n const { layout } = useContext(TimelineContext);\n\n const dot = (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={dotVariants({ type, className })}\n {...props}\n >\n {icon ?? TYPE_ICONS[type]}\n </div>\n );\n\n if (layout === 'alternating') {\n // In alternating grid: col 2 (centre) for the dot with the rail line\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:col-start-2 ds:flex ds:flex-col ds:items-center\"\n >\n {/* Rail segment above the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)] ds:first:hidden\" />\n {dot}\n {/* Rail segment below the dot */}\n <div className=\"ds:w-[var(--border-width-md)] ds:flex-1 ds:bg-[var(--border)]\" />\n </div>\n );\n }\n\n return dot;\n },\n);\nTimelineDot.displayName = 'Timeline.Dot';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Content */\n/* ------------------------------------------------------------------ */\n\nconst TimelineContent = forwardRef<HTMLDivElement, TimelineContentProps>(\n ({ title, description, actor, children, className, ...props }, ref) => {\n const { layout } = useContext(TimelineContext);\n\n const inner = (\n <div\n ref={ref}\n className={[\n 'ds:flex-1 ds:min-w-0 ds:pb-[var(--spacing-md)]',\n 'ds:[&_*]:break-normal ds:[&_*]:[overflow-wrap:anywhere]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <Card variant=\"outlined\">\n <Card.Body>\n <p className=\"type-label ds:text-[var(--foreground)]\">\n {title}\n </p>\n {description && (\n <p className=\"ds:mt-[var(--spacing-xs)] type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </p>\n )}\n {actor && (\n <div className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Avatar size=\"xs\" name={actor.name} src={actor.src} />\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {actor.name}\n </span>\n </div>\n )}\n {children}\n </Card.Body>\n </Card>\n </div>\n );\n\n if (layout === 'alternating') {\n // Alternating: odd events in col 1 (start), even events in col 3 (end).\n // We use CSS nth-child targeting via a wrapper that sets col placement.\n return (\n <div className=\"ds:col-span-1 ds:[li:nth-child(even)_&]:col-start-3 ds:[li:nth-child(odd)_&]:col-start-1\">\n {inner}\n </div>\n );\n }\n\n return inner;\n },\n);\nTimelineContent.displayName = 'Timeline.Content';\n\n/* ------------------------------------------------------------------ */\n/* Timeline.Timestamp — thin wrapper over the shared Timestamp */\n/* component. Keeps the existing API (`date`, `relative`, `format`) */\n/* for backward compatibility; adds tabular-nums because timeline */\n/* timestamps sit in a rail gutter and benefit from column-aligned */\n/* digits. */\n/* ------------------------------------------------------------------ */\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\n\nconst TimelineTimestamp = forwardRef<HTMLTimeElement, TimelineTimestampProps>(\n (\n {\n date,\n relative = true,\n format = { dateStyle: 'medium', timeStyle: 'short' },\n className,\n ...props\n },\n ref,\n ) => (\n <Timestamp\n ref={ref}\n value={date}\n format={relative ? 'relative' : 'absolute'}\n relativeWindow={relative ? TWENTY_FOUR_HOURS_MS : undefined}\n absoluteFormat={format}\n className={[\n 'ds:text-[var(--muted-foreground)]',\n 'ds:[font-variant-numeric:var(--font-feature-tabular)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nTimelineTimestamp.displayName = 'Timeline.Timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const Timeline = Object.assign(TimelineRoot, {\n Event: TimelineEvent,\n Dot: TimelineDot,\n Content: TimelineContent,\n Timestamp: TimelineTimestamp,\n});\n\n"],"names":["TimelineContext","createContext","TimelineEventContext","timelineVariants","cva","eventVariants","dotVariants","TYPE_ICONS","jsx","Info","Check","AlertTriangle","X","Circle","TimelineRoot","forwardRef","layout","order","className","children","props","ref","ctx","useMemo","TimelineEvent","type","useContext","t","useTranslation","evtCtx","jsxs","TimelineDot","icon","dot","TimelineContent","title","description","actor","inner","Card","Avatar","TWENTY_FOUR_HOURS_MS","TimelineTimestamp","date","relative","format","Timestamp","Timeline"],"mappings":";;;;;;;;;;;;AAsBA,MAAMA,IAAkBC,EAAoC;AAAA,EAC1D,QAAQ;AAAA,EACR,OAAO;AACT,CAAC,GAMKC,IAAuBD,EAAyC;AAAA,EACpE,MAAM;AACR,CAAC,GAMKE,IAAmBC,EAAI,uBAAuB;AAAA,EAClD,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,aAAe;AAAA,IAAA;AAAA,IAEjB,OAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,iBAAiB,EAAE,QAAQ,cAAc,OAAO,eAAA;AAClD,CAAC,GAMKC,IAAgBD;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,cAAc;AAAA,UACZ;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,aAAe;AAAA,MAAA;AAAA,IACjB;AAAA,IAEF,iBAAiB,EAAE,QAAQ,aAAA;AAAA,EAAa;AAE5C,GAMME,IAAcF;AAAA,EAClB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,MAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB,EAAE,MAAM,UAAA;AAAA,EAAU;AAEvC,GAiDMG,IAA2C;AAAA,EAC/C,MAAS,gBAAAC,EAACC,GAAA,EAAQ,MAAM,IAAI,eAAY,QAAO;AAAA,EAC/C,SAAS,gBAAAD,EAACE,GAAA,EAAQ,MAAM,IAAI,eAAY,QAAO;AAAA,EAC/C,SAAS,gBAAAF,EAACG,GAAA,EAAc,MAAM,IAAI,eAAY,QAAO;AAAA,EACrD,OAAS,gBAAAH,EAACI,GAAA,EAAQ,MAAM,IAAI,eAAY,QAAO;AAAA,EAC/C,SAAS,gBAAAJ,EAACK,GAAA,EAAQ,MAAM,IAAI,eAAY,OAAA,CAAO;AACjD,GAMMC,IAAeC;AAAA,EACnB,CACE;AAAA,IACE,QAAAC,IAAS;AAAA,IACT,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAMC,EAAQ,OAAO,EAAE,QAAAP,GAAQ,OAAAC,MAAU,CAACD,GAAQC,CAAK,CAAC;AAE9D,WACE,gBAAAT,EAACR,EAAgB,UAAhB,EAAyB,OAAOsB,GAC/B,UAAA,gBAAAd;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAa;AAAA,QACA,kBAAe;AAAA,QACf,WAAWlB,EAAiB,EAAE,QAAAa,GAAQ,OAAAC,GAAO,WAAAC,GAAW;AAAA,QACvD,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AACAL,EAAa,cAAc;AAM3B,MAAMU,IAAgBT;AAAA,EACpB,CAAC,EAAE,MAAAU,IAAO,WAAW,WAAAP,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AAC5D,UAAM,EAAE,QAAAL,EAAA,IAAWU,EAAW1B,CAAe,GACvC,EAAE,GAAA2B,EAAA,IAAMC,EAAA,GAERC,IAASN,EAAQ,OAAO,EAAE,MAAAE,MAAS,CAACA,CAAI,CAAC;AAE/C,WAAIT,MAAW,gBAIX,gBAAAR,EAACN,EAAqB,UAArB,EAA8B,OAAO2B,GACpC,UAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAT;AAAA,QACA,WAAW,CAAC,eAAeH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC7D,GAAGE;AAAA,QAGJ,UAAA;AAAA,UAAA,gBAAAZ,EAAC,UAAK,WAAU,cAAc,YAAE,oBAAoBiB,CAAI,EAAE,EAAA,CAAE;AAAA,UAC3DN;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEL,IAKF,gBAAAX,EAACN,EAAqB,UAArB,EAA8B,OAAO2B,GACpC,UAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAT;AAAA,QACA,WAAWhB,EAAc,EAAE,QAAAW,GAAQ,WAAAE,GAAW;AAAA,QAC7C,GAAGE;AAAA,QAGJ,UAAA;AAAA,UAAA,gBAAAZ,EAAC,UAAK,WAAU,cAAc,YAAE,oBAAoBiB,CAAI,EAAE,EAAA,CAAE;AAAA,UAC3DN;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AACAK,EAAc,cAAc;AAM5B,MAAMO,IAAchB;AAAA,EAClB,CAAC,EAAE,MAAAiB,GAAM,WAAAd,GAAW,GAAGE,EAAA,GAASC,MAAQ;AACtC,UAAM,EAAE,MAAAI,EAAA,IAASC,EAAWxB,CAAoB,GAC1C,EAAE,QAAAc,EAAA,IAAWU,EAAW1B,CAAe,GAEvCiC,IACJ,gBAAAzB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAa;AAAA,QACA,eAAY;AAAA,QACZ,WAAWf,EAAY,EAAE,MAAAmB,GAAM,WAAAP,GAAW;AAAA,QACzC,GAAGE;AAAA,QAEH,UAAAY,KAAQzB,EAAWkB,CAAI;AAAA,MAAA;AAAA,IAAA;AAI5B,WAAIT,MAAW,gBAGX,gBAAAc;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAGV,UAAA;AAAA,UAAA,gBAAAtB,EAAC,OAAA,EAAI,WAAU,gFAAA,CAAgF;AAAA,UAC9FyB;AAAA,UAED,gBAAAzB,EAAC,OAAA,EAAI,WAAU,gEAAA,CAAgE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAK9EyB;AAAA,EACT;AACF;AACAF,EAAY,cAAc;AAM1B,MAAMG,IAAkBnB;AAAA,EACtB,CAAC,EAAE,OAAAoB,GAAO,aAAAC,GAAa,OAAAC,GAAO,UAAAlB,GAAU,WAAAD,GAAW,GAAGE,EAAA,GAASC,MAAQ;AACrE,UAAM,EAAE,QAAAL,EAAA,IAAWU,EAAW1B,CAAe,GAEvCsC,IACJ,gBAAA9B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAa;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACAH;AAAA,QAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,QAEJ,4BAACmB,GAAA,EAAK,SAAQ,YACZ,UAAA,gBAAAT,EAACS,EAAK,MAAL,EACC,UAAA;AAAA,UAAA,gBAAA/B,EAAC,KAAA,EAAE,WAAU,0CACV,UAAA2B,GACH;AAAA,UACCC,KACC,gBAAA5B,EAAC,KAAA,EAAE,WAAU,4EACV,UAAA4B,GACH;AAAA,UAEDC,KACC,gBAAAP,EAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,YAAA,gBAAAtB,EAACgC,GAAA,EAAO,MAAK,MAAK,MAAMH,EAAM,MAAM,KAAKA,EAAM,IAAA,CAAK;AAAA,YACpD,gBAAA7B,EAAC,QAAA,EAAK,WAAU,+CACb,YAAM,KAAA,CACT;AAAA,UAAA,GACF;AAAA,UAEDW;AAAA,QAAA,EAAA,CACH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAIJ,WAAIH,MAAW,gBAIX,gBAAAR,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA8B,GACH,IAIGA;AAAA,EACT;AACF;AACAJ,EAAgB,cAAc;AAU9B,MAAMO,IAAuB,OAAU,KAAK,KAEtCC,IAAoB3B;AAAA,EACxB,CACE;AAAA,IACE,MAAA4B;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,QAAAC,IAAS,EAAE,WAAW,UAAU,WAAW,QAAA;AAAA,IAC3C,WAAA3B;AAAA,IACA,GAAGE;AAAA,EAAA,GAELC,MAEA,gBAAAb;AAAA,IAACsC;AAAA,IAAA;AAAA,MACC,KAAAzB;AAAA,MACA,OAAOsB;AAAA,MACP,QAAQC,IAAW,aAAa;AAAA,MAChC,gBAAgBA,IAAWH,IAAuB;AAAA,MAClD,gBAAgBI;AAAA,MAChB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA3B;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAsB,EAAkB,cAAc;AAMzB,MAAMK,IAAW,OAAO,OAAOjC,GAAc;AAAA,EAClD,OAAOU;AAAA,EACP,KAAKO;AAAA,EACL,SAASG;AAAA,EACT,WAAWQ;AACb,CAAC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"timestamp-BV2lC-wV.js","sources":["../../src/components/timestamp/timestamp.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA — chip shape (mirrors the Tag sm/md/lg compact scale so the */\n/* visual vocabulary stays consistent across the chip family). */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:self-start',\n 'ds:rounded-[var(--radius-full)]',\n 'type-eyebrow',\n 'ds:whitespace-nowrap',\n 'ds:bg-muted/20 ds:text-[color:var(--muted-foreground)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-[calc(var(--spacing)*4)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-[calc(var(--spacing)*5)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-[calc(var(--spacing)*6)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n },\n defaultVariants: { size: 'sm' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Relative-time formatter */\n/* */\n/* `Intl.RelativeTimeFormat` is part of the locale-data bundle every */\n/* modern browser ships, no date-fns dependency. Unit selection */\n/* follows the largest-sensible-unit heuristic (< 1 minute → seconds, */\n/* < 1 hour → minutes, …, ≥ 1 year → years). */\n/* ------------------------------------------------------------------ */\n\nconst SECOND_MS = 1000;\nconst MINUTE_MS = 60 * SECOND_MS;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\nconst WEEK_MS = 7 * DAY_MS;\nconst MONTH_MS = 30 * DAY_MS;\nconst YEAR_MS = 365 * DAY_MS;\n\nfunction pickUnit(\n deltaMs: number,\n): [value: number, unit: Intl.RelativeTimeFormatUnit] {\n const abs = Math.abs(deltaMs);\n if (abs < MINUTE_MS) return [Math.round(deltaMs / SECOND_MS), 'second'];\n if (abs < HOUR_MS) return [Math.round(deltaMs / MINUTE_MS), 'minute'];\n if (abs < DAY_MS) return [Math.round(deltaMs / HOUR_MS), 'hour'];\n if (abs < WEEK_MS) return [Math.round(deltaMs / DAY_MS), 'day'];\n if (abs < MONTH_MS) return [Math.round(deltaMs / WEEK_MS), 'week'];\n if (abs < YEAR_MS) return [Math.round(deltaMs / MONTH_MS), 'month'];\n return [Math.round(deltaMs / YEAR_MS), 'year'];\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const delta = date.getTime() - Date.now();\n const [n, unit] = pickUnit(delta);\n return new Intl.RelativeTimeFormat(locale, {\n numeric: 'auto',\n style: 'long',\n }).format(n, unit);\n}\n\nfunction formatAbsolute(\n date: Date,\n locale: string,\n options?: Intl.DateTimeFormatOptions,\n): string {\n const opts: Intl.DateTimeFormatOptions = options ?? {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n };\n return new Intl.DateTimeFormat(locale, opts).format(date);\n}\n\n/* ------------------------------------------------------------------ */\n/* Hydration-safe display-label hook */\n/* */\n/* Initial render returns the absolute label (SSR-stable) so the */\n/* server HTML matches the client's first paint. Post-mount, relative */\n/* mode flips to the relative phrase and re-evaluates every minute so */\n/* \"just now\" → \"1 minute ago\" without a parent re-render. */\n/* */\n/* `relativeWindow` supports the common \"recent phrase, otherwise full */\n/* date\" pattern: when the input date is older than the window, */\n/* display the absolute label even though format='relative'. The */\n/* minute tick re-evaluates the window so a date that starts inside */\n/* the window automatically flips to absolute once it drifts past. */\n/* ------------------------------------------------------------------ */\n\nfunction useDisplayLabel(\n time: number,\n locale: string,\n enabled: boolean,\n relativeWindow: number | undefined,\n absolute: string,\n): { label: string; isRelative: boolean } {\n const [state, setState] = useState<{ label: string; isRelative: boolean }>({\n label: absolute,\n isRelative: false,\n });\n\n useEffect(() => {\n if (!enabled) {\n setState((prev) =>\n prev.isRelative || prev.label !== absolute\n ? { label: absolute, isRelative: false }\n : prev,\n );\n return;\n }\n const compute = () => {\n const date = new Date(time);\n const inside =\n relativeWindow == null ||\n Math.abs(time - Date.now()) < relativeWindow;\n const next = inside\n ? { label: formatRelative(date, locale), isRelative: true }\n : { label: absolute, isRelative: false };\n setState((prev) =>\n prev.label === next.label && prev.isRelative === next.isRelative\n ? prev\n : next,\n );\n };\n compute();\n const intervalId = window.setInterval(compute, MINUTE_MS);\n return () => window.clearInterval(intervalId);\n }, [time, locale, enabled, relativeWindow, absolute]);\n\n return state;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\ntype ChipVariantProps = VariantProps<typeof chipVariants>;\n\nexport interface TimestampProps\n extends Omit<HTMLAttributes<HTMLTimeElement>, 'children' | 'title'>,\n ChipVariantProps {\n /** ISO-8601 string, ms-since-epoch number, or a `Date` instance. */\n value: string | number | Date;\n /**\n * `relative` shows \"6 hours ago\" with the absolute label in the `title`\n * tooltip; `absolute` shows the full locale-formatted date and omits the\n * tooltip. Default `relative`.\n */\n format?: 'relative' | 'absolute';\n /**\n * `inline` renders a plain `<time>` with the `.type-meta` role,\n * `chip` wraps the `<time>` in the Tag-family pill shape, and `bare`\n * emits the `<time>` element with no built-in typography class so the\n * consumer's surrounding context (e.g. AG Grid cell font size)\n * dictates how it reads. Default `inline`.\n */\n shape?: 'inline' | 'chip' | 'bare';\n /**\n * Override the locale. Falls back to the active `i18n.language`.\n */\n locale?: string;\n /**\n * Override the `Intl.DateTimeFormat` options used for the absolute\n * label (and the tooltip when `format='relative'`).\n */\n absoluteFormat?: Intl.DateTimeFormatOptions;\n /**\n * When `format='relative'`, dates older than this window (in ms) show\n * the absolute label instead. Supports the common \"recent relative\n * phrase, otherwise full date\" UX pattern (e.g. \"5 minutes ago\" →\n * \"20 Apr 2026, 10:30\" once beyond 12 h). Omit for no cutoff.\n */\n relativeWindow?: number;\n /**\n * Override the tooltip. Default is the absolute label when the visible\n * label is relative, and no tooltip when the visible label is already\n * absolute. Pass an empty string to suppress the tooltip entirely.\n */\n title?: string;\n /** Additional classes applied to the `<time>` element. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Timestamp */\n/* ------------------------------------------------------------------ */\n\nexport const Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n value,\n format = 'relative',\n shape = 'inline',\n size = 'sm',\n locale: localeProp,\n absoluteFormat,\n relativeWindow,\n title: titleProp,\n className,\n ...rest\n },\n ref,\n ) => {\n const { i18n } = useTranslation();\n const locale = localeProp ?? i18n.language ?? 'en';\n const time = useMemo(() => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') return value;\n return new Date(value).getTime();\n }, [value]);\n const valid = !Number.isNaN(time);\n const iso = valid ? new Date(time).toISOString() : undefined;\n\n const absolute = useMemo(\n () => (valid ? formatAbsolute(new Date(time), locale, absoluteFormat) : ''),\n [time, locale, absoluteFormat, valid],\n );\n const { label: visibleLabel, isRelative } = useDisplayLabel(\n time,\n locale,\n valid && format === 'relative',\n relativeWindow,\n absolute,\n );\n const tooltip = titleProp ?? (isRelative ? absolute : undefined);\n\n const chipClass = shape === 'chip' ? chipVariants({ size }) : null;\n const inlineClass = shape === 'inline' ? 'type-meta' : null;\n // shape='bare' → no built-in class; consumer's parent context owns typography.\n const composedClass = [chipClass, inlineClass, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <time\n ref={ref}\n dateTime={iso}\n title={tooltip === '' ? undefined : tooltip}\n data-component=\"timestamp\"\n className={composedClass || undefined}\n {...rest}\n >\n {visibleLabel}\n </time>\n );\n },\n);\n\nTimestamp.displayName = 'Timestamp';\n"],"names":["chipVariants","cva","SECOND_MS","MINUTE_MS","HOUR_MS","DAY_MS","WEEK_MS","MONTH_MS","YEAR_MS","pickUnit","deltaMs","abs","formatRelative","date","locale","delta","n","unit","formatAbsolute","options","opts","useDisplayLabel","time","enabled","relativeWindow","absolute","state","setState","useState","useEffect","prev","compute","next","intervalId","Timestamp","forwardRef","value","format","shape","size","localeProp","absoluteFormat","titleProp","className","rest","ref","i18n","useTranslation","useMemo","valid","iso","visibleLabel","isRelative","tooltip","composedClass","jsx"],"mappings":"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"}