@svgrid/grid 2.6.3 → 2.6.4

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 (414) hide show
  1. package/README.md +199 -199
  2. package/dist/FlexRender.svelte +96 -96
  3. package/dist/GridFooter.svelte +178 -178
  4. package/dist/GridMenus.svelte +705 -705
  5. package/dist/SvAutoComplete.svelte +165 -165
  6. package/dist/SvAvatar.svelte +75 -75
  7. package/dist/SvCalendar.svelte +503 -503
  8. package/dist/SvCarousel.svelte +141 -141
  9. package/dist/SvCheckBox.svelte +102 -102
  10. package/dist/SvCircularProgress.svelte +109 -109
  11. package/dist/SvColorInput.svelte +181 -181
  12. package/dist/SvComboBox.svelte +275 -275
  13. package/dist/SvContextMenu.svelte +116 -116
  14. package/dist/SvCountryInput.svelte +163 -163
  15. package/dist/SvDrawer.svelte +254 -254
  16. package/dist/SvDropDownList.svelte +374 -374
  17. package/dist/SvDurationInput.svelte +126 -126
  18. package/dist/SvField.svelte +293 -293
  19. package/dist/SvForm.svelte +437 -437
  20. package/dist/SvGrid.controller.svelte.d.ts +2 -1
  21. package/dist/SvGrid.controller.svelte.js +145 -3
  22. package/dist/SvGrid.css +2846 -2814
  23. package/dist/SvGrid.svelte +3548 -3490
  24. package/dist/SvGrid.types.d.ts +61 -0
  25. package/dist/SvGridChart.svelte +1716 -1716
  26. package/dist/SvGridChartPanel.svelte +485 -485
  27. package/dist/SvGridChartView.svelte +70 -70
  28. package/dist/SvGridDropdown.svelte +728 -728
  29. package/dist/SvGridSelect.svelte +266 -266
  30. package/dist/SvGroupCell.svelte +116 -116
  31. package/dist/SvListBox.svelte +326 -326
  32. package/dist/SvMaskedInput.svelte +122 -122
  33. package/dist/SvMenu.svelte +124 -124
  34. package/dist/SvMenuList.svelte +146 -146
  35. package/dist/SvMultiSelect.svelte +289 -289
  36. package/dist/SvNumberInput.svelte +168 -168
  37. package/dist/SvOtpInput.svelte +158 -158
  38. package/dist/SvPasswordInput.svelte +151 -151
  39. package/dist/SvPhoneInput.svelte +133 -133
  40. package/dist/SvPopover.svelte +197 -197
  41. package/dist/SvProgress.svelte +116 -116
  42. package/dist/SvRadioGroup.svelte +107 -107
  43. package/dist/SvRating.svelte +112 -112
  44. package/dist/SvResult.svelte +73 -73
  45. package/dist/SvRichText.svelte +211 -211
  46. package/dist/SvRowGroupPanel.svelte +170 -170
  47. package/dist/SvScrollArea.svelte +61 -61
  48. package/dist/SvSlider.svelte +203 -203
  49. package/dist/SvSwitchButton.svelte +108 -108
  50. package/dist/SvTagsInput.svelte +115 -115
  51. package/dist/SvTextInput.svelte +147 -147
  52. package/dist/SvTimePicker.svelte +245 -245
  53. package/dist/SvToaster.svelte +159 -159
  54. package/dist/SvToggleButton.svelte +85 -85
  55. package/dist/SvTooltip.svelte +161 -161
  56. package/dist/SvTour.svelte +208 -208
  57. package/dist/SvTree.svelte +444 -444
  58. package/dist/SvTreeSelect.svelte +235 -235
  59. package/dist/a11y/grid-announcements.d.ts +58 -0
  60. package/dist/a11y/grid-announcements.js +70 -0
  61. package/dist/advanced-filter.svelte.d.ts +42 -0
  62. package/dist/advanced-filter.svelte.js +13 -0
  63. package/dist/build-api.js +44 -2
  64. package/dist/cdn/{GridMenus-DL1zrDwf.js → GridMenus-1NLNSqWz.js} +15 -15
  65. package/dist/cdn/{GridMenus-BoVKgAv8.js → GridMenus-B2Dt25-8.js} +15 -15
  66. package/dist/cdn/{SvDateTimePicker-CHnUkWcH.js → SvDateTimePicker-DSUhIta8.js} +2 -2
  67. package/dist/cdn/{SvDateTimePicker-CRQH_U7E.js → SvDateTimePicker-h9kPyszT.js} +2 -2
  68. package/dist/cdn/{SvGridChart-BwVos976.js → SvGridChart-Bs2GIR2Q.js} +1 -1
  69. package/dist/cdn/{SvGridChart-BEJmNNx9.js → SvGridChart-CwhFz7GV.js} +1 -1
  70. package/dist/cdn/{SvGridChartPanel-BOknOkrP.js → SvGridChartPanel-1WXuStzM.js} +1 -1
  71. package/dist/cdn/{SvGridChartPanel-D2PjII4O.js → SvGridChartPanel-e5_nqNP9.js} +1 -1
  72. package/dist/cdn/{SvGridChartView-00LPUHL1.js → SvGridChartView-SmPW10dI.js} +1 -1
  73. package/dist/cdn/{SvGridChartView-BhUEJ5ki.js → SvGridChartView-eSPuJE6g.js} +1 -1
  74. package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
  75. package/dist/cdn/{SvGridDropdown-D13MtJ2j.js → SvGridDropdown-CtdbHcIS.js} +1 -1
  76. package/dist/cdn/{src-M2NfKnjX.js → src-D35VGBU5.js} +5954 -5765
  77. package/dist/cdn/{src-CEpw6Ato.js → src-D7DLIAPD.js} +3396 -3207
  78. package/dist/cdn/svgrid.js +9 -9
  79. package/dist/cdn/svgrid.svelte-external.js +9 -9
  80. package/dist/chart-export.js +8 -8
  81. package/dist/filter-operators.d.ts +2 -1
  82. package/dist/filter-operators.js +5 -6
  83. package/dist/filtering/excel-filters.d.ts +1 -0
  84. package/dist/filtering/excel-filters.js +5 -0
  85. package/dist/filtering/filter-operator-catalogue.d.ts +42 -0
  86. package/dist/filtering/filter-operator-catalogue.js +42 -0
  87. package/dist/filtering/predicate-expr.d.ts +78 -0
  88. package/dist/filtering/predicate-expr.js +1 -0
  89. package/dist/filtering/row-predicate.d.ts +17 -0
  90. package/dist/filtering/row-predicate.js +55 -0
  91. package/dist/grid-messages.d.ts +7 -0
  92. package/dist/grid-messages.js +7 -0
  93. package/dist/index.d.ts +4 -0
  94. package/dist/index.js +5 -0
  95. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
  96. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
  97. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
  98. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
  99. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
  100. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
  101. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
  102. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
  103. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
  104. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
  105. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
  106. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
  107. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
  108. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
  109. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
  110. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
  111. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
  112. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
  113. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
  114. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
  115. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
  116. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
  117. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
  118. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
  119. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
  120. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
  121. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
  122. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
  123. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
  124. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
  125. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
  126. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
  127. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
  128. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
  129. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
  130. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
  131. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
  132. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
  133. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
  134. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
  135. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
  136. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
  137. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
  138. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
  139. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
  140. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
  141. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
  142. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
  143. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
  144. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
  145. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
  146. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
  147. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
  148. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
  149. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
  150. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
  151. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
  152. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
  153. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
  154. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
  155. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
  156. package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
  157. package/dist/server-data-source.d.ts +34 -0
  158. package/dist/server-data-source.js +19 -0
  159. package/dist/svgrid-wrapper.types.d.ts +37 -5
  160. package/dist/themes/index.js +12 -4
  161. package/package.json +12 -11
  162. package/src/FlexRender.svelte +96 -96
  163. package/src/GridFooter.svelte +178 -178
  164. package/src/GridMenus.svelte +705 -705
  165. package/src/SvAutoComplete.svelte +165 -165
  166. package/src/SvAvatar.svelte +75 -75
  167. package/src/SvCalendar.svelte +503 -503
  168. package/src/SvCalendar.test.ts +226 -226
  169. package/src/SvCarousel.svelte +141 -141
  170. package/src/SvCheckBox.svelte +102 -102
  171. package/src/SvCircularProgress.svelte +109 -109
  172. package/src/SvColorInput.svelte +181 -181
  173. package/src/SvComboBox.svelte +275 -275
  174. package/src/SvContextMenu.svelte +116 -116
  175. package/src/SvCountryInput.svelte +163 -163
  176. package/src/SvDrawer.svelte +254 -254
  177. package/src/SvDropDownList.svelte +374 -374
  178. package/src/SvDurationInput.svelte +126 -126
  179. package/src/SvField.svelte +293 -293
  180. package/src/SvForm.svelte +437 -437
  181. package/src/SvForm.test.ts +411 -411
  182. package/src/SvGrid.controller.svelte.ts +3858 -3691
  183. package/src/SvGrid.css +2846 -2814
  184. package/src/SvGrid.svelte +3548 -3490
  185. package/src/SvGrid.types.ts +1769 -1708
  186. package/src/SvGridChart.svelte +1716 -1716
  187. package/src/SvGridChartPanel.svelte +485 -485
  188. package/src/SvGridChartView.svelte +70 -70
  189. package/src/SvGridDropdown.svelte +728 -728
  190. package/src/SvGridSelect.svelte +266 -266
  191. package/src/SvGroupCell.svelte +116 -116
  192. package/src/SvListBox.svelte +326 -326
  193. package/src/SvMaskedInput.svelte +122 -122
  194. package/src/SvMenu.svelte +124 -124
  195. package/src/SvMenu.test.ts +97 -97
  196. package/src/SvMenuList.svelte +146 -146
  197. package/src/SvMultiSelect.svelte +289 -289
  198. package/src/SvNumberInput.svelte +168 -168
  199. package/src/SvOtpInput.svelte +158 -158
  200. package/src/SvPasswordInput.svelte +151 -151
  201. package/src/SvPhoneInput.svelte +133 -133
  202. package/src/SvPopover.svelte +197 -197
  203. package/src/SvProgress.svelte +116 -116
  204. package/src/SvRadioGroup.svelte +107 -107
  205. package/src/SvRating.svelte +112 -112
  206. package/src/SvResult.svelte +73 -73
  207. package/src/SvRichText.svelte +211 -211
  208. package/src/SvRowGroupPanel.svelte +170 -170
  209. package/src/SvScrollArea.svelte +61 -61
  210. package/src/SvSlider.svelte +203 -203
  211. package/src/SvSwitchButton.svelte +108 -108
  212. package/src/SvTagsInput.svelte +115 -115
  213. package/src/SvTextInput.svelte +147 -147
  214. package/src/SvTimePicker.svelte +245 -245
  215. package/src/SvToaster.svelte +159 -159
  216. package/src/SvToaster.test.ts +95 -95
  217. package/src/SvToggleButton.svelte +85 -85
  218. package/src/SvTooltip.svelte +161 -161
  219. package/src/SvTour.svelte +208 -208
  220. package/src/SvTree.svelte +444 -444
  221. package/src/SvTreeSelect.svelte +235 -235
  222. package/src/a11y/dismissable.test.ts +119 -119
  223. package/src/a11y/dismissable.ts +114 -114
  224. package/src/a11y/grid-announcements.test.ts +78 -0
  225. package/src/a11y/grid-announcements.ts +94 -0
  226. package/src/a11y.announce.test.ts +250 -0
  227. package/src/a11y.axe.test.ts +194 -0
  228. package/src/a11y.contract.test.ts +49 -49
  229. package/src/a11y.test.ts +59 -59
  230. package/src/a11y.ts +61 -61
  231. package/src/advanced-filter.svelte.ts +59 -0
  232. package/src/ai.test.ts +502 -502
  233. package/src/ai.ts +1391 -1391
  234. package/src/build-api.coverage.test.ts +633 -633
  235. package/src/build-api.ts +846 -805
  236. package/src/builtin-editors.grid.test.ts +85 -85
  237. package/src/cell-formatting.ts +169 -169
  238. package/src/cell-render.test.ts +513 -513
  239. package/src/cell-render.ts +496 -496
  240. package/src/cell-values.ts +118 -118
  241. package/src/chart-export.ts +201 -201
  242. package/src/chart-view.svelte.ts +36 -36
  243. package/src/chart.ts +2295 -2295
  244. package/src/collaboration.test.ts +104 -104
  245. package/src/collaboration.ts +167 -167
  246. package/src/core.performance.test.ts +30 -30
  247. package/src/core.ts +1261 -1261
  248. package/src/createAutocomplete.svelte.ts +132 -132
  249. package/src/createCombobox.svelte.ts +191 -191
  250. package/src/createCountryInput.svelte.ts +157 -157
  251. package/src/createDropdownList.svelte.ts +168 -168
  252. package/src/createForm.svelte.ts +386 -386
  253. package/src/createGrid.svelte.ts +42 -42
  254. package/src/createGrid.test.ts +10 -10
  255. package/src/createGridState.svelte.ts +17 -17
  256. package/src/createListbox.svelte.ts +250 -250
  257. package/src/createMenu.svelte.ts +224 -224
  258. package/src/createPopoverSelect.svelte.ts +213 -213
  259. package/src/createSlider.svelte.ts +191 -191
  260. package/src/createTooltip.svelte.ts +144 -144
  261. package/src/createTree.svelte.ts +319 -319
  262. package/src/editing.test.ts +949 -949
  263. package/src/editing.ts +606 -606
  264. package/src/editor-contract.ts +170 -170
  265. package/src/editor-registry.grid.test.ts +144 -144
  266. package/src/editor-registry.ts +122 -122
  267. package/src/export-data-api.test.ts +126 -126
  268. package/src/export-format.test.ts +107 -107
  269. package/src/export-format.ts +601 -601
  270. package/src/filter-operators.ts +160 -157
  271. package/src/filtering/excel-filters.ts +15 -0
  272. package/src/filtering/filter-operator-catalogue.ts +74 -0
  273. package/src/filtering/node-entry.test.ts +75 -0
  274. package/src/filtering/predicate-expr.ts +50 -0
  275. package/src/filtering/row-predicate.ts +57 -0
  276. package/src/flex-render.ts +3 -3
  277. package/src/form-field.ts +127 -127
  278. package/src/grid-messages.ts +18 -0
  279. package/src/group-display.test.ts +167 -167
  280. package/src/group-display.ts +200 -200
  281. package/src/index.ts +754 -726
  282. package/src/js-scroller.svelte.ts +173 -173
  283. package/src/keyboard-handlers.ts +270 -270
  284. package/src/keyboard.test.ts +59 -59
  285. package/src/keyboard.ts +97 -97
  286. package/src/list-nav.test.ts +49 -49
  287. package/src/list-nav.ts +29 -29
  288. package/src/list-option.test.ts +56 -56
  289. package/src/list-option.ts +172 -172
  290. package/src/menus.ts +567 -567
  291. package/src/merge-objects.ts +48 -48
  292. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
  293. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
  294. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
  295. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
  296. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
  297. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
  298. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
  299. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
  300. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
  301. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
  302. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
  303. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
  304. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
  305. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
  306. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
  307. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
  308. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
  309. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
  310. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
  311. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
  312. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
  313. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
  314. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
  315. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
  316. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
  317. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
  318. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
  319. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
  320. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
  321. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
  322. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
  323. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
  324. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
  325. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
  326. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
  327. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
  328. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
  329. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
  330. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
  331. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
  332. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
  333. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
  334. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
  335. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
  336. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
  337. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
  338. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
  339. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
  340. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
  341. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
  342. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
  343. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
  344. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
  345. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
  346. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
  347. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
  348. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
  349. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
  350. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
  351. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
  352. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
  353. package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
  354. package/src/overlays.test.ts +90 -90
  355. package/src/render-component.ts +28 -28
  356. package/src/row-resize.ts +210 -210
  357. package/src/scheduler-model.test.ts +562 -562
  358. package/src/scheduler-model.ts +872 -872
  359. package/src/selection.test.ts +754 -754
  360. package/src/selection.ts +491 -491
  361. package/src/server-data-source.test.ts +383 -289
  362. package/src/server-data-source.ts +469 -413
  363. package/src/sparkline.test.ts +68 -68
  364. package/src/sparkline.ts +169 -169
  365. package/src/spreadsheet.test.ts +488 -488
  366. package/src/spreadsheet.ts +312 -312
  367. package/src/static-functions.ts +11 -11
  368. package/src/subscribe.ts +38 -38
  369. package/src/svgrid-wrapper.types.ts +558 -526
  370. package/src/svgrid.advanced-filter.test.ts +481 -0
  371. package/src/svgrid.async-editor-options.test.ts +271 -271
  372. package/src/svgrid.auto-row-height.test.ts +204 -204
  373. package/src/svgrid.behavior.test.ts +705 -705
  374. package/src/svgrid.charting.test.ts +534 -534
  375. package/src/svgrid.comments-autocomplete.test.ts +123 -123
  376. package/src/svgrid.context-menu.test.ts +147 -147
  377. package/src/svgrid.displayed-rows.test.ts +144 -0
  378. package/src/svgrid.features.test.ts +157 -157
  379. package/src/svgrid.filter-depth.test.ts +163 -163
  380. package/src/svgrid.filter-menu-listbox.svelte.test.ts +331 -331
  381. package/src/svgrid.filter-menu-scroll.test.ts +112 -112
  382. package/src/svgrid.grand-total.test.ts +188 -188
  383. package/src/svgrid.group-display-mode.test.ts +171 -171
  384. package/src/svgrid.group-footers.test.ts +121 -121
  385. package/src/svgrid.group-pagination.test.ts +153 -153
  386. package/src/svgrid.group-props-reactive.svelte.test.ts +151 -0
  387. package/src/svgrid.group-props.test.ts +280 -0
  388. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  389. package/src/svgrid.tree-data.test.ts +186 -186
  390. package/src/svgrid.wrapper.test.ts +63 -63
  391. package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
  392. package/src/test-setup.ts +62 -62
  393. package/src/themes/contrast.test.ts +112 -0
  394. package/src/themes/index.ts +286 -278
  395. package/src/toast-store.svelte.ts +246 -246
  396. package/src/toast-store.test.ts +147 -147
  397. package/src/tree-row-model.test.ts +168 -168
  398. package/src/ui-buttons.test.ts +144 -144
  399. package/src/ui-inputs.test.ts +118 -118
  400. package/src/ui-localization.test.ts +113 -113
  401. package/src/ui-range.test.ts +70 -70
  402. package/src/ui-selection.test.ts +155 -155
  403. package/src/ui-tier1.test.ts +142 -142
  404. package/src/virtual.test.ts +88 -88
  405. package/src/virtualization/column-virtualizer.test.ts +27 -27
  406. package/src/virtualization/column-virtualizer.ts +30 -30
  407. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  408. package/src/virtualization/types.ts +30 -30
  409. package/src/virtualization/virtualizer.test.ts +47 -47
  410. package/src/virtualization/virtualizer.ts +296 -296
  411. package/themes/catppuccin.css +3 -3
  412. package/themes/dracula.css +3 -3
  413. package/themes/nord.css +3 -3
  414. package/themes/notion.css +4 -4
