@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,172 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import WorkingStrip from '../WorkingStrip.svelte';
5
+ describe('WorkingStrip', () => {
6
+ it('renders nothing but an empty live region while idle', () => {
7
+ const { container } = render(WorkingStrip, {
8
+ props: { status: { phase: 'idle', label: null } },
9
+ });
10
+ expect(screen.queryByTestId('working-strip')).toBeNull();
11
+ const live = container.querySelector('[aria-live="polite"]');
12
+ expect(live?.textContent?.trim()).toBe('');
13
+ });
14
+ it('announces the status and reopens the surface from the strip', async () => {
15
+ const onopen = vi.fn();
16
+ const onstop = vi.fn();
17
+ const { container } = render(WorkingStrip, {
18
+ props: {
19
+ status: { phase: 'working', label: 'Writing the summary' },
20
+ canStop: true,
21
+ onopen,
22
+ onstop,
23
+ openLabel: 'Open the assistant',
24
+ },
25
+ });
26
+ expect(container.querySelector('[aria-live="polite"]')?.textContent).toContain('Writing the summary');
27
+ await userEvent.click(screen.getByRole('button', {
28
+ name: 'Writing the summary. Open the assistant',
29
+ }));
30
+ expect(onopen).toHaveBeenCalledTimes(1);
31
+ await userEvent.click(screen.getByRole('button', { name: 'Stop' }));
32
+ expect(onstop).toHaveBeenCalledTimes(1);
33
+ });
34
+ it('falls back to default labels and hides Stop unless it can stop', () => {
35
+ render(WorkingStrip, {
36
+ props: { status: { phase: 'working', label: null } },
37
+ });
38
+ expect(screen.getByTestId('working-strip').textContent).toContain('Working…');
39
+ expect(screen.queryByRole('button', { name: 'Stop' })).toBeNull();
40
+ });
41
+ it('shows Done without a spinner or Stop', () => {
42
+ const { container } = render(WorkingStrip, {
43
+ props: {
44
+ status: { phase: 'done', label: null },
45
+ canStop: true,
46
+ variant: 'inline',
47
+ },
48
+ });
49
+ const strip = screen.getByTestId('working-strip');
50
+ expect(strip).toHaveAttribute('data-phase', 'done');
51
+ expect(strip.textContent).toContain('Done');
52
+ expect(container.querySelector('.working-strip__spinner')).toBeNull();
53
+ expect(screen.queryByRole('button', { name: 'Stop' })).toBeNull();
54
+ });
55
+ it('goes green with a check once done, red with a cross once failed', () => {
56
+ const { rerender } = render(WorkingStrip, {
57
+ props: {
58
+ status: { phase: 'done', label: null, goal: 'Show me meetings' },
59
+ variant: 'floating',
60
+ },
61
+ });
62
+ const strip = screen.getByTestId('working-strip');
63
+ expect(strip).toHaveAttribute('data-phase', 'done');
64
+ expect(strip.textContent).toContain('Show me meetings');
65
+ expect(strip.textContent).toContain('✓');
66
+ rerender({
67
+ status: { phase: 'failed', label: null, goal: 'Show me meetings' },
68
+ variant: 'floating',
69
+ });
70
+ expect(screen.getByTestId('working-strip')).toHaveAttribute('data-phase', 'failed');
71
+ expect(screen.getByTestId('working-strip').textContent).toContain("Couldn't finish");
72
+ });
73
+ it('offers Pause while working, Continue while paused, and Esc pauses', async () => {
74
+ const onpause = vi.fn();
75
+ const onresume = vi.fn();
76
+ const onstop = vi.fn();
77
+ const { rerender } = render(WorkingStrip, {
78
+ props: {
79
+ status: { phase: 'working', label: 'Opening Events' },
80
+ variant: 'floating',
81
+ canStop: true,
82
+ onpause,
83
+ onresume,
84
+ onstop,
85
+ },
86
+ });
87
+ await userEvent.click(screen.getByRole('button', { name: 'Pause' }));
88
+ expect(onpause).toHaveBeenCalledTimes(1);
89
+ screen.getByRole('button', { name: 'Pause' }).focus();
90
+ await userEvent.keyboard('{Escape}');
91
+ expect(onpause).toHaveBeenCalledTimes(2);
92
+ rerender({
93
+ status: { phase: 'paused', label: null },
94
+ variant: 'floating',
95
+ canStop: true,
96
+ onpause,
97
+ onresume,
98
+ onstop,
99
+ });
100
+ expect(screen.queryByRole('button', { name: 'Pause' })).toBeNull();
101
+ await userEvent.click(screen.getByRole('button', { name: 'Continue' }));
102
+ expect(onresume).toHaveBeenCalledTimes(1);
103
+ await userEvent.click(screen.getByRole('button', { name: 'Stop' }));
104
+ expect(onstop).toHaveBeenCalledTimes(1);
105
+ });
106
+ it('asks for the person assertively while waiting, with Review', async () => {
107
+ const onreview = vi.fn();
108
+ const { container } = render(WorkingStrip, {
109
+ props: {
110
+ status: {
111
+ phase: 'waiting',
112
+ label: 'A change is ready for you',
113
+ goal: 'Fill the event form',
114
+ },
115
+ variant: 'floating',
116
+ onreview,
117
+ },
118
+ });
119
+ expect(container.querySelector('[aria-live="assertive"]')?.textContent).toContain('A change is ready for you');
120
+ expect(container.querySelector('[aria-live="polite"]')?.textContent?.trim()).toBe('');
121
+ await userEvent.click(screen.getByRole('button', { name: 'Review' }));
122
+ expect(onreview).toHaveBeenCalledTimes(1);
123
+ });
124
+ it('never takes focus by itself', async () => {
125
+ const outside = document.createElement('button');
126
+ document.body.append(outside);
127
+ outside.focus();
128
+ const { rerender } = render(WorkingStrip, {
129
+ props: {
130
+ status: { phase: 'working', label: 'Step one' },
131
+ variant: 'floating',
132
+ onpause: vi.fn(),
133
+ onopen: vi.fn(),
134
+ },
135
+ });
136
+ rerender({
137
+ status: { phase: 'waiting', label: 'Your turn' },
138
+ variant: 'floating',
139
+ onreview: vi.fn(),
140
+ onopen: vi.fn(),
141
+ });
142
+ expect(document.activeElement).toBe(outside);
143
+ outside.remove();
144
+ });
145
+ it('throttles polite step announcements', async () => {
146
+ vi.useFakeTimers();
147
+ try {
148
+ const { container, rerender } = render(WorkingStrip, {
149
+ props: {
150
+ status: { phase: 'working', label: 'Step one' },
151
+ announceIntervalMs: 2000,
152
+ },
153
+ });
154
+ const live = () => container.querySelector('[aria-live="polite"]')?.textContent?.trim();
155
+ expect(live()).toBe('Step one');
156
+ await rerender({
157
+ status: { phase: 'working', label: 'Step two' },
158
+ announceIntervalMs: 2000,
159
+ });
160
+ await rerender({
161
+ status: { phase: 'working', label: 'Step three' },
162
+ announceIntervalMs: 2000,
163
+ });
164
+ expect(live()).toBe('Step one');
165
+ await vi.advanceTimersByTimeAsync(2000);
166
+ expect(live()).toBe('Step three');
167
+ }
168
+ finally {
169
+ vi.useRealTimers();
170
+ }
171
+ });
172
+ });
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import ConfirmDialog from '../ConfirmDialog.svelte';
3
+ </script>
4
+
5
+ {#snippet message()}
6
+ Remove <strong>Record name</strong>?
7
+ <ul><li>Notes</li><li>Attachments</li></ul>
8
+ {/snippet}
9
+ <ConfirmDialog open title="Rich confirmation" {message} />
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const ConfirmMessage: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type ConfirmMessage = InstanceType<typeof ConfirmMessage>;
18
+ export default ConfirmMessage;
19
+ //# sourceMappingURL=confirm-message.fixture.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-message.fixture.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/__tests__/confirm-message.fixture.svelte.ts"],"names":[],"mappings":"AAgBA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,cAAc;;kBAA+E,CAAC;AAClF,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,eAAe,cAAc,CAAC"}
@@ -1,4 +1,4 @@
1
- import { render, screen } from '@testing-library/svelte';
1
+ import { act, fireEvent, render, screen } from '@testing-library/svelte';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { describe, expect, it, vi } from 'vitest';
4
4
  import ToastViewport from '../ToastViewport.svelte';
@@ -47,3 +47,144 @@ describe('toast', () => {
47
47
  }
48
48
  });
