@skewedaspect/sleekspace-ui 0.5.1 → 0.6.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 (35) hide show
  1. package/dist/components/Card/SkCard.vue.d.ts +13 -1
  2. package/dist/components/Panel/SkPanel.vue.d.ts +15 -1
  3. package/dist/components/Panel/types.d.ts +1 -0
  4. package/dist/components/Select/SkSelect.vue.d.ts +61 -0
  5. package/dist/components/Select/SkSelectItem.vue.d.ts +134 -0
  6. package/dist/components/Select/SkSelectSeparator.vue.d.ts +2 -0
  7. package/dist/components/Select/index.d.ts +4 -0
  8. package/dist/components/Select/types.d.ts +3 -0
  9. package/dist/components/Sidebar/SkSidebar.vue.d.ts +8 -1
  10. package/dist/components/Sidebar/types.d.ts +1 -0
  11. package/dist/components/Skeleton/SkSkeleton.vue.d.ts +1 -1
  12. package/dist/index.d.ts +7 -0
  13. package/dist/sleekspace-ui.css +444 -34
  14. package/dist/sleekspace-ui.es.js +2014 -283
  15. package/dist/sleekspace-ui.umd.js +2013 -282
  16. package/package.json +1 -1
  17. package/src/components/Card/SkCard.vue +17 -1
  18. package/src/components/Panel/SkPanel.vue +29 -4
  19. package/src/components/Panel/types.ts +3 -0
  20. package/src/components/Select/SkSelect.vue +210 -0
  21. package/src/components/Select/SkSelectItem.vue +112 -0
  22. package/src/components/Select/SkSelectSeparator.vue +40 -0
  23. package/src/components/Select/index.ts +10 -0
  24. package/src/components/Select/types.ts +10 -0
  25. package/src/components/Sidebar/SkSidebar.vue +39 -2
  26. package/src/components/Sidebar/types.ts +2 -0
  27. package/src/global.d.ts +2 -0
  28. package/src/index.ts +10 -0
  29. package/src/styles/components/_card.scss +45 -9
  30. package/src/styles/components/_index.scss +1 -0
  31. package/src/styles/components/_listbox.scss +1 -0
  32. package/src/styles/components/_panel.scss +119 -13
  33. package/src/styles/components/_select.scss +439 -0
  34. package/src/styles/components/_sidebar.scss +83 -4
  35. package/web-types.json +148 -1
@@ -3,7 +3,6 @@
3
3
  //----------------------------------------------------------------------------------------------------------------------
4
4
 
5
5
  @use '../theme/variables' as *;
6
- @use '../mixins' as *;
7
6
 
8
7
  //----------------------------------------------------------------------------------------------------------------------
9
8
  // Card Design Tokens
@@ -42,10 +41,34 @@
42
41
 
43
42
  .sk-card-header
44
43
  {
44
+ // Header cut is reduced by margin to align with panel bevel
45
+ --sk-card-header-cut-tl: calc(var(--sk-panel-cut-tl) - 2px);
46
+ --sk-card-header-cut-tr: calc(var(--sk-panel-cut-tr) - 2px);
47
+
45
48
  padding: var(--sk-card-header-padding-vertical) var(--sk-card-padding);
46
- //border-bottom: var(--sk-border-width-thin) solid oklch(from currentColor l c h / 0.3);
47
49
  background-color: oklch(from currentColor l c h / 0.2);
48
50
  margin: 2px;
51
+
52
+ // Beveled top corners (modern path)
53
+ @supports (corner-shape: bevel)
54
+ {
55
+ border-top-left-radius: max(0px, var(--sk-card-header-cut-tl));
56
+ border-top-right-radius: max(0px, var(--sk-card-header-cut-tr));
57
+ corner-shape: bevel;
58
+ }
59
+
60
+ // Beveled top corners (clip-path fallback)
61
+ @supports not (corner-shape: bevel)
62
+ {
63
+ clip-path: polygon(
64
+ max(0px, var(--sk-card-header-cut-tl)) 0,
65
+ calc(100% - max(0px, var(--sk-card-header-cut-tr))) 0,
66
+ 100% max(0px, var(--sk-card-header-cut-tr)),
67
+ 100% 100%,
68
+ 0 100%,
69
+ 0 max(0px, var(--sk-card-header-cut-tl))
70
+ );
71
+ }
49
72
  }
