@alfadocs/ui-kit 0.1.4 → 0.1.5

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 (273) hide show
  1. package/dist/_chunks/{agenda-card-C_hQGErS.js → agenda-card-DIWDvWum.js} +10 -10
  2. package/dist/_chunks/agenda-card-DIWDvWum.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-CBaVMJLO.js → agenda-tray-BqQZwiHc.js} +5 -5
  4. package/dist/_chunks/{agenda-tray-CBaVMJLO.js.map → agenda-tray-BqQZwiHc.js.map} +1 -1
  5. package/dist/_chunks/{ai-prompt-input-K94oVLG2.js → ai-prompt-input-CI27KmZ1.js} +4 -4
  6. package/dist/_chunks/ai-prompt-input-CI27KmZ1.js.map +1 -0
  7. package/dist/_chunks/{alert-rOM4EG0P.js → alert-BlOUMkXj.js} +39 -39
  8. package/dist/_chunks/alert-BlOUMkXj.js.map +1 -0
  9. package/dist/_chunks/{audio-recorder-Cn8z2zC9.js → audio-recorder-B-8SKgKn.js} +5 -5
  10. package/dist/_chunks/{audio-recorder-Cn8z2zC9.js.map → audio-recorder-B-8SKgKn.js.map} +1 -1
  11. package/dist/_chunks/{autocomplete.agent-DRrp-Rsx.js → autocomplete.agent-DqOy0_1P.js} +31 -31
  12. package/dist/_chunks/autocomplete.agent-DqOy0_1P.js.map +1 -0
  13. package/dist/_chunks/{avatar-Biffh-_H.js → avatar-Dcr6XuDQ.js} +19 -19
  14. package/dist/_chunks/avatar-Dcr6XuDQ.js.map +1 -0
  15. package/dist/_chunks/{balance-cell-renderer-CiyezQhi.js → balance-cell-renderer-BRWt3neo.js} +166 -166
  16. package/dist/_chunks/balance-cell-renderer-BRWt3neo.js.map +1 -0
  17. package/dist/_chunks/breadcrumb-D6xpsP7n.js +293 -0
  18. package/dist/_chunks/breadcrumb-D6xpsP7n.js.map +1 -0
  19. package/dist/_chunks/{button-7dTew-IV.js → button-7mLWcMp_.js} +9 -9
  20. package/dist/_chunks/{button-7dTew-IV.js.map → button-7mLWcMp_.js.map} +1 -1
  21. package/dist/_chunks/{calendar-BkDeDTaX.js → calendar-nGEgelJs.js} +100 -100
  22. package/dist/_chunks/calendar-nGEgelJs.js.map +1 -0
  23. package/dist/_chunks/{chat-input-xiBIujMv.js → chat-input-DsIrWM4f.js} +2 -2
  24. package/dist/_chunks/{chat-input-xiBIujMv.js.map → chat-input-DsIrWM4f.js.map} +1 -1
  25. package/dist/_chunks/{chat-message-BtxUyugB.js → chat-message-ByouZpPP.js} +3 -3
  26. package/dist/_chunks/{chat-message-BtxUyugB.js.map → chat-message-ByouZpPP.js.map} +1 -1
  27. package/dist/_chunks/{checkbox-Ni6C_KJg.js → checkbox-DNK4qS2_.js} +13 -13
  28. package/dist/_chunks/checkbox-DNK4qS2_.js.map +1 -0
  29. package/dist/_chunks/{checkbox-group-BFZ4oN5t.js → checkbox-group-CWpGZEF6.js} +13 -13
  30. package/dist/_chunks/checkbox-group-CWpGZEF6.js.map +1 -0
  31. package/dist/_chunks/{collapsible-fFMqzpdL.js → collapsible-D4LOdLxp.js} +18 -18
  32. package/dist/_chunks/collapsible-D4LOdLxp.js.map +1 -0
  33. package/dist/_chunks/{color-picker-Cl3KdjJd.js → color-picker-e9PmpaGH.js} +161 -161
  34. package/dist/_chunks/color-picker-e9PmpaGH.js.map +1 -0
  35. package/dist/_chunks/{combobox.agent-DjdivI3X.js → combobox.agent-ByobCLJ_.js} +28 -28
  36. package/dist/_chunks/combobox.agent-ByobCLJ_.js.map +1 -0
  37. package/dist/_chunks/{command-palette.agent-BUjzr2ET.js → command-palette.agent-js2rxgeR.js} +117 -117
  38. package/dist/_chunks/command-palette.agent-js2rxgeR.js.map +1 -0
  39. package/dist/_chunks/{description-list-C_1NX8P3.js → description-list-DvJbp6Yg.js} +2 -2
  40. package/dist/_chunks/{description-list-C_1NX8P3.js.map → description-list-DvJbp6Yg.js.map} +1 -1
  41. package/dist/_chunks/{dialog.agent-C2lP9H0h.js → dialog.agent-DEG_fVzG.js} +42 -42
  42. package/dist/_chunks/dialog.agent-DEG_fVzG.js.map +1 -0
  43. package/dist/_chunks/{dropdown-menu-2HgU1Emf.js → dropdown-menu-JNo66A-j.js} +2 -2
  44. package/dist/_chunks/dropdown-menu-JNo66A-j.js.map +1 -0
  45. package/dist/_chunks/{empty-state-BHrItOiE.js → empty-state-DQPtRp2b.js} +2 -2
  46. package/dist/_chunks/{empty-state-BHrItOiE.js.map → empty-state-DQPtRp2b.js.map} +1 -1
  47. package/dist/_chunks/{file-upload.agent-LlC0W468.js → file-upload.agent-B9AN82LA.js} +2 -2
  48. package/dist/_chunks/{file-upload.agent-LlC0W468.js.map → file-upload.agent-B9AN82LA.js.map} +1 -1
  49. package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js → freemium-paywall-CkefGLM_.js} +4 -4
  50. package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js.map → freemium-paywall-CkefGLM_.js.map} +1 -1
  51. package/dist/_chunks/{header-BpU9U-1X.js → header-BGn1mRp8.js} +2 -2
  52. package/dist/_chunks/{header-BpU9U-1X.js.map → header-BGn1mRp8.js.map} +1 -1
  53. package/dist/_chunks/{icon-button-CNjWCD1X.js → icon-button-Wnnde5lc.js} +6 -6
  54. package/dist/_chunks/icon-button-Wnnde5lc.js.map +1 -0
  55. package/dist/_chunks/input-surface-u4QB0lxe.js +32 -0
  56. package/dist/_chunks/input-surface-u4QB0lxe.js.map +1 -0
  57. package/dist/_chunks/{key-value-pair-C9hpjC_B.js → key-value-pair-JRFS9Xrh.js} +10 -10
  58. package/dist/_chunks/key-value-pair-JRFS9Xrh.js.map +1 -0
  59. package/dist/_chunks/{leo-sidebar-CNjZqljo.js → leo-sidebar-BzN4pJ7j.js} +16 -16
  60. package/dist/_chunks/leo-sidebar-BzN4pJ7j.js.map +1 -0
  61. package/dist/_chunks/{message-card-CZzNO4ov.js → message-card-qAp2-WQK.js} +12 -12
  62. package/dist/_chunks/message-card-qAp2-WQK.js.map +1 -0
  63. package/dist/_chunks/{message-tray-BWbjXW3F.js → message-tray-VaLpQU5t.js} +5 -5
  64. package/dist/_chunks/{message-tray-BWbjXW3F.js.map → message-tray-VaLpQU5t.js.map} +1 -1
  65. package/dist/_chunks/{multi-select.agent-BSGEW10d.js → multi-select.agent-CNsyW3n9.js} +66 -66
  66. package/dist/_chunks/multi-select.agent-CNsyW3n9.js.map +1 -0
  67. package/dist/_chunks/navigation-menu-EVFau1O2.js +180 -0
  68. package/dist/_chunks/navigation-menu-EVFau1O2.js.map +1 -0
  69. package/dist/_chunks/{notification-card-DgW-vVg-.js → notification-card-BF2_veHy.js} +11 -11
  70. package/dist/_chunks/notification-card-BF2_veHy.js.map +1 -0
  71. package/dist/_chunks/{notification-tray-CKUgl2jc.js → notification-tray-Bq-08ReD.js} +5 -5
  72. package/dist/_chunks/{notification-tray-CKUgl2jc.js.map → notification-tray-Bq-08ReD.js.map} +1 -1
  73. package/dist/_chunks/{number-input-BPPhekLu.js → number-input-DjpT_RXJ.js} +46 -46
  74. package/dist/_chunks/number-input-DjpT_RXJ.js.map +1 -0
  75. package/dist/_chunks/pagination.agent-oEaqmtx5.js +380 -0
  76. package/dist/_chunks/pagination.agent-oEaqmtx5.js.map +1 -0
  77. package/dist/_chunks/{password-input-DAT5HQth.js → password-input-DJDVznWH.js} +5 -5
  78. package/dist/_chunks/password-input-DJDVznWH.js.map +1 -0
  79. package/dist/_chunks/{patient-shell-BzHhg6uA.js → patient-shell-DP54y6rc.js} +5 -5
  80. package/dist/_chunks/{patient-shell-BzHhg6uA.js.map → patient-shell-DP54y6rc.js.map} +1 -1
  81. package/dist/_chunks/{payment-form-YlxrCpZQ.js → payment-form-hcl-gGrp.js} +2 -2
  82. package/dist/_chunks/{payment-form-YlxrCpZQ.js.map → payment-form-hcl-gGrp.js.map} +1 -1
  83. package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js → pdf-viewer.agent-CfIHhcHx.js} +3 -3
  84. package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js.map → pdf-viewer.agent-CfIHhcHx.js.map} +1 -1
  85. package/dist/_chunks/{phone-input-BuRe5PyI.js → phone-input-DE_39q65.js} +103 -103
  86. package/dist/_chunks/phone-input-DE_39q65.js.map +1 -0
  87. package/dist/_chunks/{popover-Ds1iOdiv.js → popover-DvAtFOi-.js} +2 -2
  88. package/dist/_chunks/{popover-Ds1iOdiv.js.map → popover-DvAtFOi-.js.map} +1 -1
  89. package/dist/_chunks/{privacy-lock-up2ervfF.js → privacy-lock-DS6QRo2N.js} +3 -3
  90. package/dist/_chunks/{privacy-lock-up2ervfF.js.map → privacy-lock-DS6QRo2N.js.map} +1 -1
  91. package/dist/_chunks/{progress-D4ELgHG3.js → progress-B4Of_pzz.js} +57 -57
  92. package/dist/_chunks/progress-B4Of_pzz.js.map +1 -0
  93. package/dist/_chunks/{radio-XSSNX3Af.js → radio-cs8N1wJi.js} +29 -29
  94. package/dist/_chunks/radio-cs8N1wJi.js.map +1 -0
  95. package/dist/_chunks/{radio-group-DBrUOPcy.js → radio-group-BIUbpWml.js} +3 -3
  96. package/dist/_chunks/radio-group-BIUbpWml.js.map +1 -0
  97. package/dist/_chunks/{scroll-area-HIq0hJyJ.js → scroll-area-DLr5w9Dd.js} +9 -9
  98. package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +1 -0
  99. package/dist/_chunks/{search-bar-9Zbew4yM.js → search-bar-fcGqDFW3.js} +30 -30
  100. package/dist/_chunks/{search-bar-9Zbew4yM.js.map → search-bar-fcGqDFW3.js.map} +1 -1
  101. package/dist/_chunks/{search-input-CtkWITO2.js → search-input-BVMCONyN.js} +2 -2
  102. package/dist/_chunks/{search-input-CtkWITO2.js.map → search-input-BVMCONyN.js.map} +1 -1
  103. package/dist/_chunks/{select-DdAOtomN.js → select-IY_JQa-F.js} +50 -50
  104. package/dist/_chunks/select-IY_JQa-F.js.map +1 -0
  105. package/dist/_chunks/{sheet-D7GRhnWw.js → sheet-BhNpLHc9.js} +8 -8
  106. package/dist/_chunks/sheet-BhNpLHc9.js.map +1 -0
  107. package/dist/_chunks/{sidebar-Dc2ffrbf.js → sidebar-OVzwN3jE.js} +294 -294
  108. package/dist/_chunks/sidebar-OVzwN3jE.js.map +1 -0
  109. package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js → sign-in-with-alfadocs-button-BN_FPGHT.js} +2 -2
  110. package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js.map → sign-in-with-alfadocs-button-BN_FPGHT.js.map} +1 -1
  111. package/dist/_chunks/{skeleton-DAdPFx9d.js → skeleton-dtqyF09N.js} +8 -8
  112. package/dist/_chunks/skeleton-dtqyF09N.js.map +1 -0
  113. package/dist/_chunks/{slot-grid-WHc5A8-z.js → slot-grid-D_l5VsHG.js} +5 -5
  114. package/dist/_chunks/{slot-grid-WHc5A8-z.js.map → slot-grid-D_l5VsHG.js.map} +1 -1
  115. package/dist/_chunks/{stepper-accordion-2_7Pw0tC.js → stepper-accordion-CGog0JSF.js} +64 -64
  116. package/dist/_chunks/stepper-accordion-CGog0JSF.js.map +1 -0
  117. package/dist/_chunks/{stepper-calendar-CWZcFgt_.js → stepper-calendar-_fLOAjus.js} +7 -7
  118. package/dist/_chunks/{stepper-calendar-CWZcFgt_.js.map → stepper-calendar-_fLOAjus.js.map} +1 -1
  119. package/dist/_chunks/{switch-DhSORO9C.js → switch-aN2EYxHh.js} +4 -4
  120. package/dist/_chunks/switch-aN2EYxHh.js.map +1 -0
  121. package/dist/_chunks/{tabs.agent-BtaNGxRh.js → tabs.agent-BpbVA-Zh.js} +55 -55
  122. package/dist/_chunks/tabs.agent-BpbVA-Zh.js.map +1 -0
  123. package/dist/_chunks/{tag--uLKOb9f.js → tag-BqidXKo3.js} +2 -2
  124. package/dist/_chunks/tag-BqidXKo3.js.map +1 -0
  125. package/dist/_chunks/{task-card-BeSuntXP.js → task-card-yW7tKlG4.js} +17 -17
  126. package/dist/_chunks/task-card-yW7tKlG4.js.map +1 -0
  127. package/dist/_chunks/{task-tray-pRk6u8Ik.js → task-tray-BzahI5FQ.js} +5 -5
  128. package/dist/_chunks/{task-tray-pRk6u8Ik.js.map → task-tray-BzahI5FQ.js.map} +1 -1
  129. package/dist/_chunks/{text-area-xf9-6iDf.js → text-area-DmKSd2DG.js} +2 -2
  130. package/dist/_chunks/text-area-DmKSd2DG.js.map +1 -0
  131. package/dist/_chunks/{text-input-exh7VD7D.js → text-input-CRHvl5zk.js} +19 -19
  132. package/dist/_chunks/text-input-CRHvl5zk.js.map +1 -0
  133. package/dist/_chunks/{theme-toggle-CJgA6G24.js → theme-toggle-COHFwO2H.js} +4 -4
  134. package/dist/_chunks/{theme-toggle-CJgA6G24.js.map → theme-toggle-COHFwO2H.js.map} +1 -1
  135. package/dist/_chunks/{timeline-DIueH4TJ.js → timeline-RgAIzpMd.js} +2 -2
  136. package/dist/_chunks/{timeline-DIueH4TJ.js.map → timeline-RgAIzpMd.js.map} +1 -1
  137. package/dist/_chunks/{toast-q0SlabGr.js → toast-lOhJDKOH.js} +12 -12
  138. package/dist/_chunks/{toast-q0SlabGr.js.map → toast-lOhJDKOH.js.map} +1 -1
  139. package/dist/_chunks/{transcript-panel-DFnhbrlQ.js → transcript-panel-CNbVGG9L.js} +59 -59
  140. package/dist/_chunks/transcript-panel-CNbVGG9L.js.map +1 -0
  141. package/dist/_chunks/{visually-hidden-BlkhaZWe.js → visually-hidden-Bw7vBHLm.js} +6 -6
  142. package/dist/_chunks/{visually-hidden-BlkhaZWe.js.map → visually-hidden-Bw7vBHLm.js.map} +1 -1
  143. package/dist/_chunks/{warning-stack-DCmO0R07.js → warning-stack-8Pa3pekh.js} +24 -24
  144. package/dist/_chunks/warning-stack-8Pa3pekh.js.map +1 -0
  145. package/dist/_chunks/{workflow-map-CAM6Uy_J.js → workflow-map-DGJwVcO-.js} +106 -106
  146. package/dist/_chunks/workflow-map-DGJwVcO-.js.map +1 -0
  147. package/dist/agent-catalog.json +1 -1
  148. package/dist/components/_shared/input-surface.d.ts +11 -11
  149. package/dist/components/agenda-card/index.js +1 -1
  150. package/dist/components/agenda-tray/index.js +1 -1
  151. package/dist/components/ai-prompt-input/index.js +1 -1
  152. package/dist/components/alert/index.js +1 -1
  153. package/dist/components/audio-recorder/index.js +1 -1
  154. package/dist/components/autocomplete/index.js +1 -1
  155. package/dist/components/avatar/index.js +1 -1
  156. package/dist/components/breadcrumb/index.js +1 -1
  157. package/dist/components/button/index.js +2 -2
  158. package/dist/components/calendar/index.js +1 -1
  159. package/dist/components/chat-input/index.js +1 -1
  160. package/dist/components/chat-message/index.js +1 -1
  161. package/dist/components/checkbox/index.js +1 -1
  162. package/dist/components/checkbox-group/index.js +1 -1
  163. package/dist/components/collapsible/index.js +1 -1
  164. package/dist/components/color-picker/index.js +1 -1
  165. package/dist/components/combobox/index.js +1 -1
  166. package/dist/components/command-palette/index.js +1 -1
  167. package/dist/components/data-table/index.js +1 -1
  168. package/dist/components/description-list/index.js +1 -1
  169. package/dist/components/dialog/index.js +1 -1
  170. package/dist/components/dropdown-menu/index.js +1 -1
  171. package/dist/components/empty-state/index.js +1 -1
  172. package/dist/components/file-upload/index.js +1 -1
  173. package/dist/components/freemium-paywall/index.js +1 -1
  174. package/dist/components/header/index.js +1 -1
  175. package/dist/components/icon-button/index.js +1 -1
  176. package/dist/components/key-value-pair/index.js +1 -1
  177. package/dist/components/message-card/index.js +1 -1
  178. package/dist/components/message-tray/index.js +1 -1
  179. package/dist/components/multi-select/index.js +1 -1
  180. package/dist/components/navigation-menu/index.js +1 -1
  181. package/dist/components/notification-card/index.js +1 -1
  182. package/dist/components/notification-tray/index.js +1 -1
  183. package/dist/components/number-input/index.js +1 -1
  184. package/dist/components/pagination/index.js +1 -1
  185. package/dist/components/password-input/index.js +1 -1
  186. package/dist/components/payment-form/index.js +1 -1
  187. package/dist/components/pdf-viewer/index.js +1 -1
  188. package/dist/components/phone-input/index.js +1 -1
  189. package/dist/components/popover/index.js +1 -1
  190. package/dist/components/privacy-lock/index.js +1 -1
  191. package/dist/components/progress/index.js +1 -1
  192. package/dist/components/radio/index.js +1 -1
  193. package/dist/components/radio-group/index.js +2 -2
  194. package/dist/components/scroll-area/index.js +1 -1
  195. package/dist/components/search-bar/index.js +1 -1
  196. package/dist/components/search-input/index.js +1 -1
  197. package/dist/components/select/index.js +1 -1
  198. package/dist/components/sheet/index.js +1 -1
  199. package/dist/components/sidebar/index.js +1 -1
  200. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  201. package/dist/components/skeleton/index.js +1 -1
  202. package/dist/components/slot-grid/index.js +1 -1
  203. package/dist/components/stepper-accordion/index.js +1 -1
  204. package/dist/components/stepper-calendar/index.js +1 -1
  205. package/dist/components/switch/index.js +1 -1
  206. package/dist/components/tabs/index.js +1 -1
  207. package/dist/components/tag/index.js +1 -1
  208. package/dist/components/task-card/index.js +1 -1
  209. package/dist/components/task-tray/index.js +1 -1
  210. package/dist/components/text-area/index.js +1 -1
  211. package/dist/components/text-input/index.js +1 -1
  212. package/dist/components/theme-toggle/index.js +1 -1
  213. package/dist/components/timeline/index.js +1 -1
  214. package/dist/components/toast/index.js +1 -1
  215. package/dist/components/transcript-panel/index.js +1 -1
  216. package/dist/components/visually-hidden/index.js +1 -1
  217. package/dist/components/warning-stack/index.js +1 -1
  218. package/dist/components/workflow/index.js +1 -1
  219. package/dist/index.js +72 -72
  220. package/dist/patterns/leo-assistant/index.js +1 -1
  221. package/dist/patterns/patient-shell/index.js +1 -1
  222. package/dist/tokens.css +1 -1
  223. package/package.json +1 -1
  224. package/dist/_chunks/agenda-card-C_hQGErS.js.map +0 -1
  225. package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +0 -1
  226. package/dist/_chunks/alert-rOM4EG0P.js.map +0 -1
  227. package/dist/_chunks/autocomplete.agent-DRrp-Rsx.js.map +0 -1
  228. package/dist/_chunks/avatar-Biffh-_H.js.map +0 -1
  229. package/dist/_chunks/balance-cell-renderer-CiyezQhi.js.map +0 -1
  230. package/dist/_chunks/breadcrumb-CcZovmIq.js +0 -293
  231. package/dist/_chunks/breadcrumb-CcZovmIq.js.map +0 -1
  232. package/dist/_chunks/calendar-BkDeDTaX.js.map +0 -1
  233. package/dist/_chunks/checkbox-Ni6C_KJg.js.map +0 -1
  234. package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +0 -1
  235. package/dist/_chunks/collapsible-fFMqzpdL.js.map +0 -1
  236. package/dist/_chunks/color-picker-Cl3KdjJd.js.map +0 -1
  237. package/dist/_chunks/combobox.agent-DjdivI3X.js.map +0 -1
  238. package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +0 -1
  239. package/dist/_chunks/dialog.agent-C2lP9H0h.js.map +0 -1
  240. package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +0 -1
  241. package/dist/_chunks/icon-button-CNjWCD1X.js.map +0 -1
  242. package/dist/_chunks/input-surface-D5OMCB1W.js +0 -32
  243. package/dist/_chunks/input-surface-D5OMCB1W.js.map +0 -1
  244. package/dist/_chunks/key-value-pair-C9hpjC_B.js.map +0 -1
  245. package/dist/_chunks/leo-sidebar-CNjZqljo.js.map +0 -1
  246. package/dist/_chunks/message-card-CZzNO4ov.js.map +0 -1
  247. package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +0 -1
  248. package/dist/_chunks/navigation-menu-DxOMvrKM.js +0 -180
  249. package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +0 -1
  250. package/dist/_chunks/notification-card-DgW-vVg-.js.map +0 -1
  251. package/dist/_chunks/number-input-BPPhekLu.js.map +0 -1
  252. package/dist/_chunks/pagination.agent-CmA0Ocr5.js +0 -380
  253. package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +0 -1
  254. package/dist/_chunks/password-input-DAT5HQth.js.map +0 -1
  255. package/dist/_chunks/phone-input-BuRe5PyI.js.map +0 -1
  256. package/dist/_chunks/progress-D4ELgHG3.js.map +0 -1
  257. package/dist/_chunks/radio-XSSNX3Af.js.map +0 -1
  258. package/dist/_chunks/radio-group-DBrUOPcy.js.map +0 -1
  259. package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +0 -1
  260. package/dist/_chunks/select-DdAOtomN.js.map +0 -1
  261. package/dist/_chunks/sheet-D7GRhnWw.js.map +0 -1
  262. package/dist/_chunks/sidebar-Dc2ffrbf.js.map +0 -1
  263. package/dist/_chunks/skeleton-DAdPFx9d.js.map +0 -1
  264. package/dist/_chunks/stepper-accordion-2_7Pw0tC.js.map +0 -1
  265. package/dist/_chunks/switch-DhSORO9C.js.map +0 -1
  266. package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +0 -1
  267. package/dist/_chunks/tag--uLKOb9f.js.map +0 -1
  268. package/dist/_chunks/task-card-BeSuntXP.js.map +0 -1
  269. package/dist/_chunks/text-area-xf9-6iDf.js.map +0 -1
  270. package/dist/_chunks/text-input-exh7VD7D.js.map +0 -1
  271. package/dist/_chunks/transcript-panel-DFnhbrlQ.js.map +0 -1
  272. package/dist/_chunks/warning-stack-DCmO0R07.js.map +0 -1
  273. package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"audio-recorder-Cn8z2zC9.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mic.js","../../node_modules/lucide-react/dist/esm/icons/pause.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../src/components/audio-recorder/audio-recorder.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: \"M12 19v3\", key: \"npa21l\" }],\n [\"path\", { d: \"M19 10v2a7 7 0 0 1-14 0v-2\", key: \"1vc78b\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"13\", rx: \"3\", key: \"s6n7sd\" }]\n];\nconst Mic = createLucideIcon(\"mic\", __iconNode);\n\nexport { __iconNode, Mic as default };\n//# sourceMappingURL=mic.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.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: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mic, Pause, Play, Square, X } from 'lucide-react';\nimport { IconButton, Button } from '../button';\nimport { Select, type SelectOption } from '../select/select';\nimport { AudioVisualiser } from '../audio-visualiser';\nimport { Alert } from '../alert';\n\ntype State =\n | { kind: 'idle' }\n | { kind: 'requesting' }\n | { kind: 'recording'; startedAt: number; pausedMs: number }\n | { kind: 'paused'; startedAt: number; pausedMs: number; pausedAt: number }\n | { kind: 'stopped'; duration: number }\n | {\n kind: 'error';\n type: 'permission-denied' | 'no-device' | 'unsupported' | 'capture-failed';\n };\n\ntype Action =\n | { type: 'request' }\n | { type: 'start' }\n | { type: 'pause' }\n | { type: 'resume' }\n | { type: 'stop'; duration: number }\n | { type: 'cancel' }\n | {\n type: 'error';\n kind: 'permission-denied' | 'no-device' | 'unsupported' | 'capture-failed';\n }\n | { type: 'reset' };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'request':\n return { kind: 'requesting' };\n case 'start':\n return { kind: 'recording', startedAt: Date.now(), pausedMs: 0 };\n case 'pause':\n if (state.kind !== 'recording') return state;\n return {\n kind: 'paused',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs,\n pausedAt: Date.now(),\n };\n case 'resume':\n if (state.kind !== 'paused') return state;\n return {\n kind: 'recording',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs + (Date.now() - state.pausedAt),\n };\n case 'stop':\n return { kind: 'stopped', duration: action.duration };\n case 'cancel':\n return { kind: 'idle' };\n case 'error':\n return { kind: 'error', type: action.kind };\n case 'reset':\n return { kind: 'idle' };\n default:\n return state;\n }\n}\n\nconst rootVariants = cva(\n [\n 'ds:inline-flex ds:flex-col ds:items-stretch ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-background',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst MIME_PREFERENCES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n];\n\nfunction pickMimeType(): string | undefined {\n if (typeof MediaRecorder === 'undefined') return undefined;\n for (const mime of MIME_PREFERENCES) {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n }\n return undefined;\n}\n\nfunction formatTimer(ms: number, locale: string): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(minutes)}:${fmt(seconds)}`;\n}\n\nexport interface AudioRecorderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onError'>,\n VariantProps<typeof rootVariants> {\n /** Called on stop with the final blob + duration in ms. */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is cancelled. */\n onCancel?: () => void;\n /** Called when an error occurs. */\n onError?: (\n error:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed'\n | 'max-duration'\n | 'max-size',\n ) => void;\n /**\n * Auto-stop after this many milliseconds of active recording. Default\n * 30 minutes. Set `null` to disable.\n */\n maxDurationMs?: number | null;\n /**\n * Auto-stop when the accumulated blob chunks exceed this many bytes.\n * Default 250 MB. Set `null` to disable.\n */\n maxBytes?: number | null;\n}\n\nexport const AudioRecorder = forwardRef<HTMLDivElement, AudioRecorderProps>(\n (\n {\n size = 'md',\n onRecordingComplete,\n onCancel,\n onError,\n maxDurationMs = 30 * 60 * 1000,\n maxBytes = 250 * 1024 * 1024,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [state, dispatch] = useReducer(reducer, { kind: 'idle' });\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [now, setNow] = useState<number>(Date.now());\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n const [selectedDeviceId, setSelectedDeviceId] = useState<string>('');\n\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n // Running total of bytes accumulated in `chunksRef` — reading\n // `chunksRef.current.reduce(...)` on every ondataavailable scales\n // poorly; maintain the sum incrementally instead.\n const byteCountRef = useRef<number>(0);\n const durationAtStopRef = useRef<number>(0);\n // Tracks the *currently-held* MediaStream in a ref so the unmount\n // cleanup effect (which closes over [] deps) sees the latest value.\n // Without this, a unmount while getUserMedia is pending would never\n // stop() tracks and the browser mic indicator stays on.\n const streamRef = useRef<MediaStream | null>(null);\n // Flips to true on unmount; consulted inside the getUserMedia promise\n // resolution so we don't try to setStream() on a dead component and\n // so the freshly-acquired tracks get released immediately.\n const unmountedRef = useRef<boolean>(false);\n // Flips to true when cancel() is called; the onstop handler reads it\n // so `onRecordingComplete` is NOT invoked on a cancel path with a blank\n // blob. Reset on each recording start.\n const cancelledRef = useRef<boolean>(false);\n\n const supported = typeof MediaRecorder !== 'undefined';\n\n /* ── Enumerate devices once (after any prior permission grant) ── */\n useEffect(() => {\n if (!supported || !navigator.mediaDevices?.enumerateDevices) return;\n navigator.mediaDevices\n .enumerateDevices()\n .then((list) => {\n const mics = list.filter((d) => d.kind === 'audioinput');\n setDevices(mics);\n })\n .catch(() => {\n /* ignore */\n });\n }, [supported]);\n\n /* ── Timer tick ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n const handle = window.setInterval(() => setNow(Date.now()), 250);\n return () => window.clearInterval(handle);\n }, [state.kind]);\n\n const cleanupStream = useCallback(() => {\n const held = streamRef.current ?? stream;\n held?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, [stream]);\n\n const requestAndStart = useCallback(async () => {\n if (!supported) {\n dispatch({ type: 'error', kind: 'unsupported' });\n onError?.('unsupported');\n return;\n }\n dispatch({ type: 'request' });\n cancelledRef.current = false;\n try {\n const nextStream = await navigator.mediaDevices.getUserMedia({\n audio: selectedDeviceId\n ? { deviceId: { exact: selectedDeviceId } }\n : true,\n });\n // Guard against the component unmounting between the permission\n // prompt and the promise resolution — otherwise the freshly-acquired\n // tracks leak and the browser's mic indicator stays live.\n if (unmountedRef.current) {\n nextStream.getTracks().forEach((tr) => tr.stop());\n return;\n }\n streamRef.current = nextStream;\n setStream(nextStream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(\n nextStream,\n mimeType ? { mimeType } : undefined,\n );\n recorderRef.current = recorder;\n chunksRef.current = [];\n byteCountRef.current = 0;\n recorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n chunksRef.current.push(event.data);\n byteCountRef.current += event.data.size;\n // Byte-cap: auto-stop if the recording would exceed maxBytes.\n // Cheaper than summing on every tick; stop once and bail.\n if (\n typeof maxBytes === 'number' &&\n byteCountRef.current >= maxBytes &&\n recorderRef.current?.state === 'recording'\n ) {\n onError?.('max-size');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }\n };\n recorder.onstop = () => {\n // Cancel path: drop the blob on the floor — consumers who called\n // cancel() must not receive a silent empty recording.\n if (!cancelledRef.current) {\n const blob = new Blob(chunksRef.current, {\n type: mimeType ?? 'audio/webm',\n });\n onRecordingComplete?.(blob, durationAtStopRef.current);\n }\n chunksRef.current = [];\n recorderRef.current = null;\n nextStream.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n setStream(null);\n cancelledRef.current = false;\n };\n recorder.start(1000);\n dispatch({ type: 'start' });\n } catch (err: unknown) {\n const errorName =\n err instanceof Error ? err.name : '';\n if (errorName === 'NotAllowedError' || errorName === 'SecurityError') {\n dispatch({ type: 'error', kind: 'permission-denied' });\n onError?.('permission-denied');\n } else if (errorName === 'NotFoundError' || errorName === 'OverconstrainedError') {\n dispatch({ type: 'error', kind: 'no-device' });\n onError?.('no-device');\n } else {\n dispatch({ type: 'error', kind: 'capture-failed' });\n onError?.('capture-failed');\n }\n }\n }, [onError, onRecordingComplete, selectedDeviceId, supported]);\n\n const pause = useCallback(() => {\n recorderRef.current?.pause();\n dispatch({ type: 'pause' });\n }, []);\n\n const resume = useCallback(() => {\n recorderRef.current?.resume();\n dispatch({ type: 'resume' });\n }, []);\n\n const stop = useCallback(() => {\n if (state.kind === 'recording' || state.kind === 'paused') {\n const started = state.startedAt;\n const pausedMs = state.pausedMs;\n const duration = Date.now() - started - pausedMs;\n durationAtStopRef.current = Math.max(0, duration);\n dispatch({ type: 'stop', duration: duration });\n }\n try {\n recorderRef.current?.stop();\n } catch {\n /* stop() throws on non-recording state; safe to swallow */\n }\n }, [state]);\n\n const cancel = useCallback(() => {\n // Flip the cancelled flag BEFORE asking MediaRecorder to stop so the\n // async onstop handler sees it and skips onRecordingComplete.\n cancelledRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n chunksRef.current = [];\n recorderRef.current = null;\n cleanupStream();\n dispatch({ type: 'cancel' });\n onCancel?.();\n }, [cleanupStream, onCancel]);\n\n /* ── Max-duration auto-stop ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n if (typeof maxDurationMs !== 'number' || maxDurationMs <= 0) return;\n const alreadyElapsed = Date.now() - state.startedAt - state.pausedMs;\n const remaining = Math.max(0, maxDurationMs - alreadyElapsed);\n const handle = window.setTimeout(() => {\n if (recorderRef.current?.state === 'recording') {\n onError?.('max-duration');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }, remaining);\n return () => window.clearTimeout(handle);\n }, [state, maxDurationMs, onError]);\n\n /* ── Unmount cleanup: release mic if still held ── */\n useEffect(() => {\n return () => {\n unmountedRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n // Use streamRef so we see a stream that was acquired by an\n // in-flight getUserMedia resolution — not just the one captured\n // by the closure at mount.\n streamRef.current?.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n };\n }, []);\n\n const elapsedMs =\n state.kind === 'recording'\n ? now - state.startedAt - state.pausedMs\n : state.kind === 'paused'\n ? state.pausedAt - state.startedAt - state.pausedMs\n : state.kind === 'stopped'\n ? state.duration\n : 0;\n\n const deviceOptions: SelectOption<string>[] = devices.map((d) => ({\n value: d.deviceId,\n label: d.label || t('ui.chat.audio.selectDevice'),\n }));\n\n const statusText = (() => {\n switch (state.kind) {\n case 'idle':\n return t('ui.chat.audio.idle');\n case 'requesting':\n return t('ui.common.loading');\n case 'recording':\n return t('ui.chat.audio.recording');\n case 'paused':\n return t('ui.chat.audio.paused');\n case 'stopped':\n return t('ui.chat.audio.idle');\n case 'error':\n if (state.type === 'permission-denied')\n return t('ui.chat.audio.permissionDenied');\n if (state.type === 'unsupported')\n return t('ui.chat.audio.unsupported');\n return t('ui.chat.audio.idle');\n }\n })();\n\n const isRecording = state.kind === 'recording';\n const isPaused = state.kind === 'paused';\n const hasError = state.kind === 'error';\n\n return (\n <div\n ref={ref}\n data-component=\"audio-recorder\"\n className={rootVariants({ size, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:inline-flex ds:size-3 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)]',\n isRecording\n ? 'ds:bg-[color:var(--destructive)]'\n : 'ds:bg-[color:var(--muted)]',\n ].join(' ')}\n >\n {isRecording ? (\n <span\n className={[\n 'ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)]',\n 'ds:motion-safe:animate-[recorder-pulse_1.2s_ease-out_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n ) : null}\n </span>\n <AudioVisualiser\n stream={stream}\n size=\"sm\"\n aria-hidden=\"true\"\n className=\"ds:flex-1\"\n />\n <time\n dir=\"ltr\"\n aria-hidden=\"true\"\n className=\"ds:tabular-nums type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {formatTimer(elapsedMs, i18n.language)}\n </time>\n </div>\n\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {statusText}\n </span>\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {state.kind === 'idle' || state.kind === 'stopped' || hasError ? (\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Mic />}\n onClick={requestAndStart}\n disabled={!supported}\n >\n {t('ui.chat.audio.record')}\n </Button>\n ) : null}\n {isRecording ? (\n <IconButton\n icon={<Pause />}\n aria-label={t('ui.chat.audio.pause')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={pause}\n />\n ) : null}\n {isPaused ? (\n <IconButton\n icon={<Play />}\n aria-label={t('ui.chat.audio.resume')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={resume}\n />\n ) : null}\n {(isRecording || isPaused) ? (\n <>\n <IconButton\n icon={<Square />}\n aria-label={t('ui.chat.audio.stop')}\n intent=\"primary\"\n size=\"sm\"\n onClick={stop}\n />\n <IconButton\n icon={<X />}\n aria-label={t('ui.chat.audio.cancel')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={cancel}\n />\n </>\n ) : null}\n {state.kind === 'idle' && deviceOptions.length > 1 ? (\n <div className=\"ds:ms-auto ds:min-w-[160px]\">\n <Select\n aria-label={t('ui.chat.audio.selectDevice')}\n options={deviceOptions}\n value={selectedDeviceId}\n onValueChange={(v) => setSelectedDeviceId(v)}\n size=\"sm\"\n clearable\n />\n </div>\n ) : null}\n </div>\n\n {hasError && state.kind === 'error' ? (\n <Alert variant=\"error\" live=\"polite\">\n <Alert.Description>{statusText}</Alert.Description>\n {state.type === 'permission-denied' ? (\n <Alert.Action>\n <Button intent=\"ghost\" size=\"sm\" onClick={requestAndStart}>\n {t('ui.chat.audio.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n ) : null}\n </div>\n );\n },\n);\n\nAudioRecorder.displayName = 'AudioRecorder';\n"],"names":["__iconNode","Mic","createLucideIcon","Pause","Play","reducer","state","action","rootVariants","cva","MIME_PREFERENCES","pickMimeType","mime","formatTimer","ms","locale","total","minutes","seconds","fmt","n","AudioRecorder","forwardRef","size","onRecordingComplete","onCancel","onError","maxDurationMs","maxBytes","className","rest","ref","t","i18n","useTranslation","dispatch","useReducer","stream","setStream","useState","now","setNow","devices","setDevices","selectedDeviceId","setSelectedDeviceId","recorderRef","useRef","chunksRef","byteCountRef","durationAtStopRef","streamRef","unmountedRef","cancelledRef","supported","useEffect","_a","list","mics","d","handle","cleanupStream","useCallback","held","requestAndStart","nextStream","tr","mimeType","recorder","event","blob","err","errorName","pause","resume","stop","started","pausedMs","duration","cancel","alreadyElapsed","remaining","_b","elapsedMs","deviceOptions","statusText","isRecording","isPaused","hasError","jsxs","jsx","AudioVisualiser","Button","IconButton","Fragment","Square","X","Select","v","Alert"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"audio-recorder-B-8SKgKn.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mic.js","../../node_modules/lucide-react/dist/esm/icons/pause.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../src/components/audio-recorder/audio-recorder.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: \"M12 19v3\", key: \"npa21l\" }],\n [\"path\", { d: \"M19 10v2a7 7 0 0 1-14 0v-2\", key: \"1vc78b\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"13\", rx: \"3\", key: \"s6n7sd\" }]\n];\nconst Mic = createLucideIcon(\"mic\", __iconNode);\n\nexport { __iconNode, Mic as default };\n//# sourceMappingURL=mic.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.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: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mic, Pause, Play, Square, X } from 'lucide-react';\nimport { IconButton, Button } from '../button';\nimport { Select, type SelectOption } from '../select/select';\nimport { AudioVisualiser } from '../audio-visualiser';\nimport { Alert } from '../alert';\n\ntype State =\n | { kind: 'idle' }\n | { kind: 'requesting' }\n | { kind: 'recording'; startedAt: number; pausedMs: number }\n | { kind: 'paused'; startedAt: number; pausedMs: number; pausedAt: number }\n | { kind: 'stopped'; duration: number }\n | {\n kind: 'error';\n type: 'permission-denied' | 'no-device' | 'unsupported' | 'capture-failed';\n };\n\ntype Action =\n | { type: 'request' }\n | { type: 'start' }\n | { type: 'pause' }\n | { type: 'resume' }\n | { type: 'stop'; duration: number }\n | { type: 'cancel' }\n | {\n type: 'error';\n kind: 'permission-denied' | 'no-device' | 'unsupported' | 'capture-failed';\n }\n | { type: 'reset' };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'request':\n return { kind: 'requesting' };\n case 'start':\n return { kind: 'recording', startedAt: Date.now(), pausedMs: 0 };\n case 'pause':\n if (state.kind !== 'recording') return state;\n return {\n kind: 'paused',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs,\n pausedAt: Date.now(),\n };\n case 'resume':\n if (state.kind !== 'paused') return state;\n return {\n kind: 'recording',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs + (Date.now() - state.pausedAt),\n };\n case 'stop':\n return { kind: 'stopped', duration: action.duration };\n case 'cancel':\n return { kind: 'idle' };\n case 'error':\n return { kind: 'error', type: action.kind };\n case 'reset':\n return { kind: 'idle' };\n default:\n return state;\n }\n}\n\nconst rootVariants = cva(\n [\n 'ds:inline-flex ds:flex-col ds:items-stretch ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-background',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst MIME_PREFERENCES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n];\n\nfunction pickMimeType(): string | undefined {\n if (typeof MediaRecorder === 'undefined') return undefined;\n for (const mime of MIME_PREFERENCES) {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n }\n return undefined;\n}\n\nfunction formatTimer(ms: number, locale: string): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(minutes)}:${fmt(seconds)}`;\n}\n\nexport interface AudioRecorderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onError'>,\n VariantProps<typeof rootVariants> {\n /** Called on stop with the final blob + duration in ms. */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is cancelled. */\n onCancel?: () => void;\n /** Called when an error occurs. */\n onError?: (\n error:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed'\n | 'max-duration'\n | 'max-size',\n ) => void;\n /**\n * Auto-stop after this many milliseconds of active recording. Default\n * 30 minutes. Set `null` to disable.\n */\n maxDurationMs?: number | null;\n /**\n * Auto-stop when the accumulated blob chunks exceed this many bytes.\n * Default 250 MB. Set `null` to disable.\n */\n maxBytes?: number | null;\n}\n\nexport const AudioRecorder = forwardRef<HTMLDivElement, AudioRecorderProps>(\n (\n {\n size = 'md',\n onRecordingComplete,\n onCancel,\n onError,\n maxDurationMs = 30 * 60 * 1000,\n maxBytes = 250 * 1024 * 1024,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [state, dispatch] = useReducer(reducer, { kind: 'idle' });\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [now, setNow] = useState<number>(Date.now());\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n const [selectedDeviceId, setSelectedDeviceId] = useState<string>('');\n\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n // Running total of bytes accumulated in `chunksRef` — reading\n // `chunksRef.current.reduce(...)` on every ondataavailable scales\n // poorly; maintain the sum incrementally instead.\n const byteCountRef = useRef<number>(0);\n const durationAtStopRef = useRef<number>(0);\n // Tracks the *currently-held* MediaStream in a ref so the unmount\n // cleanup effect (which closes over [] deps) sees the latest value.\n // Without this, a unmount while getUserMedia is pending would never\n // stop() tracks and the browser mic indicator stays on.\n const streamRef = useRef<MediaStream | null>(null);\n // Flips to true on unmount; consulted inside the getUserMedia promise\n // resolution so we don't try to setStream() on a dead component and\n // so the freshly-acquired tracks get released immediately.\n const unmountedRef = useRef<boolean>(false);\n // Flips to true when cancel() is called; the onstop handler reads it\n // so `onRecordingComplete` is NOT invoked on a cancel path with a blank\n // blob. Reset on each recording start.\n const cancelledRef = useRef<boolean>(false);\n\n const supported = typeof MediaRecorder !== 'undefined';\n\n /* ── Enumerate devices once (after any prior permission grant) ── */\n useEffect(() => {\n if (!supported || !navigator.mediaDevices?.enumerateDevices) return;\n navigator.mediaDevices\n .enumerateDevices()\n .then((list) => {\n const mics = list.filter((d) => d.kind === 'audioinput');\n setDevices(mics);\n })\n .catch(() => {\n /* ignore */\n });\n }, [supported]);\n\n /* ── Timer tick ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n const handle = window.setInterval(() => setNow(Date.now()), 250);\n return () => window.clearInterval(handle);\n }, [state.kind]);\n\n const cleanupStream = useCallback(() => {\n const held = streamRef.current ?? stream;\n held?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, [stream]);\n\n const requestAndStart = useCallback(async () => {\n if (!supported) {\n dispatch({ type: 'error', kind: 'unsupported' });\n onError?.('unsupported');\n return;\n }\n dispatch({ type: 'request' });\n cancelledRef.current = false;\n try {\n const nextStream = await navigator.mediaDevices.getUserMedia({\n audio: selectedDeviceId\n ? { deviceId: { exact: selectedDeviceId } }\n : true,\n });\n // Guard against the component unmounting between the permission\n // prompt and the promise resolution — otherwise the freshly-acquired\n // tracks leak and the browser's mic indicator stays live.\n if (unmountedRef.current) {\n nextStream.getTracks().forEach((tr) => tr.stop());\n return;\n }\n streamRef.current = nextStream;\n setStream(nextStream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(\n nextStream,\n mimeType ? { mimeType } : undefined,\n );\n recorderRef.current = recorder;\n chunksRef.current = [];\n byteCountRef.current = 0;\n recorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n chunksRef.current.push(event.data);\n byteCountRef.current += event.data.size;\n // Byte-cap: auto-stop if the recording would exceed maxBytes.\n // Cheaper than summing on every tick; stop once and bail.\n if (\n typeof maxBytes === 'number' &&\n byteCountRef.current >= maxBytes &&\n recorderRef.current?.state === 'recording'\n ) {\n onError?.('max-size');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }\n };\n recorder.onstop = () => {\n // Cancel path: drop the blob on the floor — consumers who called\n // cancel() must not receive a silent empty recording.\n if (!cancelledRef.current) {\n const blob = new Blob(chunksRef.current, {\n type: mimeType ?? 'audio/webm',\n });\n onRecordingComplete?.(blob, durationAtStopRef.current);\n }\n chunksRef.current = [];\n recorderRef.current = null;\n nextStream.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n setStream(null);\n cancelledRef.current = false;\n };\n recorder.start(1000);\n dispatch({ type: 'start' });\n } catch (err: unknown) {\n const errorName =\n err instanceof Error ? err.name : '';\n if (errorName === 'NotAllowedError' || errorName === 'SecurityError') {\n dispatch({ type: 'error', kind: 'permission-denied' });\n onError?.('permission-denied');\n } else if (errorName === 'NotFoundError' || errorName === 'OverconstrainedError') {\n dispatch({ type: 'error', kind: 'no-device' });\n onError?.('no-device');\n } else {\n dispatch({ type: 'error', kind: 'capture-failed' });\n onError?.('capture-failed');\n }\n }\n }, [onError, onRecordingComplete, selectedDeviceId, supported]);\n\n const pause = useCallback(() => {\n recorderRef.current?.pause();\n dispatch({ type: 'pause' });\n }, []);\n\n const resume = useCallback(() => {\n recorderRef.current?.resume();\n dispatch({ type: 'resume' });\n }, []);\n\n const stop = useCallback(() => {\n if (state.kind === 'recording' || state.kind === 'paused') {\n const started = state.startedAt;\n const pausedMs = state.pausedMs;\n const duration = Date.now() - started - pausedMs;\n durationAtStopRef.current = Math.max(0, duration);\n dispatch({ type: 'stop', duration: duration });\n }\n try {\n recorderRef.current?.stop();\n } catch {\n /* stop() throws on non-recording state; safe to swallow */\n }\n }, [state]);\n\n const cancel = useCallback(() => {\n // Flip the cancelled flag BEFORE asking MediaRecorder to stop so the\n // async onstop handler sees it and skips onRecordingComplete.\n cancelledRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n chunksRef.current = [];\n recorderRef.current = null;\n cleanupStream();\n dispatch({ type: 'cancel' });\n onCancel?.();\n }, [cleanupStream, onCancel]);\n\n /* ── Max-duration auto-stop ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n if (typeof maxDurationMs !== 'number' || maxDurationMs <= 0) return;\n const alreadyElapsed = Date.now() - state.startedAt - state.pausedMs;\n const remaining = Math.max(0, maxDurationMs - alreadyElapsed);\n const handle = window.setTimeout(() => {\n if (recorderRef.current?.state === 'recording') {\n onError?.('max-duration');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }, remaining);\n return () => window.clearTimeout(handle);\n }, [state, maxDurationMs, onError]);\n\n /* ── Unmount cleanup: release mic if still held ── */\n useEffect(() => {\n return () => {\n unmountedRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n // Use streamRef so we see a stream that was acquired by an\n // in-flight getUserMedia resolution — not just the one captured\n // by the closure at mount.\n streamRef.current?.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n };\n }, []);\n\n const elapsedMs =\n state.kind === 'recording'\n ? now - state.startedAt - state.pausedMs\n : state.kind === 'paused'\n ? state.pausedAt - state.startedAt - state.pausedMs\n : state.kind === 'stopped'\n ? state.duration\n : 0;\n\n const deviceOptions: SelectOption<string>[] = devices.map((d) => ({\n value: d.deviceId,\n label: d.label || t('ui.chat.audio.selectDevice'),\n }));\n\n const statusText = (() => {\n switch (state.kind) {\n case 'idle':\n return t('ui.chat.audio.idle');\n case 'requesting':\n return t('ui.common.loading');\n case 'recording':\n return t('ui.chat.audio.recording');\n case 'paused':\n return t('ui.chat.audio.paused');\n case 'stopped':\n return t('ui.chat.audio.idle');\n case 'error':\n if (state.type === 'permission-denied')\n return t('ui.chat.audio.permissionDenied');\n if (state.type === 'unsupported')\n return t('ui.chat.audio.unsupported');\n return t('ui.chat.audio.idle');\n }\n })();\n\n const isRecording = state.kind === 'recording';\n const isPaused = state.kind === 'paused';\n const hasError = state.kind === 'error';\n\n return (\n <div\n ref={ref}\n data-component=\"audio-recorder\"\n className={rootVariants({ size, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:inline-flex ds:size-3 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)]',\n isRecording\n ? 'ds:bg-[color:var(--destructive)]'\n : 'ds:bg-[color:var(--muted)]',\n ].join(' ')}\n >\n {isRecording ? (\n <span\n className={[\n 'ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)]',\n 'ds:motion-safe:animate-[recorder-pulse_1.2s_ease-out_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n ) : null}\n </span>\n <AudioVisualiser\n stream={stream}\n size=\"sm\"\n aria-hidden=\"true\"\n className=\"ds:flex-1\"\n />\n <time\n dir=\"ltr\"\n aria-hidden=\"true\"\n className=\"ds:tabular-nums type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {formatTimer(elapsedMs, i18n.language)}\n </time>\n </div>\n\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {statusText}\n </span>\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {state.kind === 'idle' || state.kind === 'stopped' || hasError ? (\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Mic />}\n onClick={requestAndStart}\n disabled={!supported}\n >\n {t('ui.chat.audio.record')}\n </Button>\n ) : null}\n {isRecording ? (\n <IconButton\n icon={<Pause />}\n aria-label={t('ui.chat.audio.pause')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={pause}\n />\n ) : null}\n {isPaused ? (\n <IconButton\n icon={<Play />}\n aria-label={t('ui.chat.audio.resume')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={resume}\n />\n ) : null}\n {(isRecording || isPaused) ? (\n <>\n <IconButton\n icon={<Square />}\n aria-label={t('ui.chat.audio.stop')}\n intent=\"primary\"\n size=\"sm\"\n onClick={stop}\n />\n <IconButton\n icon={<X />}\n aria-label={t('ui.chat.audio.cancel')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={cancel}\n />\n </>\n ) : null}\n {state.kind === 'idle' && deviceOptions.length > 1 ? (\n <div className=\"ds:ms-auto ds:min-w-[160px]\">\n <Select\n aria-label={t('ui.chat.audio.selectDevice')}\n options={deviceOptions}\n value={selectedDeviceId}\n onValueChange={(v) => setSelectedDeviceId(v)}\n size=\"sm\"\n clearable\n />\n </div>\n ) : null}\n </div>\n\n {hasError && state.kind === 'error' ? (\n <Alert variant=\"error\" live=\"polite\">\n <Alert.Description>{statusText}</Alert.Description>\n {state.type === 'permission-denied' ? (\n <Alert.Action>\n <Button intent=\"ghost\" size=\"sm\" onClick={requestAndStart}>\n {t('ui.chat.audio.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n ) : null}\n </div>\n );\n },\n);\n\nAudioRecorder.displayName = 'AudioRecorder';\n"],"names":["__iconNode","Mic","createLucideIcon","Pause","Play","reducer","state","action","rootVariants","cva","MIME_PREFERENCES","pickMimeType","mime","formatTimer","ms","locale","total","minutes","seconds","fmt","n","AudioRecorder","forwardRef","size","onRecordingComplete","onCancel","onError","maxDurationMs","maxBytes","className","rest","ref","t","i18n","useTranslation","dispatch","useReducer","stream","setStream","useState","now","setNow","devices","setDevices","selectedDeviceId","setSelectedDeviceId","recorderRef","useRef","chunksRef","byteCountRef","durationAtStopRef","streamRef","unmountedRef","cancelledRef","supported","useEffect","_a","list","mics","d","handle","cleanupStream","useCallback","held","requestAndStart","nextStream","tr","mimeType","recorder","event","blob","err","errorName","pause","resume","stop","started","pausedMs","duration","cancel","alreadyElapsed","remaining","_b","elapsedMs","deviceOptions","statusText","isRecording","isPaused","hasError","jsxs","jsx","AudioVisualiser","Button","IconButton","Fragment","Square","X","Select","v","Alert"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -8,7 +8,7 @@ import { S as ce } from "./spinner-GCcv67vh.js";
8
8
  import { u as Ye } from "./form-field-context-94LwgYTQ.js";
9
9
  import { u as Ze } from "./use-debounced-callback-BisrB-Fq.js";
10
10
  import { g as et } from "./group-options-BvKhQ3xb.js";
11
- import { I as tt, a as Q, b as X, c as st } from "./input-surface-D5OMCB1W.js";
11
+ import { I as tt, a as Q, b as X, c as st } from "./input-surface-u4QB0lxe.js";
12
12
  const ot = B(
13
13
  ["ds:flex ds:w-full ds:items-center", st].join(" "),
14
14
  {
@@ -58,12 +58,12 @@ const ot = B(
58
58
  "ds:hover:bg-muted ds:data-[selected=true]:hover:bg-primary"
59
59
  ].join(" ")
60
60
  ), me = [
61
- "[&_[cmdk-group-heading]]:ps-3",
62
- "[&_[cmdk-group-heading]]:pe-3",
63
- "[&_[cmdk-group-heading]]:py-1.5",
64
- "[&_[cmdk-group-heading]]:type-eyebrow",
65
- "[&_[cmdk-group-heading]]:text-muted-foreground"
66
- ].join(" "), q = "inline-flex items-center shrink-0 text-muted-foreground [&_svg]:size-4";
61
+ "ds:[&_[cmdk-group-heading]]:ps-3",
62
+ "ds:[&_[cmdk-group-heading]]:pe-3",
63
+ "ds:[&_[cmdk-group-heading]]:py-1.5",
64
+ "ds:[&_[cmdk-group-heading]]:type-eyebrow",
65
+ "ds:[&_[cmdk-group-heading]]:text-muted-foreground"
66
+ ].join(" "), q = "ds:inline-flex ds:items-center ds:shrink-0 ds:text-muted-foreground ds:[&_svg]:size-4";
67
67
  function J(N, f, T) {
68
68
  return `${N}-${f}-${T}`;
69
69
  }
@@ -96,7 +96,7 @@ const rt = Je(
96
96
  }, w) {
97
97
  const { t: x, i18n: Ne } = We(), y = Ye(), Ee = Se(), u = ke ?? y.id ?? Ee, Z = `${u}-listbox`, Ve = `${u}-live`, c = !!(y.disabled || we), $e = !!(y.required || xe), ee = y.invalid, Ie = ee ? "error" : be ?? "default", Re = y.describedBy || void 0, P = S !== void 0, [_e, De] = C(
98
98
  ge ?? ""
99
- ), r = P ? S : _e, [p, i] = C(!1), [v, te] = C([]), [k, j] = C(!1), [d, Fe] = C(""), V = m(!1), U = m(null), G = m(r), se = m(/* @__PURE__ */ new Map()), oe = m(/* @__PURE__ */ new Map()), H = m(null), L = m(null), Be = D(
99
+ ), r = P ? S : _e, [p, d] = C(!1), [v, te] = C([]), [k, j] = C(!1), [i, Fe] = C(""), V = m(!1), U = m(null), G = m(r), se = m(/* @__PURE__ */ new Map()), oe = m(/* @__PURE__ */ new Map()), H = m(null), L = m(null), Be = D(
100
100
  (e) => {
101
101
  H.current = e, typeof w == "function" ? w(e) : w && (w.current = e);
102
102
  },
@@ -143,7 +143,7 @@ const rt = Je(
143
143
  },
144
144
  []
145
145
  ), Ae = (e) => {
146
- $(e), !(c || h) && (p || i(!0), !V.current && b(e));
146
+ $(e), !(c || h) && (p || d(!0), !V.current && b(e));
147
147
  }, ze = (e) => {
148
148
  V.current = !0;
149
149
  }, Me = (e) => {
@@ -151,34 +151,34 @@ const rt = Je(
151
151
  const t = e.currentTarget.value;
152
152
  b(t);
153
153
  }, Pe = (e) => {
154
- c || h || (i(!0), r && b(r));
154
+ c || h || (d(!0), r && b(r));
155
155
  }, je = (e) => {
156
156
  const t = e.relatedTarget;
157
157
  if (!(t && L.current && L.current.contains(t))) {
158
- if (he && d) {
159
- const s = ae(d);
158
+ if (he && i) {
159
+ const s = ae(i);
160
160
  s && ($(s.option.label), a == null || a(s.option));
161
161
  }
162
- i(!1);
162
+ d(!1);
163
163
  }
164
164
  }, Ue = (e) => {
165
165
  if (!e.nativeEvent.isComposing) {
166
166
  if (e.key === "Escape") {
167
- p && (e.preventDefault(), e.stopPropagation(), i(!1));
167
+ p && (e.preventDefault(), e.stopPropagation(), d(!1));
168
168
  return;
169
169
  }
170
170
  if (e.key === "ArrowDown" && !p) {
171
- e.preventDefault(), i(!0), r && b(r);
171
+ e.preventDefault(), d(!0), r && b(r);
172
172
  return;
173
173
  }
174
- if (e.key === "Tab" && p && d) {
175
- const t = ae(d);
176
- t && ($(t.option.label), a == null || a(t.option), i(!1));
174
+ if (e.key === "Tab" && p && i) {
175
+ const t = ae(i);
176
+ t && ($(t.option.label), a == null || a(t.option), d(!1));
177
177
  }
178
178
  }
179
179
  }, re = (e, t) => {
180
180
  var s;
181
- $(t.label), e === "recent" ? A == null || A(t) : a == null || a(t), i(!1), (s = H.current) == null || s.focus();
181
+ $(t.label), e === "recent" ? A == null || A(t) : a == null || a(t), d(!1), (s = H.current) == null || s.focus();
182
182
  }, K = (e) => {
183
183
  e.preventDefault();
184
184
  }, I = !!(g && g.length > 0) && r.length === 0, Ge = ue(
@@ -189,11 +189,11 @@ const rt = Je(
189
189
  tone: Ie,
190
190
  className: Ce
191
191
  }), Oe = ue(() => {
192
- if (!d) return;
193
- const [e, t] = d.split(":");
192
+ if (!i) return;
193
+ const [e, t] = i.split(":");
194
194
  if (!(!t || e !== "recent" && e !== "option"))
195
195
  return J(u, e, t);
196
- }, [d, u]), R = v.length > 0, ie = !I && !R && !k && r.length > 0, de = k && !R, Qe = I || R || ie || de, Xe = v.length, qe = k ? x("ui.common.loading", "Loading…") : p && r.length > 0 ? x("ui.inputs.autocomplete.results", {
196
+ }, [i, u]), R = v.length > 0, de = !I && !R && !k && r.length > 0, ie = k && !R, Qe = I || R || de || ie, Xe = v.length, qe = k ? x("ui.common.loading", "Loading…") : p && r.length > 0 ? x("ui.inputs.autocomplete.results", {
197
197
  count: Xe,
198
198
  defaultValue: "{{count}} results"
199
199
  }) : "";
@@ -201,7 +201,7 @@ const rt = Je(
201
201
  l,
202
202
  {
203
203
  shouldFilter: !1,
204
- value: d,
204
+ value: i,
205
205
  onValueChange: Fe,
206
206
  label: Y ?? W,
207
207
  className: "ds:w-full",
@@ -278,9 +278,9 @@ const rt = Je(
278
278
  e.preventDefault();
279
279
  return;
280
280
  }
281
- i(!1);
281
+ d(!1);
282
282
  },
283
- onEscapeKeyDown: () => i(!1),
283
+ onEscapeKeyDown: () => d(!1),
284
284
  onMouseDown: K,
285
285
  className: at(),
286
286
  children: /* @__PURE__ */ _(
@@ -309,8 +309,8 @@ const rt = Je(
309
309
  ))
310
310
  }
311
311
  ) : null,
312
- ie ? /* @__PURE__ */ o("div", { className: "ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground", children: x("ui.inputs.autocomplete.noResults", "No results") }) : null,
313
- de ? /* @__PURE__ */ _("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground", children: [
312
+ de ? /* @__PURE__ */ o("div", { className: "ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground", children: x("ui.inputs.autocomplete.noResults", "No results") }) : null,
313
+ ie ? /* @__PURE__ */ _("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground", children: [
314
314
  /* @__PURE__ */ o(ce, { size: "sm" }),
315
315
  /* @__PURE__ */ o("span", { children: x("ui.common.loading", "Loading…") })
316
316
  ] }) : null,
@@ -349,8 +349,8 @@ const rt = Je(
349
349
  }
350
350
  );
351
351
  }
352
- ), it = rt;
353
- it.displayName = "Autocomplete";
352
+ ), dt = rt;
353
+ dt.displayName = "Autocomplete";
354
354
  const bt = {
355
355
  id: "autocomplete",
356
356
  capabilities: ["filter", "pick", "open", "close"],
@@ -365,8 +365,8 @@ const bt = {
365
365
  }
366
366
  };
