@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.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/sleekspace-ui.css +12844 -0
- package/dist/sleekspace-ui.es.js +19021 -0
- package/dist/sleekspace-ui.umd.js +19040 -0
- package/docs/components/accordion.md +92 -0
- package/docs/components/alert.md +72 -0
- package/docs/components/avatar.md +69 -0
- package/docs/components/breadcrumbs.md +65 -0
- package/docs/components/button/_meta.yaml +12 -0
- package/docs/components/button/accessibility.md +16 -0
- package/docs/components/button/custom-colors.md +18 -0
- package/docs/components/button/icons.md +31 -0
- package/docs/components/button/intro.md +8 -0
- package/docs/components/button/kinds.md +25 -0
- package/docs/components/button/sizes.md +14 -0
- package/docs/components/button/states.md +12 -0
- package/docs/components/button/usage.md +23 -0
- package/docs/components/button/variants.md +14 -0
- package/docs/components/button.md +110 -0
- package/docs/components/card.md +87 -0
- package/docs/components/checkbox.md +77 -0
- package/docs/components/collapsible.md +71 -0
- package/docs/components/divider.md +62 -0
- package/docs/components/dropdown.md +88 -0
- package/docs/components/field.md +80 -0
- package/docs/components/group.md +41 -0
- package/docs/components/input.md +84 -0
- package/docs/components/listbox.md +82 -0
- package/docs/components/modal.md +101 -0
- package/docs/components/navbar.md +64 -0
- package/docs/components/number-input.md +78 -0
- package/docs/components/page.md +77 -0
- package/docs/components/pagination.md +88 -0
- package/docs/components/panel.md +74 -0
- package/docs/components/popover.md +93 -0
- package/docs/components/progress.md +76 -0
- package/docs/components/radio.md +86 -0
- package/docs/components/sidebar.md +74 -0
- package/docs/components/skeleton.md +76 -0
- package/docs/components/slider.md +94 -0
- package/docs/components/spinner.md +59 -0
- package/docs/components/switch.md +97 -0
- package/docs/components/table.md +91 -0
- package/docs/components/tabs.md +108 -0
- package/docs/components/tag.md +75 -0
- package/docs/components/tags-input.md +88 -0
- package/docs/components/textarea.md +80 -0
- package/docs/components/theme.md +65 -0
- package/docs/components/toast.md +95 -0
- package/docs/components/tooltip.md +90 -0
- package/docs/guides/custom-colors.md +84 -0
- package/docs/guides/design-tokens.md +105 -0
- package/docs/guides/getting-started.md +144 -0
- package/docs/guides/installation.md +62 -0
- package/docs/guides/theming.md +101 -0
- package/package.json +76 -0
- package/src/components/Accordion/SkAccordion.vue +133 -0
- package/src/components/Accordion/SkAccordionItem.vue +131 -0
- package/src/components/Accordion/index.ts +3 -0
- package/src/components/Accordion/types.ts +9 -0
- package/src/components/Alert/SkAlert.vue +137 -0
- package/src/components/Alert/types.ts +10 -0
- package/src/components/Avatar/SkAvatar.vue +141 -0
- package/src/components/Avatar/index.ts +8 -0
- package/src/components/Avatar/types.ts +31 -0
- package/src/components/Breadcrumbs/SkBreadcrumbItem.vue +76 -0
- package/src/components/Breadcrumbs/SkBreadcrumbSeparator.vue +38 -0
- package/src/components/Breadcrumbs/SkBreadcrumbs.vue +93 -0
- package/src/components/Breadcrumbs/index.ts +10 -0
- package/src/components/Breadcrumbs/types.ts +36 -0
- package/src/components/Button/SkButton.vue +148 -0
- package/src/components/Button/types.ts +21 -0
- package/src/components/Card/SkCard.vue +144 -0
- package/src/components/Card/types.ts +12 -0
- package/src/components/Checkbox/SkCheckbox.vue +136 -0
- package/src/components/Checkbox/index.ts +8 -0
- package/src/components/Checkbox/types.ts +10 -0
- package/src/components/Collapsible/SkCollapsible.vue +159 -0
- package/src/components/Collapsible/index.ts +2 -0
- package/src/components/Collapsible/types.ts +8 -0
- package/src/components/Divider/SkDivider.vue +63 -0
- package/src/components/Divider/types.ts +15 -0
- package/src/components/Dropdown/SkDropdown.vue +150 -0
- package/src/components/Dropdown/SkDropdownMenuItem.vue +58 -0
- package/src/components/Dropdown/SkDropdownMenuSeparator.vue +26 -0
- package/src/components/Dropdown/SkDropdownSubmenu.vue +107 -0
- package/src/components/Dropdown/index.ts +11 -0
- package/src/components/Dropdown/types.ts +11 -0
- package/src/components/Field/SkField.vue +152 -0
- package/src/components/Field/index.ts +8 -0
- package/src/components/Field/types.ts +7 -0
- package/src/components/Group/SkGroup.vue +52 -0
- package/src/components/Group/types.ts +10 -0
- package/src/components/Input/SkInput.vue +117 -0
- package/src/components/Input/index.ts +8 -0
- package/src/components/Input/types.ts +11 -0
- package/src/components/Listbox/SkListbox.vue +164 -0
- package/src/components/Listbox/SkListboxItem.vue +68 -0
- package/src/components/Listbox/SkListboxSeparator.vue +26 -0
- package/src/components/Listbox/index.ts +10 -0
- package/src/components/Listbox/types.ts +10 -0
- package/src/components/Modal/SkModal.vue +231 -0
- package/src/components/Modal/index.ts +8 -0
- package/src/components/Modal/types.ts +12 -0
- package/src/components/NavBar/SkNavBar.vue +83 -0
- package/src/components/NavBar/index.ts +8 -0
- package/src/components/NavBar/types.ts +15 -0
- package/src/components/NumberInput/SkNumberInput.vue +168 -0
- package/src/components/NumberInput/index.ts +8 -0
- package/src/components/NumberInput/types.ts +10 -0
- package/src/components/Page/SkPage.vue +94 -0
- package/src/components/Page/index.ts +8 -0
- package/src/components/Page/types.ts +21 -0
- package/src/components/Pagination/SkPagination.vue +185 -0
- package/src/components/Pagination/SkPaginationItem.vue +107 -0
- package/src/components/Pagination/index.ts +9 -0
- package/src/components/Pagination/types.ts +40 -0
- package/src/components/Panel/SkPanel.vue +96 -0
- package/src/components/Panel/types.ts +15 -0
- package/src/components/Popover/SkPopover.vue +185 -0
- package/src/components/Popover/index.ts +8 -0
- package/src/components/Popover/types.ts +11 -0
- package/src/components/Progress/SkProgress.vue +144 -0
- package/src/components/Progress/index.ts +8 -0
- package/src/components/Progress/types.ts +34 -0
- package/src/components/Radio/SkRadio.vue +110 -0
- package/src/components/Radio/SkRadioGroup.vue +92 -0
- package/src/components/Radio/index.ts +9 -0
- package/src/components/Radio/types.ts +11 -0
- package/src/components/Sidebar/README.md +405 -0
- package/src/components/Sidebar/SkSidebar.vue +88 -0
- package/src/components/Sidebar/SkSidebarItem.vue +58 -0
- package/src/components/Sidebar/SkSidebarSection.vue +40 -0
- package/src/components/Sidebar/types.ts +3 -0
- package/src/components/Skeleton/SkSkeleton.vue +171 -0
- package/src/components/Skeleton/index.ts +8 -0
- package/src/components/Skeleton/types.ts +31 -0
- package/src/components/Slider/SkSlider.vue +165 -0
- package/src/components/Slider/index.ts +8 -0
- package/src/components/Slider/types.ts +44 -0
- package/src/components/Spinner/SkSpinner.vue +105 -0
- package/src/components/Spinner/index.ts +8 -0
- package/src/components/Spinner/types.ts +28 -0
- package/src/components/Switch/SkSwitch.vue +215 -0
- package/src/components/Switch/index.ts +8 -0
- package/src/components/Switch/types.ts +12 -0
- package/src/components/Table/SkTable.vue +109 -0
- package/src/components/Table/index.ts +2 -0
- package/src/components/Table/types.ts +15 -0
- package/src/components/Tabs/README.md +331 -0
- package/src/components/Tabs/SkTab.vue +84 -0
- package/src/components/Tabs/SkTabList.vue +62 -0
- package/src/components/Tabs/SkTabPanel.vue +47 -0
- package/src/components/Tabs/SkTabPanels.vue +23 -0
- package/src/components/Tabs/SkTabs.vue +124 -0
- package/src/components/Tabs/types.ts +21 -0
- package/src/components/Tag/SkTag.vue +129 -0
- package/src/components/Tag/types.ts +15 -0
- package/src/components/TagsInput/SkTagsInput.vue +184 -0
- package/src/components/TagsInput/index.ts +8 -0
- package/src/components/TagsInput/types.ts +10 -0
- package/src/components/Textarea/SkTextarea.vue +117 -0
- package/src/components/Textarea/index.ts +8 -0
- package/src/components/Textarea/types.ts +10 -0
- package/src/components/Theme/SkTheme.vue +47 -0
- package/src/components/Theme/types.ts +17 -0
- package/src/components/Theme/useTheme.ts +131 -0
- package/src/components/Toast/SkToast.vue +156 -0
- package/src/components/Toast/SkToastProvider.vue +180 -0
- package/src/components/Toast/index.ts +15 -0
- package/src/components/Toast/types.ts +63 -0
- package/src/components/Toast/useToast.ts +78 -0
- package/src/components/Tooltip/SkTooltip.vue +162 -0
- package/src/components/Tooltip/SkTooltipProvider.vue +114 -0
- package/src/components/Tooltip/index.ts +9 -0
- package/src/components/Tooltip/types.ts +13 -0
- package/src/composables/useCustomColors.test.ts +505 -0
- package/src/composables/useCustomColors.ts +124 -0
- package/src/composables/usePortalContext.test.ts +402 -0
- package/src/composables/usePortalContext.ts +95 -0
- package/src/global.d.ts +76 -0
- package/src/index.ts +259 -0
- package/src/styles/_scrollbar.scss +100 -0
- package/src/styles/base/_fonts.scss +105 -0
- package/src/styles/base/_global.scss +47 -0
- package/src/styles/base/_index.scss +24 -0
- package/src/styles/base/_reset.scss +11 -0
- package/src/styles/base/_typography.scss +178 -0
- package/src/styles/components/_accordion.scss +250 -0
- package/src/styles/components/_alert.scss +239 -0
- package/src/styles/components/_avatar.scss +133 -0
- package/src/styles/components/_breadcrumbs.scss +137 -0
- package/src/styles/components/_button.scss +731 -0
- package/src/styles/components/_card.scss +141 -0
- package/src/styles/components/_checkbox.scss +232 -0
- package/src/styles/components/_collapsible.scss +158 -0
- package/src/styles/components/_divider.scss +121 -0
- package/src/styles/components/_field.scss +87 -0
- package/src/styles/components/_group.scss +138 -0
- package/src/styles/components/_index.scss +46 -0
- package/src/styles/components/_input.scss +205 -0
- package/src/styles/components/_listbox.scss +453 -0
- package/src/styles/components/_menu.scss +216 -0
- package/src/styles/components/_modal.scss +329 -0
- package/src/styles/components/_navbar.scss +258 -0
- package/src/styles/components/_number-input.scss +352 -0
- package/src/styles/components/_page.scss +98 -0
- package/src/styles/components/_pagination.scss +411 -0
- package/src/styles/components/_panel.scss +281 -0
- package/src/styles/components/_popover.scss +258 -0
- package/src/styles/components/_progress.scss +280 -0
- package/src/styles/components/_radio.scss +255 -0
- package/src/styles/components/_sidebar.scss +92 -0
- package/src/styles/components/_skeleton.scss +138 -0
- package/src/styles/components/_slider.scss +262 -0
- package/src/styles/components/_spinner.scss +331 -0
- package/src/styles/components/_switch.scss +370 -0
- package/src/styles/components/_table.scss +405 -0
- package/src/styles/components/_tabs.scss +486 -0
- package/src/styles/components/_tag.scss +425 -0
- package/src/styles/components/_tags-input.scss +279 -0
- package/src/styles/components/_textarea.scss +208 -0
- package/src/styles/components/_toast.scss +331 -0
- package/src/styles/components/_tooltip.scss +206 -0
- package/src/styles/fonts/Titillium_Web/OFL.txt +93 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-Black.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-Bold.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-BoldItalic.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLight.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLightItalic.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-Italic.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-Light.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-LightItalic.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-Regular.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBold.ttf +0 -0
- package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBoldItalic.ttf +0 -0
- package/src/styles/index.scss +17 -0
- package/src/styles/mixins/_cut-border.scss +254 -0
- package/src/styles/mixins/_index.scss +7 -0
- package/src/styles/theme/_variables.scss +42 -0
- package/src/styles/themes/README.md +127 -0
- package/src/styles/themes/_colorful.scss +58 -0
- package/src/styles/themes/_greyscale.scss +58 -0
- package/src/styles/themes/index.scss +9 -0
- package/src/styles/tokens/README.md +268 -0
- package/src/styles/tokens/_foundation-borders.scss +26 -0
- package/src/styles/tokens/_foundation-colors.scss +169 -0
- package/src/styles/tokens/_foundation-glow.scss +36 -0
- package/src/styles/tokens/_foundation-radius.scss +53 -0
- package/src/styles/tokens/_foundation-scrollbar.scss +31 -0
- package/src/styles/tokens/_foundation-shadows.scss +37 -0
- package/src/styles/tokens/_foundation-space.scss +36 -0
- package/src/styles/tokens/_foundation-transitions.scss +37 -0
- package/src/styles/tokens/_foundation-typography.scss +58 -0
- package/src/styles/tokens/_semantic-color-kinds.scss +112 -0
- package/src/styles/tokens/_semantic-colors.scss +10 -0
- package/src/styles/tokens/_semantic-interactive.scss +29 -0
- package/src/styles/tokens/_semantic-scrollbar.scss +48 -0
- package/src/styles/tokens/_semantic-surfaces.scss +36 -0
- package/src/styles/tokens/index.scss +38 -0
- package/src/styles/tokens.scss +268 -0
- package/src/styles/utilities/_index.scss +9 -0
- package/src/styles/utilities/_typography.scss +121 -0
- package/src/types.ts +50 -0
- 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.
|