@svgrid/grid 1.2.34 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +6 -5
  2. package/dist/FlexRender.svelte +96 -96
  3. package/dist/GridFooter.svelte +178 -178
  4. package/dist/SvAccordion.svelte +109 -0
  5. package/dist/SvAccordion.svelte.d.ts +28 -0
  6. package/dist/SvAlert.svelte +92 -0
  7. package/dist/SvAlert.svelte.d.ts +27 -0
  8. package/dist/SvAutoComplete.svelte +47 -18
  9. package/dist/SvAutoComplete.svelte.d.ts +2 -5
  10. package/dist/SvAvatar.svelte +75 -0
  11. package/dist/SvAvatar.svelte.d.ts +14 -0
  12. package/dist/SvAvatarGroup.svelte +48 -0
  13. package/dist/SvAvatarGroup.svelte.d.ts +16 -0
  14. package/dist/SvBadge.svelte +54 -0
  15. package/dist/SvBadge.svelte.d.ts +23 -0
  16. package/dist/SvBreadcrumb.svelte +88 -0
  17. package/dist/SvBreadcrumb.svelte.d.ts +23 -0
  18. package/dist/SvButtonGroup.svelte +121 -0
  19. package/dist/SvButtonGroup.svelte.d.ts +16 -0
  20. package/dist/SvCalendar.svelte +72 -9
  21. package/dist/SvCalendar.svelte.d.ts +34 -1
  22. package/dist/SvCard.svelte +71 -0
  23. package/dist/SvCard.svelte.d.ts +28 -0
  24. package/dist/SvCarousel.svelte +134 -0
  25. package/dist/SvCarousel.svelte.d.ts +28 -0
  26. package/dist/SvCheckBox.svelte +36 -21
  27. package/dist/SvCheckBox.svelte.d.ts +2 -5
  28. package/dist/SvChip.svelte +88 -0
  29. package/dist/SvChip.svelte.d.ts +31 -0
  30. package/dist/SvCircularProgress.svelte +109 -0
  31. package/dist/SvCircularProgress.svelte.d.ts +31 -0
  32. package/dist/SvColorInput.svelte +54 -27
  33. package/dist/SvColorInput.svelte.d.ts +10 -6
  34. package/dist/SvComboBox.svelte +119 -33
  35. package/dist/SvComboBox.svelte.d.ts +18 -6
  36. package/dist/SvCommand.svelte +197 -0
  37. package/dist/SvCommand.svelte.d.ts +26 -0
  38. package/dist/SvContextMenu.svelte +96 -0
  39. package/dist/SvContextMenu.svelte.d.ts +25 -0
  40. package/dist/SvCountryInput.svelte +56 -21
  41. package/dist/SvCountryInput.svelte.d.ts +9 -5
  42. package/dist/SvDateRangeInput.svelte +256 -0
  43. package/dist/SvDateRangeInput.svelte.d.ts +37 -0
  44. package/dist/SvDateTimePicker.svelte +57 -20
  45. package/dist/SvDateTimePicker.svelte.d.ts +12 -4
  46. package/dist/SvDivider.svelte +61 -0
  47. package/dist/SvDivider.svelte.d.ts +22 -0
  48. package/dist/SvDrawer.svelte +226 -0
  49. package/dist/SvDrawer.svelte.d.ts +43 -0
  50. package/dist/SvDropDownList.svelte +114 -35
  51. package/dist/SvDropDownList.svelte.d.ts +7 -6
  52. package/dist/SvDurationInput.svelte +108 -0
  53. package/dist/SvDurationInput.svelte.d.ts +15 -0
  54. package/dist/SvEmptyState.svelte +59 -0
  55. package/dist/SvEmptyState.svelte.d.ts +25 -0
  56. package/dist/SvField.svelte +85 -0
  57. package/dist/SvField.svelte.d.ts +30 -0
  58. package/dist/SvFileUpload.svelte +169 -0
  59. package/dist/SvFileUpload.svelte.d.ts +24 -0
  60. package/dist/SvForm.svelte +7 -1
  61. package/dist/SvForm.svelte.d.ts +3 -0
  62. package/dist/SvGauge.svelte +7 -1
  63. package/dist/SvGauge.svelte.d.ts +11 -0
  64. package/dist/SvGrid.controller.svelte.d.ts +6 -0
  65. package/dist/SvGrid.controller.svelte.js +64 -9
  66. package/dist/SvGrid.css +2376 -2343
  67. package/dist/SvGrid.svelte +2764 -2651
  68. package/dist/SvGrid.types.d.ts +366 -0
  69. package/dist/SvGridBoard.svelte +2281 -0
  70. package/dist/SvGridBoard.svelte.d.ts +31 -0
  71. package/dist/SvGridDropdown.svelte +666 -665
  72. package/dist/SvGridSelect.svelte +255 -0
  73. package/dist/SvGridSelect.svelte.d.ts +32 -0
  74. package/dist/SvGroupCell.svelte +109 -0
  75. package/dist/SvGroupCell.svelte.d.ts +41 -0
  76. package/dist/SvListBox.svelte +123 -36
  77. package/dist/SvListBox.svelte.d.ts +12 -8
  78. package/dist/SvMaskedInput.svelte +53 -13
  79. package/dist/SvMaskedInput.svelte.d.ts +16 -6
  80. package/dist/SvMenu.svelte +101 -0
  81. package/dist/SvMenu.svelte.d.ts +26 -0
  82. package/dist/SvMenuList.svelte +143 -0
  83. package/dist/SvMenuList.svelte.d.ts +24 -0
  84. package/dist/SvModal.svelte +220 -0
  85. package/dist/SvModal.svelte.d.ts +31 -0
  86. package/dist/SvMultiSelect.svelte +277 -0
  87. package/dist/SvMultiSelect.svelte.d.ts +31 -0
  88. package/dist/SvNavPane.svelte +314 -0
  89. package/dist/SvNavPane.svelte.d.ts +59 -0
  90. package/dist/SvNumberInput.svelte +23 -9
  91. package/dist/SvNumberInput.svelte.d.ts +2 -0
  92. package/dist/SvOtpInput.svelte +157 -0
  93. package/dist/SvOtpInput.svelte.d.ts +16 -0
  94. package/dist/SvPagination.svelte +100 -0
  95. package/dist/SvPagination.svelte.d.ts +16 -0
  96. package/dist/SvPasswordInput.svelte +42 -12
  97. package/dist/SvPasswordInput.svelte.d.ts +13 -6
  98. package/dist/SvPhoneInput.svelte +43 -11
  99. package/dist/SvPhoneInput.svelte.d.ts +10 -11
  100. package/dist/SvPopover.svelte +127 -0
  101. package/dist/SvPopover.svelte.d.ts +35 -0
  102. package/dist/SvProgress.svelte +116 -0
  103. package/dist/SvProgress.svelte.d.ts +32 -0
  104. package/dist/SvRadioGroup.svelte +40 -22
  105. package/dist/SvRadioGroup.svelte.d.ts +2 -10
  106. package/dist/SvRating.svelte +51 -30
  107. package/dist/SvRating.svelte.d.ts +10 -7
  108. package/dist/SvRichText.svelte +192 -0
  109. package/dist/SvRichText.svelte.d.ts +16 -0
  110. package/dist/SvRowGroupPanel.svelte +147 -0
  111. package/dist/SvRowGroupPanel.svelte.d.ts +17 -0
  112. package/dist/SvScrollArea.svelte +50 -0
  113. package/dist/SvScrollArea.svelte.d.ts +22 -0
  114. package/dist/SvSkeleton.svelte +76 -0
  115. package/dist/SvSkeleton.svelte.d.ts +25 -0
  116. package/dist/SvSlider.svelte +41 -9
  117. package/dist/SvSlider.svelte.d.ts +4 -4
  118. package/dist/SvSparkline.svelte +77 -0
  119. package/dist/SvSparkline.svelte.d.ts +28 -0
  120. package/dist/SvSplitter.svelte +138 -0
  121. package/dist/SvSplitter.svelte.d.ts +32 -0
  122. package/dist/SvStat.svelte +86 -0
  123. package/dist/SvStat.svelte.d.ts +30 -0
  124. package/dist/SvStepper.svelte +91 -0
  125. package/dist/SvStepper.svelte.d.ts +24 -0
  126. package/dist/SvSwitchButton.svelte +39 -24
  127. package/dist/SvSwitchButton.svelte.d.ts +2 -5
  128. package/dist/SvTabs.svelte +147 -28
  129. package/dist/SvTabs.svelte.d.ts +16 -4
  130. package/dist/SvTagsInput.svelte +59 -22
  131. package/dist/SvTagsInput.svelte.d.ts +9 -4
  132. package/dist/SvTextArea.svelte +113 -0
  133. package/dist/SvTextArea.svelte.d.ts +18 -0
  134. package/dist/SvTextInput.svelte +115 -0
  135. package/dist/SvTextInput.svelte.d.ts +20 -0
  136. package/dist/SvTimePicker.svelte +19 -5
  137. package/dist/SvTimePicker.svelte.d.ts +12 -0
  138. package/dist/SvTimeline.svelte +75 -0
  139. package/dist/SvTimeline.svelte.d.ts +24 -0
  140. package/dist/SvToaster.svelte +124 -0
  141. package/dist/SvToaster.svelte.d.ts +10 -0
  142. package/dist/SvToggleButton.svelte +37 -12
  143. package/dist/SvToggleButton.svelte.d.ts +2 -4
  144. package/dist/SvTooltip.svelte +113 -0
  145. package/dist/SvTooltip.svelte.d.ts +22 -0
  146. package/dist/SvTour.svelte +151 -0
  147. package/dist/SvTour.svelte.d.ts +25 -0
  148. package/dist/SvTree.svelte +286 -44
  149. package/dist/SvTree.svelte.d.ts +26 -9
  150. package/dist/SvTreeSelect.svelte +222 -0
  151. package/dist/SvTreeSelect.svelte.d.ts +24 -0
  152. package/dist/a11y/dismissable.d.ts +32 -0
  153. package/dist/a11y/dismissable.js +54 -0
  154. package/dist/a11y/focus-trap.d.ts +39 -0
  155. package/dist/a11y/focus-trap.js +142 -0
  156. package/dist/a11y/live-region.d.ts +8 -0
  157. package/dist/a11y/live-region.js +60 -0
  158. package/dist/a11y/scroll-lock.d.ts +4 -0
  159. package/dist/a11y/scroll-lock.js +41 -0
  160. package/dist/a11y.d.ts +3 -1
  161. package/dist/a11y.js +1 -1
  162. package/dist/avatar.d.ts +10 -0
  163. package/dist/avatar.js +22 -0
  164. package/dist/builtin-editors.d.ts +5 -0
  165. package/dist/builtin-editors.js +55 -0
  166. package/dist/cdn/svgrid.js +16022 -8235
  167. package/dist/cdn/svgrid.svelte-external.js +14543 -6765
  168. package/dist/columns.js +3 -2
  169. package/dist/core.d.ts +7 -1
  170. package/dist/countries.d.ts +12 -0
  171. package/dist/countries.js +24 -0
  172. package/dist/createAccordion.svelte.d.ts +71 -0
  173. package/dist/createAccordion.svelte.js +99 -0
  174. package/dist/createAutocomplete.svelte.d.ts +13 -4
  175. package/dist/createAutocomplete.svelte.js +11 -1
  176. package/dist/createButtonGroup.svelte.d.ts +62 -0
  177. package/dist/createButtonGroup.svelte.js +154 -0
  178. package/dist/createCalendar.svelte.d.ts +5 -0
  179. package/dist/createCalendar.svelte.js +2 -0
  180. package/dist/createCheckbox.svelte.d.ts +9 -17
  181. package/dist/createCheckbox.svelte.js +28 -1
  182. package/dist/createColorInput.svelte.d.ts +12 -22
  183. package/dist/createColorInput.svelte.js +13 -0
  184. package/dist/createCombobox.svelte.d.ts +16 -5
  185. package/dist/createCombobox.svelte.js +13 -2
  186. package/dist/createCountryInput.svelte.d.ts +14 -3
  187. package/dist/createCountryInput.svelte.js +12 -2
  188. package/dist/createDateTimePicker.svelte.d.ts +17 -2
  189. package/dist/createDateTimePicker.svelte.js +12 -2
  190. package/dist/createDropdownList.svelte.d.ts +14 -5
  191. package/dist/createDropdownList.svelte.js +50 -1
  192. package/dist/createFileUpload.svelte.d.ts +68 -0
  193. package/dist/createFileUpload.svelte.js +122 -0
  194. package/dist/createListbox.svelte.d.ts +10 -1
  195. package/dist/createListbox.svelte.js +48 -1
  196. package/dist/createMaskedInput.svelte.d.ts +11 -2
  197. package/dist/createMaskedInput.svelte.js +11 -1
  198. package/dist/createNumberInput.svelte.d.ts +1 -0
  199. package/dist/createNumberInput.svelte.js +1 -0
  200. package/dist/createPasswordInput.svelte.d.ts +19 -21
  201. package/dist/createPasswordInput.svelte.js +16 -4
  202. package/dist/createPhoneInput.svelte.d.ts +26 -7
  203. package/dist/createPhoneInput.svelte.js +24 -3
  204. package/dist/createPopoverSelect.svelte.d.ts +86 -0
  205. package/dist/createPopoverSelect.svelte.js +196 -0
  206. package/dist/createRadioGroup.svelte.d.ts +9 -0
  207. package/dist/createRadioGroup.svelte.js +11 -1
  208. package/dist/createRating.svelte.d.ts +11 -0
  209. package/dist/createRating.svelte.js +12 -1
  210. package/dist/createSlider.svelte.d.ts +2 -0
  211. package/dist/createSlider.svelte.js +16 -5
  212. package/dist/createSplitter.svelte.d.ts +67 -0
  213. package/dist/createSplitter.svelte.js +99 -0
  214. package/dist/createSwitch.svelte.d.ts +9 -16
  215. package/dist/createSwitch.svelte.js +28 -1
  216. package/dist/createTabs.svelte.d.ts +7 -0
  217. package/dist/createTabs.svelte.js +17 -2
  218. package/dist/createTagsInput.svelte.d.ts +13 -1
  219. package/dist/createTagsInput.svelte.js +12 -3
  220. package/dist/createToggle.svelte.d.ts +9 -0
  221. package/dist/createToggle.svelte.js +12 -1
  222. package/dist/createTree.svelte.d.ts +19 -0
  223. package/dist/createTree.svelte.js +108 -15
  224. package/dist/debounce.d.ts +11 -0
  225. package/dist/debounce.js +30 -0
  226. package/dist/duration.d.ts +15 -0
  227. package/dist/duration.js +51 -0
  228. package/dist/editor-contract.d.ts +62 -7
  229. package/dist/editor-contract.js +45 -5
  230. package/dist/editor-registry.d.ts +67 -0
  231. package/dist/editor-registry.js +38 -0
  232. package/dist/editors/cell-editors.d.ts +1 -1
  233. package/dist/editors/cell-editors.js +5 -0
  234. package/dist/fuzzy.d.ts +3 -0
  235. package/dist/fuzzy.js +41 -0
  236. package/dist/grid-select.d.ts +9 -0
  237. package/dist/grid-select.js +8 -0
  238. package/dist/index.d.ts +79 -6
  239. package/dist/index.js +78 -4
  240. package/dist/keyboard-handlers.js +19 -0
  241. package/dist/list-option.d.ts +36 -0
  242. package/dist/list-option.js +68 -0
  243. package/dist/otp.d.ts +16 -0
  244. package/dist/otp.js +26 -0
  245. package/dist/paginate.d.ts +20 -0
  246. package/dist/paginate.js +40 -0
  247. package/dist/popover.d.ts +15 -1
  248. package/dist/popover.js +29 -3
  249. package/dist/recurrence.d.ts +36 -0
  250. package/dist/recurrence.js +90 -0
  251. package/dist/server-data-source.d.ts +89 -0
  252. package/dist/server-data-source.js +4 -0
  253. package/dist/server-group-model.d.ts +98 -0
  254. package/dist/server-group-model.js +263 -0
  255. package/dist/toast-store.svelte.d.ts +41 -0
  256. package/dist/toast-store.svelte.js +113 -0
  257. package/dist/tree-select.d.ts +19 -0
  258. package/dist/tree-select.js +40 -0
  259. package/dist/ui-app.types.d.ts +80 -0
  260. package/dist/ui-app.types.js +7 -0
  261. package/dist/validators.d.ts +43 -0
  262. package/dist/validators.js +53 -0
  263. package/dist/virtual.d.ts +35 -0
  264. package/dist/virtual.js +34 -0
  265. package/package.json +85 -85
  266. package/src/FlexRender.svelte +96 -96
  267. package/src/GridFooter.svelte +178 -178
  268. package/src/SvAccordion.svelte +109 -0
  269. package/src/SvAccordion.test.ts +66 -0
  270. package/src/SvAlert.svelte +92 -0
  271. package/src/SvAutoComplete.svelte +47 -18
  272. package/src/SvAvatar.svelte +75 -0
  273. package/src/SvAvatarGroup.svelte +48 -0
  274. package/src/SvBadge.svelte +54 -0
  275. package/src/SvBreadcrumb.svelte +88 -0
  276. package/src/SvButtonGroup.svelte +121 -0
  277. package/src/SvButtonGroup.test.ts +72 -0
  278. package/src/SvCalendar.svelte +72 -9
  279. package/src/SvCard.svelte +71 -0
  280. package/src/SvCarousel.svelte +134 -0
  281. package/src/SvCheckBox.svelte +36 -21
  282. package/src/SvChip.svelte +88 -0
  283. package/src/SvCircularProgress.svelte +109 -0
  284. package/src/SvColorInput.svelte +54 -27
  285. package/src/SvComboBox.svelte +119 -33
  286. package/src/SvCommand.svelte +197 -0
  287. package/src/SvContextMenu.svelte +96 -0
  288. package/src/SvCountryInput.svelte +56 -21
  289. package/src/SvDateRangeInput.svelte +256 -0
  290. package/src/SvDateRangeInput.test.ts +80 -0
  291. package/src/SvDateTimePicker.svelte +57 -20
  292. package/src/SvDivider.svelte +61 -0
  293. package/src/SvDrawer.svelte +226 -0
  294. package/src/SvDrawer.test.ts +125 -0
  295. package/src/SvDropDownList.svelte +114 -35
  296. package/src/SvDurationInput.svelte +108 -0
  297. package/src/SvEmptyState.svelte +59 -0
  298. package/src/SvField.svelte +85 -0
  299. package/src/SvFileUpload.svelte +169 -0
  300. package/src/SvFileUpload.test.ts +59 -0
  301. package/src/SvForm.svelte +7 -1
  302. package/src/SvGauge.svelte +7 -1
  303. package/src/SvGrid.controller.svelte.ts +2553 -2494
  304. package/src/SvGrid.css +2376 -2343
  305. package/src/SvGrid.svelte +2764 -2651
  306. package/src/SvGrid.types.ts +944 -570
  307. package/src/SvGridBoard.svelte +2281 -0
  308. package/src/SvGridDropdown.svelte +666 -665
  309. package/src/SvGridSelect.svelte +255 -0
  310. package/src/SvGridSelect.test.ts +100 -0
  311. package/src/SvGroupCell.svelte +109 -0
  312. package/src/SvListBox.svelte +123 -36
  313. package/src/SvMaskedInput.svelte +53 -13
  314. package/src/SvMenu.svelte +101 -0
  315. package/src/SvMenu.test.ts +73 -0
  316. package/src/SvMenuList.svelte +143 -0
  317. package/src/SvModal.svelte +220 -0
  318. package/src/SvMultiSelect.svelte +277 -0
  319. package/src/SvMultiSelect.test.ts +167 -0
  320. package/src/SvNavPane.svelte +314 -0
  321. package/src/SvNavPane.test.ts +70 -0
  322. package/src/SvNumberInput.svelte +23 -9
  323. package/src/SvOtpInput.svelte +157 -0
  324. package/src/SvPagination.svelte +100 -0
  325. package/src/SvPasswordInput.svelte +42 -12
  326. package/src/SvPhoneInput.svelte +43 -11
  327. package/src/SvPopover.svelte +127 -0
  328. package/src/SvProgress.svelte +116 -0
  329. package/src/SvRadioGroup.svelte +40 -22
  330. package/src/SvRating.svelte +51 -30
  331. package/src/SvRichText.svelte +192 -0
  332. package/src/SvRowGroupPanel.svelte +147 -0
  333. package/src/SvScrollArea.svelte +50 -0
  334. package/src/SvSkeleton.svelte +76 -0
  335. package/src/SvSlider.svelte +41 -9
  336. package/src/SvSparkline.svelte +77 -0
  337. package/src/SvSplitter.svelte +138 -0
  338. package/src/SvSplitter.test.ts +55 -0
  339. package/src/SvStat.svelte +86 -0
  340. package/src/SvStepper.svelte +91 -0
  341. package/src/SvSwitchButton.svelte +39 -24
  342. package/src/SvTabs.svelte +147 -28
  343. package/src/SvTagsInput.svelte +59 -22
  344. package/src/SvTextArea.svelte +113 -0
  345. package/src/SvTextInput.svelte +115 -0
  346. package/src/SvTimePicker.svelte +19 -5
  347. package/src/SvTimeline.svelte +75 -0
  348. package/src/SvToaster.svelte +124 -0
  349. package/src/SvToaster.test.ts +63 -0
  350. package/src/SvToggleButton.svelte +37 -12
  351. package/src/SvTooltip.svelte +113 -0
  352. package/src/SvTour.svelte +151 -0
  353. package/src/SvTree.svelte +286 -44
  354. package/src/SvTreeSelect.svelte +222 -0
  355. package/src/SvTreeSelect.test.ts +87 -0
  356. package/src/a11y/dismissable.test.ts +95 -0
  357. package/src/a11y/dismissable.ts +94 -0
  358. package/src/a11y/focus-trap.test.ts +110 -0
  359. package/src/a11y/focus-trap.ts +134 -0
  360. package/src/a11y/live-region.test.ts +40 -0
  361. package/src/a11y/live-region.ts +65 -0
  362. package/src/a11y/scroll-lock.test.ts +38 -0
  363. package/src/a11y/scroll-lock.ts +41 -0
  364. package/src/a11y.contract.test.ts +49 -49
  365. package/src/a11y.test.ts +59 -59
  366. package/src/a11y.ts +61 -59
  367. package/src/avatar.test.ts +32 -0
  368. package/src/avatar.ts +21 -0
  369. package/src/board.test.ts +927 -0
  370. package/src/build-api.ts +798 -798
  371. package/src/builtin-editors.grid.test.ts +85 -0
  372. package/src/builtin-editors.test.ts +58 -0
  373. package/src/builtin-editors.ts +56 -0
  374. package/src/cell-formatting.ts +169 -169
  375. package/src/cell-render.ts +469 -469
  376. package/src/collaboration.test.ts +104 -104
  377. package/src/collaboration.ts +167 -167
  378. package/src/columns.ts +3 -2
  379. package/src/core.performance.test.ts +30 -30
  380. package/src/core.ts +1111 -1101
  381. package/src/countries.ts +25 -0
  382. package/src/createAccordion.svelte.ts +126 -0
  383. package/src/createAutocomplete.svelte.ts +18 -1
  384. package/src/createButtonGroup.svelte.ts +166 -0
  385. package/src/createCalendar.svelte.ts +6 -0
  386. package/src/createCheckbox.svelte.ts +23 -1
  387. package/src/createColorInput.svelte.ts +20 -0
  388. package/src/createCombobox.svelte.ts +22 -2
  389. package/src/createCountryInput.svelte.ts +21 -2
  390. package/src/createDateTimePicker.svelte.ts +23 -2
  391. package/src/createDropdownList.svelte.ts +31 -2
  392. package/src/createFileUpload.svelte.ts +144 -0
  393. package/src/createGrid.svelte.ts +42 -42
  394. package/src/createGrid.test.ts +10 -10
  395. package/src/createGridState.svelte.ts +17 -17
  396. package/src/createListbox.svelte.ts +35 -3
  397. package/src/createMaskedInput.svelte.ts +18 -1
  398. package/src/createNumberInput.svelte.ts +2 -0
  399. package/src/createPasswordInput.svelte.ts +31 -5
  400. package/src/createPhoneInput.svelte.ts +38 -4
  401. package/src/createPopoverSelect.svelte.ts +208 -0
  402. package/src/createRadioGroup.svelte.ts +23 -1
  403. package/src/createRating.svelte.ts +26 -1
  404. package/src/createSlider.svelte.ts +14 -3
  405. package/src/createSplitter.svelte.ts +119 -0
  406. package/src/createSwitch.svelte.ts +26 -3
  407. package/src/createTabs.svelte.ts +20 -3
  408. package/src/createTagsInput.svelte.ts +24 -3
  409. package/src/createToggle.svelte.ts +25 -2
  410. package/src/createTree.svelte.ts +104 -14
  411. package/src/debounce.test.ts +50 -0
  412. package/src/debounce.ts +41 -0
  413. package/src/duration.test.ts +41 -0
  414. package/src/duration.ts +51 -0
  415. package/src/editing.test.ts +859 -859
  416. package/src/editing.ts +675 -675
  417. package/src/editor-contract.ts +87 -8
  418. package/src/editor-registry.grid.test.ts +98 -0
  419. package/src/editor-registry.test.ts +86 -0
  420. package/src/editor-registry.ts +106 -0
  421. package/src/editors/cell-editors.ts +10 -1
  422. package/src/export-data-api.test.ts +126 -126
  423. package/src/export-format.test.ts +107 -107
  424. package/src/export-format.ts +598 -598
  425. package/src/flex-render.ts +3 -3
  426. package/src/fuzzy.test.ts +40 -0
  427. package/src/fuzzy.ts +39 -0
  428. package/src/grid-select.test.ts +28 -0
  429. package/src/grid-select.ts +20 -0
  430. package/src/index.ts +463 -318
  431. package/src/keyboard-handlers.ts +20 -0
  432. package/src/keyboard.test.ts +59 -59
  433. package/src/keyboard.ts +97 -97
  434. package/src/list-option.ts +74 -0
  435. package/src/list-power.test.ts +71 -0
  436. package/src/menus.ts +582 -582
  437. package/src/merge-objects.ts +48 -48
  438. package/src/otp.test.ts +28 -0
  439. package/src/otp.ts +28 -0
  440. package/src/overlays.test.ts +85 -0
  441. package/src/paginate.test.ts +41 -0
  442. package/src/paginate.ts +61 -0
  443. package/src/phone-valid.test.ts +26 -0
  444. package/src/popover.ts +31 -3
  445. package/src/progress.test.ts +55 -0
  446. package/src/recurrence.test.ts +91 -0
  447. package/src/recurrence.ts +111 -0
  448. package/src/render-component.ts +28 -28
  449. package/src/selection.test.ts +754 -754
  450. package/src/selection.ts +600 -600
  451. package/src/server-data-source.test.ts +289 -289
  452. package/src/server-data-source.ts +413 -311
  453. package/src/server-group-model.test.ts +294 -0
  454. package/src/server-group-model.ts +370 -0
  455. package/src/sparkline.test.ts +68 -68
  456. package/src/sparkline.ts +169 -169
  457. package/src/spreadsheet.test.ts +489 -489
  458. package/src/spreadsheet.ts +304 -304
  459. package/src/static-functions.ts +11 -11
  460. package/src/subscribe.ts +38 -38
  461. package/src/svgrid-wrapper.types.ts +439 -439
  462. package/src/svgrid.behavior.test.ts +706 -706
  463. package/src/svgrid.features.test.ts +157 -157
  464. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  465. package/src/svgrid.responsive.test.ts +72 -0
  466. package/src/svgrid.wrapper.test.ts +40 -40
  467. package/src/toast-store.svelte.ts +148 -0
  468. package/src/toast-store.test.ts +86 -0
  469. package/src/tree-edit.test.ts +49 -0
  470. package/src/tree-filter.test.ts +56 -0
  471. package/src/tree-select.test.ts +48 -0
  472. package/src/tree-select.ts +62 -0
  473. package/src/ui-app.test.ts +130 -0
  474. package/src/ui-app.types.ts +88 -0
  475. package/src/ui-display.test.ts +79 -0
  476. package/src/ui-inputs.test.ts +1 -1
  477. package/src/ui-status.test.ts +141 -0
  478. package/src/ui-tier1.test.ts +142 -0
  479. package/src/ui-tier2.test.ts +124 -0
  480. package/src/ui-tier3.test.ts +139 -0
  481. package/src/validators.test.ts +58 -0
  482. package/src/validators.ts +105 -0
  483. package/src/virtual.test.ts +72 -0
  484. package/src/virtual.ts +67 -0
  485. package/src/virtualization/column-virtualizer.test.ts +27 -27
  486. package/src/virtualization/column-virtualizer.ts +30 -30
  487. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  488. package/src/virtualization/types.ts +30 -30
  489. package/src/virtualization/virtualizer.test.ts +47 -47
  490. package/src/virtualization/virtualizer.ts +296 -296