367
367
  export {
368
- it as A,
368
+ dt as A,
369
369
  bt as a,
370
370
  ot as b
371
371
  };
372
- //# sourceMappingURL=autocomplete.agent-DRrp-Rsx.js.map
372
+ //# sourceMappingURL=autocomplete.agent-DqOy0_1P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.agent-DqOy0_1P.js","sources":["../../src/components/autocomplete/autocomplete.tsx","../../src/components/autocomplete/autocomplete.agent.ts"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CompositionEvent,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type Ref,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Command } from 'cmdk';\nimport * as Popover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../spinner/spinner';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useDebouncedCallback } from '../_shared/use-debounced-callback';\nimport type { OptionShape } from '../_shared/option';\nimport { groupOptions } from '../_shared/group-options';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\n\n// ---------------------------------------------------------------------------\n// CVA — sizing / chrome tokens come from _shared/input-surface so the four\n// input surfaces (TextInput, Autocomplete, Combobox, MultiSelect) cannot drift.\n// ---------------------------------------------------------------------------\n\nconst autocompleteVariants = cva(\n ['ds:flex ds:w-full ds:items-center', INPUT_SURFACE_CHROME].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 },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst inputVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0 ds:bg-transparent ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed',\n 'ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n hasStart: { true: 'ds:ps-2', false: 'ds:ps-3' },\n hasEnd: { true: 'ds:pe-2', false: 'ds:pe-3' },\n },\n defaultVariants: { hasStart: false, hasEnd: false },\n },\n);\n\nconst contentVariants = cva(\n [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:shadow-[var(--shadow-md)]',\n 'ds:w-[var(--radix-popover-trigger-width)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst itemVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-3 ds:pe-3 ds:py-2 ds:text-[length:var(--font-size-sm)] ds:text-foreground',\n 'ds:rounded-[var(--radius-sm)] ds:select-none ds:cursor-pointer',\n 'ds:data-[disabled=true]:pointer-events-none ds:data-[disabled=true]:opacity-50',\n 'ds:data-[selected=true]:bg-primary ds:data-[selected=true]:text-primary-foreground',\n 'ds:hover:bg-muted ds:data-[selected=true]:hover:bg-primary',\n ].join(' '),\n);\n\nconst groupClasses = [\n 'ds:[&_[cmdk-group-heading]]:ps-3',\n 'ds:[&_[cmdk-group-heading]]:pe-3',\n 'ds:[&_[cmdk-group-heading]]:py-1.5',\n 'ds:[&_[cmdk-group-heading]]:type-eyebrow',\n 'ds:[&_[cmdk-group-heading]]:text-muted-foreground',\n].join(' ');\n\nconst adornmentBase =\n 'ds:inline-flex ds:items-center ds:shrink-0 ds:text-muted-foreground ds:[&_svg]:size-4';\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\ntype CVAProps = VariantProps<typeof autocompleteVariants>;\n\nexport interface AutocompleteProps<T extends string = string>\n extends Pick<CVAProps, 'size' | 'tone'> {\n loadOptions: (\n query: string,\n opts: { signal: AbortSignal; locale: string },\n ) => Promise<OptionShape<T>[]>;\n debounceMs?: number;\n\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSelect?: (option: OptionShape<T>) => void;\n\n recents?: OptionShape<T>[];\n onRecentSelect?: (option: OptionShape<T>) => void;\n\n snapOnBlur?: boolean;\n\n startAdornment?: ReactNode;\n endAdornment?: ReactNode;\n placeholder?: string;\n\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction itemIdFor(idPrefix: string, kind: 'recent' | 'option', value: string) {\n return `${idPrefix}-${kind}-${value}`;\n}\n\nfunction cmdkValueFor(kind: 'recent' | 'option', value: string) {\n return `${kind}:${value}`;\n}\n\nconst AutocompleteImpl = forwardRef<HTMLInputElement, AutocompleteProps>(\n function Autocomplete(\n {\n loadOptions,\n debounceMs = 250,\n value,\n defaultValue,\n onChange,\n onSelect,\n recents,\n onRecentSelect,\n snapOnBlur = false,\n size = 'md',\n tone = 'default',\n startAdornment,\n endAdornment,\n placeholder,\n disabled,\n readOnly,\n required,\n name,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n\n const reactId = useId();\n const idPrefix = id ?? ctx.id ?? reactId;\n const listId = `${idPrefix}-listbox`;\n const liveRegionId = `${idPrefix}-live`;\n\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n const effectiveRequired = Boolean(ctx.required || required);\n const effectiveInvalid = ctx.invalid;\n const effectiveTone: 'default' | 'error' = effectiveInvalid\n ? 'error'\n : (tone ?? 'default');\n const describedBy = ctx.describedBy || undefined;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? value : internalValue;\n\n const [open, setOpen] = useState(false);\n const [suggestions, setSuggestions] = useState<OptionShape[]>([]);\n const [loading, setLoading] = useState(false);\n const [cmdkValue, setCmdkValue] = useState<string>('');\n\n const composingRef = useRef(false);\n const abortRef = useRef<AbortController | null>(null);\n const latestQueryRef = useRef<string>(currentValue);\n const suggestionsByValueRef = useRef<Map<string, OptionShape>>(new Map());\n const recentsByValueRef = useRef<Map<string, OptionShape>>(new Map());\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const locale = i18n.language;\n\n useEffect(() => {\n const map = new Map<string, OptionShape>();\n for (const option of suggestions) map.set(option.value, option);\n suggestionsByValueRef.current = map;\n }, [suggestions]);\n\n useEffect(() => {\n const map = new Map<string, OptionShape>();\n if (recents) for (const option of recents) map.set(option.value, option);\n recentsByValueRef.current = map;\n }, [recents]);\n\n const runFetch = useCallback(\n (query: string) => {\n if (effectiveDisabled || readOnly) return;\n if (composingRef.current) return;\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n latestQueryRef.current = query;\n setLoading(true);\n loadOptions(query, { signal: controller.signal, locale })\n .then((results) => {\n if (controller.signal.aborted) return;\n if (latestQueryRef.current !== query) return;\n setSuggestions(results);\n setLoading(false);\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name?: string }).name === 'AbortError'\n ) {\n return;\n }\n if (latestQueryRef.current !== query) return;\n setSuggestions([]);\n setLoading(false);\n });\n },\n [effectiveDisabled, readOnly, loadOptions, locale],\n );\n\n const debouncedFetch = useDebouncedCallback(runFetch, debounceMs);\n\n useEffect(() => {\n return () => {\n debouncedFetch.cancel();\n abortRef.current?.abort();\n };\n }, [debouncedFetch]);\n\n const commitValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n const resolveCmdkValue = useCallback(\n (raw: string): { kind: 'recent' | 'option'; option: OptionShape } | null => {\n const [kind, val] = raw.split(':');\n if (!val || (kind !== 'recent' && kind !== 'option')) return null;\n const lookup =\n kind === 'recent'\n ? recentsByValueRef.current\n : suggestionsByValueRef.current;\n const option = lookup.get(val);\n return option ? { kind, option } : null;\n },\n [],\n );\n\n const handleInputValueChange = (next: string) => {\n commitValue(next);\n if (effectiveDisabled || readOnly) return;\n if (!open) setOpen(true);\n if (composingRef.current) return;\n debouncedFetch(next);\n };\n\n const handleCompositionStart = (\n _event: CompositionEvent<HTMLInputElement>,\n ) => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = false;\n const next = event.currentTarget.value;\n debouncedFetch(next);\n };\n\n const handleFocus = (_event: FocusEvent<HTMLInputElement>) => {\n if (effectiveDisabled || readOnly) return;\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n const next = event.relatedTarget as Node | null;\n // Focus moved into the popover — keep listbox open (pointer-down on item\n // moves focus into the portal but we treat that as \"still interacting\").\n if (next && contentRef.current && contentRef.current.contains(next)) {\n return;\n }\n if (snapOnBlur && cmdkValue) {\n const resolved = resolveCmdkValue(cmdkValue);\n if (resolved) {\n commitValue(resolved.option.label);\n onSelect?.(resolved.option);\n }\n }\n setOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n }\n return;\n }\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n if (currentValue) debouncedFetch(currentValue);\n return;\n }\n if (event.key === 'Tab' && open && cmdkValue) {\n const resolved = resolveCmdkValue(cmdkValue);\n if (resolved) {\n commitValue(resolved.option.label);\n onSelect?.(resolved.option);\n setOpen(false);\n }\n }\n };\n\n const handleItemSelect = (\n kind: 'recent' | 'option',\n option: OptionShape,\n ) => {\n commitValue(option.label);\n if (kind === 'recent') onRecentSelect?.(option);\n else onSelect?.(option);\n setOpen(false);\n inputRef.current?.focus();\n };\n\n // Prevent input blur when clicking an item — keeps focus management predictable.\n const preventBlur = (event: MouseEvent<HTMLElement>) => {\n event.preventDefault();\n };\n\n const showRecents =\n Boolean(recents && recents.length > 0) && currentValue.length === 0;\n const groupedSuggestions = useMemo(\n () => groupOptions(suggestions),\n [suggestions],\n );\n\n const hasStart = Boolean(startAdornment);\n const hasEnd = Boolean(endAdornment) || loading;\n\n const wrapperClass = autocompleteVariants({\n size,\n tone: effectiveTone,\n className,\n });\n\n const activeDescendant = useMemo(() => {\n if (!cmdkValue) return undefined;\n const [kind, val] = cmdkValue.split(':');\n if (!val || (kind !== 'recent' && kind !== 'option')) return undefined;\n return itemIdFor(idPrefix, kind, val);\n }, [cmdkValue, idPrefix]);\n\n const hasSuggestions = suggestions.length > 0;\n const showEmpty =\n !showRecents && !hasSuggestions && !loading && currentValue.length > 0;\n const showLoadingRow = loading && !hasSuggestions;\n // Suppress the popover when there is nothing to render — prevents an empty\n // 1-line strip appearing under the input on focus with no query + no recents.\n const hasPopoverContent =\n showRecents || hasSuggestions || showEmpty || showLoadingRow;\n\n const resultCount = suggestions.length;\n const liveMessage = loading\n ? t('ui.common.loading', 'Loading…')\n : open && currentValue.length > 0\n ? t('ui.inputs.autocomplete.results', {\n count: resultCount,\n defaultValue: '{{count}} results',\n })\n : '';\n\n return (\n <Command\n shouldFilter={false}\n value={cmdkValue}\n onValueChange={setCmdkValue}\n label={ariaLabel ?? placeholder}\n className=\"ds:w-full\"\n >\n <Popover.Root\n open={open && !effectiveDisabled && !readOnly && hasPopoverContent}\n >\n <Popover.Anchor asChild>\n <div\n className={wrapperClass}\n data-component=\"autocomplete\"\n data-disabled={effectiveDisabled || undefined}\n >\n {startAdornment ? (\n <span aria-hidden=\"true\" className={`${adornmentBase} ds:ps-3`}>\n {startAdornment}\n </span>\n ) : null}\n <Command.Input\n ref={setRefs}\n id={idPrefix}\n name={name}\n placeholder={placeholder}\n value={currentValue}\n onValueChange={handleInputValueChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n required={effectiveRequired}\n role=\"combobox\"\n aria-autocomplete=\"both\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={activeDescendant}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n aria-label={ariaLabel}\n autoComplete=\"off\"\n className={inputVariants({ hasStart, hasEnd })}\n />\n {loading ? (\n <span className={`${adornmentBase} ds:pe-3`} aria-hidden=\"true\">\n <Spinner size=\"sm\" />\n </span>\n ) : endAdornment ? (\n <span aria-hidden=\"true\" className={`${adornmentBase} ds:pe-3`}>\n {endAdornment}\n </span>\n ) : null}\n <span\n id={liveRegionId}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </span>\n </div>\n </Popover.Anchor>\n <Popover.Portal>\n <Popover.Content\n ref={contentRef}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => {\n const target = event.target as Node | null;\n if (target && inputRef.current?.contains(target)) {\n event.preventDefault();\n return;\n }\n setOpen(false);\n }}\n onEscapeKeyDown={() => setOpen(false)}\n onMouseDown={preventBlur}\n className={contentVariants()}\n >\n <Command.List\n id={listId}\n className=\"ds:max-h-[min(24rem,var(--radix-popover-content-available-height))] ds:overflow-auto ds:p-1\"\n >\n {showRecents ? (\n <Command.Group\n heading={t('ui.inputs.autocomplete.recent', 'Recent')}\n className={groupClasses}\n >\n {(recents ?? []).map((option) => (\n <Command.Item\n key={`recent-${option.value}`}\n id={itemIdFor(idPrefix, 'recent', option.value)}\n value={cmdkValueFor('recent', option.value)}\n disabled={option.disabled}\n onSelect={() => handleItemSelect('recent', option)}\n onMouseDown={preventBlur}\n className={itemVariants()}\n >\n {option.label}\n </Command.Item>\n ))}\n </Command.Group>\n ) : null}\n {showEmpty ? (\n <div className=\"ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground\">\n {t('ui.inputs.autocomplete.noResults', 'No results')}\n </div>\n ) : null}\n {showLoadingRow ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground\">\n <Spinner size=\"sm\" />\n <span>{t('ui.common.loading', 'Loading…')}</span>\n </div>\n ) : null}\n {!showRecents && hasSuggestions\n ? groupedSuggestions.map((group, index) => {\n const body = group.items.map((option) => (\n <Command.Item\n key={`option-${option.value}`}\n id={itemIdFor(idPrefix, 'option', option.value)}\n value={cmdkValueFor('option', option.value)}\n disabled={option.disabled}\n onSelect={() => handleItemSelect('option', option)}\n onMouseDown={preventBlur}\n className={itemVariants()}\n >\n {option.label}\n </Command.Item>\n ));\n if (!group.group) {\n return (\n <Command.Group key={`group-${index}`}>\n {body}\n </Command.Group>\n );\n }\n return (\n <Command.Group\n key={`group-${group.group}`}\n heading={group.group}\n className={groupClasses}\n >\n {body}\n </Command.Group>\n );\n })\n : null}\n </Command.List>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n </Command>\n );\n },\n);\n\ninterface AutocompleteComponent {\n <T extends string = string>(\n props: AutocompleteProps<T> & { ref?: Ref<HTMLInputElement> },\n ): ReactElement | null;\n displayName?: string;\n}\n\nexport const Autocomplete = AutocompleteImpl as unknown as AutocompleteComponent;\n(Autocomplete as { displayName?: string }).displayName = 'Autocomplete';\n\nexport { autocompleteVariants };\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const autocompleteAgent: AgentAdapter<unknown> = {\n id: 'autocomplete',\n capabilities: ['filter', 'pick', 'open', 'close'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'autocomplete' },\n item: {\n attr: 'data-option-id',\n description: 'Each suggestion emits its value as data-option-id.',\n },\n },\n};\n"],"names":["autocompleteVariants","cva","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","inputVariants","contentVariants","itemVariants","groupClasses","adornmentBase","itemIdFor","idPrefix","kind","value","cmdkValueFor","AutocompleteImpl","forwardRef","loadOptions","debounceMs","defaultValue","onChange","onSelect","recents","onRecentSelect","snapOnBlur","size","tone","startAdornment","endAdornment","placeholder","disabled","readOnly","required","name","id","className","ariaLabel","ref","t","i18n","useTranslation","ctx","useFormField","reactId","useId","listId","liveRegionId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","suggestions","setSuggestions","loading","setLoading","cmdkValue","setCmdkValue","composingRef","useRef","abortRef","latestQueryRef","suggestionsByValueRef","recentsByValueRef","inputRef","contentRef","setRefs","useCallback","node","locale","useEffect","map","option","runFetch","query","_a","controller","results","error","debouncedFetch","useDebouncedCallback","commitValue","next","resolveCmdkValue","raw","val","handleInputValueChange","handleCompositionStart","_event","handleCompositionEnd","event","handleFocus","handleBlur","resolved","handleKeyDown","handleItemSelect","preventBlur","showRecents","groupedSuggestions","useMemo","groupOptions","hasStart","hasEnd","wrapperClass","activeDescendant","hasSuggestions","showEmpty","showLoadingRow","hasPopoverContent","resultCount","liveMessage","jsx","Command","jsxs","Popover","Spinner","target","group","index","body","Autocomplete","autocompleteAgent"],"mappings":"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"}
@@ -10,22 +10,22 @@ function R(s) {
10
10
  return e;
11
11
  }
