@svgrid/grid 1.2.34 → 2.0.1

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 (444) hide show
  1. package/README.md +6 -5
  2. package/dist/SvAccordion.svelte +109 -0
  3. package/dist/SvAccordion.svelte.d.ts +28 -0
  4. package/dist/SvAlert.svelte +92 -0
  5. package/dist/SvAlert.svelte.d.ts +27 -0
  6. package/dist/SvAutoComplete.svelte +47 -18
  7. package/dist/SvAutoComplete.svelte.d.ts +2 -5
  8. package/dist/SvAvatar.svelte +75 -0
  9. package/dist/SvAvatar.svelte.d.ts +14 -0
  10. package/dist/SvAvatarGroup.svelte +48 -0
  11. package/dist/SvAvatarGroup.svelte.d.ts +16 -0
  12. package/dist/SvBadge.svelte +54 -0
  13. package/dist/SvBadge.svelte.d.ts +23 -0
  14. package/dist/SvBreadcrumb.svelte +88 -0
  15. package/dist/SvBreadcrumb.svelte.d.ts +23 -0
  16. package/dist/SvButtonGroup.svelte +121 -0
  17. package/dist/SvButtonGroup.svelte.d.ts +16 -0
  18. package/dist/SvCalendar.svelte +72 -9
  19. package/dist/SvCalendar.svelte.d.ts +34 -1
  20. package/dist/SvCard.svelte +71 -0
  21. package/dist/SvCard.svelte.d.ts +28 -0
  22. package/dist/SvCarousel.svelte +134 -0
  23. package/dist/SvCarousel.svelte.d.ts +28 -0
  24. package/dist/SvCheckBox.svelte +36 -21
  25. package/dist/SvCheckBox.svelte.d.ts +2 -5
  26. package/dist/SvChip.svelte +88 -0
  27. package/dist/SvChip.svelte.d.ts +31 -0
  28. package/dist/SvCircularProgress.svelte +109 -0
  29. package/dist/SvCircularProgress.svelte.d.ts +31 -0
  30. package/dist/SvColorInput.svelte +54 -27
  31. package/dist/SvColorInput.svelte.d.ts +10 -6
  32. package/dist/SvComboBox.svelte +119 -33
  33. package/dist/SvComboBox.svelte.d.ts +18 -6
  34. package/dist/SvCommand.svelte +197 -0
  35. package/dist/SvCommand.svelte.d.ts +26 -0
  36. package/dist/SvContextMenu.svelte +96 -0
  37. package/dist/SvContextMenu.svelte.d.ts +25 -0
  38. package/dist/SvCountryInput.svelte +56 -21
  39. package/dist/SvCountryInput.svelte.d.ts +9 -5
  40. package/dist/SvDateRangeInput.svelte +256 -0
  41. package/dist/SvDateRangeInput.svelte.d.ts +37 -0
  42. package/dist/SvDateTimePicker.svelte +57 -20
  43. package/dist/SvDateTimePicker.svelte.d.ts +12 -4
  44. package/dist/SvDivider.svelte +61 -0
  45. package/dist/SvDivider.svelte.d.ts +22 -0
  46. package/dist/SvDrawer.svelte +226 -0
  47. package/dist/SvDrawer.svelte.d.ts +43 -0
  48. package/dist/SvDropDownList.svelte +114 -35
  49. package/dist/SvDropDownList.svelte.d.ts +7 -6
  50. package/dist/SvDurationInput.svelte +108 -0
  51. package/dist/SvDurationInput.svelte.d.ts +15 -0
  52. package/dist/SvEmptyState.svelte +59 -0
  53. package/dist/SvEmptyState.svelte.d.ts +25 -0
  54. package/dist/SvField.svelte +85 -0
  55. package/dist/SvField.svelte.d.ts +30 -0
  56. package/dist/SvFileUpload.svelte +169 -0
  57. package/dist/SvFileUpload.svelte.d.ts +24 -0
  58. package/dist/SvForm.svelte +7 -1
  59. package/dist/SvForm.svelte.d.ts +3 -0
  60. package/dist/SvGauge.svelte +7 -1
  61. package/dist/SvGauge.svelte.d.ts +11 -0
  62. package/dist/SvGrid.controller.svelte.d.ts +6 -0
  63. package/dist/SvGrid.controller.svelte.js +64 -9
  64. package/dist/SvGrid.css +33 -0
  65. package/dist/SvGrid.svelte +116 -3
  66. package/dist/SvGrid.types.d.ts +366 -0
  67. package/dist/SvGridBoard.svelte +2281 -0
  68. package/dist/SvGridBoard.svelte.d.ts +31 -0
  69. package/dist/SvGridDropdown.svelte +2 -1
  70. package/dist/SvGridSelect.svelte +255 -0
  71. package/dist/SvGridSelect.svelte.d.ts +32 -0
  72. package/dist/SvGroupCell.svelte +109 -0
  73. package/dist/SvGroupCell.svelte.d.ts +41 -0
  74. package/dist/SvListBox.svelte +123 -36
  75. package/dist/SvListBox.svelte.d.ts +12 -8
  76. package/dist/SvMaskedInput.svelte +53 -13
  77. package/dist/SvMaskedInput.svelte.d.ts +16 -6
  78. package/dist/SvMenu.svelte +101 -0
  79. package/dist/SvMenu.svelte.d.ts +26 -0
  80. package/dist/SvMenuList.svelte +143 -0
  81. package/dist/SvMenuList.svelte.d.ts +24 -0
  82. package/dist/SvModal.svelte +220 -0
  83. package/dist/SvModal.svelte.d.ts +31 -0
  84. package/dist/SvMultiSelect.svelte +277 -0
  85. package/dist/SvMultiSelect.svelte.d.ts +31 -0
  86. package/dist/SvNavPane.svelte +314 -0
  87. package/dist/SvNavPane.svelte.d.ts +59 -0
  88. package/dist/SvNumberInput.svelte +23 -9
  89. package/dist/SvNumberInput.svelte.d.ts +2 -0
  90. package/dist/SvOtpInput.svelte +157 -0
  91. package/dist/SvOtpInput.svelte.d.ts +16 -0
  92. package/dist/SvPagination.svelte +100 -0
  93. package/dist/SvPagination.svelte.d.ts +16 -0
  94. package/dist/SvPasswordInput.svelte +42 -12
  95. package/dist/SvPasswordInput.svelte.d.ts +13 -6
  96. package/dist/SvPhoneInput.svelte +43 -11
  97. package/dist/SvPhoneInput.svelte.d.ts +10 -11
  98. package/dist/SvPopover.svelte +127 -0
  99. package/dist/SvPopover.svelte.d.ts +35 -0
  100. package/dist/SvProgress.svelte +116 -0
  101. package/dist/SvProgress.svelte.d.ts +32 -0
  102. package/dist/SvRadioGroup.svelte +40 -22
  103. package/dist/SvRadioGroup.svelte.d.ts +2 -10
  104. package/dist/SvRating.svelte +51 -30
  105. package/dist/SvRating.svelte.d.ts +10 -7
  106. package/dist/SvRichText.svelte +192 -0
  107. package/dist/SvRichText.svelte.d.ts +16 -0
  108. package/dist/SvRowGroupPanel.svelte +147 -0
  109. package/dist/SvRowGroupPanel.svelte.d.ts +17 -0
  110. package/dist/SvScrollArea.svelte +50 -0
  111. package/dist/SvScrollArea.svelte.d.ts +22 -0
  112. package/dist/SvSkeleton.svelte +76 -0
  113. package/dist/SvSkeleton.svelte.d.ts +25 -0
  114. package/dist/SvSlider.svelte +41 -9
  115. package/dist/SvSlider.svelte.d.ts +4 -4
  116. package/dist/SvSparkline.svelte +77 -0
  117. package/dist/SvSparkline.svelte.d.ts +28 -0
  118. package/dist/SvSplitter.svelte +138 -0
  119. package/dist/SvSplitter.svelte.d.ts +32 -0
  120. package/dist/SvStat.svelte +86 -0
  121. package/dist/SvStat.svelte.d.ts +30 -0
  122. package/dist/SvStepper.svelte +91 -0
  123. package/dist/SvStepper.svelte.d.ts +24 -0
  124. package/dist/SvSwitchButton.svelte +39 -24
  125. package/dist/SvSwitchButton.svelte.d.ts +2 -5
  126. package/dist/SvTabs.svelte +147 -28
  127. package/dist/SvTabs.svelte.d.ts +16 -4
  128. package/dist/SvTagsInput.svelte +59 -22
  129. package/dist/SvTagsInput.svelte.d.ts +9 -4
  130. package/dist/SvTextArea.svelte +113 -0
  131. package/dist/SvTextArea.svelte.d.ts +18 -0
  132. package/dist/SvTextInput.svelte +115 -0
  133. package/dist/SvTextInput.svelte.d.ts +20 -0
  134. package/dist/SvTimePicker.svelte +19 -5
  135. package/dist/SvTimePicker.svelte.d.ts +12 -0
  136. package/dist/SvTimeline.svelte +75 -0
  137. package/dist/SvTimeline.svelte.d.ts +24 -0
  138. package/dist/SvToaster.svelte +124 -0
  139. package/dist/SvToaster.svelte.d.ts +10 -0
  140. package/dist/SvToggleButton.svelte +37 -12
  141. package/dist/SvToggleButton.svelte.d.ts +2 -4
  142. package/dist/SvTooltip.svelte +113 -0
  143. package/dist/SvTooltip.svelte.d.ts +22 -0
  144. package/dist/SvTour.svelte +151 -0
  145. package/dist/SvTour.svelte.d.ts +25 -0
  146. package/dist/SvTree.svelte +286 -44
  147. package/dist/SvTree.svelte.d.ts +26 -9
  148. package/dist/SvTreeSelect.svelte +222 -0
  149. package/dist/SvTreeSelect.svelte.d.ts +24 -0
  150. package/dist/a11y/dismissable.d.ts +32 -0
  151. package/dist/a11y/dismissable.js +54 -0
  152. package/dist/a11y/focus-trap.d.ts +39 -0
  153. package/dist/a11y/focus-trap.js +142 -0
  154. package/dist/a11y/live-region.d.ts +8 -0
  155. package/dist/a11y/live-region.js +60 -0
  156. package/dist/a11y/scroll-lock.d.ts +4 -0
  157. package/dist/a11y/scroll-lock.js +41 -0
  158. package/dist/a11y.d.ts +3 -1
  159. package/dist/a11y.js +1 -1
  160. package/dist/avatar.d.ts +10 -0
  161. package/dist/avatar.js +22 -0
  162. package/dist/builtin-editors.d.ts +5 -0
  163. package/dist/builtin-editors.js +55 -0
  164. package/dist/cdn/svgrid.js +16021 -8234
  165. package/dist/cdn/svgrid.svelte-external.js +14542 -6764
  166. package/dist/columns.js +3 -2
  167. package/dist/core.d.ts +7 -1
  168. package/dist/countries.d.ts +12 -0
  169. package/dist/countries.js +24 -0
  170. package/dist/createAccordion.svelte.d.ts +71 -0
  171. package/dist/createAccordion.svelte.js +99 -0
  172. package/dist/createAutocomplete.svelte.d.ts +13 -4
  173. package/dist/createAutocomplete.svelte.js +11 -1
  174. package/dist/createButtonGroup.svelte.d.ts +62 -0
  175. package/dist/createButtonGroup.svelte.js +154 -0
  176. package/dist/createCalendar.svelte.d.ts +5 -0
  177. package/dist/createCalendar.svelte.js +2 -0
  178. package/dist/createCheckbox.svelte.d.ts +9 -17
  179. package/dist/createCheckbox.svelte.js +28 -1
  180. package/dist/createColorInput.svelte.d.ts +12 -22
  181. package/dist/createColorInput.svelte.js +13 -0
  182. package/dist/createCombobox.svelte.d.ts +16 -5
  183. package/dist/createCombobox.svelte.js +13 -2
  184. package/dist/createCountryInput.svelte.d.ts +14 -3
  185. package/dist/createCountryInput.svelte.js +12 -2
  186. package/dist/createDateTimePicker.svelte.d.ts +17 -2
  187. package/dist/createDateTimePicker.svelte.js +12 -2
  188. package/dist/createDropdownList.svelte.d.ts +14 -5
  189. package/dist/createDropdownList.svelte.js +50 -1
  190. package/dist/createFileUpload.svelte.d.ts +68 -0
  191. package/dist/createFileUpload.svelte.js +122 -0
  192. package/dist/createListbox.svelte.d.ts +10 -1
  193. package/dist/createListbox.svelte.js +48 -1
  194. package/dist/createMaskedInput.svelte.d.ts +11 -2
  195. package/dist/createMaskedInput.svelte.js +11 -1
  196. package/dist/createNumberInput.svelte.d.ts +1 -0
  197. package/dist/createNumberInput.svelte.js +1 -0
  198. package/dist/createPasswordInput.svelte.d.ts +19 -21
  199. package/dist/createPasswordInput.svelte.js +16 -4
  200. package/dist/createPhoneInput.svelte.d.ts +26 -7
  201. package/dist/createPhoneInput.svelte.js +24 -3
  202. package/dist/createPopoverSelect.svelte.d.ts +86 -0
  203. package/dist/createPopoverSelect.svelte.js +196 -0
  204. package/dist/createRadioGroup.svelte.d.ts +9 -0
  205. package/dist/createRadioGroup.svelte.js +11 -1
  206. package/dist/createRating.svelte.d.ts +11 -0
  207. package/dist/createRating.svelte.js +12 -1
  208. package/dist/createSlider.svelte.d.ts +2 -0
  209. package/dist/createSlider.svelte.js +16 -5
  210. package/dist/createSplitter.svelte.d.ts +67 -0
  211. package/dist/createSplitter.svelte.js +99 -0
  212. package/dist/createSwitch.svelte.d.ts +9 -16
  213. package/dist/createSwitch.svelte.js +28 -1
  214. package/dist/createTabs.svelte.d.ts +7 -0
  215. package/dist/createTabs.svelte.js +17 -2
  216. package/dist/createTagsInput.svelte.d.ts +13 -1
  217. package/dist/createTagsInput.svelte.js +12 -3
  218. package/dist/createToggle.svelte.d.ts +9 -0
  219. package/dist/createToggle.svelte.js +12 -1
  220. package/dist/createTree.svelte.d.ts +19 -0
  221. package/dist/createTree.svelte.js +108 -15
  222. package/dist/debounce.d.ts +11 -0
  223. package/dist/debounce.js +30 -0
  224. package/dist/duration.d.ts +15 -0
  225. package/dist/duration.js +51 -0
  226. package/dist/editor-contract.d.ts +62 -7
  227. package/dist/editor-contract.js +45 -5
  228. package/dist/editor-registry.d.ts +67 -0
  229. package/dist/editor-registry.js +38 -0
  230. package/dist/editors/cell-editors.d.ts +1 -1
  231. package/dist/editors/cell-editors.js +5 -0
  232. package/dist/fuzzy.d.ts +3 -0
  233. package/dist/fuzzy.js +41 -0
  234. package/dist/grid-select.d.ts +9 -0
  235. package/dist/grid-select.js +8 -0
  236. package/dist/index.d.ts +79 -6
  237. package/dist/index.js +78 -4
  238. package/dist/keyboard-handlers.js +19 -0
  239. package/dist/list-option.d.ts +36 -0
  240. package/dist/list-option.js +68 -0
  241. package/dist/otp.d.ts +16 -0
  242. package/dist/otp.js +26 -0
  243. package/dist/paginate.d.ts +20 -0
  244. package/dist/paginate.js +40 -0
  245. package/dist/popover.d.ts +15 -1
  246. package/dist/popover.js +29 -3
  247. package/dist/recurrence.d.ts +36 -0
  248. package/dist/recurrence.js +90 -0
  249. package/dist/server-data-source.d.ts +89 -0
  250. package/dist/server-data-source.js +4 -0
  251. package/dist/server-group-model.d.ts +98 -0
  252. package/dist/server-group-model.js +263 -0
  253. package/dist/toast-store.svelte.d.ts +41 -0
  254. package/dist/toast-store.svelte.js +113 -0
  255. package/dist/tree-select.d.ts +19 -0
  256. package/dist/tree-select.js +40 -0
  257. package/dist/ui-app.types.d.ts +80 -0
  258. package/dist/ui-app.types.js +7 -0
  259. package/dist/validators.d.ts +43 -0
  260. package/dist/validators.js +53 -0
  261. package/dist/virtual.d.ts +35 -0
  262. package/dist/virtual.js +34 -0
  263. package/package.json +1 -1
  264. package/src/SvAccordion.svelte +109 -0
  265. package/src/SvAccordion.test.ts +66 -0
  266. package/src/SvAlert.svelte +92 -0
  267. package/src/SvAutoComplete.svelte +47 -18
  268. package/src/SvAvatar.svelte +75 -0
  269. package/src/SvAvatarGroup.svelte +48 -0
  270. package/src/SvBadge.svelte +54 -0
  271. package/src/SvBreadcrumb.svelte +88 -0
  272. package/src/SvButtonGroup.svelte +121 -0
  273. package/src/SvButtonGroup.test.ts +72 -0
  274. package/src/SvCalendar.svelte +72 -9
  275. package/src/SvCard.svelte +71 -0
  276. package/src/SvCarousel.svelte +134 -0
  277. package/src/SvCheckBox.svelte +36 -21
  278. package/src/SvChip.svelte +88 -0
  279. package/src/SvCircularProgress.svelte +109 -0
  280. package/src/SvColorInput.svelte +54 -27
  281. package/src/SvComboBox.svelte +119 -33
  282. package/src/SvCommand.svelte +197 -0
  283. package/src/SvContextMenu.svelte +96 -0
  284. package/src/SvCountryInput.svelte +56 -21
  285. package/src/SvDateRangeInput.svelte +256 -0
  286. package/src/SvDateRangeInput.test.ts +80 -0
  287. package/src/SvDateTimePicker.svelte +57 -20
  288. package/src/SvDivider.svelte +61 -0
  289. package/src/SvDrawer.svelte +226 -0
  290. package/src/SvDrawer.test.ts +125 -0
  291. package/src/SvDropDownList.svelte +114 -35
  292. package/src/SvDurationInput.svelte +108 -0
  293. package/src/SvEmptyState.svelte +59 -0
  294. package/src/SvField.svelte +85 -0
  295. package/src/SvFileUpload.svelte +169 -0
  296. package/src/SvFileUpload.test.ts +59 -0
  297. package/src/SvForm.svelte +7 -1
  298. package/src/SvGauge.svelte +7 -1
  299. package/src/SvGrid.controller.svelte.ts +68 -9
  300. package/src/SvGrid.css +33 -0
  301. package/src/SvGrid.svelte +116 -3
  302. package/src/SvGrid.types.ts +374 -0
  303. package/src/SvGridBoard.svelte +2281 -0
  304. package/src/SvGridDropdown.svelte +2 -1
  305. package/src/SvGridSelect.svelte +255 -0
  306. package/src/SvGridSelect.test.ts +100 -0
  307. package/src/SvGroupCell.svelte +109 -0
  308. package/src/SvListBox.svelte +123 -36
  309. package/src/SvMaskedInput.svelte +53 -13
  310. package/src/SvMenu.svelte +101 -0
  311. package/src/SvMenu.test.ts +73 -0
  312. package/src/SvMenuList.svelte +143 -0
  313. package/src/SvModal.svelte +220 -0
  314. package/src/SvMultiSelect.svelte +277 -0
  315. package/src/SvMultiSelect.test.ts +167 -0
  316. package/src/SvNavPane.svelte +314 -0
  317. package/src/SvNavPane.test.ts +70 -0
  318. package/src/SvNumberInput.svelte +23 -9
  319. package/src/SvOtpInput.svelte +157 -0
  320. package/src/SvPagination.svelte +100 -0
  321. package/src/SvPasswordInput.svelte +42 -12
  322. package/src/SvPhoneInput.svelte +43 -11
  323. package/src/SvPopover.svelte +127 -0
  324. package/src/SvProgress.svelte +116 -0
  325. package/src/SvRadioGroup.svelte +40 -22
  326. package/src/SvRating.svelte +51 -30
  327. package/src/SvRichText.svelte +192 -0
  328. package/src/SvRowGroupPanel.svelte +147 -0
  329. package/src/SvScrollArea.svelte +50 -0
  330. package/src/SvSkeleton.svelte +76 -0
  331. package/src/SvSlider.svelte +41 -9
  332. package/src/SvSparkline.svelte +77 -0
  333. package/src/SvSplitter.svelte +138 -0
  334. package/src/SvSplitter.test.ts +55 -0
  335. package/src/SvStat.svelte +86 -0
  336. package/src/SvStepper.svelte +91 -0
  337. package/src/SvSwitchButton.svelte +39 -24
  338. package/src/SvTabs.svelte +147 -28
  339. package/src/SvTagsInput.svelte +59 -22
  340. package/src/SvTextArea.svelte +113 -0
  341. package/src/SvTextInput.svelte +115 -0
  342. package/src/SvTimePicker.svelte +19 -5
  343. package/src/SvTimeline.svelte +75 -0
  344. package/src/SvToaster.svelte +124 -0
  345. package/src/SvToaster.test.ts +63 -0
  346. package/src/SvToggleButton.svelte +37 -12
  347. package/src/SvTooltip.svelte +113 -0
  348. package/src/SvTour.svelte +151 -0
  349. package/src/SvTree.svelte +286 -44
  350. package/src/SvTreeSelect.svelte +222 -0
  351. package/src/SvTreeSelect.test.ts +87 -0
  352. package/src/a11y/dismissable.test.ts +95 -0
  353. package/src/a11y/dismissable.ts +94 -0
  354. package/src/a11y/focus-trap.test.ts +110 -0
  355. package/src/a11y/focus-trap.ts +134 -0
  356. package/src/a11y/live-region.test.ts +40 -0
  357. package/src/a11y/live-region.ts +65 -0
  358. package/src/a11y/scroll-lock.test.ts +38 -0
  359. package/src/a11y/scroll-lock.ts +41 -0
  360. package/src/a11y.ts +3 -1
  361. package/src/avatar.test.ts +32 -0
  362. package/src/avatar.ts +21 -0
  363. package/src/board.test.ts +927 -0
  364. package/src/builtin-editors.grid.test.ts +85 -0
  365. package/src/builtin-editors.test.ts +58 -0
  366. package/src/builtin-editors.ts +56 -0
  367. package/src/columns.ts +3 -2
  368. package/src/core.ts +10 -0
  369. package/src/countries.ts +25 -0
  370. package/src/createAccordion.svelte.ts +126 -0
  371. package/src/createAutocomplete.svelte.ts +18 -1
  372. package/src/createButtonGroup.svelte.ts +166 -0
  373. package/src/createCalendar.svelte.ts +6 -0
  374. package/src/createCheckbox.svelte.ts +23 -1
  375. package/src/createColorInput.svelte.ts +20 -0
  376. package/src/createCombobox.svelte.ts +22 -2
  377. package/src/createCountryInput.svelte.ts +21 -2
  378. package/src/createDateTimePicker.svelte.ts +23 -2
  379. package/src/createDropdownList.svelte.ts +31 -2
  380. package/src/createFileUpload.svelte.ts +144 -0
  381. package/src/createListbox.svelte.ts +35 -3
  382. package/src/createMaskedInput.svelte.ts +18 -1
  383. package/src/createNumberInput.svelte.ts +2 -0
  384. package/src/createPasswordInput.svelte.ts +31 -5
  385. package/src/createPhoneInput.svelte.ts +38 -4
  386. package/src/createPopoverSelect.svelte.ts +208 -0
  387. package/src/createRadioGroup.svelte.ts +23 -1
  388. package/src/createRating.svelte.ts +26 -1
  389. package/src/createSlider.svelte.ts +14 -3
  390. package/src/createSplitter.svelte.ts +119 -0
  391. package/src/createSwitch.svelte.ts +26 -3
  392. package/src/createTabs.svelte.ts +20 -3
  393. package/src/createTagsInput.svelte.ts +24 -3
  394. package/src/createToggle.svelte.ts +25 -2
  395. package/src/createTree.svelte.ts +104 -14
  396. package/src/debounce.test.ts +50 -0
  397. package/src/debounce.ts +41 -0
  398. package/src/duration.test.ts +41 -0
  399. package/src/duration.ts +51 -0
  400. package/src/editor-contract.ts +87 -8
  401. package/src/editor-registry.grid.test.ts +98 -0
  402. package/src/editor-registry.test.ts +86 -0
  403. package/src/editor-registry.ts +106 -0
  404. package/src/editors/cell-editors.ts +10 -1
  405. package/src/fuzzy.test.ts +40 -0
  406. package/src/fuzzy.ts +39 -0
  407. package/src/grid-select.test.ts +28 -0
  408. package/src/grid-select.ts +20 -0
  409. package/src/index.ts +150 -5
  410. package/src/keyboard-handlers.ts +20 -0
  411. package/src/list-option.ts +74 -0
  412. package/src/list-power.test.ts +71 -0
  413. package/src/otp.test.ts +28 -0
  414. package/src/otp.ts +28 -0
  415. package/src/overlays.test.ts +85 -0
  416. package/src/paginate.test.ts +41 -0
  417. package/src/paginate.ts +61 -0
  418. package/src/phone-valid.test.ts +26 -0
  419. package/src/popover.ts +31 -3
  420. package/src/progress.test.ts +55 -0
  421. package/src/recurrence.test.ts +91 -0
  422. package/src/recurrence.ts +111 -0
  423. package/src/server-data-source.ts +102 -0
  424. package/src/server-group-model.test.ts +294 -0
  425. package/src/server-group-model.ts +370 -0
  426. package/src/svgrid.responsive.test.ts +72 -0
  427. package/src/toast-store.svelte.ts +148 -0
  428. package/src/toast-store.test.ts +86 -0
  429. package/src/tree-edit.test.ts +49 -0
  430. package/src/tree-filter.test.ts +56 -0
  431. package/src/tree-select.test.ts +48 -0
  432. package/src/tree-select.ts +62 -0
  433. package/src/ui-app.test.ts +130 -0
  434. package/src/ui-app.types.ts +88 -0
  435. package/src/ui-display.test.ts +79 -0
  436. package/src/ui-inputs.test.ts +1 -1
  437. package/src/ui-status.test.ts +141 -0
  438. package/src/ui-tier1.test.ts +142 -0
  439. package/src/ui-tier2.test.ts +124 -0
  440. package/src/ui-tier3.test.ts +139 -0
  441. package/src/validators.test.ts +58 -0
  442. package/src/validators.ts +105 -0
  443. package/src/virtual.test.ts +72 -0
  444. package/src/virtual.ts +67 -0