49
49
  });
50
+ describe('toast dismissal interactions', () => {
51
+ it('preserves the remaining duration until every pause reason clears', () => {
52
+ vi.useFakeTimers();
53
+ try {
54
+ const toaster = createToaster();
55
+ let visible = 0;
56
+ toaster.subscribe((toasts) => {
57
+ visible = toasts.length;
58
+ });
59
+ const id = toaster.show({ message: 'Saved', duration: 1000 });
60
+ vi.advanceTimersByTime(300);
61
+ toaster.pause?.(id, 'hover');
62
+ toaster.pause?.(id, 'focus');
63
+ vi.advanceTimersByTime(5000);
64
+ expect(visible).toBe(1);
65
+ toaster.resume?.(id, 'hover');
66
+ vi.advanceTimersByTime(5000);
67
+ expect(visible).toBe(1);
68
+ toaster.resume?.(id, 'focus');
69
+ toaster.resume?.(id, 'focus');
70
+ vi.advanceTimersByTime(699);
71
+ expect(visible).toBe(1);
72
+ vi.advanceTimersByTime(1);
73
+ expect(visible).toBe(0);
74
+ }
75
+ finally {
76
+ vi.useRealTimers();
77
+ }
78
+ });
79
+ it('replacing a paused id resets its duration without losing interaction pause', () => {
80
+ vi.useFakeTimers();
81
+ try {
82
+ const toaster = createToaster();
83
+ let message = '';
84
+ toaster.subscribe((toasts) => {
85
+ message = toasts[0]?.message ?? '';
86
+ });
87
+ toaster.show({ id: 'save', message: 'Saving', duration: 1000 });
88
+ toaster.pause?.('save', 'hover');
89
+ toaster.show({ id: 'save', message: 'Saved', duration: 2000 });
90
+ vi.advanceTimersByTime(5000);
91
+ expect(message).toBe('Saved');
92
+ toaster.resume?.('save', 'hover');
93
+ vi.advanceTimersByTime(1999);
94
+ expect(message).toBe('Saved');
95
+ vi.advanceTimersByTime(1);
96
+ expect(message).toBe('');
97
+ }
98
+ finally {
99
+ vi.useRealTimers();
100
+ }
101
+ });
102
+ it('can keep success notifications persistent while other notifications expire', () => {
103
+ vi.useFakeTimers();
104
+ try {
105
+ const toaster = createToaster({ successDuration: 0, duration: 1000 });
106
+ let messages = [];
107
+ toaster.subscribe((toasts) => {
108
+ messages = toasts.map((toast) => toast.message);
109
+ });
110
+ const id = toaster.success('Only record of approval');
111
+ toaster.show('Temporary');
112
+ toaster.success('Explicit duration wins', { duration: 500 });
113
+ vi.advanceTimersByTime(10000);
114
+ expect(messages).toEqual(['Only record of approval']);
115
+ toaster.dismiss(id);
116
+ expect(messages).toEqual([]);
117
+ toaster.show('Cleared');
118
+ toaster.clear();
119
+ expect(vi.getTimerCount()).toBe(0);
120
+ }
121
+ finally {
122
+ vi.useRealTimers();
123
+ }
124
+ });
125
+ it('viewport hover and focus pause independently, including focus movement within a toast', async () => {
126
+ vi.useFakeTimers();
127
+ try {
128
+ const toaster = createToaster();
129
+ render(ToastViewport, { props: { toaster } });
130
+ await act(() => {
131
+ toaster.show({
132
+ message: 'Stay visible',
133
+ duration: 1000,
134
+ action: { label: 'Undo', run: () => { } },
135
+ });
136
+ });
137
+ const group = screen.getByRole('group', { name: 'Notification' });
138
+ await fireEvent.mouseEnter(group);
139
+ await fireEvent.focusIn(screen.getByRole('button', { name: 'Undo' }));
140
+ await fireEvent.mouseLeave(group);
141
+ await fireEvent.focusOut(screen.getByRole('button', { name: 'Undo' }), {
142
+ relatedTarget: screen.getByRole('button', { name: 'Dismiss' }),
143
+ });
144
+ await act(() => vi.advanceTimersByTime(5000));
145
+ expect(screen.getByText('Stay visible')).toBeInTheDocument();
146
+ await fireEvent.focusOut(group, { relatedTarget: document.body });
147
+ await act(() => vi.advanceTimersByTime(1000));
148
+ expect(screen.queryByText('Stay visible')).not.toBeInTheDocument();
149
+ }
150
+ finally {
151
+ vi.useRealTimers();
152
+ }
153
+ });
154
+ it('releases its interaction pauses when the viewport unmounts', async () => {
155
+ vi.useFakeTimers();
156
+ try {
157
+ const toaster = createToaster();
158
+ let count = 0;
159
+ toaster.subscribe((toasts) => {
160
+ count = toasts.length;
161
+ });
162
+ const { unmount } = render(ToastViewport, { props: { toaster } });
163
+ await act(() => {
164
+ toaster.show({ message: 'Paused', duration: 1000 });
165
+ });
166
+ await fireEvent.mouseEnter(screen.getByRole('group', { name: 'Notification' }));
167
+ await act(() => vi.advanceTimersByTime(5000));
168
+ expect(count).toBe(1);
169
+ await unmount();
170
+ vi.advanceTimersByTime(1000);
171
+ expect(count).toBe(0);
172
+ expect(document.querySelector('.viewport')).toBeNull();
173
+ }
174
+ finally {
175
+ vi.useRealTimers();
176
+ }
177
+ });
178
+ it('retains compatibility with injected toasters without pause/resume methods', async () => {
179
+ const legacy = { ...createToaster(), pause: undefined, resume: undefined };
180
+ const { unmount } = render(ToastViewport, { props: { toaster: legacy } });
181
+ legacy.success('Legacy', { duration: 0 });
182
+ const group = await screen.findByRole('group', { name: 'Notification' });
183
+ await fireEvent.mouseEnter(group);
184
+ await fireEvent.mouseLeave(group);
185
+ await userEvent.click(screen.getByRole('button', { name: 'Dismiss' }));
186
+ expect(screen.queryByText('Legacy')).not.toBeInTheDocument();
187
+ await unmount();
188
+ expect(document.querySelector('.viewport')).toBeNull();
189
+ });
190
+ });
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Feedback components - User feedback and status indicators
3
3
  */