@@ -0,0 +1,134 @@
1
+ <script lang="ts">
2
+ /**
3
+ * SvCarousel - a slideshow: a sliding track with prev/next arrows, dot
4
+ * indicators, optional autoplay (pauses on hover/focus) and swipe. Slides are
5
+ * rendered by the `slide` snippet (index in, your content out). Parity: Smart
6
+ * carousel.
7
+ *
8
+ * ```svelte
9
+ * <SvCarousel count={imgs.length} autoplay={4000}>
10
+ * {#snippet slide(i)}<img src={imgs[i]} alt="" />{/snippet}
11
+ * </SvCarousel>
12
+ * ```
13
+ */
14
+ import type { Snippet } from 'svelte'
15
+
16
+ type Props = {
17
+ count: number
18
+ slide?: Snippet<[number]>
19
+ /** Active slide index (bindable). */
20
+ current?: number
21
+ /** Autoplay interval in ms; 0 = off. */
22
+ autoplay?: number
23
+ loop?: boolean
24
+ arrows?: boolean
25
+ dots?: boolean
26
+ ariaLabel?: string
27
+ }
28
+
29
+ let {
30
+ count,
31
+ slide,
32
+ current = $bindable(0),
33
+ autoplay = 0,
34
+ loop = true,
35
+ arrows = true,
36
+ dots = true,
37
+ ariaLabel = 'Carousel',
38
+ }: Props = $props()
39
+
40
+ function go(i: number) {
41
+ if (count === 0) return
42
+ current = loop ? (i + count) % count : Math.max(0, Math.min(i, count - 1))
43
+ }
44
+ const next = () => go(current + 1)
45
+ const prev = () => go(current - 1)
46
+
47
+ // Autoplay, paused while hovered/focused.
48
+ let paused = $state(false)
49
+ $effect(() => {
50
+ if (!autoplay || paused || count < 2) return
51
+ const t = setInterval(next, autoplay)
52
+ return () => clearInterval(t)
53
+ })
54
+
55
+ // Swipe.
56
+ let dragging = $state(false)
57
+ let startX = 0
58
+ let dx = $state(0)
59
+ function down(e: PointerEvent) {
60
+ dragging = true
61
+ startX = e.clientX
62
+ ;(e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId)
63
+ }
64
+ function move(e: PointerEvent) { if (dragging) dx = e.clientX - startX }
65
+ function up() {
66
+ if (!dragging) return
67
+ dragging = false
68
+ if (Math.abs(dx) > 50) (dx < 0 ? next() : prev())
69
+ dx = 0
70
+ }
71
+ </script>
72
+
73
+ <div
74
+ class="sv-carousel"
75
+ role="group"
76
+ aria-roledescription="carousel"
77
+ aria-label={ariaLabel}
78
+ onpointerenter={() => (paused = true)}
79
+ onpointerleave={() => (paused = false)}
80
+ onfocusin={() => (paused = true)}
81
+ onfocusout={() => (paused = false)}
82
+ >
83
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
84
+ <div class="sv-carousel__viewport" onpointerdown={down} onpointermove={move} onpointerup={up} onpointercancel={up}>
85
+ <div class="sv-carousel__track" class:is-dragging={dragging} style:transform={`translateX(calc(${-current * 100}% + ${dx}px))`}>
86
+ {#each Array(count) as _, i (i)}
87
+ <div class="sv-carousel__slide" role="group" aria-roledescription="slide" aria-label={`${i + 1} of ${count}`} aria-hidden={i !== current}>
88
+ {@render slide?.(i)}
89
+ </div>
90
+ {/each}
91
+ </div>
92
+ </div>
93
+
94
+ {#if arrows && count > 1}
95
+ <button type="button" class="sv-carousel__arrow is-prev" aria-label="Previous slide" onclick={prev} disabled={!loop && current === 0}>‹</button>
96
+ <button type="button" class="sv-carousel__arrow is-next" aria-label="Next slide" onclick={next} disabled={!loop && current === count - 1}>›</button>
97
+ {/if}
98
+
99
+ {#if dots && count > 1}
100
+ <div class="sv-carousel__dots">
101
+ {#each Array(count) as _, i (i)}
102
+ <button type="button" class="sv-carousel__dot" class:is-active={i === current} aria-label={`Go to slide ${i + 1}`} aria-current={i === current ? 'true' : undefined} onclick={() => go(i)}></button>
103
+ {/each}
104
+ </div>
105
+ {/if}
106
+ </div>
107
+
108
+ <style>
109
+ .sv-carousel { position: relative; border-radius: 12px; overflow: hidden; }
110
+ .sv-carousel__viewport { overflow: hidden; touch-action: pan-y; }
111
+ .sv-carousel__track { display: flex; transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1); }
112
+ .sv-carousel__track.is-dragging { transition: none; }
113
+ .sv-carousel__slide { flex: 0 0 100%; min-width: 0; }
114
+ .sv-carousel__slide :global(img) { display: block; width: 100%; height: 100%; object-fit: cover; }
115
+
116
+ .sv-carousel__arrow {
117
+ position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
118
+ width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%;
119
+ background: color-mix(in srgb, var(--sg-bg, #fff) 82%, transparent); color: var(--sg-fg, #0f172a);
120
+ border: 1px solid var(--sg-border, #e2e8f0); cursor: pointer; font-size: 20px; line-height: 1;
121
+ box-shadow: 0 4px 12px -4px rgba(15, 23, 42, 0.3);
122
+ }
123
+ .sv-carousel__arrow.is-prev { inset-inline-start: 10px; }
124
+ .sv-carousel__arrow.is-next { inset-inline-end: 10px; }
125
+ .sv-carousel__arrow:hover:not(:disabled) { background: var(--sg-bg, #fff); }
126
+ .sv-carousel__arrow:disabled { opacity: 0.4; cursor: default; }
127
+
128
+ .sv-carousel__dots { position: absolute; inset-inline: 0; bottom: 10px; display: flex; justify-content: center; gap: 6px; z-index: 2; }
129
+ .sv-carousel__dot {
130
+ width: 8px; height: 8px; border-radius: 50%; border: 0; cursor: pointer; padding: 0;
131
+ background: color-mix(in srgb, var(--sg-fg, #0f172a) 30%, var(--sg-bg, #fff)); transition: background 0.15s, width 0.15s;
132
+ }
133
+ .sv-carousel__dot.is-active { width: 20px; border-radius: 4px; background: var(--sg-accent, #2563eb); }
134
+ </style>
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SvCarousel - a slideshow: a sliding track with prev/next arrows, dot
3
+ * indicators, optional autoplay (pauses on hover/focus) and swipe. Slides are
4
+ * rendered by the `slide` snippet (index in, your content out). Parity: Smart
5
+ * carousel.
6
+ *
7
+ * ```svelte
8
+ * <SvCarousel count={imgs.length} autoplay={4000}>
9
+ * {#snippet slide(i)}<img src={imgs[i]} alt="" />{/snippet}
10
+ * </SvCarousel>
11
+ * ```
12
+ */
13
+ import type { Snippet } from 'svelte';
14
+ type Props = {
15
+ count: number;
16
+ slide?: Snippet<[number]>;
17
+ /** Active slide index (bindable). */
18
+ current?: number;
19
+ /** Autoplay interval in ms; 0 = off. */
20
+ autoplay?: number;
21
+ loop?: boolean;
22
+ arrows?: boolean;
23
+ dots?: boolean;
24
+ ariaLabel?: string;
25
+ };
26
+ declare const SvCarousel: import("svelte").Component<Props, {}, "current">;
27
+ type SvCarousel = ReturnType<typeof SvCarousel>;
28
+ export default SvCarousel;
@@ -4,17 +4,15 @@
4
4
  * label. Parity: Smart `smart-check-box`. Controlled via `checked` + `onChange`.
5
5
  */
6
6
  import type { Snippet } from 'svelte'
7
+ import SvField from './SvField.svelte'
8
+ import { nextEditorId, type SvEditorProps } from './editor-contract'
7
9
  import { createCheckbox } from './createCheckbox.svelte'
8
10
 
9
- type Props = {
11
+ type Props = SvEditorProps & {
10
12
  checked?: boolean
11
13
  indeterminate?: boolean
12
14
  onChange?: (checked: boolean) => void
13
- disabled?: boolean
14
- size?: 'sm' | 'md' | 'lg'
15
- name?: string
16
15
  value?: string
17
- ariaLabel?: string
18
16
  children?: Snippet
19
17
  }
20
18
 
@@ -27,9 +25,18 @@
27
25
  name,
28
26
  value,
29
27
  ariaLabel,
28
+ invalid = false,
29
+ required = false,
30
+ error,
31
+ hint,
32
+ dir,
33
+ id,
30
34
  children,
31
35
  }: Props = $props()
32
36
 
37
+ const autoId = nextEditorId('sv-check')
38
+ const uid = $derived(id ?? autoId)
39
+
33
40
  // The styled checkbox is just a renderer over the headless core. The label
34
41
  // fallback depends on `children` (a render concern), so it is computed here.
35
42
  const cb = createCheckbox({
@@ -38,25 +45,32 @@
38
45
  onChange: (v) => onChange?.(v),
39
46
  disabled: () => disabled,
40
47
  ariaLabel: () => ariaLabel ?? (children ? undefined : 'checkbox'),
48
+ id: () => uid,
49
+ invalid: () => invalid,
50
+ required: () => required,
51
+ error: () => error,
52
+ hint: () => hint,
41
53
  })
42
54
  </script>
43
55
 
44
- <label class="sv-check sv-check--{size}" class:is-disabled={disabled}>
45
- <button
46
- class="sv-check__box"
47
- class:is-checked={checked && !indeterminate}
48
- class:is-indeterminate={indeterminate}
49
- {...cb.boxProps()}
50
- >
51
- {#if indeterminate}
52
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 8h8" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" /></svg>
53
- {:else if checked}
54
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" /></svg>
55
- {/if}
56
- </button>
57
- {#if children}<span class="sv-check__label">{@render children()}</span>{/if}
58
- {#if name}<input type="hidden" {name} value={checked ? (value ?? 'true') : ''} />{/if}
59
- </label>
56
+ <SvField id={uid} {hint} {error} {required} {dir}>
57
+ <label class="sv-check sv-check--{size}" class:is-disabled={disabled} class:is-invalid={invalid}>
58
+ <button
59
+ class="sv-check__box"
60
+ class:is-checked={checked && !indeterminate}
61
+ class:is-indeterminate={indeterminate}
62
+ {...cb.boxProps()}
63
+ >
64
+ {#if indeterminate}
65
+ <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 8h8" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" /></svg>
66
+ {:else if checked}
67
+ <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3.5 8.5l3 3 6-6.5" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" /></svg>
68
+ {/if}
69
+ </button>
70
+ {#if children}<span class="sv-check__label">{@render children()}</span>{/if}
71
+ {#if name}<input type="hidden" {name} value={checked ? (value ?? 'true') : ''} />{/if}
72
+ </label>
73
+ </SvField>
60
74
 
61
75
  <style>
62
76
  .sv-check {
@@ -78,5 +92,6 @@
78
92
  .sv-check__box.is-checked, .sv-check__box.is-indeterminate {
79
93
  background: var(--_accent); border-color: var(--_accent);
80
94
  }
95
+ .sv-check.is-invalid .sv-check__box { border-color: var(--sg-danger, #dc2626); }
81
96
  .sv-check__box:focus-visible { outline: 2px solid var(--sg-focus-ring, var(--_accent)); outline-offset: 2px; }
82
97
  </style>
@@ -3,15 +3,12 @@
3
3
  * label. Parity: Smart `smart-check-box`. Controlled via `checked` + `onChange`.
4
4
  */
5
5
  import type { Snippet } from 'svelte';
6
- type Props = {
6
+ import { type SvEditorProps } from './editor-contract';
7
+ type Props = SvEditorProps & {
7
8
  checked?: boolean;
8
9
  indeterminate?: boolean;
9
10
  onChange?: (checked: boolean) => void;
10
- disabled?: boolean;
11
- size?: 'sm' | 'md' | 'lg';
12
- name?: string;
13
11
  value?: string;
14
- ariaLabel?: string;
15
12
  children?: Snippet;
16
13
  };
17
14
  declare const SvCheckBox: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,88 @@
1
+ <script lang="ts">
2
+ /**
3
+ * SvChip - a compact pill for a selected/filter/entity value: an optional
4
+ * leading avatar/icon, a label, and an optional remove (x) button; optionally
5
+ * clickable. Larger + more interactive than SvBadge (a static status pill).
6
+ * Theme-driven. Parity: Smart chip / tag.
7
+ *
8
+ * ```svelte
9
+ * <SvChip removable onRemove={() => drop(tag)}>{tag}</SvChip>
10
+ * <SvChip variant="accent" onClick={select}>{#snippet leading()}<SvAvatar size="sm" name="Ada" />{/snippet}Ada</SvChip>
11
+ * ```
12
+ */
13
+ import type { Snippet } from 'svelte'
14
+
15
+ type Variant = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info'
16
+
17
+ type Props = {
18
+ variant?: Variant
19
+ size?: 'sm' | 'md'
20
+ /** Show a remove (x) button. */
21
+ removable?: boolean
22
+ onRemove?: () => void
23
+ /** Make the chip's label a button. */
24
+ onClick?: () => void
25
+ /** Filled solid vs soft tint (default soft). */
26
+ solid?: boolean
27
+ disabled?: boolean
28
+ children?: Snippet
29
+ /** Leading content (avatar / icon). */
30
+ leading?: Snippet
31
+ }
32
+
33
+ let {
34
+ variant = 'neutral',
35
+ size = 'md',
36
+ removable = false,
37
+ onRemove,
38
+ onClick,
39
+ solid = false,
40
+ disabled = false,
41
+ children,
42
+ leading,
43
+ }: Props = $props()
44
+ </script>
45
+
46
+ <span class="sv-chip sv-chip--{variant} sv-chip--{size}" class:is-solid={solid} class:is-disabled={disabled}>
47
+ {#if leading}<span class="sv-chip__lead">{@render leading()}</span>{/if}
48
+ {#if onClick}
49
+ <button type="button" class="sv-chip__label sv-chip__label--btn" {disabled} onclick={onClick}>{@render children?.()}</button>
50
+ {:else}
51
+ <span class="sv-chip__label">{@render children?.()}</span>
52
+ {/if}
53
+ {#if removable}
54
+ <button type="button" class="sv-chip__x" aria-label="Remove" {disabled} onclick={onRemove}>&times;</button>
55
+ {/if}
56
+ </span>
57
+
58
+ <style>
59
+ .sv-chip {
60
+ --_c: var(--sg-muted, #64748b);
61
+ display: inline-flex; align-items: center; gap: 5px; box-sizing: border-box;
62
+ border-radius: 999px; font-weight: 550; white-space: nowrap; max-width: 100%;
63
+ color: var(--_c);
64
+ background: color-mix(in srgb, var(--_c) 13%, transparent);
65
+ border: 1px solid color-mix(in srgb, var(--_c) 22%, transparent);
66
+ }
67
+ .sv-chip.is-solid { color: var(--sg-on-accent, #fff); background: var(--_c); border-color: var(--_c); }
68
+ .sv-chip.is-disabled { opacity: 0.55; pointer-events: none; }
69
+ .sv-chip--sm { font-size: 11.5px; padding: 1px 4px 1px 8px; height: 22px; }
70
+ .sv-chip--md { font-size: 12.5px; padding: 2px 5px 2px 10px; height: 26px; }
71
+ .sv-chip:not(:has(.sv-chip__x)).sv-chip--sm { padding-inline-end: 8px; }
72
+ .sv-chip:not(:has(.sv-chip__x)).sv-chip--md { padding-inline-end: 10px; }
73
+ .sv-chip__lead { display: inline-flex; margin-inline-start: -4px; }
74
+ .sv-chip__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
75
+ .sv-chip__label--btn { background: none; border: 0; padding: 0; font: inherit; color: inherit; cursor: pointer; }
76
+ .sv-chip__x {
77
+ flex: none; display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%;
78
+ background: none; border: 0; color: currentColor; cursor: pointer; font-size: 14px; line-height: 1; opacity: 0.7;
79
+ }
80
+ .sv-chip__x:hover { opacity: 1; background: color-mix(in srgb, currentColor 20%, transparent); }
81
+
82
+ .sv-chip--neutral { --_c: var(--sg-muted, #64748b); }
83
+ .sv-chip--accent { --_c: var(--sg-accent, #2563eb); }
84
+ .sv-chip--success { --_c: var(--sg-success, #16a34a); }
85
+ .sv-chip--warning { --_c: var(--sg-warning, #d97706); }
86
+ .sv-chip--danger { --_c: var(--sg-danger, #dc2626); }
87
+ .sv-chip--info { --_c: var(--sg-info, #0891b2); }
88
+ </style>
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SvChip - a compact pill for a selected/filter/entity value: an optional
3
+ * leading avatar/icon, a label, and an optional remove (x) button; optionally
4
+ * clickable. Larger + more interactive than SvBadge (a static status pill).
5
+ * Theme-driven. Parity: Smart chip / tag.
6
+ *
7
+ * ```svelte
8
+ * <SvChip removable onRemove={() => drop(tag)}>{tag}</SvChip>
9
+ * <SvChip variant="accent" onClick={select}>{#snippet leading()}<SvAvatar size="sm" name="Ada" />{/snippet}Ada</SvChip>
10
+ * ```
11
+ */
12
+ import type { Snippet } from 'svelte';
13
+ type Variant = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
14
+ type Props = {
15
+ variant?: Variant;
16
+ size?: 'sm' | 'md';
17
+ /** Show a remove (x) button. */
18
+ removable?: boolean;
19
+ onRemove?: () => void;
20
+ /** Make the chip's label a button. */
21
+ onClick?: () => void;
22
+ /** Filled solid vs soft tint (default soft). */
23
+ solid?: boolean;
24
+ disabled?: boolean;
25
+ children?: Snippet;
26
+ /** Leading content (avatar / icon). */
27
+ leading?: Snippet;
28
+ };
29
+ declare const SvChip: import("svelte").Component<Props, {}, "">;
30
+ type SvChip = ReturnType<typeof SvChip>;
31
+ export default SvChip;
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ /**
3
+ * SvCircularProgress - a circular / ring progress indicator (WAI-ARIA
4
+ * `progressbar`). Determinate (value/max) or `indeterminate` (spinning), with
5
+ * color intents, sizing/thickness, and an optional center label or `children`
6
+ * snippet. Theme-driven; respects prefers-reduced-motion.
7
+ *
8
+ * ```svelte
9
+ * <SvCircularProgress value={72} showLabel />
10
+ * <SvCircularProgress indeterminate size={28} color="accent" />
11
+ * ```
12
+ */
13
+ import type { Snippet } from 'svelte'
14
+
15
+ type Props = {
16
+ value?: number
17
+ max?: number
18
+ indeterminate?: boolean
19
+ /** Diameter in px. */
20
+ size?: number
21
+ /** Ring stroke width in px. */
22
+ thickness?: number
23
+ color?: 'accent' | 'success' | 'warning' | 'danger'
24
+ /** Show a percentage label in the center. */
25
+ showLabel?: boolean
26
+ formatLabel?: (value: number, max: number) => string
27
+ ariaLabel?: string
28
+ /** Custom center content (overrides showLabel). */
29
+ children?: Snippet
30
+ }
31
+
32
+ let {
33
+ value = 0,
34
+ max = 100,
35
+ indeterminate = false,
36
+ size = 48,
37
+ thickness = 5,
38
+ color = 'accent',
39
+ showLabel = false,
40
+ formatLabel,
41
+ ariaLabel,
42
+ children,
43
+ }: Props = $props()
44
+
45
+ const r = $derived((size - thickness) / 2)
46
+ const circ = $derived(2 * Math.PI * r)
47
+ const pct = $derived(max > 0 ? Math.min(100, Math.max(0, (value / max) * 100)) : 0)
48
+ const offset = $derived(circ * (1 - pct / 100))
49
+ const label = $derived(formatLabel ? formatLabel(value, max) : `${Math.round(pct)}%`)
50
+ </script>
51
+
52
+ <div
53
+ class="sv-circ sv-circ--{color}"
54
+ class:is-indeterminate={indeterminate}
55
+ style:width={`${size}px`}
56
+ style:height={`${size}px`}
57
+ role="progressbar"
58
+ aria-label={ariaLabel}
59
+ aria-valuemin={indeterminate ? undefined : 0}
60
+ aria-valuemax={indeterminate ? undefined : max}
61
+ aria-valuenow={indeterminate ? undefined : value}
62
+ aria-valuetext={indeterminate ? undefined : label}
63
+ >
64
+ <svg class="sv-circ__svg" viewBox={`0 0 ${size} ${size}`} width={size} height={size}>
65
+ <circle class="sv-circ__track" cx={size / 2} cy={size / 2} r={r} fill="none" stroke-width={thickness} />
66
+ <circle
67
+ class="sv-circ__arc"
68
+ cx={size / 2}
69
+ cy={size / 2}
70
+ r={r}
71
+ fill="none"
72
+ stroke-width={thickness}
73
+ stroke-linecap="round"
74
+ stroke-dasharray={circ}
75
+ stroke-dashoffset={indeterminate ? circ * 0.7 : offset}
76
+ />
77
+ </svg>
78
+ {#if children}
79
+ <div class="sv-circ__center">{@render children()}</div>
80
+ {:else if showLabel && !indeterminate}
81
+ <div class="sv-circ__center sv-circ__label" style:font-size={`${Math.max(9, size * 0.26)}px`}>{label}</div>
82
+ {/if}
83
+ </div>
84
+
85
+ <style>
86
+ .sv-circ {
87
+ --_accent: var(--sg-accent, #2563eb);
88
+ --_c: var(--_accent);
89
+ position: relative; display: inline-flex; flex: none;
90
+ }
91
+ .sv-circ--success { --_c: var(--sg-success, #16a34a); }
92
+ .sv-circ--warning { --_c: var(--sg-warning, #f59e0b); }
93
+ .sv-circ--danger { --_c: var(--sg-danger, #dc2626); }
94
+ .sv-circ__svg { display: block; transform: rotate(-90deg); }
95
+ .sv-circ__track { stroke: var(--sg-border, #e2e8f0); }
96
+ .sv-circ__arc { stroke: var(--_c); transition: stroke-dashoffset 0.35s cubic-bezier(0.16, 1, 0.3, 1); }
97
+ .sv-circ.is-indeterminate .sv-circ__svg { animation: sv-circ-spin 0.9s linear infinite; }
98
+ .sv-circ.is-indeterminate .sv-circ__arc { transition: none; }
99
+ @keyframes sv-circ-spin { to { transform: rotate(270deg); } }
100
+ @media (prefers-reduced-motion: reduce) {
101
+ .sv-circ.is-indeterminate .sv-circ__svg { animation-duration: 2.4s; }
102
+ .sv-circ__arc { transition: none; }
103
+ }
104
+ .sv-circ__center {
105
+ position: absolute; inset: 0; display: grid; place-items: center;
106
+ color: var(--sg-fg, #0f172a);
107
+ }
108
+ .sv-circ__label { font-weight: 700; font-variant-numeric: tabular-nums; }
109
+ </style>
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SvCircularProgress - a circular / ring progress indicator (WAI-ARIA
3
+ * `progressbar`). Determinate (value/max) or `indeterminate` (spinning), with
4
+ * color intents, sizing/thickness, and an optional center label or `children`
5
+ * snippet. Theme-driven; respects prefers-reduced-motion.
6
+ *
7
+ * ```svelte
8
+ * <SvCircularProgress value={72} showLabel />
9
+ * <SvCircularProgress indeterminate size={28} color="accent" />
10
+ * ```
11
+ */
12
+ import type { Snippet } from 'svelte';
13
+ type Props = {
14
+ value?: number;
15
+ max?: number;
16
+ indeterminate?: boolean;
17
+ /** Diameter in px. */
18
+ size?: number;
19
+ /** Ring stroke width in px. */
20
+ thickness?: number;
21
+ color?: 'accent' | 'success' | 'warning' | 'danger';
22
+ /** Show a percentage label in the center. */
23
+ showLabel?: boolean;
24
+ formatLabel?: (value: number, max: number) => string;
25
+ ariaLabel?: string;
26
+ /** Custom center content (overrides showLabel). */
27
+ children?: Snippet;
28
+ };
29
+ declare const SvCircularProgress: import("svelte").Component<Props, {}, "">;
30
+ type SvCircularProgress = ReturnType<typeof SvCircularProgress>;
31
+ export default SvCircularProgress;