@alfadocs/ui-kit-debug 0.46.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/dist/_chunks/{agenda-card-CFyWSX7Z.js → agenda-card-BaSfVfrL.js} +25 -29
  2. package/dist/_chunks/agenda-card-BaSfVfrL.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-Dyj9ChHC.js → agenda-tray-DQayYmQ0.js} +50 -67
  4. package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +1 -0
  5. package/dist/_chunks/ai-consent-banner-DO5ingMq.js +169 -0
  6. package/dist/_chunks/ai-consent-banner-DO5ingMq.js.map +1 -0
  7. package/dist/_chunks/ai-tools-rail-CxYG04cw.js +280 -0
  8. package/dist/_chunks/ai-tools-rail-CxYG04cw.js.map +1 -0
  9. package/dist/_chunks/alia-sidebar-DlvyXgVC.js +1126 -0
  10. package/dist/_chunks/alia-sidebar-DlvyXgVC.js.map +1 -0
  11. package/dist/_chunks/anamnesis-card-CmkBVAln.js +156 -0
  12. package/dist/_chunks/anamnesis-card-CmkBVAln.js.map +1 -0
  13. package/dist/_chunks/appointment-tray-BwDHhWWC.js +419 -0
  14. package/dist/_chunks/appointment-tray-BwDHhWWC.js.map +1 -0
  15. package/dist/_chunks/{audio-recorder-C1rhKhSN.js → audio-recorder-DC-v9YFW.js} +81 -91
  16. package/dist/_chunks/audio-recorder-DC-v9YFW.js.map +1 -0
  17. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js → bmi-calculator-DdylQzT6.js} +2 -2
  18. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js.map → bmi-calculator-DdylQzT6.js.map} +1 -1
  19. package/dist/_chunks/{booking-DlDVuWMd.js → booking-WV2GSru5.js} +291 -303
  20. package/dist/_chunks/booking-WV2GSru5.js.map +1 -0
  21. package/dist/_chunks/{calculator-dialog-D-nfvteH.js → calculator-dialog-CFk4I91b.js} +2 -2
  22. package/dist/_chunks/{calculator-dialog-D-nfvteH.js.map → calculator-dialog-CFk4I91b.js.map} +1 -1
  23. package/dist/_chunks/calendar-days-C4BmpCZg.js +23 -0
  24. package/dist/_chunks/calendar-days-C4BmpCZg.js.map +1 -0
  25. package/dist/_chunks/{calendar-YHFknAGv.js → calendar-oYWOCrnf.js} +195 -210
  26. package/dist/_chunks/calendar-oYWOCrnf.js.map +1 -0
  27. package/dist/_chunks/care-plan-card-QmNpGggC.js +252 -0
  28. package/dist/_chunks/care-plan-card-QmNpGggC.js.map +1 -0
  29. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js +318 -0
  30. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js.map +1 -0
  31. package/dist/_chunks/{chat-input-CQe7nR_v.js → chat-input-CFwc7JxL.js} +2 -1
  32. package/dist/_chunks/{chat-input-CQe7nR_v.js.map → chat-input-CFwc7JxL.js.map} +1 -1
  33. package/dist/_chunks/{chat-message-ASgGtj-L.js → chat-message-Dm8U2RY1.js} +81 -74
  34. package/dist/_chunks/chat-message-Dm8U2RY1.js.map +1 -0
  35. package/dist/_chunks/clinical-note-card-BYo437dU.js +333 -0
  36. package/dist/_chunks/clinical-note-card-BYo437dU.js.map +1 -0
  37. package/dist/_chunks/code-block-HoddNOKJ.js +106 -0
  38. package/dist/_chunks/code-block-HoddNOKJ.js.map +1 -0
  39. package/dist/_chunks/{contact-profile-card-DHyuAPXM.js → contact-profile-card-DvvVfAA2.js} +102 -115
  40. package/dist/_chunks/contact-profile-card-DvvVfAA2.js.map +1 -0
  41. package/dist/_chunks/{cycle-calculator-KxA8dqDf.js → cycle-calculator-DYvGm_m1.js} +2 -2
  42. package/dist/_chunks/{cycle-calculator-KxA8dqDf.js.map → cycle-calculator-DYvGm_m1.js.map} +1 -1
  43. package/dist/_chunks/{dialog-BTpZV6It.js → dialog-DMGnSelc.js} +55 -55
  44. package/dist/_chunks/dialog-DMGnSelc.js.map +1 -0
  45. package/dist/_chunks/download-CDF1sbL9.js +16 -0
  46. package/dist/_chunks/download-CDF1sbL9.js.map +1 -0
  47. package/dist/_chunks/{due-date-calculator-mFxpHLml.js → due-date-calculator-BXd3ANj7.js} +2 -2
  48. package/dist/_chunks/{due-date-calculator-mFxpHLml.js.map → due-date-calculator-BXd3ANj7.js.map} +1 -1
  49. package/dist/_chunks/{editable-currency-cell-renderer-BEBUQl9P.js → editable-currency-cell-renderer-CLil9B29.js} +283 -293
  50. package/dist/_chunks/editable-currency-cell-renderer-CLil9B29.js.map +1 -0
  51. package/dist/_chunks/entity-card-COhmqHly.js +69 -0
  52. package/dist/_chunks/entity-card-COhmqHly.js.map +1 -0
  53. package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js → gestational-age-calculator-Crj6FgZw.js} +2 -2
  54. package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js.map → gestational-age-calculator-Crj6FgZw.js.map} +1 -1
  55. package/dist/_chunks/{insert-result-C5ABnzDl.js → insert-result-DNdi_JYW.js} +140 -168
  56. package/dist/_chunks/insert-result-DNdi_JYW.js.map +1 -0
  57. package/dist/_chunks/is-safe-url-DkETxeHz.js +7 -0
  58. package/dist/_chunks/is-safe-url-DkETxeHz.js.map +1 -0
  59. package/dist/_chunks/languages-DsVf_WzT.js +19 -0
  60. package/dist/_chunks/languages-DsVf_WzT.js.map +1 -0
  61. package/dist/_chunks/layers-pzGcbLPj.js +34 -0
  62. package/dist/_chunks/layers-pzGcbLPj.js.map +1 -0
  63. package/dist/_chunks/{message-card-DSPw5ghw.js → message-card-Dvl1TgaN.js} +15 -19
  64. package/dist/_chunks/message-card-Dvl1TgaN.js.map +1 -0
  65. package/dist/_chunks/{message-tray-hSQff9u4.js → message-tray-Dl6GQaaV.js} +2 -2
  66. package/dist/_chunks/{message-tray-hSQff9u4.js.map → message-tray-Dl6GQaaV.js.map} +1 -1
  67. package/dist/_chunks/mic-B4Gog3Gi.js +16 -0
  68. package/dist/_chunks/mic-B4Gog3Gi.js.map +1 -0
  69. package/dist/_chunks/operator-hero-CM8949Hd.js +198 -0
  70. package/dist/_chunks/operator-hero-CM8949Hd.js.map +1 -0
  71. package/dist/_chunks/patient-summary-card-BnTqxcTr.js +443 -0
  72. package/dist/_chunks/patient-summary-card-BnTqxcTr.js.map +1 -0
  73. package/dist/_chunks/payment-request-card-B_lyobd0.js +478 -0
  74. package/dist/_chunks/payment-request-card-B_lyobd0.js.map +1 -0
  75. package/dist/_chunks/{pdf-viewer-CWEXTlwq.js → pdf-viewer-G8SU6Azw.js} +3 -3
  76. package/dist/_chunks/pdf-viewer-G8SU6Azw.js.map +1 -0
  77. package/dist/_chunks/pencil-CfQX-0Qc.js +21 -0
  78. package/dist/_chunks/pencil-CfQX-0Qc.js.map +1 -0
  79. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js +455 -0
  80. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js.map +1 -0
  81. package/dist/_chunks/phone-Bi5yUm4I.js +20 -0
  82. package/dist/_chunks/phone-Bi5yUm4I.js.map +1 -0
  83. package/dist/_chunks/{practice-results-DDi-kvaD.js → practice-results-BFL_mcDW.js} +3 -2
  84. package/dist/_chunks/{practice-results-DDi-kvaD.js.map → practice-results-BFL_mcDW.js.map} +1 -1
  85. package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js → pregnancy-weight-gain-C7dK89jE.js} +2 -2
  86. package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js.map → pregnancy-weight-gain-C7dK89jE.js.map} +1 -1
  87. package/dist/_chunks/scan-line-lGioFwLC.js +18 -0
  88. package/dist/_chunks/scan-line-lGioFwLC.js.map +1 -0
  89. package/dist/_chunks/shield-check-BjCGH_Sr.js +21 -0
  90. package/dist/_chunks/shield-check-BjCGH_Sr.js.map +1 -0
  91. package/dist/_chunks/{sign-document-BCyLpFHJ.js → sign-document-DPI2pY9V.js} +2 -2
  92. package/dist/_chunks/{sign-document-BCyLpFHJ.js.map → sign-document-DPI2pY9V.js.map} +1 -1
  93. package/dist/_chunks/{streaming-text-GH07yIYh.js → streaming-text-CfhDqtIT.js} +49 -45
  94. package/dist/_chunks/streaming-text-CfhDqtIT.js.map +1 -0
  95. package/dist/_chunks/{transaction-chip-B8ujzowA.js → transaction-chip-BZCa6XDn.js} +8 -6
  96. package/dist/_chunks/{transaction-chip-B8ujzowA.js.map → transaction-chip-BZCa6XDn.js.map} +1 -1
  97. package/dist/_chunks/{unit-converter-u3CwNDpP.js → unit-converter-jWp3Z85y.js} +2 -2
  98. package/dist/_chunks/{unit-converter-u3CwNDpP.js.map → unit-converter-jWp3Z85y.js.map} +1 -1
  99. package/dist/_chunks/user-cog-BS_qc8nA.js +24 -0
  100. package/dist/_chunks/user-cog-BS_qc8nA.js.map +1 -0
  101. package/dist/_chunks/video-BAeICxCT.js +21 -0
  102. package/dist/_chunks/video-BAeICxCT.js.map +1 -0
  103. package/dist/_chunks/{workflow-map-BFNpzTiw.js → workflow-map-ZXw-zsZ8.js} +186 -219
  104. package/dist/_chunks/workflow-map-ZXw-zsZ8.js.map +1 -0
  105. package/dist/agent-catalog.json +324 -1
  106. package/dist/components/_shared/code-block.d.ts +39 -0
  107. package/dist/components/_shared/code-block.d.ts.map +1 -0
  108. package/dist/components/_shared/entity-card/entity-card.d.ts +40 -0
  109. package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -0
  110. package/dist/components/_shared/entity-card/index.d.ts +3 -0
  111. package/dist/components/_shared/entity-card/index.d.ts.map +1 -0
  112. package/dist/components/_shared/index.d.ts +2 -0
  113. package/dist/components/_shared/index.d.ts.map +1 -1
  114. package/dist/components/_shared/is-safe-url.d.ts +13 -0
  115. package/dist/components/_shared/is-safe-url.d.ts.map +1 -0
  116. package/dist/components/agenda-card/agenda-card.d.ts +1 -2
  117. package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
  118. package/dist/components/agenda-card/index.d.ts +2 -1
  119. package/dist/components/agenda-card/index.d.ts.map +1 -1
  120. package/dist/components/agenda-card/index.js +6 -5
  121. package/dist/components/agenda-card/index.js.map +1 -1
  122. package/dist/components/agenda-tray/index.js +1 -1
  123. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts +4 -0
  124. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +1 -0
  125. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts +45 -0
  126. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +1 -0
  127. package/dist/components/ai-consent-banner/index.d.ts +4 -0
  128. package/dist/components/ai-consent-banner/index.d.ts.map +1 -0
  129. package/dist/components/ai-consent-banner/index.js +6 -0
  130. package/dist/components/ai-consent-banner/index.js.map +1 -0
  131. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +4 -0
  132. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +1 -0
  133. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +60 -0
  134. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -0
  135. package/dist/components/ai-tools-rail/index.d.ts +4 -0
  136. package/dist/components/ai-tools-rail/index.d.ts.map +1 -0
  137. package/dist/components/ai-tools-rail/index.js +6 -0
  138. package/dist/components/ai-tools-rail/index.js.map +1 -0
  139. package/dist/components/anamnesis-card/anamnesis-card.d.ts +68 -0
  140. package/dist/components/anamnesis-card/anamnesis-card.d.ts.map +1 -0
  141. package/dist/components/anamnesis-card/index.d.ts +3 -0
  142. package/dist/components/anamnesis-card/index.d.ts.map +1 -0
  143. package/dist/components/anamnesis-card/index.js +5 -0
  144. package/dist/components/anamnesis-card/index.js.map +1 -0
  145. package/dist/components/appointment-card/appointment-card.agent.d.ts +3 -0
  146. package/dist/components/appointment-card/appointment-card.agent.d.ts.map +1 -0
  147. package/dist/components/appointment-card/appointment-card.d.ts +93 -0
  148. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -0
  149. package/dist/components/appointment-card/appointment-tray.agent.d.ts +4 -0
  150. package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -0
  151. package/dist/components/appointment-card/appointment-tray.d.ts +48 -0
  152. package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -0
  153. package/dist/components/appointment-card/index.d.ts +8 -0
  154. package/dist/components/appointment-card/index.d.ts.map +1 -0
  155. package/dist/components/appointment-card/index.js +10 -0
  156. package/dist/components/appointment-card/index.js.map +1 -0
  157. package/dist/components/audio-recorder/index.js +1 -1
  158. package/dist/components/badge/badge.d.ts +1 -1
  159. package/dist/components/bmi-calculator/index.js +1 -1
  160. package/dist/components/booking/index.js +1 -1
  161. package/dist/components/calculator-dialog/index.js +1 -1
  162. package/dist/components/calendar/index.js +1 -1
  163. package/dist/components/card/card.d.ts +1 -1
  164. package/dist/components/care-plan-card/care-plan-card.agent.d.ts +4 -0
  165. package/dist/components/care-plan-card/care-plan-card.agent.d.ts.map +1 -0
  166. package/dist/components/care-plan-card/care-plan-card.d.ts +102 -0
  167. package/dist/components/care-plan-card/care-plan-card.d.ts.map +1 -0
  168. package/dist/components/care-plan-card/index.d.ts +4 -0
  169. package/dist/components/care-plan-card/index.d.ts.map +1 -0
  170. package/dist/components/care-plan-card/index.js +6 -0
  171. package/dist/components/care-plan-card/index.js.map +1 -0
  172. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts +4 -0
  173. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts.map +1 -0
  174. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts +110 -0
  175. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts.map +1 -0
  176. package/dist/components/care-plan-entry-card/index.d.ts +4 -0
  177. package/dist/components/care-plan-entry-card/index.d.ts.map +1 -0
  178. package/dist/components/care-plan-entry-card/index.js +6 -0
  179. package/dist/components/care-plan-entry-card/index.js.map +1 -0
  180. package/dist/components/chat-input/index.js +1 -1
  181. package/dist/components/chat-message/chat-message.d.ts +13 -0
  182. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  183. package/dist/components/chat-message/index.js +1 -1
  184. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts +4 -0
  185. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts.map +1 -0
  186. package/dist/components/clinical-note-card/clinical-note-card.d.ts +98 -0
  187. package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -0
  188. package/dist/components/clinical-note-card/index.d.ts +4 -0
  189. package/dist/components/clinical-note-card/index.d.ts.map +1 -0
  190. package/dist/components/clinical-note-card/index.js +6 -0
  191. package/dist/components/clinical-note-card/index.js.map +1 -0
  192. package/dist/components/contact-profile-card/index.js +1 -1
  193. package/dist/components/cycle-calculator/index.js +1 -1
  194. package/dist/components/data-table/index.js +1 -1
  195. package/dist/components/dialog/dialog.d.ts +7 -0
  196. package/dist/components/dialog/dialog.d.ts.map +1 -1
  197. package/dist/components/dialog/index.js +1 -1
  198. package/dist/components/due-date-calculator/index.js +1 -1
  199. package/dist/components/gestational-age-calculator/index.js +1 -1
  200. package/dist/components/index.d.ts +10 -0
  201. package/dist/components/index.d.ts.map +1 -1
  202. package/dist/components/message-card/index.js +5 -4
  203. package/dist/components/message-card/index.js.map +1 -1
  204. package/dist/components/message-card/message-card.d.ts +1 -2
  205. package/dist/components/message-card/message-card.d.ts.map +1 -1
  206. package/dist/components/message-tray/index.js +1 -1
  207. package/dist/components/operator-hero/index.js +1 -1
  208. package/dist/components/operator-hero/operator-hero.agent.d.ts.map +1 -1
  209. package/dist/components/operator-hero/operator-hero.d.ts +9 -0
  210. package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
  211. package/dist/components/patient-summary-card/index.d.ts +4 -0
  212. package/dist/components/patient-summary-card/index.d.ts.map +1 -0
  213. package/dist/components/patient-summary-card/index.js +6 -0
  214. package/dist/components/patient-summary-card/index.js.map +1 -0
  215. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts +4 -0
  216. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -0
  217. package/dist/components/patient-summary-card/patient-summary-card.d.ts +120 -0
  218. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -0
  219. package/dist/components/payment-card/index.d.ts +7 -0
  220. package/dist/components/payment-card/index.d.ts.map +1 -0
  221. package/dist/components/payment-card/index.js +8 -0
  222. package/dist/components/payment-card/index.js.map +1 -0
  223. package/dist/components/payment-card/payment-card.agent.d.ts +4 -0
  224. package/dist/components/payment-card/payment-card.agent.d.ts.map +1 -0
  225. package/dist/components/payment-card/payment-card.d.ts +71 -0
  226. package/dist/components/payment-card/payment-card.d.ts.map +1 -0
  227. package/dist/components/payment-card/payment-request-card.agent.d.ts +4 -0
  228. package/dist/components/payment-card/payment-request-card.agent.d.ts.map +1 -0
  229. package/dist/components/payment-card/payment-request-card.d.ts +43 -0
  230. package/dist/components/payment-card/payment-request-card.d.ts.map +1 -0
  231. package/dist/components/pdf-viewer/index.js +1 -1
  232. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  233. package/dist/components/periodontal-chart-card/index.d.ts +4 -0
  234. package/dist/components/periodontal-chart-card/index.d.ts.map +1 -0
  235. package/dist/components/periodontal-chart-card/index.js +7 -0
  236. package/dist/components/periodontal-chart-card/index.js.map +1 -0
  237. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts +4 -0
  238. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts.map +1 -0
  239. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +74 -0
  240. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts.map +1 -0
  241. package/dist/components/practice-results/index.js +1 -1
  242. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  243. package/dist/components/public-header/public-header.d.ts +1 -1
  244. package/dist/components/sign-document/index.js +1 -1
  245. package/dist/components/stat/stat.d.ts +1 -1
  246. package/dist/components/streaming-text/index.js +1 -1
  247. package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
  248. package/dist/components/transaction-chip/index.js +1 -1
  249. package/dist/components/unit-converter/index.js +1 -1
  250. package/dist/components/workflow/index.js +1 -1
  251. package/dist/i18n/locales/ar.d.ts +366 -0
  252. package/dist/i18n/locales/ar.d.ts.map +1 -1
  253. package/dist/i18n/locales/ar.js +367 -1
  254. package/dist/i18n/locales/ar.js.map +1 -1
  255. package/dist/i18n/locales/de.d.ts +366 -0
  256. package/dist/i18n/locales/de.d.ts.map +1 -1
  257. package/dist/i18n/locales/de.js +367 -1
  258. package/dist/i18n/locales/de.js.map +1 -1
  259. package/dist/i18n/locales/el.d.ts +366 -0
  260. package/dist/i18n/locales/el.d.ts.map +1 -1
  261. package/dist/i18n/locales/el.js +367 -1
  262. package/dist/i18n/locales/el.js.map +1 -1
  263. package/dist/i18n/locales/en.d.ts +366 -0
  264. package/dist/i18n/locales/en.d.ts.map +1 -1
  265. package/dist/i18n/locales/en.js +367 -1
  266. package/dist/i18n/locales/en.js.map +1 -1
  267. package/dist/i18n/locales/es.d.ts +366 -0
  268. package/dist/i18n/locales/es.d.ts.map +1 -1
  269. package/dist/i18n/locales/es.js +367 -1
  270. package/dist/i18n/locales/es.js.map +1 -1
  271. package/dist/i18n/locales/fr.d.ts +366 -0
  272. package/dist/i18n/locales/fr.d.ts.map +1 -1
  273. package/dist/i18n/locales/fr.js +367 -1
  274. package/dist/i18n/locales/fr.js.map +1 -1
  275. package/dist/i18n/locales/hi.d.ts +366 -0
  276. package/dist/i18n/locales/hi.d.ts.map +1 -1
  277. package/dist/i18n/locales/hi.js +367 -1
  278. package/dist/i18n/locales/hi.js.map +1 -1
  279. package/dist/i18n/locales/it.d.ts +366 -0
  280. package/dist/i18n/locales/it.d.ts.map +1 -1
  281. package/dist/i18n/locales/it.js +367 -1
  282. package/dist/i18n/locales/it.js.map +1 -1
  283. package/dist/i18n/locales/ja.d.ts +366 -0
  284. package/dist/i18n/locales/ja.d.ts.map +1 -1
  285. package/dist/i18n/locales/ja.js +367 -1
  286. package/dist/i18n/locales/ja.js.map +1 -1
  287. package/dist/i18n/locales/nl.d.ts +366 -0
  288. package/dist/i18n/locales/nl.d.ts.map +1 -1
  289. package/dist/i18n/locales/nl.js +367 -1
  290. package/dist/i18n/locales/nl.js.map +1 -1
  291. package/dist/i18n/locales/pl.d.ts +366 -0
  292. package/dist/i18n/locales/pl.d.ts.map +1 -1
  293. package/dist/i18n/locales/pl.js +367 -1
  294. package/dist/i18n/locales/pl.js.map +1 -1
  295. package/dist/i18n/locales/pt.d.ts +366 -0
  296. package/dist/i18n/locales/pt.d.ts.map +1 -1
  297. package/dist/i18n/locales/pt.js +367 -1
  298. package/dist/i18n/locales/pt.js.map +1 -1
  299. package/dist/i18n/locales/ro.d.ts +366 -0
  300. package/dist/i18n/locales/ro.d.ts.map +1 -1
  301. package/dist/i18n/locales/ro.js +367 -1
  302. package/dist/i18n/locales/ro.js.map +1 -1
  303. package/dist/i18n/locales/ru.d.ts +366 -0
  304. package/dist/i18n/locales/ru.d.ts.map +1 -1
  305. package/dist/i18n/locales/ru.js +367 -1
  306. package/dist/i18n/locales/ru.js.map +1 -1
  307. package/dist/i18n/locales/sq.d.ts +366 -0
  308. package/dist/i18n/locales/sq.d.ts.map +1 -1
  309. package/dist/i18n/locales/sq.js +367 -1
  310. package/dist/i18n/locales/sq.js.map +1 -1
  311. package/dist/i18n/locales/sv.d.ts +366 -0
  312. package/dist/i18n/locales/sv.d.ts.map +1 -1
  313. package/dist/i18n/locales/sv.js +367 -1
  314. package/dist/i18n/locales/sv.js.map +1 -1
  315. package/dist/i18n/locales/tr.d.ts +366 -0
  316. package/dist/i18n/locales/tr.d.ts.map +1 -1
  317. package/dist/i18n/locales/tr.js +367 -1
  318. package/dist/i18n/locales/tr.js.map +1 -1
  319. package/dist/i18n/locales/zh.d.ts +366 -0
  320. package/dist/i18n/locales/zh.d.ts.map +1 -1
  321. package/dist/i18n/locales/zh.js +367 -1
  322. package/dist/i18n/locales/zh.js.map +1 -1
  323. package/dist/index.js +527 -491
  324. package/dist/index.js.map +1 -1
  325. package/dist/locales/ar.json +367 -1
  326. package/dist/locales/de.json +367 -1
  327. package/dist/locales/el.json +367 -1
  328. package/dist/locales/en.json +367 -1
  329. package/dist/locales/es.json +367 -1
  330. package/dist/locales/fr.json +367 -1
  331. package/dist/locales/hi.json +367 -1
  332. package/dist/locales/it.json +367 -1
  333. package/dist/locales/ja.json +367 -1
  334. package/dist/locales/nl.json +367 -1
  335. package/dist/locales/pl.json +367 -1
  336. package/dist/locales/pt.json +367 -1
  337. package/dist/locales/ro.json +367 -1
  338. package/dist/locales/ru.json +367 -1
  339. package/dist/locales/sq.json +367 -1
  340. package/dist/locales/sv.json +367 -1
  341. package/dist/locales/tr.json +367 -1
  342. package/dist/locales/zh.json +367 -1
  343. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  344. package/dist/patterns/alia-assistant/alia-types.d.ts +76 -0
  345. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  346. package/dist/patterns/alia-assistant/index.js +1 -1
  347. package/dist/tokens.css +1 -1
  348. package/package.json +42 -1
  349. package/dist/_chunks/agenda-card-CFyWSX7Z.js.map +0 -1
  350. package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +0 -1
  351. package/dist/_chunks/alia-sidebar-Be8FhKYd.js +0 -837
  352. package/dist/_chunks/alia-sidebar-Be8FhKYd.js.map +0 -1
  353. package/dist/_chunks/audio-recorder-C1rhKhSN.js.map +0 -1
  354. package/dist/_chunks/booking-DlDVuWMd.js.map +0 -1
  355. package/dist/_chunks/calendar-YHFknAGv.js.map +0 -1
  356. package/dist/_chunks/chat-message-ASgGtj-L.js.map +0 -1
  357. package/dist/_chunks/contact-profile-card-DHyuAPXM.js.map +0 -1
  358. package/dist/_chunks/dialog-BTpZV6It.js.map +0 -1
  359. package/dist/_chunks/editable-currency-cell-renderer-BEBUQl9P.js.map +0 -1
  360. package/dist/_chunks/insert-result-C5ABnzDl.js.map +0 -1
  361. package/dist/_chunks/message-card-DSPw5ghw.js.map +0 -1
  362. package/dist/_chunks/operator-hero-7LiiP7zi.js +0 -171
  363. package/dist/_chunks/operator-hero-7LiiP7zi.js.map +0 -1
  364. package/dist/_chunks/pdf-viewer-CWEXTlwq.js.map +0 -1
  365. package/dist/_chunks/shield-check-C73ma9Cs.js +0 -36
  366. package/dist/_chunks/shield-check-C73ma9Cs.js.map +0 -1
  367. package/dist/_chunks/streaming-text-GH07yIYh.js.map +0 -1
  368. package/dist/_chunks/workflow-map-BFNpzTiw.js.map +0 -1
