@alfadocs/ui-kit-debug 0.47.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/dist/_chunks/{agenda-card-CFyWSX7Z.js → agenda-card-BaSfVfrL.js} +25 -29
  2. package/dist/_chunks/agenda-card-BaSfVfrL.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-Dyj9ChHC.js → agenda-tray-DQayYmQ0.js} +50 -67
  4. package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +1 -0
  5. package/dist/_chunks/ai-consent-banner-DO5ingMq.js +169 -0
  6. package/dist/_chunks/ai-consent-banner-DO5ingMq.js.map +1 -0
  7. package/dist/_chunks/ai-tools-rail-CxYG04cw.js +280 -0
  8. package/dist/_chunks/ai-tools-rail-CxYG04cw.js.map +1 -0
  9. package/dist/_chunks/{alia-sidebar-CVIPrdc9.js → alia-sidebar-DlvyXgVC.js} +3 -2
  10. package/dist/_chunks/alia-sidebar-DlvyXgVC.js.map +1 -0
  11. package/dist/_chunks/anamnesis-card-CmkBVAln.js +156 -0
  12. package/dist/_chunks/anamnesis-card-CmkBVAln.js.map +1 -0
  13. package/dist/_chunks/appointment-tray-BwDHhWWC.js +419 -0
  14. package/dist/_chunks/appointment-tray-BwDHhWWC.js.map +1 -0
  15. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js → bmi-calculator-DdylQzT6.js} +2 -2
  16. package/dist/_chunks/{bmi-calculator-CQqXTVNL.js.map → bmi-calculator-DdylQzT6.js.map} +1 -1
  17. package/dist/_chunks/{booking-DlDVuWMd.js → booking-WV2GSru5.js} +291 -303
  18. package/dist/_chunks/booking-WV2GSru5.js.map +1 -0
  19. package/dist/_chunks/{calculator-dialog-D-nfvteH.js → calculator-dialog-CFk4I91b.js} +2 -2
  20. package/dist/_chunks/{calculator-dialog-D-nfvteH.js.map → calculator-dialog-CFk4I91b.js.map} +1 -1
  21. package/dist/_chunks/calendar-days-C4BmpCZg.js +23 -0
  22. package/dist/_chunks/calendar-days-C4BmpCZg.js.map +1 -0
  23. package/dist/_chunks/{calendar-YHFknAGv.js → calendar-oYWOCrnf.js} +195 -210
  24. package/dist/_chunks/calendar-oYWOCrnf.js.map +1 -0
  25. package/dist/_chunks/care-plan-card-QmNpGggC.js +252 -0
  26. package/dist/_chunks/care-plan-card-QmNpGggC.js.map +1 -0
  27. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js +318 -0
  28. package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js.map +1 -0
  29. package/dist/_chunks/{chat-message-B5JpFj0F.js → chat-message-Dm8U2RY1.js} +36 -35
  30. package/dist/_chunks/chat-message-Dm8U2RY1.js.map +1 -0
  31. package/dist/_chunks/clinical-note-card-BYo437dU.js +333 -0
  32. package/dist/_chunks/clinical-note-card-BYo437dU.js.map +1 -0
  33. package/dist/_chunks/{contact-profile-card-DHyuAPXM.js → contact-profile-card-DvvVfAA2.js} +102 -115
  34. package/dist/_chunks/contact-profile-card-DvvVfAA2.js.map +1 -0
  35. package/dist/_chunks/{cycle-calculator-KxA8dqDf.js → cycle-calculator-DYvGm_m1.js} +2 -2
  36. package/dist/_chunks/{cycle-calculator-KxA8dqDf.js.map → cycle-calculator-DYvGm_m1.js.map} +1 -1
  37. package/dist/_chunks/{dialog-BTpZV6It.js → dialog-DMGnSelc.js} +55 -55
  38. package/dist/_chunks/dialog-DMGnSelc.js.map +1 -0
  39. package/dist/_chunks/{due-date-calculator-mFxpHLml.js → due-date-calculator-BXd3ANj7.js} +2 -2
  40. package/dist/_chunks/{due-date-calculator-mFxpHLml.js.map → due-date-calculator-BXd3ANj7.js.map} +1 -1
  41. package/dist/_chunks/entity-card-COhmqHly.js +69 -0
  42. package/dist/_chunks/entity-card-COhmqHly.js.map +1 -0
  43. package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js → gestational-age-calculator-Crj6FgZw.js} +2 -2
  44. package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js.map → gestational-age-calculator-Crj6FgZw.js.map} +1 -1
  45. package/dist/_chunks/{insert-result-C5ABnzDl.js → insert-result-DNdi_JYW.js} +140 -168
  46. package/dist/_chunks/insert-result-DNdi_JYW.js.map +1 -0
  47. package/dist/_chunks/is-safe-url-DkETxeHz.js +7 -0
  48. package/dist/_chunks/is-safe-url-DkETxeHz.js.map +1 -0
  49. package/dist/_chunks/languages-DsVf_WzT.js +19 -0
  50. package/dist/_chunks/languages-DsVf_WzT.js.map +1 -0
  51. package/dist/_chunks/layers-pzGcbLPj.js +34 -0
  52. package/dist/_chunks/layers-pzGcbLPj.js.map +1 -0
  53. package/dist/_chunks/{message-card-DSPw5ghw.js → message-card-Dvl1TgaN.js} +15 -19
  54. package/dist/_chunks/message-card-Dvl1TgaN.js.map +1 -0
  55. package/dist/_chunks/{message-tray-hSQff9u4.js → message-tray-Dl6GQaaV.js} +2 -2
  56. package/dist/_chunks/{message-tray-hSQff9u4.js.map → message-tray-Dl6GQaaV.js.map} +1 -1
  57. package/dist/_chunks/operator-hero-CM8949Hd.js +198 -0
  58. package/dist/_chunks/operator-hero-CM8949Hd.js.map +1 -0
  59. package/dist/_chunks/patient-summary-card-BnTqxcTr.js +443 -0
  60. package/dist/_chunks/patient-summary-card-BnTqxcTr.js.map +1 -0
  61. package/dist/_chunks/payment-request-card-B_lyobd0.js +478 -0
  62. package/dist/_chunks/payment-request-card-B_lyobd0.js.map +1 -0
  63. package/dist/_chunks/{pdf-viewer-CWEXTlwq.js → pdf-viewer-G8SU6Azw.js} +3 -3
  64. package/dist/_chunks/pdf-viewer-G8SU6Azw.js.map +1 -0
  65. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js +455 -0
  66. package/dist/_chunks/periodontal-chart-card-BYs9hax1.js.map +1 -0
  67. package/dist/_chunks/phone-Bi5yUm4I.js +20 -0
  68. package/dist/_chunks/phone-Bi5yUm4I.js.map +1 -0
  69. package/dist/_chunks/{practice-results-DDi-kvaD.js → practice-results-BFL_mcDW.js} +3 -2
  70. package/dist/_chunks/{practice-results-DDi-kvaD.js.map → practice-results-BFL_mcDW.js.map} +1 -1
  71. package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js → pregnancy-weight-gain-C7dK89jE.js} +2 -2
  72. package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js.map → pregnancy-weight-gain-C7dK89jE.js.map} +1 -1
  73. package/dist/_chunks/scan-line-lGioFwLC.js +18 -0
  74. package/dist/_chunks/scan-line-lGioFwLC.js.map +1 -0
  75. package/dist/_chunks/shield-check-BjCGH_Sr.js +21 -0
  76. package/dist/_chunks/shield-check-BjCGH_Sr.js.map +1 -0
  77. package/dist/_chunks/{sign-document-BCyLpFHJ.js → sign-document-DPI2pY9V.js} +2 -2
  78. package/dist/_chunks/{sign-document-BCyLpFHJ.js.map → sign-document-DPI2pY9V.js.map} +1 -1
  79. package/dist/_chunks/{transaction-chip-B8ujzowA.js → transaction-chip-BZCa6XDn.js} +8 -6
  80. package/dist/_chunks/{transaction-chip-B8ujzowA.js.map → transaction-chip-BZCa6XDn.js.map} +1 -1
  81. package/dist/_chunks/{unit-converter-u3CwNDpP.js → unit-converter-jWp3Z85y.js} +2 -2
  82. package/dist/_chunks/{unit-converter-u3CwNDpP.js.map → unit-converter-jWp3Z85y.js.map} +1 -1
  83. package/dist/_chunks/user-cog-BS_qc8nA.js +24 -0
  84. package/dist/_chunks/user-cog-BS_qc8nA.js.map +1 -0
  85. package/dist/_chunks/video-BAeICxCT.js +21 -0
  86. package/dist/_chunks/video-BAeICxCT.js.map +1 -0
  87. package/dist/_chunks/{workflow-map-Djn1QMJc.js → workflow-map-ZXw-zsZ8.js} +138 -156
  88. package/dist/_chunks/workflow-map-ZXw-zsZ8.js.map +1 -0
  89. package/dist/agent-catalog.json +324 -1
  90. package/dist/components/_shared/entity-card/entity-card.d.ts +40 -0
  91. package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -0
  92. package/dist/components/_shared/entity-card/index.d.ts +3 -0
  93. package/dist/components/_shared/entity-card/index.d.ts.map +1 -0
  94. package/dist/components/_shared/index.d.ts +2 -0
  95. package/dist/components/_shared/index.d.ts.map +1 -1
  96. package/dist/components/_shared/is-safe-url.d.ts +13 -0
  97. package/dist/components/_shared/is-safe-url.d.ts.map +1 -0
  98. package/dist/components/agenda-card/agenda-card.d.ts +1 -2
  99. package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
  100. package/dist/components/agenda-card/index.d.ts +2 -1
  101. package/dist/components/agenda-card/index.d.ts.map +1 -1
  102. package/dist/components/agenda-card/index.js +6 -5
  103. package/dist/components/agenda-card/index.js.map +1 -1
  104. package/dist/components/agenda-tray/index.js +1 -1
  105. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts +4 -0
  106. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +1 -0
  107. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts +45 -0
  108. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +1 -0
  109. package/dist/components/ai-consent-banner/index.d.ts +4 -0
  110. package/dist/components/ai-consent-banner/index.d.ts.map +1 -0
  111. package/dist/components/ai-consent-banner/index.js +6 -0
  112. package/dist/components/ai-consent-banner/index.js.map +1 -0
  113. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +4 -0
  114. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +1 -0
  115. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +60 -0
  116. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -0
  117. package/dist/components/ai-tools-rail/index.d.ts +4 -0
  118. package/dist/components/ai-tools-rail/index.d.ts.map +1 -0
  119. package/dist/components/ai-tools-rail/index.js +6 -0
  120. package/dist/components/ai-tools-rail/index.js.map +1 -0
  121. package/dist/components/anamnesis-card/anamnesis-card.d.ts +68 -0
  122. package/dist/components/anamnesis-card/anamnesis-card.d.ts.map +1 -0
  123. package/dist/components/anamnesis-card/index.d.ts +3 -0
  124. package/dist/components/anamnesis-card/index.d.ts.map +1 -0
  125. package/dist/components/anamnesis-card/index.js +5 -0
  126. package/dist/components/anamnesis-card/index.js.map +1 -0
  127. package/dist/components/appointment-card/appointment-card.agent.d.ts +3 -0
  128. package/dist/components/appointment-card/appointment-card.agent.d.ts.map +1 -0
  129. package/dist/components/appointment-card/appointment-card.d.ts +93 -0
  130. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -0
  131. package/dist/components/appointment-card/appointment-tray.agent.d.ts +4 -0
  132. package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -0
  133. package/dist/components/appointment-card/appointment-tray.d.ts +48 -0
  134. package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -0
  135. package/dist/components/appointment-card/index.d.ts +8 -0
  136. package/dist/components/appointment-card/index.d.ts.map +1 -0
  137. package/dist/components/appointment-card/index.js +10 -0
  138. package/dist/components/appointment-card/index.js.map +1 -0
  139. package/dist/components/badge/badge.d.ts +1 -1
  140. package/dist/components/bmi-calculator/index.js +1 -1
  141. package/dist/components/booking/index.js +1 -1
  142. package/dist/components/calculator-dialog/index.js +1 -1
  143. package/dist/components/calendar/index.js +1 -1
  144. package/dist/components/card/card.d.ts +1 -1
  145. package/dist/components/care-plan-card/care-plan-card.agent.d.ts +4 -0
  146. package/dist/components/care-plan-card/care-plan-card.agent.d.ts.map +1 -0
  147. package/dist/components/care-plan-card/care-plan-card.d.ts +102 -0
  148. package/dist/components/care-plan-card/care-plan-card.d.ts.map +1 -0
  149. package/dist/components/care-plan-card/index.d.ts +4 -0
  150. package/dist/components/care-plan-card/index.d.ts.map +1 -0
  151. package/dist/components/care-plan-card/index.js +6 -0
  152. package/dist/components/care-plan-card/index.js.map +1 -0
  153. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts +4 -0
  154. package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts.map +1 -0
  155. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts +110 -0
  156. package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts.map +1 -0
  157. package/dist/components/care-plan-entry-card/index.d.ts +4 -0
  158. package/dist/components/care-plan-entry-card/index.d.ts.map +1 -0
  159. package/dist/components/care-plan-entry-card/index.js +6 -0
  160. package/dist/components/care-plan-entry-card/index.js.map +1 -0
  161. package/dist/components/chat-message/chat-message.d.ts +7 -0
  162. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  163. package/dist/components/chat-message/index.js +1 -1
  164. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts +4 -0
  165. package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts.map +1 -0
  166. package/dist/components/clinical-note-card/clinical-note-card.d.ts +98 -0
  167. package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -0
  168. package/dist/components/clinical-note-card/index.d.ts +4 -0
  169. package/dist/components/clinical-note-card/index.d.ts.map +1 -0
  170. package/dist/components/clinical-note-card/index.js +6 -0
  171. package/dist/components/clinical-note-card/index.js.map +1 -0
  172. package/dist/components/contact-profile-card/index.js +1 -1
  173. package/dist/components/cycle-calculator/index.js +1 -1
  174. package/dist/components/dialog/dialog.d.ts +7 -0
  175. package/dist/components/dialog/dialog.d.ts.map +1 -1
  176. package/dist/components/dialog/index.js +1 -1
  177. package/dist/components/due-date-calculator/index.js +1 -1
  178. package/dist/components/gestational-age-calculator/index.js +1 -1
  179. package/dist/components/index.d.ts +10 -0
  180. package/dist/components/index.d.ts.map +1 -1
  181. package/dist/components/message-card/index.js +5 -4
  182. package/dist/components/message-card/index.js.map +1 -1
  183. package/dist/components/message-card/message-card.d.ts +1 -2
  184. package/dist/components/message-card/message-card.d.ts.map +1 -1
  185. package/dist/components/message-tray/index.js +1 -1
  186. package/dist/components/operator-hero/index.js +1 -1
  187. package/dist/components/operator-hero/operator-hero.agent.d.ts.map +1 -1
  188. package/dist/components/operator-hero/operator-hero.d.ts +9 -0
  189. package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
  190. package/dist/components/patient-summary-card/index.d.ts +4 -0
  191. package/dist/components/patient-summary-card/index.d.ts.map +1 -0
  192. package/dist/components/patient-summary-card/index.js +6 -0
  193. package/dist/components/patient-summary-card/index.js.map +1 -0
  194. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts +4 -0
  195. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -0
  196. package/dist/components/patient-summary-card/patient-summary-card.d.ts +120 -0
  197. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -0
  198. package/dist/components/payment-card/index.d.ts +7 -0
  199. package/dist/components/payment-card/index.d.ts.map +1 -0
  200. package/dist/components/payment-card/index.js +8 -0
  201. package/dist/components/payment-card/index.js.map +1 -0
  202. package/dist/components/payment-card/payment-card.agent.d.ts +4 -0
  203. package/dist/components/payment-card/payment-card.agent.d.ts.map +1 -0
  204. package/dist/components/payment-card/payment-card.d.ts +71 -0
  205. package/dist/components/payment-card/payment-card.d.ts.map +1 -0
  206. package/dist/components/payment-card/payment-request-card.agent.d.ts +4 -0
  207. package/dist/components/payment-card/payment-request-card.agent.d.ts.map +1 -0
  208. package/dist/components/payment-card/payment-request-card.d.ts +43 -0
  209. package/dist/components/payment-card/payment-request-card.d.ts.map +1 -0
  210. package/dist/components/pdf-viewer/index.js +1 -1
  211. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  212. package/dist/components/periodontal-chart-card/index.d.ts +4 -0
  213. package/dist/components/periodontal-chart-card/index.d.ts.map +1 -0
  214. package/dist/components/periodontal-chart-card/index.js +7 -0
  215. package/dist/components/periodontal-chart-card/index.js.map +1 -0
  216. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts +4 -0
  217. package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts.map +1 -0
  218. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +74 -0
  219. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts.map +1 -0
  220. package/dist/components/practice-results/index.js +1 -1
  221. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  222. package/dist/components/public-header/public-header.d.ts +1 -1
  223. package/dist/components/sign-document/index.js +1 -1
  224. package/dist/components/stat/stat.d.ts +1 -1
  225. package/dist/components/transaction-chip/index.js +1 -1
  226. package/dist/components/unit-converter/index.js +1 -1
  227. package/dist/components/workflow/index.js +1 -1
  228. package/dist/i18n/locales/ar.d.ts +351 -0
  229. package/dist/i18n/locales/ar.d.ts.map +1 -1
  230. package/dist/i18n/locales/ar.js +351 -0
  231. package/dist/i18n/locales/ar.js.map +1 -1
  232. package/dist/i18n/locales/de.d.ts +351 -0
  233. package/dist/i18n/locales/de.d.ts.map +1 -1
  234. package/dist/i18n/locales/de.js +351 -0
  235. package/dist/i18n/locales/de.js.map +1 -1
  236. package/dist/i18n/locales/el.d.ts +351 -0
  237. package/dist/i18n/locales/el.d.ts.map +1 -1
  238. package/dist/i18n/locales/el.js +351 -0
  239. package/dist/i18n/locales/el.js.map +1 -1
  240. package/dist/i18n/locales/en.d.ts +351 -0
  241. package/dist/i18n/locales/en.d.ts.map +1 -1
  242. package/dist/i18n/locales/en.js +351 -0
  243. package/dist/i18n/locales/en.js.map +1 -1
  244. package/dist/i18n/locales/es.d.ts +351 -0
  245. package/dist/i18n/locales/es.d.ts.map +1 -1
  246. package/dist/i18n/locales/es.js +351 -0
  247. package/dist/i18n/locales/es.js.map +1 -1
  248. package/dist/i18n/locales/fr.d.ts +351 -0
  249. package/dist/i18n/locales/fr.d.ts.map +1 -1
  250. package/dist/i18n/locales/fr.js +351 -0
  251. package/dist/i18n/locales/fr.js.map +1 -1
  252. package/dist/i18n/locales/hi.d.ts +351 -0
  253. package/dist/i18n/locales/hi.d.ts.map +1 -1
  254. package/dist/i18n/locales/hi.js +351 -0
  255. package/dist/i18n/locales/hi.js.map +1 -1
  256. package/dist/i18n/locales/it.d.ts +351 -0
  257. package/dist/i18n/locales/it.d.ts.map +1 -1
  258. package/dist/i18n/locales/it.js +351 -0
  259. package/dist/i18n/locales/it.js.map +1 -1
  260. package/dist/i18n/locales/ja.d.ts +351 -0
  261. package/dist/i18n/locales/ja.d.ts.map +1 -1
  262. package/dist/i18n/locales/ja.js +351 -0
  263. package/dist/i18n/locales/ja.js.map +1 -1
  264. package/dist/i18n/locales/nl.d.ts +351 -0
  265. package/dist/i18n/locales/nl.d.ts.map +1 -1
  266. package/dist/i18n/locales/nl.js +351 -0
  267. package/dist/i18n/locales/nl.js.map +1 -1
  268. package/dist/i18n/locales/pl.d.ts +351 -0
  269. package/dist/i18n/locales/pl.d.ts.map +1 -1
  270. package/dist/i18n/locales/pl.js +351 -0
  271. package/dist/i18n/locales/pl.js.map +1 -1
  272. package/dist/i18n/locales/pt.d.ts +351 -0
  273. package/dist/i18n/locales/pt.d.ts.map +1 -1
  274. package/dist/i18n/locales/pt.js +351 -0
  275. package/dist/i18n/locales/pt.js.map +1 -1
  276. package/dist/i18n/locales/ro.d.ts +351 -0
  277. package/dist/i18n/locales/ro.d.ts.map +1 -1
  278. package/dist/i18n/locales/ro.js +351 -0
  279. package/dist/i18n/locales/ro.js.map +1 -1
  280. package/dist/i18n/locales/ru.d.ts +351 -0
  281. package/dist/i18n/locales/ru.d.ts.map +1 -1
  282. package/dist/i18n/locales/ru.js +351 -0
  283. package/dist/i18n/locales/ru.js.map +1 -1
  284. package/dist/i18n/locales/sq.d.ts +351 -0
  285. package/dist/i18n/locales/sq.d.ts.map +1 -1
  286. package/dist/i18n/locales/sq.js +351 -0
  287. package/dist/i18n/locales/sq.js.map +1 -1
  288. package/dist/i18n/locales/sv.d.ts +351 -0
  289. package/dist/i18n/locales/sv.d.ts.map +1 -1
  290. package/dist/i18n/locales/sv.js +351 -0
  291. package/dist/i18n/locales/sv.js.map +1 -1
  292. package/dist/i18n/locales/tr.d.ts +351 -0
  293. package/dist/i18n/locales/tr.d.ts.map +1 -1
  294. package/dist/i18n/locales/tr.js +351 -0
  295. package/dist/i18n/locales/tr.js.map +1 -1
  296. package/dist/i18n/locales/zh.d.ts +351 -0
  297. package/dist/i18n/locales/zh.d.ts.map +1 -1
  298. package/dist/i18n/locales/zh.js +351 -0
  299. package/dist/i18n/locales/zh.js.map +1 -1
  300. package/dist/index.js +527 -491
  301. package/dist/index.js.map +1 -1
  302. package/dist/locales/ar.json +351 -0
  303. package/dist/locales/de.json +351 -0
  304. package/dist/locales/el.json +351 -0
  305. package/dist/locales/en.json +351 -0
  306. package/dist/locales/es.json +351 -0
  307. package/dist/locales/fr.json +351 -0
  308. package/dist/locales/hi.json +351 -0
  309. package/dist/locales/it.json +351 -0
  310. package/dist/locales/ja.json +351 -0
  311. package/dist/locales/nl.json +351 -0
  312. package/dist/locales/pl.json +351 -0
  313. package/dist/locales/pt.json +351 -0
  314. package/dist/locales/ro.json +351 -0
  315. package/dist/locales/ru.json +351 -0
  316. package/dist/locales/sq.json +351 -0
  317. package/dist/locales/sv.json +351 -0
  318. package/dist/locales/tr.json +351 -0
  319. package/dist/locales/zh.json +351 -0
  320. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  321. package/dist/patterns/alia-assistant/alia-types.d.ts +15 -0
  322. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  323. package/dist/patterns/alia-assistant/index.js +1 -1
  324. package/dist/tokens.css +1 -1
  325. package/package.json +42 -1
  326. package/dist/_chunks/agenda-card-CFyWSX7Z.js.map +0 -1
  327. package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +0 -1
  328. package/dist/_chunks/alia-sidebar-CVIPrdc9.js.map +0 -1
  329. package/dist/_chunks/booking-DlDVuWMd.js.map +0 -1
  330. package/dist/_chunks/calendar-YHFknAGv.js.map +0 -1
  331. package/dist/_chunks/chat-message-B5JpFj0F.js.map +0 -1
  332. package/dist/_chunks/contact-profile-card-DHyuAPXM.js.map +0 -1
  333. package/dist/_chunks/dialog-BTpZV6It.js.map +0 -1
  334. package/dist/_chunks/insert-result-C5ABnzDl.js.map +0 -1
  335. package/dist/_chunks/message-card-DSPw5ghw.js.map +0 -1
  336. package/dist/_chunks/operator-hero-7LiiP7zi.js +0 -171
  337. package/dist/_chunks/operator-hero-7LiiP7zi.js.map +0 -1
  338. package/dist/_chunks/pdf-viewer-CWEXTlwq.js.map +0 -1
  339. package/dist/_chunks/shield-check-C73ma9Cs.js +0 -36
  340. package/dist/_chunks/shield-check-C73ma9Cs.js.map +0 -1
  341. package/dist/_chunks/workflow-map-Djn1QMJc.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ import { jsx as e, jsxs as s } from "react/jsx-runtime";