50
73
 
51
74
  .sk-card-title
@@ -100,13 +123,26 @@
100
123
  padding: var(--sk-card-footer-padding-vertical) var(--sk-card-padding);
101
124
  background-color: oklch(from currentColor l c h / 0.05);
102
125
 
103
- // Apply cut-border mixin for beveled corner (bottom-right only)
104
- @include cut-border(
105
- $cut: var(--sk-panel-cut-size),
106
- $border-width: 0,
107
- $border-color: tranparent,
108
- $corners: (bottom-right)
109
- );
126
+ // Beveled bottom corners (modern path)
127
+ @supports (corner-shape: bevel)
128
+ {
129
+ border-bottom-right-radius: var(--sk-panel-cut-br);
130
+ border-bottom-left-radius: var(--sk-panel-cut-bl);
131
+ corner-shape: bevel;
132
+ }
133
+
134
+ // Beveled bottom corners (clip-path fallback)
135
+ @supports not (corner-shape: bevel)
136
+ {
137
+ clip-path: polygon(
138
+ 0 0,
139
+ 100% 0,
140
+ 100% calc(100% - var(--sk-panel-cut-br)),
141
+ calc(100% - var(--sk-panel-cut-br)) 100%,
142
+ var(--sk-panel-cut-bl) 100%,
143
+ 0 calc(100% - var(--sk-panel-cut-bl))
144
+ );
145
+ }
110
146
 
111
147
  border-top: var(--sk-border-width-thin) solid oklch(from currentColor l c h / 0.1);
112
148
  }
@@ -29,6 +29,7 @@
29
29
  @include meta.load-css('popover');
30
30
  @include meta.load-css('progress');
31
31
  @include meta.load-css('radio');
32
+ @include meta.load-css('select');
32
33
  @include meta.load-css('sidebar');
33
34
  @include meta.load-css('skeleton');
34
35
  @include meta.load-css('slider');
@@ -12,6 +12,7 @@
12
12
 
13
13
  position: relative;
14
14
  display: inline-flex;
15
+ width: 100%;
15
16
 
16
17
  // Size variants
17
18
  &.sk-sm
@@ -3,7 +3,6 @@
3
3
  //----------------------------------------------------------------------------------------------------------------------
4
4
 
5
5
  @use '../theme/variables' as *;
6
- @use '../mixins' as *;
7
6
 
8
7
  //----------------------------------------------------------------------------------------------------------------------
9
8
  // Panel Design Tokens
@@ -27,6 +26,12 @@
27
26
  /// Default cut size for md panels (height / factor)
28
27
  --sk-panel-cut-size: calc(var(--sk-panel-min-height) / var(--sk-panel-radius-factor));
29
28
 
29
+ /// Per-corner cut sizes (toggled on by .sk-cut-* classes)
30
+ --sk-panel-cut-tl: 0px;
31
+ --sk-panel-cut-tr: 0px;
32
+ --sk-panel-cut-br: 0px;
33
+ --sk-panel-cut-bl: 0px;
34
+
30
35
  //------------------------------------------------------------------------------------------------------------------
31
36
  // Border Tokens
32
37
  //------------------------------------------------------------------------------------------------------------------
@@ -141,13 +146,86 @@
141
146
  color: var(--sk-kind-color, var(--sk-panel-color-base));
142
147
  }
143
148
 
