@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.
Files changed (191) 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/NumberInput/SkNumberInput.vue.d.ts +8 -0
  7. package/dist/components/Page/SkPage.vue.d.ts +9 -0
  8. package/dist/components/ScrollArea/SkScrollArea.vue.d.ts +105 -4
  9. package/dist/composables/useCustomColors.d.ts +18 -56
  10. package/{src → dist}/global.d.ts +6 -2
  11. package/dist/sleekspace-ui.css +4257 -1253
  12. package/dist/sleekspace-ui.es.js +300 -170
  13. package/dist/sleekspace-ui.umd.js +299 -169
  14. package/dist/static/classes.d.ts +18 -0
  15. package/dist/static/components/alert.d.ts +12 -0
  16. package/dist/static/components/avatar.d.ts +9 -0
  17. package/dist/static/components/breadcrumbs.d.ts +6 -0
  18. package/dist/static/components/button.d.ts +13 -0
  19. package/dist/static/components/card.d.ts +5 -0
  20. package/dist/static/components/checkbox.d.ts +10 -0
  21. package/dist/static/components/colorPicker.d.ts +8 -0
  22. package/dist/static/components/divider.d.ts +8 -0
  23. package/dist/static/components/dropdown.d.ts +8 -0
  24. package/dist/static/components/field.d.ts +15 -0
  25. package/dist/static/components/group.d.ts +5 -0
  26. package/dist/static/components/input.d.ts +14 -0
  27. package/dist/static/components/navBar.d.ts +16 -0
  28. package/dist/static/components/numberInput.d.ts +15 -0
  29. package/dist/static/components/page.d.ts +9 -0
  30. package/dist/static/components/pagination.d.ts +5 -0
  31. package/dist/static/components/panel.d.ts +11 -0
  32. package/dist/static/components/progress.d.ts +9 -0
  33. package/dist/static/components/radio.d.ts +11 -0
  34. package/dist/static/components/select.d.ts +10 -0
  35. package/dist/static/components/sidebar.d.ts +9 -0
  36. package/dist/static/components/skeleton.d.ts +11 -0
  37. package/dist/static/components/slider.d.ts +12 -0
  38. package/dist/static/components/spinner.d.ts +12 -0
  39. package/dist/static/components/switchInput.d.ts +10 -0
  40. package/dist/static/components/table.d.ts +12 -0
  41. package/dist/static/components/tag.d.ts +8 -0
  42. package/dist/static/components/tagsInput.d.ts +7 -0
  43. package/dist/static/components/textarea.d.ts +12 -0
  44. package/dist/static/components/toolbar.d.ts +12 -0
  45. package/dist/static/components/tooltip.d.ts +7 -0
  46. package/dist/static/escape.d.ts +2 -0
  47. package/dist/static/index.cjs.js +1 -0
  48. package/dist/static/index.d.ts +68 -0
  49. package/dist/static/index.es.js +732 -0
  50. package/dist/static/render.d.ts +12 -0
  51. package/dist/static/specs.d.ts +2 -0
  52. package/dist/static/types.d.ts +43 -0
  53. package/dist/tokens.css +322 -0
  54. package/dist/types/index.d.ts +36 -0
  55. package/dist/utils/slots.d.ts +6 -0
  56. package/docs/guides/installation.md +8 -2
  57. package/docs/guides/pure-css/_meta.yaml +8 -0
  58. package/docs/guides/pure-css/class-api.md +1070 -0
  59. package/docs/guides/pure-css/custom-elements.md +574 -0
  60. package/docs/guides/pure-css/index.md +86 -0
  61. package/docs/guides/pure-css/limitations.md +152 -0
  62. package/docs/guides/pure-css/static-helpers.md +1203 -0
  63. package/llms-full.txt +3739 -261
  64. package/package.json +19 -5
  65. package/src/components/Alert/SkAlert.vue +4 -2
  66. package/src/components/Breadcrumbs/SkBreadcrumbs.vue +6 -12
  67. package/src/components/Button/SkButton.vue +8 -5
  68. package/src/components/Card/SkCard.vue +13 -5
  69. package/src/components/Checkbox/SkCheckbox.vue +9 -2
  70. package/src/components/ContextMenu/SkContextMenuRadioGroup.vue +4 -1
  71. package/src/components/Dropdown/SkDropdown.vue +20 -3
  72. package/src/components/Dropdown/SkDropdownRadioGroup.vue +4 -1
  73. package/src/components/Dropdown/types.ts +2 -1
  74. package/src/components/Modal/SkModal.vue +11 -4
  75. package/src/components/NavBar/SkNavBar.vue +19 -8
  76. package/src/components/NavBar/context.ts +4 -2
  77. package/src/components/NavBar/types.ts +6 -1
  78. package/src/components/NumberInput/SkNumberInput.vue +10 -1
  79. package/src/components/Page/SkPage.vue +29 -15
  80. package/src/components/Panel/SkPanel.vue +2 -1
  81. package/src/components/Popover/SkPopover.vue +11 -4
  82. package/src/components/Radio/SkRadio.vue +9 -2
  83. package/src/components/ScrollArea/SkScrollArea.vue +78 -5
  84. package/src/components/Switch/SkSwitch.vue +14 -13
  85. package/src/components/Tabs/SkTab.vue +7 -2
  86. package/src/components/TreeView/SkTreeItem.vue +10 -2
  87. package/src/components/TreeView/SkTreeView.vue +7 -2
  88. package/src/composables/useCustomColors.ts +86 -77
  89. package/src/composables/usePortalContext.test.ts +0 -2
  90. package/src/shims.d.ts +10 -0
  91. package/src/static/__tests__/parity.test.ts +717 -0
  92. package/src/static/__tests__/parityHarness.test.ts +98 -0
  93. package/src/static/__tests__/parityHarness.ts +260 -0
  94. package/src/static/classes.test.ts +82 -0
  95. package/src/static/classes.ts +111 -0
  96. package/src/static/components/__tests__/helpers.test.ts +837 -0
  97. package/src/static/components/alert.ts +117 -0
  98. package/src/static/components/avatar.ts +86 -0
  99. package/src/static/components/breadcrumbs.ts +28 -0
  100. package/src/static/components/button.ts +75 -0
  101. package/src/static/components/card.ts +27 -0
  102. package/src/static/components/checkbox.ts +48 -0
  103. package/src/static/components/colorPicker.ts +45 -0
  104. package/src/static/components/divider.ts +39 -0
  105. package/src/static/components/dropdown.ts +36 -0
  106. package/src/static/components/field.ts +86 -0
  107. package/src/static/components/group.ts +27 -0
  108. package/src/static/components/input.ts +55 -0
  109. package/src/static/components/navBar.ts +94 -0
  110. package/src/static/components/numberInput.ts +64 -0
  111. package/src/static/components/page.ts +31 -0
  112. package/src/static/components/pagination.ts +27 -0
  113. package/src/static/components/panel.ts +33 -0
  114. package/src/static/components/progress.ts +31 -0
  115. package/src/static/components/radio.ts +53 -0
  116. package/src/static/components/select.ts +51 -0
  117. package/src/static/components/sidebar.ts +85 -0
  118. package/src/static/components/skeleton.ts +66 -0
  119. package/src/static/components/slider.ts +50 -0
  120. package/src/static/components/spinner.ts +94 -0
  121. package/src/static/components/switchInput.ts +49 -0
  122. package/src/static/components/table.ts +88 -0
  123. package/src/static/components/tag.ts +76 -0
  124. package/src/static/components/tagsInput.ts +35 -0
  125. package/src/static/components/textarea.ts +53 -0
  126. package/src/static/components/toolbar.ts +74 -0
  127. package/src/static/components/tooltip.ts +29 -0
  128. package/src/static/escape.test.ts +53 -0
  129. package/src/static/escape.ts +28 -0
  130. package/src/static/generated/defaults.ts +379 -0
  131. package/src/static/generated/propTypes.ts +426 -0
  132. package/src/static/index.ts +116 -0
  133. package/src/static/render.test.ts +83 -0
  134. package/src/static/render.ts +76 -0
  135. package/src/static/specs.test.ts +58 -0
  136. package/src/static/specs.ts +230 -0
  137. package/src/static/types.ts +176 -0
  138. package/src/styles/__tests__/testHelpers.ts +97 -0
  139. package/src/styles/base/_custom-elements.scss +51 -0
  140. package/src/styles/base/_index.scss +4 -0
  141. package/src/styles/components/__tests__/componentSelectors.test.ts +2575 -0
  142. package/src/styles/components/_alert.scss +82 -39
  143. package/src/styles/components/_avatar.scss +102 -47
  144. package/src/styles/components/_breadcrumbs.scss +39 -37
  145. package/src/styles/components/_button.scss +58 -5
  146. package/src/styles/components/_card.scss +64 -2
  147. package/src/styles/components/_checkbox.scss +35 -5
  148. package/src/styles/components/_color-picker.scss +48 -13
  149. package/src/styles/components/_divider.scss +86 -52
  150. package/src/styles/components/_dropdown.scss +214 -0
  151. package/src/styles/components/_field.scss +76 -23
  152. package/src/styles/components/_group.scss +190 -79
  153. package/src/styles/components/_index.scss +1 -0
  154. package/src/styles/components/_input.scss +81 -5
  155. package/src/styles/components/_menu.scss +1 -1
  156. package/src/styles/components/_navbar.scss +76 -45
  157. package/src/styles/components/_number-input.scss +98 -85
  158. package/src/styles/components/_page.scss +82 -23
  159. package/src/styles/components/_pagination.scss +240 -212
  160. package/src/styles/components/_panel.scss +268 -122
  161. package/src/styles/components/_progress.scss +120 -70
  162. package/src/styles/components/_radio.scss +35 -5
  163. package/src/styles/components/_scroll-area.scss +50 -22
  164. package/src/styles/components/_select.scss +40 -9
  165. package/src/styles/components/_sidebar.scss +59 -34
  166. package/src/styles/components/_skeleton.scss +111 -65
  167. package/src/styles/components/_slider.scss +34 -10
  168. package/src/styles/components/_spinner.scss +107 -56
  169. package/src/styles/components/_switch.scss +36 -5
  170. package/src/styles/components/_table.scss +150 -166
  171. package/src/styles/components/_tag.scss +244 -154
  172. package/src/styles/components/_tags-input.scss +46 -12
  173. package/src/styles/components/_textarea.scss +36 -5
  174. package/src/styles/components/_toolbar.scss +85 -31
  175. package/src/styles/components/_tooltip.scss +172 -3
  176. package/src/styles/mixins/_cut-border.scss +18 -4
  177. package/src/styles/mixins/_dual-selector.scss +192 -0
  178. package/src/styles/mixins/_index.scss +1 -0
  179. package/src/styles/mixins/dualSelector.test.ts +151 -0
  180. package/src/styles/themes/_colorful.scss +25 -0
  181. package/src/styles/themes/_greyscale.scss +25 -0
  182. package/src/styles/themes/_shade-scale.scss +39 -0
  183. package/src/styles/tokens/_semantic-color-kinds.scss +66 -0
  184. package/src/{types.ts → types/index.ts} +19 -11
  185. package/src/utils/slots.ts +75 -0
  186. package/web-types.json +980 -137
  187. package/dist/composables/useCustomColors.test.d.ts +0 -1
  188. package/dist/composables/useFocusTrap.test.d.ts +0 -1
  189. package/dist/composables/usePortalContext.test.d.ts +0 -1
  190. package/dist/styles/mixins/fluidSize.test.d.ts +0 -1
  191. package/dist/types.d.ts +0 -29
