@alfadocs/ui-kit-debug 1.12.6 → 1.14.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 (311) hide show
  1. package/dist/_chunks/actions-cell-renderer-yy03OgRL.js +137 -0
  2. package/dist/_chunks/actions-cell-renderer-yy03OgRL.js.map +1 -0
  3. package/dist/_chunks/{address-fields-CZP4Wncx.js → address-fields-CZ0pEdEI.js} +4 -4
  4. package/dist/_chunks/{address-fields-CZP4Wncx.js.map → address-fields-CZ0pEdEI.js.map} +1 -1
  5. package/dist/_chunks/{ai-prompt-input-DnbfEJnr.js → ai-prompt-input-CrHr-5H8.js} +2 -2
  6. package/dist/_chunks/{ai-prompt-input-DnbfEJnr.js.map → ai-prompt-input-CrHr-5H8.js.map} +1 -1
  7. package/dist/_chunks/{anamnesis-summary-rows-BfhxWPO3.js → anamnesis-summary-rows-CRWO8x8g.js} +4 -4
  8. package/dist/_chunks/{anamnesis-summary-rows-BfhxWPO3.js.map → anamnesis-summary-rows-CRWO8x8g.js.map} +1 -1
  9. package/dist/_chunks/{audio-recorder-EWBCNIsd.js → audio-recorder-DXG6LTtO.js} +2 -2
  10. package/dist/_chunks/{audio-recorder-EWBCNIsd.js.map → audio-recorder-DXG6LTtO.js.map} +1 -1
  11. package/dist/_chunks/{autocomplete-BrONKN8l.js → autocomplete-MpBhz-fG.js} +86 -74
  12. package/dist/_chunks/{autocomplete-BrONKN8l.js.map → autocomplete-MpBhz-fG.js.map} +1 -1
  13. package/dist/_chunks/{balance-badge-cell-7L6nzB29.js → balance-badge-cell-CgkxYO96.js} +9 -8
  14. package/dist/_chunks/{balance-badge-cell-7L6nzB29.js.map → balance-badge-cell-CgkxYO96.js.map} +1 -1
  15. package/dist/_chunks/{bishop-score-Cnu0xs-z.js → bishop-score-CJUVBfAu.js} +2 -2
  16. package/dist/_chunks/{bishop-score-Cnu0xs-z.js.map → bishop-score-CJUVBfAu.js.map} +1 -1
  17. package/dist/_chunks/{booking-CBHKdsZl.js → booking-DQbo6mQF.js} +609 -591
  18. package/dist/_chunks/booking-DQbo6mQF.js.map +1 -0
  19. package/dist/_chunks/{calendar-B4Gnyu1C.js → calendar-CHT9Rm3M.js} +2 -2
  20. package/dist/_chunks/{calendar-B4Gnyu1C.js.map → calendar-CHT9Rm3M.js.map} +1 -1
  21. package/dist/_chunks/{calendar-event-card-Bjdbik8G.js → calendar-event-card-BjdHZaqz.js} +18 -14
  22. package/dist/_chunks/{calendar-event-card-Bjdbik8G.js.map → calendar-event-card-BjdHZaqz.js.map} +1 -1
  23. package/dist/_chunks/calendar-plus-BFrIRE4r.js +19 -0
  24. package/dist/_chunks/calendar-plus-BFrIRE4r.js.map +1 -0
  25. package/dist/_chunks/calendar-workspace-DI49_t6t.js +7429 -0
  26. package/dist/_chunks/calendar-workspace-DI49_t6t.js.map +1 -0
  27. package/dist/_chunks/{care-plan-card-aDN4oem9.js → care-plan-card-D-FMfDKH.js} +2 -2
  28. package/dist/_chunks/{care-plan-card-aDN4oem9.js.map → care-plan-card-D-FMfDKH.js.map} +1 -1
  29. package/dist/_chunks/{care-plan-entry-card-BEhANdBE.js → care-plan-entry-card-Bvw_9T-d.js} +2 -2
  30. package/dist/_chunks/{care-plan-entry-card-BEhANdBE.js.map → care-plan-entry-card-Bvw_9T-d.js.map} +1 -1
  31. package/dist/_chunks/{care-plan-header-CkpPyQqG.js → care-plan-header-B5CBE0zu.js} +2 -2
  32. package/dist/_chunks/{care-plan-header-CkpPyQqG.js.map → care-plan-header-B5CBE0zu.js.map} +1 -1
  33. package/dist/_chunks/{city-input-towzBenY.js → city-input-DaQc-Hbj.js} +2 -2
  34. package/dist/_chunks/{city-input-towzBenY.js.map → city-input-DaQc-Hbj.js.map} +1 -1
  35. package/dist/_chunks/clipboard-list-rSzfIYZB.js +25 -0
  36. package/dist/_chunks/clipboard-list-rSzfIYZB.js.map +1 -0
  37. package/dist/_chunks/{color-picker-oZ6zYks8.js → color-picker-CU303VjY.js} +4 -2
  38. package/dist/_chunks/{color-picker-oZ6zYks8.js.map → color-picker-CU303VjY.js.map} +1 -1
  39. package/dist/_chunks/{combobox-DiMLItyu.js → combobox-D7_NLE2Z.js} +89 -81
  40. package/dist/_chunks/{combobox-DiMLItyu.js.map → combobox-D7_NLE2Z.js.map} +1 -1
  41. package/dist/_chunks/{contact-profile-card-BMIBr5s9.js → contact-profile-card-BZqi8Hck.js} +38 -36
  42. package/dist/_chunks/{contact-profile-card-BMIBr5s9.js.map → contact-profile-card-BZqi8Hck.js.map} +1 -1
  43. package/dist/_chunks/{country-select-UEF9BEeQ.js → country-select-DzbPFktV.js} +2 -2
  44. package/dist/_chunks/{country-select-UEF9BEeQ.js.map → country-select-DzbPFktV.js.map} +1 -1
  45. package/dist/_chunks/data-table-DC5rO3Ty.js +1817 -0
  46. package/dist/_chunks/data-table-DC5rO3Ty.js.map +1 -0
  47. package/dist/_chunks/{document-preview-oyx9RhCo.js → document-preview-CDb-n_W7.js} +2 -2
  48. package/dist/_chunks/{document-preview-oyx9RhCo.js.map → document-preview-CDb-n_W7.js.map} +1 -1
  49. package/dist/_chunks/{face-scheme-CZaKm6fG.js → face-scheme-DA2vjqaM.js} +2 -2
  50. package/dist/_chunks/{face-scheme-CZaKm6fG.js.map → face-scheme-DA2vjqaM.js.map} +1 -1
  51. package/dist/_chunks/{field-value-DG8zaZvo.js → field-value-D-vkX9uL.js} +120 -140
  52. package/dist/_chunks/field-value-D-vkX9uL.js.map +1 -0
  53. package/dist/_chunks/{file-manager-C0y7HBAN.js → file-manager-DJMeB3V8.js} +138 -153
  54. package/dist/_chunks/file-manager-DJMeB3V8.js.map +1 -0
  55. package/dist/_chunks/folder-plus-CutOs4DP.js +22 -0
  56. package/dist/_chunks/folder-plus-CutOs4DP.js.map +1 -0
  57. package/dist/_chunks/{gestational-age-calculator-CxZelpu2.js → gestational-age-calculator-CiOQjzgx.js} +2 -2
  58. package/dist/_chunks/{gestational-age-calculator-CxZelpu2.js.map → gestational-age-calculator-CiOQjzgx.js.map} +1 -1
  59. package/dist/_chunks/hourglass-BEAzW1wE.js +26 -0
  60. package/dist/_chunks/hourglass-BEAzW1wE.js.map +1 -0
  61. package/dist/_chunks/key-value-pair-BIBdZBLg.js +188 -0
  62. package/dist/_chunks/key-value-pair-BIBdZBLg.js.map +1 -0
  63. package/dist/_chunks/{link-cell-renderer-CenJx-_7.js → link-cell-renderer-CIASXsVM.js} +4 -4
  64. package/dist/_chunks/{link-cell-renderer-CenJx-_7.js.map → link-cell-renderer-CIASXsVM.js.map} +1 -1
  65. package/dist/_chunks/{multi-select-DqL4o0qV.js → multi-select-DYOvx2SJ.js} +56 -48
  66. package/dist/_chunks/{multi-select-DqL4o0qV.js.map → multi-select-DYOvx2SJ.js.map} +1 -1
  67. package/dist/_chunks/{muscle-scheme-yfzP_xoJ.js → muscle-scheme-BSJsI4-I.js} +2 -2
  68. package/dist/_chunks/{muscle-scheme-yfzP_xoJ.js.map → muscle-scheme-BSJsI4-I.js.map} +1 -1
  69. package/dist/_chunks/{notes-panel-CymneXtl.js → notes-panel-DYAtlq_i.js} +2 -2
  70. package/dist/_chunks/{notes-panel-CymneXtl.js.map → notes-panel-DYAtlq_i.js.map} +1 -1
  71. package/dist/_chunks/{optical-prescription-Dj3Eh5Ok.js → optical-prescription-BvwuqTpl.js} +2 -2
  72. package/dist/_chunks/{optical-prescription-Dj3Eh5Ok.js.map → optical-prescription-BvwuqTpl.js.map} +1 -1
  73. package/dist/_chunks/{patient-details-xrqe13az.js → patient-details-BfzvFnxQ.js} +75 -94
  74. package/dist/_chunks/patient-details-BfzvFnxQ.js.map +1 -0
  75. package/dist/_chunks/{patient-search-D5ufYoRc.js → patient-search-HeEUB-_X.js} +2 -2
  76. package/dist/_chunks/{patient-search-D5ufYoRc.js.map → patient-search-HeEUB-_X.js.map} +1 -1
  77. package/dist/_chunks/{patient-summary-card-CBfuDvJ5.js → patient-summary-card-D5Vfa321.js} +3 -3
  78. package/dist/_chunks/{patient-summary-card-CBfuDvJ5.js.map → patient-summary-card-D5Vfa321.js.map} +1 -1
  79. package/dist/_chunks/{payment-request-card-YVCcCZ25.js → payment-request-card-lmKLwsDs.js} +2 -2
  80. package/dist/_chunks/{payment-request-card-YVCcCZ25.js.map → payment-request-card-lmKLwsDs.js.map} +1 -1
  81. package/dist/_chunks/{periodontal-chart-BatZEFar.js → periodontal-chart-B9fphroR.js} +2 -2
  82. package/dist/_chunks/{periodontal-chart-BatZEFar.js.map → periodontal-chart-B9fphroR.js.map} +1 -1
  83. package/dist/_chunks/{periodontal-chart-card-BBpY_rBc.js → periodontal-chart-card-qEZPXj83.js} +2 -2
  84. package/dist/_chunks/{periodontal-chart-card-BBpY_rBc.js.map → periodontal-chart-card-qEZPXj83.js.map} +1 -1
  85. package/dist/_chunks/{practice-results-D7ygCj_W.js → practice-results-DL_ExLYE.js} +159 -172
  86. package/dist/_chunks/practice-results-DL_ExLYE.js.map +1 -0
  87. package/dist/_chunks/{pregnancy-dating-DtToyMyc.js → pregnancy-dating-D2wchD11.js} +2 -2
  88. package/dist/_chunks/{pregnancy-dating-DtToyMyc.js.map → pregnancy-dating-D2wchD11.js.map} +1 -1
  89. package/dist/_chunks/{province-select-BDywtmL-.js → province-select-BBc7s7vR.js} +2 -2
  90. package/dist/_chunks/{province-select-BDywtmL-.js.map → province-select-BBc7s7vR.js.map} +1 -1
  91. package/dist/_chunks/{rich-text-editor-BDfFtK4H.js → rich-text-editor-DtbcA6s1.js} +2 -2
  92. package/dist/_chunks/{rich-text-editor-BDfFtK4H.js.map → rich-text-editor-DtbcA6s1.js.map} +1 -1
  93. package/dist/_chunks/{select-BW5ecXlX.js → select-Bi8zril7.js} +165 -136
  94. package/dist/_chunks/select-Bi8zril7.js.map +1 -0
  95. package/dist/_chunks/signature-CpFNpsVK.js +21 -0
  96. package/dist/_chunks/signature-CpFNpsVK.js.map +1 -0
  97. package/dist/_chunks/{signature-field-0rFODJlW.js → signature-field-CEiPe-vX.js} +19 -34
  98. package/dist/_chunks/signature-field-CEiPe-vX.js.map +1 -0
  99. package/dist/_chunks/{signature-request-DVDTKLjM.js → signature-request-CUe903hj.js} +2 -2
  100. package/dist/_chunks/{signature-request-DVDTKLjM.js.map → signature-request-CUe903hj.js.map} +1 -1
  101. package/dist/_chunks/smartphone-C0rFF2if.js +15 -0
  102. package/dist/_chunks/smartphone-C0rFF2if.js.map +1 -0
  103. package/dist/_chunks/{tabs-CBb2AidH.js → tabs-DqKtTIjZ.js} +2 -2
  104. package/dist/_chunks/{tabs-CBb2AidH.js.map → tabs-DqKtTIjZ.js.map} +1 -1
  105. package/dist/_chunks/{tasks-panel-Do5SFp-j.js → tasks-panel-DPCNaRko.js} +2 -2
  106. package/dist/_chunks/{tasks-panel-Do5SFp-j.js.map → tasks-panel-DPCNaRko.js.map} +1 -1
  107. package/dist/_chunks/{toast.agent-D1tdg6DS.js → toast-YZz2sBzB.js} +160 -212
  108. package/dist/_chunks/toast-YZz2sBzB.js.map +1 -0
  109. package/dist/_chunks/toast.agent-DNQ0JYGv.js +56 -0
  110. package/dist/_chunks/toast.agent-DNQ0JYGv.js.map +1 -0
  111. package/dist/_chunks/{tooth-scheme-WdyVymQ1.js → tooth-scheme-2IsmbE6w.js} +2 -2
  112. package/dist/_chunks/{tooth-scheme-WdyVymQ1.js.map → tooth-scheme-2IsmbE6w.js.map} +1 -1
  113. package/dist/_chunks/{unit-converter-BPumXMA6.js → unit-converter-C6jMjqL9.js} +2 -2
  114. package/dist/_chunks/{unit-converter-BPumXMA6.js.map → unit-converter-C6jMjqL9.js.map} +1 -1
  115. package/dist/_chunks/{workflow-map-DE_ribRM.js → workflow-map-dNzJjBWG.js} +104 -113
  116. package/dist/_chunks/workflow-map-dNzJjBWG.js.map +1 -0
  117. package/dist/agent-catalog.json +867 -1
  118. package/dist/agent-i18n/en.json +27 -0
  119. package/dist/components/_shared/option.d.ts +1 -0
  120. package/dist/components/_shared/option.d.ts.map +1 -1
  121. package/dist/components/address-fields/index.js +1 -1
  122. package/dist/components/ai-prompt-input/index.js +1 -1
  123. package/dist/components/audio-recorder/index.js +1 -1
  124. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  125. package/dist/components/autocomplete/index.js +1 -1
  126. package/dist/components/bishop-score/index.js +1 -1
  127. package/dist/components/booking/booking.d.ts.map +1 -1
  128. package/dist/components/booking/index.js +1 -1
  129. package/dist/components/calendar/index.js +1 -1
  130. package/dist/components/calendar-event-card/index.js +1 -1
  131. package/dist/components/care-plan-card/index.js +1 -1
  132. package/dist/components/care-plan-entry-card/index.js +1 -1
  133. package/dist/components/care-plan-header/index.js +1 -1
  134. package/dist/components/city-input/index.js +1 -1
  135. package/dist/components/color-picker/index.js +1 -1
  136. package/dist/components/combobox/combobox.d.ts.map +1 -1
  137. package/dist/components/combobox/index.js +1 -1
  138. package/dist/components/contact-profile-card/contact-profile-card.d.ts.map +1 -1
  139. package/dist/components/contact-profile-card/index.js +1 -1
  140. package/dist/components/country-select/index.js +1 -1
  141. package/dist/components/data-table/index.js +39 -38
  142. package/dist/components/data-table/index.js.map +1 -1
  143. package/dist/components/document-preview/index.js +1 -1
  144. package/dist/components/face-scheme/index.js +1 -1
  145. package/dist/components/file-manager/index.js +1 -1
  146. package/dist/components/gestational-age-calculator/index.js +1 -1
  147. package/dist/components/index.d.ts +1 -0
  148. package/dist/components/index.d.ts.map +1 -1
  149. package/dist/components/key-value-pair/index.js +1 -1
  150. package/dist/components/key-value-pair/key-value-pair.d.ts +16 -0
  151. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  152. package/dist/components/multi-select/index.js +1 -1
  153. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  154. package/dist/components/muscle-scheme/index.js +1 -1
  155. package/dist/components/notes-panel/index.js +1 -1
  156. package/dist/components/optical-prescription/index.js +1 -1
  157. package/dist/components/patient-details/index.js +1 -1
  158. package/dist/components/patient-search/index.js +1 -1
  159. package/dist/components/patient-summary-card/index.js +1 -1
  160. package/dist/components/patient-table/index.js +1 -1
  161. package/dist/components/payment-card/index.js +1 -1
  162. package/dist/components/periodontal-chart/index.js +1 -1
  163. package/dist/components/periodontal-chart-card/index.js +1 -1
  164. package/dist/components/practice-results/index.js +1 -1
  165. package/dist/components/pregnancy-dating/index.js +1 -1
  166. package/dist/components/province-select/index.js +1 -1
  167. package/dist/components/rich-text-editor/index.js +1 -1
  168. package/dist/components/select/index.js +1 -1
  169. package/dist/components/select/select.d.ts +24 -0
  170. package/dist/components/select/select.d.ts.map +1 -1
  171. package/dist/components/signature-field/index.js +1 -1
  172. package/dist/components/skeleton-scheme/index.js +1 -1
  173. package/dist/components/tabs/index.js +1 -1
  174. package/dist/components/tasks-panel/index.js +1 -1
  175. package/dist/components/toast/index.js +7 -6
  176. package/dist/components/toast/index.js.map +1 -1
  177. package/dist/components/tooth-scheme/index.js +1 -1
  178. package/dist/components/unit-converter/index.js +1 -1
  179. package/dist/components/workflow/index.js +1 -1
  180. package/dist/i18n/locales/ar.d.ts +680 -0
  181. package/dist/i18n/locales/ar.d.ts.map +1 -1
  182. package/dist/i18n/locales/ar.js +680 -0
  183. package/dist/i18n/locales/ar.js.map +1 -1
  184. package/dist/i18n/locales/de.d.ts +680 -0
  185. package/dist/i18n/locales/de.d.ts.map +1 -1
  186. package/dist/i18n/locales/de.js +680 -0
  187. package/dist/i18n/locales/de.js.map +1 -1
  188. package/dist/i18n/locales/el.d.ts +680 -0
  189. package/dist/i18n/locales/el.d.ts.map +1 -1
  190. package/dist/i18n/locales/el.js +680 -0
  191. package/dist/i18n/locales/el.js.map +1 -1
  192. package/dist/i18n/locales/en.d.ts +680 -0
  193. package/dist/i18n/locales/en.d.ts.map +1 -1
  194. package/dist/i18n/locales/en.js +680 -0
  195. package/dist/i18n/locales/en.js.map +1 -1
  196. package/dist/i18n/locales/es.d.ts +680 -0
  197. package/dist/i18n/locales/es.d.ts.map +1 -1
  198. package/dist/i18n/locales/es.js +680 -0
  199. package/dist/i18n/locales/es.js.map +1 -1
  200. package/dist/i18n/locales/fr.d.ts +680 -0
  201. package/dist/i18n/locales/fr.d.ts.map +1 -1
  202. package/dist/i18n/locales/fr.js +680 -0
  203. package/dist/i18n/locales/fr.js.map +1 -1
  204. package/dist/i18n/locales/hi.d.ts +680 -0
  205. package/dist/i18n/locales/hi.d.ts.map +1 -1
  206. package/dist/i18n/locales/hi.js +680 -0
  207. package/dist/i18n/locales/hi.js.map +1 -1
  208. package/dist/i18n/locales/it.d.ts +680 -0
  209. package/dist/i18n/locales/it.d.ts.map +1 -1
  210. package/dist/i18n/locales/it.js +680 -0
  211. package/dist/i18n/locales/it.js.map +1 -1
  212. package/dist/i18n/locales/ja.d.ts +680 -0
  213. package/dist/i18n/locales/ja.d.ts.map +1 -1
  214. package/dist/i18n/locales/ja.js +680 -0
  215. package/dist/i18n/locales/ja.js.map +1 -1
  216. package/dist/i18n/locales/nl.d.ts +680 -0
  217. package/dist/i18n/locales/nl.d.ts.map +1 -1
  218. package/dist/i18n/locales/nl.js +680 -0
  219. package/dist/i18n/locales/nl.js.map +1 -1
  220. package/dist/i18n/locales/pl.d.ts +680 -0
  221. package/dist/i18n/locales/pl.d.ts.map +1 -1
  222. package/dist/i18n/locales/pl.js +680 -0
  223. package/dist/i18n/locales/pl.js.map +1 -1
  224. package/dist/i18n/locales/pt.d.ts +680 -0
  225. package/dist/i18n/locales/pt.d.ts.map +1 -1
  226. package/dist/i18n/locales/pt.js +680 -0
  227. package/dist/i18n/locales/pt.js.map +1 -1
  228. package/dist/i18n/locales/ro.d.ts +680 -0
  229. package/dist/i18n/locales/ro.d.ts.map +1 -1
  230. package/dist/i18n/locales/ro.js +680 -0
  231. package/dist/i18n/locales/ro.js.map +1 -1
  232. package/dist/i18n/locales/ru.d.ts +680 -0
  233. package/dist/i18n/locales/ru.d.ts.map +1 -1
  234. package/dist/i18n/locales/ru.js +680 -0
  235. package/dist/i18n/locales/ru.js.map +1 -1
  236. package/dist/i18n/locales/sq.d.ts +680 -0
  237. package/dist/i18n/locales/sq.d.ts.map +1 -1
  238. package/dist/i18n/locales/sq.js +680 -0
  239. package/dist/i18n/locales/sq.js.map +1 -1
  240. package/dist/i18n/locales/sv.d.ts +680 -0
  241. package/dist/i18n/locales/sv.d.ts.map +1 -1
  242. package/dist/i18n/locales/sv.js +680 -0
  243. package/dist/i18n/locales/sv.js.map +1 -1
  244. package/dist/i18n/locales/tr.d.ts +680 -0
  245. package/dist/i18n/locales/tr.d.ts.map +1 -1
  246. package/dist/i18n/locales/tr.js +680 -0
  247. package/dist/i18n/locales/tr.js.map +1 -1
  248. package/dist/i18n/locales/zh.d.ts +680 -0
  249. package/dist/i18n/locales/zh.d.ts.map +1 -1
  250. package/dist/i18n/locales/zh.js +680 -0
  251. package/dist/i18n/locales/zh.js.map +1 -1
  252. package/dist/index.js +830 -812
  253. package/dist/index.js.map +1 -1
  254. package/dist/locales/ar.json +680 -0
  255. package/dist/locales/de.json +680 -0
  256. package/dist/locales/el.json +680 -0
  257. package/dist/locales/en.json +680 -0
  258. package/dist/locales/es.json +680 -0
  259. package/dist/locales/fr.json +680 -0
  260. package/dist/locales/hi.json +680 -0
  261. package/dist/locales/it.json +680 -0
  262. package/dist/locales/ja.json +680 -0
  263. package/dist/locales/nl.json +680 -0
  264. package/dist/locales/pl.json +680 -0
  265. package/dist/locales/pt.json +680 -0
  266. package/dist/locales/ro.json +680 -0
  267. package/dist/locales/ru.json +680 -0
  268. package/dist/locales/sq.json +680 -0
  269. package/dist/locales/sv.json +680 -0
  270. package/dist/locales/tr.json +680 -0
  271. package/dist/locales/zh.json +680 -0
  272. package/dist/patterns/anamnesis/index.js +1 -1
  273. package/dist/patterns/calendar/calendar-workspace.d.ts +62 -0
  274. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -0
  275. package/dist/patterns/calendar/calendar-workspace.model.d.ts +358 -0
  276. package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -0
  277. package/dist/patterns/calendar/calendar.data.d.ts +122 -0
  278. package/dist/patterns/calendar/calendar.data.d.ts.map +1 -0
  279. package/dist/patterns/calendar/calendar.host.d.ts +10 -0
  280. package/dist/patterns/calendar/calendar.host.d.ts.map +1 -0
  281. package/dist/patterns/calendar/calendar.journey.d.ts +119 -0
  282. package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -0
  283. package/dist/patterns/calendar/calendar.model.d.ts +684 -0
  284. package/dist/patterns/calendar/calendar.model.d.ts.map +1 -0
  285. package/dist/patterns/calendar/calendar.preferences.d.ts +74 -0
  286. package/dist/patterns/calendar/calendar.preferences.d.ts.map +1 -0
  287. package/dist/patterns/calendar/calendar.sheets.d.ts +398 -0
  288. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -0
  289. package/dist/patterns/calendar/calendar.surface.d.ts +77 -0
  290. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -0
  291. package/dist/patterns/calendar/calendar.types.d.ts +413 -0
  292. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -0
  293. package/dist/patterns/calendar/index.d.ts +13 -0
  294. package/dist/patterns/calendar/index.d.ts.map +1 -0
  295. package/dist/patterns/calendar/index.js +19 -0
  296. package/dist/patterns/calendar/index.js.map +1 -0
  297. package/dist/patterns/signature-request/index.js +1 -1
  298. package/package.json +5 -1
  299. package/dist/_chunks/actions-cell-renderer-DnSLrgQD.js +0 -1945
  300. package/dist/_chunks/actions-cell-renderer-DnSLrgQD.js.map +0 -1
  301. package/dist/_chunks/booking-CBHKdsZl.js.map +0 -1
  302. package/dist/_chunks/field-value-DG8zaZvo.js.map +0 -1
  303. package/dist/_chunks/file-manager-C0y7HBAN.js.map +0 -1
  304. package/dist/_chunks/key-value-pair-BubG4fUa.js +0 -144
  305. package/dist/_chunks/key-value-pair-BubG4fUa.js.map +0 -1
  306. package/dist/_chunks/patient-details-xrqe13az.js.map +0 -1
  307. package/dist/_chunks/practice-results-D7ygCj_W.js.map +0 -1
  308. package/dist/_chunks/select-BW5ecXlX.js.map +0 -1
  309. package/dist/_chunks/signature-field-0rFODJlW.js.map +0 -1
  310. package/dist/_chunks/toast.agent-D1tdg6DS.js.map +0 -1
  311. package/dist/_chunks/workflow-map-DE_ribRM.js.map +0 -1