144
- // Apply cut-border mixin for beveled corner (bottom-right only)
145
- @include cut-border(
146
- $cut: var(--sk-panel-cut-size),
147
- $border-width: var(--sk-panel-border-width),
148
- $border-color: var(--sk-panel-border-color),
149
- $corners: (bottom-right)
150
- );
149
+ //------------------------------------------------------------------------------------------------------------------
150
+ // Corner toggle classes
151
+ //------------------------------------------------------------------------------------------------------------------
152
+
153
+ &.sk-cut-top-left { --sk-panel-cut-tl: var(--sk-panel-cut-size); }
154
+ &.sk-cut-top-right { --sk-panel-cut-tr: var(--sk-panel-cut-size); }
155
+ &.sk-cut-bottom-right { --sk-panel-cut-br: var(--sk-panel-cut-size); }
156
+ &.sk-cut-bottom-left { --sk-panel-cut-bl: var(--sk-panel-cut-size); }
157
+
158
+ //------------------------------------------------------------------------------------------------------------------
159
+ // Beveled corners (modern path)
160
+ //------------------------------------------------------------------------------------------------------------------
161
+
162
+ @supports (corner-shape: bevel)
163
+ {
164
+ border: var(--sk-panel-border-width) solid var(--sk-panel-border-color);
165
+ border-top-left-radius: var(--sk-panel-cut-tl);
166
+ border-top-right-radius: var(--sk-panel-cut-tr);
167
+ border-bottom-right-radius: var(--sk-panel-cut-br);
168
+ border-bottom-left-radius: var(--sk-panel-cut-bl);
169
+ corner-shape: bevel;
170
+ }
171
+
172
+ //------------------------------------------------------------------------------------------------------------------
173
+ // Beveled corners (clip-path fallback)
174
+ //------------------------------------------------------------------------------------------------------------------
175
+
176
+ @supports not (corner-shape: bevel)
177
+ {
178
+ border: none;
179
+
180
+ // 8-point polygon; when a corner var is 0px its two points collapse into the corner
181
+ clip-path: polygon(
182
+ var(--sk-panel-cut-tl) 0,
183
+ calc(100% - var(--sk-panel-cut-tr)) 0,
184
+ 100% var(--sk-panel-cut-tr),
185
+ 100% calc(100% - var(--sk-panel-cut-br)),
186
+ calc(100% - var(--sk-panel-cut-br)) 100%,
187
+ var(--sk-panel-cut-bl) 100%,
188
+ 0 calc(100% - var(--sk-panel-cut-bl)),
189
+ 0 var(--sk-panel-cut-tl)
190
+ );
191
+
192
+ // ::before draws the border via double-polygon clip-path
193
+ &::before
194
+ {
195
+ content: '';
196
+ position: absolute;
197
+ top: 0;
198
+ left: 0;
199
+ right: 0;
200
+ bottom: 0;
201
+ background-color: var(--sk-panel-border-color);
202
+ z-index: -1;
203
+
204
+ clip-path: polygon(
205
+ // Outer ring (clockwise)
206
+ var(--sk-panel-cut-tl) 0,
207
+ calc(100% - var(--sk-panel-cut-tr)) 0,
208
+ 100% var(--sk-panel-cut-tr),
209
+ 100% calc(100% - var(--sk-panel-cut-br)),
210
+ calc(100% - var(--sk-panel-cut-br)) 100%,
211
+ var(--sk-panel-cut-bl) 100%,
212
+ 0 calc(100% - var(--sk-panel-cut-bl)),
213
+ 0 var(--sk-panel-cut-tl),
214
+ var(--sk-panel-cut-tl) 0,
215
+
216
+ // Inner ring (counter-clockwise)
217
+ calc(var(--sk-panel-cut-tl) + var(--sk-panel-border-width)) var(--sk-panel-border-width),
218
+ var(--sk-panel-border-width) calc(var(--sk-panel-cut-tl) + var(--sk-panel-border-width)),
219
+ var(--sk-panel-border-width) calc(100% - var(--sk-panel-cut-bl) - var(--sk-panel-border-width)),
220
+ calc(var(--sk-panel-cut-bl) + var(--sk-panel-border-width)) calc(100% - var(--sk-panel-border-width)),
221
+ calc(100% - var(--sk-panel-cut-br) - var(--sk-panel-border-width)) calc(100% - var(--sk-panel-border-width)),
222
+ calc(100% - var(--sk-panel-border-width)) calc(100% - var(--sk-panel-cut-br) - var(--sk-panel-border-width)),
223
+ calc(100% - var(--sk-panel-border-width)) calc(var(--sk-panel-cut-tr) + var(--sk-panel-border-width)),
224
+ calc(100% - var(--sk-panel-cut-tr) - var(--sk-panel-border-width)) var(--sk-panel-border-width),
225
+ calc(var(--sk-panel-cut-tl) + var(--sk-panel-border-width)) var(--sk-panel-border-width)
226
+ );
227
+ }
228
+ }
151
229
 
152
230
  //------------------------------------------------------------------------------------------------------------------
153
231
  // Corner decoration line
@@ -161,11 +239,40 @@
161
239
  height: 2px;