4
+ export { SWIPE_DISMISS_THRESHOLD, type SwipeDirection, type SwipeDismissOptions, swipeDismiss, swipeDismisses, } from '../../actions/swipe-dismiss.js';
4
5
  export { default as Alert } from './Alert.svelte';
5
6
  export { default as ConfirmDialog } from './ConfirmDialog.svelte';
6
7
  export { default as Drawer, default as Sheet } from './Drawer.svelte';
7
8
  export { default as LoadingOverlay } from './LoadingOverlay.svelte';
8
9
  export { default as Meter } from './Meter.svelte';
9
10
  export { default as Modal } from './Modal.svelte';
11
+ export { default as PhoneSheet } from './PhoneSheet.svelte';
10
12
  export { default as Progress } from './Progress.svelte';
11
13
  export { default as ProgressBar } from './ProgressBar.svelte';
12
14
  export { default as Spinner } from './Spinner.svelte';
13
15
  export { default as ToastViewport } from './ToastViewport.svelte';
14
- export type { Toast, ToastAction, Toaster, ToastInput, ToastVariant, } from './toast.js';
16
+ export type { Toast, ToastAction, Toaster, ToasterOptions, ToastInput, ToastVariant, } from './toast.js';
15
17
  export { createToaster, toaster } from './toast.js';