@@ -1,44 +1,34 @@
1
1
  import { jsxs as R, jsx as s, Fragment as se } from "react/jsx-runtime";
2
- import { forwardRef as ne, useReducer as ae, useState as x, useRef as l, useEffect as N, useCallback as h, useMemo as de, useImperativeHandle as ce } from "react";
2
+ import { forwardRef as ae, useReducer as ne, useState as x, useRef as l, useEffect as D, useCallback as h, useMemo as de, useImperativeHandle as ce } from "react";
3
3
  import { c as oe } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as ue } from "react-i18next";
5
- import { B as J } from "./button-DD_0Xdmr.js";
6
- import { I as D } from "./icon-button-CKEOrN37.js";
5
+ import { B as G } from "./button-DD_0Xdmr.js";
6
+ import { I as N } from "./icon-button-CKEOrN37.js";
7
7
  import { S as pe } from "./select-hsCaJSX3.js";
8
8
  import { A as le } from "./audio-visualiser-l6zPd0AG.js";
9
9
  import { A as F } from "./alert-ywPR59NE.js";
10
10
  import { u as me } from "./registry-nPAVE19X.js";
11
- import { c as V } from "./createLucideIcon-CrFbzy84.js";
12
- import { S as fe } from "./square-CZoGU14v.js";
13
- import { X as ge } from "./x-CCcI3eJp.js";
11
+ import { M as fe } from "./mic-B4Gog3Gi.js";
12
+ import { c as J } from "./createLucideIcon-CrFbzy84.js";
13
+ import { S as ge } from "./square-CZoGU14v.js";
14
+ import { X as he } from "./x-CCcI3eJp.js";
14
15
  /**
15
16
  * @license lucide-react v1.8.0 - ISC
16
17
  *
17
18
  * This source code is licensed under the ISC license.
18
19
  * See the LICENSE file in the root directory of this source tree.
19
20
  */
