@skewedaspect/sleekspace-ui 0.8.0 → 0.9.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 (341) hide show
  1. package/dist/{src/components → components}/Accordion/SkAccordion.vue.d.ts +1 -1
  2. package/dist/{src/components → components}/Accordion/types.d.ts +1 -1
  3. package/dist/{src/components → components}/Alert/SkAlert.vue.d.ts +1 -1
  4. package/dist/{src/components → components}/Alert/types.d.ts +1 -1
  5. package/dist/{src/components → components}/Avatar/SkAvatar.vue.d.ts +1 -1
  6. package/dist/{src/components → components}/Avatar/types.d.ts +1 -1
  7. package/dist/{src/components → components}/Breadcrumbs/SkBreadcrumbs.vue.d.ts +2 -2
  8. package/dist/{src/components → components}/Breadcrumbs/types.d.ts +1 -1
  9. package/dist/{src/components → components}/Button/SkButton.vue.d.ts +1 -1
  10. package/dist/{src/components → components}/Button/types.d.ts +1 -1
  11. package/dist/{src/components → components}/Card/SkCard.vue.d.ts +1 -1
  12. package/dist/components/Card/types.d.ts +2 -0
  13. package/dist/{src/components → components}/Checkbox/SkCheckbox.vue.d.ts +1 -1
  14. package/dist/{src/components → components}/Checkbox/types.d.ts +1 -1
  15. package/dist/{src/components → components}/Collapsible/SkCollapsible.vue.d.ts +1 -1
  16. package/dist/components/Collapsible/types.d.ts +2 -0
  17. package/dist/{src/components → components}/ColorPicker/SkColorPicker.vue.d.ts +1 -1
  18. package/dist/{src/components → components}/ColorPicker/types.d.ts +1 -1
  19. package/dist/{src/components → components}/ContextMenu/SkContextMenu.vue.d.ts +1 -1
  20. package/dist/components/ContextMenu/types.d.ts +2 -0
  21. package/dist/{src/components → components}/Divider/SkDivider.vue.d.ts +1 -1
  22. package/dist/{src/components → components}/Dropdown/SkDropdown.vue.d.ts +10 -2
  23. package/dist/{src/components → components}/Dropdown/types.d.ts +2 -1
  24. package/dist/{src/components → components}/Input/SkInput.vue.d.ts +1 -1
  25. package/dist/{src/components → components}/Input/types.d.ts +1 -1
  26. package/dist/{src/components → components}/Listbox/SkListbox.vue.d.ts +1 -1
  27. package/dist/{src/components → components}/Listbox/types.d.ts +1 -1
  28. package/dist/{src/components → components}/Modal/SkModal.vue.d.ts +1 -1
  29. package/dist/{src/components → components}/Modal/types.d.ts +1 -1
  30. package/dist/{src/components → components}/NavBar/SkNavBar.vue.d.ts +10 -2
  31. package/dist/{src/components → components}/NavBar/context.d.ts +2 -0
  32. package/dist/components/NavBar/types.d.ts +10 -0
  33. package/dist/{src/components → components}/NumberInput/SkNumberInput.vue.d.ts +1 -1
  34. package/dist/{src/components → components}/NumberInput/types.d.ts +1 -1
  35. package/dist/{src/components → components}/Page/SkPage.vue.d.ts +9 -0
  36. package/dist/{src/components → components}/Pagination/SkPagination.vue.d.ts +3 -3
  37. package/dist/{src/components → components}/Pagination/types.d.ts +1 -1
  38. package/dist/{src/components → components}/Panel/SkPanel.vue.d.ts +1 -1
  39. package/dist/{src/components → components}/Panel/types.d.ts +1 -1
  40. package/dist/{src/components → components}/Popover/SkPopover.vue.d.ts +1 -1
  41. package/dist/{src/components → components}/Progress/SkProgress.vue.d.ts +1 -1
  42. package/dist/{src/components → components}/Progress/types.d.ts +1 -1
  43. package/dist/{src/components → components}/Radio/SkRadio.vue.d.ts +1 -1
  44. package/dist/{src/components → components}/Radio/types.d.ts +1 -1
  45. package/dist/components/ScrollArea/SkScrollArea.vue.d.ts +141 -0
  46. package/dist/{src/components → components}/ScrollArea/types.d.ts +1 -1
  47. package/dist/{src/components → components}/Select/SkSelect.vue.d.ts +1 -1
  48. package/dist/{src/components → components}/Select/types.d.ts +1 -1
  49. package/dist/{src/components → components}/Sidebar/SkSidebar.vue.d.ts +1 -1
  50. package/dist/{src/components → components}/Sidebar/types.d.ts +1 -1
  51. package/dist/{src/components → components}/Slider/SkSlider.vue.d.ts +1 -1
  52. package/dist/{src/components → components}/Slider/types.d.ts +1 -1
  53. package/dist/{src/components → components}/Spinner/SkSpinner.vue.d.ts +1 -1
  54. package/dist/{src/components → components}/Spinner/types.d.ts +1 -1
  55. package/dist/{src/components → components}/Splitter/types.d.ts +1 -1
  56. package/dist/{src/components → components}/Switch/SkSwitch.vue.d.ts +1 -1
  57. package/dist/{src/components → components}/Switch/types.d.ts +1 -1
  58. package/dist/{src/components → components}/Table/SkTable.vue.d.ts +1 -1
  59. package/dist/{src/components → components}/Table/types.d.ts +1 -1
  60. package/dist/{src/components → components}/Tabs/SkTab.vue.d.ts +1 -1
  61. package/dist/{src/components → components}/Tabs/SkTabs.vue.d.ts +1 -1
  62. package/dist/{src/components → components}/Tag/SkTag.vue.d.ts +1 -1
  63. package/dist/{src/components → components}/TagsInput/SkTagsInput.vue.d.ts +1 -1
  64. package/dist/{src/components → components}/TagsInput/types.d.ts +1 -1
  65. package/dist/{src/components → components}/Textarea/SkTextarea.vue.d.ts +1 -1
  66. package/dist/{src/components → components}/Textarea/types.d.ts +1 -1
  67. package/dist/{src/components → components}/Toolbar/types.d.ts +1 -1
  68. package/dist/{src/components → components}/Tooltip/SkTooltip.vue.d.ts +1 -1
  69. package/dist/{src/components → components}/Tooltip/types.d.ts +1 -1
  70. package/dist/{src/components → components}/TreeView/types.d.ts +1 -1
  71. package/dist/composables/useCustomColors.d.ts +36 -0
  72. package/{src → dist}/global.d.ts +6 -2
  73. package/dist/sleekspace-ui.css +4253 -1251
  74. package/dist/sleekspace-ui.es.js +204 -109
  75. package/dist/sleekspace-ui.umd.js +204 -109
  76. package/dist/static/classes.d.ts +18 -0
  77. package/dist/static/components/alert.d.ts +12 -0
  78. package/dist/static/components/avatar.d.ts +9 -0
  79. package/dist/static/components/breadcrumbs.d.ts +6 -0
  80. package/dist/static/components/button.d.ts +13 -0
  81. package/dist/static/components/card.d.ts +5 -0
  82. package/dist/static/components/checkbox.d.ts +10 -0
  83. package/dist/static/components/colorPicker.d.ts +8 -0
  84. package/dist/static/components/divider.d.ts +8 -0
  85. package/dist/static/components/dropdown.d.ts +8 -0
  86. package/dist/static/components/field.d.ts +15 -0
  87. package/dist/static/components/group.d.ts +5 -0
  88. package/dist/static/components/input.d.ts +14 -0
  89. package/dist/static/components/navBar.d.ts +16 -0
  90. package/dist/static/components/numberInput.d.ts +15 -0
  91. package/dist/static/components/page.d.ts +9 -0
  92. package/dist/static/components/pagination.d.ts +5 -0
  93. package/dist/static/components/panel.d.ts +11 -0
  94. package/dist/static/components/progress.d.ts +9 -0
  95. package/dist/static/components/radio.d.ts +11 -0
  96. package/dist/static/components/select.d.ts +10 -0
  97. package/dist/static/components/sidebar.d.ts +9 -0
  98. package/dist/static/components/skeleton.d.ts +11 -0
  99. package/dist/static/components/slider.d.ts +12 -0
  100. package/dist/static/components/spinner.d.ts +12 -0
  101. package/dist/static/components/switchInput.d.ts +10 -0
  102. package/dist/static/components/table.d.ts +12 -0
  103. package/dist/static/components/tag.d.ts +8 -0
  104. package/dist/static/components/tagsInput.d.ts +7 -0
  105. package/dist/static/components/textarea.d.ts +12 -0
  106. package/dist/static/components/toolbar.d.ts +12 -0
  107. package/dist/static/components/tooltip.d.ts +7 -0
  108. package/dist/static/escape.d.ts +2 -0
  109. package/dist/static/index.cjs.js +1 -0
  110. package/dist/static/index.d.ts +68 -0
  111. package/dist/static/index.es.js +732 -0
  112. package/dist/static/render.d.ts +12 -0
  113. package/dist/static/specs.d.ts +2 -0
  114. package/dist/static/types.d.ts +43 -0
  115. package/dist/tokens.css +322 -0
  116. package/dist/types/index.d.ts +36 -0
  117. package/docs/guides/installation.md +8 -2
  118. package/docs/guides/pure-css/_meta.yaml +8 -0
  119. package/docs/guides/pure-css/class-api.md +1070 -0
  120. package/docs/guides/pure-css/custom-elements.md +574 -0
  121. package/docs/guides/pure-css/index.md +86 -0
  122. package/docs/guides/pure-css/limitations.md +152 -0
  123. package/docs/guides/pure-css/static-helpers.md +1203 -0
  124. package/llms-full.txt +3736 -261
  125. package/package.json +16 -5
  126. package/src/components/Card/SkCard.vue +1 -0
  127. package/src/components/ContextMenu/SkContextMenuRadioGroup.vue +4 -1
  128. package/src/components/Dropdown/SkDropdown.vue +20 -3
  129. package/src/components/Dropdown/SkDropdownRadioGroup.vue +4 -1
  130. package/src/components/Dropdown/types.ts +2 -1
  131. package/src/components/NavBar/SkNavBar.vue +14 -4
  132. package/src/components/NavBar/context.ts +4 -2
  133. package/src/components/NavBar/types.ts +6 -1
  134. package/src/components/Page/SkPage.vue +11 -0
  135. package/src/components/Panel/SkPanel.vue +2 -1
  136. package/src/components/ScrollArea/SkScrollArea.vue +78 -5
  137. package/src/components/TreeView/SkTreeView.vue +7 -2
  138. package/src/composables/useCustomColors.ts +86 -77
  139. package/src/composables/usePortalContext.test.ts +0 -2
  140. package/src/shims.d.ts +10 -0
  141. package/src/static/__tests__/parity.test.ts +717 -0
  142. package/src/static/__tests__/parityHarness.test.ts +98 -0
  143. package/src/static/__tests__/parityHarness.ts +260 -0
  144. package/src/static/classes.test.ts +82 -0
  145. package/src/static/classes.ts +111 -0
  146. package/src/static/components/__tests__/helpers.test.ts +837 -0
  147. package/src/static/components/alert.ts +117 -0
  148. package/src/static/components/avatar.ts +86 -0
  149. package/src/static/components/breadcrumbs.ts +28 -0
  150. package/src/static/components/button.ts +75 -0
  151. package/src/static/components/card.ts +27 -0
  152. package/src/static/components/checkbox.ts +48 -0
  153. package/src/static/components/colorPicker.ts +45 -0
  154. package/src/static/components/divider.ts +39 -0
  155. package/src/static/components/dropdown.ts +36 -0
  156. package/src/static/components/field.ts +86 -0
  157. package/src/static/components/group.ts +27 -0
  158. package/src/static/components/input.ts +55 -0
  159. package/src/static/components/navBar.ts +94 -0
  160. package/src/static/components/numberInput.ts +64 -0
  161. package/src/static/components/page.ts +31 -0
  162. package/src/static/components/pagination.ts +27 -0
  163. package/src/static/components/panel.ts +33 -0
  164. package/src/static/components/progress.ts +31 -0
  165. package/src/static/components/radio.ts +53 -0
  166. package/src/static/components/select.ts +51 -0
  167. package/src/static/components/sidebar.ts +85 -0
  168. package/src/static/components/skeleton.ts +66 -0
  169. package/src/static/components/slider.ts +50 -0
  170. package/src/static/components/spinner.ts +94 -0
  171. package/src/static/components/switchInput.ts +49 -0
  172. package/src/static/components/table.ts +88 -0
  173. package/src/static/components/tag.ts +76 -0
  174. package/src/static/components/tagsInput.ts +35 -0
  175. package/src/static/components/textarea.ts +53 -0
  176. package/src/static/components/toolbar.ts +74 -0
  177. package/src/static/components/tooltip.ts +29 -0
  178. package/src/static/escape.test.ts +53 -0
  179. package/src/static/escape.ts +28 -0
  180. package/src/static/generated/defaults.ts +378 -0
  181. package/src/static/generated/propTypes.ts +425 -0
  182. package/src/static/index.ts +116 -0
  183. package/src/static/render.test.ts +83 -0
  184. package/src/static/render.ts +76 -0
  185. package/src/static/specs.test.ts +58 -0
  186. package/src/static/specs.ts +230 -0
  187. package/src/static/types.ts +176 -0
  188. package/src/styles/__tests__/testHelpers.ts +97 -0
  189. package/src/styles/base/_custom-elements.scss +51 -0
  190. package/src/styles/base/_index.scss +4 -0
  191. package/src/styles/components/__tests__/componentSelectors.test.ts +2575 -0
  192. package/src/styles/components/_alert.scss +82 -39
  193. package/src/styles/components/_avatar.scss +102 -47
  194. package/src/styles/components/_breadcrumbs.scss +39 -37
  195. package/src/styles/components/_button.scss +58 -5
  196. package/src/styles/components/_card.scss +64 -2
  197. package/src/styles/components/_checkbox.scss +35 -5
  198. package/src/styles/components/_color-picker.scss +48 -13
  199. package/src/styles/components/_divider.scss +86 -52
  200. package/src/styles/components/_dropdown.scss +214 -0
  201. package/src/styles/components/_field.scss +76 -23
  202. package/src/styles/components/_group.scss +190 -79
  203. package/src/styles/components/_index.scss +1 -0
  204. package/src/styles/components/_input.scss +81 -5
  205. package/src/styles/components/_menu.scss +1 -1
  206. package/src/styles/components/_navbar.scss +76 -45
  207. package/src/styles/components/_number-input.scss +88 -83
  208. package/src/styles/components/_page.scss +82 -23
  209. package/src/styles/components/_pagination.scss +240 -212
  210. package/src/styles/components/_panel.scss +268 -122
  211. package/src/styles/components/_progress.scss +120 -70
  212. package/src/styles/components/_radio.scss +35 -5
  213. package/src/styles/components/_scroll-area.scss +50 -22
  214. package/src/styles/components/_select.scss +40 -9
  215. package/src/styles/components/_sidebar.scss +59 -34
  216. package/src/styles/components/_skeleton.scss +111 -65
  217. package/src/styles/components/_slider.scss +34 -10
  218. package/src/styles/components/_spinner.scss +107 -56
  219. package/src/styles/components/_switch.scss +36 -5
  220. package/src/styles/components/_table.scss +150 -166
  221. package/src/styles/components/_tag.scss +244 -154
  222. package/src/styles/components/_tags-input.scss +46 -12
  223. package/src/styles/components/_textarea.scss +36 -5
  224. package/src/styles/components/_toolbar.scss +85 -31
  225. package/src/styles/components/_tooltip.scss +172 -3
  226. package/src/styles/mixins/_cut-border.scss +18 -4
  227. package/src/styles/mixins/_dual-selector.scss +192 -0
  228. package/src/styles/mixins/_index.scss +1 -0
  229. package/src/styles/mixins/dualSelector.test.ts +151 -0
  230. package/src/styles/themes/_colorful.scss +25 -0
  231. package/src/styles/themes/_greyscale.scss +25 -0
  232. package/src/styles/themes/_shade-scale.scss +39 -0
  233. package/src/styles/tokens/_semantic-color-kinds.scss +66 -0
  234. package/src/{types.ts → types/index.ts} +19 -11
  235. package/web-types.json +970 -137
  236. package/dist/src/components/Card/types.d.ts +0 -2
  237. package/dist/src/components/Collapsible/types.d.ts +0 -2
  238. package/dist/src/components/ContextMenu/types.d.ts +0 -2
  239. package/dist/src/components/NavBar/types.d.ts +0 -6
  240. package/dist/src/components/ScrollArea/SkScrollArea.vue.d.ts +0 -40
  241. package/dist/src/composables/useCustomColors.d.ts +0 -74
  242. package/dist/src/composables/useCustomColors.test.d.ts +0 -1
  243. package/dist/src/composables/useFocusTrap.test.d.ts +0 -1
  244. package/dist/src/composables/usePortalContext.test.d.ts +0 -1
  245. package/dist/src/styles/mixins/fluidSize.test.d.ts +0 -1
  246. package/dist/src/types.d.ts +0 -29
  247. /package/dist/{src/components → components}/Accordion/SkAccordionItem.vue.d.ts +0 -0
  248. /package/dist/{src/components → components}/Accordion/index.d.ts +0 -0
  249. /package/dist/{src/components → components}/Avatar/index.d.ts +0 -0
  250. /package/dist/{src/components → components}/Breadcrumbs/SkBreadcrumbItem.vue.d.ts +0 -0
  251. /package/dist/{src/components → components}/Breadcrumbs/SkBreadcrumbSeparator.vue.d.ts +0 -0
  252. /package/dist/{src/components → components}/Breadcrumbs/index.d.ts +0 -0
  253. /package/dist/{src/components → components}/Checkbox/index.d.ts +0 -0
  254. /package/dist/{src/components → components}/Collapsible/index.d.ts +0 -0
  255. /package/dist/{src/components → components}/ColorPicker/index.d.ts +0 -0
  256. /package/dist/{src/components → components}/ContextMenu/SkContextMenuCheckboxItem.vue.d.ts +0 -0
  257. /package/dist/{src/components → components}/ContextMenu/SkContextMenuItem.vue.d.ts +0 -0
  258. /package/dist/{src/components → components}/ContextMenu/SkContextMenuLabel.vue.d.ts +0 -0
  259. /package/dist/{src/components → components}/ContextMenu/SkContextMenuRadioGroup.vue.d.ts +0 -0
  260. /package/dist/{src/components → components}/ContextMenu/SkContextMenuRadioItem.vue.d.ts +0 -0
  261. /package/dist/{src/components → components}/ContextMenu/SkContextMenuSeparator.vue.d.ts +0 -0
  262. /package/dist/{src/components → components}/ContextMenu/SkContextMenuSubmenu.vue.d.ts +0 -0
  263. /package/dist/{src/components → components}/ContextMenu/index.d.ts +0 -0
  264. /package/dist/{src/components → components}/Divider/types.d.ts +0 -0
  265. /package/dist/{src/components → components}/Dropdown/SkDropdownCheckboxItem.vue.d.ts +0 -0
  266. /package/dist/{src/components → components}/Dropdown/SkDropdownMenuItem.vue.d.ts +0 -0
  267. /package/dist/{src/components → components}/Dropdown/SkDropdownMenuLabel.vue.d.ts +0 -0
  268. /package/dist/{src/components → components}/Dropdown/SkDropdownMenuSeparator.vue.d.ts +0 -0
  269. /package/dist/{src/components → components}/Dropdown/SkDropdownRadioGroup.vue.d.ts +0 -0
  270. /package/dist/{src/components → components}/Dropdown/SkDropdownRadioItem.vue.d.ts +0 -0
  271. /package/dist/{src/components → components}/Dropdown/SkDropdownSubmenu.vue.d.ts +0 -0
  272. /package/dist/{src/components → components}/Dropdown/index.d.ts +0 -0
  273. /package/dist/{src/components → components}/Field/SkField.vue.d.ts +0 -0
  274. /package/dist/{src/components → components}/Field/index.d.ts +0 -0
  275. /package/dist/{src/components → components}/Field/types.d.ts +0 -0
  276. /package/dist/{src/components → components}/Group/SkGroup.vue.d.ts +0 -0
  277. /package/dist/{src/components → components}/Group/types.d.ts +0 -0
  278. /package/dist/{src/components → components}/Input/index.d.ts +0 -0
  279. /package/dist/{src/components → components}/Listbox/SkListboxItem.vue.d.ts +0 -0
  280. /package/dist/{src/components → components}/Listbox/SkListboxSeparator.vue.d.ts +0 -0
  281. /package/dist/{src/components → components}/Listbox/index.d.ts +0 -0
  282. /package/dist/{src/components → components}/Modal/index.d.ts +0 -0
  283. /package/dist/{src/components → components}/NavBar/index.d.ts +0 -0
  284. /package/dist/{src/components → components}/NumberInput/index.d.ts +0 -0
  285. /package/dist/{src/components → components}/Page/SkPageSidebarToggle.vue.d.ts +0 -0
  286. /package/dist/{src/components → components}/Page/index.d.ts +0 -0
  287. /package/dist/{src/components → components}/Page/types.d.ts +0 -0
  288. /package/dist/{src/components → components}/Pagination/SkPaginationItem.vue.d.ts +0 -0
  289. /package/dist/{src/components → components}/Pagination/index.d.ts +0 -0
  290. /package/dist/{src/components → components}/Popover/index.d.ts +0 -0
  291. /package/dist/{src/components → components}/Popover/types.d.ts +0 -0
  292. /package/dist/{src/components → components}/Progress/index.d.ts +0 -0
  293. /package/dist/{src/components → components}/Radio/SkRadioGroup.vue.d.ts +0 -0
  294. /package/dist/{src/components → components}/Radio/index.d.ts +0 -0
  295. /package/dist/{src/components → components}/ScrollArea/index.d.ts +0 -0
  296. /package/dist/{src/components → components}/Select/SkSelectItem.vue.d.ts +0 -0
  297. /package/dist/{src/components → components}/Select/SkSelectSeparator.vue.d.ts +0 -0
  298. /package/dist/{src/components → components}/Select/index.d.ts +0 -0
  299. /package/dist/{src/components → components}/Sidebar/SkSidebarItem.vue.d.ts +0 -0
  300. /package/dist/{src/components → components}/Sidebar/SkSidebarSection.vue.d.ts +0 -0
  301. /package/dist/{src/components → components}/Skeleton/SkSkeleton.vue.d.ts +0 -0
  302. /package/dist/{src/components → components}/Skeleton/index.d.ts +0 -0
  303. /package/dist/{src/components → components}/Skeleton/types.d.ts +0 -0
  304. /package/dist/{src/components → components}/Slider/index.d.ts +0 -0
  305. /package/dist/{src/components → components}/Spinner/index.d.ts +0 -0
  306. /package/dist/{src/components → components}/Splitter/SkSplitter.vue.d.ts +0 -0
  307. /package/dist/{src/components → components}/Splitter/SkSplitterHandle.vue.d.ts +0 -0
  308. /package/dist/{src/components → components}/Splitter/SkSplitterPanel.vue.d.ts +0 -0
  309. /package/dist/{src/components → components}/Splitter/index.d.ts +0 -0
  310. /package/dist/{src/components → components}/Switch/index.d.ts +0 -0
  311. /package/dist/{src/components → components}/Table/index.d.ts +0 -0
  312. /package/dist/{src/components → components}/Tabs/SkTabList.vue.d.ts +0 -0
  313. /package/dist/{src/components → components}/Tabs/SkTabPanel.vue.d.ts +0 -0
  314. /package/dist/{src/components → components}/Tabs/SkTabPanels.vue.d.ts +0 -0
  315. /package/dist/{src/components → components}/Tabs/types.d.ts +0 -0
  316. /package/dist/{src/components → components}/Tag/types.d.ts +0 -0
  317. /package/dist/{src/components → components}/TagsInput/index.d.ts +0 -0
  318. /package/dist/{src/components → components}/Textarea/index.d.ts +0 -0
  319. /package/dist/{src/components → components}/Theme/SkTheme.vue.d.ts +0 -0
  320. /package/dist/{src/components → components}/Theme/types.d.ts +0 -0
  321. /package/dist/{src/components → components}/Theme/useTheme.d.ts +0 -0
  322. /package/dist/{src/components → components}/Toast/SkToast.vue.d.ts +0 -0
  323. /package/dist/{src/components → components}/Toast/SkToastProvider.vue.d.ts +0 -0
  324. /package/dist/{src/components → components}/Toast/index.d.ts +0 -0
  325. /package/dist/{src/components → components}/Toast/types.d.ts +0 -0
  326. /package/dist/{src/components → components}/Toast/useToast.d.ts +0 -0
  327. /package/dist/{src/components → components}/Toolbar/SkToolbar.vue.d.ts +0 -0
  328. /package/dist/{src/components → components}/Toolbar/SkToolbarButton.vue.d.ts +0 -0
  329. /package/dist/{src/components → components}/Toolbar/SkToolbarSeparator.vue.d.ts +0 -0
  330. /package/dist/{src/components → components}/Toolbar/SkToolbarToggleGroup.vue.d.ts +0 -0
  331. /package/dist/{src/components → components}/Toolbar/SkToolbarToggleItem.vue.d.ts +0 -0
  332. /package/dist/{src/components → components}/Toolbar/index.d.ts +0 -0
  333. /package/dist/{src/components → components}/Tooltip/SkTooltipProvider.vue.d.ts +0 -0
  334. /package/dist/{src/components → components}/Tooltip/index.d.ts +0 -0
  335. /package/dist/{src/components → components}/TreeView/SkTreeItem.vue.d.ts +0 -0
  336. /package/dist/{src/components → components}/TreeView/SkTreeView.vue.d.ts +0 -0
  337. /package/dist/{src/components → components}/TreeView/index.d.ts +0 -0
  338. /package/dist/{src/composables → composables}/useFocusTrap.d.ts +0 -0
  339. /package/dist/{src/composables → composables}/usePageDrawer.d.ts +0 -0
  340. /package/dist/{src/composables → composables}/usePortalContext.d.ts +0 -0
  341. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,98 @@