162
240
  background: var(--sk-panel-border-base);
163
241
  border-radius: 1px;
242
+ transform-origin: center;
243
+ pointer-events: none;
244
+ }
245
+
246
+ // Bottom-right decoration (default)
247
+ &.sk-decoration-bottom-right::after
248
+ {
164
249
  right: var(--sk-panel-decoration-offset);
165
250
  bottom: calc(var(--sk-panel-cut-size) / 2 + var(--sk-panel-decoration-offset) - 1px);
166
251
  transform: rotate(135deg);
167
- transform-origin: center;
168
- pointer-events: none;
252
+ }
253
+
254
+ // Top-left decoration (same diagonal as bottom-right)
255
+ &.sk-decoration-top-left::after
256
+ {
257
+ left: var(--sk-panel-decoration-offset);
258
+ top: calc(var(--sk-panel-cut-size) / 2 + var(--sk-panel-decoration-offset) - 1px);
259
+ transform: rotate(135deg);
260
+ }
261
+
262
+ // Top-right decoration
263
+ &.sk-decoration-top-right::after
264
+ {
265
+ right: var(--sk-panel-decoration-offset);
266
+ top: calc(var(--sk-panel-cut-size) / 2 + var(--sk-panel-decoration-offset) - 1px);
267
+ transform: rotate(45deg);
268
+ }
269
+
270
+ // Bottom-left decoration
271
+ &.sk-decoration-bottom-left::after
272
+ {
273
+ left: var(--sk-panel-decoration-offset);
274
+ bottom: calc(var(--sk-panel-cut-size) / 2 + var(--sk-panel-decoration-offset) - 1px);
275
+ transform: rotate(45deg);
169
276
  }
170
277
 
171
278
  //------------------------------------------------------------------------------------------------------------------
@@ -203,9 +310,8 @@
203
310
 
204
311
  &.sk-no-border
