@skewedaspect/sleekspace-ui 0.2.0-beta.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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/sleekspace-ui.css +12844 -0
  4. package/dist/sleekspace-ui.es.js +19021 -0
  5. package/dist/sleekspace-ui.umd.js +19040 -0
  6. package/docs/components/accordion.md +92 -0
  7. package/docs/components/alert.md +72 -0
  8. package/docs/components/avatar.md +69 -0
  9. package/docs/components/breadcrumbs.md +65 -0
  10. package/docs/components/button/_meta.yaml +12 -0
  11. package/docs/components/button/accessibility.md +16 -0
  12. package/docs/components/button/custom-colors.md +18 -0
  13. package/docs/components/button/icons.md +31 -0
  14. package/docs/components/button/intro.md +8 -0
  15. package/docs/components/button/kinds.md +25 -0
  16. package/docs/components/button/sizes.md +14 -0
  17. package/docs/components/button/states.md +12 -0
  18. package/docs/components/button/usage.md +23 -0
  19. package/docs/components/button/variants.md +14 -0
  20. package/docs/components/button.md +110 -0
  21. package/docs/components/card.md +87 -0
  22. package/docs/components/checkbox.md +77 -0
  23. package/docs/components/collapsible.md +71 -0
  24. package/docs/components/divider.md +62 -0
  25. package/docs/components/dropdown.md +88 -0
  26. package/docs/components/field.md +80 -0
  27. package/docs/components/group.md +41 -0
  28. package/docs/components/input.md +84 -0
  29. package/docs/components/listbox.md +82 -0
  30. package/docs/components/modal.md +101 -0
  31. package/docs/components/navbar.md +64 -0
  32. package/docs/components/number-input.md +78 -0
  33. package/docs/components/page.md +77 -0
  34. package/docs/components/pagination.md +88 -0
  35. package/docs/components/panel.md +74 -0
  36. package/docs/components/popover.md +93 -0
  37. package/docs/components/progress.md +76 -0
  38. package/docs/components/radio.md +86 -0
  39. package/docs/components/sidebar.md +74 -0
  40. package/docs/components/skeleton.md +76 -0
  41. package/docs/components/slider.md +94 -0
  42. package/docs/components/spinner.md +59 -0
  43. package/docs/components/switch.md +97 -0
  44. package/docs/components/table.md +91 -0
  45. package/docs/components/tabs.md +108 -0
  46. package/docs/components/tag.md +75 -0
  47. package/docs/components/tags-input.md +88 -0
  48. package/docs/components/textarea.md +80 -0
  49. package/docs/components/theme.md +65 -0
  50. package/docs/components/toast.md +95 -0
  51. package/docs/components/tooltip.md +90 -0
  52. package/docs/guides/custom-colors.md +84 -0
  53. package/docs/guides/design-tokens.md +105 -0
  54. package/docs/guides/getting-started.md +144 -0
  55. package/docs/guides/installation.md +62 -0
  56. package/docs/guides/theming.md +101 -0
  57. package/package.json +76 -0
  58. package/src/components/Accordion/SkAccordion.vue +133 -0
  59. package/src/components/Accordion/SkAccordionItem.vue +131 -0
  60. package/src/components/Accordion/index.ts +3 -0
  61. package/src/components/Accordion/types.ts +9 -0
  62. package/src/components/Alert/SkAlert.vue +137 -0
  63. package/src/components/Alert/types.ts +10 -0
  64. package/src/components/Avatar/SkAvatar.vue +141 -0
  65. package/src/components/Avatar/index.ts +8 -0
  66. package/src/components/Avatar/types.ts +31 -0
  67. package/src/components/Breadcrumbs/SkBreadcrumbItem.vue +76 -0
  68. package/src/components/Breadcrumbs/SkBreadcrumbSeparator.vue +38 -0
  69. package/src/components/Breadcrumbs/SkBreadcrumbs.vue +93 -0
  70. package/src/components/Breadcrumbs/index.ts +10 -0
  71. package/src/components/Breadcrumbs/types.ts +36 -0
  72. package/src/components/Button/SkButton.vue +148 -0
  73. package/src/components/Button/types.ts +21 -0
  74. package/src/components/Card/SkCard.vue +144 -0
  75. package/src/components/Card/types.ts +12 -0
  76. package/src/components/Checkbox/SkCheckbox.vue +136 -0
  77. package/src/components/Checkbox/index.ts +8 -0
  78. package/src/components/Checkbox/types.ts +10 -0
  79. package/src/components/Collapsible/SkCollapsible.vue +159 -0
  80. package/src/components/Collapsible/index.ts +2 -0
  81. package/src/components/Collapsible/types.ts +8 -0
  82. package/src/components/Divider/SkDivider.vue +63 -0
  83. package/src/components/Divider/types.ts +15 -0
  84. package/src/components/Dropdown/SkDropdown.vue +150 -0
  85. package/src/components/Dropdown/SkDropdownMenuItem.vue +58 -0
  86. package/src/components/Dropdown/SkDropdownMenuSeparator.vue +26 -0
  87. package/src/components/Dropdown/SkDropdownSubmenu.vue +107 -0
  88. package/src/components/Dropdown/index.ts +11 -0
  89. package/src/components/Dropdown/types.ts +11 -0
  90. package/src/components/Field/SkField.vue +152 -0
  91. package/src/components/Field/index.ts +8 -0
  92. package/src/components/Field/types.ts +7 -0
  93. package/src/components/Group/SkGroup.vue +52 -0
  94. package/src/components/Group/types.ts +10 -0
  95. package/src/components/Input/SkInput.vue +117 -0
  96. package/src/components/Input/index.ts +8 -0
  97. package/src/components/Input/types.ts +11 -0
  98. package/src/components/Listbox/SkListbox.vue +164 -0
  99. package/src/components/Listbox/SkListboxItem.vue +68 -0
  100. package/src/components/Listbox/SkListboxSeparator.vue +26 -0
  101. package/src/components/Listbox/index.ts +10 -0
  102. package/src/components/Listbox/types.ts +10 -0
  103. package/src/components/Modal/SkModal.vue +231 -0
  104. package/src/components/Modal/index.ts +8 -0
  105. package/src/components/Modal/types.ts +12 -0
  106. package/src/components/NavBar/SkNavBar.vue +83 -0
  107. package/src/components/NavBar/index.ts +8 -0
  108. package/src/components/NavBar/types.ts +15 -0
  109. package/src/components/NumberInput/SkNumberInput.vue +168 -0
  110. package/src/components/NumberInput/index.ts +8 -0
  111. package/src/components/NumberInput/types.ts +10 -0
  112. package/src/components/Page/SkPage.vue +94 -0
  113. package/src/components/Page/index.ts +8 -0
  114. package/src/components/Page/types.ts +21 -0
  115. package/src/components/Pagination/SkPagination.vue +185 -0
  116. package/src/components/Pagination/SkPaginationItem.vue +107 -0
  117. package/src/components/Pagination/index.ts +9 -0
  118. package/src/components/Pagination/types.ts +40 -0
  119. package/src/components/Panel/SkPanel.vue +96 -0
  120. package/src/components/Panel/types.ts +15 -0
  121. package/src/components/Popover/SkPopover.vue +185 -0
  122. package/src/components/Popover/index.ts +8 -0
  123. package/src/components/Popover/types.ts +11 -0
  124. package/src/components/Progress/SkProgress.vue +144 -0
  125. package/src/components/Progress/index.ts +8 -0
  126. package/src/components/Progress/types.ts +34 -0
  127. package/src/components/Radio/SkRadio.vue +110 -0
  128. package/src/components/Radio/SkRadioGroup.vue +92 -0
  129. package/src/components/Radio/index.ts +9 -0
  130. package/src/components/Radio/types.ts +11 -0
  131. package/src/components/Sidebar/README.md +405 -0
  132. package/src/components/Sidebar/SkSidebar.vue +88 -0
  133. package/src/components/Sidebar/SkSidebarItem.vue +58 -0
  134. package/src/components/Sidebar/SkSidebarSection.vue +40 -0
  135. package/src/components/Sidebar/types.ts +3 -0
  136. package/src/components/Skeleton/SkSkeleton.vue +171 -0
  137. package/src/components/Skeleton/index.ts +8 -0
  138. package/src/components/Skeleton/types.ts +31 -0
  139. package/src/components/Slider/SkSlider.vue +165 -0
  140. package/src/components/Slider/index.ts +8 -0
  141. package/src/components/Slider/types.ts +44 -0
  142. package/src/components/Spinner/SkSpinner.vue +105 -0
  143. package/src/components/Spinner/index.ts +8 -0
  144. package/src/components/Spinner/types.ts +28 -0
  145. package/src/components/Switch/SkSwitch.vue +215 -0
  146. package/src/components/Switch/index.ts +8 -0
  147. package/src/components/Switch/types.ts +12 -0
  148. package/src/components/Table/SkTable.vue +109 -0
  149. package/src/components/Table/index.ts +2 -0
  150. package/src/components/Table/types.ts +15 -0
  151. package/src/components/Tabs/README.md +331 -0
  152. package/src/components/Tabs/SkTab.vue +84 -0
  153. package/src/components/Tabs/SkTabList.vue +62 -0
  154. package/src/components/Tabs/SkTabPanel.vue +47 -0
  155. package/src/components/Tabs/SkTabPanels.vue +23 -0
  156. package/src/components/Tabs/SkTabs.vue +124 -0
  157. package/src/components/Tabs/types.ts +21 -0
  158. package/src/components/Tag/SkTag.vue +129 -0
  159. package/src/components/Tag/types.ts +15 -0
  160. package/src/components/TagsInput/SkTagsInput.vue +184 -0
  161. package/src/components/TagsInput/index.ts +8 -0
  162. package/src/components/TagsInput/types.ts +10 -0
  163. package/src/components/Textarea/SkTextarea.vue +117 -0
  164. package/src/components/Textarea/index.ts +8 -0
  165. package/src/components/Textarea/types.ts +10 -0
  166. package/src/components/Theme/SkTheme.vue +47 -0
  167. package/src/components/Theme/types.ts +17 -0
  168. package/src/components/Theme/useTheme.ts +131 -0
  169. package/src/components/Toast/SkToast.vue +156 -0
  170. package/src/components/Toast/SkToastProvider.vue +180 -0
  171. package/src/components/Toast/index.ts +15 -0
  172. package/src/components/Toast/types.ts +63 -0
  173. package/src/components/Toast/useToast.ts +78 -0
  174. package/src/components/Tooltip/SkTooltip.vue +162 -0
  175. package/src/components/Tooltip/SkTooltipProvider.vue +114 -0
  176. package/src/components/Tooltip/index.ts +9 -0
  177. package/src/components/Tooltip/types.ts +13 -0
  178. package/src/composables/useCustomColors.test.ts +505 -0
  179. package/src/composables/useCustomColors.ts +124 -0
  180. package/src/composables/usePortalContext.test.ts +402 -0
  181. package/src/composables/usePortalContext.ts +95 -0
  182. package/src/global.d.ts +76 -0
  183. package/src/index.ts +259 -0
  184. package/src/styles/_scrollbar.scss +100 -0
  185. package/src/styles/base/_fonts.scss +105 -0
  186. package/src/styles/base/_global.scss +47 -0
  187. package/src/styles/base/_index.scss +24 -0
  188. package/src/styles/base/_reset.scss +11 -0
  189. package/src/styles/base/_typography.scss +178 -0
  190. package/src/styles/components/_accordion.scss +250 -0
  191. package/src/styles/components/_alert.scss +239 -0
  192. package/src/styles/components/_avatar.scss +133 -0
  193. package/src/styles/components/_breadcrumbs.scss +137 -0
  194. package/src/styles/components/_button.scss +731 -0
  195. package/src/styles/components/_card.scss +141 -0
  196. package/src/styles/components/_checkbox.scss +232 -0
  197. package/src/styles/components/_collapsible.scss +158 -0
  198. package/src/styles/components/_divider.scss +121 -0
  199. package/src/styles/components/_field.scss +87 -0
  200. package/src/styles/components/_group.scss +138 -0
  201. package/src/styles/components/_index.scss +46 -0
  202. package/src/styles/components/_input.scss +205 -0
  203. package/src/styles/components/_listbox.scss +453 -0
  204. package/src/styles/components/_menu.scss +216 -0
  205. package/src/styles/components/_modal.scss +329 -0
  206. package/src/styles/components/_navbar.scss +258 -0
  207. package/src/styles/components/_number-input.scss +352 -0
  208. package/src/styles/components/_page.scss +98 -0
  209. package/src/styles/components/_pagination.scss +411 -0
  210. package/src/styles/components/_panel.scss +281 -0
  211. package/src/styles/components/_popover.scss +258 -0
  212. package/src/styles/components/_progress.scss +280 -0
  213. package/src/styles/components/_radio.scss +255 -0
  214. package/src/styles/components/_sidebar.scss +92 -0
  215. package/src/styles/components/_skeleton.scss +138 -0
  216. package/src/styles/components/_slider.scss +262 -0
  217. package/src/styles/components/_spinner.scss +331 -0
  218. package/src/styles/components/_switch.scss +370 -0
  219. package/src/styles/components/_table.scss +405 -0
  220. package/src/styles/components/_tabs.scss +486 -0
  221. package/src/styles/components/_tag.scss +425 -0
  222. package/src/styles/components/_tags-input.scss +279 -0
  223. package/src/styles/components/_textarea.scss +208 -0
  224. package/src/styles/components/_toast.scss +331 -0
  225. package/src/styles/components/_tooltip.scss +206 -0
  226. package/src/styles/fonts/Titillium_Web/OFL.txt +93 -0
  227. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Black.ttf +0 -0
  228. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Bold.ttf +0 -0
  229. package/src/styles/fonts/Titillium_Web/TitilliumWeb-BoldItalic.ttf +0 -0
  230. package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLight.ttf +0 -0
  231. package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLightItalic.ttf +0 -0
  232. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Italic.ttf +0 -0
  233. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Light.ttf +0 -0
  234. package/src/styles/fonts/Titillium_Web/TitilliumWeb-LightItalic.ttf +0 -0
  235. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Regular.ttf +0 -0
  236. package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBold.ttf +0 -0
  237. package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBoldItalic.ttf +0 -0
  238. package/src/styles/index.scss +17 -0
  239. package/src/styles/mixins/_cut-border.scss +254 -0
  240. package/src/styles/mixins/_index.scss +7 -0
  241. package/src/styles/theme/_variables.scss +42 -0
  242. package/src/styles/themes/README.md +127 -0
  243. package/src/styles/themes/_colorful.scss +58 -0
  244. package/src/styles/themes/_greyscale.scss +58 -0
  245. package/src/styles/themes/index.scss +9 -0
  246. package/src/styles/tokens/README.md +268 -0
  247. package/src/styles/tokens/_foundation-borders.scss +26 -0
  248. package/src/styles/tokens/_foundation-colors.scss +169 -0
  249. package/src/styles/tokens/_foundation-glow.scss +36 -0
  250. package/src/styles/tokens/_foundation-radius.scss +53 -0
  251. package/src/styles/tokens/_foundation-scrollbar.scss +31 -0
  252. package/src/styles/tokens/_foundation-shadows.scss +37 -0
  253. package/src/styles/tokens/_foundation-space.scss +36 -0
  254. package/src/styles/tokens/_foundation-transitions.scss +37 -0
  255. package/src/styles/tokens/_foundation-typography.scss +58 -0
  256. package/src/styles/tokens/_semantic-color-kinds.scss +112 -0
  257. package/src/styles/tokens/_semantic-colors.scss +10 -0
  258. package/src/styles/tokens/_semantic-interactive.scss +29 -0
  259. package/src/styles/tokens/_semantic-scrollbar.scss +48 -0
  260. package/src/styles/tokens/_semantic-surfaces.scss +36 -0
  261. package/src/styles/tokens/index.scss +38 -0
  262. package/src/styles/tokens.scss +268 -0
  263. package/src/styles/utilities/_index.scss +9 -0
  264. package/src/styles/utilities/_typography.scss +121 -0
  265. package/src/types.ts +50 -0
  266. package/web-types.json +3524 -0
