@alfadocs/ui-kit-debug 0.70.0 → 0.71.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 (568) hide show
  1. package/dist/_chunks/address-fields-CPbFJ8e8.js +246 -0
  2. package/dist/_chunks/address-fields-CPbFJ8e8.js.map +1 -0
  3. package/dist/_chunks/{ai-prompt-input-CuhTo9mh.js → ai-prompt-input-V4DdOeqv.js} +2 -2
  4. package/dist/_chunks/{ai-prompt-input-CuhTo9mh.js.map → ai-prompt-input-V4DdOeqv.js.map} +1 -1
  5. package/dist/_chunks/{alia-sidebar-B47qRQb5.js → alia-sidebar-DvIUzIX9.js} +107 -106
  6. package/dist/_chunks/alia-sidebar-DvIUzIX9.js.map +1 -0
  7. package/dist/_chunks/{anatomy-scheme-CJB6dI6p.js → anatomy-scheme-CXSk11UJ.js} +2 -2
  8. package/dist/_chunks/{anatomy-scheme-CJB6dI6p.js.map → anatomy-scheme-CXSk11UJ.js.map} +1 -1
  9. package/dist/_chunks/{app-frame-BYx1gcV7.js → app-frame-DIEMIC5V.js} +67 -56
  10. package/dist/_chunks/app-frame-DIEMIC5V.js.map +1 -0
  11. package/dist/_chunks/{appointment-card-C06aZqA7.js → appointment-card-DVaeJNVB.js} +82 -98
  12. package/dist/_chunks/appointment-card-DVaeJNVB.js.map +1 -0
  13. package/dist/_chunks/{appointment-timeline-BJM0S_Fg.js → appointment-timeline-PJgnrjFb.js} +159 -157
  14. package/dist/_chunks/appointment-timeline-PJgnrjFb.js.map +1 -0
  15. package/dist/_chunks/{appointment-tray-DRRw5ROi.js → appointment-tray-B16QPGbm.js} +2 -2
  16. package/dist/_chunks/{appointment-tray-DRRw5ROi.js.map → appointment-tray-B16QPGbm.js.map} +1 -1
  17. package/dist/_chunks/{audio-recorder-Cpdk5qpQ.js → audio-recorder-DNDsOLqO.js} +2 -2
  18. package/dist/_chunks/{audio-recorder-Cpdk5qpQ.js.map → audio-recorder-DNDsOLqO.js.map} +1 -1
  19. package/dist/_chunks/{autocomplete-DOeGouCL.js → autocomplete-BrONKN8l.js} +168 -146
  20. package/dist/_chunks/autocomplete-BrONKN8l.js.map +1 -0
  21. package/dist/_chunks/{bishop-score-DnYWtZa_.js → bishop-score-Cym_TeQY.js} +2 -2
  22. package/dist/_chunks/{bishop-score-DnYWtZa_.js.map → bishop-score-Cym_TeQY.js.map} +1 -1
  23. package/dist/_chunks/{booking-DUBI0oqt.js → booking-C7do4vaR.js} +4 -4
  24. package/dist/_chunks/{booking-DUBI0oqt.js.map → booking-C7do4vaR.js.map} +1 -1
  25. package/dist/_chunks/{button-group-Ciq6J4IW.js → button-group-CvEnVzY7.js} +32 -35
  26. package/dist/_chunks/{button-group-Ciq6J4IW.js.map → button-group-CvEnVzY7.js.map} +1 -1
  27. package/dist/_chunks/{care-plan-card-C5sTfY9G.js → care-plan-card-DzPDYgtK.js} +3 -3
  28. package/dist/_chunks/{care-plan-card-C5sTfY9G.js.map → care-plan-card-DzPDYgtK.js.map} +1 -1
  29. package/dist/_chunks/{care-plan-entry-card-CXnxGCWA.js → care-plan-entry-card-CEnQy7YP.js} +3 -3
  30. package/dist/_chunks/{care-plan-entry-card-CXnxGCWA.js.map → care-plan-entry-card-CEnQy7YP.js.map} +1 -1
  31. package/dist/_chunks/care-plan-header-DcXFXWit.js +198 -0
  32. package/dist/_chunks/care-plan-header-DcXFXWit.js.map +1 -0
  33. package/dist/_chunks/{chat-message-3V54YipB.js → chat-message-DzpcJR-q.js} +25 -23
  34. package/dist/_chunks/chat-message-DzpcJR-q.js.map +1 -0
  35. package/dist/_chunks/city-input-Dkgaak7I.js +169 -0
  36. package/dist/_chunks/city-input-Dkgaak7I.js.map +1 -0
  37. package/dist/_chunks/clipboard-list-S7s-MXQq.js +25 -0
  38. package/dist/_chunks/clipboard-list-S7s-MXQq.js.map +1 -0
  39. package/dist/_chunks/{combobox-Clum7gJ1.js → combobox-DnqSF0IH.js} +131 -114
  40. package/dist/_chunks/combobox-DnqSF0IH.js.map +1 -0
  41. package/dist/_chunks/connection-status-CY1HV8Wg.js +108 -0
  42. package/dist/_chunks/connection-status-CY1HV8Wg.js.map +1 -0
  43. package/dist/_chunks/control-room-rail-FAQZrGVL.js +333 -0
  44. package/dist/_chunks/control-room-rail-FAQZrGVL.js.map +1 -0
  45. package/dist/_chunks/country-select-BwUZQvTa.js +709 -0
  46. package/dist/_chunks/country-select-BwUZQvTa.js.map +1 -0
  47. package/dist/_chunks/editable-currency-cell-renderer-CGELrkIj.js +410 -0
  48. package/dist/_chunks/editable-currency-cell-renderer-CGELrkIj.js.map +1 -0
  49. package/dist/_chunks/{entity-card-9_62gY7l.js → entity-card-DmrgYSEX.js} +4 -4
  50. package/dist/_chunks/{entity-card-9_62gY7l.js.map → entity-card-DmrgYSEX.js.map} +1 -1
  51. package/dist/_chunks/entity-summary-CaM1Y-xE.js +291 -0
  52. package/dist/_chunks/entity-summary-CaM1Y-xE.js.map +1 -0
  53. package/dist/_chunks/field-array-siUZzfYe.js +146 -0
  54. package/dist/_chunks/field-array-siUZzfYe.js.map +1 -0
  55. package/dist/_chunks/{field-value-NXYczdpO.js → field-value-3jMM0uDx.js} +2 -2
  56. package/dist/_chunks/field-value-3jMM0uDx.js.map +1 -0
  57. package/dist/_chunks/{gestational-age-calculator-CF2ISaYQ.js → gestational-age-calculator-DKzEV5Qi.js} +2 -2
  58. package/dist/_chunks/{gestational-age-calculator-CF2ISaYQ.js.map → gestational-age-calculator-DKzEV5Qi.js.map} +1 -1
  59. package/dist/_chunks/iban-input-B0TWzR1R.js +436 -0
  60. package/dist/_chunks/iban-input-B0TWzR1R.js.map +1 -0
  61. package/dist/_chunks/icon-picker-0B7KhrF1.js +272 -0
  62. package/dist/_chunks/icon-picker-0B7KhrF1.js.map +1 -0
  63. package/dist/_chunks/image-cropper-D9jqJy19.js +367 -0
  64. package/dist/_chunks/image-cropper-D9jqJy19.js.map +1 -0
  65. package/dist/_chunks/{link-cell-renderer-CTXqtXV-.js → link-cell-renderer-De_SLjSq.js} +262 -261
  66. package/dist/_chunks/link-cell-renderer-De_SLjSq.js.map +1 -0
  67. package/dist/_chunks/list-checks-BUs75d_o.js +18 -0
  68. package/dist/_chunks/list-checks-BUs75d_o.js.map +1 -0
  69. package/dist/_chunks/{marketplace-app-shell-Skhfp6vK.js → marketplace-app-shell-BGqkywsi.js} +3 -3
  70. package/dist/_chunks/{marketplace-app-shell-Skhfp6vK.js.map → marketplace-app-shell-BGqkywsi.js.map} +1 -1
  71. package/dist/_chunks/message-card-DsHFFiL1.js +319 -0
  72. package/dist/_chunks/message-card-DsHFFiL1.js.map +1 -0
  73. package/dist/_chunks/{message-tray-DwrBLJlf.js → message-tray-C0a6CL1_.js} +172 -135
  74. package/dist/_chunks/message-tray-C0a6CL1_.js.map +1 -0
  75. package/dist/_chunks/{multi-select-BdHHDrRN.js → multi-select-WE4S9FIF.js} +75 -63
  76. package/dist/_chunks/{multi-select-BdHHDrRN.js.map → multi-select-WE4S9FIF.js.map} +1 -1
  77. package/dist/_chunks/nav-grid-9xphY3FM.js +169 -0
  78. package/dist/_chunks/nav-grid-9xphY3FM.js.map +1 -0
  79. package/dist/_chunks/notes-panel-DXiMfuvp.js +320 -0
  80. package/dist/_chunks/notes-panel-DXiMfuvp.js.map +1 -0
  81. package/dist/_chunks/notification-card-BMqNzCIt.js +290 -0
  82. package/dist/_chunks/notification-card-BMqNzCIt.js.map +1 -0
  83. package/dist/_chunks/{notification-tray-AEun6DN2.js → notification-tray-BmUlCx3g.js} +201 -166
  84. package/dist/_chunks/notification-tray-BmUlCx3g.js.map +1 -0
  85. package/dist/_chunks/{operator-hero-CR0Rqh4-.js → operator-hero-BO8TqzX2.js} +2 -2
  86. package/dist/_chunks/{operator-hero-CR0Rqh4-.js.map → operator-hero-BO8TqzX2.js.map} +1 -1
  87. package/dist/_chunks/panel-header-D313n_9-.js +105 -0
  88. package/dist/_chunks/panel-header-D313n_9-.js.map +1 -0
  89. package/dist/_chunks/{patient-details-Dlhqb5ig.js → patient-details-DgfTJimE.js} +280 -196
  90. package/dist/_chunks/patient-details-DgfTJimE.js.map +1 -0
  91. package/dist/_chunks/{patient-search-Be6cLrHR.js → patient-search-CSWQKOSP.js} +2 -2
  92. package/dist/_chunks/{patient-search-Be6cLrHR.js.map → patient-search-CSWQKOSP.js.map} +1 -1
  93. package/dist/_chunks/{patient-shell-DV3XEtIB.js → patient-shell-BMwsIKlW.js} +3 -3
  94. package/dist/_chunks/{patient-shell-DV3XEtIB.js.map → patient-shell-BMwsIKlW.js.map} +1 -1
  95. package/dist/_chunks/{patient-summary-card-WySCMwwA.js → patient-summary-card-D4NdgYJB.js} +27 -12
  96. package/dist/_chunks/{patient-summary-card-WySCMwwA.js.map → patient-summary-card-D4NdgYJB.js.map} +1 -1
  97. package/dist/_chunks/{patient-table-CHxf3Oqk.js → patient-table-CERknpd8.js} +3 -3
  98. package/dist/_chunks/{patient-table-CHxf3Oqk.js.map → patient-table-CERknpd8.js.map} +1 -1
  99. package/dist/_chunks/{payment-request-card-BcZJwu9z.js → payment-request-card-Blf-MFNY.js} +2 -2
  100. package/dist/_chunks/{payment-request-card-BcZJwu9z.js.map → payment-request-card-Blf-MFNY.js.map} +1 -1
  101. package/dist/_chunks/permission-matrix-Bw5oexUt.js +174 -0
  102. package/dist/_chunks/permission-matrix-Bw5oexUt.js.map +1 -0
  103. package/dist/_chunks/position-grid-CcvqHaKN.js +169 -0
  104. package/dist/_chunks/position-grid-CcvqHaKN.js.map +1 -0
  105. package/dist/_chunks/postal-code-input-UCOYuRY2.js +192 -0
  106. package/dist/_chunks/postal-code-input-UCOYuRY2.js.map +1 -0
  107. package/dist/_chunks/{practice-results-C6qDfxos.js → practice-results-El5Z-oVp.js} +2 -2
  108. package/dist/_chunks/{practice-results-C6qDfxos.js.map → practice-results-El5Z-oVp.js.map} +1 -1
  109. package/dist/_chunks/{pregnancy-dating-CRVWswD-.js → pregnancy-dating-CunHrOpO.js} +2 -2
  110. package/dist/_chunks/{pregnancy-dating-CRVWswD-.js.map → pregnancy-dating-CunHrOpO.js.map} +1 -1
  111. package/dist/_chunks/{product-hub-panel-e6pW220e.js → product-hub-panel-DtU7KXxm.js} +257 -217
  112. package/dist/_chunks/product-hub-panel-DtU7KXxm.js.map +1 -0
  113. package/dist/_chunks/province-select-D_TZvix3.js +261 -0
  114. package/dist/_chunks/province-select-D_TZvix3.js.map +1 -0
  115. package/dist/_chunks/{public-header.agent-DqkqA-ca.js → public-header.agent-TxmC_x1I.js} +2 -2
  116. package/dist/_chunks/{public-header.agent-DqkqA-ca.js.map → public-header.agent-TxmC_x1I.js.map} +1 -1
  117. package/dist/_chunks/radiograph-panel.agent-tWjN2nHX.js +553 -0
  118. package/dist/_chunks/radiograph-panel.agent-tWjN2nHX.js.map +1 -0
  119. package/dist/_chunks/reviews-panel-DxkSrgMl.js +559 -0
  120. package/dist/_chunks/reviews-panel-DxkSrgMl.js.map +1 -0
  121. package/dist/_chunks/rich-text-editor-C8tyGjfb.js +2621 -0
  122. package/dist/_chunks/rich-text-editor-C8tyGjfb.js.map +1 -0
  123. package/dist/_chunks/{scroll-area-5wNK0Cyz.js → scroll-area-BZOvUhwQ.js} +2 -2
  124. package/dist/_chunks/scroll-area-BZOvUhwQ.js.map +1 -0
  125. package/dist/_chunks/{select-DMLG44F5.js → select-KsyRr8WH.js} +114 -102
  126. package/dist/_chunks/select-KsyRr8WH.js.map +1 -0
  127. package/dist/_chunks/{sheet-BxsE7eQm.js → sheet-umkfZjF6.js} +53 -42
  128. package/dist/_chunks/sheet-umkfZjF6.js.map +1 -0
  129. package/dist/_chunks/{sidebar-DY9jGjgt.js → sidebar-QCp9wHNP.js} +125 -113
  130. package/dist/_chunks/sidebar-QCp9wHNP.js.map +1 -0
  131. package/dist/_chunks/{tabs-BxcOziCo.js → tabs-CYZVKKDl.js} +2 -2
  132. package/dist/_chunks/{tabs-BxcOziCo.js.map → tabs-CYZVKKDl.js.map} +1 -1
  133. package/dist/_chunks/task-card-DCdsI0ZT.js +189 -0
  134. package/dist/_chunks/task-card-DCdsI0ZT.js.map +1 -0
  135. package/dist/_chunks/{task-tray-qOEQflu4.js → task-tray-DNVejijD.js} +2 -2
  136. package/dist/_chunks/{task-tray-qOEQflu4.js.map → task-tray-DNVejijD.js.map} +1 -1
  137. package/dist/_chunks/tasks-panel-C9odmawT.js +757 -0
  138. package/dist/_chunks/tasks-panel-C9odmawT.js.map +1 -0
  139. package/dist/_chunks/token-insert-menu-CFQqTe_n.js +147 -0
  140. package/dist/_chunks/token-insert-menu-CFQqTe_n.js.map +1 -0
  141. package/dist/_chunks/{ai-tools-rail-B5NEghsp.js → tool-rail-BZx0-yIr.js} +152 -139
  142. package/dist/_chunks/tool-rail-BZx0-yIr.js.map +1 -0
  143. package/dist/_chunks/{tooth-scheme-BhQoPNBD.js → tooth-scheme-DJZtzfeY.js} +470 -468
  144. package/dist/_chunks/tooth-scheme-DJZtzfeY.js.map +1 -0
  145. package/dist/_chunks/{transcript-panel-3THQX6nJ.js → transcript-panel-CHGHHHdT.js} +95 -83
  146. package/dist/_chunks/transcript-panel-CHGHHHdT.js.map +1 -0
  147. package/dist/_chunks/{unit-converter-YEpD9evj.js → unit-converter-CwlZbfdn.js} +2 -2
  148. package/dist/_chunks/{unit-converter-YEpD9evj.js.map → unit-converter-CwlZbfdn.js.map} +1 -1
  149. package/dist/_chunks/use-edge-resize-ZnGG7gyO.js.map +1 -1
  150. package/dist/_chunks/{workflow-map-Dy8mLCqF.js → workflow-map-M8MBBHQm.js} +106 -118
  151. package/dist/_chunks/workflow-map-M8MBBHQm.js.map +1 -0
  152. package/dist/agent-catalog.json +2062 -226
  153. package/dist/agent-i18n/en.json +206 -8
  154. package/dist/components/_shared/option.d.ts +2 -0
  155. package/dist/components/_shared/option.d.ts.map +1 -1
  156. package/dist/components/_shared/patient-fields.d.ts +1 -1
  157. package/dist/components/_shared/patient-fields.d.ts.map +1 -1
  158. package/dist/components/address-fields/address-fields.agent.d.ts +9 -0
  159. package/dist/components/address-fields/address-fields.agent.d.ts.map +1 -0
  160. package/dist/components/address-fields/address-fields.d.ts +29 -0
  161. package/dist/components/address-fields/address-fields.d.ts.map +1 -0
  162. package/dist/components/address-fields/index.d.ts +5 -0
  163. package/dist/components/address-fields/index.d.ts.map +1 -0
  164. package/dist/components/address-fields/index.js +6 -0
  165. package/dist/components/ai-prompt-input/index.js +1 -1
  166. package/dist/components/anatomy-scheme/index.js +1 -1
  167. package/dist/components/app-frame/app-frame.d.ts +2 -2
  168. package/dist/components/app-frame/app-frame.d.ts.map +1 -1
  169. package/dist/components/app-frame/index.js +1 -1
  170. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  171. package/dist/components/appointment-card/index.js +2 -2
  172. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -1
  173. package/dist/components/appointment-timeline/index.js +1 -1
  174. package/dist/components/audio-recorder/index.js +1 -1
  175. package/dist/components/autocomplete/autocomplete.d.ts +10 -0
  176. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  177. package/dist/components/autocomplete/index.js +1 -1
  178. package/dist/components/bishop-score/index.js +1 -1
  179. package/dist/components/booking/index.js +1 -1
  180. package/dist/components/button-group/button-group.d.ts.map +1 -1
  181. package/dist/components/button-group/index.js +1 -1
  182. package/dist/components/care-plan-card/index.js +1 -1
  183. package/dist/components/care-plan-entry-card/index.js +1 -1
  184. package/dist/components/care-plan-header/care-plan-header.d.ts +16 -5
  185. package/dist/components/care-plan-header/care-plan-header.d.ts.map +1 -1
  186. package/dist/components/care-plan-header/index.js +1 -1
  187. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  188. package/dist/components/chat-message/index.js +1 -1
  189. package/dist/components/city-input/city-input.agent.d.ts +8 -0
  190. package/dist/components/city-input/city-input.agent.d.ts.map +1 -0
  191. package/dist/components/city-input/city-input.d.ts +57 -0
  192. package/dist/components/city-input/city-input.d.ts.map +1 -0
  193. package/dist/components/city-input/index.d.ts +5 -0
  194. package/dist/components/city-input/index.d.ts.map +1 -0
  195. package/dist/components/city-input/index.js +6 -0
  196. package/dist/components/city-input/index.js.map +1 -0
  197. package/dist/components/combobox/combobox.d.ts +17 -0
  198. package/dist/components/combobox/combobox.d.ts.map +1 -1
  199. package/dist/components/combobox/index.js +1 -1
  200. package/dist/components/connection-status/connection-status.agent.d.ts +4 -0
  201. package/dist/components/connection-status/connection-status.agent.d.ts.map +1 -0
  202. package/dist/components/connection-status/connection-status.d.ts +36 -0
  203. package/dist/components/connection-status/connection-status.d.ts.map +1 -0
  204. package/dist/components/connection-status/index.d.ts +4 -0
  205. package/dist/components/connection-status/index.d.ts.map +1 -0
  206. package/dist/components/connection-status/index.js +6 -0
  207. package/dist/components/connection-status/index.js.map +1 -0
  208. package/dist/components/control-room-rail/control-room-context.d.ts +5 -5
  209. package/dist/components/control-room-rail/control-room-context.d.ts.map +1 -1
  210. package/dist/components/control-room-rail/control-room-rail.agent.d.ts +4 -0
  211. package/dist/components/control-room-rail/control-room-rail.agent.d.ts.map +1 -0
  212. package/dist/components/control-room-rail/control-room-rail.d.ts +5 -5
  213. package/dist/components/control-room-rail/control-room-rail.d.ts.map +1 -1
  214. package/dist/components/control-room-rail/index.d.ts +1 -0
  215. package/dist/components/control-room-rail/index.d.ts.map +1 -1
  216. package/dist/components/control-room-rail/index.js +4 -3
  217. package/dist/components/counter/counter.d.ts +1 -1
  218. package/dist/components/country-select/country-select.agent.d.ts +8 -0
  219. package/dist/components/country-select/country-select.agent.d.ts.map +1 -0
  220. package/dist/components/country-select/country-select.d.ts +51 -0
  221. package/dist/components/country-select/country-select.d.ts.map +1 -0
  222. package/dist/components/country-select/index.d.ts +6 -0
  223. package/dist/components/country-select/index.d.ts.map +1 -0
  224. package/dist/components/country-select/index.js +9 -0
  225. package/dist/components/country-select/index.js.map +1 -0
  226. package/dist/components/country-select/iso-3166.d.ts +15 -0
  227. package/dist/components/country-select/iso-3166.d.ts.map +1 -0
  228. package/dist/components/data-table/cell-renderers/reorder-cell-renderer.d.ts +34 -0
  229. package/dist/components/data-table/cell-renderers/reorder-cell-renderer.d.ts.map +1 -0
  230. package/dist/components/data-table/filters/select-filter.d.ts.map +1 -1
  231. package/dist/components/data-table/index.d.ts +2 -0
  232. package/dist/components/data-table/index.d.ts.map +1 -1
  233. package/dist/components/data-table/index.js +13 -11
  234. package/dist/components/entity-summary/entity-summary.agent.d.ts +4 -0
  235. package/dist/components/entity-summary/entity-summary.agent.d.ts.map +1 -0
  236. package/dist/components/entity-summary/entity-summary.d.ts +53 -4
  237. package/dist/components/entity-summary/entity-summary.d.ts.map +1 -1
  238. package/dist/components/entity-summary/index.js +1 -1
  239. package/dist/components/field-array/field-array.agent.d.ts +4 -0
  240. package/dist/components/field-array/field-array.agent.d.ts.map +1 -0
  241. package/dist/components/field-array/field-array.d.ts +45 -0
  242. package/dist/components/field-array/field-array.d.ts.map +1 -0
  243. package/dist/components/field-array/index.d.ts +4 -0
  244. package/dist/components/field-array/index.d.ts.map +1 -0
  245. package/dist/components/field-array/index.js +6 -0
  246. package/dist/components/field-array/index.js.map +1 -0
  247. package/dist/components/freemium-paywall/freemium-paywall.d.ts +1 -1
  248. package/dist/components/gestational-age-calculator/index.js +1 -1
  249. package/dist/components/iban-input/iban-input.agent.d.ts +4 -0
  250. package/dist/components/iban-input/iban-input.agent.d.ts.map +1 -0
  251. package/dist/components/iban-input/iban-input.d.ts +51 -0
  252. package/dist/components/iban-input/iban-input.d.ts.map +1 -0
  253. package/dist/components/iban-input/index.d.ts +5 -0
  254. package/dist/components/iban-input/index.d.ts.map +1 -0
  255. package/dist/components/iban-input/index.js +13 -0
  256. package/dist/components/iban-input/index.js.map +1 -0
  257. package/dist/components/iban-input/is-valid-iban.d.ts +31 -0
  258. package/dist/components/iban-input/is-valid-iban.d.ts.map +1 -0
  259. package/dist/components/icon-picker/icon-picker.agent.d.ts +4 -0
  260. package/dist/components/icon-picker/icon-picker.agent.d.ts.map +1 -0
  261. package/dist/components/icon-picker/icon-picker.d.ts +41 -0
  262. package/dist/components/icon-picker/icon-picker.d.ts.map +1 -0
  263. package/dist/components/icon-picker/index.d.ts +4 -0
  264. package/dist/components/icon-picker/index.d.ts.map +1 -0
  265. package/dist/components/icon-picker/index.js +6 -0
  266. package/dist/components/icon-picker/index.js.map +1 -0
  267. package/dist/components/image-cropper/crop-geometry.d.ts +30 -0
  268. package/dist/components/image-cropper/crop-geometry.d.ts.map +1 -0
  269. package/dist/components/image-cropper/image-cropper.agent.d.ts +4 -0
  270. package/dist/components/image-cropper/image-cropper.agent.d.ts.map +1 -0
  271. package/dist/components/image-cropper/image-cropper.d.ts +32 -0
  272. package/dist/components/image-cropper/image-cropper.d.ts.map +1 -0
  273. package/dist/components/image-cropper/index.d.ts +5 -0
  274. package/dist/components/image-cropper/index.d.ts.map +1 -0
  275. package/dist/components/image-cropper/index.js +11 -0
  276. package/dist/components/image-cropper/index.js.map +1 -0
  277. package/dist/components/index.d.ts +16 -1
  278. package/dist/components/index.d.ts.map +1 -1
  279. package/dist/components/message-card/index.js +1 -1
  280. package/dist/components/message-card/message-card.d.ts +14 -0
  281. package/dist/components/message-card/message-card.d.ts.map +1 -1
  282. package/dist/components/message-tray/index.js +1 -1
  283. package/dist/components/message-tray/message-tray.agent.d.ts.map +1 -1
  284. package/dist/components/message-tray/message-tray.d.ts +4 -0
  285. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  286. package/dist/components/multi-select/index.js +1 -1
  287. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  288. package/dist/components/nav-grid/index.d.ts +4 -0
  289. package/dist/components/nav-grid/index.d.ts.map +1 -0
  290. package/dist/components/nav-grid/index.js +7 -0
  291. package/dist/components/nav-grid/index.js.map +1 -0
  292. package/dist/components/nav-grid/nav-grid.agent.d.ts +4 -0
  293. package/dist/components/nav-grid/nav-grid.agent.d.ts.map +1 -0
  294. package/dist/components/nav-grid/nav-grid.d.ts +41 -0
  295. package/dist/components/nav-grid/nav-grid.d.ts.map +1 -0
  296. package/dist/components/notes-panel/index.js +1 -1
  297. package/dist/components/notes-panel/notes-panel.agent.d.ts +4 -0
  298. package/dist/components/notes-panel/notes-panel.agent.d.ts.map +1 -0
  299. package/dist/components/notes-panel/notes-panel.d.ts +30 -0
  300. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
  301. package/dist/components/notification-card/index.js +1 -1
  302. package/dist/components/notification-card/notification-card.d.ts +15 -0
  303. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  304. package/dist/components/notification-tray/index.js +1 -1
  305. package/dist/components/notification-tray/notification-tray.agent.d.ts.map +1 -1
  306. package/dist/components/notification-tray/notification-tray.d.ts +4 -0
  307. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  308. package/dist/components/operator-hero/index.js +1 -1
  309. package/dist/components/panel-header/index.d.ts +3 -0
  310. package/dist/components/panel-header/index.d.ts.map +1 -0
  311. package/dist/components/panel-header/index.js +7 -0
  312. package/dist/components/panel-header/index.js.map +1 -0
  313. package/dist/components/panel-header/panel-header.d.ts +41 -0
  314. package/dist/components/panel-header/panel-header.d.ts.map +1 -0
  315. package/dist/components/patient-details/index.js +1 -1
  316. package/dist/components/patient-details/patient-details.d.ts.map +1 -1
  317. package/dist/components/patient-search/index.js +1 -1
  318. package/dist/components/patient-summary-card/index.js +1 -1
  319. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  320. package/dist/components/patient-table/index.js +1 -1
  321. package/dist/components/payment-card/index.js +1 -1
  322. package/dist/components/permission-matrix/index.d.ts +4 -0
  323. package/dist/components/permission-matrix/index.d.ts.map +1 -0
  324. package/dist/components/permission-matrix/index.js +7 -0
  325. package/dist/components/permission-matrix/index.js.map +1 -0
  326. package/dist/components/permission-matrix/permission-matrix.agent.d.ts +4 -0
  327. package/dist/components/permission-matrix/permission-matrix.agent.d.ts.map +1 -0
  328. package/dist/components/permission-matrix/permission-matrix.d.ts +47 -0
  329. package/dist/components/permission-matrix/permission-matrix.d.ts.map +1 -0
  330. package/dist/components/position-grid/index.d.ts +4 -0
  331. package/dist/components/position-grid/index.d.ts.map +1 -0
  332. package/dist/components/position-grid/index.js +7 -0
  333. package/dist/components/position-grid/index.js.map +1 -0
  334. package/dist/components/position-grid/position-grid.agent.d.ts +4 -0
  335. package/dist/components/position-grid/position-grid.agent.d.ts.map +1 -0
  336. package/dist/components/position-grid/position-grid.d.ts +39 -0
  337. package/dist/components/position-grid/position-grid.d.ts.map +1 -0
  338. package/dist/components/postal-code-input/index.d.ts +5 -0
  339. package/dist/components/postal-code-input/index.d.ts.map +1 -0
  340. package/dist/components/postal-code-input/index.js +6 -0
  341. package/dist/components/postal-code-input/index.js.map +1 -0
  342. package/dist/components/postal-code-input/postal-code-input.agent.d.ts +8 -0
  343. package/dist/components/postal-code-input/postal-code-input.agent.d.ts.map +1 -0
  344. package/dist/components/postal-code-input/postal-code-input.d.ts +27 -0
  345. package/dist/components/postal-code-input/postal-code-input.d.ts.map +1 -0
  346. package/dist/components/practice-results/index.js +1 -1
  347. package/dist/components/pregnancy-dating/index.js +1 -1
  348. package/dist/components/product-hub-tray/index.js +1 -1
  349. package/dist/components/product-hub-tray/product-hub-tray.d.ts +13 -1
  350. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
  351. package/dist/components/province-select/index.d.ts +6 -0
  352. package/dist/components/province-select/index.d.ts.map +1 -0
  353. package/dist/components/province-select/index.js +7 -0
  354. package/dist/components/province-select/index.js.map +1 -0
  355. package/dist/components/province-select/it-provinces.d.ts +8 -0
  356. package/dist/components/province-select/it-provinces.d.ts.map +1 -0
  357. package/dist/components/province-select/province-select.agent.d.ts +8 -0
  358. package/dist/components/province-select/province-select.agent.d.ts.map +1 -0
  359. package/dist/components/province-select/province-select.d.ts +38 -0
  360. package/dist/components/province-select/province-select.d.ts.map +1 -0
  361. package/dist/components/public-footer/public-footer.d.ts +1 -1
  362. package/dist/components/public-header/index.js +1 -1
  363. package/dist/components/radiograph-panel/index.js +1 -1
  364. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -1
  365. package/dist/components/reviews-panel/index.js +1 -1
  366. package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
  367. package/dist/components/rich-text-editor/editor-toolbar.d.ts +17 -0
  368. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  369. package/dist/components/rich-text-editor/index.js +1 -1
  370. package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +1 -1
  371. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  372. package/dist/components/scroll-area/index.js +1 -1
  373. package/dist/components/select/index.js +1 -1
  374. package/dist/components/select/select.d.ts +8 -2
  375. package/dist/components/select/select.d.ts.map +1 -1
  376. package/dist/components/sheet/index.js +1 -1
  377. package/dist/components/sheet/sheet.d.ts.map +1 -1
  378. package/dist/components/sidebar/index.js +1 -1
  379. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  380. package/dist/components/skeleton/skeleton.d.ts +1 -1
  381. package/dist/components/tabs/index.js +1 -1
  382. package/dist/components/task-card/index.js +1 -1
  383. package/dist/components/task-card/task-card.d.ts +14 -6
  384. package/dist/components/task-card/task-card.d.ts.map +1 -1
  385. package/dist/components/task-tray/index.js +1 -1
  386. package/dist/components/tasks-panel/index.d.ts +4 -0
  387. package/dist/components/tasks-panel/index.d.ts.map +1 -0
  388. package/dist/components/tasks-panel/index.js +6 -0
  389. package/dist/components/tasks-panel/index.js.map +1 -0
  390. package/dist/components/tasks-panel/tasks-panel.agent.d.ts +4 -0
  391. package/dist/components/tasks-panel/tasks-panel.agent.d.ts.map +1 -0
  392. package/dist/components/tasks-panel/tasks-panel.d.ts +152 -0
  393. package/dist/components/tasks-panel/tasks-panel.d.ts.map +1 -0
  394. package/dist/components/token-insert-menu/index.d.ts +4 -0
  395. package/dist/components/token-insert-menu/index.d.ts.map +1 -0
  396. package/dist/components/token-insert-menu/index.js +6 -0
  397. package/dist/components/token-insert-menu/index.js.map +1 -0
  398. package/dist/components/token-insert-menu/token-insert-menu.agent.d.ts +4 -0
  399. package/dist/components/token-insert-menu/token-insert-menu.agent.d.ts.map +1 -0
  400. package/dist/components/token-insert-menu/token-insert-menu.d.ts +33 -0
  401. package/dist/components/token-insert-menu/token-insert-menu.d.ts.map +1 -0
  402. package/dist/components/tool-rail/index.d.ts +4 -0
  403. package/dist/components/tool-rail/index.d.ts.map +1 -0
  404. package/dist/components/tool-rail/index.js +6 -0
  405. package/dist/components/tool-rail/index.js.map +1 -0
  406. package/dist/components/tool-rail/tool-rail.agent.d.ts +4 -0
  407. package/dist/components/tool-rail/tool-rail.agent.d.ts.map +1 -0
  408. package/dist/components/{ai-tools-rail/ai-tools-rail.d.ts → tool-rail/tool-rail.d.ts} +29 -12
  409. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -0
  410. package/dist/components/tooth-scheme/index.js +1 -1
  411. package/dist/components/tooth-scheme/tooth-scheme.d.ts +9 -0
  412. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  413. package/dist/components/transcript-panel/index.js +1 -1
  414. package/dist/components/transcript-panel/transcript-panel.d.ts +2 -2
  415. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  416. package/dist/components/unit-converter/index.js +1 -1
  417. package/dist/components/workflow/index.js +1 -1
  418. package/dist/hooks/use-edge-resize.d.ts +2 -2
  419. package/dist/i18n/locales/ar.d.ts +167 -2
  420. package/dist/i18n/locales/ar.d.ts.map +1 -1
  421. package/dist/i18n/locales/ar.js +157 -5
  422. package/dist/i18n/locales/ar.js.map +1 -1
  423. package/dist/i18n/locales/de.d.ts +167 -2
  424. package/dist/i18n/locales/de.d.ts.map +1 -1
  425. package/dist/i18n/locales/de.js +159 -5
  426. package/dist/i18n/locales/de.js.map +1 -1
  427. package/dist/i18n/locales/el.d.ts +167 -2
  428. package/dist/i18n/locales/el.d.ts.map +1 -1
  429. package/dist/i18n/locales/el.js +164 -5
  430. package/dist/i18n/locales/el.js.map +1 -1
  431. package/dist/i18n/locales/en.d.ts +167 -2
  432. package/dist/i18n/locales/en.d.ts.map +1 -1
  433. package/dist/i18n/locales/en.js +170 -5
  434. package/dist/i18n/locales/en.js.map +1 -1
  435. package/dist/i18n/locales/es.d.ts +167 -2
  436. package/dist/i18n/locales/es.d.ts.map +1 -1
  437. package/dist/i18n/locales/es.js +156 -5
  438. package/dist/i18n/locales/es.js.map +1 -1
  439. package/dist/i18n/locales/fr.d.ts +167 -2
  440. package/dist/i18n/locales/fr.d.ts.map +1 -1
  441. package/dist/i18n/locales/fr.js +159 -5
  442. package/dist/i18n/locales/fr.js.map +1 -1
  443. package/dist/i18n/locales/hi.d.ts +167 -2
  444. package/dist/i18n/locales/hi.d.ts.map +1 -1
  445. package/dist/i18n/locales/hi.js +155 -5
  446. package/dist/i18n/locales/hi.js.map +1 -1
  447. package/dist/i18n/locales/it.d.ts +167 -2
  448. package/dist/i18n/locales/it.d.ts.map +1 -1
  449. package/dist/i18n/locales/it.js +159 -5
  450. package/dist/i18n/locales/it.js.map +1 -1
  451. package/dist/i18n/locales/ja.d.ts +167 -2
  452. package/dist/i18n/locales/ja.d.ts.map +1 -1
  453. package/dist/i18n/locales/ja.js +160 -5
  454. package/dist/i18n/locales/ja.js.map +1 -1
  455. package/dist/i18n/locales/nl.d.ts +167 -2
  456. package/dist/i18n/locales/nl.d.ts.map +1 -1
  457. package/dist/i18n/locales/nl.js +152 -5
  458. package/dist/i18n/locales/nl.js.map +1 -1
  459. package/dist/i18n/locales/pl.d.ts +167 -2
  460. package/dist/i18n/locales/pl.d.ts.map +1 -1
  461. package/dist/i18n/locales/pl.js +160 -5
  462. package/dist/i18n/locales/pl.js.map +1 -1
  463. package/dist/i18n/locales/pt.d.ts +167 -2
  464. package/dist/i18n/locales/pt.d.ts.map +1 -1
  465. package/dist/i18n/locales/pt.js +164 -5
  466. package/dist/i18n/locales/pt.js.map +1 -1
  467. package/dist/i18n/locales/ro.d.ts +167 -2
  468. package/dist/i18n/locales/ro.d.ts.map +1 -1
  469. package/dist/i18n/locales/ro.js +164 -5
  470. package/dist/i18n/locales/ro.js.map +1 -1
  471. package/dist/i18n/locales/ru.d.ts +167 -2
  472. package/dist/i18n/locales/ru.d.ts.map +1 -1
  473. package/dist/i18n/locales/ru.js +157 -5
  474. package/dist/i18n/locales/ru.js.map +1 -1
  475. package/dist/i18n/locales/sq.d.ts +167 -2
  476. package/dist/i18n/locales/sq.d.ts.map +1 -1
  477. package/dist/i18n/locales/sq.js +161 -5
  478. package/dist/i18n/locales/sq.js.map +1 -1
  479. package/dist/i18n/locales/sv.d.ts +167 -2
  480. package/dist/i18n/locales/sv.d.ts.map +1 -1
  481. package/dist/i18n/locales/sv.js +159 -5
  482. package/dist/i18n/locales/sv.js.map +1 -1
  483. package/dist/i18n/locales/tr.d.ts +167 -2
  484. package/dist/i18n/locales/tr.d.ts.map +1 -1
  485. package/dist/i18n/locales/tr.js +157 -5
  486. package/dist/i18n/locales/tr.js.map +1 -1
  487. package/dist/i18n/locales/zh.d.ts +167 -2
  488. package/dist/i18n/locales/zh.d.ts.map +1 -1
  489. package/dist/i18n/locales/zh.js +152 -5
  490. package/dist/i18n/locales/zh.js.map +1 -1
  491. package/dist/index.js +823 -755
  492. package/dist/index.js.map +1 -1
  493. package/dist/locales/ar.json +170 -5
  494. package/dist/locales/de.json +170 -5
  495. package/dist/locales/el.json +170 -5
  496. package/dist/locales/en.json +170 -5
  497. package/dist/locales/es.json +170 -5
  498. package/dist/locales/fr.json +170 -5
  499. package/dist/locales/hi.json +170 -5
  500. package/dist/locales/it.json +170 -5
  501. package/dist/locales/ja.json +170 -5
  502. package/dist/locales/nl.json +170 -5
  503. package/dist/locales/pl.json +170 -5
  504. package/dist/locales/pt.json +170 -5
  505. package/dist/locales/ro.json +170 -5
  506. package/dist/locales/ru.json +170 -5
  507. package/dist/locales/sq.json +170 -5
  508. package/dist/locales/sv.json +170 -5
  509. package/dist/locales/tr.json +170 -5
  510. package/dist/locales/zh.json +170 -5
  511. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  512. package/dist/patterns/alia-assistant/alia-types.d.ts +9 -0
  513. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  514. package/dist/patterns/alia-assistant/index.js +1 -1
  515. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  516. package/dist/patterns/patient-shell/index.js +1 -1
  517. package/dist/tokens.css +9 -1
  518. package/package.json +65 -5
  519. package/dist/_chunks/ai-tools-rail-B5NEghsp.js.map +0 -1
  520. package/dist/_chunks/alia-sidebar-B47qRQb5.js.map +0 -1
  521. package/dist/_chunks/app-frame-BYx1gcV7.js.map +0 -1
  522. package/dist/_chunks/appointment-card-C06aZqA7.js.map +0 -1
  523. package/dist/_chunks/appointment-timeline-BJM0S_Fg.js.map +0 -1
  524. package/dist/_chunks/autocomplete-DOeGouCL.js.map +0 -1
  525. package/dist/_chunks/care-plan-header-BUwqDTtz.js +0 -206
  526. package/dist/_chunks/care-plan-header-BUwqDTtz.js.map +0 -1
  527. package/dist/_chunks/chat-message-3V54YipB.js.map +0 -1
  528. package/dist/_chunks/combobox-Clum7gJ1.js.map +0 -1
  529. package/dist/_chunks/control-room-rail-Y8ryLYsP.js +0 -229
  530. package/dist/_chunks/control-room-rail-Y8ryLYsP.js.map +0 -1
  531. package/dist/_chunks/editable-currency-cell-renderer-C9twtALM.js +0 -328
  532. package/dist/_chunks/editable-currency-cell-renderer-C9twtALM.js.map +0 -1
  533. package/dist/_chunks/entity-summary-BxRjFh_4.js +0 -138
  534. package/dist/_chunks/entity-summary-BxRjFh_4.js.map +0 -1
  535. package/dist/_chunks/field-value-NXYczdpO.js.map +0 -1
  536. package/dist/_chunks/link-cell-renderer-CTXqtXV-.js.map +0 -1
  537. package/dist/_chunks/message-card-Bx4GmLvf.js +0 -277
  538. package/dist/_chunks/message-card-Bx4GmLvf.js.map +0 -1
  539. package/dist/_chunks/message-tray-DwrBLJlf.js.map +0 -1
  540. package/dist/_chunks/notes-panel-ay8_lPrA.js +0 -158
  541. package/dist/_chunks/notes-panel-ay8_lPrA.js.map +0 -1
  542. package/dist/_chunks/notification-card-D2jiKSJJ.js +0 -259
  543. package/dist/_chunks/notification-card-D2jiKSJJ.js.map +0 -1
  544. package/dist/_chunks/notification-tray-AEun6DN2.js.map +0 -1
  545. package/dist/_chunks/patient-details-Dlhqb5ig.js.map +0 -1
  546. package/dist/_chunks/product-hub-panel-e6pW220e.js.map +0 -1
  547. package/dist/_chunks/radiograph-panel.agent-CAX-C3g3.js +0 -558
  548. package/dist/_chunks/radiograph-panel.agent-CAX-C3g3.js.map +0 -1
  549. package/dist/_chunks/reviews-panel-Dq7LMDcH.js +0 -555
  550. package/dist/_chunks/reviews-panel-Dq7LMDcH.js.map +0 -1
  551. package/dist/_chunks/rich-text-editor-DlCqPixb.js +0 -2158
  552. package/dist/_chunks/rich-text-editor-DlCqPixb.js.map +0 -1
  553. package/dist/_chunks/scroll-area-5wNK0Cyz.js.map +0 -1
  554. package/dist/_chunks/select-DMLG44F5.js.map +0 -1
  555. package/dist/_chunks/sheet-BxsE7eQm.js.map +0 -1
  556. package/dist/_chunks/sidebar-DY9jGjgt.js.map +0 -1
  557. package/dist/_chunks/task-card-BwY9jaV1.js +0 -124
  558. package/dist/_chunks/task-card-BwY9jaV1.js.map +0 -1
  559. package/dist/_chunks/tooth-scheme-BhQoPNBD.js.map +0 -1
  560. package/dist/_chunks/transcript-panel-3THQX6nJ.js.map +0 -1
  561. package/dist/_chunks/workflow-map-Dy8mLCqF.js.map +0 -1
  562. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +0 -4
  563. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +0 -1
  564. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +0 -1
  565. package/dist/components/ai-tools-rail/index.d.ts +0 -4
  566. package/dist/components/ai-tools-rail/index.d.ts.map +0 -1
  567. package/dist/components/ai-tools-rail/index.js +0 -6
  568. /package/dist/components/{ai-tools-rail → address-fields}/index.js.map +0 -0