2
+ import { forwardRef as Y, useId as v } from "react";
3
+ import { useTranslation as R } from "react-i18next";
4
+ import { B as c } from "./badge-zsf5i5bH.js";
5
+ import { P as O } from "./progress-kzIRcdaq.js";
6
+ import { T as q } from "./tag-CdA0s_VV.js";
7
+ import { T as b } from "./timestamp-BV2lC-wV.js";
8
+ import { T as G } from "./transaction-chip-BZCa6XDn.js";
9
+ import { f as J } from "./tooth-scheme-CxlsLjfN.js";
10
+ import { C as Q, b as X, a as Z } from "./collapsible-X3oaLPU3.js";
11
+ import { u as ee } from "./registry-nPAVE19X.js";
12
+ import { C as ae } from "./chevron-down-BX_NP2Yh.js";
13
+ import { e as te } from "./entity-card-COhmqHly.js";
14
+ const re = {
15
+ id: "care-plan-entry-card",
16
+ capabilities: ["view_change"],
17
+ state: {
18
+ done: {
19
+ type: "boolean",
20
+ descriptionKey: "ui.agent.carePlanEntryCard.state.done",
21
+ description: "Whether the treatment line is marked executed.",
22
+ read: (t) => t.isDone()
23
+ },
24
+ phaseProgress: {
25
+ type: "{ executed: number; total: number }",
26
+ descriptionKey: "ui.agent.carePlanEntryCard.state.phaseProgress",
27
+ description: "Phase progress as executed / total counts. Counts only — never phase labels or operator identity.",
28
+ read: (t) => t.getPhaseProgress()
29
+ }
30
+ },
31
+ actions: {},
32
+ domHooks: {
33
+ root: {
34
+ attr: "data-component",
35
+ value: "care-plan-entry-card",
36
+ description: "Marks the CarePlanEntryCard root region."
37
+ },
38
+ instanceId: {
39
+ attr: "data-component-id",
40
+ sourceProp: "id",
41
+ description: "Sourced from the id prop. Addresses a specific line."
42
+ }
43
+ }
44
+ }, se = "EUR";
45
+ function ne(t) {
46
+ const o = {};
47
+ for (const l of t)
48
+ o[l] = ["filled"];
49
+ return o;
50
+ }
51
+ const le = Y(
52
+ ({
53
+ id: t,
54
+ careName: o,
55
+ code: l,
56
+ label: h,
57
+ elements: u,
58
+ done: g = !1,
59
+ executionDateIso: C,
60
+ plannedAppointment: P,
61
+ operator: i,
62
+ price: n,
63
+ phases: a,
64
+ billed: E = !1,
65
+ outsideOfEstimate: k = !1,
66
+ notesCount: p,
67
+ toothDisplay: S = "chips",
68
+ locale: j,
69
+ currency: N = se,
70
+ surface: A = "elevated",
71
+ "aria-label": w,
72
+ className: U,
73
+ ...B
74
+ }, F) => {
75
+ var L;
76
+ const { t: r, i18n: H } = R(), D = v(), K = v(), T = v(), V = v(), m = j ?? H.language ?? "en";
77
+ ee(
78
+ re,
79
+ {
80
+ isDone: () => g,
81
+ getPhaseProgress: () => ({
82
+ executed: (a == null ? void 0 : a.executed) ?? 0,
83
+ total: (a == null ? void 0 : a.total) ?? 0
84
+ })
85
+ },
86
+ t
87
+ );
88
+ const M = !!u && u.length > 0, z = !!(a != null && a.detail) && a.detail.length > 0, _ = E ? "settled" : "to-invoice", f = n == null ? void 0 : n.priceCents, x = n == null ? void 0 : n.discountedPriceCents, I = x !== void 0 && f !== void 0 && x < f, y = x ?? f, $ = (d) => new Intl.NumberFormat(m, {
89
+ style: "currency",
90
+ currency: N
91
+ }).format(d / 100);
92
+ return /* @__PURE__ */ e(
93
+ "div",
94
+ {
95
+ ref: F,
96
+ role: "region",
97
+ "aria-label": w,
98
+ "aria-labelledby": w ? void 0 : D,
99
+ "data-component": "care-plan-entry-card",
100
+ "data-component-id": t,
101
+ "data-done": g ? "true" : "false",
102
+ id: t,
103
+ className: te({ surface: A, className: U }),
104
+ ...B,
105
+ children: /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
106
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:items-start ds:gap-[var(--spacing-sm)]", children: [
107
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
108
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-wrap ds:items-baseline ds:gap-[var(--spacing-xs)]", children: [
109
+ /* @__PURE__ */ e(
110
+ "h3",
111
+ {
112
+ id: D,
113
+ className: "type-title-item ds:m-0 ds:text-[color:var(--foreground)]",
114
+ children: o
115
+ }
116
+ ),
117
+ l ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children: l }) : null
118
+ ] }),
119
+ h ? /* @__PURE__ */ e("span", { className: "type-body-sm ds:text-[color:var(--muted-foreground)]", children: h }) : null
120
+ ] }),
121
+ /* @__PURE__ */ s("div", { className: "ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-2xs)]", children: [
122
+ g ? /* @__PURE__ */ e(c, { variant: "success", size: "sm", withDot: !0, children: r("carePlanEntryCard.flag.done", "Done") }) : null,
123
+ k ? /* @__PURE__ */ e(c, { variant: "warning", size: "sm", withDot: !0, children: r(
124
+ "carePlanEntryCard.flag.outsideOfEstimate",
125
+ "Outside estimate"
126
+ ) }) : null,
127
+ E ? /* @__PURE__ */ e(c, { variant: "neutral", size: "sm", children: r("carePlanEntryCard.flag.billed", "Billed") }) : null,
128
+ typeof p == "number" && p > 0 ? /* @__PURE__ */ e(
129
+ c,
130
+ {
131
+ variant: "neutral",
132
+ size: "sm",
133
+ "aria-label": r("carePlanEntryCard.notesLabel", {
134
+ count: p,
135
+ defaultValue: "{{count}} notes"
136
+ }),
137
+ children: p
138
+ }
139
+ ) : null
140
+ ] })
141
+ ] }),
142
+ M ? S === "scheme" ? /* @__PURE__ */ e(
143
+ J,
144
+ {
145
+ mode: "display",
146
+ conditions: ne(u),
147
+ ariaLabel: r("carePlanEntryCard.toothSchemeLabel", {
148
+ count: u.length,
149
+ defaultValue: "Teeth involved: {{count}}"
150
+ })
151
+ }
152
+ ) : /* @__PURE__ */ e(
153
+ "div",
154
+ {
155
+ role: "list",
156
+ "aria-label": r(
157
+ "carePlanEntryCard.elementsLabel",
158
+ "Teeth involved"
159
+ ),
160
+ className: "ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]",
161
+ children: u.map((d) => /* @__PURE__ */ e("div", { role: "listitem", children: /* @__PURE__ */ e(q, { label: d, variant: "info", size: "sm" }) }, d))
162
+ }
163
+ ) : null,
164
+ g && C ? /* @__PURE__ */ s("p", { className: "type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]", children: [
165
+ /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.executedOn", "Executed on") }),
166
+ /* @__PURE__ */ e(
167
+ b,
168
+ {
169
+ value: C,
170
+ format: "absolute",
171
+ locale: m
172
+ }
173
+ ),
174
+ i ? /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.byOperator", {
175
+ operator: i.name,
176
+ defaultValue: "by {{operator}}"
177
+ }) }) : null
178
+ ] }) : P ? /* @__PURE__ */ s("p", { className: "type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]", children: [
179
+ /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.plannedFor", "Planned for") }),
180
+ /* @__PURE__ */ e(
181
+ b,
182
+ {
183
+ value: P.dateIso,
184
+ format: "absolute",
185
+ locale: m
186
+ }
187
+ ),
188
+ i ? /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.byOperator", {
189
+ operator: i.name,
190
+ defaultValue: "by {{operator}}"
191
+ }) }) : null
192
+ ] }) : i ? /* @__PURE__ */ e("p", { className: "type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]", children: r("carePlanEntryCard.assignedTo", {
193
+ operator: i.name,
194
+ defaultValue: "Assigned to {{operator}}"
195
+ }) }) : null,
196
+ a && a.total > 0 ? /* @__PURE__ */ e(
197
+ O,
198
+ {
199
+ value: a.executed,
200
+ max: a.total,
201
+ size: "sm",
202
+ "aria-label": r("carePlanEntryCard.phasesLabel", {
203
+ executed: a.executed,
204
+ total: a.total,
205
+ defaultValue: "Phases: {{executed}} of {{total}} executed"
206
+ }),
207
+ children: /* @__PURE__ */ s("div", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
208
+ /* @__PURE__ */ e(O.Label, { id: K, children: r("carePlanEntryCard.phasesHeading", "Phases") }),
209
+ /* @__PURE__ */ e("span", { className: "type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]", children: r("carePlanEntryCard.phasesCount", {
210
+ executed: a.executed,
211
+ total: a.total,
212
+ defaultValue: "{{executed}} / {{total}}"
213
+ }) })
214
+ ] })
215
+ }
216
+ ) : null,
217
+ y !== void 0 || z ? /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]", children: [
218
+ y !== void 0 ? /* @__PURE__ */ s("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
219
+ /* @__PURE__ */ e(
220
+ G,
221
+ {
222
+ state: _,
223
+ amount: y / 100,
224
+ currency: N,
225
+ locale: m,
226
+ size: "md"
227
+ }
228
+ ),
229
+ I && f !== void 0 ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:line-through ds:tabular-nums", children: $(f) }) : null,
230
+ I && (n == null ? void 0 : n.discountPercentage) !== void 0 ? /* @__PURE__ */ e(c, { variant: "success", size: "sm", children: r("carePlanEntryCard.discountLabel", {
231
+ percentage: n.discountPercentage,
232
+ defaultValue: "-{{percentage}}%"
233
+ }) }) : null
234
+ ] }) : null,
235
+ z ? /* @__PURE__ */ s(
236
+ Q,
237
+ {
238
+ variant: "default",
239
+ className: "ds:ms-auto ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
240
+ children: [
241
+ /* @__PURE__ */ e(X, { asChild: !0, children: /* @__PURE__ */ s(
242
+ "button",
243
+ {
244
+ type: "button",
245
+ id: T,
246
+ "aria-controls": V,
247
+ className: "ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent type-body-sm ds:text-[color:var(--foreground)] ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
248
+ children: [
249
+ /* @__PURE__ */ e("span", { children: r(
250
+ "carePlanEntryCard.phaseDetail.toggle",
251
+ "Phase detail"
252
+ ) }),
253
+ /* @__PURE__ */ e(
254
+ ae,
255
+ {
256
+ "aria-hidden": "true",
257
+ className: "ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[state=open]:rotate-180"
258
+ }
259
+ )
260
+ ]
261
+ }
262
+ ) }),
263
+ /* @__PURE__ */ e(
264
+ Z,
265
+ {
266
+ id: V,
267
+ "aria-labelledby": T,
268
+ children: /* @__PURE__ */ e("ul", { className: "ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0", children: (L = a == null ? void 0 : a.detail) == null ? void 0 : L.map((d, W) => /* @__PURE__ */ e(
269
+ de,
270
+ {
271
+ phase: d,
272
+ locale: m
273
+ },
274
+ `${d.label}-${W}`
275
+ )) })
276
+ }
277
+ )
278
+ ]
279
+ }
280
+ ) : null
281
+ ] }) : null
282
+ ] })
283
+ }
284
+ );
285
+ }
286
+ );
287
+ le.displayName = "CarePlanEntryCard";
288
+ function de({
289
+ phase: t,
290
+ locale: o
291
+ }) {
292
+ const { t: l } = R();
293
+ return /* @__PURE__ */ s("li", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]", children: [
294
+ /* @__PURE__ */ e(c, { variant: t.executed ? "success" : "neutral", size: "sm", withDot: !0, children: t.executed ? l("carePlanEntryCard.phaseDetail.executed", "Executed") : l("carePlanEntryCard.phaseDetail.pending", "Pending") }),
295
+ /* @__PURE__ */ e("span", { className: "type-body-sm ds:text-[color:var(--foreground)]", children: t.label }),
296
+ t.executed && t.executionDateIso ? /* @__PURE__ */ e(
297
+ b,
298
+ {
299
+ value: t.executionDateIso,
300
+ format: "absolute",
301
+ locale: o
302
+ }
303
+ ) : null,
304
+ t.operator ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)]", children: l("carePlanEntryCard.byOperator", {
305
+ operator: t.operator,
306
+ defaultValue: "by {{operator}}"
307
+ }) }) : null,
308
+ t.udi ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children: l("carePlanEntryCard.phaseDetail.udi", {
309
+ udi: t.udi,
310
+ defaultValue: "UDI {{udi}}"
311
+ }) }) : null
312
+ ] });
313
+ }
314
+ export {
315
+ le as C,
316
+ re as c
317
+ };
318
+ //# sourceMappingURL=care-plan-entry-card-Cnra7vUc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"care-plan-entry-card-Cnra7vUc.js","sources":["../../src/components/care-plan-entry-card/care-plan-entry-card.agent.ts","../../src/components/care-plan-entry-card/care-plan-entry-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CarePlanEntryCard. */\n/* */\n/* Read-only surface: expose the execution flag and phase-progress */\n/* counts so an agent can introspect a treatment line's status. Counts + */\n/* booleans only — never the treatment name, operator, or any patient */\n/* identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CarePlanEntryCardHandle } from './care-plan-entry-card';\n\nexport const carePlanEntryCardAgent: AgentAdapter<CarePlanEntryCardHandle> = {\n id: 'care-plan-entry-card',\n capabilities: ['view_change'],\n state: {\n done: {\n type: 'boolean',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.done',\n description: 'Whether the treatment line is marked executed.',\n read: (handle) => handle.isDone(),\n },\n phaseProgress: {\n type: '{ executed: number; total: number }',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.phaseProgress',\n description:\n 'Phase progress as executed / total counts. Counts only — never phase labels or operator identity.',\n read: (handle) => handle.getPhaseProgress(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'care-plan-entry-card',\n description: 'Marks the CarePlanEntryCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop. Addresses a specific line.',\n },\n },\n};\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Badge } from '../badge/badge';\nimport { Progress } from '../progress/progress';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport { ToothScheme } from '../tooth-scheme/tooth-scheme';\nimport type { FdiId, ToothCondition } from '../tooth-scheme/tooth-data';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../collapsible/collapsible';\nimport { entitySurfaceVariants } from '../_shared/entity-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { carePlanEntryCardAgent } from './care-plan-entry-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* CarePlanEntryCard */\n/* */\n/* A single granular treatment line within a care plan / estimate */\n/* (\"voce di preventivo\"). Replaces the hand-rolled platform treatment */\n/* row that interleaves the treatment label, FDI tooth codes, an */\n/* execution badge, a phase-progress bar, a price chip, and an */\n/* expandable per-phase breakdown. */\n/* */\n/* Composes: entitySurfaceVariants (shared card surface) + Tag / ToothScheme*/\n/* (elements) + Badge (lifecycle flags) + Timestamp (execution / planned) */\n/* + Progress (phases) + TransactionChip (price) + Collapsible (per-phase */\n/* detail). */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `carePlanEntryCard.*` namespace. Identifiers + structural state only */\n/* reach the agent layer — never patient identity. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** A planned (not-yet-executed) appointment the line is scheduled into. */\nexport interface CarePlanEntryPlannedAppointment {\n /** ISO-8601 date / datetime string. */\n dateIso: string;\n /** Stable appointment id (identifier only — never PHI). */\n appointmentId: string;\n /** Optional deep link to the appointment. */\n url?: string;\n}\n\n/** Price breakdown for the line, all amounts in integer cents. */\nexport interface CarePlanEntryPrice {\n /** List price in cents (non-negative). */\n priceCents?: number;\n /** Discounted price in cents (non-negative), when a discount applies. */\n discountedPriceCents?: number;\n /** Discount percentage (0–100), for the discount label. */\n discountPercentage?: number;\n}\n\n/** One row of the per-phase execution breakdown. */\nexport interface CarePlanEntryPhaseDetail {\n /** Short localised phase label (consumer-localised). */\n label: string;\n /** Whether this phase has been executed. */\n executed: boolean;\n /** ISO-8601 execution date, when executed. */\n executionDateIso?: string;\n /** Operator display name for the phase. */\n operator?: string;\n /** Unique Device Identifier / lot string for traceable materials. */\n udi?: string;\n}\n\n/** Phase progress summary + optional drill-down detail. */\nexport interface CarePlanEntryPhases {\n /** Number of executed phases. */\n executed: number;\n /** Total number of phases. */\n total: number;\n /** Optional per-phase breakdown rendered inside the Collapsible. */\n detail?: CarePlanEntryPhaseDetail[];\n}\n\n/** Operator the line is assigned to. */\nexport interface CarePlanEntryOperator {\n /** Operator display name (consumer-localised). */\n name: string;\n}\n\n/** Curated read-only handle exposed to the agent registry. */\nexport interface CarePlanEntryCardHandle {\n /** Whether the line is marked executed. */\n isDone: () => boolean;\n /** Phase progress as `{ executed, total }` — counts only, no PHI. */\n getPhaseProgress: () => { executed: number; total: number };\n}\n\nexport interface CarePlanEntryCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'aria-label' | 'title' | 'children'\n> {\n /**\n * Stable instance id — surfaced as `data-component-id` for the agent\n * registry and used to wire up the heading ↔ region relationship.\n */\n id?: string;\n /** Treatment / service name. Rendered as the line heading. */\n careName: string;\n /** Optional treatment code (e.g. tariff code) shown beside the name. */\n code?: string;\n /** Optional secondary label (e.g. category) under the name. */\n label?: string;\n /** FDI tooth codes the line applies to (e.g. `['16', '36']`). */\n elements?: string[];\n /** Whether the line has been executed / completed. */\n done?: boolean;\n /** ISO-8601 execution date — rendered next to the \"done\" badge. */\n executionDateIso?: string;\n /** A planned appointment the line is scheduled into, when not yet done. */\n plannedAppointment?: CarePlanEntryPlannedAppointment;\n /** Operator the line is assigned to. */\n operator?: CarePlanEntryOperator;\n /** Price breakdown (list / discounted). */\n price?: CarePlanEntryPrice;\n /** Phase progress + optional drill-down detail. */\n phases?: CarePlanEntryPhases;\n /** Whether the line has been billed / invoiced. */\n billed?: boolean;\n /** Whether the line falls outside the accepted estimate. */\n outsideOfEstimate?: boolean;\n /** Count of attached notes — rendered as a neutral count badge when > 0. */\n notesCount?: number;\n /**\n * How to render `elements`: `'chips'` (default) lists each FDI code as a\n * Tag; `'scheme'` renders a read-only `ToothScheme` highlighting them.\n */\n toothDisplay?: 'scheme' | 'chips';\n /** BCP 47 locale override for dates / currency. Defaults to i18n.language. */\n locale?: string;\n /** ISO 4217 currency code for the price chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * `elevated` (default) paints the kit card chrome; `flat` drops it for use\n * inside an existing Card / Sheet.\n */\n surface?: 'flat' | 'elevated';\n /** Accessible label override for the line region. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/**\n * Map the FDI element codes to a `ToothScheme` conditions shortcut. Codes\n * outside the FDI vocabulary are dropped (the scheme ignores unknown ids).\n * Every applied tooth is flagged `filled` so the display-mode chart marks\n * them with both colour and pattern — colour-not-alone.\n */\nfunction elementsToConditions(\n elements: string[],\n): Partial<Record<FdiId, ToothCondition[]>> {\n const conditions: Partial<Record<FdiId, ToothCondition[]>> = {};\n for (const code of elements) {\n conditions[code as FdiId] = ['filled'];\n }\n return conditions;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const CarePlanEntryCard = forwardRef<\n HTMLDivElement,\n CarePlanEntryCardProps\n>(\n (\n {\n id,\n careName,\n code,\n label,\n elements,\n done = false,\n executionDateIso,\n plannedAppointment,\n operator,\n price,\n phases,\n billed = false,\n outsideOfEstimate = false,\n notesCount,\n toothDisplay = 'chips',\n locale,\n currency = DEFAULT_CURRENCY,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const phasesLabelId = useId();\n const detailTriggerId = useId();\n const detailContentId = useId();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n useAgentRegistration(\n carePlanEntryCardAgent,\n {\n isDone: () => done,\n getPhaseProgress: () => ({\n executed: phases?.executed ?? 0,\n total: phases?.total ?? 0,\n }),\n },\n id,\n );\n\n const hasElements = !!elements && elements.length > 0;\n const hasPhaseDetail = !!phases?.detail && phases.detail.length > 0;\n\n // Price: prefer the discounted amount when present; show the list price\n // struck through beside it. Both are \"to-invoice\" until billed, then\n // settled.\n const priceState = billed ? 'settled' : 'to-invoice';\n const listCents = price?.priceCents;\n const discountedCents = price?.discountedPriceCents;\n const hasDiscount =\n discountedCents !== undefined &&\n listCents !== undefined &&\n discountedCents < listCents;\n const payableCents = discountedCents ?? listCents;\n\n const formatMoney = (cents: number): string =>\n new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n }).format(cents / 100);\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"care-plan-entry-card\"\n data-component-id={id}\n data-done={done ? 'true' : 'false'}\n id={id}\n className={entitySurfaceVariants({ surface, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {/* Heading row: name + code + trailing status flags */}\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-baseline ds:gap-[var(--spacing-xs)]\">\n <h3\n id={headingId}\n className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {careName}\n </h3>\n {code ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {code}\n </span>\n ) : null}\n </div>\n {label ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {label}\n </span>\n ) : null}\n </div>\n\n <div className=\"ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-2xs)]\">\n {done ? (\n <Badge variant=\"success\" size=\"sm\" withDot>\n {t('carePlanEntryCard.flag.done', 'Done')}\n </Badge>\n ) : null}\n {outsideOfEstimate ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t(\n 'carePlanEntryCard.flag.outsideOfEstimate',\n 'Outside estimate',\n )}\n </Badge>\n ) : null}\n {billed ? (\n <Badge variant=\"neutral\" size=\"sm\">\n {t('carePlanEntryCard.flag.billed', 'Billed')}\n </Badge>\n ) : null}\n {typeof notesCount === 'number' && notesCount > 0 ? (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n aria-label={t('carePlanEntryCard.notesLabel', {\n count: notesCount,\n defaultValue: '{{count}} notes',\n })}\n >\n {notesCount}\n </Badge>\n ) : null}\n </div>\n </div>\n\n {/* Elements: tooth scheme (display mode) or FDI tag chips */}\n {hasElements ? (\n toothDisplay === 'scheme' ? (\n <ToothScheme\n mode=\"display\"\n conditions={elementsToConditions(elements)}\n ariaLabel={t('carePlanEntryCard.toothSchemeLabel', {\n count: elements.length,\n defaultValue: 'Teeth involved: {{count}}',\n })}\n />\n ) : (\n <div\n role=\"list\"\n aria-label={t(\n 'carePlanEntryCard.elementsLabel',\n 'Teeth involved',\n )}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\"\n >\n {elements.map((element) => (\n <div role=\"listitem\" key={element}>\n <Tag label={element} variant=\"info\" size=\"sm\" />\n </div>\n ))}\n </div>\n )\n ) : null}\n\n {/* Schedule / execution line */}\n {done && executionDateIso ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.executedOn', 'Executed on')}</span>\n <Timestamp\n value={executionDateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : plannedAppointment ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.plannedFor', 'Planned for')}</span>\n <Timestamp\n value={plannedAppointment.dateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : operator ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.assignedTo', {\n operator: operator.name,\n defaultValue: 'Assigned to {{operator}}',\n })}\n </p>\n ) : null}\n\n {/* Phase progress */}\n {phases && phases.total > 0 ? (\n <Progress\n value={phases.executed}\n max={phases.total}\n size=\"sm\"\n aria-label={t('carePlanEntryCard.phasesLabel', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: 'Phases: {{executed}} of {{total}} executed',\n })}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Progress.Label id={phasesLabelId}>\n {t('carePlanEntryCard.phasesHeading', 'Phases')}\n </Progress.Label>\n <span className=\"type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.phasesCount', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: '{{executed}} / {{total}}',\n })}\n </span>\n </div>\n </Progress>\n ) : null}\n\n {/* Footer: price + (optional) phase-detail disclosure */}\n {payableCents !== undefined || hasPhaseDetail ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {payableCents !== undefined ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <TransactionChip\n state={priceState}\n amount={payableCents / 100}\n currency={currency}\n locale={activeLocale}\n size=\"md\"\n />\n {hasDiscount && listCents !== undefined ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:line-through ds:tabular-nums\">\n {formatMoney(listCents)}\n </span>\n ) : null}\n {hasDiscount && price?.discountPercentage !== undefined ? (\n <Badge variant=\"success\" size=\"sm\">\n {t('carePlanEntryCard.discountLabel', {\n percentage: price.discountPercentage,\n defaultValue: '-{{percentage}}%',\n })}\n </Badge>\n ) : null}\n </div>\n ) : null}\n\n {hasPhaseDetail ? (\n <Collapsible\n variant=\"default\"\n className=\"ds:ms-auto ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n id={detailTriggerId}\n aria-controls={detailContentId}\n className=\"ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent type-body-sm ds:text-[color:var(--foreground)] ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n <span>\n {t(\n 'carePlanEntryCard.phaseDetail.toggle',\n 'Phase detail',\n )}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[state=open]:rotate-180\"\n />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent\n id={detailContentId}\n aria-labelledby={detailTriggerId}\n >\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {phases?.detail?.map((phase, index) => (\n <PhaseDetailRow\n key={`${phase.label}-${index}`}\n phase={phase}\n locale={activeLocale}\n />\n ))}\n </ul>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n },\n);\n\nCarePlanEntryCard.displayName = 'CarePlanEntryCard';\n\n/* -------------------------------------------------------------------- */\n/* PhaseDetailRow — one row inside the per-phase Collapsible */\n/* -------------------------------------------------------------------- */\n\nfunction PhaseDetailRow({\n phase,\n locale,\n}: {\n phase: CarePlanEntryPhaseDetail;\n locale: string;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <li className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Badge variant={phase.executed ? 'success' : 'neutral'} size=\"sm\" withDot>\n {phase.executed\n ? t('carePlanEntryCard.phaseDetail.executed', 'Executed')\n : t('carePlanEntryCard.phaseDetail.pending', 'Pending')}\n </Badge>\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {phase.label}\n </span>\n {phase.executed && phase.executionDateIso ? (\n <Timestamp\n value={phase.executionDateIso}\n format=\"absolute\"\n locale={locale}\n />\n ) : null}\n {phase.operator ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.byOperator', {\n operator: phase.operator,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n {phase.udi ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {t('carePlanEntryCard.phaseDetail.udi', {\n udi: phase.udi,\n defaultValue: 'UDI {{udi}}',\n })}\n </span>\n ) : null}\n </li>\n );\n}\n\nexport type CarePlanEntryCardSurface = NonNullable<\n VariantProps<typeof entitySurfaceVariants>['surface']\n>;\n"],"names":["carePlanEntryCardAgent","handle","DEFAULT_CURRENCY","elementsToConditions","elements","conditions","code","CarePlanEntryCard","forwardRef","id","careName","label","done","executionDateIso","plannedAppointment","operator","price","phases","billed","outsideOfEstimate","notesCount","toothDisplay","locale","currency","surface","ariaLabel","className","rest","ref","t","i18n","useTranslation","headingId","useId","phasesLabelId","detailTriggerId","detailContentId","activeLocale","useAgentRegistration","hasElements","hasPhaseDetail","priceState","listCents","discountedCents","hasDiscount","payableCents","formatMoney","cents","jsx","entitySurfaceVariants","jsxs","Badge","ToothScheme","element","Tag","Timestamp","Progress","TransactionChip","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","phase","index","PhaseDetailRow"],"mappings":"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"}
@@ -1,17 +1,17 @@
1
1
  import { jsxs as d, jsx as a } from "react/jsx-runtime";