@@ -1,170 +1,170 @@
1
- /**
2
- * The shared "editor contract" for the SvGrid UI kit.
3
- *
4
- * Every value-bearing editor (inputs, selects, pickers) accepts this common set
5
- * of props so forms, validation, accessibility, direction (RTL) and localization
6
- * behave IDENTICALLY across the kit - the same spirit as the grid's headless
7
- * core, applied to the editors. Components spread their own `value` / options /
8
- * behavior on top of this base.
9
- *
10
- * Framework-free (no Svelte, no DOM) so it can be unit-tested and reused.
11
- */
12
-
13
- export type EditorSize = 'sm' | 'md' | 'lg'
14
-
15
- /**
16
- * A small action button rendered inside a framed field (via `SvField`'s
17
- * `actions`) - the generalized form of the clear / reveal buttons, for a lookup,
18
- * a generate, a copy, etc. `icon` is a Svelte snippet; when absent the `label`
19
- * text is shown. (Type-only Svelte import, so this module stays runtime-free.)
20
- */
21
- export type EditorAction = {
22
- /** Accessible name + tooltip for the button. */
23
- label: string
24
- /** Invoked when the button is pressed. */
25
- onClick: () => void
26
- /** Optional icon snippet; falls back to the `label` text. */
27
- icon?: import('svelte').Snippet
28
- disabled?: boolean
29
- }
30
-
31
- /** Text direction. `'auto'` defers to the surrounding document/CSS. */
32
- export type EditorDir = 'ltr' | 'rtl' | 'auto'
33
-
34
- /** Props shared by every value-bearing editor in the kit. */
35
- export type SvEditorProps = {
36
- /** Disable interaction + form submission. */
37
- disabled?: boolean
38
- /** Read-only: the value is shown but not editable. */
39
- readonly?: boolean
40
- /** Required for validation (adds `aria-required` + participates in validity). */
41
- required?: boolean
42
- /** Marks the control invalid (`aria-invalid` + error styling). */
43
- invalid?: boolean
44
- /**
45
- * Fill the container instead of the control's own default width. A default
46
- * width is right for a control sitting on its own; in a form grid a row of
47
- * inputs each stopping at a different width reads as broken.
48
- */
49
- block?: boolean
50
- /** Error message; when set it is announced via `aria-describedby` and shown. */
51
- error?: string
52
- /** Visible field label, rendered above the control and wired via `for`/`id`. */
53
- label?: string
54
- /** Helper text shown under the control and announced via `aria-describedby`. */
55
- hint?: string
56
- /** Control size / density. */
57
- size?: EditorSize
58
- /**
59
- * Text direction. `'rtl'` mirrors layout for Arabic/Hebrew/etc.; `'auto'` (the
60
- * default) inherits from the surrounding document so a page-level `dir` wins.
61
- */
62
- dir?: EditorDir
63
- /** Form field name; the editor emits a hidden input carrying its value. */
64
- name?: string
65
- /** Root/control element id (the label/hint/error ids derive from it). */
66
- id?: string
67
- /** Accessible name when there is no visible `label`. */
68
- ariaLabel?: string
69
- /** Busy state - shows a spinner (e.g. while an async value/validation resolves). */
70
- loading?: boolean
71
- }
72
-
73
- /**
74
- * The interaction surface an editor exposes when embedded as a grid cell editor.
75
- * Standalone usage ignores these; the grid supplies them so every editor shares
76
- * one commit / cancel / move contract (Enter commits, Escape cancels, Tab moves)
77
- * instead of each cell-editor re-implementing key handling.
78
- *
79
- * `CellEditorContext` (editor-registry.ts) extends this type, so what the grid
80
- * hands a registered editor and what this contract promises are the same thing
81
- * by construction rather than by convention.
82
- */
83
- export type EditorInteraction<V = unknown> = {
84
- /**
85
- * Commit the value and stop editing (Enter, option pick, blur-commit).
86
- * The argument is optional: an editor that has been reporting through
87
- * `onChange` can just call `onCommit()` to commit what the grid already has.
88
- */
89
- onCommit?: (value?: V) => void
90
- /** Abandon the edit and restore the previous value (Escape). */
91
- onCancel?: () => void
92
- /** Commit, then move to the adjacent cell (Tab = 1, Shift+Tab = -1). */
93
- onCommitAndMove?: (value: V | undefined, direction: 1 | -1) => void
94
- /** Ask the surrounding popover/panel to close without committing. */
95
- onRequestClose?: () => void
96
- /** True while mounted inside a grid cell (lets an editor tune autofocus etc.). */
97
- inCell?: boolean
98
- }
99
-
100
- /** Stable DOM id for an editor's error text, for `aria-describedby` wiring. */
101
- export const editorErrorId = (id?: string): string | undefined => (id ? `${id}__error` : undefined)
102
-
103
- /** Stable DOM id for an editor's hint text, for `aria-describedby` wiring. */
104
- export const editorHintId = (id?: string): string | undefined => (id ? `${id}__hint` : undefined)
105
-
106
- let _autoId = 0
107
- /**
108
- * Generate a stable-per-instance element id. Call ONCE per component instance
109
- * (e.g. `const uid = provided ?? nextEditorId()`) so label/hint/error wiring
110
- * always has an anchor even when the consumer passes no `id`.
111
- */
112
- export const nextEditorId = (prefix = 'sv-ed'): string => `${prefix}-${_autoId++}`
113
-
114
- /** A subset of {@link SvEditorProps} that drives ARIA on the focusable control. */
115
- export type EditorAriaState = Pick<
116
- SvEditorProps,
117
- 'id' | 'invalid' | 'required' | 'error' | 'hint' | 'ariaLabel'
118
- >
119
-
120
- /**
121
- * ARIA attributes for the focusable control of an editor, derived from its state.
122
- * Spread onto the input/button/combobox:
123
- * `<input {...editorAria({ id, invalid, required, error, hint, ariaLabel })} />`
124
- *
125
- * `aria-describedby` points at the error text (when invalid) and/or the hint
126
- * text - both ids derive from `id`, so pass a stable `id` (see {@link nextEditorId}).
127
- * Undefined values are omitted by Svelte, so unset props add no attributes.
128
- */
129
- export function editorAria(state: EditorAriaState): {
130
- 'aria-invalid': 'true' | undefined
131
- 'aria-required': 'true' | undefined
132
- 'aria-describedby': string | undefined
133
- 'aria-label': string | undefined
134
- } {
135
- const described = [
136
- state.error ? editorErrorId(state.id) : undefined,
137
- state.hint ? editorHintId(state.id) : undefined,
138
- ].filter(Boolean)
139
- return {
140
- 'aria-invalid': state.invalid ? 'true' : undefined,
141
- 'aria-required': state.required ? 'true' : undefined,
142
- 'aria-describedby': described.length ? described.join(' ') : undefined,
143
- 'aria-label': state.ariaLabel,
144
- }
145
- }
146
-
147
- /**
148
- * Merge a component's default message strings with a consumer's `messages`
149
- * override, so every editor can be fully localized from the outside.
150
- *
151
- * ```ts
152
- * const M = { clear: 'Clear', noResults: 'No results' }
153
- * const messages = resolveMessages(M, props.messages) // Partial override
154
- * ```
155
- *
156
- * Undefined/empty overrides fall back to the default, so a partial `messages`
157
- * object only replaces the keys it sets.
158
- */
159
- export function resolveMessages<T extends Record<string, string>>(
160
- defaults: T,
161
- overrides?: Partial<T> | null,
162
- ): T {
163
- if (!overrides) return defaults
164
- const out = { ...defaults }
165
- for (const k in overrides) {
166
- const v = overrides[k]
167
- if (v != null && v !== '') out[k] = v as T[Extract<keyof T, string>]
168
- }
169
- return out
170
- }
1
+ /**
2
+ * The shared "editor contract" for the SvGrid UI kit.
3
+ *
4
+ * Every value-bearing editor (inputs, selects, pickers) accepts this common set
5
+ * of props so forms, validation, accessibility, direction (RTL) and localization
6
+ * behave IDENTICALLY across the kit - the same spirit as the grid's headless
7
+ * core, applied to the editors. Components spread their own `value` / options /
8
+ * behavior on top of this base.
9
+ *
10
+ * Framework-free (no Svelte, no DOM) so it can be unit-tested and reused.
11
+ */
12
+
13
+ export type EditorSize = 'sm' | 'md' | 'lg'
14
+
15
+ /**
16
+ * A small action button rendered inside a framed field (via `SvField`'s
17
+ * `actions`) - the generalized form of the clear / reveal buttons, for a lookup,
18
+ * a generate, a copy, etc. `icon` is a Svelte snippet; when absent the `label`
19
+ * text is shown. (Type-only Svelte import, so this module stays runtime-free.)
20
+ */
21
+ export type EditorAction = {
22
+ /** Accessible name + tooltip for the button. */
23
+ label: string
24
+ /** Invoked when the button is pressed. */
25
+ onClick: () => void
26
+ /** Optional icon snippet; falls back to the `label` text. */
27
+ icon?: import('svelte').Snippet
28
+ disabled?: boolean
29
+ }
30
+
31
+ /** Text direction. `'auto'` defers to the surrounding document/CSS. */
32
+ export type EditorDir = 'ltr' | 'rtl' | 'auto'
33
+
34
+ /** Props shared by every value-bearing editor in the kit. */
35
+ export type SvEditorProps = {
36
+ /** Disable interaction + form submission. */
37
+ disabled?: boolean
38
+ /** Read-only: the value is shown but not editable. */
39
+ readonly?: boolean
40
+ /** Required for validation (adds `aria-required` + participates in validity). */
41
+ required?: boolean
42
+ /** Marks the control invalid (`aria-invalid` + error styling). */
43
+ invalid?: boolean
44
+ /**
45
+ * Fill the container instead of the control's own default width. A default
46
+ * width is right for a control sitting on its own; in a form grid a row of
47
+ * inputs each stopping at a different width reads as broken.
48
+ */
49
+ block?: boolean
50
+ /** Error message; when set it is announced via `aria-describedby` and shown. */
51
+ error?: string
52
+ /** Visible field label, rendered above the control and wired via `for`/`id`. */
53
+ label?: string
54
+ /** Helper text shown under the control and announced via `aria-describedby`. */
55
+ hint?: string
56
+ /** Control size / density. */
57
+ size?: EditorSize
58
+ /**
59
+ * Text direction. `'rtl'` mirrors layout for Arabic/Hebrew/etc.; `'auto'` (the
60
+ * default) inherits from the surrounding document so a page-level `dir` wins.
61
+ */
62
+ dir?: EditorDir
63
+ /** Form field name; the editor emits a hidden input carrying its value. */
64
+ name?: string
65
+ /** Root/control element id (the label/hint/error ids derive from it). */
66
+ id?: string
67
+ /** Accessible name when there is no visible `label`. */
68
+ ariaLabel?: string
69
+ /** Busy state - shows a spinner (e.g. while an async value/validation resolves). */
70
+ loading?: boolean
71
+ }
72
+
73
+ /**
74
+ * The interaction surface an editor exposes when embedded as a grid cell editor.
75
+ * Standalone usage ignores these; the grid supplies them so every editor shares
76
+ * one commit / cancel / move contract (Enter commits, Escape cancels, Tab moves)
77
+ * instead of each cell-editor re-implementing key handling.
78
+ *
79
+ * `CellEditorContext` (editor-registry.ts) extends this type, so what the grid
80
+ * hands a registered editor and what this contract promises are the same thing
81
+ * by construction rather than by convention.
82
+ */
83
+ export type EditorInteraction<V = unknown> = {
84
+ /**
85
+ * Commit the value and stop editing (Enter, option pick, blur-commit).
86
+ * The argument is optional: an editor that has been reporting through
87
+ * `onChange` can just call `onCommit()` to commit what the grid already has.
88
+ */
89
+ onCommit?: (value?: V) => void
90
+ /** Abandon the edit and restore the previous value (Escape). */
91
+ onCancel?: () => void
92
+ /** Commit, then move to the adjacent cell (Tab = 1, Shift+Tab = -1). */
93
+ onCommitAndMove?: (value: V | undefined, direction: 1 | -1) => void
94
+ /** Ask the surrounding popover/panel to close without committing. */
95
+ onRequestClose?: () => void
96
+ /** True while mounted inside a grid cell (lets an editor tune autofocus etc.). */
97
+ inCell?: boolean
98
+ }
99
+
100
+ /** Stable DOM id for an editor's error text, for `aria-describedby` wiring. */
101
+ export const editorErrorId = (id?: string): string | undefined => (id ? `${id}__error` : undefined)
102
+
103
+ /** Stable DOM id for an editor's hint text, for `aria-describedby` wiring. */
104
+ export const editorHintId = (id?: string): string | undefined => (id ? `${id}__hint` : undefined)
105
+
106
+ let _autoId = 0
107
+ /**
108
+ * Generate a stable-per-instance element id. Call ONCE per component instance
109
+ * (e.g. `const uid = provided ?? nextEditorId()`) so label/hint/error wiring
110
+ * always has an anchor even when the consumer passes no `id`.
111
+ */
112
+ export const nextEditorId = (prefix = 'sv-ed'): string => `${prefix}-${_autoId++}`
113
+
114
+ /** A subset of {@link SvEditorProps} that drives ARIA on the focusable control. */
115
+ export type EditorAriaState = Pick<
116
+ SvEditorProps,
117
+ 'id' | 'invalid' | 'required' | 'error' | 'hint' | 'ariaLabel'
118
+ >
119
+
120
+ /**
121
+ * ARIA attributes for the focusable control of an editor, derived from its state.
122
+ * Spread onto the input/button/combobox:
123
+ * `<input {...editorAria({ id, invalid, required, error, hint, ariaLabel })} />`
124
+ *
125
+ * `aria-describedby` points at the error text (when invalid) and/or the hint
126
+ * text - both ids derive from `id`, so pass a stable `id` (see {@link nextEditorId}).
127
+ * Undefined values are omitted by Svelte, so unset props add no attributes.
128
+ */
129
+ export function editorAria(state: EditorAriaState): {
130
+ 'aria-invalid': 'true' | undefined
131
+ 'aria-required': 'true' | undefined
132
+ 'aria-describedby': string | undefined
133
+ 'aria-label': string | undefined
134
+ } {
135
+ const described = [
136
+ state.error ? editorErrorId(state.id) : undefined,
137
+ state.hint ? editorHintId(state.id) : undefined,
138
+ ].filter(Boolean)
139
+ return {
140
+ 'aria-invalid': state.invalid ? 'true' : undefined,
141
+ 'aria-required': state.required ? 'true' : undefined,
142
+ 'aria-describedby': described.length ? described.join(' ') : undefined,
143
+ 'aria-label': state.ariaLabel,
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Merge a component's default message strings with a consumer's `messages`
149
+ * override, so every editor can be fully localized from the outside.
150
+ *
151
+ * ```ts
152
+ * const M = { clear: 'Clear', noResults: 'No results' }
153
+ * const messages = resolveMessages(M, props.messages) // Partial override
154
+ * ```
155
+ *
156
+ * Undefined/empty overrides fall back to the default, so a partial `messages`
157
+ * object only replaces the keys it sets.
158
+ */
159
+ export function resolveMessages<T extends Record<string, string>>(
160
+ defaults: T,
161
+ overrides?: Partial<T> | null,
162
+ ): T {
163
+ if (!overrides) return defaults
164
+ const out = { ...defaults }
165
+ for (const k in overrides) {
166
+ const v = overrides[k]
167
+ if (v != null && v !== '') out[k] = v as T[Extract<keyof T, string>]
168
+ }
169
+ return out
170
+ }
@@ -1,144 +1,144 @@
1
- /**
2
- * Integration test for the cell-editor registry wiring in SvGrid.svelte: a
3
- * component registered via `registerCellEditor` is actually mounted when a cell
4
- * of that custom `editorType` starts editing.
5
- */
6
- import { afterEach, describe, expect, it } from 'vitest'
7
- import { mount, unmount } from 'svelte'
8
- import SvGrid from './SvGrid.svelte'
9
- import SvRating from './SvRating.svelte'
10
- import {
11
- registerCellEditor,
12
- unregisterCellEditor,
13
- createCoreRowModel,
14
- createFilteredRowModel,
15
- createPaginatedRowModel,
16
- createSortedRowModel,
17
- sortFns,
18
- tableFeatures,
19
- columnFilteringFeature,
20
- rowSortingFeature,
21
- } from './index'
22
- import type { ColumnDef, SvGridApi } from './index'
23
-
24
- type Row = { id: number; name: string; score: number }
25
-
26
- const features = tableFeatures({ columnFilteringFeature, rowSortingFeature })
27
- const rows: Row[] = [
28
- { id: 1, name: 'Ada', score: 3 },
29
- { id: 2, name: 'Alan', score: 5 },
30
- ]
31
- const cols: ColumnDef<typeof features, Row>[] = [
32
- { field: 'name', header: 'Name', width: 200, editorType: 'text' },
33
- // Custom editor type resolved through the registry:
34
- { field: 'score', header: 'Score', width: 160, editorType: 'stars' },
35
- ]
36
-
37
- const tick = () => new Promise<void>((r) => queueMicrotask(r))
38
-
39
- function mountGrid() {
40
- return new Promise<{ api: SvGridApi<typeof features, Row>; target: HTMLElement; destroy: () => void }>(
41
- (res, rej) => {
42
- const target = document.createElement('div')
43
- document.body.appendChild(target)
44
- const app = mount(SvGrid, {
45
- target,
46
- props: {
47
- data: rows,
48
- columns: cols,
49
- features,
50
- _rowModels: {
51
- coreRowModel: createCoreRowModel(),
52
- filteredRowModel: createFilteredRowModel(),
53
- sortedRowModel: createSortedRowModel(sortFns),
54
- paginatedRowModel: createPaginatedRowModel(),
55
- },
56
- rowHeight: 36,
57
- containerHeight: 300,
58
- virtualization: false,
59
- enableInlineEditing: true,
60
- onApiReady(api: SvGridApi<typeof features, Row>) {
61
- res({ api, target, destroy: () => { unmount(app); target.remove() } })
62
- },
63
- } as any,
64
- })
65
- queueMicrotask(() => rej.length && undefined)
66
- },
67
- )
68
- }
69
-
70
- afterEach(() => {
71
- unregisterCellEditor('stars')
72
- })
73
-
74
- describe('registry wiring in SvGrid', () => {
75
- it('mounts a registered component when a custom-editorType cell edits', async () => {
76
- registerCellEditor('stars', {
77
- component: SvRating,
78
- props: (ctx) => ({
79
- value: ctx.value,
80
- onChange: (v: number) => ctx.onCommit(v),
81
- }),
82
- })
83
-
84
- const { api, target, destroy } = await mountGrid()
85
- try {
86
- api.startEditing(0, 'score')
87
- await tick()
88
- await tick()
89
- // The registered SvRating editor is mounted in the editing overlay.
90
- const rating = target.querySelector('.sv-rating')
91
- expect(rating).not.toBeNull()
92
- } finally {
93
- destroy()
94
- }
95
- })
96
-
97
- it('hands the editor the full EditorInteraction contract, not a subset', async () => {
98
- // The contract type used to be documented but never supplied: the registry
99
- // passed only value/onChange/onCommit/onCancel, so an editor written against
100
- // `EditorInteraction` (Tab-to-move, dismiss-without-commit, in-cell tuning)
101
- // silently got undefined for half of it.
102
- let seen: Record<string, unknown> = {}
103
- registerCellEditor('stars', {
104
- component: SvRating,
105
- props: (ctx) => {
106
- seen = ctx as unknown as Record<string, unknown>
107
- return { value: ctx.value }
108
- },
109
- })
110
-
111
- const { api, target, destroy } = await mountGrid()
112
- try {
113
- api.startEditing(0, 'score')
114
- await tick()
115
- await tick()
116
- expect(typeof seen.onCommit).toBe('function')
117
- expect(typeof seen.onCancel).toBe('function')
118
- expect(typeof seen.onChange).toBe('function')
119
- expect(typeof seen.onCommitAndMove).toBe('function')
120
- expect(typeof seen.onRequestClose).toBe('function')
121
- expect(seen.inCell).toBe(true)
122
- expect(seen.rowId).toBeTruthy()
123
- expect(seen.columnId).toBe('score')
124
- void target
125
- } finally {
126
- destroy()
127
- }
128
- })
129
-
130
- it('defaults to passing the whole contract when a registration has no props mapping', async () => {
131
- // A registration with no `props` should still work for a contract-aware
132
- // editor - that is the point of the default mapping.
133
- registerCellEditor('stars', SvRating)
134
- const { api, target, destroy } = await mountGrid()
135
- try {
136
- api.startEditing(0, 'score')
137
- await tick()
138
- await tick()
139
- expect(target.querySelector('.sv-rating')).not.toBeNull()
140
- } finally {
141
- destroy()
142
- }
143
- })
144
- })
1
+ /**
2
+ * Integration test for the cell-editor registry wiring in SvGrid.svelte: a
3
+ * component registered via `registerCellEditor` is actually mounted when a cell
4
+ * of that custom `editorType` starts editing.
5
+ */
6
+ import { afterEach, describe, expect, it } from 'vitest'
7
+ import { mount, unmount } from 'svelte'
8
+ import SvGrid from './SvGrid.svelte'
9
+ import SvRating from './SvRating.svelte'
10
+ import {
11
+ registerCellEditor,
12
+ unregisterCellEditor,
13
+ createCoreRowModel,
14
+ createFilteredRowModel,
15
+ createPaginatedRowModel,
16
+ createSortedRowModel,
17
+ sortFns,
18
+ tableFeatures,
19
+ columnFilteringFeature,
20
+ rowSortingFeature,
21
+ } from './index'
22
+ import type { ColumnDef, SvGridApi } from './index'
23
+
24
+ type Row = { id: number; name: string; score: number }
25
+
26
+ const features = tableFeatures({ columnFilteringFeature, rowSortingFeature })
27
+ const rows: Row[] = [
28
+ { id: 1, name: 'Ada', score: 3 },
29
+ { id: 2, name: 'Alan', score: 5 },
30
+ ]
31
+ const cols: ColumnDef<typeof features, Row>[] = [
32
+ { field: 'name', header: 'Name', width: 200, editorType: 'text' },
33
+ // Custom editor type resolved through the registry:
34
+ { field: 'score', header: 'Score', width: 160, editorType: 'stars' },
35
+ ]
36
+
37
+ const tick = () => new Promise<void>((r) => queueMicrotask(r))
38
+
39
+ function mountGrid() {
40
+ return new Promise<{ api: SvGridApi<typeof features, Row>; target: HTMLElement; destroy: () => void }>(
41
+ (res, rej) => {
42
+ const target = document.createElement('div')
43
+ document.body.appendChild(target)
44
+ const app = mount(SvGrid, {
45
+ target,
46
+ props: {
47
+ data: rows,
48
+ columns: cols,
49
+ features,
50
+ _rowModels: {
51
+ coreRowModel: createCoreRowModel(),
52
+ filteredRowModel: createFilteredRowModel(),
53
+ sortedRowModel: createSortedRowModel(sortFns),
54
+ paginatedRowModel: createPaginatedRowModel(),
55
+ },
56
+ rowHeight: 36,
57
+ containerHeight: 300,
58
+ virtualization: false,
59
+ enableInlineEditing: true,
60
+ onApiReady(api: SvGridApi<typeof features, Row>) {
61
+ res({ api, target, destroy: () => { unmount(app); target.remove() } })
62
+ },
63
+ } as any,
64
+ })
65
+ queueMicrotask(() => rej.length && undefined)
66
+ },
67
+ )
68
+ }
69
+
70
+ afterEach(() => {
71
+ unregisterCellEditor('stars')
72
+ })
73
+
74
+ describe('registry wiring in SvGrid', () => {
75
+ it('mounts a registered component when a custom-editorType cell edits', async () => {
76
+ registerCellEditor('stars', {
77
+ component: SvRating,
78
+ props: (ctx) => ({
79
+ value: ctx.value,
80
+ onChange: (v: number) => ctx.onCommit(v),
81
+ }),
82
+ })
83
+
84
+ const { api, target, destroy } = await mountGrid()
85
+ try {
86
+ api.startEditing(0, 'score')
87
+ await tick()
88
+ await tick()
89
+ // The registered SvRating editor is mounted in the editing overlay.
90
+ const rating = target.querySelector('.sv-rating')
91
+ expect(rating).not.toBeNull()
92
+ } finally {
93
+ destroy()
94
+ }
95
+ })
96
+
97
+ it('hands the editor the full EditorInteraction contract, not a subset', async () => {
98
+ // The contract type used to be documented but never supplied: the registry
99
+ // passed only value/onChange/onCommit/onCancel, so an editor written against
100
+ // `EditorInteraction` (Tab-to-move, dismiss-without-commit, in-cell tuning)
101
+ // silently got undefined for half of it.
102
+ let seen: Record<string, unknown> = {}
103
+ registerCellEditor('stars', {
104
+ component: SvRating,
105
+ props: (ctx) => {
106
+ seen = ctx as unknown as Record<string, unknown>
107
+ return { value: ctx.value }
108
+ },
109
+ })
110
+
111
+ const { api, target, destroy } = await mountGrid()
112
+ try {
113
+ api.startEditing(0, 'score')
114
+ await tick()
115
+ await tick()
116
+ expect(typeof seen.onCommit).toBe('function')
117
+ expect(typeof seen.onCancel).toBe('function')
118
+ expect(typeof seen.onChange).toBe('function')
119
+ expect(typeof seen.onCommitAndMove).toBe('function')
120
+ expect(typeof seen.onRequestClose).toBe('function')
121
+ expect(seen.inCell).toBe(true)
122
+ expect(seen.rowId).toBeTruthy()
123
+ expect(seen.columnId).toBe('score')
124
+ void target
125
+ } finally {
126
+ destroy()
127
+ }
128
+ })
129
+
130
+ it('defaults to passing the whole contract when a registration has no props mapping', async () => {
131
+ // A registration with no `props` should still work for a contract-aware
132
+ // editor - that is the point of the default mapping.
133
+ registerCellEditor('stars', SvRating)
134
+ const { api, target, destroy } = await mountGrid()
135
+ try {
136
+ api.startEditing(0, 'score')
137
+ await tick()
138
+ await tick()
139
+ expect(target.querySelector('.sv-rating')).not.toBeNull()
140
+ } finally {
141
+ destroy()
142
+ }
143
+ })
144
+ })