@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,30 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import { createRawSnippet } from 'svelte';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { expectNoA11yViolations } from '../../../test-support/a11y';
5
+ import IconToggleGroup from '../IconToggleGroup.svelte';
6
+ const buttons = createRawSnippet(() => ({
7
+ render: () => '<span><button type="button" aria-pressed="true" aria-label="Draft (2)">D</button><button type="button" aria-pressed="false" aria-label="Review (0)">R</button></span>',
8
+ }));
9
+ describe('IconToggleGroup', () => {
10
+ it('is a named group around its toggles', () => {
11
+ render(IconToggleGroup, {
12
+ props: { label: 'Filter by status', children: buttons },
13
+ });
14
+ const group = screen.getByRole('group', { name: 'Filter by status' });
15
+ expect(group.querySelectorAll('button')).toHaveLength(2);
16
+ });
17
+ it('adds no state: the toggles keep their own pressed value', () => {
18
+ render(IconToggleGroup, {
19
+ props: { label: 'Filter by status', children: buttons },
20
+ });
21
+ expect(screen.getByRole('button', { name: 'Draft (2)' })).toHaveAttribute('aria-pressed', 'true');
22
+ expect(screen.getByRole('button', { name: 'Review (0)' })).toHaveAttribute('aria-pressed', 'false');
23
+ });
24
+ it('is axe-clean', async () => {
25
+ const { container } = render(IconToggleGroup, {
26
+ props: { label: 'Filter by status', children: buttons },
27
+ });
28
+ await expectNoA11yViolations(container);
29
+ });
30
+ });
@@ -0,0 +1,44 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { createRawSnippet } from 'svelte';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { expectNoA11yViolations } from '../../../test-support/a11y';
6
+ import Popover from '../Popover.svelte';
7
+ const icon = createRawSnippet(() => ({
8
+ render: () => '<svg viewBox="0 0 24 24" width="18" height="18"></svg>',
9
+ }));
10
+ const body = createRawSnippet(() => ({
11
+ render: () => '<p>No main picture</p>',
12
+ }));
13
+ describe('Popover', () => {
14
+ it('names an icon-only trigger with triggerLabel and opens its panel', async () => {
15
+ render(Popover, {
16
+ props: {
17
+ label: 'Issues',
18
+ triggerLabel: '3 issues',
19
+ trigger: icon,
20
+ children: body,
21
+ },
22
+ });
23
+ const trigger = screen.getByRole('button', { name: '3 issues' });
24
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
25
+ await userEvent.click(trigger);
26
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
27
+ expect(screen.getByRole('dialog', { name: 'Issues' })).toHaveTextContent('No main picture');
28
+ });
29
+ it('is named by its visible content when there is no triggerLabel', () => {
30
+ render(Popover, { props: { label: 'Filters', children: body } });
31
+ expect(screen.getByRole('button', { name: 'Filters' })).not.toHaveAttribute('aria-label');
32
+ });
33
+ it('is axe-clean with an icon-only trigger', async () => {
34
+ const { container } = render(Popover, {
35
+ props: {
36
+ label: 'Issues',
37
+ triggerLabel: '3 issues',
38
+ trigger: icon,
39
+ children: body,
40
+ },
41
+ });
42
+ await expectNoA11yViolations(container);
43
+ });
44
+ });
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Dropdown menu items take an icon, and Dropdown and Popover each offer an
3
+ * icon-only trigger look (a borderless 44px round button in the surrounding
4
+ * colour), so an app does not restyle `.dropdown__trigger` / `.popover__trigger`.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import { dirname, resolve } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { render, screen } from '@testing-library/svelte';
10
+ import userEvent from '@testing-library/user-event';
11
+ import { createRawSnippet } from 'svelte';
12
+ import { describe, expect, it, vi } from 'vitest';
13
+ import { expectNoA11yViolations } from '../../../test-support/a11y';
14
+ import Dropdown from '../Dropdown.svelte';
15
+ import Popover from '../Popover.svelte';
16
+ const glyph = createRawSnippet(() => ({
17
+ render: () => '<svg data-testid="glyph" viewBox="0 0 24 24" width="18" height="18"></svg>',
18
+ }));
19
+ const body = createRawSnippet(() => ({ render: () => '<p>Details</p>' }));
20
+ describe('Dropdown icons', () => {
21
+ it('shows an item icon beside the label and hides it from assistive technology', async () => {
22
+ render(Dropdown, {
23
+ props: {
24
+ label: 'Actions',
25
+ items: [
26
+ { id: 'edit', label: 'Edit', icon: glyph },
27
+ { id: 'plain', label: 'Plain' },
28
+ ],
29
+ },
30
+ });
31
+ await userEvent.click(screen.getByRole('button', { name: 'Actions' }));
32
+ const edit = screen.getByRole('menuitem', { name: 'Edit' });
33
+ const icon = edit.querySelector('.dropdown__item-icon');
34
+ expect(icon).not.toBeNull();
35
+ expect(icon).toHaveAttribute('aria-hidden', 'true');
36
+ expect(icon?.querySelector('svg')).not.toBeNull();
37
+ expect(screen
38
+ .getByRole('menuitem', { name: 'Plain' })
39
+ .querySelector('.dropdown__item-icon')).toBeNull();
40
+ });
41
+ it('is an icon-only 44px trigger named by triggerLabel', async () => {
42
+ const { container } = render(Dropdown, {
43
+ props: {
44
+ variant: 'icon',
45
+ triggerLabel: 'Actions for July 14 Council',
46
+ trigger: glyph,
47
+ items: [{ id: 'edit', label: 'Edit', icon: glyph }],
48
+ },
49
+ });
50
+ const trigger = screen.getByRole('button', {
51
+ name: 'Actions for July 14 Council',
52
+ });
53
+ expect(trigger).toHaveClass('dropdown__trigger--icon');
54
+ expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
55
+ await userEvent.click(trigger);
56
+ await expectNoA11yViolations(container);
57
+ });
58
+ it('an icon trigger falls back to label, and warns when it has no name at all', () => {
59
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => { });
60
+ render(Dropdown, {
61
+ props: {
62
+ variant: 'icon',
63
+ label: 'Row actions',
64
+ trigger: glyph,
65
+ items: [{ id: 'a', label: 'A' }],
66
+ },
67
+ });
68
+ expect(screen.getByRole('button', { name: 'Row actions' })).toHaveClass('dropdown__trigger--icon');
69
+ expect(warn).not.toHaveBeenCalled();
70
+ render(Dropdown, {
71
+ props: {
72
+ variant: 'icon',
73
+ trigger: glyph,
74
+ items: [{ id: 'a', label: 'A' }],
75
+ },
76
+ });
77
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('triggerLabel'));
78
+ warn.mockRestore();
79
+ });
80
+ it('keeps the bordered button look by default', () => {
81
+ render(Dropdown, {
82
+ props: { label: 'Actions', items: [{ id: 'a', label: 'A' }] },
83
+ });
84
+ expect(screen.getByRole('button', { name: 'Actions' })).not.toHaveClass('dropdown__trigger--icon');
85
+ });
86
+ });
87
+ describe('Popover icon variant', () => {
88
+ it('renders the icon trigger and opens its panel', async () => {
89
+ render(Popover, {
90
+ props: {
91
+ label: 'Issues',
92
+ triggerLabel: '2 issues',
93
+ variant: 'icon',
94
+ trigger: glyph,
95
+ children: body,
96
+ },
97
+ });
98
+ const trigger = screen.getByRole('button', { name: '2 issues' });
99
+ expect(trigger).toHaveClass('popover__trigger--icon');
100
+ await userEvent.click(trigger);
101
+ expect(screen.getByRole('dialog', { name: 'Issues' })).toHaveTextContent('Details');
102
+ });
103
+ it('an icon trigger without triggerLabel is named by label', () => {
104
+ render(Popover, {
105
+ props: {
106
+ label: 'Issues',
107
+ variant: 'icon',
108
+ trigger: glyph,
109
+ children: body,
110
+ },
111
+ });
112
+ expect(screen.getByRole('button', { name: 'Issues' })).toHaveClass('popover__trigger--icon');
113
+ });
114
+ it('keeps the standard primary focus ring on the icon trigger', () => {
115
+ const source = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '..', 'Popover.svelte'), 'utf8');
116
+ const css = source.slice(source.indexOf('<style>'));
117
+ expect(css).toMatch(/\.popover__trigger:focus-visible[^{]*\{ outline: 2px solid var\(--smrt-color-primary\)/);
118
+ // No icon-specific outline override (a currentColor ring under 3:1).
119
+ expect(css).not.toMatch(/\.popover__trigger--icon:focus-visible \{[^}]*outline/);
120
+ });
121
+ it('keeps the bordered button look by default', () => {
122
+ render(Popover, { props: { label: 'Filters', children: body } });
123
+ expect(screen.getByRole('button', { name: 'Filters' })).not.toHaveClass('popover__trigger--icon');
124
+ });
125
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Touch targets: on phones (48rem and under) Button of every size and the
3
+ * Switch row are at least 44px tall, and TagsInput's remove button is a 44px
4
+ * target on phones and touch screens. The sizing lives in each component's
5
+ * stylesheet, so an app never needs its own `min-height: 44px` override.
6
+ */
7
+ import { readFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { describe, expect, it } from 'vitest';
10
+ const root = process.cwd().endsWith('packages/smrt-ui')
11
+ ? process.cwd()
12
+ : join(process.cwd(), 'packages/smrt-ui');
13
+ const read = (path) => readFileSync(join(root, 'src/components', path), 'utf8');
14
+ /** The body of the first `@media (…max-width: 48rem…)` block in `source`. */
15
+ function phoneBlock(source) {
16
+ const start = source.indexOf('@media (max-width: 48rem)');
17
+ expect(start).toBeGreaterThan(-1);
18
+ return source.slice(start, source.indexOf('\n }', start) + 4);
19
+ }
20
+ describe('phone touch targets', () => {
21
+ it('Button is at least 44px tall on phones, in every size', () => {
22
+ const phone = phoneBlock(read('ui/Button.svelte'));
23
+ expect(phone).toMatch(/\.button\s*\{[^}]*min-block-size:\s*2\.75rem/);
24
+ });
25
+ it('Switch is at least 44px tall on phones', () => {
26
+ expect(read('forms/Switch.svelte')).toMatch(/@media \(max-width: 48rem\)\s*\{\s*\.switch\s*\{\s*min-block-size:\s*2\.75rem/);
27
+ });
28
+ it('TagsInput remove buttons are 44px on phones and touch screens', () => {
29
+ const source = read('forms/TagsInput.svelte');
30
+ const start = source.indexOf('@media (max-width: 48rem), (pointer: coarse)');
31
+ expect(start).toBeGreaterThan(-1);
32
+ const block = source.slice(start, source.indexOf('\n }', start));
33
+ expect(block).toMatch(/\.tag button\s*\{[^}]*min-inline-size:\s*2\.75rem/);
34
+ expect(block).toMatch(/\.tag button\s*\{[^}]*min-block-size:\s*2\.75rem/);
35
+ });
36
+ it('Dropdown menu rows are at least 44px tall', () => {
37
+ expect(read('ui/Dropdown.svelte')).toMatch(/\.dropdown__item\s*\{[^}]*min-block-size:\s*2\.75rem/);
38
+ });
39
+ });
@@ -10,6 +10,8 @@ export { default as Card } from './Card.svelte';
10
10
  export { default as Chip } from './Chip.svelte';
11
11
  export { default as Disclosure } from './Disclosure.svelte';
12
12
  export { default as Dropdown, default as Menu } from './Dropdown.svelte';
13
+ export { default as IconToggle } from './IconToggle.svelte';
14
+ export { default as IconToggleGroup } from './IconToggleGroup.svelte';
13
15
  export { default as Pagination } from './Pagination.svelte';
14
16
  export { default as Popover } from './Popover.svelte';
15
17
  export { default as Skeleton } from './Skeleton.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"}
@@ -11,6 +11,8 @@ export { default as Card } from './Card.svelte';
11
11
  export { default as Chip } from './Chip.svelte';
12
12
  export { default as Disclosure } from './Disclosure.svelte';
13
13
  export { default as Dropdown, default as Menu } from './Dropdown.svelte';
14
+ export { default as IconToggle } from './IconToggle.svelte';
15
+ export { default as IconToggleGroup } from './IconToggleGroup.svelte';
14
16
  export { default as Pagination } from './Pagination.svelte';
15
17
  export { default as Popover } from './Popover.svelte';
16
18
  export { default as Skeleton } from './Skeleton.svelte';
@@ -11,9 +11,50 @@ export declare const M: {
11
11
  readonly 'ui.calendar.next_month': "ui.calendar.next_month";
12
12
  readonly 'ui.calendar.select_month': "ui.calendar.select_month";
13
13
  readonly 'ui.calendar.select_year': "ui.calendar.select_year";
14
+ readonly 'ui.calendar.today': "ui.calendar.today";
15
+ readonly 'ui.calendar.more': "ui.calendar.more";
16
+ readonly 'ui.calendar.more_short': "ui.calendar.more_short";
17
+ readonly 'ui.calendar.all_day': "ui.calendar.all_day";
18
+ readonly 'ui.calendar.until': "ui.calendar.until";
19
+ readonly 'ui.calendar.items_one': "ui.calendar.items_one";
20
+ readonly 'ui.calendar.items_other': "ui.calendar.items_other";
21
+ readonly 'ui.calendar.nothing_day': "ui.calendar.nothing_day";
22
+ readonly 'ui.calendar.nothing_month': "ui.calendar.nothing_month";
23
+ readonly 'ui.calendar.days_in': "ui.calendar.days_in";
24
+ readonly 'ui.calendar.close_day': "ui.calendar.close_day";
14
25
  readonly 'ui.day_view.back_to_calendar': "ui.day_view.back_to_calendar";
15
26
  readonly 'ui.day_view.no_events': "ui.day_view.no_events";
16
27
  readonly 'ui.modal.close': "ui.modal.close";
28
+ readonly 'ui.phone_sheet.close': "ui.phone_sheet.close";
29
+ readonly 'ui.working_strip.working': "ui.working_strip.working";
30
+ readonly 'ui.working_strip.done': "ui.working_strip.done";
31
+ readonly 'ui.working_strip.open': "ui.working_strip.open";
32
+ readonly 'ui.working_strip.stop': "ui.working_strip.stop";
33
+ readonly 'ui.working_strip.paused': "ui.working_strip.paused";
34
+ readonly 'ui.working_strip.waiting': "ui.working_strip.waiting";
35
+ readonly 'ui.working_strip.failed': "ui.working_strip.failed";
36
+ readonly 'ui.working_strip.cancelled': "ui.working_strip.cancelled";
37
+ readonly 'ui.working_strip.pause': "ui.working_strip.pause";
38
+ readonly 'ui.working_strip.resume': "ui.working_strip.resume";
39
+ readonly 'ui.working_strip.review': "ui.working_strip.review";
40
+ readonly 'ui.working_strip.dismiss': "ui.working_strip.dismiss";
41
+ readonly 'ui.form_action_bar.label': "ui.form_action_bar.label";
42
+ readonly 'ui.dictation.start': "ui.dictation.start";
43
+ readonly 'ui.dictation.start_hint': "ui.dictation.start_hint";
44
+ readonly 'ui.dictation.stop': "ui.dictation.stop";
45
+ readonly 'ui.dictation.starting': "ui.dictation.starting";
46
+ readonly 'ui.dictation.listening': "ui.dictation.listening";
47
+ readonly 'ui.dictation.unsupported': "ui.dictation.unsupported";
48
+ readonly 'ui.dictation.denied': "ui.dictation.denied";
49
+ readonly 'ui.dictation.no_speech': "ui.dictation.no_speech";
50
+ readonly 'ui.dictation.microphone': "ui.dictation.microphone";
51
+ readonly 'ui.dictation.interrupted': "ui.dictation.interrupted";
52
+ readonly 'ui.dictation.failed': "ui.dictation.failed";
53
+ readonly 'ui.dictation.transcribing': "ui.dictation.transcribing";
54
+ readonly 'ui.dictation.too_long': "ui.dictation.too_long";
55
+ readonly 'ui.dictation.not_transcribed': "ui.dictation.not_transcribed";
56
+ readonly 'ui.dictation.unavailable': "ui.dictation.unavailable";
57
+ readonly 'ui.dictation.forbidden': "ui.dictation.forbidden";
17
58
  readonly 'ui.progress_bar.label': "ui.progress_bar.label";
18
59
  readonly 'ui.progress_bar.over_by': "ui.progress_bar.over_by";
19
60
  readonly 'ui.footer.all_rights_reserved': "ui.footer.all_rights_reserved";
@@ -32,6 +73,30 @@ export declare const M: {
32
73
  readonly 'ui.pagination.last_page': "ui.pagination.last_page";
33
74
  readonly 'ui.reaction_picker.label': "ui.reaction_picker.label";
34
75
  readonly 'ui.reaction_picker.react_with': "ui.reaction_picker.react_with";
76
+ readonly 'ui.camera_capture.region': "ui.camera_capture.region";
77
+ readonly 'ui.camera_capture.preview': "ui.camera_capture.preview";
78
+ readonly 'ui.camera_capture.starting': "ui.camera_capture.starting";
79
+ readonly 'ui.camera_capture.off': "ui.camera_capture.off";
80
+ readonly 'ui.camera_capture.unsupported': "ui.camera_capture.unsupported";
81
+ readonly 'ui.camera_capture.permission_denied': "ui.camera_capture.permission_denied";
82
+ readonly 'ui.camera_capture.no_camera': "ui.camera_capture.no_camera";
83
+ readonly 'ui.camera_capture.error': "ui.camera_capture.error";
84
+ readonly 'ui.camera_capture.retry': "ui.camera_capture.retry";
85
+ readonly 'ui.camera_capture.capture': "ui.camera_capture.capture";
86
+ readonly 'ui.camera_capture.retake': "ui.camera_capture.retake";
87
+ readonly 'ui.camera_capture.use_photo': "ui.camera_capture.use_photo";
88
+ readonly 'ui.camera_capture.review_alt': "ui.camera_capture.review_alt";
89
+ readonly 'ui.camera_capture.committed_alt': "ui.camera_capture.committed_alt";
90
+ readonly 'ui.camera_capture.committed': "ui.camera_capture.committed";
91
+ readonly 'ui.camera_capture.choose_photo': "ui.camera_capture.choose_photo";
92
+ readonly 'ui.signature_pad.region': "ui.signature_pad.region";
93
+ readonly 'ui.signature_pad.canvas_empty': "ui.signature_pad.canvas_empty";
94
+ readonly 'ui.signature_pad.canvas_signed': "ui.signature_pad.canvas_signed";
95
+ readonly 'ui.signature_pad.hint_any': "ui.signature_pad.hint_any";
96
+ readonly 'ui.signature_pad.hint_stylus': "ui.signature_pad.hint_stylus";
97
+ readonly 'ui.signature_pad.clear': "ui.signature_pad.clear";
98
+ readonly 'ui.signature_pad.use_signature': "ui.signature_pad.use_signature";
99
+ readonly 'ui.signature_pad.committed': "ui.signature_pad.committed";
35
100
  readonly 'ui.staged_control_review.region': "ui.staged_control_review.region";
36
101
  readonly 'ui.staged_control_review.heading': "ui.staged_control_review.heading";
37
102
  readonly 'ui.staged_control_review.description': "ui.staged_control_review.description";
@@ -1 +1 @@
1
- {"version":3,"file":"strings.ui.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ui.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEZ,CAAC"}
1
+ {"version":3,"file":"strings.ui.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ui.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgKZ,CAAC"}
@@ -13,11 +13,57 @@ export const M = defineMessages({
13
13
  'ui.calendar.next_month': 'Next month',
14
14
  'ui.calendar.select_month': 'Select month',
15
15
  'ui.calendar.select_year': 'Select year',
16
+ // calendar/CalendarView.svelte
17
+ 'ui.calendar.today': 'Today',
18
+ 'ui.calendar.more': '+{count} more',
19
+ 'ui.calendar.more_short': '+{count}',
20
+ 'ui.calendar.all_day': 'All day',
21
+ 'ui.calendar.until': 'Until {date}',
22
+ 'ui.calendar.items_one': '1 item',
23
+ 'ui.calendar.items_other': '{count} items',
24
+ 'ui.calendar.nothing_day': 'Nothing scheduled',
25
+ 'ui.calendar.nothing_month': 'Nothing scheduled this month',
26
+ 'ui.calendar.days_in': 'Days in {month}',
27
+ 'ui.calendar.close_day': 'Close {date}',
16
28
  // calendar/DayView.svelte
17
29
  'ui.day_view.back_to_calendar': 'Back to Calendar',
18
30
  'ui.day_view.no_events': 'No events scheduled for this day',
19
31
  // feedback/Modal.svelte
20
32
  'ui.modal.close': 'Close modal',
33
+ // feedback/PhoneSheet.svelte
34
+ 'ui.phone_sheet.close': 'Close {title}',
35
+ // feedback/WorkingStrip.svelte
36
+ 'ui.working_strip.working': 'Working…',
37
+ 'ui.working_strip.done': 'Done',
38
+ 'ui.working_strip.open': 'Open',
39
+ 'ui.working_strip.stop': 'Stop',
40
+ 'ui.working_strip.paused': 'Paused',
41
+ 'ui.working_strip.waiting': 'Waiting for you',
42
+ 'ui.working_strip.failed': "Couldn't finish",
43
+ 'ui.working_strip.cancelled': 'Stopped',
44
+ 'ui.working_strip.pause': 'Pause',
45
+ 'ui.working_strip.resume': 'Continue',
46
+ 'ui.working_strip.review': 'Review',
47
+ 'ui.working_strip.dismiss': 'Close',
48
+ // forms/FormActionBar.svelte
49
+ 'ui.form_action_bar.label': 'Form actions',
50
+ // forms/DictationButton.svelte, forms/DictationStatus.svelte
51
+ 'ui.dictation.start': 'Speak instead of typing',
52
+ 'ui.dictation.start_hint': 'Speak instead of typing. You can also press and hold the text box.',
53
+ 'ui.dictation.stop': 'Stop listening',
54
+ 'ui.dictation.starting': 'Getting the microphone ready…',
55
+ 'ui.dictation.listening': 'Listening. Tap the microphone when you are done.',
56
+ 'ui.dictation.unsupported': "Speech recognition isn't available in this browser. Brave blocks it; try Chrome, Edge or Safari, or type instead.",
57
+ 'ui.dictation.denied': 'The microphone is blocked. Allow it for this site in your browser settings, then try again.',
58
+ 'ui.dictation.no_speech': "Didn't hear anything. Tap the mic and try again.",
59
+ 'ui.dictation.microphone': "Couldn't use the microphone. Check that one is connected and no other app is using it, then try again.",
60
+ 'ui.dictation.interrupted': 'Listening stopped straight away. This browser may not support speaking into text; try Chrome, Edge or Safari, or type instead.',
61
+ 'ui.dictation.failed': 'Listening stopped. Tap the microphone to try again.',
62
+ 'ui.dictation.transcribing': 'Writing it down…',
63
+ 'ui.dictation.too_long': 'That was too long to write down. Try a shorter message, or type instead.',
64
+ 'ui.dictation.not_transcribed': "Couldn't write that down. Tap the microphone to try again, or type instead.",
65
+ 'ui.dictation.unavailable': "Speaking isn't set up here yet. Please type instead.",
66
+ 'ui.dictation.forbidden': "You can't use speaking here. Please type instead.",
21
67
  // feedback/ProgressBar.svelte
22
68
  'ui.progress_bar.label': 'Progress',
23
69
  'ui.progress_bar.over_by': 'Over by {amount}',
@@ -44,6 +90,32 @@ export const M = defineMessages({
44
90
  // chat/ReactionPicker.svelte
45
91
  'ui.reaction_picker.label': 'Add reaction',
46
92
  'ui.reaction_picker.react_with': 'React with {emoji}',
93
+ // forms/CameraCapture.svelte
94
+ 'ui.camera_capture.region': 'Camera',
95
+ 'ui.camera_capture.preview': 'Live camera preview',
96
+ 'ui.camera_capture.starting': 'Starting camera…',
97
+ 'ui.camera_capture.off': 'The camera is off.',
98
+ 'ui.camera_capture.unsupported': 'This browser cannot use the camera. Open this page over HTTPS in a current browser.',
99
+ 'ui.camera_capture.permission_denied': 'Camera access was denied. Allow camera access for this site, then try again.',
100
+ 'ui.camera_capture.no_camera': 'No camera was found on this device.',
101
+ 'ui.camera_capture.error': 'Could not access the camera.',
102
+ 'ui.camera_capture.retry': 'Try again',
103
+ 'ui.camera_capture.capture': 'Take photo',
104
+ 'ui.camera_capture.retake': 'Retake',
105
+ 'ui.camera_capture.use_photo': 'Use photo',
106
+ 'ui.camera_capture.review_alt': 'Captured photo, not yet used',
107
+ 'ui.camera_capture.committed_alt': 'Attached photo',
108
+ 'ui.camera_capture.committed': 'Photo attached.',
109
+ 'ui.camera_capture.choose_photo': 'Take or choose a photo',
110
+ // forms/SignaturePad.svelte
111
+ 'ui.signature_pad.region': 'Signature',
112
+ 'ui.signature_pad.canvas_empty': 'Signature area, not yet signed',
113
+ 'ui.signature_pad.canvas_signed': 'Signature area, signed',
114
+ 'ui.signature_pad.hint_any': 'Sign with a stylus, your finger, or the mouse.',
115
+ 'ui.signature_pad.hint_stylus': 'Sign with the stylus.',
116
+ 'ui.signature_pad.clear': 'Clear',
117
+ 'ui.signature_pad.use_signature': 'Use signature',
118
+ 'ui.signature_pad.committed': 'Signature attached.',
47
119
  // forms/StagedControlReview.svelte
48
120
  'ui.staged_control_review.region': 'Review proposed changes',
49
121
  'ui.staged_control_review.heading': 'Proposed changes',
@@ -4,6 +4,8 @@
4
4
  */
5
5
 
6
6
  :root {
7
+ --smrt-touch-target-min: 48px;
8
+ --smrt-control-target-min: 0px;
7
9
  /* Colors - Primary */
8
10
  --color-primary-main: #1976d2;
9
11
  --color-primary-light: #e3f2fd;
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import playground from '../playground.js';
3
3
  describe('smrt-ui playground', () => {
4
- it('publishes themed base-control and data-table previews', () => {
4
+ it('publishes themed base-control, data-table, and capture previews', () => {
5
5
  expect(playground.packageName).toBe('@happyvertical/smrt-ui');
6
6
  expect(playground.entries.map((entry) => entry.id)).toEqual([
7
7
  'base-controls',
@@ -9,6 +9,8 @@ describe('smrt-ui playground', () => {
9
9
  'feedback-overlays',
10
10
  'collections',
11
11
  'data-table',
12
+ 'calendar',
13
+ 'capture',
12
14
  ]);
13
15
  for (const entry of playground.entries) {
14
16
  expect(entry.loadComponent).toEqual(expect.any(Function));
@@ -0,0 +1,140 @@
1
+ <script lang="ts">
2
+ import CalendarView from '../../components/calendar/CalendarView.svelte';
3
+ import type {
4
+ CalendarItem,
5
+ CalendarMode,
6
+ } from '../../components/calendar/calendar-model.js';
7
+ import SegmentedControl from '../../components/forms/SegmentedControl.svelte';
8
+
9
+ const zone = 'America/Edmonton';
10
+ const today = new Date();
11
+ const y = today.getUTCFullYear();
12
+ const m = today.getUTCMonth() + 1;
13
+ const pad = (n: number) => String(n).padStart(2, '0');
14
+ const day = (d: number) => `${y}-${pad(m)}-${pad(d)}`;
15
+ const at = (d: number, hour: number) =>
16
+ new Date(`${day(d)}T${pad(hour)}:00:00-06:00`);
17
+
18
+ let mode = $state<CalendarMode>('auto');
19
+ let picked = $state('');
20
+
21
+ const items: CalendarItem[] = [
22
+ {
23
+ id: 'fair',
24
+ title: 'Fall fair',
25
+ start: day(4),
26
+ end: day(7),
27
+ group: 'community',
28
+ label: 'Community',
29
+ },
30
+ {
31
+ id: 'council',
32
+ title: 'Council meeting',
33
+ start: at(9, 19),
34
+ end: at(9, 21),
35
+ group: 'council',
36
+ label: 'Council',
37
+ },
38
+ {
39
+ id: 'game-1',
40
+ title: 'Hawks vs Owls',
41
+ start: at(12, 13),
42
+ group: 'sports',
43
+ label: 'Sports',
44
+ },
45
+ {
46
+ id: 'game-2',
47
+ title: 'Owls vs Crows',
48
+ start: at(12, 15),
49
+ group: 'sports',
50
+ label: 'Sports',
51
+ },
52
+ {
53
+ id: 'game-3',
54
+ title: 'Crows vs Hawks',
55
+ start: at(12, 17),
56
+ group: 'sports',
57
+ label: 'Sports',
58
+ },
59
+ {
60
+ id: 'game-4',
61
+ title: 'Final',
62
+ start: at(12, 19),
63
+ group: 'sports',
64
+ label: 'Sports',
65
+ },
66
+ {
67
+ id: 'deadline',
68
+ title: 'Budget comments close',
69
+ start: day(15),
70
+ tone: 'warning',
71
+ },
72
+ {
73
+ id: 'camp',
74
+ title: 'Hockey camp',
75
+ start: at(18, 9),
76
+ end: at(21, 16),
77
+ group: 'sports',
78
+ label: 'Sports',
79
+ },
80
+ ];
81
+ </script>
82
+
83
+ <div class="workbench">
84
+ <header>
85
+ <div>
86
+ <p class="eyebrow">Calendar</p>
87
+ <h4>Month grid, all-day bands, and the phone agenda ({zone})</h4>
88
+ </div>
89
+ <SegmentedControl
90
+ label="Mode"
91
+ value={mode}
92
+ interaction={false}
93
+ options={[
94
+ { value: 'auto', label: 'Auto' },
95
+ { value: 'month', label: 'Month' },
96
+ { value: 'agenda', label: 'Agenda' },
97
+ ]}
98
+ onvaluechange={(value) => (mode = value as CalendarMode)}
99
+ />
100
+ </header>
101
+ <CalendarView
102
+ {items}
103
+ {mode}
104
+ timeZone={zone}
105
+ onItemSelect={(item) => (picked = item.title)}
106
+ />
107
+ <p class="picked" aria-live="polite">{picked ? `Selected: ${picked}` : ''}</p>
108
+ </div>
109
+
110
+ <style>
111
+ .workbench {
112
+ display: grid;
113
+ gap: var(--smrt-spacing-4, 1rem);
114
+ }
115
+
116
+ header {
117
+ display: flex;
118
+ flex-wrap: wrap;
119
+ justify-content: space-between;
120
+ gap: var(--smrt-spacing-3, 0.75rem);
121
+ }
122
+
123
+ .eyebrow {
124
+ margin: 0;
125
+ color: var(--smrt-color-on-surface-variant, #44474e);
126
+ font-size: var(--smrt-typography-label-medium-size, 0.75rem);
127
+ text-transform: uppercase;
128
+ }
129
+
130
+ h4 {
131
+ margin: 0;
132
+ }
133
+
134
+
135
+ .picked {
136
+ margin: 0;
137
+ min-height: 1.5rem;
138
+ color: var(--smrt-color-on-surface-variant, #44474e);
139
+ }
140
+ </style>
@@ -0,0 +1,4 @@
1
+ declare const CalendarPreview: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type CalendarPreview = ReturnType<typeof CalendarPreview>;
3
+ export default CalendarPreview;
4
+ //# sourceMappingURL=CalendarPreview.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarPreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/CalendarPreview.svelte.ts"],"names":[],"mappings":"AA6GA,QAAA,MAAM,eAAe,2DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}