205
312
  {
206
- // Remove all border styling
313
+ // Remove border and glow but keep the bevel shape
207
314
  --sk-panel-border-width: 0;
208
- --sk-panel-cut-size: 0;
209
315
  box-shadow: none;
210
316
 
211
317
  // Remove the decoration as well
@@ -231,7 +337,7 @@
231
337
  .sk-panel-scroll-content
232
338
  {
233
339
  padding: var(--sk-panel-padding);
234
- margin-bottom: calc(var(--sk-panel-cut-size) + var(--sk-panel-decoration-offset));
340
+ margin-bottom: calc(max(var(--sk-panel-cut-br), var(--sk-panel-cut-bl)) + var(--sk-panel-decoration-offset));
235
341
  overflow-y: auto;
236
342
  overflow-x: hidden;
237
343
  flex: 1;
@@ -0,0 +1,439 @@
1
+ @use '@/styles/mixins/cut-border' as *;
2
+
3
+ //----------------------------------------------------------------------------------------------------------------------
4
+ // Select Component Styles
5
+ //----------------------------------------------------------------------------------------------------------------------
6
+
7
+ .sk-select
8
+ {
9
+ // Color tokens (can be overridden by custom colors)
10
+ --sk-select-color-base: var(--sk-neutral-base);
11
+ --sk-select-fg: var(--sk-neutral-text);
12
+
13
+ position: relative;
14
+ display: inline-flex;
15
+ width: 100%;
16
+
17
+ // Size variants
18
+ &.sk-sm
19
+ {
20
+ --sk-select-cut: 0.4rem;
21
+ }
22
+
23
+ &.sk-md
24
+ {
25
+ --sk-select-cut: 0.5rem;
26
+ }
27
+
28
+ &.sk-lg
29
+ {
30
+ --sk-select-cut: 0.6rem;
31
+ }
32
+
33
+ &.sk-xl
34
+ {
35
+ --sk-select-cut: 0.7rem;
36
+ }
37
+
38
+ // Kind variants
39
+ &.sk-neutral
40
+ {
41
+ --sk-select-color-base: var(--sk-neutral-base);
42
+ --sk-select-fg: var(--sk-neutral-text);
43
+ }
44
+
45
+ &.sk-primary
46
+ {
47
+ --sk-select-color-base: var(--sk-primary-base);
48
+ --sk-select-fg: var(--sk-primary-text);
49
+ }
50
+
51
+ &.sk-accent
52
+ {
53
+ --sk-select-color-base: var(--sk-accent-base);
54
+ --sk-select-fg: var(--sk-accent-text);
55
+ }
56
+
57
+ &.sk-info
58
+ {
59
+ --sk-select-color-base: var(--sk-info-base);
60
+ --sk-select-fg: var(--sk-info-text);
61
+ }
62
+
63
+ &.sk-success
64
+ {
65
+ --sk-select-color-base: var(--sk-success-base);
66
+ --sk-select-fg: var(--sk-success-text);
67
+ }
68
+
69
+ &.sk-warning
70
+ {
71
+ --sk-select-color-base: var(--sk-warning-base);
72
+ --sk-select-fg: var(--sk-warning-text);
73
+ }
74
+
75
+ &.sk-danger
76
+ {
77
+ --sk-select-color-base: var(--sk-danger-base);
78
+ --sk-select-fg: var(--sk-danger-text);
79
+ }
80
+
81
+ // Color kinds (direct palette access)
82
+ &.sk-neon-blue
83
+ {
84
+ --sk-select-color-base: var(--sk-neon-blue-base);
85
+ --sk-select-fg: var(--sk-neon-blue-text);
86
+ }
87
+
88
+ &.sk-neon-purple
89
+ {
90
+ --sk-select-color-base: var(--sk-neon-purple-base);
91
+ --sk-select-fg: var(--sk-neon-purple-text);
92
+ }
93
+
94
+ &.sk-neon-orange
95
+ {
96
+ --sk-select-color-base: var(--sk-neon-orange-base);
97
+ --sk-select-fg: var(--sk-neon-orange-text);
98
+ }
99
+
100
+ &.sk-neon-green
101
+ {
102
+ --sk-select-color-base: var(--sk-neon-green-base);
103
+ --sk-select-fg: var(--sk-neon-green-text);
104
+ }
105
+
106
+ &.sk-neon-mint
107
+ {
108
+ --sk-select-color-base: var(--sk-neon-mint-base);
109
+ --sk-select-fg: var(--sk-neon-mint-text);
110
+ }
111
+
112
+ &.sk-neon-pink
113
+ {
114
+ --sk-select-color-base: var(--sk-neon-pink-base);
115
+ --sk-select-fg: var(--sk-neon-pink-text);
116
+ }
117
+
118
+ &.sk-yellow
119
+ {
120
+ --sk-select-color-base: var(--sk-yellow-base);
121
+ --sk-select-fg: var(--sk-yellow-text);
122
+ }
123
+
124
+ &.sk-red
125
+ {
126
+ --sk-select-color-base: var(--sk-red-base);
127
+ --sk-select-fg: var(--sk-red-text);
128
+ }
129
+ }
130
+
131
+ //----------------------------------------------------------------------------------------------------------------------
132
+
133
+ .sk-select-trigger
134
+ {
135
+ display: flex;
136
+ align-items: center;
137
+ gap: var(--sk-space-sm);
138
+ width: 100%;
139
+
140
+ // Button reset (SelectTrigger renders as <button>)
141
+ font-family: var(--sk-font-family-base);
142
+ font-size: inherit;
143
+ text-align: left;
144
+
145
+ @include cut-border(
146
+ $cut: var(--sk-select-cut),
147
+ $border-width: var(--sk-border-width-thin),
148
+ $border-color: var(--sk-select-color-base),
149
+ $corners: (top-right)
150
+ );
151
+
152
+ // Base styling
153
+ background: color-mix(
154
+ in oklch,
155
+ color-mix(in oklch, var(--sk-select-color-base) 75%, transparent 25%),
156
+ #000 65%
157
+ );
158
+ color: var(--sk-select-fg);
159
+ cursor: pointer;
160
+ outline: none;
161
+
162
+ // Transitions
163
+ transition-property: background, border-color;
164
+ transition-duration: var(--sk-transition-duration-base);
165
+
166
+ // Size variants
167
+ .sk-select.sk-sm &
168
+ {
169
+ height: 2rem;
170
+ padding: 0 var(--sk-space-sm);
171
+ font-size: 0.875rem;
172
+ }
173
+
174
+ .sk-select.sk-md &
175
+ {
176
+ height: 2.5rem;
177
+ padding: 0 var(--sk-space-md);
178
+ font-size: 1rem;
179
+ }
180
+
181
+ .sk-select.sk-lg &
182
+ {
183
+ height: 3rem;
184
+ padding: 0 var(--sk-space-md);
185
+ font-size: 1.125rem;
186
+ }
187
+
188
+ .sk-select.sk-xl &
189
+ {
190
+ height: 3.5rem;
191
+ padding: 0 var(--sk-space-md);
192
+ font-size: 1.25rem;
193
+ }
194
+
195
+ // Focus state
196
+ &:focus-visible
197
+ {
198
+ border-color: color-mix(in oklch, var(--sk-select-color-base), white 35%);
199
+ background: color-mix(
200
+ in oklch,
201
+ color-mix(in oklch, var(--sk-select-color-base) 75%, transparent 25%),
202
+ #000 25%
203
+ );
204
+ }
205
+
206
+ // Hover state
207
+ &:hover:not(:disabled)
208
+ {
209
+ border-color: color-mix(in oklch, var(--sk-select-color-base), white 20%);
210
+ }
211
+
212
+ // Disabled state
213
+ &:disabled
214
+ {
215
+ opacity: 0.5;
216
+ cursor: not-allowed;
217
+ }
218
+
219
+ // SelectValue text -- fill remaining space
220
+ > span
221
+ {
222
+ flex: 1;
223
+ color: white;
224
+ overflow: hidden;
225
+ text-overflow: ellipsis;
226
+ white-space: nowrap;
227
+
228
+ // Placeholder (Reka UI adds data-placeholder when no value is selected)
229
+ &[data-placeholder]
230
+ {
231
+ color: color-mix(in oklch, var(--sk-select-fg), transparent 50%);
232
+ }
233
+ }
234
+
235
+ // Chevron icon -- fixed right
236
+ > svg
237
+ {
238
+ flex-shrink: 0;
239
+ opacity: 0.8;
240
+ }
241
+ }
242
+
243
+ //----------------------------------------------------------------------------------------------------------------------
244
+
245
+ .sk-select-content
246
+ {
247
+ // Color tokens - define defaults (can be overridden by kind variants)
248
+ --sk-menu-color-base: var(--sk-neutral-base);
249
+ --sk-menu-fg: var(--sk-neutral-text);
250
+
251
+ position: relative;
252
+ min-width: var(--reka-select-trigger-width);
253
+ max-height: 20rem;
254
+ overflow: auto;
255
+ padding: var(--sk-space-xs);
256
+ z-index: 1000;
257
+
258
+ @include cut-border(
259
+ $cut: 0.625rem,
260
+ $border-width: var(--sk-border-width-thin),
261
+ $border-color: var(--sk-menu-color-base),
262
+ $corners: (top-left)
263
+ );
264
+
265
+ // Base styling
266
+ background: color-mix(
267
+ in oklch,
268
+ color-mix(in oklch, var(--sk-menu-color-base) 95%, transparent 5%),
269
+ #000 46.25%
270
+ );
271
+ color: var(--sk-menu-fg);
272
+ box-shadow: var(--sk-shadow-lg);
273
+
274
+ // Kind variants (defined directly on content for portal support)
275
+ &.sk-neutral
276
+ {
277
+ --sk-menu-color-base: var(--sk-neutral-base);
278
+ --sk-menu-fg: var(--sk-neutral-text);
279
+ }
280
+
281
+ &.sk-primary
282
+ {
283
+ --sk-menu-color-base: var(--sk-primary-base);
284
+ --sk-menu-fg: var(--sk-primary-text);
285
+ }
286
+
287
+ &.sk-accent
288
+ {
289
+ --sk-menu-color-base: var(--sk-accent-base);
290
+ --sk-menu-fg: var(--sk-accent-text);
291
+ }
292
+
293
+ &.sk-info
294
+ {
295
+ --sk-menu-color-base: var(--sk-info-base);
296
+ --sk-menu-fg: var(--sk-info-text);
297
+ }
298
+
299
+ &.sk-success
300
+ {
301
+ --sk-menu-color-base: var(--sk-success-base);
302
+ --sk-menu-fg: var(--sk-success-text);
303
+ }
304
+
305
+ &.sk-warning
306
+ {
307
+ --sk-menu-color-base: var(--sk-warning-base);
308
+ --sk-menu-fg: var(--sk-warning-text);
309
+ }
310
+
311
+ &.sk-danger
312
+ {
313
+ --sk-menu-color-base: var(--sk-danger-base);
314
+ --sk-menu-fg: var(--sk-danger-text);
315
+ }
316
+
317
+ // Color kinds (direct palette access)
318
+ &.sk-neon-blue
319
+ {
320
+ --sk-menu-color-base: var(--sk-neon-blue-base);
321
+ --sk-menu-fg: var(--sk-neon-blue-text);
322
+ }
323
+
324
+ &.sk-neon-purple
325
+ {
326
+ --sk-menu-color-base: var(--sk-neon-purple-base);
327
+ --sk-menu-fg: var(--sk-neon-purple-text);
328
+ }
329
+
330
+ &.sk-neon-orange
331
+ {
332
+ --sk-menu-color-base: var(--sk-neon-orange-base);
333
+ --sk-menu-fg: var(--sk-neon-orange-text);
334
+ }
335
+
336
+ &.sk-neon-green
337
+ {
338
+ --sk-menu-color-base: var(--sk-neon-green-base);
339
+ --sk-menu-fg: var(--sk-neon-green-text);
340
+ }
341
+
342
+ &.sk-neon-mint
343
+ {
344
+ --sk-menu-color-base: var(--sk-neon-mint-base);
345
+ --sk-menu-fg: var(--sk-neon-mint-text);
346
+ }
347
+
348
+ &.sk-neon-pink
349
+ {
350
+ --sk-menu-color-base: var(--sk-neon-pink-base);
351
+ --sk-menu-fg: var(--sk-neon-pink-text);
352
+ }
353
+
354
+ &.sk-yellow
355
+ {
356
+ --sk-menu-color-base: var(--sk-yellow-base);
357
+ --sk-menu-fg: var(--sk-yellow-text);
358
+ }
359
+
360
+ &.sk-red
361
+ {
362
+ --sk-menu-color-base: var(--sk-red-base);
363
+ --sk-menu-fg: var(--sk-red-text);
364
+ }
365
+ }
366
+
367
+ //----------------------------------------------------------------------------------------------------------------------
368
+
369
+ .sk-select-item
370
+ {
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: space-between;
374
+ gap: var(--sk-space-md);
375
+ padding: var(--sk-space-xs) var(--sk-space-md);
376
+ cursor: pointer;
377
+ color: color-mix(in oklch, var(--sk-menu-fg), black 15%);
378
+ font-size: 0.875rem;
379
+ outline: none;
380
+ user-select: none;
381
+
382
+ @include cut-border(
383
+ $cut: 0.5rem,
384
+ $border-width: var(--sk-border-width-thin),
385
+ $border-color: transparent,
386
+ $corners: (top-left bottom-right)
387
+ );
388
+
389
+ // Hover state
390
+ &:hover:not([data-disabled])
391
+ {
392
+ background: color-mix(
393
+ in oklch,
394
+ color-mix(in oklch, var(--sk-menu-color-base), black 30%),
395
+ transparent 10%
396
+ );
397
+ color: var(--sk-menu-fg);
398
+ }
399
+
400
+ // Highlighted state (keyboard navigation)
401
+ &[data-highlighted]
402
+ {
403
+ background: color-mix(
404
+ in oklch,
405
+ color-mix(in oklch, var(--sk-menu-color-base), black 30%),
406
+ transparent 10%
407
+ );
408
+ color: var(--sk-menu-fg);
409
+ outline: none;
410
+ }
411
+
412
+ // Disabled state
413
+ &[data-disabled]
414
+ {
415
+ opacity: 0.5;
416
+ cursor: not-allowed;
417
+ }
418
+ }
419
+
420
+ //----------------------------------------------------------------------------------------------------------------------
421
+
422
+ .sk-select-item-indicator
423
+ {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ flex-shrink: 0;
428
+ }
429
+
430
+ //----------------------------------------------------------------------------------------------------------------------
431
+
432
+ .sk-select-separator
433
+ {
434
+ height: 1px;
435
+ margin: var(--sk-space-xs) 0;
436
+ background: color-mix(in oklch, var(--sk-menu-color-base), transparent 70%);
437
+ }
438
+
439
+ //----------------------------------------------------------------------------------------------------------------------