1
+ //----------------------------------------------------------------------------------------------------------------------
2
+ // Parity Harness Sanity Tests
3
+ //
4
+ // Verify the harness detects matches and mismatches correctly using minimal synthetic
5
+ // Vue components and helpers. If the harness can't detect a contrived mismatch, it can't
6
+ // detect a real one.
7
+ //----------------------------------------------------------------------------------------------------------------------
8
+
9
+ import { describe, expect, it } from 'vitest';
10
+ import { defineComponent } from 'vue';
11
+
12
+ import { compareParity } from './parityHarness';
13
+
14
+ //----------------------------------------------------------------------------------------------------------------------
15
+
16
+ describe('compareParity', () =>
17
+ {
18
+ it('matches identical trivial output', () =>
19
+ {
20
+ const Vue = defineComponent({ template: '<div class="foo">hi</div>' });
21
+ const staticFn = () : string => '<div class="foo">hi</div>';
22
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
23
+ expect(result.match).toBe(true);
24
+ });
25
+
26
+ it('detects tag mismatch', () =>
27
+ {
28
+ const Vue = defineComponent({ template: '<div class="foo">hi</div>' });
29
+ const staticFn = () : string => '<span class="foo">hi</span>';
30
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
31
+ expect(result.match).toBe(false);
32
+ if(!result.match) { expect(result.diff).toMatch(/tag mismatch/); }
33
+ });
34
+
35
+ it('detects class-token mismatch regardless of order', () =>
36
+ {
37
+ const Vue = defineComponent({ template: '<div class="a b c">x</div>' });
38
+ const staticFn = () : string => '<div class="a b d">x</div>';
39
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
40
+ expect(result.match).toBe(false);
41
+ if(!result.match) { expect(result.diff).toMatch(/class mismatch/); }
42
+ });
43
+
44
+ it('treats different class ordering as equal', () =>
45
+ {
46
+ const Vue = defineComponent({ template: '<div class="a b c">x</div>' });
47
+ const staticFn = () : string => '<div class="c a b">x</div>';
48
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
49
+ expect(result.match).toBe(true);
50
+ });
51
+
52
+ it('ignores data-v-* scoped-style attributes on the Vue side', () =>
53
+ {
54
+ const Vue = defineComponent({
55
+ template: '<div class="foo" data-v-abc123="">x</div>',
56
+ });
57
+ const staticFn = () : string => '<div class="foo">x</div>';
58
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
59
+ expect(result.match).toBe(true);
60
+ });
61
+
62
+ it('detects attribute value mismatch', () =>
63
+ {
64
+ const Vue = defineComponent({ template: '<div class="foo" role="alert">x</div>' });
65
+ const staticFn = () : string => '<div class="foo" role="warning">x</div>';
66
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
67
+ expect(result.match).toBe(false);
68
+ if(!result.match) { expect(result.diff).toMatch(/role.*mismatch/); }
69
+ });
70
+
71
+ it('compares style attribute entries order-independently', () =>
72
+ {
73
+ const Vue = defineComponent({ template: '<div class="foo" style="color: red; width: 10px;">x</div>' });
74
+ const staticFn = () : string => '<div class="foo" style="width: 10px; color: red;">x</div>';
75
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
76
+ expect(result.match).toBe(true);
77
+ });
78
+
79
+ it('detects child count mismatch', () =>
80
+ {
81
+ const Vue = defineComponent({ template: '<div class="x"><span>a</span><span>b</span></div>' });
82
+ const staticFn = () : string => '<div class="x"><span>a</span></div>';
83
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
84
+ expect(result.match).toBe(false);
85
+ if(!result.match) { expect(result.diff).toMatch(/child count/); }
86
+ });
87
+
88
+ it('recurses into children', () =>
89
+ {
90
+ const Vue = defineComponent({ template: '<div class="x"><span class="y">a</span></div>' });
91
+ const staticFn = () : string => '<div class="x"><span class="z">a</span></div>';
92
+ const result = compareParity({ vueComponent: Vue, staticHelper: staticFn, props: {} });
93
+ expect(result.match).toBe(false);
94
+ if(!result.match) { expect(result.diff).toMatch(/class mismatch/); }
95
+ });
96
+ });
97
+
98
+ //----------------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,260 @@
1
+ //----------------------------------------------------------------------------------------------------------------------
2
+ // Vue ↔ Static Parity Harness
3
+ //
4
+ // Mount a Vue component in happy-dom, invoke the equivalent static helper, and compare the
5
+ // resulting DOM trees. Returns either a match result or a human-readable diff describing the
6
+ // first divergence encountered.
7
+ //
8
+ // Used by parity tests to detect drift between the Vue and static implementations. If a prop
9
+ // is added to a Vue component without updating the static helper (or vice versa), parity
10
+ // tests fail loudly.
11
+ //----------------------------------------------------------------------------------------------------------------------
12
+
13
+ import { mount } from '@vue/test-utils';
14
+ import type { Component } from 'vue';
15
+
16
+ //----------------------------------------------------------------------------------------------------------------------
17
+
18
+ export interface ParityInput
19
+ {
20
+ vueComponent : Component;
21
+ staticHelper : (props : Record<string, unknown>, children ?: string) => string;
22
+ props : Record<string, unknown>;
23
+ children ?: string;
24
+ }
25
+
26
+ export type ParityResult = { match : true } | { match : false; diff : string };
27
+
28
+ //----------------------------------------------------------------------------------------------------------------------
29
+
30
+ const ELEMENT_NODE = 1;
31
+ const TEXT_NODE = 3;
32
+
33
+ // Attributes that Vue injects for scoped styles; ignore them when comparing.
34
+ function isVueScopedAttr(name : string) : boolean
35
+ {
36
+ return name.startsWith('data-v-');
37
+ }
38
+
39
+ // Attributes injected at runtime by reka-ui primitives (ToolbarRoot, RovingFocusGroup, etc.)
40
+ // that have no meaningful static equivalent. These are accessibility/interaction attributes set
41
+ // by reka-ui's JS initialization and cannot be reproduced in a static string without running
42
+ // the library. We skip them from the Vue side only — if the static helper were to hard-code
43
+ // them, they'd carry the wrong values (e.g. dir="ltr" is locale-dependent).
44
+ //
45
+ // Covered attrs:
46
+ // data-orientation — reka-ui state attribute mirroring the orientation prop
47
+ // aria-orientation — set by ToolbarRoot's Primitive as an ARIA attribute
48
+ // dir — set by reka-ui's useDirection() composable
49
+ // tabindex — set by RovingFocusGroup's focus management
50
+ // style — reka-ui injects `outline-color: none; ...` as a focus-ring reset; the
51
+ // static helper only emits style for custom color vars, so skip style
52
+ // entirely when the Vue side has the reka-ui outline reset fingerprint.
53
+ const REKA_UI_INJECTED_ATTRS = new Set([ 'data-orientation', 'aria-orientation', 'dir', 'tabindex' ]);
54
+
55
+ function isRekaUiAttr(name : string, value : string) : boolean
56
+ {
57
+ if(REKA_UI_INJECTED_ATTRS.has(name)) { return true; }
58
+ // reka-ui's RovingFocusGroup injects an outline reset style; filter `style` when it contains
59
+ // this fingerprint so it doesn't pollute the diff for non-custom-color toolbars.
60
+ if(name === 'style' && value.includes('outline-color')) { return true; }
61
+ return false;
62
+ }
63
+
64
+ // Class tokens that the static helper emits for CSS-default-detection purposes but that Vue
65
+ // never emits. The `sk-size-*` tokens are added by the static layer so that the SCSS
66
+ // `defaults-when-absent('sk-size-')` mechanism can detect whether a size was explicitly set.
67
+ // Vue's JS-driven rendering doesn't need this sentinel class. Filtering it from the static side
68
+ // before comparison avoids a known structural non-equivalence that is not a real drift signal.
69
+ function isStaticOnlyToken(token : string) : boolean
70
+ {
71
+ return token.startsWith('sk-size-');
72
+ }
73
+
74
+ // Split a class attribute into a sorted array of non-empty tokens.
75
+ function classTokens(value : string | null, filterStaticOnly = false) : string[]
76
+ {
77
+ if(!value) { return []; }
78
+ const tokens = value.split(/\s+/).filter(Boolean);
79
+ return (filterStaticOnly ? tokens.filter((token) => !isStaticOnlyToken(token)) : tokens).sort();
80
+ }
81
+
82
+ // Parse a style attribute into a sorted array of "prop:value" entries.
83
+ function styleEntries(value : string | null) : string[]
84
+ {
85
+ if(!value) { return []; }
86
+ return value
87
+ .split(';')
88
+ .map((entry) => entry.trim())
89
+ .filter(Boolean)
90
+ .sort();
91
+ }
92
+
93
+ // True for an element node, or a text node with non-whitespace content. Whitespace-only text
94
+ // nodes get ignored when walking children since Vue/happy-dom and the parsed static HTML often
95
+ // disagree on layout whitespace.
96
+ function isMeaningfulNode(node : ChildNode) : boolean
97
+ {
98
+ if(node.nodeType === ELEMENT_NODE) { return true; }
99
+ if(node.nodeType !== TEXT_NODE) { return false; }
100
+ return Boolean(node.textContent && node.textContent.trim().length > 0);
101
+ }
102
+
103
+ //----------------------------------------------------------------------------------------------------------------------
104
+
105
+ function collectVueAttrs(element : Element) : Record<string, string>
106
+ {
107
+ const attrs : Record<string, string> = {};
108
+ for(const attr of element.attributes)
109
+ {
110
+ const skip = attr.name === 'class'
111
+ || isVueScopedAttr(attr.name)
112
+ || isRekaUiAttr(attr.name, attr.value);
113
+ if(!skip)
114
+ {
115
+ attrs[attr.name] = attr.name === 'style' ? styleEntries(attr.value).join('; ') : attr.value;
116
+ }
117
+ }
118
+ return attrs;
119
+ }
120
+
121
+ function collectStaticAttrs(element : Element) : Record<string, string>
122
+ {
123
+ const attrs : Record<string, string> = {};
124
+ for(const attr of element.attributes)
125
+ {
126
+ if(attr.name !== 'class')
127
+ {
128
+ attrs[attr.name] = attr.name === 'style' ? styleEntries(attr.value).join('; ') : attr.value;
129
+ }
130
+ }
131
+ return attrs;
132
+ }
133
+
134
+ //----------------------------------------------------------------------------------------------------------------------
135
+
136
+ function compareTags(vueEl : Element, staticEl : Element, path : string) : string | null
137
+ {
138
+ if(vueEl.tagName === staticEl.tagName) { return null; }
139
+ const vueTag = vueEl.tagName.toLowerCase();
140
+ const staticTag = staticEl.tagName.toLowerCase();
141
+ return `${ path }: tag mismatch — Vue emits <${ vueTag }>, static emits <${ staticTag }>`;
142
+ }
143
+
144
+ function compareClasses(vueEl : Element, staticEl : Element, path : string) : string | null
145
+ {
146
+ const vueClasses = classTokens(vueEl.getAttribute('class'));
147
+ const staticClasses = classTokens(staticEl.getAttribute('class'), true);
148
+ if(vueClasses.join(' ') === staticClasses.join(' ')) { return null; }
149
+ return `${ path }: class mismatch\n Vue: ${ vueClasses.join(' ') }`
150
+ + `\n static: ${ staticClasses.join(' ') }`;
151
+ }
152
+
153
+ function compareAttrs(vueEl : Element, staticEl : Element, path : string) : string | null
154
+ {
155
+ const vueAttrs = collectVueAttrs(vueEl);
156
+ const staticAttrs = collectStaticAttrs(staticEl);
157
+ const vueKeys = Object.keys(vueAttrs).sort();
158
+ const staticKeys = Object.keys(staticAttrs).sort();
159
+
160
+ if(vueKeys.join(',') !== staticKeys.join(','))
161
+ {
162
+ return `${ path }: attribute set mismatch`
163
+ + `\n Vue: ${ vueKeys.join(', ') || '(none)' }`
164
+ + `\n static: ${ staticKeys.join(', ') || '(none)' }`;
165
+ }
166
+ for(const key of vueKeys)
167
+ {
168
+ if(vueAttrs[key] !== staticAttrs[key])
169
+ {
170
+ return `${ path }: attribute ${ key } mismatch`
171
+ + ` — Vue: "${ vueAttrs[key] }", static: "${ staticAttrs[key] }"`;
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+
177
+ function compareElements(vueEl : Element, staticEl : Element, path : string) : string | null
178
+ {
179
+ return compareTags(vueEl, staticEl, path)
180
+ ?? compareClasses(vueEl, staticEl, path)
181
+ ?? compareAttrs(vueEl, staticEl, path)
182
+ // compareChildren is mutually recursive with this function; declared below.
183
+ // eslint-disable-next-line no-use-before-define
184
+ ?? compareChildren(vueEl, staticEl, path);
185
+ }
186
+
187
+ function compareChildren(vueEl : Element, staticEl : Element, path : string) : string | null
188
+ {
189
+ const vueChildren = Array.from(vueEl.childNodes).filter(isMeaningfulNode);
190
+ const staticChildren = Array.from(staticEl.childNodes).filter(isMeaningfulNode);
191
+
192
+ if(vueChildren.length !== staticChildren.length)
193
+ {
194
+ return `${ path }: child count mismatch — Vue: ${ vueChildren.length }`
195
+ + `, static: ${ staticChildren.length }`;
196
+ }
197
+
198
+ for(let idx = 0; idx < vueChildren.length; idx++)
199
+ {
200
+ const vueChild = vueChildren[idx];
201
+ const staticChild = staticChildren[idx];
202
+ const childPath = `${ path }>child[${ idx }]`;
203
+
204
+ if(vueChild.nodeType !== staticChild.nodeType)
205
+ {
206
+ return `${ childPath }: node-type mismatch — Vue: ${ vueChild.nodeType }`
207
+ + `, static: ${ staticChild.nodeType }`;
208
+ }
209
+
210
+ if(vueChild.nodeType === ELEMENT_NODE)
211
+ {
212
+ const diff = compareElements(vueChild as Element, staticChild as Element, childPath);
213
+ if(diff) { return diff; }
214
+ }
215
+ else if(vueChild.nodeType === TEXT_NODE)
216
+ {
217
+ const vueText = (vueChild.textContent ?? '').trim();
218
+ const staticText = (staticChild.textContent ?? '').trim();
219
+ if(vueText !== staticText)
220
+ {
221
+ return `${ childPath }: text mismatch — Vue: "${ vueText }", static: "${ staticText }"`;
222
+ }
223
+ }
224
+ }
225
+ return null;
226
+ }
227
+
228
+ //----------------------------------------------------------------------------------------------------------------------
229
+
230
+ export function compareParity(input : ParityInput) : ParityResult
231
+ {
232
+ const wrapper = mount(input.vueComponent, {
233
+ props: input.props,
234
+ slots: input.children !== undefined ? { default: input.children } : undefined,
235
+ });
236
+ const vueHtml = wrapper.html();
237
+
238
+ const staticHtml = input.staticHelper(input.props, input.children);
239
+
240
+ const parser = new DOMParser();
241
+ const vueDoc = parser.parseFromString(`<div>${ vueHtml }</div>`, 'text/html');
242
+ const staticDoc = parser.parseFromString(`<div>${ staticHtml }</div>`, 'text/html');
243
+
244
+ const vueRoot = vueDoc.body.firstElementChild?.firstElementChild;
245
+ const staticRoot = staticDoc.body.firstElementChild?.firstElementChild;
246
+
247
+ if(!vueRoot || !staticRoot)
248
+ {
249
+ wrapper.unmount();
250
+ return { match: false, diff: 'Could not parse Vue or static output' };
251
+ }
252
+
253
+ const diff = compareElements(vueRoot, staticRoot, 'root');
254
+ wrapper.unmount();
255
+
256
+ if(diff === null) { return { match: true }; }
257
+ return { match: false, diff };
258
+ }
259
+
260
+ //----------------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,82 @@
1
+ //----------------------------------------------------------------------------------------------------------------------
2
+ // Class Composition Tests
3
+ //----------------------------------------------------------------------------------------------------------------------
4
+
5
+ import { describe, expect, it } from 'vitest';
6
+
7
+ import { type ClassSpec, composeClasses } from './classes';
8
+
9
+ //----------------------------------------------------------------------------------------------------------------------
10
+
11
+ const PANEL_SPEC : ClassSpec
12
+ = {
13
+ base: 'sk-panel',
14
+ kind: true, // maps props.kind -> `sk-${kind}` if present
15
+ size: true, // maps props.size -> `sk-${size}` AND `sk-size-${size}` if present
16
+ booleanFlags: [ 'no-border', 'no-decoration' ], // if prop = true, emit `sk-${name}`
17
+ listFlags: // props.<key> as array -> `sk-<family>-${value}` per value
18
+ [
19
+ { prop: 'corners', family: 'cut' },
20
+ ],
21
+ singleChoiceFlags: // props.<key> as string -> `sk-<family>-${value}`
22
+ [
23
+ { prop: 'decorationCorner', family: 'decoration' },
24
+ ],
25
+ };
26
+
27
+ describe('composeClasses', () =>
28
+ {
29
+ it('returns just the base when no props are given', () =>
30
+ {
31
+ expect(composeClasses(PANEL_SPEC, {})).toBe('sk-panel');
32
+ });
33
+
34
+ it('emits kind when provided', () =>
35
+ {
36
+ expect(composeClasses(PANEL_SPEC, { kind: 'primary' })).toBe('sk-panel sk-primary');
37
+ });
38
+
39
+ it('emits size as both bare and prefixed', () =>
40
+ {
41
+ expect(composeClasses(PANEL_SPEC, { size: 'lg' })).toBe('sk-panel sk-lg sk-size-lg');
42
+ });
43
+
44
+ it('emits boolean flags when true, skips when false or undefined', () =>
45
+ {
46
+ expect(composeClasses(PANEL_SPEC, { noBorder: true })).toBe('sk-panel sk-no-border');
47
+ expect(composeClasses(PANEL_SPEC, { noBorder: false })).toBe('sk-panel');
48
+ expect(composeClasses(PANEL_SPEC, {})).toBe('sk-panel');
49
+ });
50
+
51
+ it('emits list-flag entries per array value', () =>
52
+ {
53
+ expect(composeClasses(PANEL_SPEC, { corners: [ 'top-left', 'bottom-right' ] }))
54
+ .toBe('sk-panel sk-cut-top-left sk-cut-bottom-right');
55
+ });
56
+
57
+ it('emits single-choice flag when value is present', () =>
58
+ {
59
+ expect(composeClasses(PANEL_SPEC, { decorationCorner: 'top-left' }))
60
+ .toBe('sk-panel sk-decoration-top-left');
61
+ });
62
+
63
+ it('composes multiple families in stable order', () =>
64
+ {
65
+ const result = composeClasses(PANEL_SPEC, {
66
+ kind: 'primary',
67
+ size: 'lg',
68
+ corners: [ 'top-left' ],
69
+ decorationCorner: 'top-left',
70
+ noBorder: true,
71
+ });
72
+ expect(result).toBe('sk-panel sk-primary sk-lg sk-size-lg sk-no-border sk-cut-top-left sk-decoration-top-left');
73
+ });
74
+
75
+ it('converts camelCase boolean prop keys to kebab-case class names', () =>
76
+ {
77
+ // boolean flag "no-border" corresponds to camelCase prop "noBorder" per the convention
78
+ expect(composeClasses(PANEL_SPEC, { noBorder: true })).toBe('sk-panel sk-no-border');
79
+ });
80
+ });
81
+
82
+ //----------------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,111 @@
1
+ //----------------------------------------------------------------------------------------------------------------------
2
+ // Class Composition
3
+ //
4
+ // Given a spec describing how a component's props map to CSS class modifiers, and a props
5
+ // object with actual values, compose the space-separated class string that would be emitted
6
+ // onto the component's root element.
7
+ //
8
+ // Stable output order: base → kind → size → variant → booleans → list flags → single-choice
9
+ // flags. Match the Vue component's emission order to keep diffs minimal during parity checks.
10
+ //----------------------------------------------------------------------------------------------------------------------
11
+
12
+ export interface ListFlagSpec
13
+ {
14
+ prop : string; // camelCase prop name (e.g. "corners")
15
+ family : string; // class family prefix (e.g. "cut" -> sk-cut-top-left)
16
+ }
17
+
18
+ export interface SingleChoiceFlagSpec
19
+ {
20
+ prop : string; // camelCase prop name (e.g. "decorationCorner")
21
+ family : string; // class family prefix (e.g. "decoration")
22
+ }
23
+
24
+ export interface ClassSpec
25
+ {
26
+ base : string; // e.g. "sk-panel"
27
+ kind ?: boolean; // maps props.kind -> sk-${kind}
28
+ size ?: boolean; // maps props.size -> sk-${size} + sk-size-${size}
29
+ variant ?: boolean; // maps props.variant -> sk-${variant}
30
+ booleanFlags ?: readonly string[]; // kebab-case class-name list (the prop name is camelCased equivalent)
31
+ listFlags ?: readonly ListFlagSpec[];
32
+ singleChoiceFlags ?: readonly SingleChoiceFlagSpec[];
33
+ }
34
+
35
+ //----------------------------------------------------------------------------------------------------------------------
36
+
37
+ // Convert a kebab-case class name to its camelCase prop-name equivalent.
38
+ // "no-border" -> "noBorder", "fixed-header" -> "fixedHeader"
39
+ function kebabToCamel(kebab : string) : string
40
+ {
41
+ return kebab.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
42
+ }
43
+
44
+ //----------------------------------------------------------------------------------------------------------------------
45
+
46
+ export function composeClasses(spec : ClassSpec, props : Record<string, unknown>) : string
47
+ {
48
+ const parts : string[] = [ spec.base ];
49
+
50
+ if(spec.kind && typeof props.kind === 'string')
51
+ {
52
+ parts.push(`sk-${ props.kind }`);
53
+ }
54
+
55
+ if(spec.size && typeof props.size === 'string')
56
+ {
57
+ parts.push(`sk-${ props.size }`);
58
+ parts.push(`sk-size-${ props.size }`);
59
+ }
60
+
61
+ if(spec.variant && typeof props.variant === 'string')
62
+ {
63
+ parts.push(`sk-${ props.variant }`);
64
+ }
65
+
66
+ if(spec.booleanFlags)
67
+ {
68
+ for(const kebab of spec.booleanFlags)
69
+ {
70
+ const propName = kebabToCamel(kebab);
71
+ if(props[propName] === true)
72
+ {
73
+ parts.push(`sk-${ kebab }`);
74
+ }
75
+ }
76
+ }
77
+
78
+ if(spec.listFlags)
79
+ {
80
+ for(const { prop, family } of spec.listFlags)
81
+ {
82
+ const value = props[prop];
83
+ if(Array.isArray(value))
84
+ {
85
+ for(const entry of value)
86
+ {
87
+ if(typeof entry === 'string')
88
+ {
89
+ parts.push(`sk-${ family }-${ entry }`);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+
96
+ if(spec.singleChoiceFlags)
97
+ {
98
+ for(const { prop, family } of spec.singleChoiceFlags)
99
+ {
100
+ const value = props[prop];
101
+ if(typeof value === 'string')
102
+ {
103
+ parts.push(`sk-${ family }-${ value }`);
104
+ }
105
+ }
106
+ }
107
+
108
+ return parts.join(' ');
109
+ }
110
+
111
+ //----------------------------------------------------------------------------------------------------------------------