@@ -0,0 +1,137 @@
1
+ import { jsxs as m, jsx as o } from "react/jsx-runtime";
2
+ import { isValidElement as w, cloneElement as A, forwardRef as B } from "react";
3
+ import { useTranslation as R } from "react-i18next";
4
+ import { I as f } from "./icon-button-DA2CAGHZ.js";
5
+ import { I as S } from "./icon-button-group-VCCod3Hz.js";
6
+ import { D as l } from "./dropdown-menu-DU-Hrf33.js";
7
+ import { E as T } from "./ellipsis-dRo9ouSU.js";
8
+ function h(s) {
9
+ if (!w(s)) return s;
10
+ const e = s, i = e.props.className ?? "", r = /\bsize-|\bw-|\bh-/.test(i) ? i : `${i} size-4`.trim();
11
+ return A(e, { className: r, size: e.props.size ?? 16 });
12
+ }
13
+ function G(s) {
14
+ return Math.max(1, s) * 32 + 28;
15
+ }
16
+ function p(s, e) {
17
+ return typeof s == "function" ? s(e) : !!s;
18
+ }
19
+ const k = "ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]";
20
+ function V(s) {
21
+ const {
22
+ data: e,
23
+ actions: i,
24
+ intent: r = "ghost",
25
+ group: v,
26
+ label: a,
27
+ collapsed: c,
28
+ maxInline: n
29
+ } = s, { t: d } = R();
30
+ if (!e) return null;
31
+ const u = i.filter((t) => !p(t.hidden, e)), N = typeof c == "function" ? c() : !!c, z = n === void 0 ? u : u.slice(0, Math.max(0, n)), C = n === void 0 ? [] : u.slice(Math.max(0, n));
32
+ if (N)
33
+ return /* @__PURE__ */ m(l.Root, { children: [
34
+ /* @__PURE__ */ o(l.Trigger, { asChild: !0, children: /* @__PURE__ */ o(
35
+ f,
36
+ {
37
+ size: "sm",
38
+ intent: r,
39
+ icon: /* @__PURE__ */ o(T, { "aria-hidden": !0 }),
40
+ "aria-label": a ?? d("dataTable.actions", "Actions")
41
+ }
42
+ ) }),
43
+ /* @__PURE__ */ o(l.Content, { align: "end", children: u.map((t, b) => /* @__PURE__ */ o(
44
+ l.Item,
45
+ {
46
+ startIcon: h(t.icon),
47
+ disabled: p(t.disabled, e),
48
+ onSelect: () => t.onClick(e),
49
+ className: t.variant === "destructive" ? "ds:text-[color:var(--destructive)]" : void 0,
50
+ children: t.label
51
+ },
52
+ b
53
+ )) })
54
+ ] });
55
+ const x = z.map((t, b) => {
56
+ const I = p(t.disabled, e), E = I && t.disabledReason ? t.disabledReason : t.label;
57
+ return /* @__PURE__ */ o(
58
+ f,
59
+ {
60
+ size: "sm",
61
+ intent: r,
62
+ icon: h(t.icon),
63
+ tooltip: E,
64
+ "aria-label": t.label,
65
+ disabled: I,
66
+ onClick: (M) => {
67
+ M.stopPropagation(), t.onClick(e);
68
+ },
69
+ className: t.variant === "destructive" ? k : void 0
70
+ },
71
+ b
72
+ );
73
+ }), g = C.length > 0 ? /* @__PURE__ */ o(
74
+ L,
75
+ {
76
+ data: e,
77
+ actions: C,
78
+ intent: r,
79
+ label: a ?? d("dataTable.actions", "Actions")
80
+ },
81
+ "overflow"
82
+ ) : null;
83
+ return v ? /* @__PURE__ */ m(
84
+ S,
85
+ {
86
+ "aria-label": a ?? d("dataTable.actions", "Actions"),
87
+ size: "sm",
88
+ children: [
89
+ x,
90
+ g
91
+ ]
92
+ }
93
+ ) : /* @__PURE__ */ m("span", { className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
94
+ x,
95
+ g
96
+ ] });
97
+ }
98
+ const L = B(function({
99
+ data: e,
100
+ actions: i,
101
+ label: r,
102
+ intent: v = "ghost",
103
+ ...a
104
+ }, c) {
105
+ return /* @__PURE__ */ m(l.Root, { children: [
106
+ /* @__PURE__ */ o(l.Trigger, { asChild: !0, children: /* @__PURE__ */ o(
107
+ f,
108
+ {
109
+ ref: c,
110
+ type: "button",
111
+ size: "sm",
112
+ intent: v,
113
+ icon: /* @__PURE__ */ o(T, { "aria-hidden": !0 }),
114
+ tooltip: r,
115
+ "aria-label": r,
116
+ onClick: (n) => n.stopPropagation(),
117
+ ...a
118
+ }
119
+ ) }),
120
+ /* @__PURE__ */ o(l.Content, { align: "end", children: i.map((n, d) => /* @__PURE__ */ o(
121
+ l.Item,
122
+ {
123
+ startIcon: h(n.icon),
124
+ disabled: p(n.disabled, e),
125
+ onSelect: () => n.onClick(e),
126
+ className: n.variant === "destructive" ? "ds:text-[color:var(--destructive)]" : void 0,
127
+ children: n.label
128
+ },
129
+ d
130
+ )) })
131
+ ] });
132
+ });
133
+ export {
134
+ V as A,
135
+ G as a
136
+ };
137
+ //# sourceMappingURL=actions-cell-renderer-yy03OgRL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions-cell-renderer-yy03OgRL.js","sources":["../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx"],"sourcesContent":["import {\n type ReactElement,\n cloneElement,\n isValidElement,\n type ReactNode,\n forwardRef,\n type ForwardedRef,\n} from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\nimport { DropdownMenu } from '../../dropdown-menu';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n /** Intent of the inline buttons / the collapsed trigger (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /**\n * Render the inline buttons as a connected `IconButtonGroup` (a segmented\n * control) rather than a loose row. Requires `label` for the group name.\n */\n group?: boolean;\n /** Accessible name for the group and the collapsed overflow trigger. */\n label?: string;\n /**\n * Collapse the actions into a single \"…\" overflow menu instead of inline\n * buttons. Pass a getter to flip it at runtime — call\n * `api.refreshCells({ force: true })` after the underlying value changes so\n * the cells re-read it (this preserves column state, unlike rebuilding defs).\n */\n collapsed?: boolean | (() => boolean);\n /**\n * Split button: keep the first `maxInline` visible actions as inline buttons\n * and fold the rest into a trailing \"…\" menu at the end of the row. The\n * column then needs `actionsColumnWidth(maxInline + 1)`. Ignored while\n * `collapsed`; `0` is the same as `collapsed`.\n */\n maxInline?: number;\n}\n\n/**\n * Pixel width an actions column needs so `count` inline `sm` IconButtons (32px\n * each — whether segmented via `group` or loose) plus the data-table cell's\n * inline padding never clip. AG Grid gives a column ONE width for every row, so\n * pass the TOTAL number of actions (the worst case where a single row shows them\n * all) — not the per-row visible count, which varies with `hidden` predicates.\n *\n * Use it as the column `width` so a fully-actioned row can't overflow:\n *\n * {\n * colId: 'actions',\n * cellRenderer: ActionsCellRenderer,\n * cellRendererParams: { actions, group: true },\n * width: actionsColumnWidth(actions.length),\n * // minWidth stays at the collapsed footprint when `collapsed` is used.\n * }\n */\nexport function actionsColumnWidth(count: number): number {\n const SM_BUTTON = 32; // sm IconButton (`w-8`)\n // Segmented-group chrome + the cell's inline padding:\n // 12 segmented-group borders and seams around the buttons\n // + 16 --spacing-sm each side, the reduced padding the theme gives\n // graphic-only cells (a text cell's 30px would clip the group).\n const CELL_INSET = 28;\n return Math.max(1, count) * SM_BUTTON + CELL_INSET;\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nconst destructiveInline =\n 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]';\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const {\n data,\n actions,\n intent = 'ghost',\n group,\n label,\n collapsed,\n maxInline,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const visible = actions.filter((action) => !resolve(action.hidden, data));\n const isCollapsed =\n typeof collapsed === 'function' ? collapsed() : Boolean(collapsed);\n const inline =\n maxInline === undefined\n ? visible\n : visible.slice(0, Math.max(0, maxInline));\n const overflow =\n maxInline === undefined ? [] : visible.slice(Math.max(0, maxInline));\n\n // Collapsed: one \"…\" trigger opening a DropdownMenu of the actions. Disabled\n // actions stay in the menu but inert (the per-action `disabledReason` is an\n // inline-only affordance — a menu row has no tooltip surface).\n if (isCollapsed) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {visible.map((action, index) => (\n <DropdownMenu.Item\n // Action defs are referentially stable; index is safe as actions\n // do not reorder within a row.\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n }\n\n const buttons = inline.map((action, index) => {\n const isDisabled = resolve(action.disabled, data);\n const tooltip =\n isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n return (\n <IconButton\n // See note above on index keys.\n key={index}\n size=\"sm\"\n intent={intent}\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n action.variant === 'destructive' ? destructiveInline : undefined\n }\n />\n );\n });\n\n const more =\n overflow.length > 0 ? (\n <OverflowActionsMenu\n key=\"overflow\"\n data={data}\n actions={overflow}\n intent={intent}\n label={label ?? t('dataTable.actions', 'Actions')}\n />\n ) : null;\n\n return group ? (\n <IconButtonGroup\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n size=\"sm\"\n >\n {buttons}\n {more}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n {more}\n </span>\n );\n}\n\ninterface OverflowActionsMenuProps<TData> extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'onClick'\n> {\n data: TData;\n actions: ActionDef<TData>[];\n label: string;\n}\n\n/**\n * The \"…\" end of a split actions button. Forwards its ref and the rest of its\n * props to the trigger IconButton, so an IconButtonGroup can seat it as the\n * last segment exactly like a plain button (the same contract ExportMenu\n * follows in the toolbar).\n */\nconst OverflowActionsMenu = forwardRef(function OverflowActionsMenu<TData>(\n {\n data,\n actions,\n label,\n intent = 'ghost',\n ...rest\n }: OverflowActionsMenuProps<TData>,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n tooltip={label}\n aria-label={label}\n onClick={(event) => event.stopPropagation()}\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {actions.map((action, index) => (\n <DropdownMenu.Item\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}) as <TData>(\n props: OverflowActionsMenuProps<TData> & {\n ref?: ForwardedRef<HTMLButtonElement>;\n },\n) => ReactElement;\n"],"names":["sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","actionsColumnWidth","count","resolve","flag","data","destructiveInline","ActionsCellRenderer","props","actions","intent","group","label","collapsed","maxInline","t","useTranslation","visible","action","isCollapsed","inline","overflow","jsxs","DropdownMenu","jsx","IconButton","Ellipsis","index","buttons","isDisabled","tooltip","event","more","OverflowActionsMenu","IconButtonGroup","forwardRef","rest","ref"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsx as s } from "react/jsx-runtime";
2
2
  import { forwardRef as _, useRef as j, useEffect as k, useCallback as E, useMemo as x } from "react";