2
- import { forwardRef as j, useMemo as T, Fragment as l } from "react";
2
+ import { forwardRef as T, useMemo as z, Fragment as l } from "react";
3
3
  import { c as h } from "./index-D2ZczOXr.js";
4
- import { useTranslation as z } from "react-i18next";
4
+ import { useTranslation as B } from "react-i18next";
5
5
  import { B as F } from "./button-DD_0Xdmr.js";
6
6
  import { A as I } from "./avatar-BNQNhoyL.js";
7
7
  import { T as A } from "./timestamp-BV2lC-wV.js";
8
- import { s as B, C as M } from "./code-block-HoddNOKJ.js";
9
- import { s as S } from "./safe-image-src-DstKgCo7.js";
10
- import { R as V } from "./rotate-ccw-BWANpitO.js";
11
- import { C as D } from "./clock-21AGPWJ5.js";
12
- import { C as E } from "./check-DPdL_Sm7.js";
13
- import { C as L } from "./circle-alert-ChA9opNA.js";
14
- const R = h(
8
+ import { s as M, C as S } from "./code-block-HoddNOKJ.js";
9
+ import { s as V } from "./safe-image-src-DstKgCo7.js";
10
+ import { R as D } from "./rotate-ccw-BWANpitO.js";
11
+ import { C as E } from "./clock-21AGPWJ5.js";
12
+ import { C as L } from "./check-DPdL_Sm7.js";
13
+ import { C as R } from "./circle-alert-ChA9opNA.js";
14
+ const _ = h(
15
15
  "ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]",
16
16
  {
17
17
  variants: {
@@ -23,7 +23,7 @@ const R = h(
23
23
  },
24
24
  defaultVariants: { role: "assistant" }
25
25
  }
26
- ), _ = h(
26
+ ), $ = h(
27
27
  [
28
28
  // Cap at 42rem on wide surfaces; on narrow docks (Alia sidebar ≈22rem)
29
29
  // leave room for the avatar column (size-8 = 32px = --spacing-xl) +
@@ -45,8 +45,8 @@ const R = h(
45
45
  },
46
46
  defaultVariants: { role: "assistant" }
47
47
  }
48
- ), $ = /^(https?:|mailto:)/i;
49
- function k(n) {
48
+ ), k = /^(https?:|mailto:)/i;
49
+ function H(n) {
50
50
  const e = [];
51
51
  let s = n;
52
52
  const t = /\*\*([^*]+)\*\*|`([^`]+)`|\[([^\]]+)\]\(([^)]+)\)|\n/;
@@ -60,8 +60,8 @@ function k(n) {
60
60
  }
61
61
  return e;
62
62
  }
63
- function H(n) {
64
- return k(n).map((e, s) => e.type === "bold" ? /* @__PURE__ */ a("strong", { children: e.value }, s) : e.type === "code" ? /* @__PURE__ */ a(
63
+ function q(n) {
64
+ return H(n).map((e, s) => e.type === "bold" ? /* @__PURE__ */ a("strong", { children: e.value }, s) : e.type === "code" ? /* @__PURE__ */ a(
65
65
  "code",
66
66
  {
67
67
  dir: "ltr",
@@ -69,7 +69,7 @@ function H(n) {
69
69
  children: e.value
70
70
  },
71
71
  s
72
- ) : e.type === "br" ? /* @__PURE__ */ a("br", {}, s) : e.type === "link" ? $.test(e.href) ? /* @__PURE__ */ a(
72
+ ) : e.type === "br" ? /* @__PURE__ */ a("br", {}, s) : e.type === "link" ? k.test(e.href) ? /* @__PURE__ */ a(
73
73
  "a",
74
74
  {
75
75
  href: e.href,
@@ -81,10 +81,10 @@ function H(n) {
81
81
  s
82
82
  ) : /* @__PURE__ */ a(l, { children: e.label }, s) : /* @__PURE__ */ a(l, { children: e.value }, s));
83
83
  }
84
- function q(n) {
85
- return B(n).map((e, s) => e.type === "code" ? /* @__PURE__ */ a(M, { code: e.value, language: e.lang }, s) : /* @__PURE__ */ a(l, { children: H(e.value) }, s));
84
+ function G(n) {
85
+ return M(n).map((e, s) => e.type === "code" ? /* @__PURE__ */ a(S, { code: e.value, language: e.lang }, s) : /* @__PURE__ */ a(l, { children: q(e.value) }, s));
86
86
  }
87
- const G = j(
87
+ const J = T(
88
88
  ({
89
89
  role: n,
90
90
  content: e,
@@ -94,18 +94,19 @@ const G = j(
94
94
  renderMarkdown: x = !1,
95
95
  onRetry: m,
96
96
  actions: c,
97
- className: b,
98
- ...y
99
- }, N) => {
100
- const { t: i, i18n: u } = z(), o = T(() => {
97
+ body: b,
98
+ className: y,
99
+ ...N
100
+ }, w) => {
101
+ const { t: i, i18n: u } = B(), o = z(() => {
101
102
  if (!t) return null;
102
103
  const v = t instanceof Date ? t : new Date(t);
103
104
  return Number.isNaN(v.getTime()) ? null : new Intl.DateTimeFormat(u.language, {
104
105
  hour: "2-digit",
105
106
  minute: "2-digit"
106
107
  }).format(v);
107
- }, [t, u.language]), f = i(`chat.message.role.${n}`), w = o ? i("chat.message.label", { role: f, time: o }) : i("chat.message.labelNoTime", { role: f }), C = x ? q(e) : e, p = !r || r === "edited" ? null : r === "sending" ? /* @__PURE__ */ a(D, { "aria-hidden": "true", className: "ds:size-3.5" }) : r === "sent" ? /* @__PURE__ */ a(E, { "aria-hidden": "true", className: "ds:size-3.5" }) : /* @__PURE__ */ a(
108
- L,
108
+ }, [t, u.language]), f = i(`chat.message.role.${n}`), C = o ? i("chat.message.label", { role: f, time: o }) : i("chat.message.labelNoTime", { role: f }), j = b ?? (x ? G(e) : e), p = !r || r === "edited" ? null : r === "sending" ? /* @__PURE__ */ a(E, { "aria-hidden": "true", className: "ds:size-3.5" }) : r === "sent" ? /* @__PURE__ */ a(L, { "aria-hidden": "true", className: "ds:size-3.5" }) : /* @__PURE__ */ a(
109
+ R,
109
110
  {
110
111
  "aria-hidden": "true",
111
112
  className: "ds:size-3.5 ds:text-[color:var(--destructive)]"
@@ -114,18 +115,18 @@ const G = j(
114
115
  return /* @__PURE__ */ d(
115
116
  "article",
116
117
  {
117
- ref: N,
118
- "aria-label": w,
118
+ ref: w,
119
+ "aria-label": C,
119
120
  "data-component": "chat-message",
120
121
  className: [
121
- R({ role: n, className: b }),
122
+ _({ role: n, className: y }),
122
123
  // Entrance: fade + slide up on mount. `--animation-duration` is 0ms
123
124
  // under `prefers-reduced-motion` and `.theme-accessible`, so both
124
125
  // collapse the animation to an instant state change automatically.
125
126
  "ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-2",
126
127
  "ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]"
127
128
  ].join(" "),
128
- ...y,
129
+ ...N,
129
130
  children: [
130
131
  n !== "system" && s ? s.slot ? (
131
132
  // Consumer-supplied avatar node (e.g. Alia's Sparkles tile).
@@ -138,7 +139,7 @@ const G = j(
138
139
  I,
139
140
  {
140
141
  name: s.name,
141
- src: S(s.src),
142
+ src: V(s.src),
142
143
  size: "sm"
143
144
  }
144
145
  )
@@ -160,14 +161,14 @@ const G = j(
160
161
  {
161
162
  dir: "auto",
162
163
  className: [
163
- _({ role: n }),
164
+ $({ role: n }),
164
165
  // `break-words` (from bubbleVariants) handles soft hyphens;
165
166
  // `overflow-wrap: anywhere` is the last-resort break for
166
167
  // URLs, hashes, or CJK runs that would otherwise push the
167
168
  // bubble wider than its parent in narrow docks like Alia.
168
169
  "ds:[overflow-wrap:anywhere]"
169
170
  ].join(" "),
170
- children: C
171
+ children: j
171
172
  }
172
173
  ),
173
174
  (o || g) && n !== "system" ? /* @__PURE__ */ d(
@@ -213,7 +214,7 @@ const G = j(
213
214
  intent: "ghost",
214
215
  size: "sm",
215
216
  onClick: m,
216
- startIcon: /* @__PURE__ */ a(V, {}),
217
+ startIcon: /* @__PURE__ */ a(D, {}),
217
218
  children: i("chat.message.retry")
218
219
  }
219
220
  ) : null
@@ -229,8 +230,8 @@ const G = j(
229
230
  );
230
231
  }
231
232
  );
232
- G.displayName = "ChatMessage";
233
+ J.displayName = "ChatMessage";
233
234
  export {
234
- G as C
235
+ J as C
235
236
  };
236
- //# sourceMappingURL=chat-message-B5JpFj0F.js.map
237
+ //# sourceMappingURL=chat-message-Dm8U2RY1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-message-Dm8U2RY1.js","sources":["../../src/components/chat-message/chat-message.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useMemo,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Check, Clock, RotateCcw } from 'lucide-react';\nimport { Button } from '../button';\nimport { Avatar } from '../avatar';\nimport { Timestamp } from '../timestamp';\nimport { safeImageSrc } from '../_shared';\nimport { CodeBlock, splitCodeFences } from '../_shared/code-block';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type ChatMessageRole = 'user' | 'assistant' | 'system';\nexport type ChatMessageStatus = 'sending' | 'sent' | 'error' | 'edited';\n\nexport interface ChatMessageAvatar {\n name?: string;\n src?: string;\n /**\n * Optional custom avatar node. When provided, it REPLACES the built-in\n * `<Avatar>` (initials / image) for this message. Used by the Alia\n * pattern to render a Sparkles identity tile instead of an avatar, and\n * by consumers that want to swap in a user-icon chip, brand glyph, etc.\n * The caller is responsible for accessible labelling on the custom node\n * — ChatMessage's own `aria-label` already announces the role/time, so\n * purely decorative nodes can be `aria-hidden`.\n */\n slot?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rowVariants = cva(\n 'ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]',\n {\n variants: {\n role: {\n user: 'ds:flex-row-reverse',\n assistant: 'ds:flex-row',\n system: 'ds:flex-col ds:items-center ds:text-center',\n },\n },\n defaultVariants: { role: 'assistant' },\n },\n);\n\nconst bubbleVariants = cva(\n [\n // Cap at 42rem on wide surfaces; on narrow docks (Alia sidebar ≈22rem)\n // leave room for the avatar column (size-8 = 32px = --spacing-xl) +\n // `gap-sm` (8px = --spacing-sm) so avatars don't clip off the inline\n // edge when the row is width-constrained.\n 'ds:relative ds:max-w-[min(42rem,calc(100%-var(--spacing-xl)-var(--spacing-sm)))]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'type-body',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n role: {\n user: 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:rounded-[var(--radius-md)] ds:rounded-ee-[var(--radius-sm)]',\n assistant:\n 'ds:bg-muted/40 ds:text-foreground ds:rounded-[var(--radius-md)] ds:rounded-es-[var(--radius-sm)]',\n system:\n 'ds:bg-transparent ds:text-[color:var(--muted-foreground)] type-body-sm ds:italic',\n },\n },\n defaultVariants: { role: 'assistant' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Safe markdown-ish (bold, inline code, line-breaks, links as text) */\n/* No dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' }\n | { type: 'link'; label: string; href: string };\n\nconst SAFE_SCHEMES = /^(https?:|mailto:)/i;\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else if (match[3] !== undefined && match[4] !== undefined) {\n tokens.push({ type: 'link', label: match[3], href: match[4] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderInline(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/30 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n if (tok.type === 'link') {\n if (!SAFE_SCHEMES.test(tok.href)) {\n // Unsafe scheme (javascript:, data:) — render as inert text.\n return <Fragment key={i}>{tok.label}</Fragment>;\n }\n return (\n <a\n key={i}\n href={tok.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:underline ds:underline-offset-2 ds:hover:opacity-80\"\n >\n {tok.label}\n </a>\n );\n }\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\n/**\n * Render a message body: split fenced code blocks out to `<CodeBlock>` and run\n * the inline tokenizer over the surrounding text runs.\n */\nfunction renderBody(input: string): ReactNode {\n return splitCodeFences(input).map((seg, i) => {\n if (seg.type === 'code') {\n return <CodeBlock key={i} code={seg.value} language={seg.lang} />;\n }\n return <Fragment key={i}>{renderInline(seg.value)}</Fragment>;\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* ChatMessage */\n/* ------------------------------------------------------------------ */\n\ntype NativeProps = Omit<HTMLAttributes<HTMLElement>, 'content' | 'role'>;\n\nexport interface ChatMessageProps\n extends NativeProps, VariantProps<typeof bubbleVariants> {\n role: ChatMessageRole;\n content: string;\n avatar?: ChatMessageAvatar;\n timestamp?: Date | number | string;\n status?: ChatMessageStatus;\n /** Parse a small, safe subset of markdown. Never renders raw HTML. */\n renderMarkdown?: boolean;\n /** Invoked when the retry button is activated (error status only). */\n onRetry?: () => void;\n /**\n * Optional action row rendered beneath the message body + timestamp,\n * aligned with the message (e.g. the Alia pattern's Copy / Download\n * buttons on assistant messages). Default off → renders nothing.\n */\n actions?: ReactNode;\n /**\n * Custom body node rendered verbatim INSTEAD of `content`. When set, the\n * markdown tokenizer (`renderBody`) is skipped and the node is rendered\n * directly inside the bubble. `content` is still required (used for the\n * aria-label context and consumer copy / download). Default off.\n */\n body?: ReactNode;\n}\n\nexport const ChatMessage = forwardRef<HTMLElement, ChatMessageProps>(\n (\n {\n role,\n content,\n avatar,\n timestamp,\n status,\n renderMarkdown = false,\n onRetry,\n actions,\n body,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n // Local format — used for the aria-label interpolation only. Visible\n // label is rendered by `<Timestamp>` below, which computes the same\n // locale-aware HH:MM internally.\n const formattedTime = useMemo(() => {\n if (!timestamp) return null;\n const date = timestamp instanceof Date ? timestamp : new Date(timestamp);\n if (Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(i18n.language, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n }, [timestamp, i18n.language]);\n\n const roleLabel = t(`chat.message.role.${role}`);\n const messageLabel = formattedTime\n ? t('chat.message.label', { role: roleLabel, time: formattedTime })\n : t('chat.message.labelNoTime', { role: roleLabel });\n\n const resolvedBody =\n body ?? (renderMarkdown ? renderBody(content) : content);\n\n const statusIcon = (() => {\n if (!status || status === 'edited') return null;\n if (status === 'sending')\n return <Clock aria-hidden=\"true\" className=\"ds:size-3.5\" />;\n if (status === 'sent')\n return <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />;\n return (\n <AlertCircle\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:text-[color:var(--destructive)]\"\n />\n );\n })();\n\n const statusText = status ? t(`chat.message.status.${status}`) : null;\n\n return (\n <article\n ref={ref}\n aria-label={messageLabel}\n data-component=\"chat-message\"\n className={[\n rowVariants({ role, className }),\n // Entrance: fade + slide up on mount. `--animation-duration` is 0ms\n // under `prefers-reduced-motion` and `.theme-accessible`, so both\n // collapse the animation to an instant state change automatically.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-2',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n {...rest}\n >\n {role !== 'system' && avatar ? (\n avatar.slot ? (\n // Consumer-supplied avatar node (e.g. Alia's Sparkles tile).\n avatar.slot\n ) : (\n // Allow-list the src: LLM-supplied values can carry\n // `javascript:` / `data:text/html` / `data:image/svg+xml` and so\n // are scrubbed here before reaching <Avatar>. Fallback to initials.\n <Avatar\n name={avatar.name}\n src={safeImageSrc(avatar.src)}\n size=\"sm\"\n />\n )\n ) : null}\n\n <div\n className={[\n // min-w-0 allows this flex item to shrink below its content's\n // natural width — without it, a single unbreakable token (URL,\n // CJK run, hash) can force the bubble wider than the parent\n // and spill outside narrow containers like the Alia sidebar.\n 'ds:flex ds:flex-col ds:min-w-0',\n role === 'user'\n ? 'ds:items-end'\n : role === 'assistant'\n ? 'ds:items-start'\n : 'ds:items-center',\n ].join(' ')}\n >\n <div\n dir=\"auto\"\n className={[\n bubbleVariants({ role }),\n // `break-words` (from bubbleVariants) handles soft hyphens;\n // `overflow-wrap: anywhere` is the last-resort break for\n // URLs, hashes, or CJK runs that would otherwise push the\n // bubble wider than its parent in narrow docks like Alia.\n 'ds:[overflow-wrap:anywhere]',\n ].join(' ')}\n >\n {resolvedBody}\n </div>\n\n {(formattedTime || statusText) && role !== 'system' ? (\n <div\n className={[\n 'ds:mt-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {timestamp ? (\n <Timestamp\n value={timestamp}\n format=\"absolute\"\n absoluteFormat={{ hour: '2-digit', minute: '2-digit' }}\n dir=\"ltr\"\n />\n ) : null}\n {statusIcon ? (\n // `key={status}` re-mounts the span on every status change so\n // `animate-in` re-runs — gives the sending → sent → error\n // swap a subtle cross-fade instead of an abrupt pop.\n <span\n key={status}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n {statusIcon}\n <span className=\"ds:sr-only\">{statusText}</span>\n </span>\n ) : null}\n {status === 'error' && onRetry ? (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRetry}\n startIcon={<RotateCcw />}\n >\n {t('chat.message.retry')}\n </Button>\n ) : null}\n </div>\n ) : null}\n {actions ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {actions}\n </div>\n ) : null}\n </div>\n </article>\n );\n },\n);\n\nChatMessage.displayName = 'ChatMessage';\n"],"names":["rowVariants","cva","bubbleVariants","SAFE_SCHEMES","tokenize","input","tokens","remaining","pattern","match","renderInline","tok","i","jsx","Fragment","renderBody","splitCodeFences","seg","CodeBlock","ChatMessage","forwardRef","role","content","avatar","timestamp","status","renderMarkdown","onRetry","actions","body","className","rest","ref","t","i18n","useTranslation","formattedTime","useMemo","date","roleLabel","messageLabel","resolvedBody","statusIcon","Clock","Check","AlertCircle","statusText","jsxs","Avatar","safeImageSrc","Timestamp","Button","RotateCcw"],"mappings":";;;;;;;;;;;;;AA0CA,MAAMA,IAAcC;AAAA,EAClB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,IAEF,iBAAiB,EAAE,MAAM,YAAA;AAAA,EAAY;AAEzC,GAEMC,IAAiBD;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,WACE;AAAA,QACF,QACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB,EAAE,MAAM,YAAA;AAAA,EAAY;AAEzC,GAcME,IAAe;AAErB,SAASC,EAASC,GAAwB;AACxC,QAAMC,IAAkB,CAAA;AACxB,MAAIC,IAAYF;AAChB,QAAMG,IAAU;AAChB,SAAOD,EAAU,SAAS,KAAG;AAC3B,UAAME,IAAQD,EAAQ,KAAKD,CAAS;AACpC,QAAI,CAACE,GAAO;AACV,MAAAH,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOC,GAAW;AAC9C;AAAA,IACF;AACA,IAAIE,EAAM,QAAQ,KAChBH,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOC,EAAU,MAAM,GAAGE,EAAM,KAAK,EAAA,CAAG,GAElEA,EAAM,CAAC,MAAM,SACfH,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOG,EAAM,CAAC,GAAG,IACpCA,EAAM,CAAC,MAAM,SACtBH,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOG,EAAM,CAAC,GAAG,IACpCA,EAAM,CAAC,MAAM,UAAaA,EAAM,CAAC,MAAM,SAChDH,EAAO,KAAK,EAAE,MAAM,QAAQ,OAAOG,EAAM,CAAC,GAAG,MAAMA,EAAM,CAAC,EAAA,CAAG,IAE7DH,EAAO,KAAK,EAAE,MAAM,KAAA,CAAM,GAE5BC,IAAYA,EAAU,MAAME,EAAM,QAAQA,EAAM,CAAC,EAAE,MAAM;AAAA,EAC3D;AACA,SAAOH;AACT;AAEA,SAASI,EAAaL,GAA0B;AAC9C,SAAOD,EAASC,CAAK,EAAE,IAAI,CAACM,GAAKC,MAC3BD,EAAI,SAAS,2BAAgB,UAAA,EAAgB,UAAAA,EAAI,SAARC,CAAc,IACvDD,EAAI,SAAS,SAEb,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,KAAI;AAAA,MACJ,WAAU;AAAA,MAET,UAAAF,EAAI;AAAA,IAAA;AAAA,IAJAC;AAAA,EAAA,IAQPD,EAAI,SAAS,OAAa,gBAAAE,EAAC,UAAQD,CAAG,IACtCD,EAAI,SAAS,SACVR,EAAa,KAAKQ,EAAI,IAAI,IAK7B,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,MAAMF,EAAI;AAAA,MACV,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAET,UAAAA,EAAI;AAAA,IAAA;AAAA,IANAC;AAAA,EAAA,IAJA,gBAAAC,EAACC,GAAA,EAAkB,UAAAH,EAAI,MAAA,GAARC,CAAc,IAcjC,gBAAAC,EAACC,GAAA,EAAkB,UAAAH,EAAI,MAAA,GAARC,CAAc,CACrC;AACH;AAMA,SAASG,EAAWV,GAA0B;AAC5C,SAAOW,EAAgBX,CAAK,EAAE,IAAI,CAACY,GAAKL,MAClCK,EAAI,SAAS,SACR,gBAAAJ,EAACK,KAAkB,MAAMD,EAAI,OAAO,UAAUA,EAAI,QAAlCL,CAAwC,sBAEzDE,GAAA,EAAkB,UAAAJ,EAAaO,EAAI,KAAK,KAA1BL,CAA4B,CACnD;AACH;AAkCO,MAAMO,IAAcC;AAAA,EACzB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,WAAAC;AAAA,IACA,QAAAC;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,MAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,GAAG,MAAAC,EAAA,IAASC,EAAA,GAKdC,IAAgBC,EAAQ,MAAM;AAClC,UAAI,CAACb,EAAW,QAAO;AACvB,YAAMc,IAAOd,aAAqB,OAAOA,IAAY,IAAI,KAAKA,CAAS;AACvE,aAAI,OAAO,MAAMc,EAAK,QAAA,CAAS,IAAU,OAClC,IAAI,KAAK,eAAeJ,EAAK,UAAU;AAAA,QAC5C,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA,CACT,EAAE,OAAOI,CAAI;AAAA,IAChB,GAAG,CAACd,GAAWU,EAAK,QAAQ,CAAC,GAEvBK,IAAYN,EAAE,qBAAqBZ,CAAI,EAAE,GACzCmB,IAAeJ,IACjBH,EAAE,sBAAsB,EAAE,MAAMM,GAAW,MAAMH,EAAA,CAAe,IAChEH,EAAE,4BAA4B,EAAE,MAAMM,GAAW,GAE/CE,IACJZ,MAASH,IAAiBX,EAAWO,CAAO,IAAIA,IAE5CoB,IACA,CAACjB,KAAUA,MAAW,WAAiB,OACvCA,MAAW,YACN,gBAAAZ,EAAC8B,GAAA,EAAM,eAAY,QAAO,WAAU,eAAc,IACvDlB,MAAW,SACN,gBAAAZ,EAAC+B,GAAA,EAAM,eAAY,QAAO,WAAU,eAAc,IAEzD,gBAAA/B;AAAA,MAACgC;AAAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,MAAA;AAAA,IAAA,GAKVC,IAAarB,IAASQ,EAAE,uBAAuBR,CAAM,EAAE,IAAI;AAEjE,WACE,gBAAAsB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAf;AAAA,QACA,cAAYQ;AAAA,QACZ,kBAAe;AAAA,QACf,WAAW;AAAA,UACTxC,EAAY,EAAE,MAAAqB,GAAM,WAAAS,GAAW;AAAA;AAAA;AAAA;AAAA,UAI/B;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACT,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAAV,MAAS,YAAYE,IACpBA,EAAO;AAAA;AAAA,YAELA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKP,gBAAAV;AAAA,cAACmC;AAAA,cAAA;AAAA,gBACC,MAAMzB,EAAO;AAAA,gBACb,KAAK0B,EAAa1B,EAAO,GAAG;AAAA,gBAC5B,MAAK;AAAA,cAAA;AAAA,YAAA;AAAA,cAGP;AAAA,UAEJ,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKT;AAAA,gBACA1B,MAAS,SACL,iBACAA,MAAS,cACP,mBACA;AAAA,cAAA,EACN,KAAK,GAAG;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAR;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAI;AAAA,oBACJ,WAAW;AAAA,sBACTX,EAAe,EAAE,MAAAmB,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKvB;AAAA,oBAAA,EACA,KAAK,GAAG;AAAA,oBAET,UAAAoB;AAAA,kBAAA;AAAA,gBAAA;AAAA,iBAGDL,KAAiBU,MAAezB,MAAS,WACzC,gBAAA0B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,oBAAA,EACA,KAAK,GAAG;AAAA,oBAET,UAAA;AAAA,sBAAAvB,IACC,gBAAAX;AAAA,wBAACqC;AAAA,wBAAA;AAAA,0BACC,OAAO1B;AAAA,0BACP,QAAO;AAAA,0BACP,gBAAgB,EAAE,MAAM,WAAW,QAAQ,UAAA;AAAA,0BAC3C,KAAI;AAAA,wBAAA;AAAA,sBAAA,IAEJ;AAAA,sBACHkB;AAAA;AAAA;AAAA;AAAA,wBAIC,gBAAAK;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WAAW;AAAA,8BACT;AAAA,8BACA;AAAA,8BACA;AAAA,4BAAA,EACA,KAAK,GAAG;AAAA,4BAET,UAAA;AAAA,8BAAAL;AAAA,8BACD,gBAAA7B,EAAC,QAAA,EAAK,WAAU,cAAc,UAAAiC,EAAA,CAAW;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BARpCrB;AAAA,wBAAA;AAAA,0BAUL;AAAA,sBACHA,MAAW,WAAWE,IACrB,gBAAAd;AAAA,wBAACsC;AAAA,wBAAA;AAAA,0BACC,QAAO;AAAA,0BACP,MAAK;AAAA,0BACL,SAASxB;AAAA,0BACT,6BAAYyB,GAAA,EAAU;AAAA,0BAErB,YAAE,oBAAoB;AAAA,wBAAA;AAAA,sBAAA,IAEvB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA,IAEJ;AAAA,gBACHxB,IACC,gBAAAf,EAAC,OAAA,EAAI,WAAU,uFACZ,aACH,IACE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAM,EAAY,cAAc;"}