@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
@@ -9,7 +9,8 @@
9
9
  // NavBar Design Tokens
10
10
  //----------------------------------------------------------------------------------------------------------------------
11
11
 
12
- .sk-navbar
12
+ .sk-navbar,
13
+ sk-navbar
13
14
  {
14
15
  //------------------------------------------------------------------------------------------------------------------
15
16
  // Dimension Tokens
@@ -76,38 +77,12 @@
76
77
  oklch(from var(--sk-navbar-color-base) l c h / var(--sk-navbar-glow-opacity));
77
78
  }
78
79
 
79
- //----------------------------------------------------------------------------------------------------------------------
80
- // Kind Mixin
81
- //----------------------------------------------------------------------------------------------------------------------
82
-
83
- @mixin navbar-kind($kind)
84
- {
85
- &.sk-#{ "" + $kind }
86
- {
87
- // Override base color tokens for this kind
88
- --sk-navbar-color-base: var(--sk-#{ $kind }-base);
89
- --sk-navbar-fg: var(--sk-#{ $kind }-text);
90
-
91
- // Set generic kind color for list markers and other cross-component features
92
- --sk-kind-color: var(--sk-#{ $kind }-base);
93
-
94
- // Set dynamic border color
95
- --sk-navbar-border-color: var(--sk-navbar-border-base);
96
-
97
- // Use calculated background and foreground
98
- background-color: var(--sk-navbar-bg);
99
- color: var(--sk-navbar-fg);
100
-
101
- // Apply inner glow
102
- box-shadow: var(--sk-navbar-glow);
103
- }
104
- }
105
-
106
80
  //----------------------------------------------------------------------------------------------------------------------
107
81
  // Base NavBar Styles
108
82
  //----------------------------------------------------------------------------------------------------------------------
109
83
 
110
- .sk-navbar
84
+ .sk-navbar,
85
+ sk-navbar
111
86
  {
112
87
  // Base structure
113
88
  display: block;
@@ -136,17 +111,6 @@
136
111
  $corners: (bottom-left bottom-right)
137
112
  );
138
113
 
139
- //------------------------------------------------------------------------------------------------------------------
140
- // Sticky positioning
141
- //------------------------------------------------------------------------------------------------------------------
142
-
143
- &.sk-sticky
144
- {
145
- position: sticky;
146
- top: 0;
147
- z-index: var(--sk-z-sticky);
148
- }
149
-
150
114
  //------------------------------------------------------------------------------------------------------------------
151
115
  // Content container
152
116
  //------------------------------------------------------------------------------------------------------------------
@@ -260,15 +224,82 @@
260
224
  flex-shrink: 0;
261
225
  margin-left: auto;
262
226
  }
227
+ }
263
228
 
264
- //------------------------------------------------------------------------------------------------------------------
265
- // Kind variants
266
- //------------------------------------------------------------------------------------------------------------------
229
+ //----------------------------------------------------------------------------------------------------------------------
230
+ // Kind Variants
231
+ //----------------------------------------------------------------------------------------------------------------------
267
232
 
268
- @each $kind in $kinds
233
+ @each $kind in $kinds
234
+ {
235
+ @include kind-variant('navbar', $kind)
269
236
  {
270
- @include navbar-kind($kind);
237
+ // Override base color tokens for this kind
238
+ --sk-navbar-color-base: var(--sk-#{ $kind }-base);
239
+ --sk-navbar-fg: var(--sk-#{ $kind }-text);
240
+
241
+ // Set generic kind color for list markers and other cross-component features
242
+ --sk-kind-color: var(--sk-#{ $kind }-base);
243
+
244
+ // Set dynamic border color
245
+ --sk-navbar-border-color: var(--sk-navbar-border-base);
246
+
247
+ // Use calculated background and foreground
248
+ background-color: var(--sk-navbar-bg);
249
+ color: var(--sk-navbar-fg);
250
+
251
+ // Apply inner glow
252
+ box-shadow: var(--sk-navbar-glow);
271
253
  }
272
254
  }
273
255
 
274
256
  //----------------------------------------------------------------------------------------------------------------------
257
+ // Sticky Modifier
258
+ //----------------------------------------------------------------------------------------------------------------------
259
+
260
+ @include bool-modifier('navbar', 'sticky')
261
+ {
262
+ position: sticky;
263
+ top: 0;
264
+ z-index: var(--sk-z-sticky);
265
+ }
266
+
267
+ //----------------------------------------------------------------------------------------------------------------------
268
+ // Defaults When Absent
269
+ //----------------------------------------------------------------------------------------------------------------------
270
+
271
+ // Default kind: neutral — explicit :not() chain for zero-specificity default.
272
+ $_navbar-kind-not: '';
273
+ @each $kind in $kinds
274
+ {
275
+ $_navbar-kind-not: $_navbar-kind-not + ':not(.sk-' + $kind + ')';
276
+ }
277
+
278
+ .sk-navbar:where(#{ $_navbar-kind-not })
279
+ {
280
+ --sk-navbar-color-base: var(--sk-neutral-base);
281
+ --sk-navbar-fg: var(--sk-neutral-text);
282
+ --sk-kind-color: var(--sk-neutral-base);
283
+ --sk-navbar-border-color: var(--sk-navbar-border-base);
284
+ background-color: var(--sk-navbar-bg);
285
+ color: var(--sk-navbar-fg);
286
+ box-shadow: var(--sk-navbar-glow);
287
+ }
288
+
289
+ //----------------------------------------------------------------------------------------------------------------------
290
+ // Custom-Element API Defaults (attribute-absence path)
291
+ //----------------------------------------------------------------------------------------------------------------------
292
+
293
+ // Default kind: neutral — fires when <sk-navbar> has no kind attribute.
294
+ @include defaults-when-no-attr('navbar', 'kind')
295
+ {
296
+ --sk-navbar-color-base: var(--sk-neutral-base);
297
+ --sk-navbar-fg: var(--sk-neutral-text);
298
+ --sk-kind-color: var(--sk-neutral-base);
299
+ --sk-navbar-border-color: var(--sk-navbar-border-base);
300
+ background-color: var(--sk-navbar-bg);
301
+ color: var(--sk-navbar-fg);
302
+ box-shadow: var(--sk-navbar-glow);
303
+ }
304
+
305
+ //----------------------------------------------------------------------------------------------------------------------
@@ -1,7 +1,14 @@
1
- @use '@/styles/mixins/cut-border' as *;
1
+ @use '../mixins/cut-border' as *;
2
+ @use '../theme/variables' as *;
2
3
 
3
4
  //----------------------------------------------------------------------------------------------------------------------
4
5
  // NumberInput Component Styles
6
+ //
7
+ // The wrapper carries a fixed intrinsic height per size variant so that flex/grid parents with
8
+ // `align-items: stretch` (or taller siblings) don't inflate the component and strand the input
9
+ // and stepper buttons in dead space. Internal layout stretches to fill that height: the input
10
+ // field and steppers use `height: 100%`, and the two stepper buttons share the space via
11
+ // `flex: 1`, which also eliminates the 1px mismatch caused by the increment's bottom border.
5
12
  //----------------------------------------------------------------------------------------------------------------------
6
13
 
7
14
  .sk-number-input-wrapper
@@ -10,12 +17,21 @@
10
17
  --sk-number-input-color-base: var(--sk-neutral-base);
11
18
  --sk-number-input-fg: var(--sk-neutral-text);
12
19
 
13
- // Corner cut size (scales with size variant)
20
+ // Size tokens (overridden per size variant below)
21
+ --sk-number-input-height: 2.5rem;
22
+ --sk-number-input-padding-x: var(--sk-space-md);
23
+ --sk-number-input-font-size: 1rem;
24
+ --sk-number-input-stepper-width: 2rem;
25
+ --sk-number-input-stepper-icon: 1rem;
14
26
  --sk-number-input-cut: 0.5rem;
15
27
 
16
28
  position: relative;
17
- display: inline-flex;
29
+ display: flex;
18
30
  width: 100%;
31
+ height: var(--sk-number-input-height);
32
+ flex: 0 0 auto;
33
+ align-self: center;
34
+ vertical-align: middle;
19
35
 
20
36
  // Kind variants
21
37
  &.sk-neutral
@@ -110,23 +126,59 @@
110
126
  }
111
127
 
112
128
  // Size variants
113
- &.sk-sm
129
+
130
+ // Default: md when no sk-size-* class is present (zero-specificity, explicit class wins)
131
+ &:where(:not([class*="sk-size-"]))
132
+ {
133
+ --sk-number-input-height: 2.5rem;
134
+ --sk-number-input-padding-x: var(--sk-space-md);
135
+ --sk-number-input-font-size: 1rem;
136
+ --sk-number-input-stepper-width: 2rem;
137
+ --sk-number-input-stepper-icon: 1rem;
138
+ --sk-number-input-cut: 0.5rem;
139
+ }
140
+
141
+ &.sk-sm,
142
+ &.sk-size-sm
114
143
  {
144
+ --sk-number-input-height: 2rem;
145
+ --sk-number-input-padding-x: var(--sk-space-sm);
146
+ --sk-number-input-font-size: 0.875rem;
147
+ --sk-number-input-stepper-width: 1.5rem;
148
+ --sk-number-input-stepper-icon: 0.75rem;
115
149
  --sk-number-input-cut: 0.4rem;
116
150
  }
117
151
 
118
- &.sk-md
152
+ &.sk-md,
153
+ &.sk-size-md
119
154
  {
155
+ --sk-number-input-height: 2.5rem;
156
+ --sk-number-input-padding-x: var(--sk-space-md);
157
+ --sk-number-input-font-size: 1rem;
158
+ --sk-number-input-stepper-width: 2rem;
159
+ --sk-number-input-stepper-icon: 1rem;
120
160
  --sk-number-input-cut: 0.5rem;
121
161
  }
122
162
 
123
- &.sk-lg
163
+ &.sk-lg,
164
+ &.sk-size-lg
124
165
  {
166
+ --sk-number-input-height: 3rem;
167
+ --sk-number-input-padding-x: var(--sk-space-md);
168
+ --sk-number-input-font-size: 1.125rem;
169
+ --sk-number-input-stepper-width: 2.25rem;
170
+ --sk-number-input-stepper-icon: 1.125rem;
125
171
  --sk-number-input-cut: 0.6rem;
126
172
  }
127
173
 
128
- &.sk-xl
174
+ &.sk-xl,
175
+ &.sk-size-xl
129
176
  {
177
+ --sk-number-input-height: 3.5rem;
178
+ --sk-number-input-padding-x: var(--sk-space-md);
179
+ --sk-number-input-font-size: 1.25rem;
180
+ --sk-number-input-stepper-width: 2.5rem;
181
+ --sk-number-input-stepper-icon: 1.25rem;
130
182
  --sk-number-input-cut: 0.7rem;
131
183
  }
132
184
  }
@@ -136,8 +188,9 @@
136
188
  .sk-number-input
137
189
  {
138
190
  display: flex;
139
- align-items: center;
191
+ align-items: stretch;
140
192
  width: 100%;
193
+ height: 100%;
141
194
  position: relative;
142
195
 
143
196
  @include cut-border(
@@ -189,6 +242,10 @@
189
242
  .sk-number-input-field
190
243
  {
191
244
  flex: 1;
245
+ min-width: 0;
246
+ height: 100%;
247
+ padding: 0 var(--sk-number-input-padding-x);
248
+ font-size: var(--sk-number-input-font-size);
192
249
  background: transparent;
193
250
  border: none;
194
251
  color: var(--sk-number-input-fg);
@@ -196,35 +253,6 @@
196
253
  outline: none;
197
254
  cursor: text;
198
255
 
199
- // Size variants (match input heights)
200
- .sk-number-input-wrapper.sk-sm &
201
- {
202
- height: 2rem;
203
- padding: 0 var(--sk-space-sm);
204
- font-size: 0.875rem;
205
- }
206
-
207
- .sk-number-input-wrapper.sk-md &
208
- {
209
- height: 2.5rem;
210
- padding: 0 var(--sk-space-md);
211
- font-size: 1rem;
212
- }
213
-
214
- .sk-number-input-wrapper.sk-lg &
215
- {
216
- height: 3rem;
217
- padding: 0 var(--sk-space-md);
218
- font-size: 1.125rem;
219
- }
220
-
221
- .sk-number-input-wrapper.sk-xl &
222
- {
223
- height: 3.5rem;
224
- padding: 0 var(--sk-space-md);
225
- font-size: 1.25rem;
226
- }
227
-
228
256
  &::placeholder
229
257
  {
230
258
  color: color-mix(in oklch, var(--sk-number-input-fg), transparent 50%);
@@ -242,6 +270,8 @@
242
270
  {
243
271
  display: flex;
244
272
  flex-direction: column;
273
+ flex: 0 0 var(--sk-number-input-stepper-width);
274
+ height: 100%;
245
275
  border-left: var(--sk-border-width-thin) solid var(--sk-number-input-color-base);
246
276
  }
247
277
 
@@ -250,6 +280,8 @@
250
280
  .sk-number-input-increment,
251
281
  .sk-number-input-decrement
252
282
  {
283
+ flex: 1 1 0;
284
+ min-height: 0;
253
285
  display: flex;
254
286
  align-items: center;
255
287
  justify-content: center;
@@ -261,53 +293,10 @@
261
293
  transition-duration: var(--sk-transition-duration-base);
262
294
  padding: 0 var(--sk-space-xs);
263
295
 
264
- // Size variants
265
- .sk-number-input-wrapper.sk-sm &
296
+ svg
266
297
  {
267
- width: 1.5rem;
268
- height: 1rem;
269
-
270
- svg
271
- {
272
- width: 0.75rem;
273
- height: 0.75rem;
274
- }
275
- }
276
-
277
- .sk-number-input-wrapper.sk-md &
278
- {
279
- width: 2rem;
280
- height: 1.25rem;
281
-
282
- svg
283
- {
284
- width: 1rem;
285
- height: 1rem;
286
- }
287
- }
288
-
289
- .sk-number-input-wrapper.sk-lg &
290
- {
291
- width: 2.25rem;
292
- height: 1.5rem;
293
-
294
- svg
295
- {
296
- width: 1.125rem;
297
- height: 1.125rem;
298
- }
299
- }
300
-
301
- .sk-number-input-wrapper.sk-xl &
302
- {
303
- width: 2.5rem;
304
- height: 1.75rem;
305
-
306
- svg
307
- {
308
- width: 1.25rem;
309
- height: 1.25rem;
310
- }
298
+ width: var(--sk-number-input-stepper-icon);
299
+ height: var(--sk-number-input-stepper-icon);
311
300
  }
312
301
 
313
302
  &:hover:not(:disabled)
@@ -341,13 +330,37 @@
341
330
  .sk-number-input-increment
342
331
  {
343
332
  position: relative;
344
- border-bottom: var(--sk-border-width-thin) solid var(--sk-number-input-color-base);
345
333
 
346
- // Match the parent's top-right corner cut
334
+ // Shape-only: match the wrapper's top-right bevel so the button's background (and hover fill)
335
+ // doesn't square off the cut corner. We use zero-width / transparent so the mixin's `border:`
336
+ // shorthand doesn't paint a visible stroke on top/right/left — the wrapper and steppers already
337
+ // draw those sides.
347
338
  @include cut-border(
348
339
  $cut: var(--sk-number-input-cut),
340
+ $border-width: 0,
341
+ $border-color: transparent,
349
342
  $corners: (top-right)
350
343
  );
344
+
345
+ // Divider between increment and decrement. Must come after the mixin so the `border:`
346
+ // shorthand inside doesn't clobber it.
347
+ border-bottom: var(--sk-border-width-thin) solid var(--sk-number-input-color-base);
348
+ }
349
+
350
+ //----------------------------------------------------------------------------------------------------------------------
351
+ // Defaults-when-absent: kind — neutral when no explicit kind class is present on the wrapper.
352
+ //----------------------------------------------------------------------------------------------------------------------
353
+
354
+ $_number-input-kind-not: '';
355
+ @each $kind in $kinds
356
+ {
357
+ $_number-input-kind-not: $_number-input-kind-not + ':not(.sk-' + $kind + ')';
358
+ }
359
+
360
+ .sk-number-input-wrapper:where(#{ $_number-input-kind-not })
361
+ {
362
+ --sk-number-input-color-base: var(--sk-neutral-base);
363
+ --sk-number-input-fg: var(--sk-neutral-text);
351
364
  }
352
365
 
353
366
  //----------------------------------------------------------------------------------------------------------------------
@@ -4,7 +4,12 @@
4
4
 
5
5
  @use '../mixins' as *;
6
6
 
7
- .sk-page
7
+ //----------------------------------------------------------------------------------------------------------------------
8
+ // Page Design Tokens
9
+ //----------------------------------------------------------------------------------------------------------------------
10
+
11
+ .sk-page,
12
+ sk-page
8
13
  {
9
14
  // CSS Variables
10
15
  --sk-page-header-height: auto;
@@ -22,12 +27,15 @@
22
27
  // `.sk-page-main` applies this as padding; the center content fills it without adding its own.
23
28
  // Use the `flush` prop (or override `--sk-page-gap: 0`) for a full-bleed layout.
24
29
  --sk-page-gap: 1rem;
30
+ }
25
31
 
26
- &.sk-flush
27
- {
28
- --sk-page-gap: 0;
29
- }
32
+ //----------------------------------------------------------------------------------------------------------------------
33
+ // Base Page Styles
34
+ //----------------------------------------------------------------------------------------------------------------------
30
35
 
36
+ .sk-page,
37
+ sk-page
38
+ {
31
39
  // position: relative so drawers (absolute) are bounded by the page, not the viewport. In
32
40
  // full-viewport usage this naturally covers the screen; in embedded usage (e.g. docs demos)
33
41
  // the drawer stays inside the page container.
@@ -53,15 +61,6 @@
53
61
  z-index: 10;
54
62
  }
55
63
 
56
- &.sk-fixed-header
57
- {
58
- .sk-page-header
59
- {
60
- position: sticky;
61
- top: 0;
62
- }
63
- }
64
-
65
64
  //------------------------------------------------------------------------------------------------------------------
66
65
  // Subheader (full-width row below header, above the main row)
67
66
  //------------------------------------------------------------------------------------------------------------------
@@ -176,15 +175,6 @@
176
175
  z-index: 10;
177
176
  }
178
177
 
179
- &.sk-fixed-footer
180
- {
181
- .sk-page-footer
182
- {
183
- position: sticky;
184
- bottom: 0;
185
- }
186
- }
187
-
188
178
  //------------------------------------------------------------------------------------------------------------------
189
179
  // Drawer (off-canvas). One ruleset serves both sides; positioning differs per class.
190
180
  //------------------------------------------------------------------------------------------------------------------
@@ -243,6 +233,62 @@
243
233
  }
244
234
  }
245
235
 
236
+ //----------------------------------------------------------------------------------------------------------------------
237
+ // Flush Modifier (zero gap / full-bleed layout)
238
+ //----------------------------------------------------------------------------------------------------------------------
239
+
240
+ @include bool-modifier('page', 'flush')
241
+ {
242
+ --sk-page-gap: 0;
243
+ }
244
+
245
+ //----------------------------------------------------------------------------------------------------------------------
246
+ // No-Bounce Modifier (disable rubber-band overscroll on SkPage's scroll containers)
247
+ //----------------------------------------------------------------------------------------------------------------------
248
+ // `overscroll-behavior` is per-scroll-container, not inherited, so we have to hit each
249
+ // scrollable region explicitly. Also applied to the root in case SkPage itself is the
250
+ // scroller (e.g. wrapped in a height-constrained ancestor with overflow on .sk-page).
251
+ // The document-level bounce from scrolling the page itself lives on html/body and is
252
+ // outside SkPage's reach.
253
+
254
+ @include bool-modifier('page', 'no-bounce')
255
+ {
256
+ overscroll-behavior: none;
257
+
258
+ .sk-page-content,
259
+ .sk-page-sidebar-body,
260
+ .sk-page-aside-body
261
+ {
262
+ overscroll-behavior: none;
263
+ }
264
+ }
265
+
266
+ //----------------------------------------------------------------------------------------------------------------------
267
+ // Fixed Header Modifier
268
+ //----------------------------------------------------------------------------------------------------------------------
269
+
270
+ @include bool-modifier('page', 'fixed-header')
271
+ {
272
+ .sk-page-header
273
+ {
274
+ position: sticky;
275
+ top: 0;
276
+ }
277
+ }
278
+
279
+ //----------------------------------------------------------------------------------------------------------------------
280
+ // Fixed Footer Modifier
281
+ //----------------------------------------------------------------------------------------------------------------------
282
+
283
+ @include bool-modifier('page', 'fixed-footer')
284
+ {
285
+ .sk-page-footer
286
+ {
287
+ position: sticky;
288
+ bottom: 0;
289
+ }
290
+ }
291
+
246
292
  //----------------------------------------------------------------------------------------------------------------------
247
293
  // Drawer Transitions (left and right slide-in variants)
248
294
  //
@@ -304,3 +350,16 @@
304
350
  }
305
351
 
306
352
  //----------------------------------------------------------------------------------------------------------------------
353
+ // Custom-Element API Defaults (attribute-absence path)
354
+ //----------------------------------------------------------------------------------------------------------------------
355
+ // Parallel defaults for <sk-page> (no class API). Zero-specificity via :where() so any
356
+ // explicit attribute value wins. Page has no kind/size families, only boolean modifiers — no
357
+ // defaults-when-absent needed for the class API (booleans are off by default).
358
+
359
+ // Default flush: off — fires when <sk-page> has no flush attribute.
360
+ @include defaults-when-no-attr('page', 'flush')
361
+ {
362
+ --sk-page-gap: 1rem;
363
+ }
364
+
365
+ //----------------------------------------------------------------------------------------------------------------------