@skewedaspect/sleekspace-ui 0.8.1 → 0.9.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/dist/components/Dropdown/SkDropdown.vue.d.ts +9 -1
- package/dist/components/Dropdown/types.d.ts +2 -1
- package/dist/components/NavBar/SkNavBar.vue.d.ts +9 -1
- package/dist/components/NavBar/context.d.ts +2 -0
- package/dist/components/NavBar/types.d.ts +5 -1
- package/dist/components/NumberInput/SkNumberInput.vue.d.ts +8 -0
- package/dist/components/Page/SkPage.vue.d.ts +9 -0
- package/dist/components/ScrollArea/SkScrollArea.vue.d.ts +105 -4
- package/dist/composables/useCustomColors.d.ts +18 -56
- package/{src → dist}/global.d.ts +6 -2
- package/dist/sleekspace-ui.css +4257 -1253
- package/dist/sleekspace-ui.es.js +300 -170
- package/dist/sleekspace-ui.umd.js +299 -169
- package/dist/static/classes.d.ts +18 -0
- package/dist/static/components/alert.d.ts +12 -0
- package/dist/static/components/avatar.d.ts +9 -0
- package/dist/static/components/breadcrumbs.d.ts +6 -0
- package/dist/static/components/button.d.ts +13 -0
- package/dist/static/components/card.d.ts +5 -0
- package/dist/static/components/checkbox.d.ts +10 -0
- package/dist/static/components/colorPicker.d.ts +8 -0
- package/dist/static/components/divider.d.ts +8 -0
- package/dist/static/components/dropdown.d.ts +8 -0
- package/dist/static/components/field.d.ts +15 -0
- package/dist/static/components/group.d.ts +5 -0
- package/dist/static/components/input.d.ts +14 -0
- package/dist/static/components/navBar.d.ts +16 -0
- package/dist/static/components/numberInput.d.ts +15 -0
- package/dist/static/components/page.d.ts +9 -0
- package/dist/static/components/pagination.d.ts +5 -0
- package/dist/static/components/panel.d.ts +11 -0
- package/dist/static/components/progress.d.ts +9 -0
- package/dist/static/components/radio.d.ts +11 -0
- package/dist/static/components/select.d.ts +10 -0
- package/dist/static/components/sidebar.d.ts +9 -0
- package/dist/static/components/skeleton.d.ts +11 -0
- package/dist/static/components/slider.d.ts +12 -0
- package/dist/static/components/spinner.d.ts +12 -0
- package/dist/static/components/switchInput.d.ts +10 -0
- package/dist/static/components/table.d.ts +12 -0
- package/dist/static/components/tag.d.ts +8 -0
- package/dist/static/components/tagsInput.d.ts +7 -0
- package/dist/static/components/textarea.d.ts +12 -0
- package/dist/static/components/toolbar.d.ts +12 -0
- package/dist/static/components/tooltip.d.ts +7 -0
- package/dist/static/escape.d.ts +2 -0
- package/dist/static/index.cjs.js +1 -0
- package/dist/static/index.d.ts +68 -0
- package/dist/static/index.es.js +732 -0
- package/dist/static/render.d.ts +12 -0
- package/dist/static/specs.d.ts +2 -0
- package/dist/static/types.d.ts +43 -0
- package/dist/tokens.css +322 -0
- package/dist/types/index.d.ts +36 -0
- package/dist/utils/slots.d.ts +6 -0
- package/docs/guides/installation.md +8 -2
- package/docs/guides/pure-css/_meta.yaml +8 -0
- package/docs/guides/pure-css/class-api.md +1070 -0
- package/docs/guides/pure-css/custom-elements.md +574 -0
- package/docs/guides/pure-css/index.md +86 -0
- package/docs/guides/pure-css/limitations.md +152 -0
- package/docs/guides/pure-css/static-helpers.md +1203 -0
- package/llms-full.txt +3739 -261
- package/package.json +19 -5
- package/src/components/Alert/SkAlert.vue +4 -2
- package/src/components/Breadcrumbs/SkBreadcrumbs.vue +6 -12
- package/src/components/Button/SkButton.vue +8 -5
- package/src/components/Card/SkCard.vue +13 -5
- package/src/components/Checkbox/SkCheckbox.vue +9 -2
- package/src/components/ContextMenu/SkContextMenuRadioGroup.vue +4 -1
- package/src/components/Dropdown/SkDropdown.vue +20 -3
- package/src/components/Dropdown/SkDropdownRadioGroup.vue +4 -1
- package/src/components/Dropdown/types.ts +2 -1
- package/src/components/Modal/SkModal.vue +11 -4
- package/src/components/NavBar/SkNavBar.vue +19 -8
- package/src/components/NavBar/context.ts +4 -2
- package/src/components/NavBar/types.ts +6 -1
- package/src/components/NumberInput/SkNumberInput.vue +10 -1
- package/src/components/Page/SkPage.vue +29 -15
- package/src/components/Panel/SkPanel.vue +2 -1
- package/src/components/Popover/SkPopover.vue +11 -4
- package/src/components/Radio/SkRadio.vue +9 -2
- package/src/components/ScrollArea/SkScrollArea.vue +78 -5
- package/src/components/Switch/SkSwitch.vue +14 -13
- package/src/components/Tabs/SkTab.vue +7 -2
- package/src/components/TreeView/SkTreeItem.vue +10 -2
- package/src/components/TreeView/SkTreeView.vue +7 -2
- package/src/composables/useCustomColors.ts +86 -77
- package/src/composables/usePortalContext.test.ts +0 -2
- package/src/shims.d.ts +10 -0
- package/src/static/__tests__/parity.test.ts +717 -0
- package/src/static/__tests__/parityHarness.test.ts +98 -0
- package/src/static/__tests__/parityHarness.ts +260 -0
- package/src/static/classes.test.ts +82 -0
- package/src/static/classes.ts +111 -0
- package/src/static/components/__tests__/helpers.test.ts +837 -0
- package/src/static/components/alert.ts +117 -0
- package/src/static/components/avatar.ts +86 -0
- package/src/static/components/breadcrumbs.ts +28 -0
- package/src/static/components/button.ts +75 -0
- package/src/static/components/card.ts +27 -0
- package/src/static/components/checkbox.ts +48 -0
- package/src/static/components/colorPicker.ts +45 -0
- package/src/static/components/divider.ts +39 -0
- package/src/static/components/dropdown.ts +36 -0
- package/src/static/components/field.ts +86 -0
- package/src/static/components/group.ts +27 -0
- package/src/static/components/input.ts +55 -0
- package/src/static/components/navBar.ts +94 -0
- package/src/static/components/numberInput.ts +64 -0
- package/src/static/components/page.ts +31 -0
- package/src/static/components/pagination.ts +27 -0
- package/src/static/components/panel.ts +33 -0
- package/src/static/components/progress.ts +31 -0
- package/src/static/components/radio.ts +53 -0
- package/src/static/components/select.ts +51 -0
- package/src/static/components/sidebar.ts +85 -0
- package/src/static/components/skeleton.ts +66 -0
- package/src/static/components/slider.ts +50 -0
- package/src/static/components/spinner.ts +94 -0
- package/src/static/components/switchInput.ts +49 -0
- package/src/static/components/table.ts +88 -0
- package/src/static/components/tag.ts +76 -0
- package/src/static/components/tagsInput.ts +35 -0
- package/src/static/components/textarea.ts +53 -0
- package/src/static/components/toolbar.ts +74 -0
- package/src/static/components/tooltip.ts +29 -0
- package/src/static/escape.test.ts +53 -0
- package/src/static/escape.ts +28 -0
- package/src/static/generated/defaults.ts +379 -0
- package/src/static/generated/propTypes.ts +426 -0
- package/src/static/index.ts +116 -0
- package/src/static/render.test.ts +83 -0
- package/src/static/render.ts +76 -0
- package/src/static/specs.test.ts +58 -0
- package/src/static/specs.ts +230 -0
- package/src/static/types.ts +176 -0
- package/src/styles/__tests__/testHelpers.ts +97 -0
- package/src/styles/base/_custom-elements.scss +51 -0
- package/src/styles/base/_index.scss +4 -0
- package/src/styles/components/__tests__/componentSelectors.test.ts +2575 -0
- package/src/styles/components/_alert.scss +82 -39
- package/src/styles/components/_avatar.scss +102 -47
- package/src/styles/components/_breadcrumbs.scss +39 -37
- package/src/styles/components/_button.scss +58 -5
- package/src/styles/components/_card.scss +64 -2
- package/src/styles/components/_checkbox.scss +35 -5
- package/src/styles/components/_color-picker.scss +48 -13
- package/src/styles/components/_divider.scss +86 -52
- package/src/styles/components/_dropdown.scss +214 -0
- package/src/styles/components/_field.scss +76 -23
- package/src/styles/components/_group.scss +190 -79
- package/src/styles/components/_index.scss +1 -0
- package/src/styles/components/_input.scss +81 -5
- package/src/styles/components/_menu.scss +1 -1
- package/src/styles/components/_navbar.scss +76 -45
- package/src/styles/components/_number-input.scss +98 -85
- package/src/styles/components/_page.scss +82 -23
- package/src/styles/components/_pagination.scss +240 -212
- package/src/styles/components/_panel.scss +268 -122
- package/src/styles/components/_progress.scss +120 -70
- package/src/styles/components/_radio.scss +35 -5
- package/src/styles/components/_scroll-area.scss +50 -22
- package/src/styles/components/_select.scss +40 -9
- package/src/styles/components/_sidebar.scss +59 -34
- package/src/styles/components/_skeleton.scss +111 -65
- package/src/styles/components/_slider.scss +34 -10
- package/src/styles/components/_spinner.scss +107 -56
- package/src/styles/components/_switch.scss +36 -5
- package/src/styles/components/_table.scss +150 -166
- package/src/styles/components/_tag.scss +244 -154
- package/src/styles/components/_tags-input.scss +46 -12
- package/src/styles/components/_textarea.scss +36 -5
- package/src/styles/components/_toolbar.scss +85 -31
- package/src/styles/components/_tooltip.scss +172 -3
- package/src/styles/mixins/_cut-border.scss +18 -4
- package/src/styles/mixins/_dual-selector.scss +192 -0
- package/src/styles/mixins/_index.scss +1 -0
- package/src/styles/mixins/dualSelector.test.ts +151 -0
- package/src/styles/themes/_colorful.scss +25 -0
- package/src/styles/themes/_greyscale.scss +25 -0
- package/src/styles/themes/_shade-scale.scss +39 -0
- package/src/styles/tokens/_semantic-color-kinds.scss +66 -0
- package/src/{types.ts → types/index.ts} +19 -11
- package/src/utils/slots.ts +75 -0
- package/web-types.json +980 -137
- package/dist/composables/useCustomColors.test.d.ts +0 -1
- package/dist/composables/useFocusTrap.test.d.ts +0 -1
- package/dist/composables/usePortalContext.test.d.ts +0 -1
- package/dist/styles/mixins/fluidSize.test.d.ts +0 -1
- package/dist/types.d.ts +0 -29
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Custom-Element API Reference
|
|
3
|
+
description: Attribute-driven styling for Sleekspace container components using custom HTML tags — no JavaScript or element registration required.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Custom-Element API Reference
|
|
7
|
+
|
|
8
|
+
Sleekspace's CSS includes attribute selectors for all 19 in-scope container components, so
|
|
9
|
+
you can author them as custom elements (`<sk-panel kind="primary">`) and get the exact same
|
|
10
|
+
styling as the class API (`<div class="sk-panel sk-primary">`) — no JavaScript required, no
|
|
11
|
+
custom-element registration, no `customElements.define()`.
|
|
12
|
+
|
|
13
|
+
Browsers parse unknown tags as `HTMLUnknownElement` with `display: inline` by default.
|
|
14
|
+
Sleekspace's CSS resets those to `display: block` (or `inline-flex` for badge-like components)
|
|
15
|
+
so the layout behaves the same as the class-API `<div>` counterparts.
|
|
16
|
+
|
|
17
|
+
## How it works
|
|
18
|
+
|
|
19
|
+
The SCSS uses a dual-selector mixin that emits class and attribute selectors in the same rule:
|
|
20
|
+
|
|
21
|
+
```scss
|
|
22
|
+
/* Generated output — kind="primary" triggers the same rule as .sk-primary */
|
|
23
|
+
.sk-panel.sk-primary,
|
|
24
|
+
sk-panel[kind="primary"] { … }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Boolean attributes work the same way:
|
|
28
|
+
|
|
29
|
+
```scss
|
|
30
|
+
.sk-panel.sk-no-border,
|
|
31
|
+
sk-panel[no-border] { … }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
No JS. No polyfill. Just CSS.
|
|
35
|
+
|
|
36
|
+
## Which components have a custom-element form?
|
|
37
|
+
|
|
38
|
+
The 19 container components listed below all support the `<sk-*>` tag form.
|
|
39
|
+
|
|
40
|
+
The following 12 components **do not** have a custom-element form and are class-API only:
|
|
41
|
+
Button, Input, Textarea, Select, Slider, ColorPicker, Checkbox, Radio, Switch, NumberInput,
|
|
42
|
+
TagsInput, Dropdown.
|
|
43
|
+
|
|
44
|
+
**Why?** Form controls are native semantic elements with mandatory tag names (`<input>`,
|
|
45
|
+
`<select>`, etc.). Replacing them with `<sk-input>` would lose native form behavior,
|
|
46
|
+
accessibility, and browser autofill. Compound controls (Checkbox, Radio, Switch, NumberInput)
|
|
47
|
+
require a hidden native `<input>` child that can't be expressed in a single custom tag without
|
|
48
|
+
JS registration. For these 12, use the [class API](./class-api.md).
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Component Reference
|
|
53
|
+
|
|
54
|
+
### sk-panel
|
|
55
|
+
|
|
56
|
+
**Tag:** `<sk-panel>`
|
|
57
|
+
|
|
58
|
+
**Attributes:**
|
|
59
|
+
|
|
60
|
+
| Attribute | Values | Default |
|
|
61
|
+
|-----------|--------|---------|
|
|
62
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger, boulder, neon-blue, neon-green, neon-red, neon-yellow | neutral |
|
|
63
|
+
| `size` | xs, sm, md, lg, xl | md |
|
|
64
|
+
| `corners` | Space-separated: top-left, top-right, bottom-right, bottom-left | bottom-right |
|
|
65
|
+
| `decoration-corner` | top-left, top-right, bottom-right, bottom-left | bottom-right |
|
|
66
|
+
| `no-border` | Boolean presence | off |
|
|
67
|
+
| `no-decoration` | Boolean presence | off |
|
|
68
|
+
|
|
69
|
+
**Example:**
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<sk-panel kind="primary" size="lg" corners="top-left bottom-right" decoration-corner="top-left">
|
|
73
|
+
<p>Content here.</p>
|
|
74
|
+
</sk-panel>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
[See Vue docs →](/components/panel)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### sk-card
|
|
82
|
+
|
|
83
|
+
**Tag:** `<sk-card>`
|
|
84
|
+
|
|
85
|
+
**Attributes:**
|
|
86
|
+
|
|
87
|
+
| Attribute | Values | Default |
|
|
88
|
+
|-----------|--------|---------|
|
|
89
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
90
|
+
|
|
91
|
+
**Example:**
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<sk-card kind="accent">
|
|
95
|
+
<div class="sk-card-header"><h3>Card Title</h3></div>
|
|
96
|
+
<div class="sk-card-body"><p>Content.</p></div>
|
|
97
|
+
</sk-card>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
[See Vue docs →](/components/card)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### sk-alert
|
|
105
|
+
|
|
106
|
+
**Tag:** `<sk-alert>`
|
|
107
|
+
|
|
108
|
+
**Attributes:**
|
|
109
|
+
|
|
110
|
+
| Attribute | Values | Default |
|
|
111
|
+
|-----------|--------|---------|
|
|
112
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | info |
|
|
113
|
+
| `subtle` | Boolean presence | off |
|
|
114
|
+
|
|
115
|
+
Add `role="alert"` for accessibility. Note: the custom-element form does not auto-inject
|
|
116
|
+
icon or content wrapper divs — the static helper and Vue component do that. For the full
|
|
117
|
+
icon + content structure, use the static helper `alert()` or the class API form with manual
|
|
118
|
+
wrapper divs (see [class API → Alert](./class-api.md#alert)).
|
|
119
|
+
|
|
120
|
+
**Example:**
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<sk-alert kind="warning" role="alert">
|
|
124
|
+
<div class="sk-alert-content">
|
|
125
|
+
<p>Unsaved changes will be lost.</p>
|
|
126
|
+
</div>
|
|
127
|
+
</sk-alert>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
[See Vue docs →](/components/alert)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
### sk-divider
|
|
135
|
+
|
|
136
|
+
**Tag:** `<sk-divider>`
|
|
137
|
+
|
|
138
|
+
**Attributes:**
|
|
139
|
+
|
|
140
|
+
| Attribute | Values | Default |
|
|
141
|
+
|-----------|--------|---------|
|
|
142
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
143
|
+
| `orientation` | horizontal, vertical | horizontal |
|
|
144
|
+
| `variant` | (omit for default), subtle | — |
|
|
145
|
+
|
|
146
|
+
Note: in the class API the divider is an `<hr>` — in the custom-element form you can use
|
|
147
|
+
`<sk-divider>` and the CSS handles display. Add `role="separator"`.
|
|
148
|
+
|
|
149
|
+
**Example:**
|
|
150
|
+
|
|
151
|
+
```html
|
|
152
|
+
<sk-divider kind="neutral" role="separator"></sk-divider>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
[See Vue docs →](/components/divider)
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### sk-page
|
|
160
|
+
|
|
161
|
+
**Tag:** `<sk-page>`
|
|
162
|
+
|
|
163
|
+
**Attributes:**
|
|
164
|
+
|
|
165
|
+
| Attribute | Values | Default |
|
|
166
|
+
|-----------|--------|---------|
|
|
167
|
+
| `fixed-header` | Boolean presence | off |
|
|
168
|
+
| `fixed-footer` | Boolean presence | off |
|
|
169
|
+
| `flush` | Boolean presence | off |
|
|
170
|
+
|
|
171
|
+
**Example:**
|
|
172
|
+
|
|
173
|
+
```html
|
|
174
|
+
<sk-page fixed-header>
|
|
175
|
+
<header class="sk-page-header">…</header>
|
|
176
|
+
<main class="sk-page-main">…</main>
|
|
177
|
+
</sk-page>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
[See Vue docs →](/components/page)
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
### sk-group
|
|
185
|
+
|
|
186
|
+
**Tag:** `<sk-group>`
|
|
187
|
+
|
|
188
|
+
**Attributes:**
|
|
189
|
+
|
|
190
|
+
| Attribute | Values | Default |
|
|
191
|
+
|-----------|--------|---------|
|
|
192
|
+
| `orientation` | horizontal, vertical | horizontal |
|
|
193
|
+
|
|
194
|
+
**Example:**
|
|
195
|
+
|
|
196
|
+
```html
|
|
197
|
+
<sk-group>
|
|
198
|
+
<button class="sk-button sk-neutral" type="button">
|
|
199
|
+
<span class="sk-button-chrome">A</span>
|
|
200
|
+
</button>
|
|
201
|
+
<button class="sk-button sk-neutral" type="button">
|
|
202
|
+
<span class="sk-button-chrome">B</span>
|
|
203
|
+
</button>
|
|
204
|
+
</sk-group>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
[See Vue docs →](/components/group)
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### sk-skeleton
|
|
212
|
+
|
|
213
|
+
**Tag:** `<sk-skeleton>`
|
|
214
|
+
|
|
215
|
+
**Attributes:**
|
|
216
|
+
|
|
217
|
+
| Attribute | Values | Default |
|
|
218
|
+
|-----------|--------|---------|
|
|
219
|
+
| `variant` | text, circular, rectangular, square | text |
|
|
220
|
+
| `animation` | shimmer, pulse, none | shimmer |
|
|
221
|
+
|
|
222
|
+
Note: width and height are set via inline `style` — there are no attribute equivalents.
|
|
223
|
+
|
|
224
|
+
**Example:**
|
|
225
|
+
|
|
226
|
+
```html
|
|
227
|
+
<sk-skeleton variant="rectangular" animation="shimmer"
|
|
228
|
+
style="width: 200px; height: 40px;"></sk-skeleton>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
[See Vue docs →](/components/skeleton)
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### sk-progress
|
|
236
|
+
|
|
237
|
+
**Tag:** `<sk-progress>`
|
|
238
|
+
|
|
239
|
+
**Attributes:**
|
|
240
|
+
|
|
241
|
+
| Attribute | Values | Default |
|
|
242
|
+
|-----------|--------|---------|
|
|
243
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
244
|
+
| `size` | xs, sm, md, lg, xl | md |
|
|
245
|
+
| `indeterminate` | Boolean presence | off |
|
|
246
|
+
|
|
247
|
+
Also set the native `value` and `max` attributes.
|
|
248
|
+
|
|
249
|
+
**Example:**
|
|
250
|
+
|
|
251
|
+
```html
|
|
252
|
+
<sk-progress kind="primary" size="sm" value="40" max="100"></sk-progress>
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
[See Vue docs →](/components/progress)
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
### sk-spinner
|
|
260
|
+
|
|
261
|
+
**Tag:** `<sk-spinner>`
|
|
262
|
+
|
|
263
|
+
**Attributes:**
|
|
264
|
+
|
|
265
|
+
| Attribute | Values | Default |
|
|
266
|
+
|-----------|--------|---------|
|
|
267
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | primary |
|
|
268
|
+
| `size` | xs, sm, md, lg, xl | md |
|
|
269
|
+
| `variant` | circular, dots, crosshair | circular |
|
|
270
|
+
|
|
271
|
+
Note: the custom-element form does not inject the inner arc/dot DOM that the static helper
|
|
272
|
+
and Vue component emit. Add `role="status"` and `aria-label="Loading"` manually.
|
|
273
|
+
|
|
274
|
+
**Example:**
|
|
275
|
+
|
|
276
|
+
```html
|
|
277
|
+
<sk-spinner kind="accent" size="lg" variant="circular"
|
|
278
|
+
role="status" aria-label="Loading"></sk-spinner>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
[See Vue docs →](/components/spinner)
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### sk-navbar
|
|
286
|
+
|
|
287
|
+
**Tag:** `<sk-navbar>`
|
|
288
|
+
|
|
289
|
+
**Attributes:**
|
|
290
|
+
|
|
291
|
+
| Attribute | Values | Default |
|
|
292
|
+
|-----------|--------|---------|
|
|
293
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
294
|
+
| `sticky` | Boolean presence | on (sticky by default in class API) |
|
|
295
|
+
|
|
296
|
+
Note: the `sk-sticky` class is applied by default via the static helper when `sticky !== false`.
|
|
297
|
+
In the custom-element form, `sticky` is a boolean attribute — include it to enable, omit to disable.
|
|
298
|
+
|
|
299
|
+
**Example:**
|
|
300
|
+
|
|
301
|
+
```html
|
|
302
|
+
<sk-navbar kind="neutral" sticky>
|
|
303
|
+
<div class="sk-navbar-content">
|
|
304
|
+
<div class="sk-navbar-brand">MySite</div>
|
|
305
|
+
<div class="sk-navbar-nav">…</div>
|
|
306
|
+
</div>
|
|
307
|
+
</sk-navbar>
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
[See Vue docs →](/components/navbar)
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
### sk-toolbar
|
|
315
|
+
|
|
316
|
+
**Tag:** `<sk-toolbar>`
|
|
317
|
+
|
|
318
|
+
**Attributes:**
|
|
319
|
+
|
|
320
|
+
| Attribute | Values | Default |
|
|
321
|
+
|-----------|--------|---------|
|
|
322
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
323
|
+
| `orientation` | horizontal, vertical | horizontal |
|
|
324
|
+
|
|
325
|
+
Add `role="toolbar"`.
|
|
326
|
+
|
|
327
|
+
**Example:**
|
|
328
|
+
|
|
329
|
+
```html
|
|
330
|
+
<sk-toolbar kind="neutral" role="toolbar">
|
|
331
|
+
<button class="sk-button sk-neutral" type="button">
|
|
332
|
+
<span class="sk-button-chrome">Cut</span>
|
|
333
|
+
</button>
|
|
334
|
+
<button class="sk-button sk-neutral" type="button">
|
|
335
|
+
<span class="sk-button-chrome">Copy</span>
|
|
336
|
+
</button>
|
|
337
|
+
</sk-toolbar>
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
[See Vue docs →](/components/toolbar)
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
### sk-sidebar
|
|
345
|
+
|
|
346
|
+
**Tag:** `<sk-sidebar>`
|
|
347
|
+
|
|
348
|
+
**Attributes:**
|
|
349
|
+
|
|
350
|
+
| Attribute | Values | Default |
|
|
351
|
+
|-----------|--------|---------|
|
|
352
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
353
|
+
| `side` | left, right | left |
|
|
354
|
+
| `dense` | Boolean presence | off |
|
|
355
|
+
|
|
356
|
+
Drawer open/close is Vue-only. The custom-element form is always visible.
|
|
357
|
+
|
|
358
|
+
**Example:**
|
|
359
|
+
|
|
360
|
+
```html
|
|
361
|
+
<sk-sidebar kind="neutral">
|
|
362
|
+
<nav>…</nav>
|
|
363
|
+
</sk-sidebar>
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
[See Vue docs →](/components/sidebar)
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
### sk-breadcrumbs
|
|
371
|
+
|
|
372
|
+
**Tag:** `<sk-breadcrumbs>`
|
|
373
|
+
|
|
374
|
+
**Attributes:**
|
|
375
|
+
|
|
376
|
+
| Attribute | Values | Default |
|
|
377
|
+
|-----------|--------|---------|
|
|
378
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
379
|
+
|
|
380
|
+
Add `aria-label="Breadcrumbs"`.
|
|
381
|
+
|
|
382
|
+
**Example:**
|
|
383
|
+
|
|
384
|
+
```html
|
|
385
|
+
<sk-breadcrumbs kind="neutral" aria-label="Breadcrumbs">
|
|
386
|
+
<ol>
|
|
387
|
+
<li><a href="/">Home</a></li>
|
|
388
|
+
<li aria-current="page">Docs</li>
|
|
389
|
+
</ol>
|
|
390
|
+
</sk-breadcrumbs>
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
[See Vue docs →](/components/breadcrumbs)
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
### sk-pagination
|
|
398
|
+
|
|
399
|
+
**Tag:** `<sk-pagination>`
|
|
400
|
+
|
|
401
|
+
**Attributes:**
|
|
402
|
+
|
|
403
|
+
| Attribute | Values | Default |
|
|
404
|
+
|-----------|--------|---------|
|
|
405
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
406
|
+
|
|
407
|
+
Add `aria-label="Pagination"`.
|
|
408
|
+
|
|
409
|
+
**Example:**
|
|
410
|
+
|
|
411
|
+
```html
|
|
412
|
+
<sk-pagination kind="neutral" aria-label="Pagination">
|
|
413
|
+
<button class="sk-button sk-neutral" type="button">
|
|
414
|
+
<span class="sk-button-chrome">‹</span>
|
|
415
|
+
</button>
|
|
416
|
+
<button class="sk-button sk-primary" type="button" aria-current="page">
|
|
417
|
+
<span class="sk-button-chrome">1</span>
|
|
418
|
+
</button>
|
|
419
|
+
<button class="sk-button sk-neutral" type="button">
|
|
420
|
+
<span class="sk-button-chrome">›</span>
|
|
421
|
+
</button>
|
|
422
|
+
</sk-pagination>
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
[See Vue docs →](/components/pagination)
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
### sk-tag
|
|
430
|
+
|
|
431
|
+
**Tag:** `<sk-tag>`
|
|
432
|
+
|
|
433
|
+
**Attributes:**
|
|
434
|
+
|
|
435
|
+
| Attribute | Values | Default |
|
|
436
|
+
|-----------|--------|---------|
|
|
437
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
438
|
+
| `size` | xs, sm, md, lg, xl | md |
|
|
439
|
+
| `variant` | solid, outline, ghost | solid |
|
|
440
|
+
| `removable` | Boolean presence | off |
|
|
441
|
+
|
|
442
|
+
Note: content should be wrapped in `<span class="sk-tag-content">` for correct inner spacing.
|
|
443
|
+
|
|
444
|
+
**Example:**
|
|
445
|
+
|
|
446
|
+
```html
|
|
447
|
+
<sk-tag kind="accent" size="sm" variant="outline">
|
|
448
|
+
<span class="sk-tag-content">Beta</span>
|
|
449
|
+
</sk-tag>
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
[See Vue docs →](/components/tag)
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### sk-avatar
|
|
457
|
+
|
|
458
|
+
**Tag:** `<sk-avatar>`
|
|
459
|
+
|
|
460
|
+
**Attributes:**
|
|
461
|
+
|
|
462
|
+
| Attribute | Values | Default |
|
|
463
|
+
|-----------|--------|---------|
|
|
464
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
465
|
+
| `size` | xs, sm, md, lg, xl | md |
|
|
466
|
+
|
|
467
|
+
Note: there is no `shape` attribute — the Vue component does not expose a shape prop.
|
|
468
|
+
Place the inner content (img, initials span, or fallback icon) as children.
|
|
469
|
+
|
|
470
|
+
**Example:**
|
|
471
|
+
|
|
472
|
+
```html
|
|
473
|
+
<sk-avatar kind="primary" size="lg">
|
|
474
|
+
<img src="/avatar.jpg" alt="User" class="sk-avatar-image" />
|
|
475
|
+
</sk-avatar>
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
[See Vue docs →](/components/avatar)
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
### sk-field
|
|
483
|
+
|
|
484
|
+
**Tag:** `<sk-field>`
|
|
485
|
+
|
|
486
|
+
**Attributes:**
|
|
487
|
+
|
|
488
|
+
| Attribute | Values | Default |
|
|
489
|
+
|-----------|--------|---------|
|
|
490
|
+
| `label-position` | top, left, right | top |
|
|
491
|
+
| `has-error` | Boolean presence | off |
|
|
492
|
+
|
|
493
|
+
**Example:**
|
|
494
|
+
|
|
495
|
+
```html
|
|
496
|
+
<sk-field label-position="top">
|
|
497
|
+
<label class="sk-field-label" for="email">Email</label>
|
|
498
|
+
<div class="sk-field-input-wrapper">
|
|
499
|
+
<input class="sk-input sk-neutral" id="email" type="email" />
|
|
500
|
+
</div>
|
|
501
|
+
</sk-field>
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
[See Vue docs →](/components/field)
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
### sk-table
|
|
509
|
+
|
|
510
|
+
**Tag:** `<sk-table>`
|
|
511
|
+
|
|
512
|
+
**Attributes:**
|
|
513
|
+
|
|
514
|
+
| Attribute | Values | Default |
|
|
515
|
+
|-----------|--------|---------|
|
|
516
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
517
|
+
| `variant` | default, (others) | default |
|
|
518
|
+
| `striped` | Boolean presence | off |
|
|
519
|
+
| `hoverable` | Boolean presence | on by default (omit to disable via class: don't add `sk-hoverable`) |
|
|
520
|
+
| `bordered` | Boolean presence | on by default |
|
|
521
|
+
| `inner-borders` | Boolean presence | off (inner borders suppressed by default) |
|
|
522
|
+
| `dark-background` | Boolean presence | off |
|
|
523
|
+
| `subtle` | Boolean presence | off |
|
|
524
|
+
|
|
525
|
+
Note: the custom-element form targets the `<table>` directly. The `sk-table-wrapper` div
|
|
526
|
+
is a class-API / static-helper construct — it's not injected automatically for custom elements.
|
|
527
|
+
|
|
528
|
+
**Example:**
|
|
529
|
+
|
|
530
|
+
```html
|
|
531
|
+
<sk-table kind="neutral" striped>
|
|
532
|
+
<thead><tr><th>Name</th><th>Role</th></tr></thead>
|
|
533
|
+
<tbody><tr><td>Alice</td><td>Engineer</td></tr></tbody>
|
|
534
|
+
</sk-table>
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
[See Vue docs →](/components/table)
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
### sk-tooltip
|
|
542
|
+
|
|
543
|
+
**Tag:** `<sk-tooltip>`
|
|
544
|
+
|
|
545
|
+
**Attributes:**
|
|
546
|
+
|
|
547
|
+
| Attribute | Values | Default |
|
|
548
|
+
|-----------|--------|---------|
|
|
549
|
+
| `kind` | neutral, primary, accent, info, success, warning, danger | neutral |
|
|
550
|
+
| `variant` | solid, outline | solid |
|
|
551
|
+
| `placement` | top, right, bottom, left | top |
|
|
552
|
+
|
|
553
|
+
Add `role="tooltip"`. The Vue version includes trigger management and floating-UI positioning —
|
|
554
|
+
the custom-element form is for static pre-positioned tooltip markup only.
|
|
555
|
+
|
|
556
|
+
**Example:**
|
|
557
|
+
|
|
558
|
+
```html
|
|
559
|
+
<sk-tooltip kind="neutral" placement="top" role="tooltip">
|
|
560
|
+
Click to expand
|
|
561
|
+
</sk-tooltip>
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
[See Vue docs →](/components/tooltip)
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## Form controls: class-only {#form-controls}
|
|
569
|
+
|
|
570
|
+
The following 12 components **do not** have a custom-element form and require the class API:
|
|
571
|
+
Button, Input, Textarea, Select, Slider, ColorPicker, Checkbox, Radio, Switch, NumberInput,
|
|
572
|
+
TagsInput, Dropdown.
|
|
573
|
+
|
|
574
|
+
Use the [class API](./class-api.md) for all 12 of these components.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sleekspace Without Vue
|
|
3
|
+
description: Use the Sleekspace design system in static sites and non-Vue apps via the class API, custom-element API, or static helper functions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sleekspace Without Vue
|
|
7
|
+
|
|
8
|
+
Sleekspace is a Vue 3 component library, but the design system itself is framework-agnostic.
|
|
9
|
+
If you're building a static site — VitePress output, Astro, 11ty, a build-time script — you
|
|
10
|
+
can use Sleekspace's visual language without shipping Vue or paying for hydration.
|
|
11
|
+
|
|
12
|
+
## Quick lookup
|
|
13
|
+
|
|
14
|
+
Common tasks and where to find them:
|
|
15
|
+
|
|
16
|
+
| I want to… | Go here |
|
|
17
|
+
|-----------|---------|
|
|
18
|
+
| Build an alert box | [`alert()`](./static-helpers.md#alert) or [class form](./class-api.md#alert) |
|
|
19
|
+
| Add a spinner | [`spinner()`](./static-helpers.md#spinner) or [class form](./class-api.md#spinner) |
|
|
20
|
+
| Render a nav bar | [`navBar()`](./static-helpers.md#navbar) or [class form](./class-api.md#navbar) |
|
|
21
|
+
| Lay out a page shell | [`page()`](./static-helpers.md#page) or [class form](./class-api.md#page) |
|
|
22
|
+
| Show an avatar | [`avatar()`](./static-helpers.md#avatar) or [class form](./class-api.md#avatar) |
|
|
23
|
+
| Wrap a form field | [`field()`](./static-helpers.md#field) or [class form](./class-api.md#field) |
|
|
24
|
+
| Display a data table | [`table()`](./static-helpers.md#table) or [class form](./class-api.md#table) |
|
|
25
|
+
| Add a tag / badge | [`tag()`](./static-helpers.md#tag) or [class form](./class-api.md#tag) |
|
|
26
|
+
|
|
27
|
+
## Three ways to use Sleekspace without Vue
|
|
28
|
+
|
|
29
|
+
### 1. Class API — Bootstrap-style HTML classes
|
|
30
|
+
|
|
31
|
+
Ship the compiled CSS and write HTML directly.
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<link rel="stylesheet" href="/path/to/sleekspace-ui.css" />
|
|
35
|
+
|
|
36
|
+
<div class="sk-panel sk-primary sk-lg">
|
|
37
|
+
<p>Primary panel, large cut size.</p>
|
|
38
|
+
</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Works in any SSG, any language, any framework. Zero JS.
|
|
42
|
+
|
|
43
|
+
[See the full class reference →](./class-api.md)
|
|
44
|
+
|
|
45
|
+
### 2. Custom-element API — attribute-driven
|
|
46
|
+
|
|
47
|
+
Author containers as light-DOM custom elements with attributes.
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<sk-panel kind="primary" size="lg">
|
|
51
|
+
<p>Same panel, attribute-driven.</p>
|
|
52
|
+
</sk-panel>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Zero JS required — Sleekspace targets custom elements via attribute selectors, no registration
|
|
56
|
+
needed. Form controls remain on native elements via the class API.
|
|
57
|
+
|
|
58
|
+
[See the custom-element reference →](./custom-elements.md)
|
|
59
|
+
|
|
60
|
+
### 3. Static helpers — Node SSG ergonomics
|
|
61
|
+
|
|
62
|
+
Import typed helper functions from the `/static` subpath.
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { panel, button } from '@skewedaspect/sleekspace-ui/static';
|
|
66
|
+
|
|
67
|
+
const html = panel({ kind: 'primary', size: 'lg' }, `<p>Content</p>`);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Strongly typed, zero runtime dependencies, works in any Node-based SSG.
|
|
71
|
+
|
|
72
|
+
[See the static helpers reference →](./static-helpers.md)
|
|
73
|
+
|
|
74
|
+
## What you don't get
|
|
75
|
+
|
|
76
|
+
The pure-CSS layer covers presentational components only. Interactive components that need JS
|
|
77
|
+
state management (Modal, Toast, Accordion, Dropdown menu, TreeView, Tabs, etc.) remain Vue-only.
|
|
78
|
+
|
|
79
|
+
[See the full limitations page →](./limitations.md)
|
|
80
|
+
|
|
81
|
+
## Path chooser
|
|
82
|
+
|
|
83
|
+
- **I just want to write HTML that looks like Sleekspace.** → [Class API](./class-api.md)
|
|
84
|
+
- **I want attribute-driven ergonomics for containers.** → [Custom elements](./custom-elements.md)
|
|
85
|
+
- **I'm building SSG output from Node.** → [Static helpers](./static-helpers.md)
|
|
86
|
+
- **I want to know what's missing vs. the Vue version.** → [Limitations](./limitations.md)
|