@happyvertical/smrt-ui 0.51.39 → 0.53.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 (392) hide show
  1. package/AGENTS.md +25 -3
  2. package/README.md +558 -8
  3. package/dist/actions/__tests__/swipe-dismiss.test.js +69 -0
  4. package/dist/actions/swipe-dismiss.d.ts +42 -0
  5. package/dist/actions/swipe-dismiss.d.ts.map +1 -0
  6. package/dist/actions/swipe-dismiss.js +69 -0
  7. package/dist/components/calendar/Calendar.svelte +5 -0
  8. package/dist/components/calendar/Calendar.svelte.d.ts.map +1 -1
  9. package/dist/components/calendar/CalendarView.svelte +1250 -0
  10. package/dist/components/calendar/CalendarView.svelte.d.ts +66 -0
  11. package/dist/components/calendar/CalendarView.svelte.d.ts.map +1 -0
  12. package/dist/components/calendar/DayView.svelte +5 -0
  13. package/dist/components/calendar/DayView.svelte.d.ts.map +1 -1
  14. package/dist/components/calendar/__tests__/CalendarView.test.js +226 -0
  15. package/dist/components/calendar/__tests__/calendar-model.test.js +138 -0
  16. package/dist/components/calendar/calendar-model.d.ts +178 -0
  17. package/dist/components/calendar/calendar-model.d.ts.map +1 -0
  18. package/dist/components/calendar/calendar-model.js +362 -0
  19. package/dist/components/calendar/index.d.ts +12 -1
  20. package/dist/components/calendar/index.d.ts.map +1 -1
  21. package/dist/components/calendar/index.js +11 -1
  22. package/dist/components/data/CollectionList.svelte +23 -5
  23. package/dist/components/data/CollectionList.svelte.d.ts +8 -2
  24. package/dist/components/data/CollectionList.svelte.d.ts.map +1 -1
  25. package/dist/components/data/DataTable.svelte +178 -55
  26. package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
  27. package/dist/components/data/DataTableController.d.ts +4 -0
  28. package/dist/components/data/DataTableController.d.ts.map +1 -1
  29. package/dist/components/data/DataTableController.js +11 -4
  30. package/dist/components/data/DataTableResponsive.d.ts +4 -0
  31. package/dist/components/data/DataTableResponsive.d.ts.map +1 -0
  32. package/dist/components/data/DataTableResponsive.js +22 -0
  33. package/dist/components/data/ListSortSelect.svelte +121 -0
  34. package/dist/components/data/ListSortSelect.svelte.d.ts +22 -0
  35. package/dist/components/data/ListSortSelect.svelte.d.ts.map +1 -0
  36. package/dist/components/data/SortableHeader.svelte +169 -0
  37. package/dist/components/data/SortableHeader.svelte.d.ts +30 -0
  38. package/dist/components/data/SortableHeader.svelte.d.ts.map +1 -0
  39. package/dist/components/data/__tests__/CollectionList.test.js +37 -0
  40. package/dist/components/data/__tests__/DataTable.test.js +76 -0
  41. package/dist/components/data/__tests__/DataTableController.test.js +35 -0
  42. package/dist/components/data/__tests__/DataTableResponsive.test.js +80 -0
  43. package/dist/components/data/__tests__/SortableHeader.test.js +101 -0
  44. package/dist/components/data/__tests__/link-step-surface.test.js +172 -0
  45. package/dist/components/data/__tests__/list-sort-state.svelte.test.js +71 -0
  46. package/dist/components/data/__tests__/list-sort.test.js +91 -0
  47. package/dist/components/data/__tests__/responsive-table.fixture.svelte +29 -0
  48. package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts +7 -0
  49. package/dist/components/data/__tests__/responsive-table.fixture.svelte.d.ts.map +1 -0
  50. package/dist/components/data/__tests__/surface-navigation.test.js +121 -0
  51. package/dist/components/data/data-surface.d.ts +1 -0
  52. package/dist/components/data/data-surface.d.ts.map +1 -1
  53. package/dist/components/data/data-surface.js +1 -0
  54. package/dist/components/data/index.d.ts +6 -0
  55. package/dist/components/data/index.d.ts.map +1 -1
  56. package/dist/components/data/index.js +6 -0
  57. package/dist/components/data/link-surface.d.ts +79 -0
  58. package/dist/components/data/link-surface.d.ts.map +1 -0
  59. package/dist/components/data/link-surface.js +155 -0
  60. package/dist/components/data/list-sort-state.svelte.d.ts +39 -0
  61. package/dist/components/data/list-sort-state.svelte.d.ts.map +1 -0
  62. package/dist/components/data/list-sort-state.svelte.js +47 -0
  63. package/dist/components/data/list-sort.d.ts +94 -0
  64. package/dist/components/data/list-sort.d.ts.map +1 -0
  65. package/dist/components/data/list-sort.js +182 -0
  66. package/dist/components/data/step-surface.d.ts +73 -0
  67. package/dist/components/data/step-surface.d.ts.map +1 -0
  68. package/dist/components/data/step-surface.js +177 -0
  69. package/dist/components/data/surface-navigation.d.ts +49 -0
  70. package/dist/components/data/surface-navigation.d.ts.map +1 -0
  71. package/dist/components/data/surface-navigation.js +100 -0
  72. package/dist/components/data/types.d.ts +27 -0
  73. package/dist/components/data/types.d.ts.map +1 -1
  74. package/dist/components/display/DateDisplay.svelte +76 -14
  75. package/dist/components/display/DateDisplay.svelte.d.ts +2 -0
  76. package/dist/components/display/DateDisplay.svelte.d.ts.map +1 -1
  77. package/dist/components/display/Icon.svelte +3 -16
  78. package/dist/components/display/Icon.svelte.d.ts +0 -9
  79. package/dist/components/display/Icon.svelte.d.ts.map +1 -1
  80. package/dist/components/display/StatusBadge.svelte +29 -2
  81. package/dist/components/display/StatusBadge.svelte.d.ts +4 -2
  82. package/dist/components/display/StatusBadge.svelte.d.ts.map +1 -1
  83. package/dist/components/display/__tests__/DateDisplay.test.js +82 -1
  84. package/dist/components/display/__tests__/Icon.test.js +132 -2
  85. package/dist/components/display/__tests__/StatusBadge.test.js +78 -0
  86. package/dist/components/display/icons.svelte.d.ts +11 -0
  87. package/dist/components/display/icons.svelte.d.ts.map +1 -0
  88. package/dist/components/display/icons.svelte.js +60 -0
  89. package/dist/components/display/index.d.ts +3 -1
  90. package/dist/components/display/index.d.ts.map +1 -1
  91. package/dist/components/display/index.js +1 -0
  92. package/dist/components/display/types.d.ts +2 -0
  93. package/dist/components/display/types.d.ts.map +1 -1
  94. package/dist/components/feedback/ConfirmDialog.svelte +59 -48
  95. package/dist/components/feedback/ConfirmDialog.svelte.d.ts +14 -2
  96. package/dist/components/feedback/ConfirmDialog.svelte.d.ts.map +1 -1
  97. package/dist/components/feedback/PhoneSheet.svelte +224 -0
  98. package/dist/components/feedback/PhoneSheet.svelte.d.ts +35 -0
  99. package/dist/components/feedback/PhoneSheet.svelte.d.ts.map +1 -0
  100. package/dist/components/feedback/ToastViewport.svelte +156 -8
  101. package/dist/components/feedback/ToastViewport.svelte.d.ts +5 -1
  102. package/dist/components/feedback/ToastViewport.svelte.d.ts.map +1 -1
  103. package/dist/components/feedback/WorkingStrip.svelte +426 -0
  104. package/dist/components/feedback/WorkingStrip.svelte.d.ts +37 -0
  105. package/dist/components/feedback/WorkingStrip.svelte.d.ts.map +1 -0
  106. package/dist/components/feedback/__tests__/ConfirmDialog.test.js +38 -20
  107. package/dist/components/feedback/__tests__/PhoneSheet.test.js +101 -0
  108. package/dist/components/feedback/__tests__/WorkingStrip.test.js +172 -0
  109. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte +9 -0
  110. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts +19 -0
  111. package/dist/components/feedback/__tests__/confirm-message.fixture.svelte.d.ts.map +1 -0
  112. package/dist/components/feedback/__tests__/toast.test.js +142 -1
  113. package/dist/components/feedback/index.d.ts +5 -1
  114. package/dist/components/feedback/index.d.ts.map +1 -1
  115. package/dist/components/feedback/index.js +5 -0
  116. package/dist/components/feedback/toast.d.ts +13 -1
  117. package/dist/components/feedback/toast.d.ts.map +1 -1
  118. package/dist/components/feedback/toast.js +51 -10
  119. package/dist/components/feedback/working-status.d.ts +34 -0
  120. package/dist/components/feedback/working-status.d.ts.map +1 -0
  121. package/dist/components/feedback/working-status.js +5 -0
  122. package/dist/components/forms/CameraCapture.svelte +619 -0
  123. package/dist/components/forms/CameraCapture.svelte.d.ts +42 -0
  124. package/dist/components/forms/CameraCapture.svelte.d.ts.map +1 -0
  125. package/dist/components/forms/Checkbox.svelte +34 -3
  126. package/dist/components/forms/Checkbox.svelte.d.ts +2 -0
  127. package/dist/components/forms/Checkbox.svelte.d.ts.map +1 -1
  128. package/dist/components/forms/Combobox.svelte +108 -12
  129. package/dist/components/forms/Combobox.svelte.d.ts +6 -0
  130. package/dist/components/forms/Combobox.svelte.d.ts.map +1 -1
  131. package/dist/components/forms/DictationButton.svelte +128 -0
  132. package/dist/components/forms/DictationButton.svelte.d.ts +19 -0
  133. package/dist/components/forms/DictationButton.svelte.d.ts.map +1 -0
  134. package/dist/components/forms/DictationStatus.svelte +164 -0
  135. package/dist/components/forms/DictationStatus.svelte.d.ts +11 -0
  136. package/dist/components/forms/DictationStatus.svelte.d.ts.map +1 -0
  137. package/dist/components/forms/Fieldset.svelte +5 -1
  138. package/dist/components/forms/Fieldset.svelte.d.ts +2 -0
  139. package/dist/components/forms/Fieldset.svelte.d.ts.map +1 -1
  140. package/dist/components/forms/Form.svelte +5 -0
  141. package/dist/components/forms/Form.svelte.d.ts +1 -0
  142. package/dist/components/forms/Form.svelte.d.ts.map +1 -1
  143. package/dist/components/forms/FormActionBar.svelte +84 -0
  144. package/dist/components/forms/FormActionBar.svelte.d.ts +23 -0
  145. package/dist/components/forms/FormActionBar.svelte.d.ts.map +1 -0
  146. package/dist/components/forms/Input.svelte +17 -1
  147. package/dist/components/forms/Input.svelte.d.ts +2 -0
  148. package/dist/components/forms/Input.svelte.d.ts.map +1 -1
  149. package/dist/components/forms/Listbox.svelte +39 -1
  150. package/dist/components/forms/Listbox.svelte.d.ts.map +1 -1
  151. package/dist/components/forms/MultiSelect.svelte +41 -1
  152. package/dist/components/forms/MultiSelect.svelte.d.ts.map +1 -1
  153. package/dist/components/forms/Radio.svelte +16 -4
  154. package/dist/components/forms/RadioGroup.svelte +7 -1
  155. package/dist/components/forms/RadioGroup.svelte.d.ts +2 -0
  156. package/dist/components/forms/RadioGroup.svelte.d.ts.map +1 -1
  157. package/dist/components/forms/SearchInput.svelte +207 -0
  158. package/dist/components/forms/SearchInput.svelte.d.ts +22 -0
  159. package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
  160. package/dist/components/forms/SegmentedControl.svelte +152 -11
  161. package/dist/components/forms/SegmentedControl.svelte.d.ts +4 -0
  162. package/dist/components/forms/SegmentedControl.svelte.d.ts.map +1 -1
  163. package/dist/components/forms/Select.svelte +17 -1
  164. package/dist/components/forms/Select.svelte.d.ts +2 -0
  165. package/dist/components/forms/Select.svelte.d.ts.map +1 -1
  166. package/dist/components/forms/SignaturePad.svelte +436 -0
  167. package/dist/components/forms/SignaturePad.svelte.d.ts +32 -0
  168. package/dist/components/forms/SignaturePad.svelte.d.ts.map +1 -0
  169. package/dist/components/forms/StagedControlReview.svelte +21 -12
  170. package/dist/components/forms/StagedControlReview.svelte.d.ts.map +1 -1
  171. package/dist/components/forms/Switch.svelte +18 -5
  172. package/dist/components/forms/Switch.svelte.d.ts +2 -0
  173. package/dist/components/forms/Switch.svelte.d.ts.map +1 -1
  174. package/dist/components/forms/TagsInput.svelte +8 -1
  175. package/dist/components/forms/Textarea.svelte +16 -1
  176. package/dist/components/forms/Textarea.svelte.d.ts +2 -0
  177. package/dist/components/forms/Textarea.svelte.d.ts.map +1 -1
  178. package/dist/components/forms/__tests__/CameraCapture.test.js +504 -0
  179. package/dist/components/forms/__tests__/Combobox.test.js +354 -0
  180. package/dist/components/forms/__tests__/ControlHitArea.test.js +73 -0
  181. package/dist/components/forms/__tests__/DictationButton.test.js +176 -0
  182. package/dist/components/forms/__tests__/Fieldset.test.js +37 -0
  183. package/dist/components/forms/__tests__/Form.test.js +46 -0
  184. package/dist/components/forms/__tests__/FormActionBar.test.js +22 -0
  185. package/dist/components/forms/__tests__/Listbox.test.js +303 -0
  186. package/dist/components/forms/__tests__/MultiSelect.test.js +281 -0
  187. package/dist/components/forms/__tests__/SearchInput.test.js +92 -0
  188. package/dist/components/forms/__tests__/SignaturePad.test.js +338 -0
  189. package/dist/components/forms/__tests__/StagedControlReview.test.js +37 -3
  190. package/dist/components/forms/__tests__/camera-capture-session.test.js +207 -0
  191. package/dist/components/forms/__tests__/capture-form-retry.test.js +166 -0
  192. package/dist/components/forms/__tests__/capture-form.fixture.svelte +38 -0
  193. package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts +10 -0
  194. package/dist/components/forms/__tests__/capture-form.fixture.svelte.d.ts.map +1 -0
  195. package/dist/components/forms/__tests__/capture-test-env.d.ts +70 -0
  196. package/dist/components/forms/__tests__/capture-test-env.d.ts.map +1 -0
  197. package/dist/components/forms/__tests__/capture-test-env.js +122 -0
  198. package/dist/components/forms/__tests__/capture-touch.fixture.svelte +15 -0
  199. package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts +8 -0
  200. package/dist/components/forms/__tests__/capture-touch.fixture.svelte.d.ts.map +1 -0
  201. package/dist/components/forms/__tests__/combobox-form.fixture.svelte +29 -0
  202. package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts +14 -0
  203. package/dist/components/forms/__tests__/combobox-form.fixture.svelte.d.ts.map +1 -0
  204. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte +19 -0
  205. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts +11 -0
  206. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts.map +1 -0
  207. package/dist/components/forms/__tests__/composite-registration.fixture.svelte +29 -0
  208. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts +8 -0
  209. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts.map +1 -0
  210. package/dist/components/forms/__tests__/control-interaction.test.js +19 -1
  211. package/dist/components/forms/__tests__/control-proposals.test.js +63 -0
  212. package/dist/components/forms/__tests__/dictation-recording.test.js +582 -0
  213. package/dist/components/forms/__tests__/dictation.test.js +486 -0
  214. package/dist/components/forms/__tests__/form-attachment.fixture.svelte +28 -0
  215. package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts +11 -0
  216. package/dist/components/forms/__tests__/form-attachment.fixture.svelte.d.ts.map +1 -0
  217. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte +31 -0
  218. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts +13 -0
  219. package/dist/components/forms/__tests__/form-retry-form.fixture.svelte.d.ts.map +1 -0
  220. package/dist/components/forms/__tests__/form-retry-form.test.js +107 -0
  221. package/dist/components/forms/__tests__/hidden-controls-form-retry.test.js +69 -0
  222. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte +29 -0
  223. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts +9 -0
  224. package/dist/components/forms/__tests__/hidden-controls-form.fixture.svelte.d.ts.map +1 -0
  225. package/dist/components/forms/__tests__/listbox-form.fixture.svelte +27 -0
  226. package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts +13 -0
  227. package/dist/components/forms/__tests__/listbox-form.fixture.svelte.d.ts.map +1 -0
  228. package/dist/components/forms/__tests__/long-press.test.js +175 -0
  229. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte +27 -0
  230. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts +13 -0
  231. package/dist/components/forms/__tests__/multiselect-form.fixture.svelte.d.ts.map +1 -0
  232. package/dist/components/forms/__tests__/native-file-field.test.js +177 -0
  233. package/dist/components/forms/__tests__/place-picker.fixture.svelte +33 -0
  234. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts +12 -0
  235. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts.map +1 -0
  236. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte +28 -0
  237. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts +12 -0
  238. package/dist/components/forms/__tests__/segmented-posting.fixture.svelte.d.ts.map +1 -0
  239. package/dist/components/forms/__tests__/segmented-posting.test.js +92 -0
  240. package/dist/components/forms/__tests__/signature-pad-logic.test.js +54 -0
  241. package/dist/components/forms/__tests__/touch-density.fixture.svelte +34 -0
  242. package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts +8 -0
  243. package/dist/components/forms/__tests__/touch-density.fixture.svelte.d.ts.map +1 -0
  244. package/dist/components/forms/__tests__/touch-density.test.js +66 -0
  245. package/dist/components/forms/audio-capture.d.ts +69 -0
  246. package/dist/components/forms/audio-capture.d.ts.map +1 -0
  247. package/dist/components/forms/audio-capture.js +193 -0
  248. package/dist/components/forms/camera-capture-session.d.ts +81 -0
  249. package/dist/components/forms/camera-capture-session.d.ts.map +1 -0
  250. package/dist/components/forms/camera-capture-session.js +130 -0
  251. package/dist/components/forms/control-interaction.d.ts +6 -0
  252. package/dist/components/forms/control-interaction.d.ts.map +1 -1
  253. package/dist/components/forms/control-interaction.js +12 -1
  254. package/dist/components/forms/control-proposals.d.ts +55 -0
  255. package/dist/components/forms/control-proposals.d.ts.map +1 -0
  256. package/dist/components/forms/control-proposals.js +188 -0
  257. package/dist/components/forms/dictation-transcribe.d.ts +36 -0
  258. package/dist/components/forms/dictation-transcribe.d.ts.map +1 -0
  259. package/dist/components/forms/dictation-transcribe.js +65 -0
  260. package/dist/components/forms/dictation.svelte.d.ts +200 -0
  261. package/dist/components/forms/dictation.svelte.d.ts.map +1 -0
  262. package/dist/components/forms/dictation.svelte.js +686 -0
  263. package/dist/components/forms/form-retry/__tests__/boundaries.test.js +23 -0
  264. package/dist/components/forms/form-retry/__tests__/content-digest.test.js +70 -0
  265. package/dist/components/forms/form-retry/__tests__/controller.test.js +802 -0
  266. package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts +82 -0
  267. package/dist/components/forms/form-retry/__tests__/fake-kit.d.ts.map +1 -0
  268. package/dist/components/forms/form-retry/__tests__/fake-kit.js +180 -0
  269. package/dist/components/forms/form-retry/__tests__/form-draft.test.js +169 -0
  270. package/dist/components/forms/form-retry/__tests__/ssr.test.js +37 -0
  271. package/dist/components/forms/form-retry/__tests__/storage.d.ts +26 -0
  272. package/dist/components/forms/form-retry/__tests__/storage.d.ts.map +1 -0
  273. package/dist/components/forms/form-retry/__tests__/storage.js +63 -0
  274. package/dist/components/forms/form-retry/__tests__/submission-key.test.js +236 -0
  275. package/dist/components/forms/form-retry/__tests__/submitted-draft.test.js +334 -0
  276. package/dist/components/forms/form-retry/content-digest.d.ts +54 -0
  277. package/dist/components/forms/form-retry/content-digest.d.ts.map +1 -0
  278. package/dist/components/forms/form-retry/content-digest.js +169 -0
  279. package/dist/components/forms/form-retry/controller.d.ts +214 -0
  280. package/dist/components/forms/form-retry/controller.d.ts.map +1 -0
  281. package/dist/components/forms/form-retry/controller.js +404 -0
  282. package/dist/components/forms/form-retry/form-draft.d.ts +68 -0
  283. package/dist/components/forms/form-retry/form-draft.d.ts.map +1 -0
  284. package/dist/components/forms/form-retry/form-draft.js +161 -0
  285. package/dist/components/forms/form-retry/index.d.ts +19 -0
  286. package/dist/components/forms/form-retry/index.d.ts.map +1 -0
  287. package/dist/components/forms/form-retry/index.js +16 -0
  288. package/dist/components/forms/form-retry/submission-key.d.ts +244 -0
  289. package/dist/components/forms/form-retry/submission-key.d.ts.map +1 -0
  290. package/dist/components/forms/form-retry/submission-key.js +342 -0
  291. package/dist/components/forms/form-retry/submitted-draft.d.ts +112 -0
  292. package/dist/components/forms/form-retry/submitted-draft.d.ts.map +1 -0
  293. package/dist/components/forms/form-retry/submitted-draft.js +270 -0
  294. package/dist/components/forms/form-retry/types.d.ts +84 -0
  295. package/dist/components/forms/form-retry/types.d.ts.map +1 -0
  296. package/dist/components/forms/form-retry/types.js +13 -0
  297. package/dist/components/forms/index.d.ts +21 -2
  298. package/dist/components/forms/index.d.ts.map +1 -1
  299. package/dist/components/forms/index.js +22 -1
  300. package/dist/components/forms/insert-text.d.ts +12 -0
  301. package/dist/components/forms/insert-text.d.ts.map +1 -0
  302. package/dist/components/forms/insert-text.js +38 -0
  303. package/dist/components/forms/long-press.d.ts +88 -0
  304. package/dist/components/forms/long-press.d.ts.map +1 -0
  305. package/dist/components/forms/long-press.js +213 -0
  306. package/dist/components/forms/native-file-field.d.ts +94 -0
  307. package/dist/components/forms/native-file-field.d.ts.map +1 -0
  308. package/dist/components/forms/native-file-field.js +147 -0
  309. package/dist/components/forms/ready-beep.d.ts +24 -0
  310. package/dist/components/forms/ready-beep.d.ts.map +1 -0
  311. package/dist/components/forms/ready-beep.js +82 -0
  312. package/dist/components/forms/signature-pad-logic.d.ts +50 -0
  313. package/dist/components/forms/signature-pad-logic.d.ts.map +1 -0
  314. package/dist/components/forms/signature-pad-logic.js +48 -0
  315. package/dist/components/forms/types.d.ts +41 -0
  316. package/dist/components/forms/types.d.ts.map +1 -1
  317. package/dist/components/layout/PageHeader.svelte +151 -17
  318. package/dist/components/layout/PageHeader.svelte.d.ts +47 -7
  319. package/dist/components/layout/PageHeader.svelte.d.ts.map +1 -1
  320. package/dist/components/layout/__tests__/PageHeader.test.js +87 -1
  321. package/dist/components/layout/index.d.ts +1 -0
  322. package/dist/components/layout/index.d.ts.map +1 -1
  323. package/dist/components/layout/index.js +1 -0
  324. package/dist/components/layout/page-header-context.d.ts +25 -0
  325. package/dist/components/layout/page-header-context.d.ts.map +1 -0
  326. package/dist/components/layout/page-header-context.js +16 -0
  327. package/dist/components/nav/FilterChips.svelte +8 -1
  328. package/dist/components/nav/FilterChips.svelte.d.ts +2 -0
  329. package/dist/components/nav/FilterChips.svelte.d.ts.map +1 -1
  330. package/dist/components/nav/Tabs.svelte +241 -0
  331. package/dist/components/nav/Tabs.svelte.d.ts +15 -0
  332. package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
  333. package/dist/components/nav/__tests__/LinkTabs.test.js +117 -0
  334. package/dist/components/nav/index.d.ts +1 -0
  335. package/dist/components/nav/index.d.ts.map +1 -1
  336. package/dist/components/nav/index.js +1 -0
  337. package/dist/components/nav/tabs-overflow.d.ts +12 -0
  338. package/dist/components/nav/tabs-overflow.d.ts.map +1 -0
  339. package/dist/components/nav/tabs-overflow.js +17 -0
  340. package/dist/components/nav/types.d.ts +8 -0
  341. package/dist/components/nav/types.d.ts.map +1 -1
  342. package/dist/components/ui/Button.svelte +16 -2
  343. package/dist/components/ui/Button.svelte.d.ts +2 -0
  344. package/dist/components/ui/Button.svelte.d.ts.map +1 -1
  345. package/dist/components/ui/Card.svelte +14 -5
  346. package/dist/components/ui/Dropdown.svelte +55 -1
  347. package/dist/components/ui/Dropdown.svelte.d.ts +8 -0
  348. package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -1
  349. package/dist/components/ui/IconToggle.svelte +139 -0
  350. package/dist/components/ui/IconToggle.svelte.d.ts +32 -0
  351. package/dist/components/ui/IconToggle.svelte.d.ts.map +1 -0
  352. package/dist/components/ui/IconToggleGroup.svelte +56 -0
  353. package/dist/components/ui/IconToggleGroup.svelte.d.ts +21 -0
  354. package/dist/components/ui/IconToggleGroup.svelte.d.ts.map +1 -0
  355. package/dist/components/ui/Pagination.svelte +1 -1
  356. package/dist/components/ui/Popover.svelte +17 -1
  357. package/dist/components/ui/Popover.svelte.d.ts +8 -0
  358. package/dist/components/ui/Popover.svelte.d.ts.map +1 -1
  359. package/dist/components/ui/__tests__/IconToggle.test.js +59 -0
  360. package/dist/components/ui/__tests__/IconToggleGroup.test.js +30 -0
  361. package/dist/components/ui/__tests__/Popover.test.js +44 -0
  362. package/dist/components/ui/__tests__/dropdown-popover-icon.test.js +125 -0
  363. package/dist/components/ui/__tests__/phone-touch-targets.test.js +39 -0
  364. package/dist/components/ui/index.d.ts +2 -0
  365. package/dist/components/ui/index.d.ts.map +1 -1
  366. package/dist/components/ui/index.js +2 -0
  367. package/dist/i18n/strings.ui.d.ts +65 -0
  368. package/dist/i18n/strings.ui.d.ts.map +1 -1
  369. package/dist/i18n/strings.ui.js +72 -0
  370. package/dist/styles/tokens.css +2 -0
  371. package/dist/svelte/__tests__/playground.test.js +3 -1
  372. package/dist/svelte/playground/CalendarPreview.svelte +140 -0
  373. package/dist/svelte/playground/CalendarPreview.svelte.d.ts +4 -0
  374. package/dist/svelte/playground/CalendarPreview.svelte.d.ts.map +1 -0
  375. package/dist/svelte/playground/CapturePreview.svelte +56 -0
  376. package/dist/svelte/playground/CapturePreview.svelte.d.ts +4 -0
  377. package/dist/svelte/playground/CapturePreview.svelte.d.ts.map +1 -0
  378. package/dist/svelte/playground.d.ts.map +1 -1
  379. package/dist/svelte/playground.js +20 -0
  380. package/dist/themes/ThemeProvider.svelte +9 -0
  381. package/dist/themes/ThemeProvider.svelte.d.ts +2 -0
  382. package/dist/themes/ThemeProvider.svelte.d.ts.map +1 -1
  383. package/dist/themes/css-generator.d.ts.map +1 -1
  384. package/dist/themes/css-generator.js +3 -0
  385. package/dist/themes/styles/glass.css +4 -0
  386. package/dist/themes/styles/happyvertical.css +4 -0
  387. package/dist/themes/styles/material.css +4 -0
  388. package/dist/themes/styles/smrt.css +4 -0
  389. package/dist/themes/styles/studio.css +4 -0
  390. package/dist/types-generic.d.ts +2 -0
  391. package/dist/types-generic.d.ts.map +1 -1
  392. package/package.json +9 -3
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Framework-free `getUserMedia()` lifecycle for `CameraCapture.svelte`.
3
+ *
4
+ * Owns exactly one acquired `MediaStream`: requesting it, classifying a
5
+ * rejection into one of the states the component renders, and releasing every
6
+ * track it acquired. It never touches a `<video>` or `<canvas>`, so permission
7
+ * denied, no camera, unsupported browser and stream cleanup are unit-testable
8
+ * against a fake `MediaDevices` with no DOM at all. The component stays thin
9
+ * DOM glue around it.
10
+ *
11
+ * Guards one race a naive "await getUserMedia, then store the stream" misses:
12
+ * the user can dismiss the permission prompt late, or the component can be
13
+ * disabled or unmounted, while `getUserMedia()` is still pending. Storing that
14
+ * late result would leave the camera light on with nothing left to stop it.
15
+ * `stop()` and every new `start()` bump a generation counter; `start()`
16
+ * compares the generation it was issued under once the promise settles and
17
+ * discards a stale result, stopping any tracks it just acquired.
18
+ *
19
+ * Ported from teamworks-os (`camera-capture-session.ts` and
20
+ * `camera-capture-logic.ts`), smrt#3290.
21
+ */
22
+ /**
23
+ * Whether this runtime exposes `getUserMedia` at all. An unsupported browser is
24
+ * never reported as "no camera": those states need different recovery copy.
25
+ */
26
+ export function isCameraApiSupported(nav) {
27
+ return typeof nav?.mediaDevices?.getUserMedia === 'function';
28
+ }
29
+ function readStringField(value, field) {
30
+ if (typeof value !== 'object' || value === null || !(field in value)) {
31
+ return undefined;
32
+ }
33
+ const read = value[field];
34
+ return typeof read === 'string' ? read : undefined;
35
+ }
36
+ /**
37
+ * Maps a `getUserMedia()` rejection to a rendered state by `DOMException.name`
38
+ * (the cross-browser contract), never by message text.
39
+ *
40
+ * Deliberately does not gate on `instanceof Error`: a browser `DOMException`
41
+ * does not inherit from `Error` in shipping engines, so that check would send
42
+ * every real rejection to the generic state. Node's `DOMException` happening to
43
+ * extend `Error` is what hides that bug in local tests.
44
+ */
45
+ export function classifyGetUserMediaError(error) {
46
+ switch (readStringField(error, 'name')) {
47
+ case 'NotAllowedError':
48
+ case 'PermissionDeniedError':
49
+ case 'SecurityError':
50
+ return 'permission-denied';
51
+ case 'NotFoundError':
52
+ case 'DevicesNotFoundError':
53
+ case 'OverconstrainedError':
54
+ return 'no-camera';
55
+ default:
56
+ return 'error';
57
+ }
58
+ }
59
+ const UNSUPPORTED_MESSAGE = 'getUserMedia is not available in this runtime.';
60
+ const GENERIC_ERROR_MESSAGE = 'Could not access the camera.';
61
+ const CANCELLED_MESSAGE = 'Camera request was superseded by stop().';
62
+ /** Create a session that owns at most one live camera stream. */
63
+ export function createCameraSession(deps) {
64
+ let stream = null;
65
+ let generation = 0;
66
+ function releaseTracks(media) {
67
+ for (const track of media.getTracks())
68
+ track.stop();
69
+ }
70
+ /**
71
+ * Request the camera. `facingMode` is a parameter, not a construction-time
72
+ * dependency, so a caller re-reading a reactive prop always requests the
73
+ * current value. A new `start()` supersedes the held stream (released now)
74
+ * and any request still pending (released when it settles), so overlapping
75
+ * calls can never leak a stream.
76
+ */
77
+ async function start(facingMode) {
78
+ if (stream) {
79
+ releaseTracks(stream);
80
+ stream = null;
81
+ }
82
+ generation += 1;
83
+ const requestGeneration = generation;
84
+ const mediaDevices = deps.mediaDevices;
85
+ if (!mediaDevices || !isCameraApiSupported({ mediaDevices })) {
86
+ return { ok: false, kind: 'unsupported', message: UNSUPPORTED_MESSAGE };
87
+ }
88
+ try {
89
+ const media = await mediaDevices.getUserMedia({
90
+ video: { facingMode },
91
+ audio: false,
92
+ });
93
+ if (requestGeneration !== generation) {
94
+ releaseTracks(media);
95
+ return { ok: false, kind: 'cancelled', message: CANCELLED_MESSAGE };
96
+ }
97
+ stream = media;
98
+ return { ok: true, stream: media };
99
+ }
100
+ catch (error) {
101
+ if (requestGeneration !== generation) {
102
+ return { ok: false, kind: 'cancelled', message: CANCELLED_MESSAGE };
103
+ }
104
+ return {
105
+ ok: false,
106
+ kind: classifyGetUserMediaError(error),
107
+ message: readStringField(error, 'message') ?? GENERIC_ERROR_MESSAGE,
108
+ };
109
+ }
110
+ }
111
+ /**
112
+ * Stop every track of the held stream, forget it, and invalidate any
113
+ * `start()` still in flight. Idempotent: a second call (for example from a
114
+ * `disabled` toggle and then unmount) never stops a track twice.
115
+ */
116
+ function stop() {
117
+ generation += 1;
118
+ if (stream)
119
+ releaseTracks(stream);
120
+ stream = null;
121
+ }
122
+ return {
123
+ start,
124
+ stop,
125
+ /** The live stream, or `null` when none is held. */
126
+ get stream() {
127
+ return stream;
128
+ },
129
+ };
130
+ }
@@ -54,6 +54,12 @@ export interface ControlMetadata {
54
54
  options?: ControlOption[];
55
55
  unit?: string;
56
56
  capabilities?: ControlCapability[];
57
+ /**
58
+ * JSON Schema for this control's value, for composites whose value is not a
59
+ * plain string/number/boolean (a place picker's `{ name, latitude, … }`).
60
+ * Proposal adapters use it verbatim instead of deriving one from `kind`.
61
+ */
62
+ valueSchema?: Record<string, unknown>;
57
63
  }
