@svgrid/grid 1.2.34 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/README.md +6 -5
  2. package/dist/SvAccordion.svelte +109 -0
  3. package/dist/SvAccordion.svelte.d.ts +28 -0
  4. package/dist/SvAlert.svelte +92 -0
  5. package/dist/SvAlert.svelte.d.ts +27 -0
  6. package/dist/SvAutoComplete.svelte +47 -18
  7. package/dist/SvAutoComplete.svelte.d.ts +2 -5
  8. package/dist/SvAvatar.svelte +75 -0
  9. package/dist/SvAvatar.svelte.d.ts +14 -0
  10. package/dist/SvAvatarGroup.svelte +48 -0
  11. package/dist/SvAvatarGroup.svelte.d.ts +16 -0
  12. package/dist/SvBadge.svelte +54 -0
  13. package/dist/SvBadge.svelte.d.ts +23 -0
  14. package/dist/SvBreadcrumb.svelte +88 -0
  15. package/dist/SvBreadcrumb.svelte.d.ts +23 -0
  16. package/dist/SvButtonGroup.svelte +121 -0
  17. package/dist/SvButtonGroup.svelte.d.ts +16 -0
  18. package/dist/SvCalendar.svelte +72 -9
  19. package/dist/SvCalendar.svelte.d.ts +34 -1
  20. package/dist/SvCard.svelte +71 -0
  21. package/dist/SvCard.svelte.d.ts +28 -0
  22. package/dist/SvCarousel.svelte +134 -0
  23. package/dist/SvCarousel.svelte.d.ts +28 -0
  24. package/dist/SvCheckBox.svelte +36 -21
  25. package/dist/SvCheckBox.svelte.d.ts +2 -5
  26. package/dist/SvChip.svelte +88 -0
  27. package/dist/SvChip.svelte.d.ts +31 -0
  28. package/dist/SvCircularProgress.svelte +109 -0
  29. package/dist/SvCircularProgress.svelte.d.ts +31 -0
  30. package/dist/SvColorInput.svelte +54 -27
  31. package/dist/SvColorInput.svelte.d.ts +10 -6
  32. package/dist/SvComboBox.svelte +119 -33
  33. package/dist/SvComboBox.svelte.d.ts +18 -6
  34. package/dist/SvCommand.svelte +197 -0
  35. package/dist/SvCommand.svelte.d.ts +26 -0
  36. package/dist/SvContextMenu.svelte +96 -0
  37. package/dist/SvContextMenu.svelte.d.ts +25 -0
  38. package/dist/SvCountryInput.svelte +56 -21
  39. package/dist/SvCountryInput.svelte.d.ts +9 -5
  40. package/dist/SvDateRangeInput.svelte +256 -0
  41. package/dist/SvDateRangeInput.svelte.d.ts +37 -0
  42. package/dist/SvDateTimePicker.svelte +57 -20
  43. package/dist/SvDateTimePicker.svelte.d.ts +12 -4
  44. package/dist/SvDivider.svelte +61 -0
  45. package/dist/SvDivider.svelte.d.ts +22 -0
  46. package/dist/SvDrawer.svelte +226 -0
  47. package/dist/SvDrawer.svelte.d.ts +43 -0
  48. package/dist/SvDropDownList.svelte +114 -35
  49. package/dist/SvDropDownList.svelte.d.ts +7 -6
  50. package/dist/SvDurationInput.svelte +108 -0
  51. package/dist/SvDurationInput.svelte.d.ts +15 -0
  52. package/dist/SvEmptyState.svelte +59 -0
  53. package/dist/SvEmptyState.svelte.d.ts +25 -0
  54. package/dist/SvField.svelte +85 -0
  55. package/dist/SvField.svelte.d.ts +30 -0
  56. package/dist/SvFileUpload.svelte +169 -0
  57. package/dist/SvFileUpload.svelte.d.ts +24 -0
  58. package/dist/SvForm.svelte +7 -1
  59. package/dist/SvForm.svelte.d.ts +3 -0
  60. package/dist/SvGauge.svelte +7 -1
  61. package/dist/SvGauge.svelte.d.ts +11 -0
  62. package/dist/SvGrid.controller.svelte.d.ts +6 -0
  63. package/dist/SvGrid.controller.svelte.js +64 -9
  64. package/dist/SvGrid.css +33 -0
  65. package/dist/SvGrid.svelte +116 -3
  66. package/dist/SvGrid.types.d.ts +366 -0
  67. package/dist/SvGridBoard.svelte +2281 -0
  68. package/dist/SvGridBoard.svelte.d.ts +31 -0
  69. package/dist/SvGridDropdown.svelte +2 -1
  70. package/dist/SvGridSelect.svelte +255 -0
  71. package/dist/SvGridSelect.svelte.d.ts +32 -0
  72. package/dist/SvGroupCell.svelte +109 -0
  73. package/dist/SvGroupCell.svelte.d.ts +41 -0
  74. package/dist/SvListBox.svelte +123 -36
  75. package/dist/SvListBox.svelte.d.ts +12 -8
  76. package/dist/SvMaskedInput.svelte +53 -13
  77. package/dist/SvMaskedInput.svelte.d.ts +16 -6
  78. package/dist/SvMenu.svelte +101 -0
  79. package/dist/SvMenu.svelte.d.ts +26 -0
  80. package/dist/SvMenuList.svelte +143 -0
  81. package/dist/SvMenuList.svelte.d.ts +24 -0
  82. package/dist/SvModal.svelte +220 -0
  83. package/dist/SvModal.svelte.d.ts +31 -0
  84. package/dist/SvMultiSelect.svelte +277 -0
  85. package/dist/SvMultiSelect.svelte.d.ts +31 -0
  86. package/dist/SvNavPane.svelte +314 -0
  87. package/dist/SvNavPane.svelte.d.ts +59 -0
  88. package/dist/SvNumberInput.svelte +23 -9
  89. package/dist/SvNumberInput.svelte.d.ts +2 -0
  90. package/dist/SvOtpInput.svelte +157 -0
  91. package/dist/SvOtpInput.svelte.d.ts +16 -0
  92. package/dist/SvPagination.svelte +100 -0
  93. package/dist/SvPagination.svelte.d.ts +16 -0
  94. package/dist/SvPasswordInput.svelte +42 -12
  95. package/dist/SvPasswordInput.svelte.d.ts +13 -6
  96. package/dist/SvPhoneInput.svelte +43 -11
  97. package/dist/SvPhoneInput.svelte.d.ts +10 -11
  98. package/dist/SvPopover.svelte +127 -0
  99. package/dist/SvPopover.svelte.d.ts +35 -0
  100. package/dist/SvProgress.svelte +116 -0
  101. package/dist/SvProgress.svelte.d.ts +32 -0
  102. package/dist/SvRadioGroup.svelte +40 -22
  103. package/dist/SvRadioGroup.svelte.d.ts +2 -10
  104. package/dist/SvRating.svelte +51 -30
  105. package/dist/SvRating.svelte.d.ts +10 -7
  106. package/dist/SvRichText.svelte +192 -0
  107. package/dist/SvRichText.svelte.d.ts +16 -0
  108. package/dist/SvRowGroupPanel.svelte +147 -0
  109. package/dist/SvRowGroupPanel.svelte.d.ts +17 -0
  110. package/dist/SvScrollArea.svelte +50 -0
  111. package/dist/SvScrollArea.svelte.d.ts +22 -0
  112. package/dist/SvSkeleton.svelte +76 -0
  113. package/dist/SvSkeleton.svelte.d.ts +25 -0
  114. package/dist/SvSlider.svelte +41 -9
  115. package/dist/SvSlider.svelte.d.ts +4 -4
  116. package/dist/SvSparkline.svelte +77 -0
  117. package/dist/SvSparkline.svelte.d.ts +28 -0
  118. package/dist/SvSplitter.svelte +138 -0
  119. package/dist/SvSplitter.svelte.d.ts +32 -0
  120. package/dist/SvStat.svelte +86 -0
  121. package/dist/SvStat.svelte.d.ts +30 -0
  122. package/dist/SvStepper.svelte +91 -0
  123. package/dist/SvStepper.svelte.d.ts +24 -0
  124. package/dist/SvSwitchButton.svelte +39 -24
  125. package/dist/SvSwitchButton.svelte.d.ts +2 -5
  126. package/dist/SvTabs.svelte +147 -28
  127. package/dist/SvTabs.svelte.d.ts +16 -4
  128. package/dist/SvTagsInput.svelte +59 -22
  129. package/dist/SvTagsInput.svelte.d.ts +9 -4
  130. package/dist/SvTextArea.svelte +113 -0
  131. package/dist/SvTextArea.svelte.d.ts +18 -0
  132. package/dist/SvTextInput.svelte +115 -0
  133. package/dist/SvTextInput.svelte.d.ts +20 -0
  134. package/dist/SvTimePicker.svelte +19 -5
  135. package/dist/SvTimePicker.svelte.d.ts +12 -0
  136. package/dist/SvTimeline.svelte +75 -0
  137. package/dist/SvTimeline.svelte.d.ts +24 -0
  138. package/dist/SvToaster.svelte +124 -0
  139. package/dist/SvToaster.svelte.d.ts +10 -0
  140. package/dist/SvToggleButton.svelte +37 -12
  141. package/dist/SvToggleButton.svelte.d.ts +2 -4
  142. package/dist/SvTooltip.svelte +113 -0
  143. package/dist/SvTooltip.svelte.d.ts +22 -0
  144. package/dist/SvTour.svelte +151 -0
  145. package/dist/SvTour.svelte.d.ts +25 -0
  146. package/dist/SvTree.svelte +286 -44
  147. package/dist/SvTree.svelte.d.ts +26 -9
  148. package/dist/SvTreeSelect.svelte +222 -0
  149. package/dist/SvTreeSelect.svelte.d.ts +24 -0
  150. package/dist/a11y/dismissable.d.ts +32 -0
  151. package/dist/a11y/dismissable.js +54 -0
  152. package/dist/a11y/focus-trap.d.ts +39 -0
  153. package/dist/a11y/focus-trap.js +142 -0
  154. package/dist/a11y/live-region.d.ts +8 -0
  155. package/dist/a11y/live-region.js +60 -0
  156. package/dist/a11y/scroll-lock.d.ts +4 -0
  157. package/dist/a11y/scroll-lock.js +41 -0
  158. package/dist/a11y.d.ts +3 -1
  159. package/dist/a11y.js +1 -1
  160. package/dist/avatar.d.ts +10 -0
  161. package/dist/avatar.js +22 -0
  162. package/dist/builtin-editors.d.ts +5 -0
  163. package/dist/builtin-editors.js +55 -0
  164. package/dist/cdn/svgrid.js +16021 -8234
  165. package/dist/cdn/svgrid.svelte-external.js +14542 -6764
  166. package/dist/columns.js +3 -2
  167. package/dist/core.d.ts +7 -1
  168. package/dist/countries.d.ts +12 -0
  169. package/dist/countries.js +24 -0
  170. package/dist/createAccordion.svelte.d.ts +71 -0
  171. package/dist/createAccordion.svelte.js +99 -0
  172. package/dist/createAutocomplete.svelte.d.ts +13 -4
  173. package/dist/createAutocomplete.svelte.js +11 -1
  174. package/dist/createButtonGroup.svelte.d.ts +62 -0
  175. package/dist/createButtonGroup.svelte.js +154 -0
  176. package/dist/createCalendar.svelte.d.ts +5 -0
  177. package/dist/createCalendar.svelte.js +2 -0
  178. package/dist/createCheckbox.svelte.d.ts +9 -17
  179. package/dist/createCheckbox.svelte.js +28 -1
  180. package/dist/createColorInput.svelte.d.ts +12 -22
  181. package/dist/createColorInput.svelte.js +13 -0
  182. package/dist/createCombobox.svelte.d.ts +16 -5
  183. package/dist/createCombobox.svelte.js +13 -2
  184. package/dist/createCountryInput.svelte.d.ts +14 -3
  185. package/dist/createCountryInput.svelte.js +12 -2
  186. package/dist/createDateTimePicker.svelte.d.ts +17 -2
  187. package/dist/createDateTimePicker.svelte.js +12 -2
  188. package/dist/createDropdownList.svelte.d.ts +14 -5
  189. package/dist/createDropdownList.svelte.js +50 -1
  190. package/dist/createFileUpload.svelte.d.ts +68 -0
  191. package/dist/createFileUpload.svelte.js +122 -0
  192. package/dist/createListbox.svelte.d.ts +10 -1
  193. package/dist/createListbox.svelte.js +48 -1
  194. package/dist/createMaskedInput.svelte.d.ts +11 -2
  195. package/dist/createMaskedInput.svelte.js +11 -1
  196. package/dist/createNumberInput.svelte.d.ts +1 -0
  197. package/dist/createNumberInput.svelte.js +1 -0
  198. package/dist/createPasswordInput.svelte.d.ts +19 -21
  199. package/dist/createPasswordInput.svelte.js +16 -4
  200. package/dist/createPhoneInput.svelte.d.ts +26 -7
  201. package/dist/createPhoneInput.svelte.js +24 -3
  202. package/dist/createPopoverSelect.svelte.d.ts +86 -0
  203. package/dist/createPopoverSelect.svelte.js +196 -0
  204. package/dist/createRadioGroup.svelte.d.ts +9 -0
  205. package/dist/createRadioGroup.svelte.js +11 -1
  206. package/dist/createRating.svelte.d.ts +11 -0
  207. package/dist/createRating.svelte.js +12 -1
  208. package/dist/createSlider.svelte.d.ts +2 -0
  209. package/dist/createSlider.svelte.js +16 -5
  210. package/dist/createSplitter.svelte.d.ts +67 -0
  211. package/dist/createSplitter.svelte.js +99 -0
  212. package/dist/createSwitch.svelte.d.ts +9 -16
  213. package/dist/createSwitch.svelte.js +28 -1
  214. package/dist/createTabs.svelte.d.ts +7 -0
  215. package/dist/createTabs.svelte.js +17 -2
  216. package/dist/createTagsInput.svelte.d.ts +13 -1
  217. package/dist/createTagsInput.svelte.js +12 -3
  218. package/dist/createToggle.svelte.d.ts +9 -0
  219. package/dist/createToggle.svelte.js +12 -1
  220. package/dist/createTree.svelte.d.ts +19 -0
  221. package/dist/createTree.svelte.js +108 -15
  222. package/dist/debounce.d.ts +11 -0
  223. package/dist/debounce.js +30 -0
  224. package/dist/duration.d.ts +15 -0
  225. package/dist/duration.js +51 -0
  226. package/dist/editor-contract.d.ts +62 -7
  227. package/dist/editor-contract.js +45 -5
  228. package/dist/editor-registry.d.ts +67 -0
  229. package/dist/editor-registry.js +38 -0
  230. package/dist/editors/cell-editors.d.ts +1 -1
  231. package/dist/editors/cell-editors.js +5 -0
  232. package/dist/fuzzy.d.ts +3 -0
  233. package/dist/fuzzy.js +41 -0
  234. package/dist/grid-select.d.ts +9 -0
  235. package/dist/grid-select.js +8 -0
  236. package/dist/index.d.ts +79 -6
  237. package/dist/index.js +78 -4
  238. package/dist/keyboard-handlers.js +19 -0
  239. package/dist/list-option.d.ts +36 -0
  240. package/dist/list-option.js +68 -0
  241. package/dist/otp.d.ts +16 -0
  242. package/dist/otp.js +26 -0
  243. package/dist/paginate.d.ts +20 -0
  244. package/dist/paginate.js +40 -0
  245. package/dist/popover.d.ts +15 -1
  246. package/dist/popover.js +29 -3
  247. package/dist/recurrence.d.ts +36 -0
  248. package/dist/recurrence.js +90 -0
  249. package/dist/server-data-source.d.ts +89 -0
  250. package/dist/server-data-source.js +4 -0
  251. package/dist/server-group-model.d.ts +98 -0
  252. package/dist/server-group-model.js +263 -0
  253. package/dist/toast-store.svelte.d.ts +41 -0
  254. package/dist/toast-store.svelte.js +113 -0
  255. package/dist/tree-select.d.ts +19 -0
  256. package/dist/tree-select.js +40 -0
  257. package/dist/ui-app.types.d.ts +80 -0
  258. package/dist/ui-app.types.js +7 -0
  259. package/dist/validators.d.ts +43 -0
  260. package/dist/validators.js +53 -0
  261. package/dist/virtual.d.ts +35 -0
  262. package/dist/virtual.js +34 -0
  263. package/package.json +1 -1
  264. package/src/SvAccordion.svelte +109 -0
  265. package/src/SvAccordion.test.ts +66 -0
  266. package/src/SvAlert.svelte +92 -0
  267. package/src/SvAutoComplete.svelte +47 -18
  268. package/src/SvAvatar.svelte +75 -0
  269. package/src/SvAvatarGroup.svelte +48 -0
  270. package/src/SvBadge.svelte +54 -0
  271. package/src/SvBreadcrumb.svelte +88 -0
  272. package/src/SvButtonGroup.svelte +121 -0
  273. package/src/SvButtonGroup.test.ts +72 -0
  274. package/src/SvCalendar.svelte +72 -9
  275. package/src/SvCard.svelte +71 -0
  276. package/src/SvCarousel.svelte +134 -0
  277. package/src/SvCheckBox.svelte +36 -21
  278. package/src/SvChip.svelte +88 -0
  279. package/src/SvCircularProgress.svelte +109 -0
  280. package/src/SvColorInput.svelte +54 -27
  281. package/src/SvComboBox.svelte +119 -33
  282. package/src/SvCommand.svelte +197 -0
  283. package/src/SvContextMenu.svelte +96 -0
  284. package/src/SvCountryInput.svelte +56 -21
  285. package/src/SvDateRangeInput.svelte +256 -0
  286. package/src/SvDateRangeInput.test.ts +80 -0
  287. package/src/SvDateTimePicker.svelte +57 -20
  288. package/src/SvDivider.svelte +61 -0
  289. package/src/SvDrawer.svelte +226 -0
  290. package/src/SvDrawer.test.ts +125 -0
  291. package/src/SvDropDownList.svelte +114 -35
  292. package/src/SvDurationInput.svelte +108 -0
  293. package/src/SvEmptyState.svelte +59 -0
  294. package/src/SvField.svelte +85 -0
  295. package/src/SvFileUpload.svelte +169 -0
  296. package/src/SvFileUpload.test.ts +59 -0
  297. package/src/SvForm.svelte +7 -1
  298. package/src/SvGauge.svelte +7 -1
  299. package/src/SvGrid.controller.svelte.ts +68 -9
  300. package/src/SvGrid.css +33 -0
  301. package/src/SvGrid.svelte +116 -3
  302. package/src/SvGrid.types.ts +374 -0
  303. package/src/SvGridBoard.svelte +2281 -0
  304. package/src/SvGridDropdown.svelte +2 -1
  305. package/src/SvGridSelect.svelte +255 -0
  306. package/src/SvGridSelect.test.ts +100 -0
  307. package/src/SvGroupCell.svelte +109 -0
  308. package/src/SvListBox.svelte +123 -36
  309. package/src/SvMaskedInput.svelte +53 -13
  310. package/src/SvMenu.svelte +101 -0
  311. package/src/SvMenu.test.ts +73 -0
  312. package/src/SvMenuList.svelte +143 -0
  313. package/src/SvModal.svelte +220 -0
  314. package/src/SvMultiSelect.svelte +277 -0
  315. package/src/SvMultiSelect.test.ts +167 -0
  316. package/src/SvNavPane.svelte +314 -0
  317. package/src/SvNavPane.test.ts +70 -0
  318. package/src/SvNumberInput.svelte +23 -9
  319. package/src/SvOtpInput.svelte +157 -0
  320. package/src/SvPagination.svelte +100 -0
  321. package/src/SvPasswordInput.svelte +42 -12
  322. package/src/SvPhoneInput.svelte +43 -11
  323. package/src/SvPopover.svelte +127 -0
  324. package/src/SvProgress.svelte +116 -0
  325. package/src/SvRadioGroup.svelte +40 -22
  326. package/src/SvRating.svelte +51 -30
  327. package/src/SvRichText.svelte +192 -0
  328. package/src/SvRowGroupPanel.svelte +147 -0
  329. package/src/SvScrollArea.svelte +50 -0
  330. package/src/SvSkeleton.svelte +76 -0
  331. package/src/SvSlider.svelte +41 -9
  332. package/src/SvSparkline.svelte +77 -0
  333. package/src/SvSplitter.svelte +138 -0
  334. package/src/SvSplitter.test.ts +55 -0
  335. package/src/SvStat.svelte +86 -0
  336. package/src/SvStepper.svelte +91 -0
  337. package/src/SvSwitchButton.svelte +39 -24
  338. package/src/SvTabs.svelte +147 -28
  339. package/src/SvTagsInput.svelte +59 -22
  340. package/src/SvTextArea.svelte +113 -0
  341. package/src/SvTextInput.svelte +115 -0
  342. package/src/SvTimePicker.svelte +19 -5
  343. package/src/SvTimeline.svelte +75 -0
  344. package/src/SvToaster.svelte +124 -0
  345. package/src/SvToaster.test.ts +63 -0
  346. package/src/SvToggleButton.svelte +37 -12
  347. package/src/SvTooltip.svelte +113 -0
  348. package/src/SvTour.svelte +151 -0
  349. package/src/SvTree.svelte +286 -44
  350. package/src/SvTreeSelect.svelte +222 -0
  351. package/src/SvTreeSelect.test.ts +87 -0
  352. package/src/a11y/dismissable.test.ts +95 -0
  353. package/src/a11y/dismissable.ts +94 -0
  354. package/src/a11y/focus-trap.test.ts +110 -0
  355. package/src/a11y/focus-trap.ts +134 -0
  356. package/src/a11y/live-region.test.ts +40 -0
  357. package/src/a11y/live-region.ts +65 -0
  358. package/src/a11y/scroll-lock.test.ts +38 -0
  359. package/src/a11y/scroll-lock.ts +41 -0
  360. package/src/a11y.ts +3 -1
  361. package/src/avatar.test.ts +32 -0
  362. package/src/avatar.ts +21 -0
  363. package/src/board.test.ts +927 -0
  364. package/src/builtin-editors.grid.test.ts +85 -0
  365. package/src/builtin-editors.test.ts +58 -0
  366. package/src/builtin-editors.ts +56 -0
  367. package/src/columns.ts +3 -2
  368. package/src/core.ts +10 -0
  369. package/src/countries.ts +25 -0
  370. package/src/createAccordion.svelte.ts +126 -0
  371. package/src/createAutocomplete.svelte.ts +18 -1
  372. package/src/createButtonGroup.svelte.ts +166 -0
  373. package/src/createCalendar.svelte.ts +6 -0
  374. package/src/createCheckbox.svelte.ts +23 -1
  375. package/src/createColorInput.svelte.ts +20 -0
  376. package/src/createCombobox.svelte.ts +22 -2
  377. package/src/createCountryInput.svelte.ts +21 -2
  378. package/src/createDateTimePicker.svelte.ts +23 -2
  379. package/src/createDropdownList.svelte.ts +31 -2
  380. package/src/createFileUpload.svelte.ts +144 -0
  381. package/src/createListbox.svelte.ts +35 -3
  382. package/src/createMaskedInput.svelte.ts +18 -1
  383. package/src/createNumberInput.svelte.ts +2 -0
  384. package/src/createPasswordInput.svelte.ts +31 -5
  385. package/src/createPhoneInput.svelte.ts +38 -4
  386. package/src/createPopoverSelect.svelte.ts +208 -0
  387. package/src/createRadioGroup.svelte.ts +23 -1
  388. package/src/createRating.svelte.ts +26 -1
  389. package/src/createSlider.svelte.ts +14 -3
  390. package/src/createSplitter.svelte.ts +119 -0
  391. package/src/createSwitch.svelte.ts +26 -3
  392. package/src/createTabs.svelte.ts +20 -3
  393. package/src/createTagsInput.svelte.ts +24 -3
  394. package/src/createToggle.svelte.ts +25 -2
  395. package/src/createTree.svelte.ts +104 -14
  396. package/src/debounce.test.ts +50 -0
  397. package/src/debounce.ts +41 -0
  398. package/src/duration.test.ts +41 -0
  399. package/src/duration.ts +51 -0
  400. package/src/editor-contract.ts +87 -8
  401. package/src/editor-registry.grid.test.ts +98 -0
  402. package/src/editor-registry.test.ts +86 -0
  403. package/src/editor-registry.ts +106 -0
  404. package/src/editors/cell-editors.ts +10 -1
  405. package/src/fuzzy.test.ts +40 -0
  406. package/src/fuzzy.ts +39 -0
  407. package/src/grid-select.test.ts +28 -0
  408. package/src/grid-select.ts +20 -0
  409. package/src/index.ts +150 -5
  410. package/src/keyboard-handlers.ts +20 -0
  411. package/src/list-option.ts +74 -0
  412. package/src/list-power.test.ts +71 -0
  413. package/src/otp.test.ts +28 -0
  414. package/src/otp.ts +28 -0
  415. package/src/overlays.test.ts +85 -0
  416. package/src/paginate.test.ts +41 -0
  417. package/src/paginate.ts +61 -0
  418. package/src/phone-valid.test.ts +26 -0
  419. package/src/popover.ts +31 -3
  420. package/src/progress.test.ts +55 -0
  421. package/src/recurrence.test.ts +91 -0
  422. package/src/recurrence.ts +111 -0
  423. package/src/server-data-source.ts +102 -0
  424. package/src/server-group-model.test.ts +294 -0
  425. package/src/server-group-model.ts +370 -0
  426. package/src/svgrid.responsive.test.ts +72 -0
  427. package/src/toast-store.svelte.ts +148 -0
  428. package/src/toast-store.test.ts +86 -0
  429. package/src/tree-edit.test.ts +49 -0
  430. package/src/tree-filter.test.ts +56 -0
  431. package/src/tree-select.test.ts +48 -0
  432. package/src/tree-select.ts +62 -0
  433. package/src/ui-app.test.ts +130 -0
  434. package/src/ui-app.types.ts +88 -0
  435. package/src/ui-display.test.ts +79 -0
  436. package/src/ui-inputs.test.ts +1 -1
  437. package/src/ui-status.test.ts +141 -0
  438. package/src/ui-tier1.test.ts +142 -0
  439. package/src/ui-tier2.test.ts +124 -0
  440. package/src/ui-tier3.test.ts +139 -0
  441. package/src/validators.test.ts +58 -0
  442. package/src/validators.ts +105 -0
  443. package/src/virtual.test.ts +72 -0
  444. package/src/virtual.ts +67 -0
@@ -0,0 +1,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;