@@ -0,0 +1,169 @@
1
+ <script lang="ts" module>
2
+ export type { FileRejection, FileRejectReason } from './createFileUpload.svelte'
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ /**
7
+ * SvFileUpload - a drag-and-drop file field with a click-to-browse fallback,
8
+ * accept / size / count validation and a selected-files list. Parity: Smart
9
+ * `smart-file-upload`. Controlled via `files` + `onChange`.
10
+ *
11
+ * Part of the editor kit: carries the shared contract (label, hint, error
12
+ * validation, `dir`/RTL and localizable `messages`) via `<SvField>`. The
13
+ * drag/validation/state live in the headless `createFileUpload` core.
14
+ */
15
+ import SvField from './SvField.svelte'
16
+ import { nextEditorId, resolveMessages, type SvEditorProps } from './editor-contract'
17
+ import { createFileUpload, type FileRejection } from './createFileUpload.svelte'
18
+
19
+ /** User-facing strings (localizable via `messages`). */
20
+ type FileMessages = { prompt: string; browse: string; remove: string; hintTypes: string }
21
+ const DEFAULT_MESSAGES: FileMessages = {
22
+ prompt: 'Drag files here or', browse: 'browse', remove: 'Remove', hintTypes: 'Accepted:',
23
+ }
24
+
25
+ type Props = SvEditorProps & {
26
+ files?: File[]
27
+ onChange?: (files: File[]) => void
28
+ onReject?: (rejections: FileRejection[]) => void
29
+ accept?: string
30
+ multiple?: boolean
31
+ /** Max size per file in bytes. */
32
+ maxSize?: number
33
+ maxFiles?: number
34
+ messages?: Partial<FileMessages>
35
+ }
36
+
37
+ let {
38
+ files = $bindable([]),
39
+ onChange,
40
+ onReject,
41
+ accept,
42
+ multiple = false,
43
+ maxSize,
44
+ maxFiles,
45
+ disabled = false,
46
+ readonly = false,
47
+ ariaLabel,
48
+ invalid = false,
49
+ required = false,
50
+ error,
51
+ label,
52
+ hint,
53
+ dir,
54
+ id,
55
+ messages,
56
+ }: Props = $props()
57
+
58
+ const autoId = nextEditorId('sv-file')
59
+ const uid = $derived(id ?? autoId)
60
+ const M = $derived(resolveMessages(DEFAULT_MESSAGES, messages))
61
+
62
+ const fu = createFileUpload({
63
+ files: () => files,
64
+ onChange: (f) => { files = f; onChange?.(f) },
65
+ onReject: (r) => onReject?.(r),
66
+ accept: () => accept,
67
+ multiple: () => multiple,
68
+ maxSize: () => maxSize,
69
+ maxFiles: () => maxFiles,
70
+ disabled: () => disabled,
71
+ readonly: () => readonly,
72
+ id: () => uid,
73
+ invalid: () => invalid,
74
+ required: () => required,
75
+ error: () => error,
76
+ hint: () => hint,
77
+ ariaLabel: () => ariaLabel,
78
+ })
79
+
80
+ let inputEl = $state<HTMLInputElement | null>(null)
81
+
82
+ function openPicker() { if (fu.isInteractive) inputEl?.click() }
83
+ function onDropzoneKey(e: KeyboardEvent) {
84
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openPicker() }
85
+ }
86
+ function onInputChange(e: Event) {
87
+ const list = (e.currentTarget as HTMLInputElement).files
88
+ if (list) fu.addFiles([...list])
89
+ ;(e.currentTarget as HTMLInputElement).value = '' // allow re-selecting the same file
90
+ }
91
+ function onDrop(e: DragEvent) {
92
+ e.preventDefault()
93
+ fu.setDragging(false)
94
+ if (e.dataTransfer?.files) fu.addFiles([...e.dataTransfer.files])
95
+ }
96
+
97
+ const fmtSize = (n: number) => (n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1048576).toFixed(1)} MB`)
98
+ </script>
99
+
100
+ <SvField id={uid} {label} {hint} {error} {required} {dir}>
101
+ <div class="sv-file" class:is-disabled={disabled}>
102
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
103
+ <div
104
+ class="sv-file__zone"
105
+ class:is-dragging={fu.dragging}
106
+ class:is-invalid={invalid}
107
+ {...fu.dropzoneProps()}
108
+ onclick={openPicker}
109
+ onkeydown={onDropzoneKey}
110
+ ondragenter={(e) => { e.preventDefault(); fu.setDragging(true) }}
111
+ ondragover={(e) => { e.preventDefault(); fu.setDragging(true) }}
112
+ ondragleave={() => fu.setDragging(false)}
113
+ ondrop={onDrop}
114
+ >
115
+ <svg class="sv-file__icon" viewBox="0 0 24 24" width="26" height="26" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" /></svg>
116
+ <p class="sv-file__prompt">{M.prompt} <span class="sv-file__browse">{M.browse}</span></p>
117
+ {#if accept}<p class="sv-file__types">{M.hintTypes} {accept}</p>{/if}
118
+ <input bind:this={inputEl} class="sv-file__input" {...fu.inputProps()} onchange={onInputChange} />
119
+ </div>
120
+
121
+ {#if files.length}
122
+ <ul class="sv-file__list">
123
+ {#each files as file, i (file.name + file.size + i)}
124
+ <li class="sv-file__item">
125
+ <span class="sv-file__name" title={file.name}>{file.name}</span>
126
+ <span class="sv-file__size">{fmtSize(file.size)}</span>
127
+ {#if fu.isInteractive}
128
+ <button class="sv-file__remove" aria-label={`${M.remove} ${file.name}`} {...fu.removeProps(i)}>&times;</button>
129
+ {/if}
130
+ </li>
131
+ {/each}
132
+ </ul>
133
+ {/if}
134
+ </div>
135
+ </SvField>
136
+
137
+ <style>
138
+ .sv-file {
139
+ --_accent: var(--sg-accent, #2563eb);
140
+ --_border: var(--sg-input-border, var(--sg-border, #cbd5e1));
141
+ --_radius: var(--sg-radius, 8px);
142
+ display: flex; flex-direction: column; gap: 8px; width: 320px; color: var(--sg-fg, #0f172a);
143
+ }
144
+ .sv-file.is-disabled { opacity: 0.6; }
145
+ .sv-file__zone {
146
+ display: flex; flex-direction: column; align-items: center; gap: 4px;
147
+ padding: 22px 16px; text-align: center; cursor: pointer;
148
+ background: var(--sg-input-bg, #fff); color: var(--sg-muted, #64748b);
149
+ border: 1.5px dashed var(--_border); border-radius: var(--_radius); transition: border-color 0.15s, background 0.15s;
150
+ }
151
+ .sv-file__zone:hover, .sv-file__zone:focus-visible { border-color: var(--_accent); outline: none; }
152
+ .sv-file__zone.is-dragging { border-color: var(--_accent); background: color-mix(in srgb, var(--_accent) 8%, transparent); color: var(--_accent); }
153
+ .sv-file__zone.is-invalid { border-color: var(--sg-danger, #dc2626); }
154
+ .sv-file__icon { color: var(--_accent); }
155
+ .sv-file__prompt { margin: 0; font-size: 13px; }
156
+ .sv-file__browse { color: var(--_accent); font-weight: 650; text-decoration: underline; }
157
+ .sv-file__types { margin: 0; font-size: 11.5px; opacity: 0.8; }
158
+ .sv-file__input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }
159
+
160
+ .sv-file__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
161
+ .sv-file__item {
162
+ display: flex; align-items: center; gap: 8px; padding: 6px 8px; font-size: 12.5px;
163
+ background: var(--sg-header-bg, #f8fafc); border: 1px solid var(--sg-border, #e2e8f0); border-radius: 6px;
164
+ }
165
+ .sv-file__name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 550; }
166
+ .sv-file__size { color: var(--sg-muted, #64748b); flex: none; font-variant-numeric: tabular-nums; }
167
+ .sv-file__remove { flex: none; background: none; border: 0; color: var(--sg-muted, #64748b); cursor: pointer; font-size: 16px; line-height: 1; padding: 0 2px; }
168
+ .sv-file__remove:hover { color: var(--sg-danger, #dc2626); }
169
+ </style>
@@ -0,0 +1,24 @@
1
+ export type { FileRejection, FileRejectReason } from './createFileUpload.svelte';
2
+ import { type SvEditorProps } from './editor-contract';
3
+ import { type FileRejection } from './createFileUpload.svelte';
4
+ /** User-facing strings (localizable via `messages`). */
5
+ type FileMessages = {
6
+ prompt: string;
7
+ browse: string;
8
+ remove: string;
9
+ hintTypes: string;
10
+ };
11
+ type Props = SvEditorProps & {
12
+ files?: File[];
13
+ onChange?: (files: File[]) => void;
14
+ onReject?: (rejections: FileRejection[]) => void;
15
+ accept?: string;
16
+ multiple?: boolean;
17
+ /** Max size per file in bytes. */
18
+ maxSize?: number;
19
+ maxFiles?: number;
20
+ messages?: Partial<FileMessages>;
21
+ };
22
+ declare const SvFileUpload: import("svelte").Component<Props, {}, "files">;
23
+ type SvFileUpload = ReturnType<typeof SvFileUpload>;
24
+ export default SvFileUpload;
@@ -1,4 +1,6 @@
1
1
  <script lang="ts" module>
2
+ import type { Validator } from './validators'
3
+
2
4
  export type FormFieldType =
3
5
  | 'text' | 'email' | 'tel' | 'textarea' | 'number' | 'password'
4
6
  | 'select' | 'checkbox' | 'switch' | 'date' | 'color' | 'rating'
@@ -10,6 +12,8 @@
10
12
  required?: boolean
11
13
  placeholder?: string
12
14
  options?: Array<{ value: string | number; label: string }>
15
+ /** Declarative validation rules (see `rules` - email/pattern/min/compare...). */
16
+ rules?: ReadonlyArray<Validator>
13
17
  /** Return an error message, or null/undefined when valid. */
14
18
  validate?: (value: any, values: Record<string, any>) => string | null | undefined
15
19
  /** Span full width in the grid. */
@@ -32,6 +36,7 @@
32
36
  import SvColorInput from './SvColorInput.svelte'
33
37
  import SvRating from './SvRating.svelte'
34
38
  import SvButton from './SvButton.svelte'
39
+ import { runRules } from './validators'
35
40
 
36
41
  type Props = {
37
42
  fields: ReadonlyArray<FormField>
@@ -64,7 +69,8 @@
64
69
  const v = values[name]
65
70
  let err: string | null | undefined = null
66
71
  if (field.required && (v == null || v === '' || (Array.isArray(v) && !v.length))) err = `${field.label} is required`
67
- else if (field.validate) err = field.validate(v, values)
72
+ if (!err && field.rules) err = runRules(v, field.rules, values)
73
+ if (!err && field.validate) err = field.validate(v, values)
68
74
  const next = { ...errors }
69
75
  if (err) next[name] = err
70
76
  else delete next[name]
@@ -1,3 +1,4 @@
1
+ import type { Validator } from './validators';
1
2
  export type FormFieldType = 'text' | 'email' | 'tel' | 'textarea' | 'number' | 'password' | 'select' | 'checkbox' | 'switch' | 'date' | 'color' | 'rating';
2
3
  export type FormField = {
3
4
  name: string;
@@ -9,6 +10,8 @@ export type FormField = {
9
10
  value: string | number;
10
11
  label: string;
11
12
  }>;
13
+ /** Declarative validation rules (see `rules` - email/pattern/min/compare...). */
14
+ rules?: ReadonlyArray<Validator>;
12
15
  /** Return an error message, or null/undefined when valid. */
13
16
  validate?: (value: any, values: Record<string, any>) => string | null | undefined;
14
17
  /** Span full width in the grid. */
@@ -7,6 +7,7 @@
7
7
  * The arc/needle geometry + `role="meter"` ARIA live in the headless
8
8
  * `createGauge` core; this component is just one styled renderer over it.
9
9
  */
10
+ import { type EditorDir } from './editor-contract'
10
11
  import { createGauge } from './createGauge.svelte'
11
12
 
12
13
  type Band = { from: number; to: number; color: string }
@@ -28,6 +29,8 @@
28
29
  thickness?: number
29
30
  formatValue?: (v: number) => string
30
31
  ariaLabel?: string
32
+ /** Text direction for the center label / unit. */
33
+ dir?: EditorDir
31
34
  }
32
35
 
33
36
  let {
@@ -43,8 +46,11 @@
43
46
  thickness = 14,
44
47
  formatValue,
45
48
  ariaLabel,
49
+ dir,
46
50
  }: Props = $props()
47
51
 
52
+ const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
53
+
48
54
  const gauge = createGauge({
49
55
  value: () => value,
50
56
  min: () => min,
@@ -63,7 +69,7 @@
63
69
  const display = $derived(label ?? `${formatValue ? formatValue(clamped) : Math.round(clamped)}${unit}`)
64
70
  </script>
65
71
 
66
- <div class="sv-gauge" {...gauge.rootProps()}>
72
+ <div class="sv-gauge" dir={resolvedDir} {...gauge.rootProps()}>
67
73
  <svg viewBox={`0 0 ${size} ${size}`} width={size} height={size} class="sv-gauge__svg">
68
74
  <!-- track -->
69
75
  <path d={arcPath(min, max, r)} class="sv-gauge__track" fill="none" stroke-width={thickness} stroke-linecap="round" />
@@ -1,3 +1,12 @@
1
+ /**
2
+ * SvGauge - a radial arc gauge (SVG) that renders a value within [min, max]
3
+ * with optional colored threshold bands, a needle, and a center label. Parity:
4
+ * Smart `smart-gauge` (radial). Display control; theme-driven.
5
+ *
6
+ * The arc/needle geometry + `role="meter"` ARIA live in the headless
7
+ * `createGauge` core; this component is just one styled renderer over it.
8
+ */
9
+ import { type EditorDir } from './editor-contract';
1
10
  type Band = {
2
11
  from: number;
3
12
  to: number;
@@ -20,6 +29,8 @@ type Props = {
20
29
  thickness?: number;
21
30
  formatValue?: (v: number) => string;
22
31
  ariaLabel?: string;
32
+ /** Text direction for the center label / unit. */
33
+ dir?: EditorDir;
23
34
  };
24
35
  declare const SvGauge: import("svelte").Component<Props, {}, "">;
25
36
  type SvGauge = ReturnType<typeof SvGauge>;
@@ -98,6 +98,11 @@ export declare function createSvGridController<TFeatures extends TableFeatures =
98
98
  left: Array<string>;
99
99
  right: Array<string>;
100
100
  };
101
+ readonly effectivePinning: {
102
+ left: Array<string>;
103
+ right: Array<string>;
104
+ };
105
+ readonly isNarrowResponsive: boolean;
101
106
  columnVirtualizerVersion: number;
102
107
  gridStateVersion: number;
103
108
  readonly selectionColumnWidth: number;
@@ -472,6 +477,7 @@ export declare function createSvGridController<TFeatures extends TableFeatures =
472
477
  readonly buildBuckets: typeof buildBuckets;
473
478
  readonly isInBucket: typeof isInBucket;
474
479
  readonly facetBucketsByColumn: Map<string, FacetBucket[]>;
480
+ readonly serverFacetLoading: string | null;
475
481
  readonly columnMenuFacetValues: string[];
476
482
  readonly columnMenuVisibleFacets: string[];
477
483
  readonly isFacetChecked: (columnId: string, value: string) => any;
@@ -275,6 +275,24 @@ export function createSvGridController(props) {
275
275
  viewportVersion;
276
276
  return scrollContainer ? scrollContainer.clientHeight : 0;
277
277
  });
278
+ // --- responsive (narrow-container) mode ---
279
+ const responsiveBreakpoint = $derived(props.responsive && typeof props.responsive === "object" && props.responsive.breakpoint != null
280
+ ? props.responsive.breakpoint
281
+ : 640);
282
+ // Below the breakpoint: un-pin columns (pan the whole grid), suspend
283
+ // fitColumns, and hide `hideBelow` columns. Guarded on width > 0 so it never
284
+ // triggers before the grid has measured.
285
+ const isNarrowResponsive = $derived(!!props.responsive && viewportWidth > 0 && viewportWidth < responsiveBreakpoint);
286
+ const EMPTY_PINNING = { left: [], right: [] };
287
+ const effectivePinning = $derived(isNarrowResponsive ? EMPTY_PINNING : columnPinning);
288
+ // A column with `hideBelow: N` is dropped while `responsive` is on and the
289
+ // grid is narrower than N px (reads viewportWidth so it re-runs on resize).
290
+ function isHiddenByResponsive(column) {
291
+ if (!props.responsive)
292
+ return false;
293
+ const hb = column.columnDef?.hideBelow;
294
+ return hb != null && viewportWidth > 0 && viewportWidth < hb;
295
+ }
278
296
  const scrollMetrics = $derived.by(() => {
279
297
  scrollVersion;
280
298
  viewportVersion;
@@ -498,7 +516,9 @@ export function createSvGridController(props) {
498
516
  const allColumns = $derived.by(() => {
499
517
  let raw = grid
500
518
  .getAllColumns()
501
- .filter((column) => !hiddenColumns[column.id] && !hiddenByGroupCollapse[column.id]);
519
+ .filter((column) => !hiddenColumns[column.id] &&
520
+ !hiddenByGroupCollapse[column.id] &&
521
+ !isHiddenByResponsive(column));
502
522
  // Apply user reorder (if any). Unknown ids in userColumnOrder are
503
523
  // skipped; columns not in userColumnOrder keep their original
504
524
  // relative order after the user-ordered ones.
@@ -519,8 +539,8 @@ export function createSvGridController(props) {
519
539
  }
520
540
  raw = ordered;
521
541
  }
522
- const leftIds = columnPinning.left;
523
- const rightIds = columnPinning.right;
542
+ const leftIds = effectivePinning.left;
543
+ const rightIds = effectivePinning.right;
524
544
  if (!leftIds.length && !rightIds.length)
525
545
  return raw;
526
546
  const pinned = new Set([...leftIds, ...rightIds]);
@@ -659,14 +679,14 @@ export function createSvGridController(props) {
659
679
  const selectionWidth = showRowSelectionEffective ? selectionColumnWidth : 0;
660
680
  const left = {};
661
681
  let leftAcc = rowNumberWidth + selectionWidth;
662
- for (const id of columnPinning.left) {
682
+ for (const id of effectivePinning.left) {
663
683
  left[id] = leftAcc;
664
684
  leftAcc += getColumnWidth(id);
665
685
  }
666
686
  const right = {};
667
687
  let rightAcc = 0;
668
- for (let i = columnPinning.right.length - 1; i >= 0; i -= 1) {
669
- const id = columnPinning.right[i];
688
+ for (let i = effectivePinning.right.length - 1; i >= 0; i -= 1) {
689
+ const id = effectivePinning.right[i];
670
690
  if (!id)
671
691
  continue;
672
692
  right[id] = rightAcc;
@@ -1150,8 +1170,8 @@ export function createSvGridController(props) {
1150
1170
  // that edge and the window are also rendered; negligible for typical grids,
1151
1171
  // and correctness beats shaving a few off-screen cells.)
1152
1172
  const window = virtualColumns;
1153
- const hasLeft = columnPinning.left.length > 0;
1154
- const hasRight = columnPinning.right.length > 0;
1173
+ const hasLeft = effectivePinning.left.length > 0;
1174
+ const hasRight = effectivePinning.right.length > 0;
1155
1175
  if ((!hasLeft && !hasRight) || window.length === 0)
1156
1176
  return window;
1157
1177
  const firstIdx = window[0].index;
@@ -1462,7 +1482,8 @@ export function createSvGridController(props) {
1462
1482
  // Track viewport size (not scrollVersion) so we don't recompute on
1463
1483
  // every scroll - only when the container actually resizes.
1464
1484
  viewportVersion;
1465
- if (!props.fitColumns)
1485
+ // Narrow responsive mode pans instead of scaling, so skip fit scaling.
1486
+ if (!props.fitColumns || isNarrowResponsive)
1466
1487
  return null;
1467
1488
  const cols = grid.getAllColumns().filter((c) => !hiddenColumns[c.id]);
1468
1489
  if (!cols.length)
@@ -1581,12 +1602,43 @@ export function createSvGridController(props) {
1581
1602
  }
1582
1603
  return map;
1583
1604
  });
1605
+ // Server-side set-filter values: when a column's filter menu opens and the
1606
+ // consumer provides `serverFilterValues`, fetch the distinct values from the
1607
+ // server once (cached per column) instead of deriving them from the loaded
1608
+ // page - so the checklist shows every value, not just what's on screen.
1609
+ let serverFacetValues = $state({});
1610
+ let serverFacetLoading = $state(null);
1611
+ $effect(() => {
1612
+ const columnId = filterMenuFor ?? columnMenuFor;
1613
+ const fetcher = props.serverFilterValues;
1614
+ if (!columnId || !fetcher || serverFacetValues[columnId])
1615
+ return;
1616
+ serverFacetLoading = columnId;
1617
+ let cancelled = false;
1618
+ void fetcher(columnId)
1619
+ .then((values) => {
1620
+ if (cancelled)
1621
+ return;
1622
+ serverFacetValues = { ...serverFacetValues, [columnId]: values };
1623
+ serverFacetLoading = null;
1624
+ })
1625
+ .catch(() => {
1626
+ if (!cancelled)
1627
+ serverFacetLoading = null;
1628
+ });
1629
+ return () => {
1630
+ cancelled = true;
1631
+ };
1632
+ });
1584
1633
  const columnMenuFacetValues = $derived.by(() => {
1585
1634
  // The funnel popover drives via `filterMenuFor`; the column menu's Filter
1586
1635
  // tab drives via `columnMenuFor`. Support whichever is open.
1587
1636
  const columnId = filterMenuFor ?? columnMenuFor;
1588
1637
  if (!columnId)
1589
1638
  return [];
1639
+ // Server-provided distinct values win (fetched + cached above).
1640
+ if (props.serverFilterValues)
1641
+ return serverFacetValues[columnId] ?? [];
1590
1642
  const column = allColumns.find((entry) => entry.id === columnId);
1591
1643
  if (!column)
1592
1644
  return [];
@@ -1706,6 +1758,8 @@ export function createSvGridController(props) {
1706
1758
  get MIN_COLUMN_WIDTH() { return MIN_COLUMN_WIDTH; },
1707
1759
  get columnPinning() { return columnPinning; },
1708
1760
  set columnPinning(v) { columnPinning = v; },
1761
+ get effectivePinning() { return effectivePinning; },
1762
+ get isNarrowResponsive() { return isNarrowResponsive; },
1709
1763
  get columnVirtualizerVersion() { return columnVirtualizerVersion; },
1710
1764
  set columnVirtualizerVersion(v) { columnVirtualizerVersion = v; },
1711
1765
  get gridStateVersion() { return gridStateVersion; },
@@ -2006,6 +2060,7 @@ export function createSvGridController(props) {
2006
2060
  get buildBuckets() { return buildBuckets; },
2007
2061
  get isInBucket() { return isInBucket; },
2008
2062
  get facetBucketsByColumn() { return facetBucketsByColumn; },
2063
+ get serverFacetLoading() { return serverFacetLoading; },
2009
2064
  get columnMenuFacetValues() { return columnMenuFacetValues; },
2010
2065
  get columnMenuVisibleFacets() { return columnMenuVisibleFacets; },
2011
2066
  get isFacetChecked() { return isFacetChecked; },
package/dist/SvGrid.css CHANGED
@@ -730,6 +730,13 @@
730
730
  background: var(--sg-header-bg, #f5f7fb);
731
731
  }
732
732
 
733
+ /* Responsive (narrow) mode: smooth momentum touch panning, and let touch
734
+ gestures pan the grid freely (the wheel-trap contain stays for pointer). */
735
+ .sv-grid-container.sv-grid-narrow {
736
+ -webkit-overflow-scrolling: touch;
737
+ scroll-behavior: auto;
738
+ }
739
+
733
740
  .sv-grid-container {
734
741
  scrollbar-width: auto;
735
742
  -ms-overflow-style: auto;
@@ -2341,3 +2348,29 @@ select.sv-grid-fr-editor {
2341
2348
  .sv-grid-filter-operator-btn.is-open {
2342
2349
  opacity: 1;
2343
2350
  }
2351
+
2352
+ /* Kanban board mode search box (board.searchable) */
2353
+ .sv-grid-board-search {
2354
+ display: flex;
2355
+ align-items: center;
2356
+ gap: 6px;
2357
+ margin-bottom: 8px;
2358
+ padding: 5px 9px;
2359
+ border: 1px solid var(--sg-border, #e4e7ec);
2360
+ border-radius: var(--sg-radius, 8px);
2361
+ background: var(--sg-bg, #fff);
2362
+ color: color-mix(in srgb, var(--sg-fg, #101828) 55%, transparent);
2363
+ max-width: 280px;
2364
+ }
2365
+ .sv-grid-board-search:focus-within {
2366
+ border-color: var(--sg-accent, #3b82f6);
2367
+ }
2368
+ .sv-grid-board-search input {
2369
+ flex: 1 1 auto;
2370
+ border: 0;
2371
+ outline: none;
2372
+ background: transparent;
2373
+ font: inherit;
2374
+ font-size: 0.82rem;
2375
+ color: var(--sg-fg, #101828);
2376
+ }