12
12
  const i = [
13
- "bg-[var(--color-violet-500)]",
14
- "bg-[var(--color-violet-600)]",
15
- "bg-[var(--color-violet-700)]",
16
- "bg-[var(--color-violet-800)]",
17
- "bg-[var(--color-violet-900)]",
18
- "bg-[var(--color-purple-700)]",
19
- "bg-[var(--color-purple-800)]",
20
- "bg-[var(--color-purple-900)]",
21
- "bg-[var(--color-magenta-700)]",
22
- "bg-[var(--color-magenta-800)]",
23
- "bg-[var(--color-magenta-900)]",
24
- "bg-[var(--color-blue-300)]",
25
- "bg-[var(--color-blue-400)]",
26
- "bg-[var(--color-blue-500)]",
27
- "bg-[var(--color-blue-700)]",
28
- "bg-[var(--color-grey-900)]"
13
+ "ds:bg-[var(--color-violet-500)]",
14
+ "ds:bg-[var(--color-violet-600)]",
15
+ "ds:bg-[var(--color-violet-700)]",
16
+ "ds:bg-[var(--color-violet-800)]",
17
+ "ds:bg-[var(--color-violet-900)]",
18
+ "ds:bg-[var(--color-purple-700)]",
19
+ "ds:bg-[var(--color-purple-800)]",
20
+ "ds:bg-[var(--color-purple-900)]",
21
+ "ds:bg-[var(--color-magenta-700)]",
22
+ "ds:bg-[var(--color-magenta-800)]",
23
+ "ds:bg-[var(--color-magenta-900)]",
24
+ "ds:bg-[var(--color-blue-300)]",
25
+ "ds:bg-[var(--color-blue-400)]",
26
+ "ds:bg-[var(--color-blue-500)]",
27
+ "ds:bg-[var(--color-blue-700)]",
28
+ "ds:bg-[var(--color-grey-900)]"
29
29
  ];