@@ -0,0 +1,1070 @@
1
+ ---
2
+ title: Class API Reference
3
+ description: Complete reference for Sleekspace's sk-* CSS class modifiers — kinds, sizes, variants, and structural wrappers for every component.
4
+ ---
5
+
6
+ # Class API Reference
7
+
8
+ The class API is Sleekspace's lowest-level styling surface. Grab the compiled CSS,
9
+ add the right `sk-*` classes to your HTML, and you're done. No Vue, no JS, no build tool required.
10
+
11
+ ## Concepts
12
+
13
+ Every component has one **base class** (`sk-panel`, `sk-button`, etc.) plus **modifier classes**
14
+ that toggle kinds, sizes, states, and other boolean options. Modifiers stack on the same element.
15
+
16
+ ```html
17
+ <!-- base only -->
18
+ <div class="sk-panel">…</div>
19
+
20
+ <!-- base + kind + size -->
21
+ <div class="sk-panel sk-primary sk-lg">…</div>
22
+ ```
23
+
24
+ **You do not need to specify modifiers to get defaults.** If you omit `kind`, components render
25
+ in their default kind (usually `sk-neutral`). If you omit `size`, they render at `sk-md`.
26
+ Explicit classes override defaults; omitting them triggers the built-in default via
27
+ zero-specificity `:where()` selectors.
28
+
29
+ **Kind classes** are shared across most components: `sk-neutral`, `sk-primary`, `sk-accent`,
30
+ `sk-info`, `sk-success`, `sk-warning`, `sk-danger`, plus the extended palette
31
+ `sk-boulder`, `sk-neon-blue`, `sk-neon-green`, `sk-neon-red`, `sk-neon-yellow`.
32
+
33
+ **Size classes** are also shared: `sk-xs`, `sk-sm`, `sk-md` (default), `sk-lg`, `sk-xl`.
34
+
35
+ **Custom colors** can override the kind via inline CSS variables — see the per-component
36
+ note for the relevant variable name.
37
+
38
+ For container components you can also use the
39
+ [custom-element form](./custom-elements.md) as an alternative to class-based markup.
40
+
41
+ ---
42
+
43
+ ## Component Reference
44
+
45
+ ### Panel
46
+
47
+ **Base class:** `sk-panel`
48
+
49
+ **Modifiers:**
50
+
51
+ | Class | Effect | Default |
52
+ |-------|--------|---------|
53
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
54
+ | `sk-xs` … `sk-xl` | Corner decoration size | `sk-md` |
55
+ | `sk-cut-top-left`, `sk-cut-top-right`, `sk-cut-bottom-right`, `sk-cut-bottom-left` | Which corners are beveled | `sk-cut-bottom-right` |
56
+ | `sk-decoration-top-left` / … | Which corner shows the accent stripe | `sk-decoration-bottom-right` |
57
+ | `sk-no-border` | Remove border | off |
58
+ | `sk-no-decoration` | Hide accent stripe | off |
59
+
60
+ **Custom color var:** `--sk-panel-color-base`
61
+
62
+ **Rendered HTML:**
63
+
64
+ ```html
65
+ <div class="sk-panel sk-primary sk-lg sk-cut-top-left sk-cut-bottom-right sk-decoration-top-left">
66
+ <p>Primary panel with diagonal cuts.</p>
67
+ </div>
68
+ ```
69
+
70
+ [See Vue docs →](/components/panel)
71
+
72
+ ---
73
+
74
+ ### Card
75
+
76
+ **Base class:** `sk-card`
77
+
78
+ **Modifiers:**
79
+
80
+ | Class | Effect | Default |
81
+ |-------|--------|---------|
82
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
83
+
84
+ The card shell is the outer container. Inner structure (header, media, footer) is composed
85
+ with child elements — the static helper leaves slotting to you.
86
+
87
+ **Custom color var:** `--sk-panel-color-base`
88
+
89
+ **Rendered HTML:**
90
+
91
+ ```html
92
+ <div class="sk-card sk-accent">
93
+ <div class="sk-card-header"><h3>Card Title</h3></div>
94
+ <div class="sk-card-body"><p>Content here.</p></div>
95
+ </div>
96
+ ```
97
+
98
+ [See Vue docs →](/components/card)
99
+
100
+ ---
101
+
102
+ ### Alert
103
+
104
+ **Base class:** `sk-alert`
105
+
106
+ **Modifiers:**
107
+
108
+ | Class | Effect | Default |
109
+ |-------|--------|---------|
110
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-info` |
111
+ | `sk-subtle` | Lower-contrast background variant | off |
112
+
113
+ The element should carry `role="alert"` for accessibility.
114
+
115
+ The static helper emits a two-wrapper structure: an optional icon div followed by a content
116
+ wrapper. When building the class API form by hand, mirror this structure so CSS spacing rules
117
+ apply correctly:
118
+
119
+ **Rendered HTML (info kind, default — with icon):**
120
+
121
+ ```html
122
+ <div class="sk-alert sk-info" role="alert">
123
+ <div class="sk-alert-icon">
124
+ <!-- info SVG icon -->
125
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
126
+ <circle cx="12" cy="12" r="10"></circle>
127
+ <line x1="12" y1="16" x2="12" y2="12"></line>
128
+ <circle cx="12" cy="8" r="0.5" fill="currentColor"></circle>
129
+ </svg>
130
+ </div>
131
+ <div class="sk-alert-content">
132
+ <p>Something to note.</p>
133
+ </div>
134
+ </div>
135
+ ```
136
+
137
+ **Rendered HTML (neutral kind — no icon):**
138
+
139
+ ```html
140
+ <div class="sk-alert sk-neutral" role="alert">
141
+ <div class="sk-alert-content">
142
+ <p>Deployment paused — review the diff before continuing.</p>
143
+ </div>
144
+ </div>
145
+ ```
146
+
147
+ Icons are auto-selected for the four feedback kinds (info, success, warning, danger).
148
+ Non-feedback kinds (neutral, primary, accent) render without an icon container.
149
+
150
+ **Custom color var:** `--sk-alert-color-base`
151
+
152
+ [See Vue docs →](/components/alert)
153
+
154
+ ---
155
+
156
+ ### Divider
157
+
158
+ **Base class:** `sk-divider`
159
+
160
+ **Modifiers:**
161
+
162
+ | Class | Effect | Default |
163
+ |-------|--------|---------|
164
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
165
+ | `sk-horizontal` / `sk-vertical` | Layout axis | `sk-horizontal` |
166
+ | `sk-md` / `sk-xs` … `sk-xl` | Line thickness | `sk-md` |
167
+ | `sk-subtle` | Lower-contrast line | off |
168
+
169
+ Note: the divider emits an `<hr>` element (not a `<div>`), and uses `sk-horizontal` / `sk-vertical`
170
+ directly (not `sk-orientation-*`). The element carries `role="separator"` automatically.
171
+
172
+ **Rendered HTML:**
173
+
174
+ ```html
175
+ <hr class="sk-divider sk-horizontal sk-neutral sk-md" role="separator">
176
+ ```
177
+
178
+ [See Vue docs →](/components/divider)
179
+
180
+ ---
181
+
182
+ ### Page
183
+
184
+ **Base class:** `sk-page`
185
+
186
+ **Modifiers:**
187
+
188
+ | Class | Effect | Default |
189
+ |-------|--------|---------|
190
+ | `sk-fixed-header` | Stick header to viewport top | off |
191
+ | `sk-fixed-footer` | Stick footer to viewport bottom | off |
192
+ | `sk-flush` | Remove outer padding | off |
193
+
194
+ `sk-page` is a layout shell. Inner regions use `sk-page-header`, `sk-page-main`,
195
+ `sk-page-sidebar`, `sk-page-aside`, and `sk-page-footer` as child elements.
196
+
197
+ **Rendered HTML:**
198
+
199
+ ```html
200
+ <div class="sk-page sk-fixed-header">
201
+ <header class="sk-page-header">…</header>
202
+ <main class="sk-page-main">…</main>
203
+ </div>
204
+ ```
205
+
206
+ [See Vue docs →](/components/page)
207
+
208
+ ---
209
+
210
+ ### Group
211
+
212
+ **Base class:** `sk-group`
213
+
214
+ **Modifiers:**
215
+
216
+ | Class | Effect | Default |
217
+ |-------|--------|---------|
218
+ | `sk-horizontal` / `sk-vertical` | Flex direction | `sk-horizontal` |
219
+
220
+ Groups child elements with joined borders, removing intermediate gaps and rounding only
221
+ outer corners.
222
+
223
+ **Rendered HTML:**
224
+
225
+ ```html
226
+ <div class="sk-group sk-horizontal">
227
+ <button class="sk-button sk-neutral" type="button">
228
+ <span class="sk-button-chrome">A</span>
229
+ </button>
230
+ <button class="sk-button sk-neutral" type="button">
231
+ <span class="sk-button-chrome">B</span>
232
+ </button>
233
+ </div>
234
+ ```
235
+
236
+ [See Vue docs →](/components/group)
237
+
238
+ ---
239
+
240
+ ### Skeleton
241
+
242
+ **Base class:** `sk-skeleton`
243
+
244
+ **Modifiers:**
245
+
246
+ | Class | Effect | Default |
247
+ |-------|--------|---------|
248
+ | `sk-text` / `sk-circular` / `sk-rectangular` / `sk-square` | Shape variant | `sk-text` |
249
+ | `sk-shimmer` | Shimmer animation | `sk-shimmer` (default on) |
250
+ | `sk-pulse` | Pulse animation | off |
251
+
252
+ Note: the variant class names are `sk-text`, `sk-circular`, `sk-rectangular`, `sk-square`
253
+ (not `sk-shape-*`). The static helper defaults animation to `sk-shimmer`; omit both
254
+ `sk-shimmer` and `sk-pulse` for a static (no-animation) skeleton.
255
+
256
+ Width and height are set via inline style — they have no CSS class equivalent.
257
+
258
+ **Rendered HTML:**
259
+
260
+ ```html
261
+ <!-- text skeleton with shimmer (defaults) -->
262
+ <div class="sk-skeleton sk-text sk-shimmer"></div>
263
+
264
+ <!-- rect skeleton with explicit dimensions -->
265
+ <div class="sk-skeleton sk-rectangular sk-shimmer" style="width: 200px; height: 40px;"></div>
266
+
267
+ <!-- circular avatar placeholder -->
268
+ <div class="sk-skeleton sk-circular sk-pulse" style="width: 48px; height: 48px;"></div>
269
+ ```
270
+
271
+ [See Vue docs →](/components/skeleton)
272
+
273
+ ---
274
+
275
+ ### Progress
276
+
277
+ **Base class:** `sk-progress`
278
+
279
+ **Modifiers:**
280
+
281
+ | Class | Effect | Default |
282
+ |-------|--------|---------|
283
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
284
+ | `sk-xs` … `sk-xl` | Bar height | `sk-md` |
285
+ | `sk-indeterminate` | Animated indeterminate state | off |
286
+
287
+ Uses the `<progress>` element natively. Pass `value` and `max` attributes.
288
+
289
+ **Rendered HTML:**
290
+
291
+ ```html
292
+ <progress class="sk-progress sk-primary sk-sm" value="40" max="100"></progress>
293
+ ```
294
+
295
+ [See Vue docs →](/components/progress)
296
+
297
+ ---
298
+
299
+ ### Spinner
300
+
301
+ **Base class:** `sk-spinner`
302
+
303
+ **Modifiers:**
304
+
305
+ | Class | Effect | Default |
306
+ |-------|--------|---------|
307
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-primary` |
308
+ | `sk-xs` … `sk-xl` | Spinner diameter | `sk-md` |
309
+ | `sk-variant-circular` / `sk-variant-dots` / `sk-variant-crosshair` | Visual style | `sk-variant-circular` |
310
+
311
+ The spinner emits ARIA attributes (`role="status"`, `aria-live="polite"`, `aria-label="Loading"`)
312
+ and a variant-specific inner DOM. Mirror this structure when using the class API directly:
313
+
314
+ **Rendered HTML (circular — default):**
315
+
316
+ ```html
317
+ <div class="sk-spinner sk-primary sk-md sk-variant-circular"
318
+ role="status" aria-live="polite" aria-label="Loading">
319
+ <div class="sk-spinner-circular">
320
+ <div class="sk-arc sk-arc-large"></div>
321
+ <div class="sk-arc sk-arc-small"></div>
322
+ </div>
323
+ </div>
324
+ ```
325
+
326
+ **Rendered HTML (dots):**
327
+
328
+ ```html
329
+ <div class="sk-spinner sk-accent sk-lg sk-variant-dots"
330
+ role="status" aria-live="polite" aria-label="Loading">
331
+ <div class="sk-spinner-dots">
332
+ <div class="sk-dot"></div>
333
+ <div class="sk-dot"></div>
334
+ <div class="sk-dot"></div>
335
+ </div>
336
+ </div>
337
+ ```
338
+
339
+ **Rendered HTML (crosshair):**
340
+
341
+ ```html
342
+ <div class="sk-spinner sk-neutral sk-md sk-variant-crosshair"
343
+ role="status" aria-live="polite" aria-label="Loading">
344
+ <div class="sk-crosshair-loader"></div>
345
+ </div>
346
+ ```
347
+
348
+ [See Vue docs →](/components/spinner)
349
+
350
+ ---
351
+
352
+ ### NavBar
353
+
354
+ **Base class:** `sk-navbar`
355
+
356
+ **Modifiers:**
357
+
358
+ | Class | Effect | Default |
359
+ |-------|--------|---------|
360
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
361
+ | `sk-sticky` | Position sticky at viewport top | on (default) |
362
+
363
+ The navbar emits a content wrapper with optional slot regions inside. Each slot region is
364
+ only emitted when it has content:
365
+
366
+ **Rendered HTML (with leading, brand, nav, and actions):**
367
+
368
+ ```html
369
+ <nav class="sk-navbar sk-neutral sk-sticky">
370
+ <div class="sk-navbar-content">
371
+ <div class="sk-navbar-leading"><!-- sidebar toggle --></div>
372
+ <div class="sk-navbar-brand">MySite</div>
373
+ <div class="sk-navbar-nav">
374
+ <a href="/docs">Docs</a>
375
+ </div>
376
+ <div class="sk-navbar-actions"><!-- user menu --></div>
377
+ </div>
378
+ </nav>
379
+ ```
380
+
381
+ **Rendered HTML (brand + nav only):**
382
+
383
+ ```html
384
+ <nav class="sk-navbar sk-neutral sk-sticky">
385
+ <div class="sk-navbar-content">
386
+ <div class="sk-navbar-brand">MySite</div>
387
+ <div class="sk-navbar-nav">…</div>
388
+ </div>
389
+ </nav>
390
+ ```
391
+
392
+ **Custom color vars:** `--sk-navbar-color-base`, `--sk-navbar-fg`
393
+
394
+ [See Vue docs →](/components/navbar)
395
+
396
+ ---
397
+
398
+ ### Toolbar
399
+
400
+ **Base class:** `sk-toolbar`
401
+
402
+ **Modifiers:**
403
+
404
+ | Class | Effect | Default |
405
+ |-------|--------|---------|
406
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
407
+ | `sk-horizontal` / `sk-vertical` | Layout axis | `sk-horizontal` |
408
+ | `sk-cut-top-left`, `sk-cut-top-right`, `sk-cut-bottom-right`, `sk-cut-bottom-left` | Beveled corners | all four (default) |
409
+
410
+ The element should carry `role="toolbar"`. Orientation uses `sk-horizontal` / `sk-vertical`
411
+ directly (not `sk-orientation-*`). By default all four corners are cut.
412
+
413
+ **Rendered HTML:**
414
+
415
+ ```html
416
+ <div class="sk-toolbar sk-neutral sk-horizontal sk-cut-top-left sk-cut-top-right sk-cut-bottom-right sk-cut-bottom-left"
417
+ role="toolbar">
418
+ <button class="sk-button sk-neutral" type="button">
419
+ <span class="sk-button-chrome">Cut</span>
420
+ </button>
421
+ <button class="sk-button sk-neutral" type="button">
422
+ <span class="sk-button-chrome">Copy</span>
423
+ </button>
424
+ </div>
425
+ ```
426
+
427
+ **Custom color vars:** `--sk-toolbar-color-base`, `--sk-toolbar-fg`
428
+
429
+ [See Vue docs →](/components/toolbar)
430
+
431
+ ---
432
+
433
+ ### Sidebar
434
+
435
+ **Base class:** `sk-sidebar`
436
+
437
+ **Modifiers (on `<aside>`):**
438
+
439
+ | Class | Effect | Default |
440
+ |-------|--------|---------|
441
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
442
+ | `sk-sidebar-right` | Mount on the right side | off (left) |
443
+ | `sk-dense` | Compact item padding | off |
444
+
445
+ The sidebar emits a rich inner structure. Drawer open/close behavior is Vue-only; the class
446
+ API form is always visible. Inner panel corner is `sk-cut-bottom-right` (left side) or
447
+ `sk-cut-bottom-left` (right side).
448
+
449
+ **Rendered HTML (left sidebar, neutral):**
450
+
451
+ ```html
452
+ <aside class="sk-sidebar sk-neutral">
453
+ <div class="sk-panel sk-neutral sk-md sk-cut-bottom-right sk-decoration-bottom-right sk-sidebar-panel">
454
+ <div class="sk-panel-scroll-content">
455
+ <nav class="sk-sidebar-nav">
456
+ <!-- navigation links -->
457
+ </nav>
458
+ </div>
459
+ </div>
460
+ </aside>
461
+ ```
462
+
463
+ [See Vue docs →](/components/sidebar)
464
+
465
+ ---
466
+
467
+ ### Breadcrumbs
468
+
469
+ **Base class:** `sk-breadcrumbs`
470
+
471
+ **Modifiers:**
472
+
473
+ | Class | Effect | Default |
474
+ |-------|--------|---------|
475
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
476
+
477
+ Uses a `<nav>` element. Add `aria-label="Breadcrumbs"` for accessibility.
478
+
479
+ **Rendered HTML:**
480
+
481
+ ```html
482
+ <nav class="sk-breadcrumbs sk-neutral" aria-label="Breadcrumbs">
483
+ <ol>
484
+ <li><a href="/">Home</a></li>
485
+ <li><a href="/docs">Docs</a></li>
486
+ <li aria-current="page">Installation</li>
487
+ </ol>
488
+ </nav>
489
+ ```
490
+
491
+ [See Vue docs →](/components/breadcrumbs)
492
+
493
+ ---
494
+
495
+ ### Pagination
496
+
497
+ **Base class:** `sk-pagination`
498
+
499
+ **Modifiers:**
500
+
501
+ | Class | Effect | Default |
502
+ |-------|--------|---------|
503
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
504
+
505
+ Uses a `<nav>` element. Add `aria-label="Pagination"`.
506
+
507
+ **Rendered HTML:**
508
+
509
+ ```html
510
+ <nav class="sk-pagination sk-neutral" aria-label="Pagination">
511
+ <button class="sk-button sk-neutral" type="button" aria-label="Previous">
512
+ <span class="sk-button-chrome">‹</span>
513
+ </button>
514
+ <button class="sk-button sk-primary" type="button" aria-current="page">
515
+ <span class="sk-button-chrome">1</span>
516
+ </button>
517
+ <button class="sk-button sk-neutral" type="button">
518
+ <span class="sk-button-chrome">2</span>
519
+ </button>
520
+ <button class="sk-button sk-neutral" type="button" aria-label="Next">
521
+ <span class="sk-button-chrome">›</span>
522
+ </button>
523
+ </nav>
524
+ ```
525
+
526
+ [See Vue docs →](/components/pagination)
527
+
528
+ ---
529
+
530
+ ### Tag
531
+
532
+ **Base class:** `sk-tag`
533
+
534
+ **Modifiers:**
535
+
536
+ | Class | Effect | Default |
537
+ |-------|--------|---------|
538
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
539
+ | `sk-xs` … `sk-xl` | Tag size | `sk-md` |
540
+ | `sk-solid` / `sk-outline` / `sk-ghost` | Visual variant | `sk-solid` |
541
+ | `sk-removable` | Show remove affordance | off |
542
+
543
+ Uses a `<span>` element. Content must be wrapped in `<span class="sk-tag-content">`. When
544
+ `sk-removable` is present, include the remove button after the content span.
545
+
546
+ **Rendered HTML (simple):**
547
+
548
+ ```html
549
+ <span class="sk-tag sk-accent sk-solid sk-sm">
550
+ <span class="sk-tag-content">Beta</span>
551
+ </span>
552
+ ```
553
+
554
+ **Rendered HTML (removable):**
555
+
556
+ ```html
557
+ <span class="sk-tag sk-neutral sk-solid sk-md sk-removable">
558
+ <span class="sk-tag-content">design-system</span>
559
+ <button type="button" class="sk-tag-remove" aria-label="Remove">
560
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
561
+ viewBox="0 0 24 24" fill="none" stroke="currentColor"
562
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
563
+ <line x1="18" y1="6" x2="6" y2="18"></line>
564
+ <line x1="6" y1="6" x2="18" y2="18"></line>
565
+ </svg>
566
+ </button>
567
+ </span>
568
+ ```
569
+
570
+ **Custom color vars:** `--sk-tag-color-base`, `--sk-tag-fg`
571
+
572
+ [See Vue docs →](/components/tag)
573
+
574
+ ---
575
+
576
+ ### Avatar
577
+
578
+ **Base class:** `sk-avatar`
579
+
580
+ **Modifiers:**
581
+
582
+ | Class | Effect | Default |
583
+ |-------|--------|---------|
584
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
585
+ | `sk-xs` … `sk-xl` | Avatar size | `sk-md` |
586
+
587
+ Note: there is no `shape` modifier — the Vue component does not expose a shape prop; avatars
588
+ are always circular.
589
+
590
+ The inner content follows a priority chain: image (`src`) → initials text → default person icon SVG.
591
+
592
+ **Rendered HTML (with image):**
593
+
594
+ ```html
595
+ <div class="sk-avatar sk-neutral sk-md">
596
+ <img src="/avatar.jpg" alt="User name" class="sk-avatar-image">
597
+ </div>
598
+ ```
599
+
600
+ **Rendered HTML (with initials):**
601
+
602
+ ```html
603
+ <div class="sk-avatar sk-primary sk-lg">
604
+ <span class="sk-avatar-initials">AB</span>
605
+ </div>
606
+ ```
607
+
608
+ **Rendered HTML (fallback icon, no src or initials):**
609
+
610
+ ```html
611
+ <div class="sk-avatar sk-neutral sk-md">
612
+ <svg class="sk-avatar-icon" viewBox="0 0 24 24" fill="currentColor">
613
+ <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"></path>
614
+ </svg>
615
+ </div>
616
+ ```
617
+
618
+ **Custom color vars:** `--sk-avatar-color-base`, `--sk-avatar-fg`
619
+
620
+ [See Vue docs →](/components/avatar)
621
+
622
+ ---
623
+
624
+ ### Field
625
+
626
+ **Base class:** `sk-field`
627
+
628
+ **Modifiers:**
629
+
630
+ | Class | Effect | Default |
631
+ |-------|--------|---------|
632
+ | `sk-label-top` / `sk-label-left` / `sk-label-right` | Label placement | `sk-label-top` |
633
+ | `sk-has-error` | Error state styling | off |
634
+
635
+ Wrap a label + input in a field for consistent layout and error messaging. The input wrapper
636
+ div is always emitted. Label, description, and error paragraphs are optional.
637
+
638
+ **Rendered HTML (with label):**
639
+
640
+ ```html
641
+ <div class="sk-field sk-label-top">
642
+ <label for="email" class="sk-field-label">Email</label>
643
+ <div class="sk-field-input-wrapper">
644
+ <input class="sk-input sk-neutral" id="email" type="email" />
645
+ </div>
646
+ </div>
647
+ ```
648
+
649
+ **Rendered HTML (with error):**
650
+
651
+ ```html
652
+ <div class="sk-field sk-label-top sk-has-error">
653
+ <label for="email" class="sk-field-label">Email</label>
654
+ <div class="sk-field-input-wrapper">
655
+ <input class="sk-input sk-neutral" id="email" type="email" />
656
+ </div>
657
+ <p id="email-error" class="sk-field-error">Please enter a valid email address.</p>
658
+ </div>
659
+ ```
660
+
661
+ **Rendered HTML (required field):**
662
+
663
+ ```html
664
+ <div class="sk-field sk-label-top">
665
+ <label for="name" class="sk-field-label">
666
+ Name<span class="sk-field-required">*</span>
667
+ </label>
668
+ <div class="sk-field-input-wrapper">
669
+ <input class="sk-input sk-neutral" id="name" type="text" required />
670
+ </div>
671
+ </div>
672
+ ```
673
+
674
+ [See Vue docs →](/components/field)
675
+
676
+ ---
677
+
678
+ ### Table
679
+
680
+ **Base class:** `sk-table`
681
+
682
+ **Modifiers:**
683
+
684
+ | Class | Effect | Default |
685
+ |-------|--------|---------|
686
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
687
+ | `sk-default` / other variants | Visual variant | `sk-default` |
688
+ | `sk-striped` | Alternating row backgrounds | off |
689
+ | `sk-hoverable` | Row hover highlight | on (default) |
690
+ | `sk-bordered` | Outer border | on (default) |
691
+ | `sk-no-inner-borders` | Suppress inner cell borders | on (default — inner borders off) |
692
+ | `sk-subtle` | Reduced contrast | off |
693
+
694
+ The table is wrapped in a `sk-table-wrapper` div. Both elements receive modifier classes.
695
+
696
+ **Rendered HTML (defaults):**
697
+
698
+ ```html
699
+ <div class="sk-table-wrapper sk-table-wrapper-neutral">
700
+ <table class="sk-table sk-neutral sk-default sk-hoverable sk-bordered sk-no-inner-borders">
701
+ <thead>
702
+ <tr><th>Name</th><th>Role</th></tr>
703
+ </thead>
704
+ <tbody>
705
+ <tr><td>Alice</td><td>Engineer</td></tr>
706
+ </tbody>
707
+ </table>
708
+ </div>
709
+ ```
710
+
711
+ **Rendered HTML (striped, dark background, subtle):**
712
+
713
+ ```html
714
+ <div class="sk-table-wrapper sk-table-wrapper-neutral sk-dark-background sk-subtle">
715
+ <table class="sk-table sk-neutral sk-default sk-striped sk-hoverable sk-bordered sk-no-inner-borders sk-subtle">
716
+ <thead><tr><th>Name</th></tr></thead>
717
+ <tbody><tr><td>Alice</td></tr></tbody>
718
+ </table>
719
+ </div>
720
+ ```
721
+
722
+ **Custom color vars:** `--sk-table-color-base`, `--sk-table-fg`
723
+
724
+ [See Vue docs →](/components/table)
725
+
726
+ ---
727
+
728
+ ### Tooltip
729
+
730
+ **Base class:** `sk-tooltip`
731
+
732
+ **Modifiers:**
733
+
734
+ | Class | Effect | Default |
735
+ |-------|--------|---------|
736
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
737
+ | `sk-solid` / `sk-outline` | Visual variant | `sk-solid` |
738
+ | `sk-placement-top` / `sk-placement-right` / `sk-placement-bottom` / `sk-placement-left` | Tooltip position | `sk-placement-top` |
739
+
740
+ The element should carry `role="tooltip"`. The Vue version includes a JS-managed trigger
741
+ and positioning engine — the class API is for static rendering of pre-positioned tooltips.
742
+
743
+ **Rendered HTML:**
744
+
745
+ ```html
746
+ <div class="sk-tooltip sk-neutral sk-solid sk-placement-top" role="tooltip">
747
+ Click to expand
748
+ </div>
749
+ ```
750
+
751
+ [See Vue docs →](/components/tooltip)
752
+
753
+ ---
754
+
755
+ ### Button
756
+
757
+ **Base class:** `sk-button`
758
+
759
+ **Modifiers:**
760
+
761
+ | Class | Effect | Default |
762
+ |-------|--------|---------|
763
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
764
+ | `sk-xs` … `sk-xl` | Button size | `sk-md` |
765
+ | `sk-solid` / `sk-outline` / `sk-ghost` | Visual variant | `sk-solid` |
766
+ | `sk-loading` | Spinner + aria-busy | off |
767
+ | `sk-pressed` | aria-pressed state | off |
768
+ | `sk-dense` | Compact padding | off |
769
+
770
+ Button children must be wrapped in `<span class="sk-button-chrome">`.
771
+
772
+ **Rendered HTML (button element):**
773
+
774
+ ```html
775
+ <button class="sk-button sk-primary sk-lg sk-solid" type="button">
776
+ <span class="sk-button-chrome">Launch</span>
777
+ </button>
778
+ ```
779
+
780
+ **Rendered HTML (anchor variant):**
781
+
782
+ ```html
783
+ <a class="sk-button sk-accent sk-outline" href="/docs">
784
+ <span class="sk-button-chrome">Read the docs</span>
785
+ </a>
786
+ ```
787
+
788
+ [See Vue docs →](/components/button)
789
+
790
+ ---
791
+
792
+ ### Input
793
+
794
+ **Base class:** `sk-input`
795
+
796
+ **Modifiers:**
797
+
798
+ | Class | Effect | Default |
799
+ |-------|--------|---------|
800
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
801
+ | `sk-xs` … `sk-xl` | Input size | `sk-md` |
802
+
803
+ Apply directly to the `<input>` element.
804
+
805
+ **Rendered HTML:**
806
+
807
+ ```html
808
+ <input class="sk-input sk-neutral" type="text" placeholder="Search…" />
809
+ ```
810
+
811
+ [See Vue docs →](/components/input)
812
+
813
+ ---
814
+
815
+ ### Textarea
816
+
817
+ **Base class:** `sk-textarea`
818
+
819
+ **Modifiers:**
820
+
821
+ | Class | Effect | Default |
822
+ |-------|--------|---------|
823
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
824
+ | `sk-xs` … `sk-xl` | Textarea size | `sk-md` |
825
+
826
+ **Rendered HTML:**
827
+
828
+ ```html
829
+ <textarea class="sk-textarea sk-neutral" rows="4" placeholder="Enter description…"></textarea>
830
+ ```
831
+
832
+ [See Vue docs →](/components/textarea)
833
+
834
+ ---
835
+
836
+ ### Select
837
+
838
+ **Base class:** `sk-select`
839
+
840
+ **Modifiers:**
841
+
842
+ | Class | Effect | Default |
843
+ |-------|--------|---------|
844
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
845
+ | `sk-xs` … `sk-xl` | Select size | `sk-md` |
846
+
847
+ Apply to the native `<select>` element. The popup uses native browser styling; appearance
848
+ can be overridden with `appearance: base-select` in Chromium.
849
+
850
+ **Rendered HTML:**
851
+
852
+ ```html
853
+ <select class="sk-select sk-neutral">
854
+ <option value="">Choose…</option>
855
+ <option value="a">Option A</option>
856
+ </select>
857
+ ```
858
+
859
+ [See Vue docs →](/components/select)
860
+
861
+ ---
862
+
863
+ ### Slider
864
+
865
+ **Base class:** `sk-slider`
866
+
867
+ **Modifiers:**
868
+
869
+ | Class | Effect | Default |
870
+ |-------|--------|---------|
871
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
872
+ | `sk-xs` … `sk-xl` | Slider size | `sk-md` |
873
+
874
+ Apply to `<input type="range">`. Single-thumb only — Vue's dual-thumb variant requires JS.
875
+
876
+ **Rendered HTML:**
877
+
878
+ ```html
879
+ <input class="sk-slider sk-primary" type="range" min="0" max="100" value="40" />
880
+ ```
881
+
882
+ [See Vue docs →](/components/slider)
883
+
884
+ ---
885
+
886
+ ### ColorPicker
887
+
888
+ **Base class:** `sk-color-picker`
889
+
890
+ **Modifiers:**
891
+
892
+ | Class | Effect | Default |
893
+ |-------|--------|---------|
894
+ | `sk-xs` … `sk-xl` | Swatch size | `sk-md` |
895
+
896
+ Apply to `<input type="color">`. The palette UI is Vue-only.
897
+
898
+ **Rendered HTML:**
899
+
900
+ ```html
901
+ <input class="sk-color-picker sk-md" type="color" value="#c4842d" />
902
+ ```
903
+
904
+ [See Vue docs →](/components/color-picker)
905
+
906
+ ---
907
+
908
+ ### Checkbox
909
+
910
+ **Base class:** `sk-checkbox` (on the `<label>` wrapper)
911
+
912
+ The checkbox is a compound element. Use this exact structure:
913
+
914
+ **Rendered HTML:**
915
+
916
+ ```html
917
+ <label class="sk-checkbox sk-neutral sk-md">
918
+ <input type="checkbox" name="agree" />
919
+ <span class="sk-checkbox-box"></span>
920
+ <span class="sk-checkbox-label">I agree to the terms</span>
921
+ </label>
922
+ ```
923
+
924
+ **Modifiers on `sk-checkbox`:**
925
+
926
+ | Class | Effect | Default |
927
+ |-------|--------|---------|
928
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
929
+ | `sk-xs` … `sk-xl` | Checkbox size | `sk-md` |
930
+
931
+ [See Vue docs →](/components/checkbox)
932
+
933
+ ---
934
+
935
+ ### Radio
936
+
937
+ **Base class:** `sk-radio` (on the `<label>` wrapper)
938
+
939
+ Compound structure:
940
+
941
+ **Rendered HTML:**
942
+
943
+ ```html
944
+ <label class="sk-radio sk-neutral sk-md">
945
+ <input type="radio" name="color" value="red" />
946
+ <span class="sk-radio-dot"></span>
947
+ <span class="sk-radio-label">Red</span>
948
+ </label>
949
+ ```
950
+
951
+ **Modifiers on `sk-radio`:**
952
+
953
+ | Class | Effect | Default |
954
+ |-------|--------|---------|
955
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
956
+ | `sk-xs` … `sk-xl` | Radio size | `sk-md` |
957
+
958
+ [See Vue docs →](/components/radio)
959
+
960
+ ---
961
+
962
+ ### Switch
963
+
964
+ **Base class:** `sk-switch` (on the `<label>` wrapper)
965
+
966
+ Compound structure:
967
+
968
+ **Rendered HTML:**
969
+
970
+ ```html
971
+ <label class="sk-switch sk-primary sk-md">
972
+ <input type="checkbox" name="notifications" />
973
+ <span class="sk-switch-track">
974
+ <span class="sk-switch-thumb"></span>
975
+ </span>
976
+ <span class="sk-switch-label">Enable notifications</span>
977
+ </label>
978
+ ```
979
+
980
+ **Modifiers on `sk-switch`:**
981
+
982
+ | Class | Effect | Default |
983
+ |-------|--------|---------|
984
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
985
+ | `sk-xs` … `sk-xl` | Switch size | `sk-md` |
986
+
987
+ [See Vue docs →](/components/switch)
988
+
989
+ ---
990
+
991
+ ### NumberInput
992
+
993
+ **Base class:** `sk-number-input-wrapper` (on the outer `<div>`)
994
+
995
+ Compound structure. Stepper buttons are intentionally omitted — they need JS.
996
+
997
+ **Rendered HTML:**
998
+
999
+ ```html
1000
+ <div class="sk-number-input-wrapper sk-neutral sk-md">
1001
+ <input class="sk-number-input-field" type="number" min="0" max="100" value="42" />
1002
+ </div>
1003
+ ```
1004
+
1005
+ **Modifiers on `sk-number-input-wrapper`:**
1006
+
1007
+ | Class | Effect | Default |
1008
+ |-------|--------|---------|
1009
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
1010
+ | `sk-xs` … `sk-xl` | Input size | `sk-md` |
1011
+
1012
+ [See Vue docs →](/components/number-input)
1013
+
1014
+ ---
1015
+
1016
+ ### TagsInput
1017
+
1018
+ **Base class:** `sk-tags-input`
1019
+
1020
+ A styled container for tag chip elements. The add/remove behavior requires Vue.
1021
+
1022
+ **Rendered HTML:**
1023
+
1024
+ ```html
1025
+ <div class="sk-tags-input sk-neutral sk-md">
1026
+ <span class="sk-tag sk-neutral sk-solid sk-sm">
1027
+ <span class="sk-tag-content">design-system</span>
1028
+ </span>
1029
+ <span class="sk-tag sk-neutral sk-solid sk-sm">
1030
+ <span class="sk-tag-content">css</span>
1031
+ </span>
1032
+ </div>
1033
+ ```
1034
+
1035
+ **Modifiers:**
1036
+
1037
+ | Class | Effect | Default |
1038
+ |-------|--------|---------|
1039
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
1040
+ | `sk-xs` … `sk-xl` | Container size | `sk-md` |
1041
+
1042
+ [See Vue docs →](/components/tags-input)
1043
+
1044
+ ---
1045
+
1046
+ ### Dropdown
1047
+
1048
+ **Base class:** `sk-dropdown`
1049
+
1050
+ Rendered as a `<details>` disclosure element — no JS required. This is a reduced form;
1051
+ the Vue version uses a managed menu with focus trap and keyboard navigation.
1052
+
1053
+ **Modifiers:**
1054
+
1055
+ | Class | Effect | Default |
1056
+ |-------|--------|---------|
1057
+ | `sk-neutral` / `sk-primary` / … | Kind color | `sk-neutral` |
1058
+ | `sk-xs` … `sk-xl` | Size | `sk-md` |
1059
+
1060
+ **Rendered HTML:**
1061
+
1062
+ ```html
1063
+ <details class="sk-dropdown sk-neutral sk-md">
1064
+ <summary>Options ▾</summary>
1065
+ <a class="sk-dropdown-item" href="/settings">Settings</a>
1066
+ <a class="sk-dropdown-item" href="/logout">Log out</a>
1067
+ </details>
1068
+ ```
1069
+
1070
+ [See Vue docs →](/components/dropdown)