@skewedaspect/sleekspace-ui 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/components/Dropdown/SkDropdown.vue.d.ts +9 -1
  2. package/dist/components/Dropdown/types.d.ts +2 -1
  3. package/dist/components/NavBar/SkNavBar.vue.d.ts +9 -1
  4. package/dist/components/NavBar/context.d.ts +2 -0
  5. package/dist/components/NavBar/types.d.ts +5 -1
  6. package/dist/components/Page/SkPage.vue.d.ts +9 -0
  7. package/dist/components/ScrollArea/SkScrollArea.vue.d.ts +105 -4
  8. package/dist/composables/useCustomColors.d.ts +18 -56
  9. package/{src → dist}/global.d.ts +6 -2
  10. package/dist/sleekspace-ui.css +4253 -1251
  11. package/dist/sleekspace-ui.es.js +204 -109
  12. package/dist/sleekspace-ui.umd.js +204 -109
  13. package/dist/static/classes.d.ts +18 -0
  14. package/dist/static/components/alert.d.ts +12 -0
  15. package/dist/static/components/avatar.d.ts +9 -0
  16. package/dist/static/components/breadcrumbs.d.ts +6 -0
  17. package/dist/static/components/button.d.ts +13 -0
  18. package/dist/static/components/card.d.ts +5 -0
  19. package/dist/static/components/checkbox.d.ts +10 -0
  20. package/dist/static/components/colorPicker.d.ts +8 -0
  21. package/dist/static/components/divider.d.ts +8 -0
  22. package/dist/static/components/dropdown.d.ts +8 -0
  23. package/dist/static/components/field.d.ts +15 -0
  24. package/dist/static/components/group.d.ts +5 -0
  25. package/dist/static/components/input.d.ts +14 -0
  26. package/dist/static/components/navBar.d.ts +16 -0
  27. package/dist/static/components/numberInput.d.ts +15 -0
  28. package/dist/static/components/page.d.ts +9 -0
  29. package/dist/static/components/pagination.d.ts +5 -0
  30. package/dist/static/components/panel.d.ts +11 -0
  31. package/dist/static/components/progress.d.ts +9 -0
  32. package/dist/static/components/radio.d.ts +11 -0
  33. package/dist/static/components/select.d.ts +10 -0
  34. package/dist/static/components/sidebar.d.ts +9 -0
  35. package/dist/static/components/skeleton.d.ts +11 -0
  36. package/dist/static/components/slider.d.ts +12 -0
  37. package/dist/static/components/spinner.d.ts +12 -0
  38. package/dist/static/components/switchInput.d.ts +10 -0
  39. package/dist/static/components/table.d.ts +12 -0
  40. package/dist/static/components/tag.d.ts +8 -0
  41. package/dist/static/components/tagsInput.d.ts +7 -0
  42. package/dist/static/components/textarea.d.ts +12 -0
  43. package/dist/static/components/toolbar.d.ts +12 -0
  44. package/dist/static/components/tooltip.d.ts +7 -0
  45. package/dist/static/escape.d.ts +2 -0
  46. package/dist/static/index.cjs.js +1 -0
  47. package/dist/static/index.d.ts +68 -0
  48. package/dist/static/index.es.js +732 -0
  49. package/dist/static/render.d.ts +12 -0
  50. package/dist/static/specs.d.ts +2 -0
  51. package/dist/static/types.d.ts +43 -0
  52. package/dist/tokens.css +322 -0
  53. package/dist/types/index.d.ts +36 -0
  54. package/docs/guides/installation.md +8 -2
  55. package/docs/guides/pure-css/_meta.yaml +8 -0
  56. package/docs/guides/pure-css/class-api.md +1070 -0
  57. package/docs/guides/pure-css/custom-elements.md +574 -0
  58. package/docs/guides/pure-css/index.md +86 -0
  59. package/docs/guides/pure-css/limitations.md +152 -0
  60. package/docs/guides/pure-css/static-helpers.md +1203 -0
  61. package/llms-full.txt +3736 -261
  62. package/package.json +16 -5
  63. package/src/components/Card/SkCard.vue +1 -0
  64. package/src/components/ContextMenu/SkContextMenuRadioGroup.vue +4 -1
  65. package/src/components/Dropdown/SkDropdown.vue +20 -3
  66. package/src/components/Dropdown/SkDropdownRadioGroup.vue +4 -1
  67. package/src/components/Dropdown/types.ts +2 -1
  68. package/src/components/NavBar/SkNavBar.vue +14 -4
  69. package/src/components/NavBar/context.ts +4 -2
  70. package/src/components/NavBar/types.ts +6 -1
  71. package/src/components/Page/SkPage.vue +11 -0
  72. package/src/components/Panel/SkPanel.vue +2 -1
  73. package/src/components/ScrollArea/SkScrollArea.vue +78 -5
  74. package/src/components/TreeView/SkTreeView.vue +7 -2
  75. package/src/composables/useCustomColors.ts +86 -77
  76. package/src/composables/usePortalContext.test.ts +0 -2
  77. package/src/shims.d.ts +10 -0
  78. package/src/static/__tests__/parity.test.ts +717 -0
  79. package/src/static/__tests__/parityHarness.test.ts +98 -0
  80. package/src/static/__tests__/parityHarness.ts +260 -0
  81. package/src/static/classes.test.ts +82 -0
  82. package/src/static/classes.ts +111 -0
  83. package/src/static/components/__tests__/helpers.test.ts +837 -0
  84. package/src/static/components/alert.ts +117 -0
  85. package/src/static/components/avatar.ts +86 -0
  86. package/src/static/components/breadcrumbs.ts +28 -0
  87. package/src/static/components/button.ts +75 -0
  88. package/src/static/components/card.ts +27 -0
  89. package/src/static/components/checkbox.ts +48 -0
  90. package/src/static/components/colorPicker.ts +45 -0
  91. package/src/static/components/divider.ts +39 -0
  92. package/src/static/components/dropdown.ts +36 -0
  93. package/src/static/components/field.ts +86 -0
  94. package/src/static/components/group.ts +27 -0
  95. package/src/static/components/input.ts +55 -0
  96. package/src/static/components/navBar.ts +94 -0
  97. package/src/static/components/numberInput.ts +64 -0
  98. package/src/static/components/page.ts +31 -0
  99. package/src/static/components/pagination.ts +27 -0
  100. package/src/static/components/panel.ts +33 -0
  101. package/src/static/components/progress.ts +31 -0
  102. package/src/static/components/radio.ts +53 -0
  103. package/src/static/components/select.ts +51 -0
  104. package/src/static/components/sidebar.ts +85 -0
  105. package/src/static/components/skeleton.ts +66 -0
  106. package/src/static/components/slider.ts +50 -0
  107. package/src/static/components/spinner.ts +94 -0
  108. package/src/static/components/switchInput.ts +49 -0
  109. package/src/static/components/table.ts +88 -0
  110. package/src/static/components/tag.ts +76 -0
  111. package/src/static/components/tagsInput.ts +35 -0
  112. package/src/static/components/textarea.ts +53 -0
  113. package/src/static/components/toolbar.ts +74 -0
  114. package/src/static/components/tooltip.ts +29 -0
  115. package/src/static/escape.test.ts +53 -0
  116. package/src/static/escape.ts +28 -0
  117. package/src/static/generated/defaults.ts +378 -0
  118. package/src/static/generated/propTypes.ts +425 -0
  119. package/src/static/index.ts +116 -0
  120. package/src/static/render.test.ts +83 -0
  121. package/src/static/render.ts +76 -0
  122. package/src/static/specs.test.ts +58 -0
  123. package/src/static/specs.ts +230 -0
  124. package/src/static/types.ts +176 -0
  125. package/src/styles/__tests__/testHelpers.ts +97 -0
  126. package/src/styles/base/_custom-elements.scss +51 -0
  127. package/src/styles/base/_index.scss +4 -0
  128. package/src/styles/components/__tests__/componentSelectors.test.ts +2575 -0
  129. package/src/styles/components/_alert.scss +82 -39
  130. package/src/styles/components/_avatar.scss +102 -47
  131. package/src/styles/components/_breadcrumbs.scss +39 -37
  132. package/src/styles/components/_button.scss +58 -5
  133. package/src/styles/components/_card.scss +64 -2
  134. package/src/styles/components/_checkbox.scss +35 -5
  135. package/src/styles/components/_color-picker.scss +48 -13
  136. package/src/styles/components/_divider.scss +86 -52
  137. package/src/styles/components/_dropdown.scss +214 -0
  138. package/src/styles/components/_field.scss +76 -23
  139. package/src/styles/components/_group.scss +190 -79
  140. package/src/styles/components/_index.scss +1 -0
  141. package/src/styles/components/_input.scss +81 -5
  142. package/src/styles/components/_menu.scss +1 -1
  143. package/src/styles/components/_navbar.scss +76 -45
  144. package/src/styles/components/_number-input.scss +88 -83
  145. package/src/styles/components/_page.scss +82 -23
  146. package/src/styles/components/_pagination.scss +240 -212
  147. package/src/styles/components/_panel.scss +268 -122
  148. package/src/styles/components/_progress.scss +120 -70
  149. package/src/styles/components/_radio.scss +35 -5
  150. package/src/styles/components/_scroll-area.scss +50 -22
  151. package/src/styles/components/_select.scss +40 -9
  152. package/src/styles/components/_sidebar.scss +59 -34
  153. package/src/styles/components/_skeleton.scss +111 -65
  154. package/src/styles/components/_slider.scss +34 -10
  155. package/src/styles/components/_spinner.scss +107 -56
  156. package/src/styles/components/_switch.scss +36 -5
  157. package/src/styles/components/_table.scss +150 -166
  158. package/src/styles/components/_tag.scss +244 -154
  159. package/src/styles/components/_tags-input.scss +46 -12
  160. package/src/styles/components/_textarea.scss +36 -5
  161. package/src/styles/components/_toolbar.scss +85 -31
  162. package/src/styles/components/_tooltip.scss +172 -3
  163. package/src/styles/mixins/_cut-border.scss +18 -4
  164. package/src/styles/mixins/_dual-selector.scss +192 -0
  165. package/src/styles/mixins/_index.scss +1 -0
  166. package/src/styles/mixins/dualSelector.test.ts +151 -0
  167. package/src/styles/themes/_colorful.scss +25 -0
  168. package/src/styles/themes/_greyscale.scss +25 -0
  169. package/src/styles/themes/_shade-scale.scss +39 -0
  170. package/src/styles/tokens/_semantic-color-kinds.scss +66 -0
  171. package/src/{types.ts → types/index.ts} +19 -11
  172. package/web-types.json +970 -137
  173. package/dist/composables/useCustomColors.test.d.ts +0 -1
  174. package/dist/composables/useFocusTrap.test.d.ts +0 -1
  175. package/dist/composables/usePortalContext.test.d.ts +0 -1
  176. package/dist/styles/mixins/fluidSize.test.d.ts +0 -1
  177. 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)