30
30
  function S(s) {
31
31
  return i[R(s) % i.length];
@@ -66,9 +66,9 @@ const T = N(
66
66
  const a = l.current;
67
67
  a && (o ? a.style.setProperty("--avatar-color-override", o) : a.style.removeProperty("--avatar-color-override"));
68
68
  }, [o]);
69
- const r = !!s && !b, m = !r && !!e, h = !r && !e, p = o ? "bg-[var(--avatar-color-override)]" : e ? S(e) : "bg-muted", x = T({
69
+ const r = !!s && !b, m = !r && !!e, h = !r && !e, p = o ? "ds:bg-[var(--avatar-color-override)]" : e ? S(e) : "ds:bg-muted", x = T({
70
70
  size: d,
71
- className: [p, o || e ? "text-[var(--primary-foreground)]" : "text-muted-foreground", c].filter(Boolean).join(" ")
71
+ className: [p, o || e ? "ds:text-[var(--primary-foreground)]" : "ds:text-muted-foreground", c].filter(Boolean).join(" ")
72
72
  }), z = e ?? g("ui.avatar.placeholder", "User avatar");
73
73
  return /* @__PURE__ */ C(
74
74
  "span",
@@ -111,4 +111,4 @@ export {
111
111
  L as g,
112
112
  S as n
113
113
  };
114
- //# sourceMappingURL=avatar-Biffh-_H.js.map
114
+ //# sourceMappingURL=avatar-Dcr6XuDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-Dcr6XuDQ.js","sources":["../../src/components/avatar/avatar.tsx"],"sourcesContent":["import { forwardRef, useEffect, useLayoutEffect, useRef, useState, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { composeRefs } from '../_shared/compose-refs';\n\n// ── Hash ──────────────────────────────────────────────────────────────────────\n\n/** djb2 hash — fast, unsigned 32-bit, stable across calls. */\nfunction djb2(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n hash = hash >>> 0; // coerce to unsigned 32-bit integer\n }\n return hash;\n}\n\n/**\n * 16 brand hues — all verified ≥ 4.5 : 1 contrast against white\n * (var(--primary-foreground)) using the WCAG 2.x relative-luminance formula.\n * Spans four distinct hue families for good visual distribution.\n *\n * Index | Token | Contrast | Visual character\n * 0 | --color-violet-500 | 4.74 : 1 | bright violet\n * 1 | --color-violet-600 | 5.53 : 1 | medium violet\n * 2 | --color-violet-700 | 7.29 : 1 | dark violet\n * 3 | --color-violet-800 | 9.57 : 1 | deep violet\n * 4 | --color-violet-900 | 12.06 : 1 | midnight violet\n * 5 | --color-purple-700 | 5.21 : 1 | medium purple\n * 6 | --color-purple-800 | 7.52 : 1 | dark purple\n * 7 | --color-purple-900 | 10.40 : 1 | deep purple\n * 8 | --color-magenta-700 | 6.01 : 1 | vivid magenta\n * 9 | --color-magenta-800 | 8.05 : 1 | dark magenta\n * 10 | --color-magenta-900 | 11.20 : 1 | deep magenta\n * 11 | --color-blue-300 | 4.64 : 1 | slate / steel blue\n * 12 | --color-blue-400 | 6.95 : 1 | medium slate\n * 13 | --color-blue-500 | 13.00 : 1 | deep navy\n * 14 | --color-blue-700 | 17.82 : 1 | midnight navy\n * 15 | --color-grey-900 | 5.78 : 1 | warm charcoal\n */\nconst INITIALS_BG_CLASSES = [\n 'ds:bg-[var(--color-violet-500)]',\n 'ds:bg-[var(--color-violet-600)]',\n 'ds:bg-[var(--color-violet-700)]',\n 'ds:bg-[var(--color-violet-800)]',\n 'ds:bg-[var(--color-violet-900)]',\n 'ds:bg-[var(--color-purple-700)]',\n 'ds:bg-[var(--color-purple-800)]',\n 'ds:bg-[var(--color-purple-900)]',\n 'ds:bg-[var(--color-magenta-700)]',\n 'ds:bg-[var(--color-magenta-800)]',\n 'ds:bg-[var(--color-magenta-900)]',\n 'ds:bg-[var(--color-blue-300)]',\n 'ds:bg-[var(--color-blue-400)]',\n 'ds:bg-[var(--color-blue-500)]',\n 'ds:bg-[var(--color-blue-700)]',\n 'ds:bg-[var(--color-grey-900)]',\n] as const;\n\n/** Deterministically maps a name string to one of 16 brand-hue Tailwind classes. Same name always produces the same class. */\nexport function nameToColorClass(name: string): string {\n return INITIALS_BG_CLASSES[djb2(name) % INITIALS_BG_CLASSES.length];\n}\n\n/**\n * Extracts 1–2 uppercase initials:\n * - Single-word name: first two characters (\"John\" → \"JO\")\n * - Multi-word name: first char of first word + first char of last word (\"John Doe\" → \"JD\")\n */\nexport function getInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '';\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n}\n\n// ── CVA ───────────────────────────────────────────────────────────────────────\n\nconst avatarVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:shrink-0 ds:select-none ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-full)]',\n // Focus ring — uses design-system tokens so theme overrides (accessible: 3px) apply automatically.\n // The ring renders when Avatar is placed inside a focusable ancestor (e.g. a <button>).\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-ring',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n size: {\n // text-[var(--font-size-xs)] = 0.75rem (12px) — smallest available token\n xs: 'ds:size-6 ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n sm: 'ds:size-8 ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n md: 'ds:size-10 ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n lg: 'ds:size-12 ds:text-[length:var(--font-size-sm)] ds:font-semibold ds:leading-none',\n xl: 'ds:size-16 ds:text-[length:var(--font-size-base)] ds:font-semibold ds:leading-none',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n// ── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface AvatarProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, 'color'>,\n VariantProps<typeof avatarVariants> {\n /** Image source URL. When provided and loads successfully, the image is displayed. */\n src?: string;\n /** Display name — drives initials extraction and deterministic background colour. */\n name?: string;\n /**\n * Override the auto-generated background with any CSS colour string\n * (e.g. `\"var(--color-violet-700)\"`).\n * Applied via a CSS custom property so no `style` attribute is added to the JSX element.\n * Caller is responsible for WCAG AA contrast (≥4.5:1) against white text.\n */\n color?: string;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n ({ src, name, color, size, className, ...props }, ref) => {\n const { t } = useTranslation();\n\n const innerRef = useRef<HTMLSpanElement>(null);\n const composedRef = composeRefs(ref, innerRef);\n\n // Track only image errors. The image renders immediately as an overlay;\n // before it loads the browser paints nothing (transparent), showing the\n // background colour + initials behind it. On error we remove the img and\n // the initials/fallback remain permanently visible.\n const [imgError, setImgError] = useState(false);\n\n // Reset error flag whenever src changes\n useEffect(() => {\n setImgError(false);\n }, [src]);\n\n // Apply color override via CSS custom property — avoids style={{…}} on JSX.\n // Mirrors the pattern used by the Progress component for imperative CSS property injection.\n useLayoutEffect(() => {\n const el = innerRef.current;\n if (!el) return;\n if (color) {\n el.style.setProperty('--avatar-color-override', color);\n } else {\n el.style.removeProperty('--avatar-color-override');\n }\n }, [color]);\n\n // Image is \"active\" when provided and not errored\n const imgActive = !!src && !imgError;\n\n // Initials and fallback icon are shown when no usable image\n const showInitials = !imgActive && !!name;\n const showIcon = !imgActive && !name;\n\n // Background — always rendered (serves as loading placeholder when image is fetching)\n const fallbackBgClass = color\n ? 'ds:bg-[var(--avatar-color-override)]'\n : name\n ? nameToColorClass(name)\n : 'ds:bg-muted';\n\n // Always white text against brand hues / color override; muted-foreground for icon\n const contentColorClass =\n color || name\n ? 'ds:text-[var(--primary-foreground)]'\n : 'ds:text-muted-foreground';\n\n const rootClassName = avatarVariants({\n size,\n className: [fallbackBgClass, contentColorClass, className]\n .filter(Boolean)\n .join(' '),\n });\n\n // Accessible label — name takes priority, then the localised placeholder\n const ariaLabel = name ?? t('ui.avatar.placeholder', 'User avatar');\n\n return (\n <span\n ref={composedRef}\n role=\"img\"\n aria-label={ariaLabel}\n data-component=\"avatar\"\n className={rootClassName}\n {...props}\n >\n {/* Initials — rendered behind the image; visible while image is loading\n or permanently when no src / src errors */}\n {(showInitials || imgActive) && !!name && (\n <span aria-hidden=\"true\">{getInitials(name)}</span>\n )}\n\n {/* Fallback icon — shown when neither image nor name is available */}\n {showIcon && (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"ds:size-[58%] ds:fill-current\"\n >\n <path d=\"M12 12c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm0 2c-3.33 0-10 1.67-10 5v2h20v-2c0-3.33-6.67-5-10-5z\" />\n </svg>\n )}\n\n {/* Image — absolutely positioned overlay. Renders transparently until the\n browser paints the decoded pixels, then covers the initials behind it.\n Removed from DOM on error so initials remain permanently visible. */}\n {imgActive && (\n <img\n src={src}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ds:absolute ds:inset-0 ds:size-full ds:object-cover\"\n onError={() => setImgError(true)}\n />\n )}\n </span>\n );\n },\n);\n\nAvatar.displayName = 'Avatar';\n"],"names":["djb2","str","hash","i","INITIALS_BG_CLASSES","nameToColorClass","name","getInitials","words","avatarVariants","cva","Avatar","forwardRef","src","color","size","className","props","ref","t","useTranslation","innerRef","useRef","composedRef","composeRefs","imgError","setImgError","useState","useEffect","useLayoutEffect","el","imgActive","showInitials","showIcon","fallbackBgClass","rootClassName","ariaLabel","jsxs","jsx"],"mappings":"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"}