58
64
  export interface ControlRuntimeState {
59
65
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"control-interaction.d.ts","sourceRoot":"","sources":["../../../src/components/forms/control-interaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-interaction.d.ts","sourceRoot":"","sources":["../../../src/components/forms/control-interaction.ts"],"names":[],"mappings":"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"}
@@ -489,6 +489,9 @@ export function createControlInteractionRegistry(options = {}) {
489
489
  options: registration.metadata.options?.map((option) => ({
490
490
  ...option,
491
491
  })),
492
+ ...(registration.metadata.valueSchema
493
+ ? { valueSchema: cloneValue(registration.metadata.valueSchema) }
494
+ : {}),
492
495
  },
493
496
  state: {
494
497
  ...runtimeState,
@@ -755,7 +758,15 @@ export function createControlInteractionRegistry(options = {}) {
755
758
  }
756
759
  switch (command.action) {
757
760
  case 'focus':
758
- await registration.focus?.();
761
+ // An agent never moves the person's keyboard focus: its `focus`
762
+ // shows the control instead (scroll into view and highlight).
763
+ if (context.source === 'agent') {
764
+ await registration.reveal?.();
765
+ await registration.highlight?.();
766
+ }
767
+ else {
768
+ await registration.focus?.();
769
+ }
759
770
  break;
760
771
  case 'reveal':
761
772
  await registration.reveal?.();
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Form-level proposals over a control interaction registry.
3
+ *
4
+ * Transport-neutral helpers for "propose values for this form" adapters (the
5
+ * rich smrt-svelte `<Form webmcp>` tool, `FormScope`, a chat or voice
6
+ * adapter). They read whatever the registry holds for one `formId` — every
7
+ * smrt-ui primitive (`Input`, `Select`, `Textarea`, `Combobox`, …) and every
8
+ * composite registered through `useControlRegistration` — and only ever STAGE
9
+ * values: a person applies them through `StagedControlReview`.
10
+ */
11
+ import type { ControlCommandSource, ControlInteractionRegistry, ControlSnapshot } from './control-interaction.js';
12
+ /** Tool-safe name (`[a-z0-9_]`) for a form's proposal tool. */
13
+ export declare function controlProposalToolName(formId: string): string;
14
+ /**
15
+ * Whether a control can take a proposal at all: never secret or sensitive,
16
+ * never declared unwritable, disabled, or read-only, and never a file or
17
+ * password (neither is representable as a proposed JSON value).
18
+ */
19
+ export declare function isControlProposable(snapshot: ControlSnapshot): boolean;
20
+ /** JSON Schema for one control's proposed value. */
21
+ export declare function controlProposalSchema(snapshot: ControlSnapshot): Record<string, unknown>;
22
+ export interface ControlProposalOptions {
23
+ /** Control ids another source already describes (skipped here). */
24
+ exclude?: Iterable<string>;
25
+ }
26
+ /**
27
+ * The proposable controls of one form, keyed by control id. A
28
+ * record-qualified control (subject) shares its controlId with its siblings;
29
+ * the first registered wins so the schema key stays unambiguous.
30
+ */
31
+ export declare function proposableControls(registry: ControlInteractionRegistry, formId: string, options?: ControlProposalOptions): Map<string, ControlSnapshot>;
32
+ /** `{ controlId: schema }` for every proposable control of a form. */
33
+ export declare function controlProposalProperties(registry: ControlInteractionRegistry, formId: string, options?: ControlProposalOptions): Record<string, Record<string, unknown>>;
34
+ /** Object schema with one optional property per proposable control. */
35
+ export declare function controlProposalInputSchema(registry: ControlInteractionRegistry, formId: string, options?: ControlProposalOptions): Record<string, unknown>;
36
+ export interface StageControlProposalsResult {
37
+ ok: boolean;
38
+ staged: number;
39
+ rejected: Array<{
40
+ control: string;
41
+ reason: string;
42
+ }>;
43
+ /** Supplied keys that are not proposable controls of this form. */
44
+ skipped: string[];
45
+ }
46
+ /**
47
+ * Stage each supplied value as a proposal for local human review. Unknown,
48
+ * secret, read-only, or disabled controls are skipped — never written — and a
49
+ * proposal never applies or submits anything.
50
+ */
51
+ export declare function stageControlProposals(registry: ControlInteractionRegistry, formId: string, values: Record<string, unknown>, context?: {
52
+ source?: ControlCommandSource;
53
+ actorId?: string;
54
+ }, options?: ControlProposalOptions): Promise<StageControlProposalsResult>;
55
+ //# sourceMappingURL=control-proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-proposals.d.ts","sourceRoot":"","sources":["../../../src/components/forms/control-proposals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAGV,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAQtE;AAQD,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8DzB;AAED,MAAM,WAAW,sBAAsB;IACrC,mEAAmE;IACnE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,0BAA0B,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAW9B;AAED,sEAAsE;AACtE,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,0BAA0B,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUzC;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,0BAA0B,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,0BAA0B,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,EACjE,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CAwCtC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Form-level proposals over a control interaction registry.
3
+ *
4
+ * Transport-neutral helpers for "propose values for this form" adapters (the
5
+ * rich smrt-svelte `<Form webmcp>` tool, `FormScope`, a chat or voice
6
+ * adapter). They read whatever the registry holds for one `formId` — every
7
+ * smrt-ui primitive (`Input`, `Select`, `Textarea`, `Combobox`, …) and every
8
+ * composite registered through `useControlRegistration` — and only ever STAGE
9
+ * values: a person applies them through `StagedControlReview`.
10
+ */
11
+ /** Tool-safe name (`[a-z0-9_]`) for a form's proposal tool. */
12
+ export function controlProposalToolName(formId) {
13
+ const base = formId
14
+ .toLowerCase()
15
+ .replace(/[^a-z0-9_]+/g, '_')
16
+ .replace(/^_+|_+$/g, '');
17
+ return `${base || 'form'}_stage_changes`;
18
+ }
19
+ /**
20
+ * Whether a control can take a proposal at all: never secret or sensitive,
21
+ * never declared unwritable, disabled, or read-only, and never a file or
22
+ * password (neither is representable as a proposed JSON value).
23
+ */
24
+ export function isControlProposable(snapshot) {
25
+ const { metadata, state } = snapshot;
26
+ if (metadata.sensitivity === 'secret' || metadata.sensitivity === 'sensitive')
27
+ return false;
28
+ if (metadata.writable === false)
29
+ return false;
30
+ if (metadata.kind === 'file' || metadata.kind === 'password')
31
+ return false;
32
+ if (state.disabled || state.readonly)
33
+ return false;
34
+ return true;
35
+ }
36
+ function numericConstraint(value) {
37
+ if (value === undefined || value === '')
38
+ return undefined;
39
+ const number = Number(value);
40
+ return Number.isFinite(number) ? number : undefined;
41
+ }
42
+ /** JSON Schema for one control's proposed value. */
43
+ export function controlProposalSchema(snapshot) {
44
+ const { metadata } = snapshot;
45
+ const constraints = metadata.constraints ?? {};
46
+ const optionValues = metadata.options?.map((option) => option.value);
47
+ let schema;
48
+ if (metadata.valueSchema) {
49
+ schema = { ...metadata.valueSchema };
50
+ }
51
+ else {
52
+ switch (metadata.kind) {
53
+ case 'number':
54
+ case 'slider': {
55
+ schema = { type: 'number' };
56
+ const minimum = numericConstraint(constraints.min);
57
+ const maximum = numericConstraint(constraints.max);
58
+ if (minimum !== undefined)
59
+ schema.minimum = minimum;
60
+ if (maximum !== undefined)
61
+ schema.maximum = maximum;
62
+ break;
63
+ }
64
+ case 'checkbox':
65
+ case 'switch':
66
+ case 'toggle-button':
67
+ schema = { type: 'boolean' };
68
+ break;
69
+ case 'multi-select':
70
+ case 'tags-input':
71
+ schema = {
72
+ type: 'array',
73
+ items: optionValues?.length
74
+ ? { enum: optionValues }
75
+ : { type: 'string' },
76
+ };
77
+ break;
78
+ case 'range-slider':
79
+ schema = {
80
+ type: 'array',
81
+ items: { type: 'number' },
82
+ minItems: 2,
83
+ maxItems: 2,
84
+ };
85
+ break;
86
+ case 'custom':
87
+ // A composite without a declared valueSchema: describe, don't guess.
88
+ schema = {};
89
+ break;
90
+ default:
91
+ schema = { type: 'string' };
92
+ if (typeof constraints.minLength === 'number' &&
93
+ constraints.minLength > 0)
94
+ schema.minLength = constraints.minLength;
95
+ if (typeof constraints.maxLength === 'number' &&
96
+ constraints.maxLength > 0)
97
+ schema.maxLength = constraints.maxLength;
98
+ if (optionValues?.length)
99
+ schema.enum = optionValues;
100
+ }
101
+ }
102
+ if (metadata.label)
103
+ schema.title = metadata.label;
104
+ if (metadata.description)
105
+ schema.description = metadata.description;
106
+ return schema;
107
+ }
108
+ /**
109
+ * The proposable controls of one form, keyed by control id. A
110
+ * record-qualified control (subject) shares its controlId with its siblings;
111
+ * the first registered wins so the schema key stays unambiguous.
112
+ */
113
+ export function proposableControls(registry, formId, options = {}) {
114
+ const excluded = new Set(options.exclude ?? []);
115
+ const controls = new Map();
116
+ for (const snapshot of registry.list(formId)) {
117
+ const { controlId } = snapshot.identity;
118
+ if (snapshot.identity.formId !== formId || excluded.has(controlId))
119
+ continue;
120
+ if (!isControlProposable(snapshot) || controls.has(controlId))
121
+ continue;
122
+ controls.set(controlId, snapshot);
123
+ }
124
+ return controls;
125
+ }
126
+ /** `{ controlId: schema }` for every proposable control of a form. */
127
+ export function controlProposalProperties(registry, formId, options = {}) {
128
+ const properties = {};
129
+ for (const [controlId, snapshot] of proposableControls(registry, formId, options)) {
130
+ properties[controlId] = controlProposalSchema(snapshot);
131
+ }
132
+ return properties;
133
+ }
134
+ /** Object schema with one optional property per proposable control. */
135
+ export function controlProposalInputSchema(registry, formId, options = {}) {
136
+ return {
137
+ type: 'object',
138
+ additionalProperties: false,
139
+ properties: controlProposalProperties(registry, formId, options),
140
+ };
141
+ }
142
+ /**
143
+ * Stage each supplied value as a proposal for local human review. Unknown,
144
+ * secret, read-only, or disabled controls are skipped — never written — and a
145
+ * proposal never applies or submits anything.
146
+ */
147
+ export async function stageControlProposals(registry, formId, values, context = {}, options = {}) {
148
+ const controls = proposableControls(registry, formId, options);
149
+ const commands = [];
150
+ const skipped = [];
151
+ for (const [controlId, value] of Object.entries(values ?? {})) {
152
+ const snapshot = controls.get(controlId);
153
+ if (!snapshot) {
154
+ skipped.push(controlId);
155
+ continue;
156
+ }
157
+ commands.push({ action: 'stage', identity: snapshot.identity, value });
158
+ }
159
+ if (commands.length === 0) {
160
+ return { ok: false, staged: 0, rejected: [], skipped };
161
+ }
162
+ const commandContext = {
163
+ source: context.source ?? 'agent',
164
+ ...(context.actorId ? { actorId: context.actorId } : {}),
165
+ };
166
+ let results;
167
+ if (registry.executeBatch) {
168
+ results = (await registry.executeBatch(commands, commandContext)).results;
169
+ }
170
+ else {
171
+ results = [];
172
+ for (const command of commands) {
173
+ results.push(await registry.execute(command, commandContext));
174
+ }
175
+ }
176
+ const rejected = results
177
+ .filter((result) => !result.ok)
178
+ .map((result) => ({
179
+ control: result.identity.controlId,
180
+ reason: result.reason ?? 'rejected',
181
+ }));
182
+ return {
183
+ ok: rejected.length === 0,
184
+ staged: results.length - rejected.length,
185
+ rejected,
186
+ skipped,
187
+ };
188
+ }
@@ -0,0 +1,36 @@
1
+ export interface DictationTranscribeOptions {
2
+ /** The recording's MIME type, e.g. `audio/webm;codecs=opus`. */
3
+ mimeType: string;
4
+ /** BCP-47 language the person speaks, e.g. `en-US`. */
5
+ language: string;
6
+ /** How long the recording is, in milliseconds. */
7
+ durationMs: number;
8
+ /** Aborted when the person cancels or the form goes away. */
9
+ signal: AbortSignal;
10
+ }
11
+ /**
12
+ * Writes down a recorded message. Resolve the text (empty when nothing was
13
+ * said); reject to show an error. Throw a `DictationError` to pick the
14
+ * message (`too-long`, `not-transcribed`, `unavailable`, …).
15
+ */
16
+ export type DictationTranscribe = (audio: Blob, options: DictationTranscribeOptions) => Promise<string | {
17
+ text: string;
18
+ }>;
19
+ export interface HttpTranscriberOptions {
20
+ /** `fetch` to use (default `globalThis.fetch`). */
21
+ fetch?: typeof fetch;
22
+ /** Extra request headers. */
23
+ headers?: Record<string, string>;
24
+ }
25
+ /**
26
+ * A `DictationTranscribe` that POSTs the audio to `url` as the raw request
27
+ * body (`Content-Type` is the recording's type) with `language` and
28
+ * `durationMs` in the query string, and reads `{ text }` back.
29
+ *
30
+ * Status codes become plain-words errors: 413 → `too-long`, 503 →
31
+ * `unavailable` (not set up), 401/403 → `forbidden`, anything else →
32
+ * `not-transcribed`. The server's `{ error }` text is kept as the error
33
+ * message for logs, not shown.
34
+ */
35
+ export declare function createHttpTranscriber(url: string | URL, options?: HttpTranscriberOptions): DictationTranscribe;
36
+ //# sourceMappingURL=dictation-transcribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictation-transcribe.d.ts","sourceRoot":"","sources":["../../../src/components/forms/dictation-transcribe.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,0BAA0B;IACzC,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,0BAA0B,KAChC,OAAO,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,GAAE,sBAA2B,GACnC,mBAAmB,CAoDrB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Turning a recorded message into text, for dictation's recording fallback.
3
+ *
4
+ * `Dictation` records audio when the browser cannot recognise speech itself
5
+ * and hands it to a `DictationTranscribe` function. The app decides where it
6
+ * goes: normally its own server route, which holds the speech service's key
7
+ * (never put a provider key in the browser). `createHttpTranscriber` is that
8
+ * function for a route that takes the raw audio as the request body and
9
+ * answers `{ text }`.
10
+ */
11
+ import { DictationError } from './audio-capture.js';
12
+ /**
13
+ * A `DictationTranscribe` that POSTs the audio to `url` as the raw request
14
+ * body (`Content-Type` is the recording's type) with `language` and
15
+ * `durationMs` in the query string, and reads `{ text }` back.
16
+ *
17
+ * Status codes become plain-words errors: 413 → `too-long`, 503 →
18
+ * `unavailable` (not set up), 401/403 → `forbidden`, anything else →
19
+ * `not-transcribed`. The server's `{ error }` text is kept as the error
20
+ * message for logs, not shown.
21
+ */
22
+ export function createHttpTranscriber(url, options = {}) {
23
+ return async (audio, { mimeType, language, durationMs, signal }) => {
24
+ const doFetch = options.fetch ?? globalThis.fetch;
25
+ const base = typeof window !== 'undefined'
26
+ ? window.location.href
27
+ : 'http://localhost/';
28
+ const target = new URL(String(url), base);
29
+ if (language)
30
+ target.searchParams.set('language', language);
31
+ if (Number.isFinite(durationMs)) {
32
+ target.searchParams.set('durationMs', String(Math.round(durationMs)));
33
+ }
34
+ let response;
35
+ try {
36
+ response = await doFetch(target.toString(), {
37
+ method: 'POST',
38
+ headers: { ...options.headers, 'Content-Type': mimeType },
39
+ body: audio,
40
+ credentials: 'same-origin',
41
+ signal,
42
+ });
43
+ }
44
+ catch (error) {
45
+ if (error?.name === 'AbortError')
46
+ throw error;
47
+ throw new DictationError('not-transcribed', `Could not reach the speech service: ${error instanceof Error ? error.message : String(error)}`, 'network');
48
+ }
49
+ const body = (await response.json().catch(() => null));
50
+ if (!response.ok) {
51
+ const message = typeof body?.error === 'string'
52
+ ? body.error
53
+ : `Speech service answered ${response.status}`;
54
+ const kind = response.status === 413
55
+ ? 'too-long'
56
+ : response.status === 503
57
+ ? 'unavailable'
58
+ : response.status === 401 || response.status === 403
59
+ ? 'forbidden'
60
+ : 'not-transcribed';
61
+ throw new DictationError(kind, message, `http-${response.status}`);
62
+ }
63
+ return typeof body?.text === 'string' ? body.text : '';
64
+ };
65
+ }