18
+ export { default as WorkingStrip } from './WorkingStrip.svelte';
19
+ export { WORKING_ASSERTIVE_PHASES, type WorkingPhase, type WorkingStatus, } from './working-status.js';
16
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EACV,KAAK,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,YAAY,EACZ,cAAc,GACf,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EACV,KAAK,EACL,WAAW,EACX,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Feedback components - User feedback and status indicators
3
3
  */
4
+ // Swipe-to-dismiss (used by PhoneSheet; phone drawers use it too).
5
+ export { SWIPE_DISMISS_THRESHOLD, swipeDismiss, swipeDismisses, } from '../../actions/swipe-dismiss.js';
4
6
  // Note: Component prop types (ConfirmDialogProps, etc.) are available
5
7
  // via svelte-package build output but cannot be re-exported here because
6
8
  // tsc --noEmit cannot resolve type exports from .svelte files.
@@ -10,8 +12,11 @@ export { default as Drawer, default as Sheet } from './Drawer.svelte';
10
12
  export { default as LoadingOverlay } from './LoadingOverlay.svelte';
11
13
  export { default as Meter } from './Meter.svelte';
12
14
  export { default as Modal } from './Modal.svelte';
15
+ export { default as PhoneSheet } from './PhoneSheet.svelte';
13
16
  export { default as Progress } from './Progress.svelte';
