@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
@@ -35,6 +35,7 @@ import {
35
35
  type DataTableResolvedColumn,
36
36
  resolveDataTableLayout,
37
37
  } from './DataTableLayout.js';
38
+ import { responsiveColumns } from './DataTableResponsive.js';
38
39
  import {
39
40
  maximumDataTableVirtualScrollTop,
40
41
  resolveDataTableVirtualWindow,
@@ -77,6 +78,7 @@ let {
77
78
  sortable = false,
78
79
  sort = $bindable({ columnId: null, direction: null }),
79
80
  onSortChange,
81
+ sortClearable = true,
80
82
  manualSorting = false,
81
83
  filterFn,
82
84
  page = $bindable(1),
@@ -102,9 +104,14 @@ let {
102
104
  empty,
103
105
  rowClass,
104
106
  size = 'md',
107
+ density,
108
+ responsiveMode = 'scroll',
109
+ responsiveBreakpoint = 800,
110
+ responsiveColumnMinWidth = 160,
105
111
  striped = false,
106
112
  hoverable = true,
107
113
  stickyHeader = false,
114
+ phoneLayout = 'scroll',
108
115
  caption,
109
116
  dense = false,
110
117
  cell,
@@ -648,6 +655,10 @@ function handleSort(column: DataTableColumn<T>, event: MouseEvent) {
648
655
  type: 'toggleSorting',
649
656
  columnId: column.id,
650
657
  multi: event.shiftKey,
658
+ ...(column.sortFirstDirection
659
+ ? { firstDirection: column.sortFirstDirection }
660
+ : {}),
661
+ ...(sortClearable ? {} : { clearable: false }),
651
662
  });
652
663
  }
653
664
 
@@ -661,10 +672,22 @@ function sortActionLabel(column: DataTableColumn<T>): string {
661
672
  const columnSort = tableState.sorting.find(
662
673
  (sort) => sort.columnId === column.id,
663
674
  );
664
- if (!columnSort) {
675
+ const first = column.sortFirstDirection === 'desc' ? 'desc' : 'asc';
676
+ const next = !columnSort
677
+ ? first
678
+ : !sortClearable
679
+ ? columnSort.direction === 'asc'
680
+ ? 'desc'
681
+ : 'asc'
682
+ : columnSort.direction === first
683
+ ? first === 'asc'
684
+ ? 'desc'
685
+ : 'asc'
686
+ : null;
687
+ if (next === 'asc') {
665
688
  return t(M['ui.data_table.sort_ascending'], { column: column.label });
666
689
  }
667
- if (columnSort.direction === 'asc') {
690
+ if (next === 'desc') {
668
691
  return t(M['ui.data_table.sort_descending'], { column: column.label });
669
692
  }
670
693
  return t(M['ui.data_table.clear_sort'], { column: column.label });
@@ -757,6 +780,7 @@ function updateOverflowState() {
757
780
  const container = tableContainer;
758
781
  if (!container) return;
759
782
 
783
+ containerWidth = container.clientWidth;
760
784
  const maxScrollLeft = Math.max(
761
785
  0,
762
786
  container.scrollWidth - container.clientWidth,
@@ -818,9 +842,30 @@ function setIndeterminate(node: HTMLInputElement, value: boolean) {
818
842
  };
819
843
  }
820
844
 
821
- const dataTableLayout = $derived(
845
+ let containerWidth = $state(0);
846
+ const isNarrow = $derived(
847
+ responsiveMode === 'hide-columns' &&
848
+ containerWidth > 0 &&
849
+ containerWidth <=
850
+ (Number.isFinite(responsiveBreakpoint) && responsiveBreakpoint > 0
851
+ ? responsiveBreakpoint
852
+ : 800),
853
+ );
854
+ const declaredLayout = $derived(
822
855
  resolveDataTableLayout(columns, constrainedLayoutState, measuredColumnWidths),
823
856
  );
857
+ const dataTableLayout = $derived(
858
+ isNarrow
859
+ ? resolveDataTableLayout(
860
+ responsiveColumns(
861
+ declaredLayout.columns.map((entry) => entry.column),
862
+ containerWidth - (selectable ? 48 : 0) - (expandedContent ? 48 : 0),
863
+ responsiveColumnMinWidth,
864
+ ),
865
+ { ...constrainedLayoutState, columnWidths: [], columnPinning: [] },
866
+ )
867
+ : declaredLayout,
868
+ );
824
869
  const visibleColumns = $derived(dataTableLayout.columns);
825
870
  const dataBodyStructuralRows = $derived(
826
871
  structuralRows.filter((row) => row.kind !== 'footer'),
@@ -1173,6 +1218,12 @@ const errorMessage = $derived.by(() => {
1173
1218
  return message.trim() || t(M['ui.data_table.load_error']);
1174
1219
  });
1175
1220
  const hasRenderedRows = $derived(displayRows.length > 0);
1221
+ // Phone cards restyle table, rows and cells as blocks and grids, which drops
1222
+ // their table roles in WebKit. Explicit roles keep the table, its column
1223
+ // headers (visually hidden, still in the accessibility tree) and every cell
1224
+ // announced as such.
1225
+ const cardsRole = (role: string) =>
1226
+ phoneLayout === 'cards' ? role : undefined;
1176
1227
  const isInitialLoading = $derived(
1177
1228
  (loading || refreshing) && !hasRenderedRows && !errorMessage,
1178
1229
  );
@@ -1198,6 +1249,7 @@ function getCellValue(row: T, column: DataTableColumn<T>): unknown {
1198
1249
  function widthForColumn(
1199
1250
  column: DataTableResolvedColumn<T>,
1200
1251
  ): string | undefined {
1252
+ if (isNarrow) return undefined;
1201
1253
  return column.width === undefined ? column.column.width : `${column.width}px`;
1202
1254
  }
1203
1255
 
@@ -1366,10 +1418,18 @@ $effect(() => {
1366
1418
  void displayRows.length;
1367
1419
  if (!container) return;
1368
1420
 
1421
+ let resizeFrame: number | undefined;
1422
+ const scheduleOverflowUpdate = () => {
1423
+ if (resizeFrame !== undefined) return;
1424
+ resizeFrame = requestAnimationFrame(() => {
1425
+ resizeFrame = undefined;
1426
+ updateOverflowState();
1427
+ });
1428
+ };
1369
1429
  const resizeObserver =
1370
1430
  typeof ResizeObserver === 'undefined'
1371
1431
  ? undefined
1372
- : new ResizeObserver(updateOverflowState);
1432
+ : new ResizeObserver(scheduleOverflowUpdate);
1373
1433
  resizeObserver?.observe(container);
1374
1434
  const table = container.querySelector('table');
1375
1435
  if (table) resizeObserver?.observe(table);
@@ -1378,6 +1438,7 @@ $effect(() => {
1378
1438
 
1379
1439
  return () => {
1380
1440
  resizeObserver?.disconnect();
1441
+ if (resizeFrame !== undefined) cancelAnimationFrame(resizeFrame);
1381
1442
  window.removeEventListener('resize', updateOverflowState);
1382
1443
  };
1383
1444
  });
@@ -1387,11 +1448,14 @@ $effect(() => {
1387
1448
  <!-- svelte-ignore a11y_no_noninteractive_tabindex: the region provides horizontal or virtual keyboard scrolling. -->
1388
1449
  <div
1389
1450
  bind:this={tableContainer}
1451
+ data-density={density}
1390
1452
  class="data-table-container"
1453
+ class:data-table-container--narrow={isNarrow}
1391
1454
  class:data-table-container--sticky={stickyHeader || virtualizedBody}
1392
1455
  class:data-table-container--overflowing={hasHorizontalOverflow}
1393
1456
  class:data-table-container--virtualized={virtualizationWindow.enabled}
1394
1457
  class:data-table-container--highlighted={surfaceHighlighted}
1458
+ class:data-table-container--phone-cards={phoneLayout === 'cards'}
1395
1459
  style:height={virtualContainerHeight === undefined ? undefined : `${virtualContainerHeight}px`}
1396
1460
  tabindex={virtualizationWindow.enabled || hasHorizontalOverflow ? 0 : dataSurface ? -1 : undefined}
1397
1461
  role={virtualizationWindow.enabled || hasHorizontalOverflow ? 'region' : undefined}
@@ -1411,7 +1475,7 @@ $effect(() => {
1411
1475
  if (!event.defaultPrevented) handleOverflowKeydown(event);
1412
1476
  }}
1413
1477
  >
1414
- <table
1478
+ <table role={cardsRole('table')}
1415
1479
  class="data-table {sizeClasses[size]}"
1416
1480
  class:data-table--striped={striped}
1417
1481
  class:data-table--virtualized={virtualizationWindow.enabled}
@@ -1428,16 +1492,16 @@ $effect(() => {
1428
1492
  <caption bind:this={tableCaption} class="data-table__caption">{caption}</caption>
1429
1493
  {/if}
1430
1494
 
1431
- <thead bind:this={tableHead} class="data-table__head">
1495
+ <thead role={cardsRole('rowgroup')} bind:this={tableHead} class="data-table__head">
1432
1496
  {#each dataTableLayout.headerRows as headerRow, headerIndex (headerIndex)}
1433
- <tr class="data-table__row data-table__row--header">
1497
+ <tr role={cardsRole('row')} class="data-table__row data-table__row--header">
1434
1498
  {#if headerIndex === 0 && expandedContent}
1435
- <th class="data-table__cell data-table__cell--expand" scope="col" rowspan={headerRowCount}>
1499
+ <th role={cardsRole('columnheader')} class="data-table__cell data-table__cell--expand" scope="col" rowspan={headerRowCount}>
1436
1500
  <span class="sr-only"><Trans key={M['ui.data_table.expand']} /></span>
1437
1501
  </th>
1438
1502
  {/if}
1439
1503
  {#if headerIndex === 0 && selectable}
1440
- <th class="data-table__cell data-table__cell--checkbox" scope="col" rowspan={headerRowCount}>
1504
+ <th role={cardsRole('columnheader')} class="data-table__cell data-table__cell--checkbox" scope="col" rowspan={headerRowCount}>
1441
1505
  <input
1442
1506
  type="checkbox"
1443
1507
  checked={allSelected}
@@ -1451,7 +1515,7 @@ $effect(() => {
1451
1515
 
1452
1516
  {#each headerRow as headerCell, cellIndex (`${headerIndex}:${cellIndex}`)}
1453
1517
  {#if headerCell.kind === 'group'}
1454
- <th
1518
+ <th role={cardsRole('columnheader')}
1455
1519
  class="data-table__cell data-table__cell--header data-table__cell--header-group"
1456
1520
  class:data-table__cell--pinned-start={headerCell.pin === 'start'}
1457
1521
  class:data-table__cell--pinned-end={headerCell.pin === 'end'}
@@ -1466,7 +1530,7 @@ $effect(() => {
1466
1530
  {:else}
1467
1531
  {@const resolvedColumn = headerCell.column}
1468
1532
  {@const column = resolvedColumn.column}
1469
- <th
1533
+ <th role={cardsRole('columnheader')}
1470
1534
  class="data-table__cell data-table__cell--header"
1471
1535
  class:data-table__cell--sortable={usesAutomaticSortButton(column)}
1472
1536
  class:data-table__cell--sorted={currentSort.columnId === column.id}
@@ -1478,8 +1542,8 @@ $effect(() => {
1478
1542
  data-keep-visible={column.responsive?.keepVisible ? 'true' : undefined}
1479
1543
  use:observeColumnWidth={column.id}
1480
1544
  style:width={widthForColumn(resolvedColumn)}
1481
- style:min-width={column.minWidth}
1482
- style:max-width={column.maxWidth}
1545
+ style:min-width={isNarrow ? undefined : column.minWidth}
1546
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1483
1547
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1484
1548
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1485
1549
  style:text-align={column.align}
@@ -1535,7 +1599,7 @@ $effect(() => {
1535
1599
  {:else}
1536
1600
  {column.label}
1537
1601
  {/if}
1538
- {#if column.resizable}
1602
+ {#if column.resizable && !isNarrow}
1539
1603
  <!-- svelte-ignore a11y_no_noninteractive_element_interactions: a focusable ARIA separator is the resize control. -->
1540
1604
  <span
1541
1605
  class="data-table__resize-handle"
@@ -1557,10 +1621,10 @@ $effect(() => {
1557
1621
  {/each}
1558
1622
  </thead>
1559
1623
 
1560
- <tbody bind:this={tableBody} class="data-table__body">
1624
+ <tbody role={cardsRole('rowgroup')} bind:this={tableBody} class="data-table__body">
1561
1625
  {#if errorMessage && !hasRenderedRows}
1562
- <tr class="data-table__row data-table__row--error">
1563
- <td
1626
+ <tr role={cardsRole('row')} class="data-table__row data-table__row--error">
1627
+ <td role={cardsRole('cell')}
1564
1628
  class="data-table__cell data-table__cell--error"
1565
1629
  colspan={columnCount}
1566
1630
  >
@@ -1575,8 +1639,8 @@ $effect(() => {
1575
1639
  </td>
1576
1640
  </tr>
1577
1641
  {:else if isInitialLoading}
1578
- <tr class="data-table__row data-table__row--loading">
1579
- <td
1642
+ <tr role={cardsRole('row')} class="data-table__row data-table__row--loading">
1643
+ <td role={cardsRole('cell')}
1580
1644
  class="data-table__cell data-table__cell--loading"
1581
1645
  colspan={columnCount}
1582
1646
  >
@@ -1587,8 +1651,8 @@ $effect(() => {
1587
1651
  </td>
1588
1652
  </tr>
1589
1653
  {:else if displayRows.length === 0}
1590
- <tr class="data-table__row data-table__row--empty">
1591
- <td
1654
+ <tr role={cardsRole('row')} class="data-table__row data-table__row--empty">
1655
+ <td role={cardsRole('cell')}
1592
1656
  class="data-table__cell data-table__cell--empty"
1593
1657
  colspan={columnCount}
1594
1658
  >
@@ -1603,8 +1667,8 @@ $effect(() => {
1603
1667
  </tr>
1604
1668
  {:else}
1605
1669
  {#if virtualizationWindow.topSpacerHeight > 0}
1606
- <tr class="data-table__virtual-spacer" aria-hidden="true">
1607
- <td colspan={columnCount} style:height={`${virtualizationWindow.topSpacerHeight}px`}></td>
1670
+ <tr role={cardsRole('row')} class="data-table__virtual-spacer" aria-hidden="true">
1671
+ <td role={cardsRole('cell')} colspan={columnCount} style:height={`${virtualizationWindow.topSpacerHeight}px`}></td>
1608
1672
  </tr>
1609
1673
  {/if}
1610
1674
  {#each renderedRows as entry, index (entry.rowId)}
@@ -1614,7 +1678,7 @@ $effect(() => {
1614
1678
  {@const isSelected = tableState.selection.scope === 'allMatching' || selectedIds.has(key)}
1615
1679
  {@const isExpanded = expandedIds.has(key)}
1616
1680
  {@const rowCanExpand = canExpand?.(row, displayIndex) ?? true}
1617
- <tr
1681
+ <tr role={cardsRole('row')}
1618
1682
  class="data-table__row {rowClass?.(row, displayIndex) ?? ''}"
1619
1683
  class:data-table__row--selected={isSelected}
1620
1684
  class:data-table__row--striped={
@@ -1631,12 +1695,12 @@ $effect(() => {
1631
1695
  onkeydown={(event) => handleRowKeydown(event, row, displayIndex)}
1632
1696
  >
1633
1697
  {#if expandedContent}
1634
- <td class="data-table__cell data-table__cell--expand">
1698
+ <td role={cardsRole('cell')} class="data-table__cell data-table__cell--expand">
1635
1699
  {#if rowCanExpand}<button type="button" class="data-table__expand-button" aria-label={isExpanded ? t(M['ui.data_table.collapse_row'], { row: getRowLabel(row, displayIndex) }) : t(M['ui.data_table.expand_row'], { row: getRowLabel(row, displayIndex) })} aria-expanded={isExpanded} aria-controls={expansionContentId(key)} onclick={(event) => handleExpanded(key, event)}>{isExpanded ? '−' : '+'}</button>{/if}
1636
1700
  </td>
1637
1701
  {/if}
1638
1702
  {#if selectable}
1639
- <td class="data-table__cell data-table__cell--checkbox">
1703
+ <td role={cardsRole('cell')} class="data-table__cell data-table__cell--checkbox">
1640
1704
  <input
1641
1705
  type="checkbox"
1642
1706
  checked={isSelected}
@@ -1651,8 +1715,9 @@ $effect(() => {
1651
1715
  {#each visibleColumns as resolvedColumn (resolvedColumn.column.id)}
1652
1716
  {@const column = resolvedColumn.column}
1653
1717
  {@const value = getCellValue(row, column)}
1654
- <td
1718
+ <td role={cardsRole('cell')}
1655
1719
  class="data-table__cell {column.className ?? ''}"
1720
+ data-label={phoneLayout === 'cards' ? column.label : undefined}
1656
1721
  class:data-table__cell--pinned-start={resolvedColumn.pin === 'start'}
1657
1722
  class:data-table__cell--pinned-end={resolvedColumn.pin === 'end'}
1658
1723
  data-column-id={column.id}
@@ -1660,8 +1725,8 @@ $effect(() => {
1660
1725
  data-responsive-priority={column.responsive?.priority}
1661
1726
  data-keep-visible={column.responsive?.keepVisible ? 'true' : undefined}
1662
1727
  style:width={widthForColumn(resolvedColumn)}
1663
- style:min-width={column.minWidth}
1664
- style:max-width={column.maxWidth}
1728
+ style:min-width={isNarrow ? undefined : column.minWidth}
1729
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1665
1730
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1666
1731
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1667
1732
  style:text-align={column.align}
@@ -1677,26 +1742,26 @@ $effect(() => {
1677
1742
  {/each}
1678
1743
  </tr>
1679
1744
  {#if expandedContent && isExpanded}
1680
- <tr id={expansionContentId(key)} class="data-table__row data-table__row--expanded">
1681
- <td class="data-table__cell data-table__cell--expanded" colspan={columnCount}>{@render expandedContent({ row, index: displayIndex })}</td>
1745
+ <tr role={cardsRole('row')} id={expansionContentId(key)} class="data-table__row data-table__row--expanded">
1746
+ <td role={cardsRole('cell')} class="data-table__cell data-table__cell--expanded" colspan={columnCount}>{@render expandedContent({ row, index: displayIndex })}</td>
1682
1747
  </tr>
1683
1748
  {/if}
1684
1749
  {/each}
1685
1750
  {#if virtualizationWindow.bottomSpacerHeight > 0}
1686
- <tr class="data-table__virtual-spacer" aria-hidden="true">
1687
- <td colspan={columnCount} style:height={`${virtualizationWindow.bottomSpacerHeight}px`}></td>
1751
+ <tr role={cardsRole('row')} class="data-table__virtual-spacer" aria-hidden="true">
1752
+ <td role={cardsRole('cell')} colspan={columnCount} style:height={`${virtualizationWindow.bottomSpacerHeight}px`}></td>
1688
1753
  </tr>
1689
1754
  {/if}
1690
1755
  {/if}
1691
1756
  </tbody>
1692
1757
  {#if dataBodyStructuralRows.length > 0}
1693
- <tbody
1758
+ <tbody role={cardsRole('rowgroup')}
1694
1759
  bind:this={tableStructuralBody}
1695
1760
  class="data-table__body data-table__body--structural"
1696
1761
  >
1697
1762
  {#each dataBodyStructuralRows as structuralRow, structuralIndex (structuralRow.id)}
1698
1763
  {@const labelColumnId = structuralLabelColumnId(structuralRow)}
1699
- <tr
1764
+ <tr role={cardsRole('row')}
1700
1765
  class="data-table__row data-table__row--structural"
1701
1766
  data-row-kind={structuralRow.kind}
1702
1767
  aria-label={structuralRowLabel(structuralRow)}
@@ -1704,21 +1769,21 @@ $effect(() => {
1704
1769
  ? virtualRowOffset + displayRows.length + headerRowCount + structuralIndex + 1
1705
1770
  : undefined}
1706
1771
  >
1707
- {#if expandedContent}<td class="data-table__cell data-table__cell--expand"></td>{/if}
1708
- {#if selectable}<td class="data-table__cell data-table__cell--checkbox"></td>{/if}
1772
+ {#if expandedContent}<td role={cardsRole('cell')} class="data-table__cell data-table__cell--expand"></td>{/if}
1773
+ {#if selectable}<td role={cardsRole('cell')} class="data-table__cell data-table__cell--checkbox"></td>{/if}
1709
1774
  {#each visibleColumns as resolvedColumn (resolvedColumn.column.id)}
1710
1775
  {@const column = resolvedColumn.column}
1711
1776
  {@const value = structuralCellValue(structuralRow, column)}
1712
1777
  {#if column.id === labelColumnId}
1713
- <th
1778
+ <th role={cardsRole('rowheader')}
1714
1779
  class="data-table__cell data-table__cell--structural-label {column.className ?? ''}"
1715
1780
  class:data-table__cell--pinned-start={resolvedColumn.pin === 'start'}
1716
1781
  class:data-table__cell--pinned-end={resolvedColumn.pin === 'end'}
1717
1782
  scope="row"
1718
1783
  data-column-id={column.id}
1719
1784
  style:width={widthForColumn(resolvedColumn)}
1720
- style:min-width={column.minWidth}
1721
- style:max-width={column.maxWidth}
1785
+ style:min-width={isNarrow ? undefined : column.minWidth}
1786
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1722
1787
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1723
1788
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1724
1789
  style:text-align={column.align}
@@ -1731,14 +1796,15 @@ $effect(() => {
1731
1796
  {/if}
1732
1797
  </th>
1733
1798
  {:else}
1734
- <td
1799
+ <td role={cardsRole('cell')}
1735
1800
  class="data-table__cell {column.className ?? ''}"
1801
+ data-label={phoneLayout === 'cards' ? column.label : undefined}
1736
1802
  class:data-table__cell--pinned-start={resolvedColumn.pin === 'start'}
1737
1803
  class:data-table__cell--pinned-end={resolvedColumn.pin === 'end'}
1738
1804
  data-column-id={column.id}
1739
1805
  style:width={widthForColumn(resolvedColumn)}
1740
- style:min-width={column.minWidth}
1741
- style:max-width={column.maxWidth}
1806
+ style:min-width={isNarrow ? undefined : column.minWidth}
1807
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1742
1808
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1743
1809
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1744
1810
  style:text-align={column.align}
@@ -1756,10 +1822,10 @@ $effect(() => {
1756
1822
  </tbody>
1757
1823
  {/if}
1758
1824
  {#if footer || footerStructuralRows.length > 0}
1759
- <tfoot bind:this={tableFooter}>
1825
+ <tfoot role={cardsRole('rowgroup')} bind:this={tableFooter}>
1760
1826
  {#each footerStructuralRows as structuralRow, structuralIndex (structuralRow.id)}
1761
1827
  {@const labelColumnId = structuralLabelColumnId(structuralRow)}
1762
- <tr
1828
+ <tr role={cardsRole('row')}
1763
1829
  class="data-table__row data-table__row--structural data-table__row--footer"
1764
1830
  data-row-kind={structuralRow.kind}
1765
1831
  aria-label={structuralRowLabel(structuralRow)}
@@ -1767,21 +1833,21 @@ $effect(() => {
1767
1833
  ? virtualRowCount + headerRowCount + dataBodyStructuralRows.length + structuralIndex + 1
1768
1834
  : undefined}
1769
1835
  >
1770
- {#if expandedContent}<td class="data-table__cell data-table__cell--expand"></td>{/if}
1771
- {#if selectable}<td class="data-table__cell data-table__cell--checkbox"></td>{/if}
1836
+ {#if expandedContent}<td role={cardsRole('cell')} class="data-table__cell data-table__cell--expand"></td>{/if}
1837
+ {#if selectable}<td role={cardsRole('cell')} class="data-table__cell data-table__cell--checkbox"></td>{/if}
1772
1838
  {#each visibleColumns as resolvedColumn (resolvedColumn.column.id)}
1773
1839
  {@const column = resolvedColumn.column}
1774
1840
  {@const value = structuralCellValue(structuralRow, column)}
1775
1841
  {#if column.id === labelColumnId}
1776
- <th
1842
+ <th role={cardsRole('rowheader')}
1777
1843
  class="data-table__cell data-table__cell--structural-label {column.className ?? ''}"
1778
1844
  class:data-table__cell--pinned-start={resolvedColumn.pin === 'start'}
1779
1845
  class:data-table__cell--pinned-end={resolvedColumn.pin === 'end'}
1780
1846
  scope="row"
1781
1847
  data-column-id={column.id}
1782
1848
  style:width={widthForColumn(resolvedColumn)}
1783
- style:min-width={column.minWidth}
1784
- style:max-width={column.maxWidth}
1849
+ style:min-width={isNarrow ? undefined : column.minWidth}
1850
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1785
1851
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1786
1852
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1787
1853
  style:text-align={column.align}
@@ -1794,14 +1860,15 @@ $effect(() => {
1794
1860
  {/if}
1795
1861
  </th>
1796
1862
  {:else}
1797
- <td
1863
+ <td role={cardsRole('cell')}
1798
1864
  class="data-table__cell {column.className ?? ''}"
1865
+ data-label={phoneLayout === 'cards' ? column.label : undefined}
1799
1866
  class:data-table__cell--pinned-start={resolvedColumn.pin === 'start'}
1800
1867
  class:data-table__cell--pinned-end={resolvedColumn.pin === 'end'}
1801
1868
  data-column-id={column.id}
1802
1869
  style:width={widthForColumn(resolvedColumn)}
1803
- style:min-width={column.minWidth}
1804
- style:max-width={column.maxWidth}
1870
+ style:min-width={isNarrow ? undefined : column.minWidth}
1871
+ style:max-width={isNarrow ? undefined : column.maxWidth}
1805
1872
  style:left={resolvedColumn.pin === 'start' ? resolvedColumn.stickyOffset : undefined}
1806
1873
  style:right={resolvedColumn.pin === 'end' ? resolvedColumn.stickyOffset : undefined}
1807
1874
  style:text-align={column.align}
@@ -1817,10 +1884,10 @@ $effect(() => {
1817
1884
  </tr>
1818
1885
  {/each}
1819
1886
  {#if footer}
1820
- <tr aria-rowindex={virtualizationWindow.enabled
1887
+ <tr role={cardsRole('row')} aria-rowindex={virtualizationWindow.enabled
1821
1888
  ? virtualRowCount + headerRowCount + structuralRowCount
1822
1889
  : undefined}>
1823
- <td class="data-table__cell data-table__footer" colspan={columnCount}>
1890
+ <td role={cardsRole('cell')} class="data-table__cell data-table__footer" colspan={columnCount}>
1824
1891
  {@render footer({ rows: displayRows.map(({ row }) => row) })}
1825
1892
  </td>
1826
1893
  </tr>
@@ -2209,9 +2276,65 @@ $effect(() => {
2209
2276
  opacity: 0.7;
2210
2277
  }
2211
2278
 
2279
+ /* Phones with phoneLayout="cards": one block of stacked cells per row. Each cell shows its
2280
+ column's name (data-label) above its value; the header row stays in the accessibility tree,
2281
+ visually hidden, and the explicit roles keep the table structure announced. */
2282
+ @media (max-width: 48rem) {
2283
+ /* A virtualized body keeps its own scroller. */
2284
+ .data-table-container--phone-cards:not(.data-table-container--virtualized) {
2285
+ overflow: visible;
2286
+ }
2287
+ .data-table-container--phone-cards .data-table,
2288
+ .data-table-container--phone-cards .data-table__body {
2289
+ display: block;
2290
+ width: 100%;
2291
+ }
2292
+ .data-table-container--phone-cards .data-table__head {
2293
+ position: absolute;
2294
+ width: 1px;
2295
+ height: 1px;
2296
+ overflow: hidden;
2297
+ clip: rect(0 0 0 0);
2298
+ clip-path: inset(50%);
2299
+ white-space: nowrap;
2300
+ }
2301
+ .data-table-container--phone-cards .data-table__overflow-cue {
2302
+ display: none;
2303
+ }
2304
+ .data-table-container--phone-cards .data-table__cell[data-label]:not([data-label=''])::before {
2305
+ content: attr(data-label);
2306
+ /* The header already names the cell for assistive technology. */
2307
+ content: attr(data-label) / '';
2308
+ display: block;
2309
+ font-size: var(--smrt-typography-label-small-size, 0.75rem);
2310
+ font-weight: 600;
2311
+ color: var(--smrt-color-on-surface-variant, #4b5563);
2312
+ }
2313
+ .data-table-container--phone-cards .data-table__row {
2314
+ display: grid;
2315
+ gap: var(--smrt-spacing-1, 0.35rem);
2316
+ padding: var(--smrt-spacing-3, 0.85rem) var(--smrt-spacing-4, 1rem);
2317
+ border-bottom: 1px solid var(--smrt-color-outline-variant, #e5e7eb);
2318
+ }
2319
+ .data-table-container--phone-cards .data-table__cell {
2320
+ display: block;
2321
+ padding: 0;
2322
+ border: 0;
2323
+ }
2324
+ .data-table-container--phone-cards .data-table__cell:empty {
2325
+ display: none;
2326
+ }
2327
+ }
2328
+
2212
2329
  @media (prefers-reduced-motion: reduce) {
2213
2330
  .data-table__spinner {
2214
2331
  animation: none;
2215
2332
  }
2216
2333
  }
2334
+ .data-table-container[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min, 48px); }
2335
+ .data-table-container[data-density='comfortable'] { --smrt-control-target-min: 0px; }
2336
+ .data-table__sort-button { min-height: var(--smrt-control-target-min, 0px); min-width: var(--smrt-control-target-min, 0px); }
2337
+ .data-table-container--narrow .data-table { table-layout: fixed; }
2338
+ .data-table-container--narrow .data-table__cell { white-space: normal; overflow-wrap: anywhere; }
2339
+ .data-table-container--narrow .data-table__sort-button { max-width: 100%; text-align: left; white-space: normal; overflow-wrap: anywhere; }
2217
2340
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAmChE,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClD,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CACZ;QAAC;YAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE;KAAC,CACxE,CAAC;CACH;AAYC,iBAAS,QAAQ,CAAC,CAAC;WAglDQ,aAAa,CAAC,CAAC,CAAC;;;;;EAAgH;AAC7J,cAAM,iBAAiB,CAAC,CAAC;IACrB,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5X,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3H,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD,QAAA,MAAM,SAAS,EAAE,qBAAmC,CAAC;AACnC,KAAK,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"DataTable.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAoChE,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClD,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CACZ;QAAC;YAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE;KAAC,CACxE,CAAC;CACH;AAYC,iBAAS,QAAQ,CAAC,CAAC;WA6oDQ,aAAa,CAAC,CAAC,CAAC;;;;;EAAgH;AAC7J,cAAM,iBAAiB,CAAC,CAAC;IACrB,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5X,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3H,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD,QAAA,MAAM,SAAS,EAAE,qBAAmC,CAAC;AACnC,KAAK,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,eAAe,SAAS,CAAC"}
@@ -114,6 +114,10 @@ export type DataTableCommand = {
114
114
  type: 'toggleSorting';
115
115
  columnId: string;
116
116
  multi?: boolean;
117
+ /** Direction when the column is not sorted yet (default `asc`). */
118
+ firstDirection?: DataTableSortRule['direction'];
119
+ /** `false` toggles asc ⇄ desc instead of clearing on the third activation. */
120
+ clearable?: boolean;
117
121
  } | {
118
122
  type: 'setPage';
119
123
  page: number;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableController.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTableController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTableController.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTableController.ts"],"names":[],"mappings":"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"}
@@ -403,11 +403,18 @@ export function transitionDataTableState(state, command) {
403
403
  const columnId = assertColumnId(command.columnId, 'sort column id');
404
404
  const index = current.sorting.findIndex((rule) => rule.columnId === columnId);
405
405
  const previous = index >= 0 ? current.sorting[index] : undefined;
406
+ const firstDirection = command.firstDirection === 'desc' ? 'desc' : 'asc';
407
+ const lastDirection = firstDirection === 'asc' ? 'desc' : 'asc';
406
408
  const toggled = !previous
407
- ? { columnId, direction: 'asc' }
408
- : previous.direction === 'asc'
409
- ? { columnId, direction: 'desc' }
410
- : null;
409
+ ? { columnId, direction: firstDirection }
410
+ : command.clearable === false
411
+ ? {
412
+ columnId,
413
+ direction: previous.direction === 'asc' ? 'desc' : 'asc',
414
+ }
415
+ : previous.direction === firstDirection
416
+ ? { columnId, direction: lastDirection }
417
+ : null;
411
418
  const sorting = command.multi
412
419
  ? previous
413
420
  ? toggled
@@ -0,0 +1,4 @@
1
+ import type { DataTableColumn } from './types.js';
2
+ /** Choose narrow-mode columns without changing their declared display order. */
3
+ export declare function responsiveColumns<T>(columns: readonly DataTableColumn<T>[], width: number, minimumWidth: number): DataTableColumn<T>[];
4
+ //# sourceMappingURL=DataTableResponsive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableResponsive.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTableResponsive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,OAAO,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,EACtC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,eAAe,CAAC,CAAC,CAAC,EAAE,CAuBtB"}
@@ -0,0 +1,22 @@
1
+ /** Choose narrow-mode columns without changing their declared display order. */
2
+ export function responsiveColumns(columns, width, minimumWidth) {
3
+ const target = Number.isFinite(minimumWidth) && minimumWidth > 0 ? minimumWidth : 160;
4
+ const budget = Math.max(1, Math.floor(Math.max(0, width) / target));
5
+ const retained = new Set(columns
6
+ .filter((column) => column.responsive?.keepVisible)
7
+ .map((column) => column.id));
8
+ const ranked = columns
9
+ .map((column, index) => ({ column, index }))
10
+ .sort((a, b) => {
11
+ const priority = (column) => Number.isFinite(column.responsive?.priority)
12
+ ? (column.responsive?.priority ?? 0)
13
+ : 0;
14
+ return priority(b.column) - priority(a.column) || a.index - b.index;
15
+ });
16
+ for (const { column } of ranked) {
17
+ if (retained.size >= budget)
18
+ break;
19
+ retained.add(column.id);
20
+ }
21
+ return columns.filter((column) => retained.has(column.id));
22
+ }