20
- const he = [
21
- ["path", { d: "M12 19v3", key: "npa21l" }],
22
- ["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
23
- ["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
24
- ], ve = V("mic", he);
25
- /**
26
- * @license lucide-react v1.8.0 - ISC
27
- *
28
- * This source code is licensed under the ISC license.
29
- * See the LICENSE file in the root directory of this source tree.
30
- */
31
- const ye = [
21
+ const ve = [
32
22
  ["rect", { x: "14", y: "3", width: "5", height: "18", rx: "1", key: "kaeet6" }],
33
23
  ["rect", { x: "5", y: "3", width: "5", height: "18", rx: "1", key: "1wsw3u" }]
34
- ], ke = V("pause", ye);
24
+ ], ye = J("pause", ve);
35
25
  /**
36
26
  * @license lucide-react v1.8.0 - ISC
37
27
  *
38
28
  * This source code is licensed under the ISC license.
39
29
  * See the LICENSE file in the root directory of this source tree.
40
30
  */
41
- const be = [
31
+ const ke = [
42
32
  [
43
33
  "path",
44
34
  {
@@ -46,7 +36,7 @@ const be = [
46
36
  key: "10ikf1"
47
37
  }
48
38
  ]
49
- ], Re = V("play", be), we = {
39
+ ], be = J("play", ke), Re = {
50
40
  id: "audio-recorder",
51
41
  capabilities: ["submit"],
52
42
  state: {
@@ -114,7 +104,7 @@ const be = [
114
104
  }
115
105
  }
116
106
  };
117
- function Me(r, u) {
107
+ function we(r, u) {
118
108
  switch (u.type) {
119
109
  case "request":
120
110
  return { kind: "requesting" };
@@ -162,15 +152,15 @@ const Ae = oe(
162
152
  },
163
153
  defaultVariants: { size: "md" }
164
154
  }
165
- ), xe = [
155
+ ), Me = [
166
156
  "audio/webm;codecs=opus",
167
157
  "audio/webm",
168
158
  "audio/mp4",
169
159
  "audio/ogg;codecs=opus"
170
160
  ];
171
- function Ne() {
161
+ function xe() {
172
162
  if (!(typeof MediaRecorder > "u")) {
173
- for (const r of xe)
163
+ for (const r of Me)
174
164
  if (MediaRecorder.isTypeSupported(r)) return r;
175
165
  }
176
166
  }
@@ -178,7 +168,7 @@ function De(r, u) {
178
168
  const m = Math.max(0, Math.floor(r / 1e3)), i = Math.floor(m / 60), f = m % 60, v = (S) => new Intl.NumberFormat(u, { minimumIntegerDigits: 2 }).format(S);
179
169
  return `${v(i)}:${v(f)}`;
180
170
  }
181
- const Se = ne(
171
+ const Ne = ae(
182
172
  ({
183
173
  size: r = "md",
184
174
  onRecordingComplete: u,
@@ -189,23 +179,23 @@ const Se = ne(
189
179
  className: S,
190
180
  ...I
191
181
  }, Q) => {
192
- const { t: d, i18n: W } = ue(), [t, p] = ae(Me, { kind: "idle" }), [z, T] = x(null), [Y, Z] = x(Date.now()), [E, ee] = x([]), [w, te] = x(""), c = l(null), y = l([]), _ = l(0), $ = l(0), g = l(null), B = l(!1), k = l(!1), H = l(0), b = typeof MediaRecorder < "u";
193
- N(() => {
182
+ const { t: d, i18n: W } = ue(), [t, p] = ne(we, { kind: "idle" }), [z, T] = x(null), [Y, Z] = x(Date.now()), [E, ee] = x([]), [w, te] = x(""), c = l(null), y = l([]), _ = l(0), V = l(0), g = l(null), B = l(!1), k = l(!1), H = l(0), b = typeof MediaRecorder < "u";
183
+ D(() => {
194
184
  var e;
195
- !b || !((e = navigator.mediaDevices) != null && e.enumerateDevices) || navigator.mediaDevices.enumerateDevices().then((n) => {
196
- const o = n.filter((a) => a.kind === "audioinput");
185
+ !b || !((e = navigator.mediaDevices) != null && e.enumerateDevices) || navigator.mediaDevices.enumerateDevices().then((a) => {
186
+ const o = a.filter((n) => n.kind === "audioinput");
197
187
  ee(o);
198
188
  }).catch(() => {
199
189
  });
200
- }, [b]), N(() => {
190
+ }, [b]), D(() => {
201
191
  if (t.kind !== "recording") return;
202
192
  const e = window.setInterval(() => Z(Date.now()), 250);
203
193
  return () => window.clearInterval(e);
204
194
  }, [t.kind]);
205
- const C = h(() => {
195
+ const $ = h(() => {
206
196
  const e = g.current ?? z;
207
- e == null || e.getTracks().forEach((n) => n.stop()), g.current = null, T(null);
208
- }, [z]), M = h(async () => {
197
+ e == null || e.getTracks().forEach((a) => a.stop()), g.current = null, T(null);
198
+ }, [z]), A = h(async () => {
209
199
  if (!b) {
210
200
  p({ type: "error", kind: "unsupported" }), i == null || i("unsupported");
211
201
  return;
@@ -216,17 +206,17 @@ const Se = ne(
216
206
  audio: w ? { deviceId: { exact: w } } : !0
217
207
  });
218
208
  if (B.current || k.current) {
219
- e.getTracks().forEach((a) => a.stop());
209
+ e.getTracks().forEach((n) => n.stop());
220
210
  return;
221
211
  }
222
212
  g.current = e, T(e);
223
- const n = Ne(), o = new MediaRecorder(
213
+ const a = xe(), o = new MediaRecorder(
224
214
  e,
225
- n ? { mimeType: n } : void 0
215
+ a ? { mimeType: a } : void 0
226
216
  );
227
- c.current = o, y.current = [], _.current = 0, o.ondataavailable = (a) => {
228
- var G;
229
- if (a.data && a.data.size > 0 && (y.current.push(a.data), _.current += a.data.size, typeof v == "number" && _.current >= v && ((G = c.current) == null ? void 0 : G.state) === "recording")) {
217
+ c.current = o, y.current = [], _.current = 0, o.ondataavailable = (n) => {
218
+ var X;
219
+ if (n.data && n.data.size > 0 && (y.current.push(n.data), _.current += n.data.size, typeof v == "number" && _.current >= v && ((X = c.current) == null ? void 0 : X.state) === "recording")) {
230
220
  i == null || i("max-size");
231
221
  try {
232
222
  c.current.stop();
@@ -235,16 +225,16 @@ const Se = ne(
235
225
  }
236
226
  }, o.onstop = () => {
237
227
  if (!k.current) {
238
- const a = new Blob(y.current, {
239
- type: n ?? "audio/webm"
228
+ const n = new Blob(y.current, {
229
+ type: a ?? "audio/webm"
240
230
  });
241
- u == null || u(a, $.current);
231
+ u == null || u(n, V.current);
242
232
  }
243
- y.current = [], c.current = null, e.getTracks().forEach((a) => a.stop()), g.current = null, T(null), k.current = !1;
233
+ y.current = [], c.current = null, e.getTracks().forEach((n) => n.stop()), g.current = null, T(null), k.current = !1;
244
234
  }, H.current = performance.now(), o.start(1e3), p({ type: "start" });
245
235
  } catch (e) {
246
- const n = e instanceof Error ? e.name : "";
247
- n === "NotAllowedError" || n === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }), i == null || i("permission-denied")) : n === "NotFoundError" || n === "OverconstrainedError" ? (p({ type: "error", kind: "no-device" }), i == null || i("no-device")) : (p({ type: "error", kind: "capture-failed" }), i == null || i("capture-failed"));
236
+ const a = e instanceof Error ? e.name : "";
237
+ a === "NotAllowedError" || a === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }), i == null || i("permission-denied")) : a === "NotFoundError" || a === "OverconstrainedError" ? (p({ type: "error", kind: "no-device" }), i == null || i("no-device")) : (p({ type: "error", kind: "capture-failed" }), i == null || i("capture-failed"));
248
238
  }
249
239
  }, [i, u, w, b]), re = h(() => {
250
240
  var e;
@@ -255,8 +245,8 @@ const Se = ne(
255
245
  }, []), q = h(() => {
256
246
  var e;
257
247
  if (t.kind === "recording" || t.kind === "paused") {
258
- const n = t.startedAt, o = t.pausedMs, a = Date.now() - n - o;
259
- $.current = Math.max(0, a), p({ type: "stop", duration: a });
248
+ const a = t.startedAt, o = t.pausedMs, n = Date.now() - a - o;
249
+ V.current = Math.max(0, n), p({ type: "stop", duration: n });
260
250
  }
261
251
  try {
262
252
  (e = c.current) == null || e.stop();
@@ -269,46 +259,46 @@ const Se = ne(
269
259
  (e = c.current) == null || e.stop();
270
260
  } catch {
271
261
  }
272
- y.current = [], c.current = null, C(), p({ type: "cancel" }), m == null || m();
273
- }, [C, m]);
274
- N(() => {
262
+ y.current = [], c.current = null, $(), p({ type: "cancel" }), m == null || m();
263
+ }, [$, m]);
264
+ D(() => {
275
265
  if (t.kind !== "recording" || typeof f != "number" || f <= 0) return;
276
- const e = performance.now() - H.current - t.pausedMs, n = Math.max(0, f - e), o = window.setTimeout(() => {
277
- var a;
278
- if (((a = c.current) == null ? void 0 : a.state) === "recording") {
266
+ const e = performance.now() - H.current - t.pausedMs, a = Math.max(0, f - e), o = window.setTimeout(() => {
267
+ var n;
268
+ if (((n = c.current) == null ? void 0 : n.state) === "recording") {
279
269
  i == null || i("max-duration");
280
270
  try {
281
271
  c.current.stop();
282
272
  } catch {
283
273
  }
284
274
  }
285
- }, n);
275
+ }, a);
286
276
  return () => window.clearTimeout(o);
287
- }, [t, f, i]), N(() => () => {
288
- var e, n;
277
+ }, [t, f, i]), D(() => () => {
278
+ var e, a;
289
279
  B.current = !0;
290
280
  try {
291
281
  (e = c.current) == null || e.stop();
292
282
  } catch {
293
283
  }
294
- (n = g.current) == null || n.getTracks().forEach((o) => o.stop()), g.current = null;
284
+ (a = g.current) == null || a.getTracks().forEach((o) => o.stop()), g.current = null;
295
285
  }, []);
296
286
  const j = t.kind === "recording" ? Y - t.startedAt - t.pausedMs : t.kind === "paused" ? t.pausedAt - t.startedAt - t.pausedMs : t.kind === "stopped" ? t.duration : 0, P = de(
297
287
  () => ({
298
288
  isRecording: () => t.kind === "recording",
299
289
  getDuration: () => j,
300
290
  hasRecording: () => t.kind === "stopped",
301
- startRecording: () => M(),
291
+ startRecording: () => A(),
302
292
  stopRecording: () => q(),
303
293
  discard: () => K()
304
294
  }),
305
- [t, j, M, q, K]
295
+ [t, j, A, q, K]
306
296
  );
307
- ce(Q, () => P, [P]), me(we, P, I.id);
308
- const O = E.map((e) => ({
297
+ ce(Q, () => P, [P]), me(Re, P, I.id);
298
+ const C = E.map((e) => ({
309
299
  value: e.deviceId,
310
300
  label: e.label || d("chat.audio.selectDevice")
311
- })), L = (() => {
301
+ })), O = (() => {
312
302
  switch (t.kind) {
313
303
  case "idle":
314
304
  return d("chat.audio.idle");
@@ -323,7 +313,7 @@ const Se = ne(
323
313
  case "error":
324
314
  return t.type === "permission-denied" ? d("chat.audio.permissionDenied") : t.type === "unsupported" ? d("chat.audio.unsupported") : d("chat.audio.idle");
325
315
  }
326
- })(), A = t.kind === "recording", U = t.kind === "paused", X = t.kind === "error";
316
+ })(), M = t.kind === "recording", L = t.kind === "paused", U = t.kind === "error";
327
317
  return /* @__PURE__ */ R(
328
318
  "div",
329
319
  {
@@ -339,9 +329,9 @@ const Se = ne(
339
329
  "aria-hidden": "true",
340
330
  className: [
341
331
  "ds:relative ds:inline-flex ds:size-3 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)]",
342
- A ? "ds:bg-[color:var(--destructive)]" : "ds:bg-[color:var(--muted)]"
332
+ M ? "ds:bg-[color:var(--destructive)]" : "ds:bg-[color:var(--muted)]"
343
333
  ].join(" "),
344
- children: A ? /* @__PURE__ */ s(
334
+ children: M ? /* @__PURE__ */ s(
345
335
  "span",
346
336
  {
347
337
  className: [
@@ -373,44 +363,44 @@ const Se = ne(
373
363
  }
374
364
  )
375
365
  ] }),
376
- /* @__PURE__ */ s("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: L }),
366
+ /* @__PURE__ */ s("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: O }),
377
367
  /* @__PURE__ */ R("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
378
- t.kind === "idle" || t.kind === "stopped" || X ? /* @__PURE__ */ s(
379
- J,
368
+ t.kind === "idle" || t.kind === "stopped" || U ? /* @__PURE__ */ s(
369
+ G,
380
370
  {
381
371
  intent: "primary",
382
372
  size: "sm",
383
- startIcon: /* @__PURE__ */ s(ve, {}),
384
- onClick: M,
373
+ startIcon: /* @__PURE__ */ s(fe, {}),
374
+ onClick: A,
385
375
  disabled: !b,
386
376
  children: d("chat.audio.record")
387
377
  }
388
378
  ) : null,
389
- A ? /* @__PURE__ */ s(
390
- D,
379
+ M ? /* @__PURE__ */ s(
380
+ N,
391
381
  {
392
- icon: /* @__PURE__ */ s(ke, {}),
382
+ icon: /* @__PURE__ */ s(ye, {}),
393
383
  "aria-label": d("chat.audio.pause"),
394
384
  intent: "secondary",
395
385
  size: "sm",
396
386
  onClick: re
397
387
  }
398
388
  ) : null,
399
- U ? /* @__PURE__ */ s(
400
- D,
389
+ L ? /* @__PURE__ */ s(
390
+ N,
401
391
  {
402
- icon: /* @__PURE__ */ s(Re, {}),
392
+ icon: /* @__PURE__ */ s(be, {}),
403
393
  "aria-label": d("chat.audio.resume"),
404
394
  intent: "secondary",
405
395
  size: "sm",
406
396
  onClick: ie
407
397
  }
408
398
  ) : null,
409
- A || U ? /* @__PURE__ */ R(se, { children: [
399
+ M || L ? /* @__PURE__ */ R(se, { children: [
410
400
  /* @__PURE__ */ s(
411
- D,
401
+ N,
412
402
  {
413
- icon: /* @__PURE__ */ s(fe, {}),
403
+ icon: /* @__PURE__ */ s(ge, {}),
414
404
  "aria-label": d("chat.audio.stop"),
415
405
  intent: "primary",
416
406
  size: "sm",
@@ -418,9 +408,9 @@ const Se = ne(
418
408
  }
419
409
  ),
420
410
  /* @__PURE__ */ s(
421
- D,
411
+ N,
422
412
  {
423
- icon: /* @__PURE__ */ s(ge, {}),
413
+ icon: /* @__PURE__ */ s(he, {}),
424
414
  "aria-label": d("chat.audio.cancel"),
425
415
  intent: "ghost",
426
416
  size: "sm",
@@ -428,11 +418,11 @@ const Se = ne(
428
418
  }
429
419
  )
430
420
  ] }) : null,
431
- t.kind === "idle" && O.length > 1 ? /* @__PURE__ */ s("div", { className: "ds:ms-auto ds:min-w-[160px]", children: /* @__PURE__ */ s(
421
+ t.kind === "idle" && C.length > 1 ? /* @__PURE__ */ s("div", { className: "ds:ms-auto ds:min-w-[160px]", children: /* @__PURE__ */ s(
432
422
  pe,
433
423
  {
434
424
  "aria-label": d("chat.audio.selectDevice"),
435
- options: O,
425
+ options: C,
436
426
  value: w,
437
427
  onValueChange: (e) => te(e),
438
428
  size: "sm",
@@ -440,18 +430,18 @@ const Se = ne(
440
430
  }
441
431
  ) }) : null
442
432
  ] }),
443
- X && t.kind === "error" ? /* @__PURE__ */ R(F, { variant: "error", live: "polite", children: [
444
- /* @__PURE__ */ s(F.Description, { children: L }),
445
- t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(J, { intent: "ghost", size: "sm", onClick: M, children: d("chat.audio.retry") }) }) : null
433
+ U && t.kind === "error" ? /* @__PURE__ */ R(F, { variant: "error", live: "polite", children: [
434
+ /* @__PURE__ */ s(F.Description, { children: O }),
435
+ t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(G, { intent: "ghost", size: "sm", onClick: A, children: d("chat.audio.retry") }) }) : null
446
436
  ] }) : null
447
437
  ]
448
438
  }
449
439
  );
450
440
  }
451
441
  );
452
- Se.displayName = "AudioRecorder";
442
+ Ne.displayName = "AudioRecorder";
453
443
  export {
454
- Se as A,
455
- we as a
444
+ Ne as A,
445
+ Re as a
456
446
  };
457
- //# sourceMappingURL=audio-recorder-C1rhKhSN.js.map
447
+ //# sourceMappingURL=audio-recorder-DC-v9YFW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-recorder-DC-v9YFW.js","sources":["../../node_modules/lucide-react/dist/esm/icons/pause.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../src/components/audio-recorder/audio-recorder.agent.ts","../../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 [\"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","/* -------------------------------------------------------------------- */\n/* Agent adapter — AudioRecorder. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AudioRecorderHandle } from './audio-recorder';\n\nexport const audioRecorderAgent: AgentAdapter<AudioRecorderHandle> = {\n id: 'audio-recorder',\n capabilities: ['submit'],\n state: {\n isRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.isRecording',\n description: 'True while actively capturing audio (not paused).',\n read: (handle) => handle.isRecording(),\n },\n duration: {\n type: 'number',\n descriptionKey: 'ui.agent.audioRecorder.state.duration',\n description:\n 'Elapsed recording time in milliseconds (paused time excluded).',\n read: (handle) => handle.getDuration(),\n },\n hasRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.hasRecording',\n description:\n 'True when a completed recording is available for submission.',\n read: (handle) => handle.hasRecording(),\n },\n },\n actions: {\n start_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.startRecording',\n description: 'Request microphone permission and begin recording.',\n invoke: (handle) => handle.startRecording(),\n },\n stop_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.stopRecording',\n description: 'Stop the current recording and finalise the blob.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n discard: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.audioRecorder.actions.discard',\n description:\n 'Cancel the recording. Irreversible — the captured audio is dropped.',\n invoke: (handle) => {\n handle.discard();\n },\n },\n submit: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.submit',\n description:\n 'Stop the active recording, finalising it via onRecordingComplete.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'audio-recorder',\n description: 'Marks the AudioRecorder wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\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';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { audioRecorderAgent } from './audio-recorder.agent';\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:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | '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:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | '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\n/** Curated imperative handle for agent / external automation. */\nexport interface AudioRecorderHandle {\n isRecording: () => boolean;\n getDuration: () => number;\n hasRecording: () => boolean;\n startRecording: () => Promise<void> | void;\n stopRecording: () => void;\n discard: () => void;\n}\n\nexport interface AudioRecorderProps\n extends\n 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<\n AudioRecorderHandle,\n AudioRecorderProps\n>(\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 // Monotonic `performance.now()` start timestamp for the max-duration\n // timer. Wall-clock `Date.now()` jumps on NTP / timezone changes.\n const perfStartRef = useRef<number>(0);\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 unmount OR a cancel() between the permission prompt\n // and resolution — otherwise the freshly-acquired tracks leak and the\n // browser's mic indicator stays live, secretly capturing audio.\n if (unmountedRef.current || cancelledRef.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 perfStartRef.current = performance.now();\n recorder.start(1000);\n dispatch({ type: 'start' });\n } catch (err: unknown) {\n const errorName = 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 (\n errorName === 'NotFoundError' ||\n errorName === 'OverconstrainedError'\n ) {\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 // Use the monotonic clock so an NTP / timezone jump mid-recording\n // doesn't skew the remaining-time calc.\n const alreadyElapsed =\n performance.now() - perfStartRef.current - 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 agentHandle = useMemo<AudioRecorderHandle>(\n () => ({\n isRecording: () => state.kind === 'recording',\n getDuration: () => elapsedMs,\n hasRecording: () => state.kind === 'stopped',\n startRecording: () => requestAndStart(),\n stopRecording: () => stop(),\n discard: () => cancel(),\n }),\n [state, elapsedMs, requestAndStart, stop, cancel],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(audioRecorderAgent, agentHandle, rest.id);\n\n const deviceOptions: SelectOption<string>[] = devices.map((d) => ({\n value: d.deviceId,\n label: d.label || t('chat.audio.selectDevice'),\n }));\n\n const statusText = (() => {\n switch (state.kind) {\n case 'idle':\n return t('chat.audio.idle');\n case 'requesting':\n return t('common.loading');\n case 'recording':\n return t('chat.audio.recording');\n case 'paused':\n return t('chat.audio.paused');\n case 'stopped':\n return t('chat.audio.idle');\n case 'error':\n if (state.type === 'permission-denied')\n return t('chat.audio.permissionDenied');\n if (state.type === 'unsupported') return t('chat.audio.unsupported');\n return t('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 data-component=\"audio-recorder\"\n data-component-id={rest.id}\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('chat.audio.record')}\n </Button>\n ) : null}\n {isRecording ? (\n <IconButton\n icon={<Pause />}\n aria-label={t('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('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('chat.audio.stop')}\n intent=\"primary\"\n size=\"sm\"\n onClick={stop}\n />\n <IconButton\n icon={<X />}\n aria-label={t('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('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('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","Pause","createLucideIcon","Play","audioRecorderAgent","handle","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","perfStartRef","supported","useEffect","_a","list","mics","d","cleanupStream","useCallback","held","requestAndStart","nextStream","tr","mimeType","recorder","event","blob","err","errorName","pause","resume","stop","started","pausedMs","duration","cancel","alreadyElapsed","remaining","_b","elapsedMs","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","deviceOptions","statusText","isRecording","isPaused","hasError","jsxs","jsx","AudioVisualiser","Button","Mic","IconButton","Fragment","Square","X","Select","v","Alert"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -8,7 +8,7 @@ import { F as D } from "./form-field-BOm9hK35.js";
8
8
  import { N as p } from "./number-input-Dj5L3pXK.js";
9
9
  import { C as M } from "./card-DPmk26CL.js";
10
10
  import { B as na } from "./badge-zsf5i5bH.js";
11
- import { B as ra, I as sa, b as oa } from "./insert-result-C5ABnzDl.js";
11
+ import { B as ra, I as sa, b as oa } from "./insert-result-DNdi_JYW.js";
12
12
  import { b as ca, e as ma, c as da, f as O, l as W, k as ua } from "./bmi-BxD-tFzU.js";
13
13
  const ga = la("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
14
14
  variants: {
@@ -255,4 +255,4 @@ pa.displayName = "BmiCalculator";
255
255
  export {
256
256
  pa as B
257
257
  };
258
- //# sourceMappingURL=bmi-calculator-CQqXTVNL.js.map
258
+ //# sourceMappingURL=bmi-calculator-DdylQzT6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bmi-calculator-CQqXTVNL.js","sources":["../../src/components/bmi-calculator/bmi-calculator.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* BmiCalculator — height + weight → WHO body-mass-index, shown on a */\n/* banded-linear gauge. */\n/* */\n/* - Maths + unit conversion live in `./bmi` (pure, separately tested). */\n/* - Metric ⇄ imperial toggle persists the entered figures across the */\n/* switch by converting them (a patient measured in lb/ft doesn't */\n/* lose their numbers when a clinician flips to kg/cm). */\n/* - The gauge is the shared `BandedGauge`: a horizontal WHO-banded bar */\n/* (15–40) with a marker at the BMI's x-position. The SAME geometry */\n/* bakes into the inserted result-card PNG (banded variant), so the */\n/* on-screen widget and the rasterised card never drift. The band */\n/* fills come from semantic tokens (`--info` / `--success` / */\n/* `--warning-readable` / `--destructive`) — the contrast-safe */\n/* `--warning-readable` token handles the overweight orange in every */\n/* theme, so no `getComputedStyle` arc-colour sampling is needed. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useId, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { BandedGauge, bmiBands } from '../_shared/banded-gauge';\nimport {\n type UnitSystem,\n type BmiCategory,\n computeBmi,\n bmiCategory,\n cmToFtIn,\n ftInToCm,\n kgToLb,\n lbToKg,\n} from './bmi';\n\n/* ------------------------------------------------------------------ */\n/* Result payload emitted to consumers */\n/* ------------------------------------------------------------------ */\n\nexport interface BmiResult {\n /** BMI in kg/m². */\n bmi: number;\n /** WHO category the BMI falls into. */\n category: BmiCategory;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: {\n full: 'ds:w-full',\n auto: 'ds:inline-flex',\n },\n },\n defaultVariants: { width: 'full' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic intent for the Stat headline */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_BADGE: Record<\n BmiCategory,\n 'info' | 'success' | 'warning' | 'error'\n> = {\n underweight: 'info',\n normal: 'success',\n overweight: 'warning',\n obese: 'error',\n};\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic band token. */\n/* */\n/* The four WHO bands carry these tokens both on-screen (the shared */\n/* `bmiBands()` definition fills each zone with the same name) and in */\n/* the card chip's `highlightToken`. `overweight` uses */\n/* `--warning-readable` — the kit's contrast-safe orange that already */\n/* resolves correctly per theme (orange-600 in light/non-accessible, */\n/* `--warning` elsewhere), so NO `getComputedStyle` arc sampling or */\n/* `document.documentElement` override is needed. */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_TOKEN: Record<BmiCategory, string> = {\n underweight: '--info',\n normal: '--success',\n overweight: '--warning-readable',\n obese: '--destructive',\n};\n\nexport interface BmiCalculatorProps extends VariantProps<typeof rootVariants> {\n /** Initial unit system. Defaults to `'metric'`. */\n defaultUnitSystem?: UnitSystem;\n /** Fires whenever a valid BMI can be computed (and with `null` when it can't). */\n onResultChange?: (result: BmiResult | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/** Round to one decimal place — used when seeding a unit-switch. */\nconst round1 = (n: number): number => Math.round(n * 10) / 10;\n\nexport const BmiCalculator = forwardRef<HTMLDivElement, BmiCalculatorProps>(\n (\n {\n defaultUnitSystem = 'metric',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const heightGroupId = useId();\n\n const [unitSystem, setUnitSystem] = useState<UnitSystem>(defaultUnitSystem);\n\n // Raw per-system inputs. Metric is canonical for cm/kg; imperial keeps\n // ft + in + lb so typing isn't fought by rounding round-trips.\n const [heightCm, setHeightCm] = useState<number | null>(null);\n const [weightKg, setWeightKg] = useState<number | null>(null);\n const [heightFt, setHeightFt] = useState<number | null>(null);\n const [heightIn, setHeightIn] = useState<number | null>(null);\n const [weightLb, setWeightLb] = useState<number | null>(null);\n\n const handleUnitChange = (next: string): void => {\n const target = next as UnitSystem;\n if (target === unitSystem) return;\n if (target === 'imperial') {\n if (heightCm !== null) {\n const { ft, in: inches } = cmToFtIn(heightCm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n if (weightKg !== null) setWeightLb(round1(kgToLb(weightKg)));\n } else {\n if (heightFt !== null || heightIn !== null) {\n setHeightCm(round1(ftInToCm(heightFt ?? 0, heightIn ?? 0)));\n }\n if (weightLb !== null) setWeightKg(round1(lbToKg(weightLb)));\n }\n setUnitSystem(target);\n };\n\n /* Canonical metric figures for the active system. */\n const canonicalHeightCm =\n unitSystem === 'metric'\n ? heightCm\n : heightFt !== null || heightIn !== null\n ? ftInToCm(heightFt ?? 0, heightIn ?? 0)\n : null;\n const canonicalWeightKg =\n unitSystem === 'metric'\n ? weightKg\n : weightLb !== null\n ? lbToKg(weightLb)\n : null;\n\n const bmi = computeBmi(canonicalWeightKg, canonicalHeightCm);\n const category = bmi !== null ? bmiCategory(bmi) : null;\n\n const bmiFormatter = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n // Notify consumers without re-firing on unrelated re-renders.\n useEffect(() => {\n onResultChange?.(\n bmi !== null && category !== null ? { bmi, category } : null,\n );\n }, [bmi, category, onResultChange]);\n\n const isMetric = unitSystem === 'metric';\n\n // Pre-translated gauge labels, shared by the on-screen widget and the\n // inserted card so both surfaces read identically. The shared `BandedGauge`\n // is i18n-agnostic — every visible string arrives already through `t()`.\n const gauge = useMemo(() => {\n if (bmi === null || category === null) return null;\n const { bands, min, max, ticks } = bmiBands();\n const valueLabel = bmiFormatter.format(bmi);\n const categoryLabel = t(`bmiCalculator.category.${category}`);\n const rangeLabel = t(`bmiCalculator.range.${category}`);\n const ariaLabel = t('bmiCalculator.gaugeAria', {\n bmi: valueLabel,\n category: categoryLabel,\n range: rangeLabel,\n });\n return {\n value: bmi,\n bands,\n min,\n max,\n ticks,\n valueLabel,\n categoryLabel,\n rangeLabel,\n ariaLabel,\n };\n }, [bmi, category, bmiFormatter, t]);\n\n return (\n <div\n ref={ref}\n data-component=\"bmi-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('bmiCalculator.unitSystem.label')}\n variant=\"horizontal\"\n value={unitSystem}\n onValueChange={handleUnitChange}\n >\n <Radio label={t('bmiCalculator.unitSystem.metric')} value=\"metric\" />\n <Radio\n label={t('bmiCalculator.unitSystem.imperial')}\n value=\"imperial\"\n />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {isMetric ? (\n <FormField\n label={`${t('bmiCalculator.height')} (${t('bmiCalculator.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n ) : (\n <div role=\"group\" aria-labelledby={heightGroupId}>\n <span\n id={heightGroupId}\n className=\"type-label ds:mb-[var(--spacing-xs)] ds:block ds:text-foreground\"\n >\n {t('bmiCalculator.height')}\n </span>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <NumberInput\n mode=\"integer\"\n min={0}\n value={heightFt}\n onChange={setHeightFt}\n aria-label={t('bmiCalculator.feet')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.ft')}\n </span>\n <NumberInput\n mode=\"decimal\"\n min={0}\n max={11.9}\n step={0.5}\n value={heightIn}\n onChange={setHeightIn}\n aria-label={t('bmiCalculator.inches')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.in')}\n </span>\n </div>\n </div>\n )}\n\n <FormField\n label={`${t('bmiCalculator.weight')} (${t(\n isMetric ? 'bmiCalculator.units.kg' : 'bmiCalculator.units.lb',\n )})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={isMetric ? 0.1 : 0.5}\n value={isMetric ? weightKg : weightLb}\n onChange={isMetric ? setWeightKg : setWeightLb}\n />\n </FormField>\n </div>\n\n {/* Concise polite announcement when the result resolves — the gauge\n itself stays out of the live region to avoid re-reading on every\n keystroke. */}\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {gauge ? gauge.ariaLabel : ''}\n </p>\n\n {bmi !== null && category !== null && gauge !== null ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.category.label')}\n </span>\n <Badge variant={CATEGORY_BADGE[category]} size=\"lg\">\n {t(`bmiCalculator.category.${category}`)}\n </Badge>\n <p className=\"type-body ds:text-muted-foreground\">\n {gauge.rangeLabel}\n </p>\n </div>\n {/* `data-bmi-category` exposes the WHO band so the gauge's\n semantic colour is assertable without sampling pixels. The\n shared BandedGauge fills each zone via `var(<token>)`, so a\n theme switch repaints the bands with no JS re-sample. */}\n <div\n data-bmi-category={category}\n className=\"ds:w-full ds:max-w-[320px]\"\n >\n <BandedGauge model={gauge} className=\"ds:w-full\" />\n </div>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bmi'),\n icon: 'scale',\n highlight: t(`bmiCalculator.category.${category}`),\n // Chip shares the WHO-category semantic token so the\n // inserted PNG chip matches the on-screen band colour.\n highlightToken: CATEGORY_TOKEN[category],\n brand: insertBrand,\n // Banded gauge: the SAME geometry + WHO bands as the\n // on-screen widget, baked into the card PNG with\n // probe-resolved theme colours.\n gauge: {\n variant: 'banded',\n value: bmi,\n bands: gauge.bands,\n min: gauge.min,\n max: gauge.max,\n valueLabel: gauge.valueLabel,\n categoryLabel: gauge.categoryLabel,\n rangeLabel: gauge.rangeLabel,\n ariaLabel: gauge.ariaLabel,\n ticks: gauge.ticks,\n },\n fields: [\n {\n // Mirrors the on-screen scale glyph + header icon.\n icon: 'scale',\n label: t('insert.title.bmi'),\n value: gauge.valueLabel,\n },\n {\n // WHO band is a classification → tag glyph.\n icon: 'tag',\n label: t('bmiCalculator.category.label'),\n value: gauge.categoryLabel,\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bmiCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBmiCalculator.displayName = 'BmiCalculator';\n"],"names":["rootVariants","cva","CATEGORY_BADGE","CATEGORY_TOKEN","round1","n","BmiCalculator","forwardRef","defaultUnitSystem","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightGroupId","useId","unitSystem","setUnitSystem","useState","heightCm","setHeightCm","weightKg","setWeightKg","heightFt","setHeightFt","heightIn","setHeightIn","weightLb","setWeightLb","handleUnitChange","next","target","ft","inches","cmToFtIn","kgToLb","ftInToCm","lbToKg","canonicalHeightCm","canonicalWeightKg","bmi","computeBmi","category","bmiCategory","bmiFormatter","useMemo","useEffect","isMetric","gauge","bands","min","max","ticks","bmiBands","valueLabel","categoryLabel","rangeLabel","ariaLabel","jsxs","RadioGroup","jsx","Radio","FormField","NumberInput","Card","Badge","BandedGauge","InsertButton"],"mappings":"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"}
1
+ {"version":3,"file":"bmi-calculator-DdylQzT6.js","sources":["../../src/components/bmi-calculator/bmi-calculator.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* BmiCalculator — height + weight → WHO body-mass-index, shown on a */\n/* banded-linear gauge. */\n/* */\n/* - Maths + unit conversion live in `./bmi` (pure, separately tested). */\n/* - Metric ⇄ imperial toggle persists the entered figures across the */\n/* switch by converting them (a patient measured in lb/ft doesn't */\n/* lose their numbers when a clinician flips to kg/cm). */\n/* - The gauge is the shared `BandedGauge`: a horizontal WHO-banded bar */\n/* (15–40) with a marker at the BMI's x-position. The SAME geometry */\n/* bakes into the inserted result-card PNG (banded variant), so the */\n/* on-screen widget and the rasterised card never drift. The band */\n/* fills come from semantic tokens (`--info` / `--success` / */\n/* `--warning-readable` / `--destructive`) — the contrast-safe */\n/* `--warning-readable` token handles the overweight orange in every */\n/* theme, so no `getComputedStyle` arc-colour sampling is needed. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useId, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { BandedGauge, bmiBands } from '../_shared/banded-gauge';\nimport {\n type UnitSystem,\n type BmiCategory,\n computeBmi,\n bmiCategory,\n cmToFtIn,\n ftInToCm,\n kgToLb,\n lbToKg,\n} from './bmi';\n\n/* ------------------------------------------------------------------ */\n/* Result payload emitted to consumers */\n/* ------------------------------------------------------------------ */\n\nexport interface BmiResult {\n /** BMI in kg/m². */\n bmi: number;\n /** WHO category the BMI falls into. */\n category: BmiCategory;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: {\n full: 'ds:w-full',\n auto: 'ds:inline-flex',\n },\n },\n defaultVariants: { width: 'full' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic intent for the Stat headline */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_BADGE: Record<\n BmiCategory,\n 'info' | 'success' | 'warning' | 'error'\n> = {\n underweight: 'info',\n normal: 'success',\n overweight: 'warning',\n obese: 'error',\n};\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic band token. */\n/* */\n/* The four WHO bands carry these tokens both on-screen (the shared */\n/* `bmiBands()` definition fills each zone with the same name) and in */\n/* the card chip's `highlightToken`. `overweight` uses */\n/* `--warning-readable` — the kit's contrast-safe orange that already */\n/* resolves correctly per theme (orange-600 in light/non-accessible, */\n/* `--warning` elsewhere), so NO `getComputedStyle` arc sampling or */\n/* `document.documentElement` override is needed. */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_TOKEN: Record<BmiCategory, string> = {\n underweight: '--info',\n normal: '--success',\n overweight: '--warning-readable',\n obese: '--destructive',\n};\n\nexport interface BmiCalculatorProps extends VariantProps<typeof rootVariants> {\n /** Initial unit system. Defaults to `'metric'`. */\n defaultUnitSystem?: UnitSystem;\n /** Fires whenever a valid BMI can be computed (and with `null` when it can't). */\n onResultChange?: (result: BmiResult | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/** Round to one decimal place — used when seeding a unit-switch. */\nconst round1 = (n: number): number => Math.round(n * 10) / 10;\n\nexport const BmiCalculator = forwardRef<HTMLDivElement, BmiCalculatorProps>(\n (\n {\n defaultUnitSystem = 'metric',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const heightGroupId = useId();\n\n const [unitSystem, setUnitSystem] = useState<UnitSystem>(defaultUnitSystem);\n\n // Raw per-system inputs. Metric is canonical for cm/kg; imperial keeps\n // ft + in + lb so typing isn't fought by rounding round-trips.\n const [heightCm, setHeightCm] = useState<number | null>(null);\n const [weightKg, setWeightKg] = useState<number | null>(null);\n const [heightFt, setHeightFt] = useState<number | null>(null);\n const [heightIn, setHeightIn] = useState<number | null>(null);\n const [weightLb, setWeightLb] = useState<number | null>(null);\n\n const handleUnitChange = (next: string): void => {\n const target = next as UnitSystem;\n if (target === unitSystem) return;\n if (target === 'imperial') {\n if (heightCm !== null) {\n const { ft, in: inches } = cmToFtIn(heightCm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n if (weightKg !== null) setWeightLb(round1(kgToLb(weightKg)));\n } else {\n if (heightFt !== null || heightIn !== null) {\n setHeightCm(round1(ftInToCm(heightFt ?? 0, heightIn ?? 0)));\n }\n if (weightLb !== null) setWeightKg(round1(lbToKg(weightLb)));\n }\n setUnitSystem(target);\n };\n\n /* Canonical metric figures for the active system. */\n const canonicalHeightCm =\n unitSystem === 'metric'\n ? heightCm\n : heightFt !== null || heightIn !== null\n ? ftInToCm(heightFt ?? 0, heightIn ?? 0)\n : null;\n const canonicalWeightKg =\n unitSystem === 'metric'\n ? weightKg\n : weightLb !== null\n ? lbToKg(weightLb)\n : null;\n\n const bmi = computeBmi(canonicalWeightKg, canonicalHeightCm);\n const category = bmi !== null ? bmiCategory(bmi) : null;\n\n const bmiFormatter = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n // Notify consumers without re-firing on unrelated re-renders.\n useEffect(() => {\n onResultChange?.(\n bmi !== null && category !== null ? { bmi, category } : null,\n );\n }, [bmi, category, onResultChange]);\n\n const isMetric = unitSystem === 'metric';\n\n // Pre-translated gauge labels, shared by the on-screen widget and the\n // inserted card so both surfaces read identically. The shared `BandedGauge`\n // is i18n-agnostic — every visible string arrives already through `t()`.\n const gauge = useMemo(() => {\n if (bmi === null || category === null) return null;\n const { bands, min, max, ticks } = bmiBands();\n const valueLabel = bmiFormatter.format(bmi);\n const categoryLabel = t(`bmiCalculator.category.${category}`);\n const rangeLabel = t(`bmiCalculator.range.${category}`);\n const ariaLabel = t('bmiCalculator.gaugeAria', {\n bmi: valueLabel,\n category: categoryLabel,\n range: rangeLabel,\n });\n return {\n value: bmi,\n bands,\n min,\n max,\n ticks,\n valueLabel,\n categoryLabel,\n rangeLabel,\n ariaLabel,\n };\n }, [bmi, category, bmiFormatter, t]);\n\n return (\n <div\n ref={ref}\n data-component=\"bmi-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('bmiCalculator.unitSystem.label')}\n variant=\"horizontal\"\n value={unitSystem}\n onValueChange={handleUnitChange}\n >\n <Radio label={t('bmiCalculator.unitSystem.metric')} value=\"metric\" />\n <Radio\n label={t('bmiCalculator.unitSystem.imperial')}\n value=\"imperial\"\n />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {isMetric ? (\n <FormField\n label={`${t('bmiCalculator.height')} (${t('bmiCalculator.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n ) : (\n <div role=\"group\" aria-labelledby={heightGroupId}>\n <span\n id={heightGroupId}\n className=\"type-label ds:mb-[var(--spacing-xs)] ds:block ds:text-foreground\"\n >\n {t('bmiCalculator.height')}\n </span>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <NumberInput\n mode=\"integer\"\n min={0}\n value={heightFt}\n onChange={setHeightFt}\n aria-label={t('bmiCalculator.feet')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.ft')}\n </span>\n <NumberInput\n mode=\"decimal\"\n min={0}\n max={11.9}\n step={0.5}\n value={heightIn}\n onChange={setHeightIn}\n aria-label={t('bmiCalculator.inches')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.in')}\n </span>\n </div>\n </div>\n )}\n\n <FormField\n label={`${t('bmiCalculator.weight')} (${t(\n isMetric ? 'bmiCalculator.units.kg' : 'bmiCalculator.units.lb',\n )})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={isMetric ? 0.1 : 0.5}\n value={isMetric ? weightKg : weightLb}\n onChange={isMetric ? setWeightKg : setWeightLb}\n />\n </FormField>\n </div>\n\n {/* Concise polite announcement when the result resolves — the gauge\n itself stays out of the live region to avoid re-reading on every\n keystroke. */}\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {gauge ? gauge.ariaLabel : ''}\n </p>\n\n {bmi !== null && category !== null && gauge !== null ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.category.label')}\n </span>\n <Badge variant={CATEGORY_BADGE[category]} size=\"lg\">\n {t(`bmiCalculator.category.${category}`)}\n </Badge>\n <p className=\"type-body ds:text-muted-foreground\">\n {gauge.rangeLabel}\n </p>\n </div>\n {/* `data-bmi-category` exposes the WHO band so the gauge's\n semantic colour is assertable without sampling pixels. The\n shared BandedGauge fills each zone via `var(<token>)`, so a\n theme switch repaints the bands with no JS re-sample. */}\n <div\n data-bmi-category={category}\n className=\"ds:w-full ds:max-w-[320px]\"\n >\n <BandedGauge model={gauge} className=\"ds:w-full\" />\n </div>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bmi'),\n icon: 'scale',\n highlight: t(`bmiCalculator.category.${category}`),\n // Chip shares the WHO-category semantic token so the\n // inserted PNG chip matches the on-screen band colour.\n highlightToken: CATEGORY_TOKEN[category],\n brand: insertBrand,\n // Banded gauge: the SAME geometry + WHO bands as the\n // on-screen widget, baked into the card PNG with\n // probe-resolved theme colours.\n gauge: {\n variant: 'banded',\n value: bmi,\n bands: gauge.bands,\n min: gauge.min,\n max: gauge.max,\n valueLabel: gauge.valueLabel,\n categoryLabel: gauge.categoryLabel,\n rangeLabel: gauge.rangeLabel,\n ariaLabel: gauge.ariaLabel,\n ticks: gauge.ticks,\n },\n fields: [\n {\n // Mirrors the on-screen scale glyph + header icon.\n icon: 'scale',\n label: t('insert.title.bmi'),\n value: gauge.valueLabel,\n },\n {\n // WHO band is a classification → tag glyph.\n icon: 'tag',\n label: t('bmiCalculator.category.label'),\n value: gauge.categoryLabel,\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bmiCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBmiCalculator.displayName = 'BmiCalculator';\n"],"names":["rootVariants","cva","CATEGORY_BADGE","CATEGORY_TOKEN","round1","n","BmiCalculator","forwardRef","defaultUnitSystem","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightGroupId","useId","unitSystem","setUnitSystem","useState","heightCm","setHeightCm","weightKg","setWeightKg","heightFt","setHeightFt","heightIn","setHeightIn","weightLb","setWeightLb","handleUnitChange","next","target","ft","inches","cmToFtIn","kgToLb","ftInToCm","lbToKg","canonicalHeightCm","canonicalWeightKg","bmi","computeBmi","category","bmiCategory","bmiFormatter","useMemo","useEffect","isMetric","gauge","bands","min","max","ticks","bmiBands","valueLabel","categoryLabel","rangeLabel","ariaLabel","jsxs","RadioGroup","jsx","Radio","FormField","NumberInput","Card","Badge","BandedGauge","InsertButton"],"mappings":"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"}