14
17
  export { default as ProgressBar } from './ProgressBar.svelte';
15
18
  export { default as Spinner } from './Spinner.svelte';
16
19
  export { default as ToastViewport } from './ToastViewport.svelte';
17
20
  export { createToaster, toaster } from './toast.js';
21
+ export { default as WorkingStrip } from './WorkingStrip.svelte';
22
+ export { WORKING_ASSERTIVE_PHASES, } from './working-status.js';
@@ -19,10 +19,22 @@ export interface Toaster {
19
19
  show(input: string | ToastInput): string;
20
20
  success(message: string, input?: Omit<ToastInput, 'message' | 'variant'>): string;
21
21
  error(message: string, input?: Omit<ToastInput, 'message' | 'variant'>): string;
22
+ /** Pause dismissal for a named interaction; legacy injected toasters may omit it. */
23
+ pause?(id: string, reason?: string): void;
24
+ /** Resume dismissal when all named interactions have ended. */
25
+ resume?(id: string, reason?: string): void;
22
26
  dismiss(id: string): void;
23
27
  clear(): void;
24
28
  subscribe(listener: (toasts: Toast[]) => void): () => void;
25
29
  }
26
- export declare function createToaster(): Toaster;
30
+ /** Default durations; zero keeps notifications until explicitly dismissed. */
31
+ export interface ToasterOptions {
32
+ /** Default dismissal duration in milliseconds (5000 by default). */
33
+ duration?: number;
34
+ /** Success dismissal duration; zero preserves the only record of an action. */
35
+ successDuration?: number;
36
+ }
37
+ /** Create an isolated notification queue with interaction-aware dismissal timers. */
38
+ export declare function createToaster(options?: ToasterOptions): Toaster;
27
39
  export declare const toaster: Toaster;
28
40
  //# sourceMappingURL=toast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/toast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;IACxE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,OAAO,CACL,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC9C,MAAM,CAAC;IACV,KAAK,CACH,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC9C,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5D;AAID,wBAAgB,aAAa,IAAI,OAAO,CA0DvC;AAED,eAAO,MAAM,OAAO,SAAkB,CAAC"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/toast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;IACxE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,OAAO,CACL,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC9C,MAAM,CAAC;IACV,KAAK,CACH,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC9C,MAAM,CAAC;IACV,qFAAqF;IACrF,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5D;AAID,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAwGnE;AAED,eAAO,MAAM,OAAO,SAAkB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  let nextToastId = 0;