3
3
  import { c as L } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as N } from "react-i18next";
5
- import { C as O } from "./country-select-UEF9BEeQ.js";
6
- import { P as B } from "./province-select-BDywtmL-.js";
5
+ import { C as O } from "./country-select-DzbPFktV.js";
6
+ import { P as B } from "./province-select-BBc7s7vR.js";
7
7
  import { P as q } from "./postal-code-input-BznBxVxf.js";
8
- import { C as H } from "./city-input-towzBenY.js";
8
+ import { C as H } from "./city-input-DaQc-Hbj.js";
9
9
  import { T as K } from "./text-input-CUvCb6ST.js";
10
10
  import { F as l } from "./form-field-CahJzTxp.js";
11
11
  import { A as M } from "./address-autocomplete-Bq-1n1UX.js";
@@ -243,4 +243,4 @@ export {
243
243
  Z as A,
244
244
  Y as a
245
245
  };
246
- //# sourceMappingURL=address-fields-CZP4Wncx.js.map
246
+ //# sourceMappingURL=address-fields-CZ0pEdEI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"address-fields-CZP4Wncx.js","sources":["../../src/components/address-fields/address-fields.agent.ts","../../src/components/address-fields/address-fields.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { StructuredAddress } from '../address-autocomplete';\n\nexport interface AddressFieldsHandle {\n getValue: () => StructuredAddress;\n setValue: (value: StructuredAddress) => void;\n setField: (field: keyof StructuredAddress, value: string) => void;\n}\n\nconst ADDRESS_PROPERTIES = {\n street: { type: 'string' },\n city: { type: 'string' },\n postcode: { type: 'string' },\n province: { type: 'string', description: 'UPPERCASED province code.' },\n country: { type: 'string', description: 'ISO alpha-2, lowercased.' },\n formatted: { type: 'string' },\n} as const;\n\nexport const addressFieldsAgent: AgentAdapter<AddressFieldsHandle> = {\n id: 'address-fields',\n // `set_value` only — a structured address form sets discrete fields; it does\n // no granular in-place rich-text editing, so `edit_inline` does not apply.\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'object',\n descriptionKey: 'ui.agent.addressFields.state.value',\n description:\n 'The current structured address: { street, city, postcode, province, country, formatted }.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: StructuredAddress }',\n argsSchema: {\n type: 'object',\n properties: {\n value: { type: 'object', properties: ADDRESS_PROPERTIES },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setValue',\n description: 'Replace the entire address.',\n invoke: (handle, args: { value: StructuredAddress }) => {\n handle.setValue(args.value);\n },\n },\n set_field: {\n // Contact-data write (street/city/postcode/etc.), not clinical PHI —\n // consistent with PhoneInput / EmailInput / FiscalCodeInput, which all\n // treat identifying contact data as `write`.\n safety: 'write',\n argsType:\n \"{ field: 'street' | 'city' | 'postcode' | 'province' | 'country'; value: string }\",\n argsSchema: {\n type: 'object',\n properties: {\n field: {\n type: 'string',\n enum: ['street', 'city', 'postcode', 'province', 'country'],\n },\n value: { type: 'string' },\n },\n required: ['field', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setField',\n description:\n 'Set a single address field. Setting `country` also clears the now-stale province.',\n examples: [\n {\n args: { field: 'country', value: 'it' },\n note: 'Set the country to Italy.',\n },\n ],\n invoke: (\n handle,\n args: { field: keyof StructuredAddress; value: string },\n ) => {\n handle.setField(args.field, args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'address-fields' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CountrySelect } from '../country-select/country-select';\nimport { ProvinceSelect } from '../province-select/province-select';\nimport { PostalCodeInput } from '../postal-code-input/postal-code-input';\nimport { CityInput, type CityLoaderContext } from '../city-input/city-input';\nimport { TextInput } from '../text-input';\nimport { FormField } from '../form-field/form-field';\nimport {\n AddressAutocomplete,\n type GetSuggestions,\n type StructuredAddress,\n} from '../address-autocomplete';\nimport type { OptionShape } from '../_shared/option';\nimport { useAgentRegistration } from '../../agent';\nimport {\n addressFieldsAgent,\n type AddressFieldsHandle,\n} from './address-fields.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A shippable composite that wires the address fields together and */\n/* emits a single StructuredAddress. Country drives the rest: it re-keys */\n/* the province dataset, swaps the postcode rule, and re-orders the */\n/* fields. An optional \"find address\" bar fans an AddressAutocomplete */\n/* selection out into the individual fields. */\n/* ------------------------------------------------------------------ */\n\nexport type AddressFieldKey = 'street' | 'city' | 'postcode' | 'province';\n\nconst EMPTY_ADDRESS: StructuredAddress = {\n street: '',\n city: '',\n postcode: '',\n province: '',\n country: '',\n formatted: '',\n};\n\n// Minimal country-keyed field-order map — NOT a libaddressinput port.\n// Extend with another entry when a country needs a different order.\nconst FIELD_ORDER: Record<string, AddressFieldKey[]> = {\n it: ['street', 'postcode', 'city', 'province'],\n};\nconst DEFAULT_ORDER: AddressFieldKey[] = [\n 'street',\n 'city',\n 'postcode',\n 'province',\n];\n\n// Fields that span the full width in the grid layout.\nconst WIDE_CELLS = new Set<string>(['findbar', 'country', 'street']);\n\nconst layoutVariants = cva('', {\n variants: {\n layout: {\n stacked: 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n grid: 'ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { layout: 'stacked' },\n});\n\nexport interface AddressFieldsProps {\n /** The controlled address value. */\n value?: StructuredAddress;\n /** Fires with the next full address on any field change. */\n onChange?: (next: StructuredAddress) => void;\n /**\n * Which address-line fields to render, in order. The country picker\n * always renders first. Default resolves from the selected country.\n */\n fields?: AddressFieldKey[];\n /** Async city suggestion loader, forwarded to CityInput. */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Float these countries to the top of the country picker. */\n popularCountries?: string[];\n /** Enable the \"find address\" bar — provide a Places API key… */\n apiKey?: string;\n /** …or a mock/real suggestion injector (wins over apiKey, like AddressAutocomplete). */\n getSuggestions?: GetSuggestions;\n layout?: 'stacked' | 'grid';\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport const AddressFields = forwardRef<HTMLDivElement, AddressFieldsProps>(\n function AddressFields(\n {\n value,\n onChange,\n fields,\n loadCities,\n popularCountries,\n apiKey,\n getSuggestions,\n layout = 'stacked',\n disabled,\n id,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation();\n const address = value ?? EMPTY_ADDRESS;\n const country = address.country;\n\n const valueRef = useRef(address);\n useEffect(() => {\n valueRef.current = address;\n }, [address]);\n\n const update = useCallback(\n (patch: Partial<StructuredAddress>) => {\n onChange?.({ ...valueRef.current, ...patch });\n },\n [onChange],\n );\n\n // Find-bar selection fans the looked-up address out into every field.\n const handleFind = useCallback(\n (found: StructuredAddress) =>\n onChange?.({ ...valueRef.current, ...found }),\n [onChange],\n );\n\n const agentHandle = useMemo<AddressFieldsHandle>(\n () => ({\n getValue: () => valueRef.current,\n setValue: (next) => onChange?.(next),\n setField: (field, fieldValue) => {\n const patch: Partial<StructuredAddress> = { [field]: fieldValue };\n // Mirror the UI path: changing country re-keys the stale province.\n if (field === 'country') patch.province = '';\n onChange?.({ ...valueRef.current, ...patch });\n },\n }),\n [onChange],\n );\n useAgentRegistration(addressFieldsAgent, agentHandle, id);\n\n const order =\n fields ?? FIELD_ORDER[country?.toLowerCase() ?? ''] ?? DEFAULT_ORDER;\n\n const showFindBar = Boolean(apiKey || getSuggestions);\n\n // The composite's own adapter (`address-fields`) is the agent-addressable\n // surface; the child inputs below are deliberately rendered without an\n // `id`, so they register un-scoped rather than competing for handles.\n const fieldNode = (key: AddressFieldKey | 'country'): ReactNode => {\n switch (key) {\n case 'country':\n return (\n <FormField label={t('inputs.addressFields.country', 'Country')}>\n <CountrySelect\n value={country}\n // Country drives the rest — re-key province on change.\n onValueChange={(next) =>\n update({ country: next, province: '' })\n }\n popularCountries={popularCountries}\n disabled={disabled}\n />\n </FormField>\n );\n case 'street':\n return (\n <FormField label={t('inputs.addressFields.street', 'Street')}>\n <TextInput\n value={address.street}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n update({ street: event.target.value })\n }\n autoComplete=\"address-line1\"\n disabled={disabled}\n />\n </FormField>\n );\n case 'city':\n return (\n <FormField label={t('inputs.addressFields.city', 'City')}>\n <CityInput\n value={address.city}\n onValueChange={(next) => update({ city: next })}\n loadCities={loadCities}\n country={country}\n province={address.province}\n disabled={disabled}\n />\n </FormField>\n );\n case 'postcode':\n return (\n <FormField label={t('inputs.addressFields.postcode', 'Postcode')}>\n <PostalCodeInput\n value={address.postcode}\n onValueChange={(next) => update({ postcode: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n case 'province':\n return (\n <FormField label={t('inputs.addressFields.province', 'Province')}>\n <ProvinceSelect\n value={address.province}\n onValueChange={(next) => update({ province: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n }\n };\n\n const cell = (key: string, node: ReactNode): ReactNode =>\n layout === 'grid' ? (\n <div\n key={key}\n className={WIDE_CELLS.has(key) ? 'ds:col-span-2' : undefined}\n >\n {node}\n </div>\n ) : (\n <div key={key}>{node}</div>\n );\n\n const children: ReactNode[] = [];\n if (showFindBar) {\n children.push(\n cell(\n 'findbar',\n <FormField label={t('inputs.addressFields.find', 'Find address')}>\n <AddressAutocomplete\n apiKey={apiKey}\n getSuggestions={getSuggestions}\n regionCodes={country ? [country] : undefined}\n disabled={disabled}\n onSelect={handleFind}\n />\n </FormField>,\n ),\n );\n }\n children.push(cell('country', fieldNode('country')));\n for (const key of order) children.push(cell(key, fieldNode(key)));\n\n return (\n <div\n ref={ref}\n data-component=\"address-fields\"\n data-component-id={id}\n className={[layoutVariants({ layout }), className]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n },\n);\n\nAddressFields.displayName = 'AddressFields';\n"],"names":["ADDRESS_PROPERTIES","addressFieldsAgent","handle","args","EMPTY_ADDRESS","FIELD_ORDER","DEFAULT_ORDER","WIDE_CELLS","layoutVariants","cva","AddressFields","forwardRef","value","onChange","fields","loadCities","popularCountries","apiKey","getSuggestions","layout","disabled","id","className","ref","t","useTranslation","address","country","valueRef","useRef","useEffect","update","useCallback","patch","handleFind","found","agentHandle","useMemo","next","field","fieldValue","useAgentRegistration","order","showFindBar","fieldNode","key","FormField","jsx","CountrySelect","TextInput","event","CityInput","PostalCodeInput","ProvinceSelect","cell","node","children","AddressAutocomplete"],"mappings":"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"}
1
+ {"version":3,"file":"address-fields-CZ0pEdEI.js","sources":["../../src/components/address-fields/address-fields.agent.ts","../../src/components/address-fields/address-fields.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { StructuredAddress } from '../address-autocomplete';\n\nexport interface AddressFieldsHandle {\n getValue: () => StructuredAddress;\n setValue: (value: StructuredAddress) => void;\n setField: (field: keyof StructuredAddress, value: string) => void;\n}\n\nconst ADDRESS_PROPERTIES = {\n street: { type: 'string' },\n city: { type: 'string' },\n postcode: { type: 'string' },\n province: { type: 'string', description: 'UPPERCASED province code.' },\n country: { type: 'string', description: 'ISO alpha-2, lowercased.' },\n formatted: { type: 'string' },\n} as const;\n\nexport const addressFieldsAgent: AgentAdapter<AddressFieldsHandle> = {\n id: 'address-fields',\n // `set_value` only — a structured address form sets discrete fields; it does\n // no granular in-place rich-text editing, so `edit_inline` does not apply.\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'object',\n descriptionKey: 'ui.agent.addressFields.state.value',\n description:\n 'The current structured address: { street, city, postcode, province, country, formatted }.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: StructuredAddress }',\n argsSchema: {\n type: 'object',\n properties: {\n value: { type: 'object', properties: ADDRESS_PROPERTIES },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setValue',\n description: 'Replace the entire address.',\n invoke: (handle, args: { value: StructuredAddress }) => {\n handle.setValue(args.value);\n },\n },\n set_field: {\n // Contact-data write (street/city/postcode/etc.), not clinical PHI —\n // consistent with PhoneInput / EmailInput / FiscalCodeInput, which all\n // treat identifying contact data as `write`.\n safety: 'write',\n argsType:\n \"{ field: 'street' | 'city' | 'postcode' | 'province' | 'country'; value: string }\",\n argsSchema: {\n type: 'object',\n properties: {\n field: {\n type: 'string',\n enum: ['street', 'city', 'postcode', 'province', 'country'],\n },\n value: { type: 'string' },\n },\n required: ['field', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.addressFields.actions.setField',\n description:\n 'Set a single address field. Setting `country` also clears the now-stale province.',\n examples: [\n {\n args: { field: 'country', value: 'it' },\n note: 'Set the country to Italy.',\n },\n ],\n invoke: (\n handle,\n args: { field: keyof StructuredAddress; value: string },\n ) => {\n handle.setField(args.field, args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'address-fields' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CountrySelect } from '../country-select/country-select';\nimport { ProvinceSelect } from '../province-select/province-select';\nimport { PostalCodeInput } from '../postal-code-input/postal-code-input';\nimport { CityInput, type CityLoaderContext } from '../city-input/city-input';\nimport { TextInput } from '../text-input';\nimport { FormField } from '../form-field/form-field';\nimport {\n AddressAutocomplete,\n type GetSuggestions,\n type StructuredAddress,\n} from '../address-autocomplete';\nimport type { OptionShape } from '../_shared/option';\nimport { useAgentRegistration } from '../../agent';\nimport {\n addressFieldsAgent,\n type AddressFieldsHandle,\n} from './address-fields.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* */\n/* A shippable composite that wires the address fields together and */\n/* emits a single StructuredAddress. Country drives the rest: it re-keys */\n/* the province dataset, swaps the postcode rule, and re-orders the */\n/* fields. An optional \"find address\" bar fans an AddressAutocomplete */\n/* selection out into the individual fields. */\n/* ------------------------------------------------------------------ */\n\nexport type AddressFieldKey = 'street' | 'city' | 'postcode' | 'province';\n\nconst EMPTY_ADDRESS: StructuredAddress = {\n street: '',\n city: '',\n postcode: '',\n province: '',\n country: '',\n formatted: '',\n};\n\n// Minimal country-keyed field-order map — NOT a libaddressinput port.\n// Extend with another entry when a country needs a different order.\nconst FIELD_ORDER: Record<string, AddressFieldKey[]> = {\n it: ['street', 'postcode', 'city', 'province'],\n};\nconst DEFAULT_ORDER: AddressFieldKey[] = [\n 'street',\n 'city',\n 'postcode',\n 'province',\n];\n\n// Fields that span the full width in the grid layout.\nconst WIDE_CELLS = new Set<string>(['findbar', 'country', 'street']);\n\nconst layoutVariants = cva('', {\n variants: {\n layout: {\n stacked: 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n grid: 'ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { layout: 'stacked' },\n});\n\nexport interface AddressFieldsProps {\n /** The controlled address value. */\n value?: StructuredAddress;\n /** Fires with the next full address on any field change. */\n onChange?: (next: StructuredAddress) => void;\n /**\n * Which address-line fields to render, in order. The country picker\n * always renders first. Default resolves from the selected country.\n */\n fields?: AddressFieldKey[];\n /** Async city suggestion loader, forwarded to CityInput. */\n loadCities?: (\n query: string,\n ctx: CityLoaderContext,\n ) => Promise<OptionShape[]>;\n /** Float these countries to the top of the country picker. */\n popularCountries?: string[];\n /** Enable the \"find address\" bar — provide a Places API key… */\n apiKey?: string;\n /** …or a mock/real suggestion injector (wins over apiKey, like AddressAutocomplete). */\n getSuggestions?: GetSuggestions;\n layout?: 'stacked' | 'grid';\n disabled?: boolean;\n id?: string;\n className?: string;\n}\n\nexport const AddressFields = forwardRef<HTMLDivElement, AddressFieldsProps>(\n function AddressFields(\n {\n value,\n onChange,\n fields,\n loadCities,\n popularCountries,\n apiKey,\n getSuggestions,\n layout = 'stacked',\n disabled,\n id,\n className,\n },\n ref,\n ) {\n const { t } = useTranslation();\n const address = value ?? EMPTY_ADDRESS;\n const country = address.country;\n\n const valueRef = useRef(address);\n useEffect(() => {\n valueRef.current = address;\n }, [address]);\n\n const update = useCallback(\n (patch: Partial<StructuredAddress>) => {\n onChange?.({ ...valueRef.current, ...patch });\n },\n [onChange],\n );\n\n // Find-bar selection fans the looked-up address out into every field.\n const handleFind = useCallback(\n (found: StructuredAddress) =>\n onChange?.({ ...valueRef.current, ...found }),\n [onChange],\n );\n\n const agentHandle = useMemo<AddressFieldsHandle>(\n () => ({\n getValue: () => valueRef.current,\n setValue: (next) => onChange?.(next),\n setField: (field, fieldValue) => {\n const patch: Partial<StructuredAddress> = { [field]: fieldValue };\n // Mirror the UI path: changing country re-keys the stale province.\n if (field === 'country') patch.province = '';\n onChange?.({ ...valueRef.current, ...patch });\n },\n }),\n [onChange],\n );\n useAgentRegistration(addressFieldsAgent, agentHandle, id);\n\n const order =\n fields ?? FIELD_ORDER[country?.toLowerCase() ?? ''] ?? DEFAULT_ORDER;\n\n const showFindBar = Boolean(apiKey || getSuggestions);\n\n // The composite's own adapter (`address-fields`) is the agent-addressable\n // surface; the child inputs below are deliberately rendered without an\n // `id`, so they register un-scoped rather than competing for handles.\n const fieldNode = (key: AddressFieldKey | 'country'): ReactNode => {\n switch (key) {\n case 'country':\n return (\n <FormField label={t('inputs.addressFields.country', 'Country')}>\n <CountrySelect\n value={country}\n // Country drives the rest — re-key province on change.\n onValueChange={(next) =>\n update({ country: next, province: '' })\n }\n popularCountries={popularCountries}\n disabled={disabled}\n />\n </FormField>\n );\n case 'street':\n return (\n <FormField label={t('inputs.addressFields.street', 'Street')}>\n <TextInput\n value={address.street}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n update({ street: event.target.value })\n }\n autoComplete=\"address-line1\"\n disabled={disabled}\n />\n </FormField>\n );\n case 'city':\n return (\n <FormField label={t('inputs.addressFields.city', 'City')}>\n <CityInput\n value={address.city}\n onValueChange={(next) => update({ city: next })}\n loadCities={loadCities}\n country={country}\n province={address.province}\n disabled={disabled}\n />\n </FormField>\n );\n case 'postcode':\n return (\n <FormField label={t('inputs.addressFields.postcode', 'Postcode')}>\n <PostalCodeInput\n value={address.postcode}\n onValueChange={(next) => update({ postcode: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n case 'province':\n return (\n <FormField label={t('inputs.addressFields.province', 'Province')}>\n <ProvinceSelect\n value={address.province}\n onValueChange={(next) => update({ province: next })}\n country={country}\n disabled={disabled}\n />\n </FormField>\n );\n }\n };\n\n const cell = (key: string, node: ReactNode): ReactNode =>\n layout === 'grid' ? (\n <div\n key={key}\n className={WIDE_CELLS.has(key) ? 'ds:col-span-2' : undefined}\n >\n {node}\n </div>\n ) : (\n <div key={key}>{node}</div>\n );\n\n const children: ReactNode[] = [];\n if (showFindBar) {\n children.push(\n cell(\n 'findbar',\n <FormField label={t('inputs.addressFields.find', 'Find address')}>\n <AddressAutocomplete\n apiKey={apiKey}\n getSuggestions={getSuggestions}\n regionCodes={country ? [country] : undefined}\n disabled={disabled}\n onSelect={handleFind}\n />\n </FormField>,\n ),\n );\n }\n children.push(cell('country', fieldNode('country')));\n for (const key of order) children.push(cell(key, fieldNode(key)));\n\n return (\n <div\n ref={ref}\n data-component=\"address-fields\"\n data-component-id={id}\n className={[layoutVariants({ layout }), className]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n },\n);\n\nAddressFields.displayName = 'AddressFields';\n"],"names":["ADDRESS_PROPERTIES","addressFieldsAgent","handle","args","EMPTY_ADDRESS","FIELD_ORDER","DEFAULT_ORDER","WIDE_CELLS","layoutVariants","cva","AddressFields","forwardRef","value","onChange","fields","loadCities","popularCountries","apiKey","getSuggestions","layout","disabled","id","className","ref","t","useTranslation","address","country","valueRef","useRef","useEffect","update","useCallback","patch","handleFind","found","agentHandle","useMemo","next","field","fieldValue","useAgentRegistration","order","showFindBar","fieldNode","key","FormField","jsx","CountrySelect","TextInput","event","CityInput","PostalCodeInput","ProvinceSelect","cell","node","children","AddressAutocomplete"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { u as Re } from "./registry-DvAUVLHh.js";
8
8
  import { _ as g } from "./index-4xgbg-sn.js";
9
9
  import { u as De } from "./index-BcMWc8W2.js";
10
10
  import { I as te } from "./icon-button-DA2CAGHZ.js";
11
- import { S as We } from "./select-BW5ecXlX.js";
11
+ import { S as We } from "./select-Bi8zril7.js";
12
12
  import { S as _e } from "./send-C5kDJ-Mz.js";
13
13
  import { X as Ae } from "./x-B5YnXwCz.js";
14
14
  const Le = {
@@ -497,4 +497,4 @@ export {
497
497
  Ze as A,
498
498
  Le as a
499
499
  };
500
- //# sourceMappingURL=ai-prompt-input-DnbfEJnr.js.map
500
+ //# sourceMappingURL=ai-prompt-input-CrHr-5H8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-prompt-input-DnbfEJnr.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\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\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
1
+ {"version":3,"file":"ai-prompt-input-CrHr-5H8.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\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\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
@@ -7,12 +7,12 @@ import { C as re } from "./card-DPmk26CL.js";
7
7
  import { C as Jt, b as Zt, a as ea } from "./collapsible-CTjxzGuF.js";
8
8
  import { E as Ze } from "./empty-state-X0sVPfVo.js";
9
9
  import { F as $ } from "./form-field-CahJzTxp.js";
10
- import { M as li } from "./multi-select-DqL4o0qV.js";
10
+ import { M as li } from "./multi-select-DYOvx2SJ.js";
11
11
  import { N as gn } from "./number-input-Cgu2TtA8.js";
12
12
  import { R as we } from "./radio-TWf9Q-mp.js";
13
13
  import { R as pn } from "./radio-group-rXDJADzW.js";
14
- import { S as $e } from "./select-BW5ecXlX.js";
15
- import { T as Q } from "./tabs-CBb2AidH.js";
14
+ import { S as $e } from "./select-Bi8zril7.js";
15
+ import { T as Q } from "./tabs-DqKtTIjZ.js";
16
16
  import { T as sn } from "./text-area-Bt3p7Pt0.js";
17
17
  import { T as ne } from "./text-input-CUvCb6ST.js";
18
18
  import { T as Ye } from "./timestamp-BV2lC-wV.js";
@@ -9413,4 +9413,4 @@ export {
9413
9413
  Ba as t,
9414
9414
  Bl as u
9415
9415
  };
9416
- //# sourceMappingURL=anamnesis-summary-rows-BfhxWPO3.js.map
9416
+ //# sourceMappingURL=anamnesis-summary-rows-CRWO8x8g.js.map