@@ -1,12 +1,14 @@
1
- import { jsxs as f, jsx as o } from "react/jsx-runtime";
2
- import { forwardRef as K, useState as j, useRef as w, useId as A, useMemo as x, useCallback as R, useImperativeHandle as _, Fragment as O } from "react";
1
+ import { jsxs as f, jsx as o, Fragment as j } from "react/jsx-runtime";
2
+ import { forwardRef as A, useState as _, useRef as w, useId as R, useMemo as x, useCallback as z, useImperativeHandle as H, Fragment as O } from "react";
3
3
  import { c as V } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as q } from "react-i18next";
5
5
  import { u as D } from "./registry-DvAUVLHh.js";
6
- import { u as F } from "./index-CJE9uQmb.js";
7
- import { S as H } from "./search-input-DQvGxR74.js";
8
- import { u as B } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
9
- const U = {
6
+ import { u as B } from "./index-CJE9uQmb.js";
7
+ import { S as U } from "./search-input-DQvGxR74.js";
8
+ import { P as G } from "./panel-header-D313n_9-.js";
9
+ import { u as Q } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
10
+ import { F as W } from "./file-text-DSNuv2B8.js";
11
+ const Y = {
10
12
  id: "transcript-panel",
11
13
  capabilities: ["select_single", "copy"],
12
14
  state: {
@@ -65,7 +67,7 @@ const U = {
65
67
  description: "Stable opaque turn id (line index). Never carries the turn's dictated text."
66
68
  }
67
69
  }
68
- }, G = V(
70
+ }, Z = V(
69
71
  [
70
72
  "ds:flex ds:flex-col ds:w-full ds:min-h-0",
71
73
  "ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]",
@@ -83,22 +85,22 @@ const U = {
83
85
  },
84
86
  defaultVariants: { size: "md" }
85
87
  }
86
- ), Q = 100, W = 8;
87
- function z(t, n) {
88
- const a = Math.max(0, Math.floor(t)), i = Math.floor(a / 60), u = a % 60, p = (g) => new Intl.NumberFormat(n, { minimumIntegerDigits: 2 }).format(g);
89
- return `${p(i)}:${p(u)}`;
88
+ ), J = 100, X = 8;
89
+ function L(t, n) {
90
+ const a = Math.max(0, Math.floor(t)), d = Math.floor(a / 60), u = a % 60, p = (g) => new Intl.NumberFormat(n, { minimumIntegerDigits: 2 }).format(g);
91
+ return `${p(d)}:${p(u)}`;
90
92
  }
91
- function Y(t) {
92
- const n = Math.max(0, Math.floor(t)), a = Math.floor(n / 60), i = n % 60;
93
- return `PT${a}M${i}S`;
93
+ function ee(t) {
94
+ const n = Math.max(0, Math.floor(t)), a = Math.floor(n / 60), d = n % 60;
95
+ return `PT${a}M${d}S`;
94
96
  }
95
- function Z(t) {
97
+ function te(t) {
96
98
  let n = 0;
97
99
  for (let a = 0; a < t.length; a += 1)
98
100
  n = n * 31 + t.charCodeAt(a) | 0;
99
- return Math.abs(n) % W;
101
+ return Math.abs(n) % X;
100
102
  }
101
- const J = [
103
+ const re = [
102
104
  "ds:bg-[color:var(--transcript-speaker-1)]",
103
105
  "ds:bg-[color:var(--transcript-speaker-2)]",
104
106
  "ds:bg-[color:var(--transcript-speaker-3)]",
@@ -108,12 +110,12 @@ const J = [
108
110
  "ds:bg-[color:var(--transcript-speaker-7)]",
109
111
  "ds:bg-[color:var(--transcript-speaker-8)]"
110
112
  ];
111
- function X(t) {
113
+ function se(t) {
112
114
  return t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
113
115
  }
114
- function ee({ text: t, query: n }) {
116
+ function ne({ text: t, query: n }) {
115
117
  if (!n) return t;
116
- const a = X(n);
118
+ const a = se(n);
117
119
  return t.split(new RegExp(`(${a})`, "gi")).map(
118
120
  (u, p) => u.toLocaleLowerCase() === n.toLocaleLowerCase() ? /* @__PURE__ */ o(
119
121
  "mark",
@@ -125,17 +127,17 @@ function ee({ text: t, query: n }) {
125
127
  ) : /* @__PURE__ */ o(O, { children: u }, p)
126
128
  );
127
129
  }
128
- const te = K(
130
+ const ae = A(
129
131
  ({
130
132
  lines: t,
131
133
  currentTime: n = 0,
132
134
  onSeek: a,
133
- searchable: i = !0,
135
+ searchable: d = !0,
134
136
  size: u = "md",
135
137
  className: p,
136
138
  ...g
137
- }, L) => {
138
- const { t: d, i18n: b } = q(), [m, M] = j(""), v = w(null), T = w(null), P = A(), c = x(() => {
139
+ }, M) => {
140
+ const { t: i, i18n: b } = q(), [m, $] = _(""), v = w(null), T = w(null), E = R(), c = x(() => {
139
141
  if (!Number.isFinite(n)) return -1;
140
142
  for (let e = 0; e < t.length; e += 1) {
141
143
  const r = t[e];
@@ -153,20 +155,20 @@ const te = K(
153
155
  e += 1, h = l.indexOf(r, h + r.length);
154
156
  }
155
157
  return e;
156
- }, [t, m]), $ = R(
158
+ }, [t, m]), F = z(
157
159
  (e) => {
158
160
  var r;
159
- (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "f" && i && (e.preventDefault(), (r = T.current) == null || r.focus());
161
+ (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "f" && d && (e.preventDefault(), (r = T.current) == null || r.focus());
160
162
  },
161
- [i]
162
- ), N = t.length > Q, y = F({
163
- count: N ? t.length : 0,
163
+ [d]
164
+ ), S = t.length > J, y = B({
165
+ count: S ? t.length : 0,
164
166
  getScrollElement: () => v.current,
165
167
  estimateSize: () => 48,
166
168
  overscan: 8,
167
169
  getItemKey: (e) => e
168
170
  });
169
- B(() => {
171
+ Q(() => {
170
172
  if (c < 0) return;
171
173
  const e = v.current;
172
174
  if (!e) return;
@@ -180,9 +182,9 @@ const te = K(
180
182
  behavior: s ? "auto" : "smooth"
181
183
  });
182
184
  }, [c]);
183
- const S = R(
185
+ const I = z(
184
186
  (e, r, s) => {
185
- const l = r === c, h = Z(e.speaker), C = typeof e.confidence == "number" && e.confidence < 0.6;
187
+ const l = r === c, h = te(e.speaker), P = typeof e.confidence == "number" && e.confidence < 0.6;
186
188
  return /* @__PURE__ */ f(
187
189
  "li",
188
190
  {
@@ -204,8 +206,8 @@ const te = K(
204
206
  {
205
207
  type: "button",
206
208
  onClick: () => a == null ? void 0 : a(e.start),
207
- "aria-label": d("chat.transcript.seekTo", {
208
- time: z(e.start, b.language)
209
+ "aria-label": i("chat.transcript.seekTo", {
210
+ time: L(e.start, b.language)
209
211
  }),
210
212
  className: [
211
213
  "ds:inline-flex ds:items-center ds:justify-center",
@@ -223,7 +225,7 @@ const te = K(
223
225
  "ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
224
226
  "ds:forced-colors:focus-visible:outline-[CanvasText]"
225
227
  ].join(" "),
226
- children: /* @__PURE__ */ o("time", { dir: "ltr", dateTime: Y(e.start), children: z(e.start, b.language) })
228
+ children: /* @__PURE__ */ o("time", { dir: "ltr", dateTime: ee(e.start), children: L(e.start, b.language) })
227
229
  }
228
230
  ),
229
231
  /* @__PURE__ */ f("div", { className: "ds:flex-1 ds:min-w-0", children: [
@@ -232,13 +234,13 @@ const te = K(
232
234
  "span",
233
235
  {
234
236
  "aria-hidden": "true",
235
- className: `ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ${J[h]}`
237
+ className: `ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ${re[h]}`
236
238
  }
237
239
  ),
238
- /* @__PURE__ */ o("strong", { className: "type-title-item", children: d("chat.transcript.speaker", { name: e.speaker }) }),
239
- C ? /* @__PURE__ */ f("span", { className: "type-meta ds:italic ds:text-[color:var(--muted-foreground)]", children: [
240
+ /* @__PURE__ */ o("strong", { className: "type-title-item", children: i("chat.transcript.speaker", { name: e.speaker }) }),
241
+ P ? /* @__PURE__ */ f("span", { className: "type-meta ds:italic ds:text-[color:var(--muted-foreground)]", children: [
240
242
  "(",
241
- d("chat.transcript.lowConfidence"),
243
+ i("chat.transcript.lowConfidence"),
242
244
  ")"
243
245
  ] }) : null
244
246
  ] }),
@@ -248,9 +250,9 @@ const te = K(
248
250
  dir: "auto",
249
251
  className: [
250
252
  "ds:block",
251
- C ? "ds:underline ds:decoration-dotted ds:decoration-[color:var(--muted-foreground)]" : ""
253
+ P ? "ds:underline ds:decoration-dotted ds:decoration-[color:var(--muted-foreground)]" : ""
252
254
  ].join(" "),
253
- children: /* @__PURE__ */ o(ee, { text: e.text, query: m })
255
+ children: /* @__PURE__ */ o(ne, { text: e.text, query: m })
254
256
  }
255
257
  )
256
258
  ] })
@@ -259,10 +261,10 @@ const te = K(
259
261
  r
260
262
  );
261
263
  },
262
- [c, b.language, a, m, d]
263
- ), I = w(null);
264
- _(L, () => I.current, []);
265
- const E = x(
264
+ [c, b.language, a, m, i]
265
+ ), N = w(null), C = R();
266
+ H(M, () => N.current, []);
267
+ const K = x(
266
268
  () => ({
267
269
  getSelectedTurn: () => c >= 0 ? String(c) : null,
268
270
  focusTurn: (e) => {
@@ -288,57 +290,67 @@ const te = K(
288
290
  [c, t]
289
291
  );
290
292
  return D(
291
- U,
292
- E,
293
+ Y,
294
+ K,
293
295
  g.id
294
- ), // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- root keyboard shortcuts (j/k navigation, /) bubble up from focused descendants
296
+ ), // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-static-element-interactions -- root keyboard shortcuts (j/k navigation, /) bubble up from focused descendants
295
297
  /* @__PURE__ */ f(
296
- "div",
298
+ "section",
297
299
  {
298
- ref: I,
299
- onKeyDown: $,
300
+ ref: N,
301
+ onKeyDown: F,
300
302
  "data-component": "transcript-panel",
301
303
  "data-component-id": g.id,
302
- className: G({ size: u, className: p }),
304
+ "aria-labelledby": C,
305
+ className: Z({ size: u, className: p }),
303
306
  ...g,
304
307
  children: [
305
- i ? /* @__PURE__ */ f("div", { className: "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:border-b ds:border-border", children: [
306
- /* @__PURE__ */ o(
307
- H,
308
- {
309
- ref: T,
310
- id: P,
311
- placeholder: d("chat.transcript.search"),
312
- "aria-label": d("chat.transcript.search"),
313
- "aria-keyshortcuts": "Meta+F Control+F",
314
- debounceMs: 150,
315
- onChange: (e) => M(e),
316
- size: "sm"
317
- }
318
- ),
319
- m ? /* @__PURE__ */ o(
320
- "span",
321
- {
322
- role: "status",
323
- "aria-live": "polite",
324
- className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums",
325
- children: k === 0 ? d("chat.transcript.noMatches") : d("chat.transcript.matchCount", { count: k })
326
- }
327
- ) : null
328
- ] }) : null,
308
+ /* @__PURE__ */ o(
309
+ G,
310
+ {
311
+ title: i("transcriptPanel.title"),
312
+ icon: /* @__PURE__ */ o(W, { "aria-hidden": "true" }),
313
+ headingId: C,
314
+ divider: !0,
315
+ filters: d ? /* @__PURE__ */ f(j, { children: [
316
+ /* @__PURE__ */ o(
317
+ U,
318
+ {
319
+ ref: T,
320
+ id: E,
321
+ placeholder: i("chat.transcript.search"),
322
+ "aria-label": i("chat.transcript.search"),
323
+ "aria-keyshortcuts": "Meta+F Control+F",
324
+ debounceMs: 150,
325
+ onChange: (e) => $(e),
326
+ size: "sm"
327
+ }
328
+ ),
329
+ m ? /* @__PURE__ */ o(
330
+ "span",
331
+ {
332
+ role: "status",
333
+ "aria-live": "polite",
334
+ className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums",
335
+ children: k === 0 ? i("chat.transcript.noMatches") : i("chat.transcript.matchCount", { count: k })
336
+ }
337
+ ) : null
338
+ ] }) : void 0
339
+ }
340
+ ),
329
341
  /* @__PURE__ */ o(
330
342
  "div",
331
343
  {
332
344
  ref: v,
333
345
  className: "ds:flex-1 ds:min-h-0 ds:overflow-y-auto ds:overflow-x-hidden",
334
- children: N ? /* @__PURE__ */ o(
346
+ children: S ? /* @__PURE__ */ o(
335
347
  "ol",
336
348
  {
337
349
  className: "ds:relative ds:list-none ds:ps-0 ds:m-0",
338
350
  style: { blockSize: `${y.getTotalSize()}px` },
339
351
  children: y.getVirtualItems().map((e) => {
340
352
  const r = t[e.index];
341
- return r ? S(r, e.index, {
353
+ return r ? I(r, e.index, {
342
354
  liRef: y.measureElement,
343
355
  dataIndex: e.index,
344
356
  style: { transform: `translateY(${e.start}px)` },
@@ -346,7 +358,7 @@ const te = K(
346
358
  }) : null;
347
359
  })
348
360
  }
349
- ) : /* @__PURE__ */ o("ol", { className: "ds:list-none ds:ps-0 ds:m-0", children: t.map((e, r) => S(e, r)) })
361
+ ) : /* @__PURE__ */ o("ol", { className: "ds:list-none ds:ps-0 ds:m-0", children: t.map((e, r) => I(e, r)) })
350
362
  }
351
363
  )
352
364
  ]
@@ -354,9 +366,9 @@ const te = K(
354
366
  );
355
367
  }
356
368
  );
357
- te.displayName = "TranscriptPanel";
369
+ ae.displayName = "TranscriptPanel";
358
370
  export {
359
- te as T,
360
- U as t
371
+ ae as T,
372
+ Y as t
361
373
  };
362
- //# sourceMappingURL=transcript-panel-3THQX6nJ.js.map
374
+ //# sourceMappingURL=transcript-panel-CHGHHHdT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-panel-CHGHHHdT.js","sources":["../../src/components/transcript-panel/transcript-panel.agent.ts","../../src/components/transcript-panel/transcript-panel.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TranscriptPanel. */\n/* */\n/* `data-turn-id` carries the line's stable index (opaque id) — never */\n/* the dictated text. Transcript content frequently contains PHI; the */\n/* DOM hook MUST NOT leak it. See PRS §26 §6.1. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TranscriptPanelHandle } from './transcript-panel';\n\nexport const transcriptPanelAgent: AgentAdapter<TranscriptPanelHandle> = {\n id: 'transcript-panel',\n capabilities: ['select_single', 'copy'],\n state: {\n selectedTurn: {\n type: 'string | null',\n descriptionKey: 'ui.agent.transcriptPanel.state.selectedTurn',\n description:\n 'Opaque id (line index) of the currently-active turn, or null when none is active.',\n read: (handle) => handle.getSelectedTurn(),\n },\n },\n actions: {\n focus_turn: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.transcriptPanel.actions.focusTurn',\n description: 'Scroll the given turn into view and focus its seek button.',\n invoke: (handle, args: { id: string }) => {\n handle.focusTurn(args.id);\n },\n },\n copy_turn: {\n // Clipboard write of dictated PHI text — write + reaches the system\n // clipboard (openWorld).\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n openWorld: true,\n descriptionKey: 'ui.agent.transcriptPanel.actions.copyTurn',\n description: \"Copy the given turn's text to the clipboard.\",\n invoke: (handle, args: { id: string }) => handle.copyTurn(args.id),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'transcript-panel',\n description: 'Marks the TranscriptPanel wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-turn-id',\n description:\n \"Stable opaque turn id (line index). Never carries the turn's dictated text.\",\n },\n },\n};\n","import {\n forwardRef,\n Fragment,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { transcriptPanelAgent } from './transcript-panel.agent';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { SearchInput } from '../search-input';\nimport { FileText } from 'lucide-react';\nimport { PanelHeader } from '../panel-header';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface TranscriptLine {\n speaker: string;\n text: string;\n /** Seconds, floating-point — matches HTMLMediaElement.currentTime. */\n start: number;\n end: number;\n /** 0..1 — rendered with a dotted underline when below 0.6. */\n confidence?: number;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface TranscriptPanelHandle {\n /** Opaque id (line index) of the active turn, or null. */\n getSelectedTurn: () => string | null;\n /** Scroll the turn with the given id into view and focus its seek button. */\n focusTurn: (id: string) => void;\n /** Copy the turn's text to the clipboard. */\n copyTurn: (id: string) => Promise<void> | void;\n}\n\nexport interface TranscriptPanelProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'children'>,\n VariantProps<typeof rootVariants> {\n lines: TranscriptLine[];\n /** Current playback time in seconds — drives the active line highlight. */\n currentTime?: number;\n onSeek?: (seconds: number) => void;\n /** Show the search bar. */\n searchable?: boolean;\n}\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:w-full ds:min-h-0',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-background',\n 'ds:focus-within:border-[color:var(--primary)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst VIRTUALIZATION_THRESHOLD = 100;\nconst SPEAKER_SLOT_COUNT = 8;\n\nfunction formatTime(seconds: number, locale: string): string {\n const total = Math.max(0, Math.floor(seconds));\n const m = Math.floor(total / 60);\n const s = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(m)}:${fmt(s)}`;\n}\n\n/** ISO-8601 duration (PT#M#S) for <time datetime=\"...\">. */\nfunction secondsToIsoDuration(seconds: number): string {\n const total = Math.max(0, Math.floor(seconds));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `PT${m}M${s}S`;\n}\n\n/** Deterministic speaker slot (0..7) based on name hash. */\nfunction speakerSlot(name: string): number {\n let hash = 0;\n for (let i = 0; i < name.length; i += 1) {\n hash = (hash * 31 + name.charCodeAt(i)) | 0;\n }\n return Math.abs(hash) % SPEAKER_SLOT_COUNT;\n}\n\n/** Per-slot background classes. Indices align with the speaker palette tokens\n * in tokens/index.css. Static strings so Tailwind can pick them up at build. */\nconst SPEAKER_BG_CLASSES = [\n 'ds:bg-[color:var(--transcript-speaker-1)]',\n 'ds:bg-[color:var(--transcript-speaker-2)]',\n 'ds:bg-[color:var(--transcript-speaker-3)]',\n 'ds:bg-[color:var(--transcript-speaker-4)]',\n 'ds:bg-[color:var(--transcript-speaker-5)]',\n 'ds:bg-[color:var(--transcript-speaker-6)]',\n 'ds:bg-[color:var(--transcript-speaker-7)]',\n 'ds:bg-[color:var(--transcript-speaker-8)]',\n] as const;\n\n/** Escape a literal string for safe use inside a RegExp. */\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\ninterface HighlightedTextProps {\n text: string;\n query: string;\n}\n\n/** Renders text with <mark> wrapping around case-insensitive matches.\n * No dangerouslySetInnerHTML — splits text nodes only. */\nfunction HighlightedText({ text, query }: HighlightedTextProps): ReactNode {\n if (!query) return text;\n const escaped = escapeRegExp(query);\n const parts = text.split(new RegExp(`(${escaped})`, 'gi'));\n return parts.map((part, i) =>\n part.toLocaleLowerCase() === query.toLocaleLowerCase() ? (\n <mark\n key={i}\n className=\"ds:bg-[color:var(--warning)]/30 ds:text-[color:var(--foreground)] ds:rounded-[var(--radius-sm)]\"\n >\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n );\n}\n\nexport const TranscriptPanel = forwardRef<HTMLElement, TranscriptPanelProps>(\n (\n {\n lines,\n currentTime = 0,\n onSeek,\n searchable = true,\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [query, setQuery] = useState('');\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const searchId = useId();\n\n /* Active-line index */\n const activeIndex = useMemo(() => {\n if (!Number.isFinite(currentTime)) return -1;\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n if (line.start <= currentTime && currentTime < line.end) return i;\n }\n return -1;\n }, [lines, currentTime]);\n\n /* Match count for search */\n const matchCount = useMemo(() => {\n if (!query) return 0;\n let count = 0;\n const needle = query.toLocaleLowerCase();\n for (const line of lines) {\n const hay = line.text.toLocaleLowerCase();\n let idx = hay.indexOf(needle);\n while (idx !== -1) {\n count += 1;\n idx = hay.indexOf(needle, idx + needle.length);\n }\n }\n return count;\n }, [lines, query]);\n\n /* Ctrl/Cmd+F shortcut — focuses the search field when focus is within. */\n const handleRootKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n if (\n (e.metaKey || e.ctrlKey) &&\n e.key.toLowerCase() === 'f' &&\n searchable\n ) {\n e.preventDefault();\n searchInputRef.current?.focus();\n }\n },\n [searchable],\n );\n\n /* Virtualisation above 100 lines */\n const virtualized = lines.length > VIRTUALIZATION_THRESHOLD;\n const virtualizer = useVirtualizer({\n count: virtualized ? lines.length : 0,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => 48,\n overscan: 8,\n getItemKey: (i) => i,\n });\n\n /* Auto-scroll active line into view when it changes. */\n useIsomorphicLayoutEffect(() => {\n if (activeIndex < 0) return;\n const scroller = scrollRef.current;\n if (!scroller) return;\n const target = scroller.querySelector(\n `[data-line-index=\"${activeIndex}\"]`,\n ) as HTMLElement | null;\n if (!target) return;\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n target.scrollIntoView({\n block: 'center',\n behavior: prefersReducedMotion ? 'auto' : 'smooth',\n });\n }, [activeIndex]);\n\n const renderLine = useCallback(\n (\n line: TranscriptLine,\n index: number,\n extras?: {\n liRef?: (node: HTMLLIElement | null) => void;\n dataIndex?: number;\n // Style is an inline-style escape hatch — virtualizer offsets\n // cannot be expressed as static Tailwind. See 23-constraints §4.\n style?: CSSProperties;\n absolutePositioning?: boolean;\n },\n ) => {\n const isActive = index === activeIndex;\n const slot = speakerSlot(line.speaker);\n const lowConfidence =\n typeof line.confidence === 'number' && line.confidence < 0.6;\n return (\n <li\n key={index}\n ref={extras?.liRef}\n data-line-index={index}\n data-turn-id={String(index)}\n data-index={extras?.dataIndex}\n aria-current={isActive ? 'true' : undefined}\n // eslint-disable-next-line react/forbid-dom-props -- virtualizer translateY offset, runtime-computed\n style={extras?.style}\n className={[\n 'ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n isActive\n ? 'ds:bg-[color:var(--accent)]/12 ds:border-s-[3px] ds:border-[color:var(--primary)]'\n : 'ds:border-s-[3px] ds:border-transparent',\n extras?.absolutePositioning\n ? 'ds:absolute ds:start-0 ds:end-0 ds:top-0 ds:w-full'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n onClick={() => onSeek?.(line.start)}\n aria-label={t('chat.transcript.seekTo', {\n time: formatTime(line.start, i18n.language),\n })}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-[family-name:var(--font-mono)]',\n 'type-meta',\n 'ds:tabular-nums',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n // WCAG 2.5.5 target size: 44×44 default, 48×48 in accessible\n // themes — matches the DS `--min-target-size` token.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:hover:bg-muted/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n <time dir=\"ltr\" dateTime={secondsToIsoDuration(line.start)}>\n {formatTime(line.start, i18n.language)}\n </time>\n </button>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className={`ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ${SPEAKER_BG_CLASSES[slot]}`}\n />\n <strong className=\"type-title-item\">\n {t('chat.transcript.speaker', { name: line.speaker })}\n </strong>\n {lowConfidence ? (\n <span className=\"type-meta ds:italic ds:text-[color:var(--muted-foreground)]\">\n ({t('chat.transcript.lowConfidence')})\n </span>\n ) : null}\n </div>\n <span\n dir=\"auto\"\n className={[\n 'ds:block',\n lowConfidence\n ? 'ds:underline ds:decoration-dotted ds:decoration-[color:var(--muted-foreground)]'\n : '',\n ].join(' ')}\n >\n <HighlightedText text={line.text} query={query} />\n </span>\n </div>\n </li>\n );\n },\n [activeIndex, i18n.language, onSeek, query, t],\n );\n\n const rootRef = useRef<HTMLElement>(null);\n const headingId = useId();\n useImperativeHandle(ref, () => rootRef.current as HTMLElement, []);\n\n const agentHandle = useMemo<TranscriptPanelHandle>(\n () => ({\n getSelectedTurn: () => (activeIndex >= 0 ? String(activeIndex) : null),\n focusTurn: (id: string) => {\n const target = scrollRef.current?.querySelector(\n `[data-turn-id=\"${id}\"]`,\n ) as HTMLElement | null;\n if (!target) return;\n target.scrollIntoView({ block: 'center', behavior: 'auto' });\n const btn = target.querySelector(\n 'button',\n ) as HTMLButtonElement | null;\n btn?.focus();\n },\n copyTurn: (id: string) => {\n const index = Number.parseInt(id, 10);\n if (!Number.isFinite(index)) return;\n const line = lines[index];\n if (!line) return;\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n return navigator.clipboard.writeText(line.text);\n }\n },\n }),\n [activeIndex, lines],\n );\n useAgentRegistration(\n transcriptPanelAgent,\n agentHandle,\n rest.id as string | undefined,\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-static-element-interactions -- root keyboard shortcuts (j/k navigation, /) bubble up from focused descendants\n <section\n ref={rootRef}\n onKeyDown={handleRootKeyDown}\n data-component=\"transcript-panel\"\n data-component-id={rest.id}\n aria-labelledby={headingId}\n className={rootVariants({ size, className })}\n {...rest}\n >\n {/* Shared rail header — pins to the top of the panel's scroll region\n while the transcript scrolls beneath it. The rail injects the\n favourite / close actions via PanelHeaderActionsProvider; the\n search field lives in the header's filters row. */}\n <PanelHeader\n title={t('transcriptPanel.title')}\n icon={<FileText aria-hidden=\"true\" />}\n headingId={headingId}\n divider\n filters={\n searchable ? (\n <>\n <SearchInput\n ref={searchInputRef}\n id={searchId}\n placeholder={t('chat.transcript.search')}\n aria-label={t('chat.transcript.search')}\n aria-keyshortcuts=\"Meta+F Control+F\"\n debounceMs={150}\n onChange={(v) => setQuery(v)}\n size=\"sm\"\n />\n {query ? (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\"\n >\n {matchCount === 0\n ? t('chat.transcript.noMatches')\n : t('chat.transcript.matchCount', { count: matchCount })}\n </span>\n ) : null}\n </>\n ) : undefined\n }\n />\n\n <div\n ref={scrollRef}\n className=\"ds:flex-1 ds:min-h-0 ds:overflow-y-auto ds:overflow-x-hidden\"\n >\n {virtualized ? (\n <ol\n className=\"ds:relative ds:list-none ds:ps-0 ds:m-0\"\n // eslint-disable-next-line react/forbid-dom-props -- virtualizer total size, runtime-computed\n style={{ blockSize: `${virtualizer.getTotalSize()}px` }}\n >\n {virtualizer.getVirtualItems().map((vi) => {\n const line = lines[vi.index];\n if (!line) return null;\n // Put the measureElement ref on the <li> directly — a <div>\n // child of <ol> is invalid and breaks list semantics for\n // assistive tech.\n return renderLine(line, vi.index, {\n liRef: virtualizer.measureElement,\n dataIndex: vi.index,\n style: { transform: `translateY(${vi.start}px)` },\n absolutePositioning: true,\n });\n })}\n </ol>\n ) : (\n <ol className=\"ds:list-none ds:ps-0 ds:m-0\">\n {lines.map((line, index) => renderLine(line, index))}\n </ol>\n )}\n </div>\n </section>\n );\n },\n);\n\nTranscriptPanel.displayName = 'TranscriptPanel';\n"],"names":["transcriptPanelAgent","handle","args","rootVariants","cva","VIRTUALIZATION_THRESHOLD","SPEAKER_SLOT_COUNT","formatTime","seconds","locale","total","m","s","fmt","n","secondsToIsoDuration","speakerSlot","name","hash","i","SPEAKER_BG_CLASSES","escapeRegExp","input","HighlightedText","text","query","escaped","part","jsx","Fragment","TranscriptPanel","forwardRef","lines","currentTime","onSeek","searchable","size","className","rest","ref","t","i18n","useTranslation","setQuery","useState","scrollRef","useRef","searchInputRef","searchId","useId","activeIndex","useMemo","line","matchCount","count","needle","hay","idx","handleRootKeyDown","useCallback","_a","virtualized","virtualizer","useVirtualizer","useIsomorphicLayoutEffect","scroller","target","prefersReducedMotion","renderLine","index","extras","isActive","slot","lowConfidence","jsxs","rootRef","headingId","useImperativeHandle","agentHandle","id","btn","useAgentRegistration","PanelHeader","FileText","SearchInput","v","vi"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { useTranslation as M } from "react-i18next";
5
5
  import { u as Y } from "./registry-DvAUVLHh.js";
6
6
  import { F as C } from "./form-field-BOm9hK35.js";
7
7
  import { N as B } from "./number-input-DxphVG_A.js";
8
- import { S } from "./select-DMLG44F5.js";
8
+ import { S } from "./select-KsyRr8WH.js";
9
9
  import { I as D } from "./insert-result-njqBthzT.js";
10
10
  const L = [
11
11
  "weight",
@@ -334,4 +334,4 @@ export {
334
334
  ee as b,
335
335
  Q as c
336
336
  };
337
- //# sourceMappingURL=unit-converter-YEpD9evj.js.map
337
+ //# sourceMappingURL=unit-converter-CwlZbfdn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unit-converter-YEpD9evj.js","sources":["../../src/components/unit-converter/unit-converter.agent.ts","../../src/components/unit-converter/units.ts","../../src/components/unit-converter/unit-converter.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — UnitConverter. */\n/* */\n/* Generic clinical/everyday unit conversion. The agent-relevant surface */\n/* is the read-only converted result plus the structural inputs (category, */\n/* source value, from-unit, to-unit) and `set_value` actions to drive */\n/* them. Values are plain measurements — no patient identity. The handle */\n/* is the curated `UnitConverterHandle`. See `src/docs/26-agent-readiness`.*/\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { UnitConverterHandle } from './unit-converter';\nimport type { UnitCategory } from './units';\n\n/**\n * Measurement families, mirrored from `./units`'s `CATEGORIES`. Inlined as a\n * literal (rather than runtime-imported) so the ESM catalog build can load this\n * pure module without TS path resolution; `satisfies` keeps it in lockstep with\n * the `UnitCategory` union at compile time.\n */\nconst CATEGORIES = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n] as const satisfies readonly UnitCategory[];\n\nexport const unitConverterAgent: AgentAdapter<UnitConverterHandle> = {\n id: 'unit-converter',\n capabilities: ['set_value', 'view_change'],\n state: {\n category: {\n type: \"'weight' | 'length' | 'temperature' | 'glucose'\",\n descriptionKey: 'ui.agent.unitConverter.state.category',\n description:\n 'Active measurement family. Determines which from/to units are selectable.',\n read: (handle) => handle.getCategory(),\n },\n inputs: {\n type: '{ value: number | null, fromId: string, toId: string }',\n descriptionKey: 'ui.agent.unitConverter.state.inputs',\n description:\n 'Source value plus the from-unit and to-unit ids within the active category.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: 'number | null',\n descriptionKey: 'ui.agent.unitConverter.state.result',\n description:\n 'Converted value in the to-unit, or null when the source value is empty.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: ['number', 'null'],\n description: 'Source value to convert, or null to clear.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setValue',\n description: 'Set the source value to convert.',\n examples: [{ args: { value: 70 }, note: 'Convert 70 of the from-unit.' }],\n invoke: (handle, args: { value: number | null }) => {\n handle.setValue(args.value);\n },\n },\n set_units: {\n safety: 'read',\n argsType: '{ fromId?: string, toId?: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: {\n type: 'string',\n description: 'Source unit id within the active category.',\n },\n toId: {\n type: 'string',\n description: 'Target unit id within the active category.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setUnits',\n description:\n 'Set the from-unit and/or to-unit. Ids outside the active category are ignored.',\n examples: [\n { args: { fromId: 'kg', toId: 'lb' }, note: 'Convert kg → lb.' },\n ],\n invoke: (handle, args: { fromId?: string; toId?: string }) => {\n handle.setUnits(args);\n },\n },\n set_category: {\n safety: 'read',\n argsType: \"{ category: 'weight' | 'length' | 'temperature' | 'glucose' }\",\n argsSchema: {\n type: 'object',\n properties: {\n category: {\n enum: [...CATEGORIES],\n description: 'Measurement family to switch to.',\n },\n },\n required: ['category'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setCategory',\n description:\n 'Switch the measurement family. Resets the from/to units to that category defaults.',\n invoke: (\n handle,\n args: {\n category: 'weight' | 'length' | 'temperature' | 'glucose';\n },\n ) => {\n handle.setCategory(args.category);\n },\n },\n get_result: {\n safety: 'read',\n returns: 'number | null',\n returnsSchema: { type: ['number', 'null'] },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.getResult',\n description:\n 'Return the converted value in the to-unit, or null when no source value is set.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'unit-converter',\n description: 'Marks the UnitConverter wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific converter instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Generic unit conversion — pure, framework-free, unit-testable. */\n/* */\n/* Every unit is described by an affine map to its category's base */\n/* unit: base = value * factor + offset. Conversion is base-in then */\n/* base-out, so the same code handles linear scales (weight, length, */\n/* glucose) and offset scales (temperature) uniformly. */\n/* ------------------------------------------------------------------ */\n\nexport type UnitCategory = 'weight' | 'length' | 'temperature' | 'glucose';\n\nexport interface UnitDef {\n id: string;\n category: UnitCategory;\n /** Multiplier to the category base unit. */\n factor: number;\n /** Additive offset to the base unit (non-zero only for temperature). */\n offset: number;\n}\n\n/* Base units: kg, cm, °C, mmol/L. */\nexport const UNITS: Record<string, UnitDef> = {\n // weight → base kg\n kg: { id: 'kg', category: 'weight', factor: 1, offset: 0 },\n g: { id: 'g', category: 'weight', factor: 0.001, offset: 0 },\n lb: { id: 'lb', category: 'weight', factor: 0.45359237, offset: 0 },\n oz: { id: 'oz', category: 'weight', factor: 0.028349523125, offset: 0 },\n // length → base cm\n cm: { id: 'cm', category: 'length', factor: 1, offset: 0 },\n m: { id: 'm', category: 'length', factor: 100, offset: 0 },\n in: { id: 'in', category: 'length', factor: 2.54, offset: 0 },\n ft: { id: 'ft', category: 'length', factor: 30.48, offset: 0 },\n // temperature → base °C (affine: °C = °F·5/9 − 32·5/9)\n c: { id: 'c', category: 'temperature', factor: 1, offset: 0 },\n f: { id: 'f', category: 'temperature', factor: 5 / 9, offset: (-32 * 5) / 9 },\n // glucose → base mmol/L (1 mg/dL = 1/18.0156 mmol/L)\n mmol_l: { id: 'mmol_l', category: 'glucose', factor: 1, offset: 0 },\n mg_dl: { id: 'mg_dl', category: 'glucose', factor: 1 / 18.0156, offset: 0 },\n};\n\nexport const UNITS_BY_CATEGORY: Record<UnitCategory, string[]> = {\n weight: ['kg', 'g', 'lb', 'oz'],\n length: ['cm', 'm', 'in', 'ft'],\n temperature: ['c', 'f'],\n glucose: ['mmol_l', 'mg_dl'],\n};\n\nexport const CATEGORIES: UnitCategory[] = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n];\n\n/**\n * Convert `value` from one unit to another. Both ids must belong to the same\n * category; mismatched categories throw (a programming error, not user input).\n */\nexport function convertUnits(\n value: number,\n fromId: string,\n toId: string,\n): number {\n const from = UNITS[fromId];\n const to = UNITS[toId];\n if (!from || !to) throw new Error(`Unknown unit: ${fromId} → ${toId}`);\n if (from.category !== to.category) {\n throw new Error(\n `Cannot convert across categories: ${from.category} → ${to.category}`,\n );\n }\n const base = value * from.factor + from.offset;\n return (base - to.offset) / to.factor;\n}\n","/* ------------------------------------------------------------------ */\n/* UnitConverter — generic clinical/everyday unit conversion across */\n/* weight, length, temperature and glucose. */\n/* */\n/* Maths lives in `./units` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { unitConverterAgent } from './unit-converter.agent';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type UnitCategory,\n CATEGORIES,\n UNITS_BY_CATEGORY,\n convertUnits,\n} from './units';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/**\n * DS token NAME backing the result-card category chip, one per measurement\n * family. The converter shows no on-screen badge, but the inserted card carries\n * a category chip so the reader can tell at a glance which family the figure\n * belongs to; each token is a closed-palette semantic alias resolved to a\n * concrete colour at raster time by `InsertButton`.\n */\nconst CATEGORY_HIGHLIGHT_TOKEN: Record<UnitCategory, string> = {\n weight: '--info',\n length: '--success',\n temperature: '--warning-readable',\n glucose: '--accent',\n};\n\n/**\n * Category chip token. The `temperature` family resolves to `--warning-readable`,\n * which the result card's colour probe resolves in the live themed DOM: orange-600\n * in light, non-accessible mode (where bare `--warning` yellow only reaches\n * ~3.2:1 on the white card) and `--warning` elsewhere, whose deepened ramp already\n * clears contrast. Resolving the token NAME at the card means the choice tracks\n * the live theme regardless of where the theme class lives. Other families are\n * unchanged.\n */\nfunction categoryHighlightToken(category: UnitCategory): string {\n return CATEGORY_HIGHLIGHT_TOKEN[category];\n}\n\nexport interface UnitConverterProps extends VariantProps<typeof rootVariants> {\n /** Initial category. Defaults to `'weight'`. */\n defaultCategory?: UnitCategory;\n /** Fires with the converted value (and `null` when input is empty). */\n onResultChange?: (value: number | 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/**\n * Curated imperative handle for agent / external automation. Reads/writes the\n * structural inputs (category, value, from/to units) and the converted result.\n * No patient identity. Consumed by the `unit-converter.agent.ts` adapter; the\n * public `ref` stays the DOM element.\n */\nexport interface UnitConverterHandle {\n /** Active measurement family. */\n getCategory: () => UnitCategory;\n /** Switch the measurement family (resets from/to units to that category). */\n setCategory: (next: UnitCategory) => void;\n /** Source value + from/to unit ids. */\n getInputs: () => { value: number | null; fromId: string; toId: string };\n /** Set the source value to convert. */\n setValue: (value: number | null) => void;\n /** Set from-unit and/or to-unit (ids outside the active category are ignored). */\n setUnits: (next: { fromId?: string; toId?: string }) => void;\n /** Converted value in the to-unit, or null when no source value is set. */\n getResult: () => number | null;\n}\n\nexport const UnitConverter = forwardRef<HTMLDivElement, UnitConverterProps>(\n (\n {\n defaultCategory = 'weight',\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\n const [category, setCategory] = useState<UnitCategory>(defaultCategory);\n const [value, setValue] = useState<number | null>(null);\n const [fromId, setFromId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][0],\n );\n const [toId, setToId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][1],\n );\n\n const handleCategoryChange = (next: string): void => {\n const cat = next as UnitCategory;\n const units = UNITS_BY_CATEGORY[cat];\n setCategory(cat);\n setFromId(units[0]);\n setToId(units[1] ?? units[0]);\n };\n\n const converted = useMemo(\n () => (value === null ? null : convertUnits(value, fromId, toId)),\n [value, fromId, toId],\n );\n\n const numberFmt = useMemo(\n () => new Intl.NumberFormat(i18n.language, { maximumFractionDigits: 3 }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(converted);\n }, [converted, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const liveRef = useRef({ category, value, fromId, toId, converted });\n liveRef.current = { category, value, fromId, toId, converted };\n const agentHandle = useMemo<UnitConverterHandle>(\n () => ({\n getCategory: () => liveRef.current.category,\n setCategory: (next) => handleCategoryChange(next),\n getInputs: () => ({\n value: liveRef.current.value,\n fromId: liveRef.current.fromId,\n toId: liveRef.current.toId,\n }),\n setValue: (next) => setValue(next),\n setUnits: (next) => {\n const units = UNITS_BY_CATEGORY[liveRef.current.category];\n if (next.fromId !== undefined && units.includes(next.fromId)) {\n setFromId(next.fromId);\n }\n if (next.toId !== undefined && units.includes(next.toId)) {\n setToId(next.toId);\n }\n },\n getResult: () => liveRef.current.converted,\n }),\n [],\n );\n useAgentRegistration(unitConverterAgent, agentHandle, id);\n\n const categoryOptions = CATEGORIES.map((c) => ({\n value: c,\n label: t(`unitConverter.category.${c}`),\n }));\n const unitOptions = UNITS_BY_CATEGORY[category].map((u) => ({\n value: u,\n label: t(`unitConverter.units.${u}`),\n }));\n\n return (\n <div\n ref={ref}\n data-component=\"unit-converter\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <FormField label={t('unitConverter.categoryLabel')}>\n <Select\n options={categoryOptions}\n value={category}\n onValueChange={handleCategoryChange}\n />\n </FormField>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3\">\n <FormField label={t('unitConverter.value')}>\n <NumberInput mode=\"decimal\" value={value} onChange={setValue} />\n </FormField>\n <FormField label={t('unitConverter.from')}>\n <Select\n options={unitOptions}\n value={fromId}\n onValueChange={setFromId}\n />\n </FormField>\n <FormField label={t('unitConverter.to')}>\n <Select\n options={unitOptions}\n value={toId}\n onValueChange={setToId}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {converted !== null\n ? `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )} = ${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`\n : ''}\n </p>\n\n {converted !== null ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('unitConverter.result')}\n </span>\n <span className=\"type-metric ds:text-foreground\">\n {numberFmt.format(converted)} {t(`unitConverter.units.${toId}`)}\n </span>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n variant={insertVariant}\n onInsert={onInsert}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.unitConverter'),\n icon: 'ruler',\n highlight: t(`unitConverter.category.${category}`),\n // Chip tints by measurement family so the inserted card\n // signals the category at a glance — with the contrast-safe\n // orange override for the `--warning` temperature family.\n highlightToken: categoryHighlightToken(category),\n brand: insertBrand,\n fields: [\n {\n // Source measurement → ruler glyph (matches the header).\n icon: 'ruler',\n label: t('unitConverter.from'),\n value: `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )}`,\n },\n {\n // Converted result → trending-up (arrow) glyph signals the\n // conversion direction to the output value.\n icon: 'trending-up',\n label: t('unitConverter.to'),\n value: `${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`,\n },\n ],\n }}\n />\n ) : null}\n </div>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('unitConverter.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nUnitConverter.displayName = 'UnitConverter';\n"],"names":["CATEGORIES","unitConverterAgent","handle","args","UNITS","UNITS_BY_CATEGORY","convertUnits","value","fromId","toId","from","to","rootVariants","cva","CATEGORY_HIGHLIGHT_TOKEN","categoryHighlightToken","category","UnitConverter","forwardRef","defaultCategory","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","setCategory","useState","setValue","setFromId","setToId","handleCategoryChange","next","cat","units","converted","useMemo","numberFmt","useEffect","liveRef","useRef","agentHandle","useAgentRegistration","categoryOptions","c","unitOptions","u","jsxs","jsx","FormField","Select","NumberInput","InsertButton"],"mappings":"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"}
1
+ {"version":3,"file":"unit-converter-CwlZbfdn.js","sources":["../../src/components/unit-converter/unit-converter.agent.ts","../../src/components/unit-converter/units.ts","../../src/components/unit-converter/unit-converter.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — UnitConverter. */\n/* */\n/* Generic clinical/everyday unit conversion. The agent-relevant surface */\n/* is the read-only converted result plus the structural inputs (category, */\n/* source value, from-unit, to-unit) and `set_value` actions to drive */\n/* them. Values are plain measurements — no patient identity. The handle */\n/* is the curated `UnitConverterHandle`. See `src/docs/26-agent-readiness`.*/\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { UnitConverterHandle } from './unit-converter';\nimport type { UnitCategory } from './units';\n\n/**\n * Measurement families, mirrored from `./units`'s `CATEGORIES`. Inlined as a\n * literal (rather than runtime-imported) so the ESM catalog build can load this\n * pure module without TS path resolution; `satisfies` keeps it in lockstep with\n * the `UnitCategory` union at compile time.\n */\nconst CATEGORIES = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n] as const satisfies readonly UnitCategory[];\n\nexport const unitConverterAgent: AgentAdapter<UnitConverterHandle> = {\n id: 'unit-converter',\n capabilities: ['set_value', 'view_change'],\n state: {\n category: {\n type: \"'weight' | 'length' | 'temperature' | 'glucose'\",\n descriptionKey: 'ui.agent.unitConverter.state.category',\n description:\n 'Active measurement family. Determines which from/to units are selectable.',\n read: (handle) => handle.getCategory(),\n },\n inputs: {\n type: '{ value: number | null, fromId: string, toId: string }',\n descriptionKey: 'ui.agent.unitConverter.state.inputs',\n description:\n 'Source value plus the from-unit and to-unit ids within the active category.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: 'number | null',\n descriptionKey: 'ui.agent.unitConverter.state.result',\n description:\n 'Converted value in the to-unit, or null when the source value is empty.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: ['number', 'null'],\n description: 'Source value to convert, or null to clear.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setValue',\n description: 'Set the source value to convert.',\n examples: [{ args: { value: 70 }, note: 'Convert 70 of the from-unit.' }],\n invoke: (handle, args: { value: number | null }) => {\n handle.setValue(args.value);\n },\n },\n set_units: {\n safety: 'read',\n argsType: '{ fromId?: string, toId?: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: {\n type: 'string',\n description: 'Source unit id within the active category.',\n },\n toId: {\n type: 'string',\n description: 'Target unit id within the active category.',\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setUnits',\n description:\n 'Set the from-unit and/or to-unit. Ids outside the active category are ignored.',\n examples: [\n { args: { fromId: 'kg', toId: 'lb' }, note: 'Convert kg → lb.' },\n ],\n invoke: (handle, args: { fromId?: string; toId?: string }) => {\n handle.setUnits(args);\n },\n },\n set_category: {\n safety: 'read',\n argsType: \"{ category: 'weight' | 'length' | 'temperature' | 'glucose' }\",\n argsSchema: {\n type: 'object',\n properties: {\n category: {\n enum: [...CATEGORIES],\n description: 'Measurement family to switch to.',\n },\n },\n required: ['category'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.setCategory',\n description:\n 'Switch the measurement family. Resets the from/to units to that category defaults.',\n invoke: (\n handle,\n args: {\n category: 'weight' | 'length' | 'temperature' | 'glucose';\n },\n ) => {\n handle.setCategory(args.category);\n },\n },\n get_result: {\n safety: 'read',\n returns: 'number | null',\n returnsSchema: { type: ['number', 'null'] },\n idempotent: true,\n descriptionKey: 'ui.agent.unitConverter.actions.getResult',\n description:\n 'Return the converted value in the to-unit, or null when no source value is set.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'unit-converter',\n description: 'Marks the UnitConverter wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific converter instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Generic unit conversion — pure, framework-free, unit-testable. */\n/* */\n/* Every unit is described by an affine map to its category's base */\n/* unit: base = value * factor + offset. Conversion is base-in then */\n/* base-out, so the same code handles linear scales (weight, length, */\n/* glucose) and offset scales (temperature) uniformly. */\n/* ------------------------------------------------------------------ */\n\nexport type UnitCategory = 'weight' | 'length' | 'temperature' | 'glucose';\n\nexport interface UnitDef {\n id: string;\n category: UnitCategory;\n /** Multiplier to the category base unit. */\n factor: number;\n /** Additive offset to the base unit (non-zero only for temperature). */\n offset: number;\n}\n\n/* Base units: kg, cm, °C, mmol/L. */\nexport const UNITS: Record<string, UnitDef> = {\n // weight → base kg\n kg: { id: 'kg', category: 'weight', factor: 1, offset: 0 },\n g: { id: 'g', category: 'weight', factor: 0.001, offset: 0 },\n lb: { id: 'lb', category: 'weight', factor: 0.45359237, offset: 0 },\n oz: { id: 'oz', category: 'weight', factor: 0.028349523125, offset: 0 },\n // length → base cm\n cm: { id: 'cm', category: 'length', factor: 1, offset: 0 },\n m: { id: 'm', category: 'length', factor: 100, offset: 0 },\n in: { id: 'in', category: 'length', factor: 2.54, offset: 0 },\n ft: { id: 'ft', category: 'length', factor: 30.48, offset: 0 },\n // temperature → base °C (affine: °C = °F·5/9 − 32·5/9)\n c: { id: 'c', category: 'temperature', factor: 1, offset: 0 },\n f: { id: 'f', category: 'temperature', factor: 5 / 9, offset: (-32 * 5) / 9 },\n // glucose → base mmol/L (1 mg/dL = 1/18.0156 mmol/L)\n mmol_l: { id: 'mmol_l', category: 'glucose', factor: 1, offset: 0 },\n mg_dl: { id: 'mg_dl', category: 'glucose', factor: 1 / 18.0156, offset: 0 },\n};\n\nexport const UNITS_BY_CATEGORY: Record<UnitCategory, string[]> = {\n weight: ['kg', 'g', 'lb', 'oz'],\n length: ['cm', 'm', 'in', 'ft'],\n temperature: ['c', 'f'],\n glucose: ['mmol_l', 'mg_dl'],\n};\n\nexport const CATEGORIES: UnitCategory[] = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n];\n\n/**\n * Convert `value` from one unit to another. Both ids must belong to the same\n * category; mismatched categories throw (a programming error, not user input).\n */\nexport function convertUnits(\n value: number,\n fromId: string,\n toId: string,\n): number {\n const from = UNITS[fromId];\n const to = UNITS[toId];\n if (!from || !to) throw new Error(`Unknown unit: ${fromId} → ${toId}`);\n if (from.category !== to.category) {\n throw new Error(\n `Cannot convert across categories: ${from.category} → ${to.category}`,\n );\n }\n const base = value * from.factor + from.offset;\n return (base - to.offset) / to.factor;\n}\n","/* ------------------------------------------------------------------ */\n/* UnitConverter — generic clinical/everyday unit conversion across */\n/* weight, length, temperature and glucose. */\n/* */\n/* Maths lives in `./units` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { unitConverterAgent } from './unit-converter.agent';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type UnitCategory,\n CATEGORIES,\n UNITS_BY_CATEGORY,\n convertUnits,\n} from './units';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/**\n * DS token NAME backing the result-card category chip, one per measurement\n * family. The converter shows no on-screen badge, but the inserted card carries\n * a category chip so the reader can tell at a glance which family the figure\n * belongs to; each token is a closed-palette semantic alias resolved to a\n * concrete colour at raster time by `InsertButton`.\n */\nconst CATEGORY_HIGHLIGHT_TOKEN: Record<UnitCategory, string> = {\n weight: '--info',\n length: '--success',\n temperature: '--warning-readable',\n glucose: '--accent',\n};\n\n/**\n * Category chip token. The `temperature` family resolves to `--warning-readable`,\n * which the result card's colour probe resolves in the live themed DOM: orange-600\n * in light, non-accessible mode (where bare `--warning` yellow only reaches\n * ~3.2:1 on the white card) and `--warning` elsewhere, whose deepened ramp already\n * clears contrast. Resolving the token NAME at the card means the choice tracks\n * the live theme regardless of where the theme class lives. Other families are\n * unchanged.\n */\nfunction categoryHighlightToken(category: UnitCategory): string {\n return CATEGORY_HIGHLIGHT_TOKEN[category];\n}\n\nexport interface UnitConverterProps extends VariantProps<typeof rootVariants> {\n /** Initial category. Defaults to `'weight'`. */\n defaultCategory?: UnitCategory;\n /** Fires with the converted value (and `null` when input is empty). */\n onResultChange?: (value: number | 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/**\n * Curated imperative handle for agent / external automation. Reads/writes the\n * structural inputs (category, value, from/to units) and the converted result.\n * No patient identity. Consumed by the `unit-converter.agent.ts` adapter; the\n * public `ref` stays the DOM element.\n */\nexport interface UnitConverterHandle {\n /** Active measurement family. */\n getCategory: () => UnitCategory;\n /** Switch the measurement family (resets from/to units to that category). */\n setCategory: (next: UnitCategory) => void;\n /** Source value + from/to unit ids. */\n getInputs: () => { value: number | null; fromId: string; toId: string };\n /** Set the source value to convert. */\n setValue: (value: number | null) => void;\n /** Set from-unit and/or to-unit (ids outside the active category are ignored). */\n setUnits: (next: { fromId?: string; toId?: string }) => void;\n /** Converted value in the to-unit, or null when no source value is set. */\n getResult: () => number | null;\n}\n\nexport const UnitConverter = forwardRef<HTMLDivElement, UnitConverterProps>(\n (\n {\n defaultCategory = 'weight',\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\n const [category, setCategory] = useState<UnitCategory>(defaultCategory);\n const [value, setValue] = useState<number | null>(null);\n const [fromId, setFromId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][0],\n );\n const [toId, setToId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][1],\n );\n\n const handleCategoryChange = (next: string): void => {\n const cat = next as UnitCategory;\n const units = UNITS_BY_CATEGORY[cat];\n setCategory(cat);\n setFromId(units[0]);\n setToId(units[1] ?? units[0]);\n };\n\n const converted = useMemo(\n () => (value === null ? null : convertUnits(value, fromId, toId)),\n [value, fromId, toId],\n );\n\n const numberFmt = useMemo(\n () => new Intl.NumberFormat(i18n.language, { maximumFractionDigits: 3 }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(converted);\n }, [converted, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const liveRef = useRef({ category, value, fromId, toId, converted });\n liveRef.current = { category, value, fromId, toId, converted };\n const agentHandle = useMemo<UnitConverterHandle>(\n () => ({\n getCategory: () => liveRef.current.category,\n setCategory: (next) => handleCategoryChange(next),\n getInputs: () => ({\n value: liveRef.current.value,\n fromId: liveRef.current.fromId,\n toId: liveRef.current.toId,\n }),\n setValue: (next) => setValue(next),\n setUnits: (next) => {\n const units = UNITS_BY_CATEGORY[liveRef.current.category];\n if (next.fromId !== undefined && units.includes(next.fromId)) {\n setFromId(next.fromId);\n }\n if (next.toId !== undefined && units.includes(next.toId)) {\n setToId(next.toId);\n }\n },\n getResult: () => liveRef.current.converted,\n }),\n [],\n );\n useAgentRegistration(unitConverterAgent, agentHandle, id);\n\n const categoryOptions = CATEGORIES.map((c) => ({\n value: c,\n label: t(`unitConverter.category.${c}`),\n }));\n const unitOptions = UNITS_BY_CATEGORY[category].map((u) => ({\n value: u,\n label: t(`unitConverter.units.${u}`),\n }));\n\n return (\n <div\n ref={ref}\n data-component=\"unit-converter\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <FormField label={t('unitConverter.categoryLabel')}>\n <Select\n options={categoryOptions}\n value={category}\n onValueChange={handleCategoryChange}\n />\n </FormField>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3\">\n <FormField label={t('unitConverter.value')}>\n <NumberInput mode=\"decimal\" value={value} onChange={setValue} />\n </FormField>\n <FormField label={t('unitConverter.from')}>\n <Select\n options={unitOptions}\n value={fromId}\n onValueChange={setFromId}\n />\n </FormField>\n <FormField label={t('unitConverter.to')}>\n <Select\n options={unitOptions}\n value={toId}\n onValueChange={setToId}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {converted !== null\n ? `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )} = ${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`\n : ''}\n </p>\n\n {converted !== null ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('unitConverter.result')}\n </span>\n <span className=\"type-metric ds:text-foreground\">\n {numberFmt.format(converted)} {t(`unitConverter.units.${toId}`)}\n </span>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n variant={insertVariant}\n onInsert={onInsert}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.unitConverter'),\n icon: 'ruler',\n highlight: t(`unitConverter.category.${category}`),\n // Chip tints by measurement family so the inserted card\n // signals the category at a glance — with the contrast-safe\n // orange override for the `--warning` temperature family.\n highlightToken: categoryHighlightToken(category),\n brand: insertBrand,\n fields: [\n {\n // Source measurement → ruler glyph (matches the header).\n icon: 'ruler',\n label: t('unitConverter.from'),\n value: `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )}`,\n },\n {\n // Converted result → trending-up (arrow) glyph signals the\n // conversion direction to the output value.\n icon: 'trending-up',\n label: t('unitConverter.to'),\n value: `${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`,\n },\n ],\n }}\n />\n ) : null}\n </div>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('unitConverter.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nUnitConverter.displayName = 'UnitConverter';\n"],"names":["CATEGORIES","unitConverterAgent","handle","args","UNITS","UNITS_BY_CATEGORY","convertUnits","value","fromId","toId","from","to","rootVariants","cva","CATEGORY_HIGHLIGHT_TOKEN","categoryHighlightToken","category","UnitConverter","forwardRef","defaultCategory","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","setCategory","useState","setValue","setFromId","setToId","handleCategoryChange","next","cat","units","converted","useMemo","numberFmt","useEffect","liveRef","useRef","agentHandle","useAgentRegistration","categoryOptions","c","unitOptions","u","jsxs","jsx","FormField","Select","NumberInput","InsertButton"],"mappings":"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"}