2
- export function createToaster() {
2
+ /** Create an isolated notification queue with interaction-aware dismissal timers. */
3
+ export function createToaster(options = {}) {
3
4
  let toasts = [];
4
5
  const listeners = new Set();
5
6
  const timers = new Map();
@@ -9,8 +10,8 @@ export function createToaster() {
9
10
  };
10
11
  function dismiss(id) {
11
12
  const timer = timers.get(id);
12
- if (timer)
13
- clearTimeout(timer);
13
+ if (timer?.handle)
14
+ clearTimeout(timer.handle);
14
15
  timers.delete(id);
15
16
  toasts = toasts.filter((toast) => toast.id !== id);
16
17
  publish();
@@ -19,31 +20,71 @@ export function createToaster() {
19
20
  const normalized = typeof input === 'string' ? { message: input } : input;
20
21
  const id = normalized.id ?? `toast-${++nextToastId}`;
21
22
  const existingTimer = timers.get(id);
22
- if (existingTimer)
23
- clearTimeout(existingTimer);
23
+ if (existingTimer?.handle)
24
+ clearTimeout(existingTimer.handle);
24
25
  timers.delete(id);
25
26
  const toast = {
26
27
  id,
27
28
  message: normalized.message,
28
29
  title: normalized.title,
29
30
  variant: normalized.variant ?? 'info',
30
- duration: normalized.duration ?? 5000,
31
+ duration: normalized.duration ??
32
+ (normalized.variant === 'success'
33
+ ? options.successDuration
34
+ : undefined) ??
35
+ options.duration ??
36
+ 5000,
31
37
  action: normalized.action,
32
38
  };
33
39
  toasts = [...toasts.filter((item) => item.id !== id), toast];
34
40
  publish();
35
- if (toast.duration > 0)
36
- timers.set(id, setTimeout(() => dismiss(id), toast.duration));
41
+ if (toast.duration > 0) {
42
+ const timer = {
43
+ remaining: toast.duration,
44
+ started: Date.now(),
45
+ reasons: existingTimer?.reasons ?? new Set(),
46
+ };
47
+ timers.set(id, timer);
48
+ startTimer(id, timer);
49
+ }
37
50
  return id;
38
51
  }
52
+ function startTimer(id, timer) {
53
+ if (timer.reasons.size)
54
+ return;
55
+ timer.started = Date.now();
56
+ timer.handle = setTimeout(() => dismiss(id), timer.remaining);
57
+ }
58
+ function pause(id, reason = 'manual') {
59
+ const timer = timers.get(id);
60
+ if (!timer || timer.reasons.has(reason))
61
+ return;
62
+ if (!timer.reasons.size) {
63
+ if (timer.handle)
64
+ clearTimeout(timer.handle);
65
+ timer.handle = undefined;
66
+ timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.started));
67
+ }
68
+ timer.reasons.add(reason);
69
+ }
70
+ function resume(id, reason = 'manual') {
71
+ const timer = timers.get(id);
72
+ if (!timer || !timer.reasons.delete(reason))
73
+ return;
74
+ startTimer(id, timer);
75
+ }
39
76
  return {
40
77
  show,
78
+ pause,
79
+ resume,
41
80
  success: (message, input) => show({ ...input, message, variant: 'success' }),
42
81
  error: (message, input) => show({ ...input, message, variant: 'error' }),
43
82
  dismiss,
44
83
  clear() {
45
- for (const timer of timers.values())
46
- clearTimeout(timer);
84
+ for (const timer of timers.values()) {
85
+ if (timer.handle)
86
+ clearTimeout(timer.handle);
87
+ }
47
88
  timers.clear();
48
89
  toasts = [];
49
90
  publish();
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Generic "something is working" status rendered by `WorkingStrip`.
3
+ *
4
+ * - `idle`: nothing is shown;
5
+ * - `working`: a spinner and what is happening ("Writing the summary…");
6
+ * - `paused`: the work is on hold until the person continues it;
7
+ * - `waiting`: the work needs the person (a change to review, a choice to
8
+ * make, a question to answer) — shown prominently, announced assertively;
9
+ * - `done`: a short confirmation ("Done · 2 changes") the host clears after
10
+ * a few seconds;
11
+ * - `failed`: the work stopped on a problem — announced assertively;
12
+ * - `cancelled`: the person stopped it.
13
+ *
14
+ * Transport-neutral: an assistant run, an upload, or a background job can
15
+ * all feed it.
16
+ */
17
+ export type WorkingPhase = 'idle' | 'working' | 'paused' | 'waiting' | 'done' | 'failed' | 'cancelled';
18
+ export interface WorkingStatus {
19
+ /** Lifecycle phase. */
20
+ phase: WorkingPhase;
21
+ /**
22
+ * What to say: the current step while working ("Opening Events"), the
23
+ * outcome otherwise. `null` falls back to a default for the phase.
24
+ */
25
+ label: string | null;
26
+ /**
27
+ * What the work is for, in the person's own words ("Show me upcoming
28
+ * meetings"). Shown above the step on the floating pill; optional.
29
+ */
30
+ goal?: string | null;
31
+ }
32
+ /** Phases whose change is announced assertively (the person is needed). */
33
+ export declare const WORKING_ASSERTIVE_PHASES: readonly WorkingPhase[];
34
+ //# sourceMappingURL=working-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-status.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/working-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,SAAS,GACT,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,EAAE,SAAS,YAAY,EAG3D,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Phases whose change is announced assertively (the person is needed). */
2
+ export const WORKING_ASSERTIVE_PHASES = [
3
+ 'waiting',
4
+ 'failed',
5
+ ];