@@ -0,0 +1,77 @@
1
+ ---
2
+ component: SkCheckbox
3
+ category: Forms
4
+ ---
5
+
6
+ # SkCheckbox
7
+
8
+ A checkbox component supporting boolean and indeterminate states. Built on RekaUI's Checkbox primitive with beveled corner styling.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <script setup>
14
+ import { ref } from 'vue';
15
+
16
+ const agreed = ref(false);
17
+ </script>
18
+
19
+ <template>
20
+ <SkCheckbox v-model="agreed" label="I agree to the terms" kind="primary" />
21
+ </template>
22
+ ```
23
+
24
+ ## Indeterminate State
25
+
26
+ The model value can be `true`, `false`, or `'indeterminate'`. The indeterminate state displays a horizontal dash instead of a checkmark:
27
+
28
+ ```vue
29
+ <script setup>
30
+ import { ref } from 'vue';
31
+
32
+ const state = ref<boolean | 'indeterminate'>('indeterminate');
33
+ </script>
34
+
35
+ <template>
36
+ <SkCheckbox v-model="state" label="Select all" />
37
+ </template>
38
+ ```
39
+
40
+ ## Kinds
41
+
42
+ ```vue
43
+ <SkCheckbox v-model="val" kind="primary" label="Primary" />
44
+ <SkCheckbox v-model="val" kind="accent" label="Accent" />
45
+ <SkCheckbox v-model="val" kind="success" label="Success" />
46
+ <SkCheckbox v-model="val" kind="danger" label="Danger" />
47
+ ```
48
+
49
+ ## Sizes
50
+
51
+ ```vue
52
+ <SkCheckbox v-model="val" size="sm" label="Small" />
53
+ <SkCheckbox v-model="val" size="md" label="Medium" />
54
+ <SkCheckbox v-model="val" size="lg" label="Large" />
55
+ ```
56
+
57
+ ## States
58
+
59
+ ```vue
60
+ <SkCheckbox v-model="val" disabled label="Disabled checkbox" />
61
+ <SkCheckbox v-model="val" required label="Required field" />
62
+ ```
63
+
64
+ ## Custom Colors
65
+
66
+ ```vue
67
+ <SkCheckbox
68
+ v-model="val"
69
+ base-color="oklch(0.6 0.25 300)"
70
+ text-color="white"
71
+ label="Custom purple"
72
+ />
73
+ ```
74
+
75
+ ## Accessibility
76
+
77
+ Built on RekaUI which manages `role="checkbox"`, `aria-checked` (including `mixed` for indeterminate), and keyboard toggling via Space. The label is associated via a wrapping `<label>` element.
@@ -0,0 +1,71 @@
1
+ ---
2
+ component: SkCollapsible
3
+ category: Layout
4
+ ---
5
+
6
+ # SkCollapsible
7
+
8
+ A single-section disclosure component for showing and hiding content with smooth height animations. Built on RekaUI's Collapsible primitive.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <script setup>
14
+ import { ref } from 'vue';
15
+
16
+ const isOpen = ref(false);
17
+ </script>
18
+
19
+ <template>
20
+ <SkCollapsible v-model:open="isOpen" trigger-text="Show details">
21
+ <p>Hidden content revealed when expanded.</p>
22
+ </SkCollapsible>
23
+ </template>
24
+ ```
25
+
26
+ ## Slots
27
+
28
+ The `trigger` slot allows replacing the default button with custom trigger content:
29
+
30
+ ```vue
31
+ <SkCollapsible v-model:open="isOpen">
32
+ <template #trigger="{ open }">
33
+ <SkButton kind="primary">
34
+ {{ open ? 'Hide' : 'Show' }} Details
35
+ </SkButton>
36
+ </template>
37
+ <p>Collapsible content here.</p>
38
+ </SkCollapsible>
39
+ ```
40
+
41
+ ## Kinds
42
+
43
+ ```vue
44
+ <SkCollapsible kind="primary" trigger-text="Primary">
45
+ Content
46
+ </SkCollapsible>
47
+ ```
48
+
49
+ ## States
50
+
51
+ ```vue
52
+ <SkCollapsible disabled trigger-text="Cannot toggle">
53
+ This content cannot be toggled.
54
+ </SkCollapsible>
55
+ ```
56
+
57
+ ## Custom Colors
58
+
59
+ ```vue
60
+ <SkCollapsible
61
+ base-color="oklch(0.5 0.2 260)"
62
+ text-color="white"
63
+ trigger-text="Custom Colors"
64
+ >
65
+ Content with custom styling.
66
+ </SkCollapsible>
67
+ ```
68
+
69
+ ## Accessibility
70
+
71
+ Built on RekaUI Collapsible which provides `aria-expanded` on the trigger and `aria-controls` linking the trigger to the content panel. Space and Enter toggle the content.
@@ -0,0 +1,62 @@
1
+ ---
2
+ component: SkDivider
3
+ category: Layout
4
+ ---
5
+
6
+ # SkDivider
7
+
8
+ A visual separator component for dividing content sections. Renders as an `<hr>` element with support for both horizontal and vertical orientations.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <template>
14
+ <p>Section one</p>
15
+ <SkDivider />
16
+ <p>Section two</p>
17
+ </template>
18
+ ```
19
+
20
+ ## Orientation
21
+
22
+ ```vue
23
+ <!-- Horizontal (default) -->
24
+ <SkDivider orientation="horizontal" />
25
+
26
+ <!-- Vertical (use inside a flex container) -->
27
+ <div style="display: flex; align-items: center; gap: 1rem;">
28
+ <span>Left</span>
29
+ <SkDivider orientation="vertical" />
30
+ <span>Right</span>
31
+ </div>
32
+ ```
33
+
34
+ ## Kinds
35
+
36
+ ```vue
37
+ <SkDivider kind="primary" />
38
+ <SkDivider kind="accent" />
39
+ <SkDivider kind="danger" />
40
+ ```
41
+
42
+ ## Variants
43
+
44
+ The `subtle` variant produces a lighter, less prominent line:
45
+
46
+ ```vue
47
+ <SkDivider variant="subtle" />
48
+ ```
49
+
50
+ ## Sizes
51
+
52
+ Controls thickness and surrounding spacing:
53
+
54
+ ```vue
55
+ <SkDivider size="sm" />
56
+ <SkDivider size="md" />
57
+ <SkDivider size="lg" />
58
+ ```
59
+
60
+ ## Accessibility
61
+
62
+ Renders with `role="separator"` and `aria-orientation` matching the `orientation` prop.
@@ -0,0 +1,88 @@
1
+ ---
2
+ component: SkDropdown
3
+ category: Forms
4
+ ---
5
+
6
+ # SkDropdown
7
+
8
+ A dropdown menu component with a trigger button and floating menu content. Supports submenus, menu items, and separators. Built on RekaUI's DropdownMenu primitive and uses a portal for rendering.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <template>
14
+ <SkDropdown trigger-text="Actions" kind="primary">
15
+ <SkDropdownMenuItem>Edit</SkDropdownMenuItem>
16
+ <SkDropdownMenuItem>Duplicate</SkDropdownMenuItem>
17
+ <SkDropdownMenuSeparator />
18
+ <SkDropdownMenuItem>Delete</SkDropdownMenuItem>
19
+ </SkDropdown>
20
+ </template>
21
+ ```
22
+
23
+ ## Slots
24
+
25
+ The `trigger` slot replaces the default trigger button:
26
+
27
+ ```vue
28
+ <SkDropdown>
29
+ <template #trigger>
30
+ <SkButton kind="accent" variant="outline">
31
+ Custom Trigger
32
+ </SkButton>
33
+ </template>
34
+ <SkDropdownMenuItem>Option A</SkDropdownMenuItem>
35
+ <SkDropdownMenuItem>Option B</SkDropdownMenuItem>
36
+ </SkDropdown>
37
+ ```
38
+
39
+ ## Submenus
40
+
41
+ Use SkDropdownSubmenu for nested menu levels:
42
+
43
+ ```vue
44
+ <SkDropdown trigger-text="File">
45
+ <SkDropdownMenuItem>New</SkDropdownMenuItem>
46
+ <SkDropdownSubmenu label="Open Recent">
47
+ <SkDropdownMenuItem>Document 1</SkDropdownMenuItem>
48
+ <SkDropdownMenuItem>Document 2</SkDropdownMenuItem>
49
+ </SkDropdownSubmenu>
50
+ <SkDropdownMenuSeparator />
51
+ <SkDropdownMenuItem>Exit</SkDropdownMenuItem>
52
+ </SkDropdown>
53
+ ```
54
+
55
+ ## Positioning
56
+
57
+ Control where the menu appears relative to the trigger:
58
+
59
+ ```vue
60
+ <SkDropdown side="right" align="start" :side-offset="8">
61
+ ...
62
+ </SkDropdown>
63
+ ```
64
+
65
+ Available `side` values: `top`, `right`, `bottom` (default), `left`. Available `align` values: `start` (default), `center`, `end`.
66
+
67
+ ## Kinds
68
+
69
+ ```vue
70
+ <SkDropdown kind="primary" trigger-text="Primary">...</SkDropdown>
71
+ <SkDropdown kind="accent" trigger-text="Accent">...</SkDropdown>
72
+ ```
73
+
74
+ ## Custom Colors
75
+
76
+ ```vue
77
+ <SkDropdown
78
+ base-color="oklch(0.5 0.15 260)"
79
+ text-color="white"
80
+ trigger-text="Custom"
81
+ >
82
+ <SkDropdownMenuItem>Styled Item</SkDropdownMenuItem>
83
+ </SkDropdown>
84
+ ```
85
+
86
+ ## Accessibility
87
+
88
+ Built on RekaUI DropdownMenu which provides full WAI-ARIA menu pattern. Arrow keys navigate items, Enter/Space activates, Escape closes, and submenus open on ArrowRight. The menu content is portaled to the body for correct stacking.
@@ -0,0 +1,80 @@
1
+ ---
2
+ component: SkField
3
+ category: Forms
4
+ ---
5
+
6
+ # SkField
7
+
8
+ A form field wrapper that provides label, description, error message, and validation state management. Automatically wires up accessibility attributes between the label, input, and messages.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <template>
14
+ <SkField label="Email" description="We'll never share your email.">
15
+ <template #default="{ id, ...attrs }">
16
+ <SkInput :id="id" v-bind="attrs" v-model="email" type="email" />
17
+ </template>
18
+ </SkField>
19
+ </template>
20
+ ```
21
+
22
+ ## Validation State
23
+
24
+ When `error` is provided, it replaces the description and the field enters an error state:
25
+
26
+ ```vue
27
+ <SkField
28
+ label="Username"
29
+ :error="usernameError"
30
+ description="Choose a unique username."
31
+ >
32
+ <template #default="{ id, ...attrs }">
33
+ <SkInput :id="id" v-bind="attrs" v-model="username" />
34
+ </template>
35
+ </SkField>
36
+ ```
37
+
38
+ ## State-Driven Kind
39
+
40
+ The `state` prop drives automatic kind injection into child inputs:
41
+
42
+ - `true` -- Applies `validKind` (default: `success`) to the input.
43
+ - `false` -- Applies `invalidKind` (default: `danger`) to the input.
44
+ - `null` -- Neutral; input uses its own kind.
45
+
46
+ ```vue
47
+ <SkField label="Password" :state="isValid">
48
+ <template #default="{ id, kind, ...attrs }">
49
+ <SkInput :id="id" :kind="kind" v-bind="attrs" v-model="password" />
50
+ </template>
51
+ </SkField>
52
+ ```
53
+
54
+ Inputs like SkInput, SkTextarea, SkListbox, SkNumberInput, and SkTagsInput automatically inject the field kind via provide/inject without needing to pass it explicitly.
55
+
56
+ ## Label Position
57
+
58
+ ```vue
59
+ <SkField label="Name" label-position="left">
60
+ <template #default="{ id }">
61
+ <SkInput :id="id" v-model="name" />
62
+ </template>
63
+ </SkField>
64
+ ```
65
+
66
+ ## Required Indicator
67
+
68
+ ```vue
69
+ <SkField label="Email" required>
70
+ <template #default="{ id }">
71
+ <SkInput :id="id" v-model="email" required />
72
+ </template>
73
+ </SkField>
74
+ ```
75
+
76
+ This adds a visual asterisk (*) after the label.
77
+
78
+ ## Accessibility
79
+
80
+ Generates a unique `id` for the input (or uses a provided one). Links the label via `for`, provides `aria-describedby` pointing to the description or error message, and sets `aria-invalid` when an error is present. All these attributes are passed to the default slot.
@@ -0,0 +1,41 @@
1
+ ---
2
+ component: SkGroup
3
+ category: Layout
4
+ ---
5
+
6
+ # SkGroup
7
+
8
+ A layout container that arranges child elements with consistent spacing in a horizontal or vertical direction.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <template>
14
+ <SkGroup>
15
+ <SkButton kind="primary">Save</SkButton>
16
+ <SkButton variant="outline">Cancel</SkButton>
17
+ </SkGroup>
18
+ </template>
19
+ ```
20
+
21
+ ## Orientation
22
+
23
+ ```vue
24
+ <!-- Horizontal (default) -->
25
+ <SkGroup orientation="horizontal">
26
+ <SkButton>A</SkButton>
27
+ <SkButton>B</SkButton>
28
+ <SkButton>C</SkButton>
29
+ </SkGroup>
30
+
31
+ <!-- Vertical -->
32
+ <SkGroup orientation="vertical">
33
+ <SkButton>A</SkButton>
34
+ <SkButton>B</SkButton>
35
+ <SkButton>C</SkButton>
36
+ </SkGroup>
37
+ ```
38
+
39
+ ## Accessibility
40
+
41
+ SkGroup is a presentational layout component. It does not add any ARIA attributes. Apply appropriate roles and labels to the container or children as needed for your use case.
@@ -0,0 +1,84 @@
1
+ ---
2
+ component: SkInput
3
+ category: Forms
4
+ ---
5
+
6
+ # SkInput
7
+
8
+ A text input component with validation states, semantic color support, and multiple input types. Automatically inherits kind from a parent SkField when used together.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <script setup>
14
+ import { ref } from 'vue';
15
+
16
+ const email = ref('');
17
+ </script>
18
+
19
+ <template>
20
+ <SkInput v-model="email" type="email" placeholder="Enter your email" />
21
+ </template>
22
+ ```
23
+
24
+ ## Input Types
25
+
26
+ Supports: `text` (default), `email`, `password`, `url`, `tel`, `search`, `number`.
27
+
28
+ ```vue
29
+ <SkInput type="password" placeholder="Password" />
30
+ <SkInput type="search" placeholder="Search..." />
31
+ <SkInput type="url" placeholder="https://..." />
32
+ ```
33
+
34
+ ## Kinds
35
+
36
+ The kind prop colors the input border, useful for showing validation states:
37
+
38
+ ```vue
39
+ <SkInput kind="success" placeholder="Valid input" />
40
+ <SkInput kind="danger" placeholder="Invalid input" />
41
+ ```
42
+
43
+ When nested inside SkField, the kind is automatically injected based on the field's validation state.
44
+
45
+ ## Sizes
46
+
47
+ ```vue
48
+ <SkInput size="sm" placeholder="Small" />
49
+ <SkInput size="md" placeholder="Medium" />
50
+ <SkInput size="lg" placeholder="Large" />
51
+ ```
52
+
53
+ ## States
54
+
55
+ ```vue
56
+ <SkInput disabled placeholder="Disabled" />
57
+ <SkInput readonly model-value="Read-only value" />
58
+ ```
59
+
60
+ ## Custom Colors
61
+
62
+ ```vue
63
+ <SkInput
64
+ base-color="oklch(0.6 0.2 280)"
65
+ text-color="white"
66
+ placeholder="Custom styled"
67
+ />
68
+ ```
69
+
70
+ ## Composition
71
+
72
+ Pair with SkField for labels, descriptions, and error messages:
73
+
74
+ ```vue
75
+ <SkField label="Email" :error="emailError">
76
+ <template #default="{ id, ...attrs }">
77
+ <SkInput :id="id" v-bind="attrs" v-model="email" type="email" />
78
+ </template>
79
+ </SkField>
80
+ ```
81
+
82
+ ## Accessibility
83
+
84
+ Renders as a native `<input>` element. All standard HTML attributes are forwarded via `v-bind="$attrs"`. Use SkField to associate labels and error messages via `aria-describedby` and `aria-invalid`.
@@ -0,0 +1,82 @@
1
+ ---
2
+ component: SkListbox
3
+ category: Forms
4
+ ---
5
+
6
+ # SkListbox
7
+
8
+ A searchable select component for choosing from a list of predefined options. Features a combobox-style input with a dropdown list of items. Built on RekaUI's Combobox primitive and uses a portal for the dropdown.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <script setup>
14
+ import { ref } from 'vue';
15
+
16
+ const selected = ref('');
17
+ </script>
18
+
19
+ <template>
20
+ <SkListbox v-model="selected" placeholder="Select a fruit...">
21
+ <SkListboxItem value="apple">Apple</SkListboxItem>
22
+ <SkListboxItem value="banana">Banana</SkListboxItem>
23
+ <SkListboxItem value="cherry">Cherry</SkListboxItem>
24
+ </SkListbox>
25
+ </template>
26
+ ```
27
+
28
+ ## Searchable
29
+
30
+ The input field filters options as you type. RekaUI handles the filtering behavior internally.
31
+
32
+ ## Grouped Options
33
+
34
+ Use SkListboxSeparator to visually divide option groups:
35
+
36
+ ```vue
37
+ <SkListbox v-model="selected">
38
+ <SkListboxItem value="apple">Apple</SkListboxItem>
39
+ <SkListboxItem value="banana">Banana</SkListboxItem>
40
+ <SkListboxSeparator />
41
+ <SkListboxItem value="carrot">Carrot</SkListboxItem>
42
+ <SkListboxItem value="celery">Celery</SkListboxItem>
43
+ </SkListbox>
44
+ ```
45
+
46
+ ## Kinds
47
+
48
+ ```vue
49
+ <SkListbox kind="primary" v-model="val">...</SkListbox>
50
+ <SkListbox kind="accent" v-model="val">...</SkListbox>
51
+ ```
52
+
53
+ When nested inside SkField, the kind is automatically injected based on field validation state.
54
+
55
+ ## Sizes
56
+
57
+ ```vue
58
+ <SkListbox size="sm" v-model="val">...</SkListbox>
59
+ <SkListbox size="lg" v-model="val">...</SkListbox>
60
+ ```
61
+
62
+ ## States
63
+
64
+ ```vue
65
+ <SkListbox disabled v-model="val">...</SkListbox>
66
+ ```
67
+
68
+ ## Custom Colors
69
+
70
+ ```vue
71
+ <SkListbox
72
+ base-color="oklch(0.5 0.2 260)"
73
+ text-color="white"
74
+ v-model="val"
75
+ >
76
+ <SkListboxItem value="a">Option A</SkListboxItem>
77
+ </SkListbox>
78
+ ```
79
+
80
+ ## Accessibility
81
+
82
+ Built on RekaUI Combobox which provides `role="combobox"` on the input, `role="listbox"` on the dropdown, and `role="option"` on each item. Arrow keys navigate options, Enter selects, and Escape closes the dropdown. The dropdown content is portaled and inherits the active theme.
@@ -0,0 +1,101 @@
1
+ ---
2
+ component: SkModal
3
+ category: Feedback
4
+ ---
5
+
6
+ # SkModal
7
+
8
+ A dialog overlay component for presenting focused content that requires user attention or interaction. Includes a backdrop, close button, and optional trigger. Built on RekaUI's Dialog primitive and uses a portal.
9
+
10
+ ## Usage
11
+
12
+ ```vue
13
+ <script setup>
14
+ import { ref } from 'vue';
15
+
16
+ const isOpen = ref(false);
17
+ </script>
18
+
19
+ <template>
20
+ <SkModal v-model:open="isOpen" title="Confirm Action">
21
+ <p>Are you sure you want to proceed?</p>
22
+ <template #footer="{ close }">
23
+ <SkButton variant="ghost" @click="close">Cancel</SkButton>
24
+ <SkButton kind="primary" @click="doAction(); close()">Confirm</SkButton>
25
+ </template>
26
+ </SkModal>
27
+
28
+ <SkButton @click="isOpen = true">Open Modal</SkButton>
29
+ </template>
30
+ ```
31
+
32
+ ## Built-in Trigger
33
+
34
+ Use `trigger-text` or the `trigger` slot for an inline trigger button:
35
+
36
+ ```vue
37
+ <SkModal trigger-text="Open" title="My Modal">
38
+ <p>Modal content.</p>
39
+ </SkModal>
40
+ ```
41
+
42
+ ## Slots
43
+
44
+ - **trigger** -- Custom trigger element (wraps in DialogTrigger).
45
+ - **title** -- Custom title content; receives `{ close }` slot prop.
46
+ - **default** -- Body content; receives `{ close }` slot prop.
47
+ - **footer** -- Footer area for action buttons; receives `{ close }` slot prop.
48
+
49
+ The `close` function is available in all slots for programmatic dismissal.
50
+
51
+ ## Sizes
52
+
53
+ Controls the modal width:
54
+
55
+ ```vue
56
+ <SkModal size="sm" title="Small">...</SkModal>
57
+ <SkModal size="md" title="Medium">...</SkModal>
58
+ <SkModal size="lg" title="Large">...</SkModal>
59
+ <SkModal size="xl" title="Extra Large">...</SkModal>
60
+ ```
61
+
62
+ ## Kinds
63
+
64
+ ```vue
65
+ <SkModal kind="danger" title="Delete Item">
66
+ <p>This action cannot be undone.</p>
67
+ </SkModal>
68
+ ```
69
+
70
+ ## Dismissal Control
71
+
72
+ Prevent closing via Escape key or overlay click:
73
+
74
+ ```vue
75
+ <SkModal
76
+ title="Important Form"
77
+ no-close-on-escape
78
+ no-close-on-overlay
79
+ >
80
+ <p>Must use buttons to close.</p>
81
+ <template #footer="{ close }">
82
+ <SkButton kind="primary" @click="close">Done</SkButton>
83
+ </template>
84
+ </SkModal>
85
+ ```
86
+
87
+ ## Custom Colors
88
+
89
+ ```vue
90
+ <SkModal
91
+ base-color="oklch(0.3 0.1 260)"
92
+ text-color="white"
93
+ title="Custom Modal"
94
+ >
95
+ Dark purple modal.
96
+ </SkModal>
97
+ ```
98
+
99
+ ## Accessibility
100
+
101
+ Built on RekaUI Dialog which provides `role="dialog"`, `aria-modal="true"`, and focus trapping. Focus moves to the dialog on open and returns to the trigger on close. Escape key dismisses by default. The close button has `aria-label="Close"`. Content is portaled and inherits the active theme.