@salmexio/ui 1.1.0 → 1.2.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 (40) hide show
  1. package/dist/dialogs/ContextMenu/ContextMenu.svelte +11 -1
  2. package/dist/dialogs/Modal/Modal.svelte +34 -1
  3. package/dist/feedback/Alert/Alert.svelte +54 -11
  4. package/dist/feedback/ProgressBar/ProgressBar.svelte +11 -8
  5. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +2 -2
  6. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -1
  7. package/dist/feedback/Skeleton/Skeleton.svelte +7 -3
  8. package/dist/feedback/Spinner/Spinner.svelte +2 -0
  9. package/dist/feedback/Toast/Toaster.svelte +35 -3
  10. package/dist/forms/Checkbox/Checkbox.svelte +30 -7
  11. package/dist/forms/Select/Select.svelte +19 -3
  12. package/dist/forms/Slider/Slider.svelte +41 -13
  13. package/dist/forms/Slider/Slider.svelte.d.ts +1 -1
  14. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -1
  15. package/dist/forms/TextInput/TextInput.svelte +19 -1
  16. package/dist/forms/Textarea/Textarea.svelte +18 -3
  17. package/dist/forms/Toggle/Toggle.svelte +70 -11
  18. package/dist/layout/Card/Card.svelte +125 -4
  19. package/dist/layout/Card/Card.svelte.d.ts +3 -0
  20. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  21. package/dist/layout/ThermalBackground/ThermalBackground.svelte +2 -40
  22. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +0 -2
  23. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -1
  24. package/dist/navigation/CommandPalette/CommandPalette.svelte +37 -3
  25. package/dist/navigation/NavMenu/NavMenu.svelte +800 -0
  26. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts +81 -0
  27. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts.map +1 -0
  28. package/dist/navigation/NavMenu/index.d.ts +3 -0
  29. package/dist/navigation/NavMenu/index.d.ts.map +1 -0
  30. package/dist/navigation/NavMenu/index.js +1 -0
  31. package/dist/navigation/Tabs/Tabs.svelte +37 -8
  32. package/dist/navigation/index.d.ts +2 -0
  33. package/dist/navigation/index.d.ts.map +1 -1
  34. package/dist/navigation/index.js +1 -0
  35. package/dist/primitives/Badge/Badge.svelte +55 -10
  36. package/dist/primitives/Button/Button.svelte +220 -71
  37. package/dist/primitives/Tooltip/Tooltip.svelte +33 -1
  38. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -1
  39. package/dist/styles/tokens.css +1 -0
  40. package/package.json +1 -1
@@ -386,8 +386,18 @@ onMount(() => {
386
386
  max-width: 320px;
387
387
  background: var(--sx-color-surface-2);
388
388
  border: 1px solid var(--sx-color-border-strong);
389
+ border-top-color: rgba(255, 255, 255, 0.05);
389
390
  border-radius: var(--sx-radius-md);
390
- box-shadow: var(--sx-shadow-lg);
391
+ box-shadow:
392
+ /* 3D extrusion */
393
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
394
+ 0 2px 0 0 rgba(0, 0, 0, 0.14),
395
+ 0 3px 0 0 rgba(0, 0, 0, 0.08),
396
+ /* Deep ambient shadow */
397
+ 0 6px 16px -3px rgba(0, 0, 0, 0.45),
398
+ 0 12px 32px -6px rgba(0, 0, 0, 0.2),
399
+ /* Warm edge glow */
400
+ 0 0 12px -6px rgba(255, 107, 53, 0.08);
391
401
  backdrop-filter: var(--sx-glass-blur);
392
402
  padding: var(--sx-space-1) 0;
393
403
  outline: none;
@@ -263,11 +263,37 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
263
263
  background: var(--sx-color-surface);
264
264
  border: 1px solid var(--sx-color-border-strong);
265
265
  border-radius: var(--sx-radius-lg);
266
- box-shadow: var(--sx-shadow-xl);
266
+ box-shadow:
267
+ /* 3D extrusion underneath */
268
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
269
+ 0 2px 0 0 rgba(0, 0, 0, 0.15),
270
+ 0 3px 0 0 rgba(0, 0, 0, 0.1),
271
+ 0 4px 0 0 rgba(0, 0, 0, 0.06),
272
+ /* Deep ambient shadow */
273
+ 0 8px 24px -4px rgba(0, 0, 0, 0.5),
274
+ 0 16px 48px -8px rgba(0, 0, 0, 0.3),
275
+ /* Warm forge glow on edges */
276
+ 0 0 32px -8px rgba(255, 107, 53, 0.08);
267
277
  animation: sx-modal-scale-in 200ms ease-out;
268
278
  overflow: hidden;
269
279
  }
270
280
 
281
+ /* Top-lit bevel */
282
+ .sx-modal-container::before {
283
+ content: '';
284
+ position: absolute;
285
+ inset: 0;
286
+ border-radius: inherit;
287
+ background: linear-gradient(
288
+ 180deg,
289
+ rgba(255, 255, 255, 0.04) 0%,
290
+ transparent 30%,
291
+ rgba(0, 0, 0, 0.04) 100%
292
+ );
293
+ pointer-events: none;
294
+ z-index: 5;
295
+ }
296
+
271
297
  @keyframes sx-modal-scale-in {
272
298
  from {
273
299
  opacity: 0;
@@ -313,6 +339,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
313
339
  HEADER
314
340
  ======================================== */
315
341
  .sx-modal-header {
342
+ position: relative;
343
+ z-index: 1;
316
344
  display: flex;
317
345
  align-items: center;
318
346
  justify-content: space-between;
@@ -333,6 +361,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
333
361
  .sx-modal-title-wrap:focus-visible {
334
362
  outline: 2px solid var(--sx-color-primary);
335
363
  outline-offset: 2px;
364
+ border-radius: var(--sx-radius-sm);
336
365
  }
337
366
 
338
367
  .sx-modal-title {
@@ -384,6 +413,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
384
413
  BODY
385
414
  ======================================== */
386
415
  .sx-modal-body {
416
+ position: relative;
417
+ z-index: 1;
387
418
  padding: var(--sx-space-6);
388
419
  flex: 1;
389
420
  min-height: 0;
@@ -394,6 +425,8 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
394
425
  FOOTER
395
426
  ======================================== */
396
427
  .sx-modal-footer {
428
+ position: relative;
429
+ z-index: 1;
397
430
  display: flex;
398
431
  align-items: center;
399
432
  justify-content: flex-end;
@@ -157,20 +157,41 @@ function toggleExpanded() {
157
157
  </div>
158
158
 
159
159
  <style>
160
- /* INFRARED: surface card, left accent border, subtle type tint */
160
+ /* INFRARED: 3D status plate — left accent border, extrusion, bevel */
161
161
  .sx-alert {
162
+ position: relative;
162
163
  display: flex;
163
164
  gap: var(--sx-space-3);
164
165
  padding: var(--sx-space-4);
165
166
  background: var(--sx-color-surface);
166
167
  border: 1px solid var(--sx-color-border);
167
- border-left: 2px solid var(--sx-color-border-strong);
168
+ border-left: 3px solid var(--sx-color-border-strong);
168
169
  border-radius: var(--sx-radius-md);
169
170
  font-family: var(--sx-font-body);
171
+ box-shadow:
172
+ 0 1px 0 0 rgba(0, 0, 0, 0.15),
173
+ 0 2px 0 0 rgba(0, 0, 0, 0.1),
174
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
170
175
  transition: box-shadow var(--sx-transition-fast);
171
176
  animation: sx-alert-in var(--sx-duration-base) var(--sx-ease-out) both;
172
177
  }
173
178
 
179
+ /* Top-lit bevel */
180
+ .sx-alert::before {
181
+ content: '';
182
+ position: absolute;
183
+ inset: 0;
184
+ border-radius: inherit;
185
+ background: linear-gradient(
186
+ 180deg,
187
+ rgba(255, 255, 255, 0.04) 0%,
188
+ transparent 40%,
189
+ rgba(0, 0, 0, 0.03) 100%
190
+ );
191
+ pointer-events: none;
192
+ z-index: 0;
193
+ }
194
+
174
195
  .sx-alert-standard {
175
196
  border-radius: var(--sx-radius-md);
176
197
  }
@@ -190,6 +211,8 @@ function toggleExpanded() {
190
211
  }
191
212
 
192
213
  .sx-alert-icon {
214
+ position: relative;
215
+ z-index: 1;
193
216
  flex-shrink: 0;
194
217
  display: flex;
195
218
  align-items: flex-start;
@@ -197,6 +220,8 @@ function toggleExpanded() {
197
220
  }
198
221
 
199
222
  .sx-alert-content {
223
+ position: relative;
224
+ z-index: 1;
200
225
  flex: 1;
201
226
  min-width: 0;
202
227
  display: flex;
@@ -251,8 +276,8 @@ function toggleExpanded() {
251
276
  }
252
277
 
253
278
  .sx-alert-title-btn:focus-visible {
254
- outline: none;
255
- box-shadow: 0 0 0 2px var(--sx-color-primary);
279
+ outline: 2px solid var(--sx-color-primary);
280
+ outline-offset: 2px;
256
281
  }
257
282
 
258
283
  .sx-alert-expand-icon {
@@ -264,6 +289,8 @@ function toggleExpanded() {
264
289
 
265
290
  /* Dismiss button — transparent, minimal */
266
291
  .sx-alert-dismiss {
292
+ position: relative;
293
+ z-index: 1;
267
294
  flex-shrink: 0;
268
295
  display: flex;
269
296
  align-items: center;
@@ -288,14 +315,18 @@ function toggleExpanded() {
288
315
  }
289
316
 
290
317
  .sx-alert-dismiss:focus-visible {
291
- outline: none;
292
- box-shadow: 0 0 0 2px var(--sx-color-primary);
318
+ outline: 2px solid var(--sx-color-primary);
319
+ outline-offset: 2px;
293
320
  }
294
321
 
295
- /* Type: success */
322
+ /* Type: success — green accent, green-tinted extrusion */
296
323
  .sx-alert-success {
297
324
  background: var(--sx-color-green-subtle);
298
325
  border-left-color: var(--sx-color-green);
326
+ box-shadow:
327
+ 0 1px 0 0 rgba(34, 120, 69, 0.25),
328
+ 0 2px 0 0 rgba(34, 120, 69, 0.15),
329
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
299
330
  }
300
331
 
301
332
  .sx-alert-success .sx-alert-icon {
@@ -306,10 +337,14 @@ function toggleExpanded() {
306
337
  color: var(--sx-color-text);
307
338
  }
308
339
 
309
- /* Type: error */
340
+ /* Type: error — red accent, crimson-tinted extrusion */
310
341
  .sx-alert-error {
311
342
  background: var(--sx-color-red-subtle);
312
343
  border-left-color: var(--sx-color-red);
344
+ box-shadow:
345
+ 0 1px 0 0 rgba(180, 30, 30, 0.25),
346
+ 0 2px 0 0 rgba(140, 20, 20, 0.15),
347
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
313
348
  }
314
349
 
315
350
  .sx-alert-error .sx-alert-icon {
@@ -320,10 +355,14 @@ function toggleExpanded() {
320
355
  color: var(--sx-color-text);
321
356
  }
322
357
 
323
- /* Type: warning */
358
+ /* Type: warning — brass accent, brass-tinted extrusion */
324
359
  .sx-alert-warning {
325
360
  background: var(--sx-color-brass-subtle);
326
361
  border-left-color: var(--sx-color-secondary);
362
+ box-shadow:
363
+ 0 1px 0 0 rgba(160, 134, 62, 0.25),
364
+ 0 2px 0 0 rgba(130, 108, 50, 0.15),
365
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
327
366
  }
328
367
 
329
368
  .sx-alert-warning .sx-alert-icon {
@@ -334,10 +373,14 @@ function toggleExpanded() {
334
373
  color: var(--sx-color-text);
335
374
  }
336
375
 
337
- /* Type: info */
376
+ /* Type: info — vermilion accent, warm-tinted extrusion */
338
377
  .sx-alert-info {
339
378
  background: var(--sx-color-primary-subtle);
340
379
  border-left-color: var(--sx-color-primary);
380
+ box-shadow:
381
+ 0 1px 0 0 rgba(200, 85, 30, 0.25),
382
+ 0 2px 0 0 rgba(160, 65, 20, 0.15),
383
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
341
384
  }
342
385
 
343
386
  .sx-alert-info .sx-alert-icon {
@@ -348,7 +391,7 @@ function toggleExpanded() {
348
391
  color: var(--sx-color-text);
349
392
  }
350
393
 
351
- /* Type: neutral */
394
+ /* Type: neutral — subtle neutral extrusion */
352
395
  .sx-alert-neutral {
353
396
  background: var(--sx-color-surface);
354
397
  border-left-color: var(--sx-color-border-strong);
@@ -7,13 +7,13 @@
7
7
  @example
8
8
  <ProgressBar value={65} label="Upload" />
9
9
  <ProgressBar indeterminate label="Loading..." />
10
- <ProgressBar value={30} max={50} showValue color="cyan" />
10
+ <ProgressBar value={30} max={50} showValue color="primary" />
11
11
  -->
12
12
  <script lang="ts">
13
13
  import { cn } from '../../utils/cn.js';
14
14
 
15
15
  type ProgressSize = 'sm' | 'md' | 'lg';
16
- type ProgressColor = 'cyan' | 'green' | 'gold' | 'red' | 'purple';
16
+ type ProgressColor = 'primary' | 'green' | 'brass' | 'red' | 'teal';
17
17
 
18
18
  interface Props {
19
19
  /** Current value (0–max). Ignored when indeterminate. */
@@ -48,7 +48,7 @@ let {
48
48
  showValue = false,
49
49
  formatValue,
50
50
  size = 'md',
51
- color = 'cyan',
51
+ color = 'primary',
52
52
  class: className = '',
53
53
  testId
54
54
  }: Props = $props();
@@ -159,12 +159,15 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
159
159
  align-self: flex-end;
160
160
  }
161
161
 
162
- /* Track */
162
+ /* Track — recessed channel */
163
163
  .sx-progress-track {
164
164
  width: 100%;
165
165
  background: var(--sx-color-surface-2);
166
166
  border-radius: var(--sx-radius-full);
167
167
  overflow: hidden;
168
+ box-shadow:
169
+ inset 0 1px 2px rgba(0, 0, 0, 0.3),
170
+ inset 0 0 0 1px rgba(0, 0, 0, 0.06);
168
171
  }
169
172
 
170
173
  .sx-progress-sm {
@@ -201,8 +204,8 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
201
204
  }
202
205
 
203
206
  /* Colors */
204
- .sx-progress-color-cyan {
205
- background: var(--sx-color-primary);
207
+ .sx-progress-color-primary {
208
+ background: linear-gradient(90deg, #FF6B35, #C8A84E);
206
209
  box-shadow: 0 0 8px rgba(255, 107, 53, 0.2);
207
210
  }
208
211
 
@@ -211,7 +214,7 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
211
214
  box-shadow: 0 0 8px rgba(74, 222, 128, 0.2);
212
215
  }
213
216
 
214
- .sx-progress-color-gold {
217
+ .sx-progress-color-brass {
215
218
  background: var(--sx-color-secondary);
216
219
  box-shadow: 0 0 8px rgba(200, 168, 78, 0.2);
217
220
  }
@@ -221,7 +224,7 @@ const labelId = $derived(label ? `${stableId}-label` : undefined);
221
224
  box-shadow: 0 0 8px rgba(220, 38, 38, 0.2);
222
225
  }
223
226
 
224
- .sx-progress-color-purple {
227
+ .sx-progress-color-teal {
225
228
  background: var(--sx-color-teal);
226
229
  box-shadow: 0 0 8px rgba(61, 139, 139, 0.2);
227
230
  }
@@ -1,5 +1,5 @@
1
1
  type ProgressSize = 'sm' | 'md' | 'lg';
2
- type ProgressColor = 'cyan' | 'green' | 'gold' | 'red' | 'purple';
2
+ type ProgressColor = 'primary' | 'green' | 'brass' | 'red' | 'teal';
3
3
  interface Props {
4
4
  /** Current value (0–max). Ignored when indeterminate. */
5
5
  value?: number;
@@ -32,7 +32,7 @@ interface Props {
32
32
  * @example
33
33
  * <ProgressBar value={65} label="Upload" />
34
34
  * <ProgressBar indeterminate label="Loading..." />
35
- * <ProgressBar value={30} max={50} showValue color="cyan" />
35
+ * <ProgressBar value={30} max={50} showValue color="primary" />
36
36
  */
37
37
  declare const ProgressBar: import("svelte").Component<Props, {}, "">;
38
38
  type ProgressBar = ReturnType<typeof ProgressBar>;
@@ -1 +1 @@
1
- {"version":3,"file":"ProgressBar.svelte.d.ts","sourceRoot":"","sources":["../../../src/feedback/ProgressBar/ProgressBar.svelte.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAElE,UAAU,KAAK;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,sBAAsB;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ProgressBar.svelte.d.ts","sourceRoot":"","sources":["../../../src/feedback/ProgressBar/ProgressBar.svelte.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,KAAK,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpE,UAAU,KAAK;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,sBAAsB;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -112,6 +112,10 @@ const lineWidths = $derived(
112
112
 
113
113
  .sx-skeleton-bone {
114
114
  background: var(--sx-color-surface-2);
115
+ /* Recessed carved-out placeholder */
116
+ box-shadow:
117
+ inset 0 1px 2px rgba(0, 0, 0, 0.2),
118
+ inset 0 0 0 1px rgba(0, 0, 0, 0.04);
115
119
  }
116
120
 
117
121
  .sx-skeleton-shimmer {
@@ -127,9 +131,9 @@ const lineWidths = $derived(
127
131
  100deg,
128
132
  transparent 0%,
129
133
  transparent 35%,
130
- rgba(255, 255, 255, 0.04) 45%,
131
- var(--sx-color-surface-3) 50%,
132
- rgba(255, 255, 255, 0.04) 55%,
134
+ rgba(255, 107, 53, 0.02) 45%,
135
+ rgba(200, 168, 78, 0.04) 50%,
136
+ rgba(255, 107, 53, 0.02) 55%,
133
137
  transparent 65%,
134
138
  transparent 100%
135
139
  );
@@ -214,6 +214,7 @@ const config = $derived(sizeConfig[size]);
214
214
 
215
215
  .sx-spinner-arc {
216
216
  transform-origin: center;
217
+ filter: drop-shadow(0 0 3px currentColor);
217
218
  }
218
219
 
219
220
  @keyframes sx-spin {
@@ -284,6 +285,7 @@ const config = $derived(sizeConfig[size]);
284
285
  height: 28%;
285
286
  border-radius: 50%;
286
287
  background: currentColor;
288
+ box-shadow: 0 0 8px currentColor;
287
289
  animation: sx-pulse-dot 1.5s ease-out infinite;
288
290
  }
289
291
 
@@ -212,9 +212,10 @@ onMount(() => {
212
212
  left: 0;
213
213
  }
214
214
 
215
- /* ========== TOAST ========== */
215
+ /* ========== TOAST — 3D floating notification plate ========== */
216
216
  .sx-toast {
217
217
  pointer-events: auto;
218
+ position: relative;
218
219
  display: flex;
219
220
  align-items: flex-start;
220
221
  gap: var(--sx-space-3);
@@ -223,8 +224,15 @@ onMount(() => {
223
224
  backdrop-filter: var(--sx-glass-blur);
224
225
  -webkit-backdrop-filter: var(--sx-glass-blur);
225
226
  border: 1px solid var(--sx-color-border-strong);
227
+ border-top-color: rgba(255, 255, 255, 0.05);
226
228
  border-radius: var(--sx-radius-md);
227
- box-shadow: var(--sx-shadow-lg);
229
+ box-shadow:
230
+ /* 3D extrusion */
231
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
232
+ 0 2px 0 0 rgba(0, 0, 0, 0.12),
233
+ 0 3px 0 0 rgba(0, 0, 0, 0.06),
234
+ /* Ambient shadow */
235
+ 0 6px 16px -3px rgba(0, 0, 0, 0.4);
228
236
  border-left: 3px solid var(--sx-color-text-secondary);
229
237
  animation: sx-toast-in 250ms var(--sx-ease-out) both;
230
238
  outline: none;
@@ -239,21 +247,45 @@ onMount(() => {
239
247
  animation: sx-toast-out 150ms ease-in both;
240
248
  }
241
249
 
242
- /* Type border colors */
250
+ /* Type border colors + variant-tinted extrusion */
243
251
  .sx-toast-success {
244
252
  border-left-color: var(--sx-color-green);
253
+ box-shadow:
254
+ 0 1px 0 0 rgba(34, 120, 69, 0.2),
255
+ 0 2px 0 0 rgba(34, 120, 69, 0.1),
256
+ 0 3px 0 0 rgba(0, 0, 0, 0.06),
257
+ 0 6px 16px -3px rgba(0, 0, 0, 0.4),
258
+ 0 0 8px -4px rgba(34, 197, 94, 0.12);
245
259
  }
246
260
 
247
261
  .sx-toast-error {
248
262
  border-left-color: var(--sx-color-red);
263
+ box-shadow:
264
+ 0 1px 0 0 rgba(180, 30, 30, 0.2),
265
+ 0 2px 0 0 rgba(140, 20, 20, 0.1),
266
+ 0 3px 0 0 rgba(0, 0, 0, 0.06),
267
+ 0 6px 16px -3px rgba(0, 0, 0, 0.4),
268
+ 0 0 8px -4px rgba(220, 38, 38, 0.12);
249
269
  }
250
270
 
251
271
  .sx-toast-warning {
252
272
  border-left-color: var(--sx-color-secondary);
273
+ box-shadow:
274
+ 0 1px 0 0 rgba(160, 134, 62, 0.2),
275
+ 0 2px 0 0 rgba(130, 108, 50, 0.1),
276
+ 0 3px 0 0 rgba(0, 0, 0, 0.06),
277
+ 0 6px 16px -3px rgba(0, 0, 0, 0.4),
278
+ 0 0 8px -4px rgba(200, 168, 78, 0.12);
253
279
  }
254
280
 
255
281
  .sx-toast-info {
256
282
  border-left-color: var(--sx-color-primary);
283
+ box-shadow:
284
+ 0 1px 0 0 rgba(200, 85, 30, 0.2),
285
+ 0 2px 0 0 rgba(160, 65, 20, 0.1),
286
+ 0 3px 0 0 rgba(0, 0, 0, 0.06),
287
+ 0 6px 16px -3px rgba(0, 0, 0, 0.4),
288
+ 0 0 8px -4px rgba(255, 107, 53, 0.12);
257
289
  }
258
290
 
259
291
  /* Icon */
@@ -185,6 +185,10 @@ function handleChange(e: Event) {
185
185
  background: var(--sx-color-surface);
186
186
  border: 1px solid var(--sx-color-border-strong);
187
187
  border-radius: var(--sx-radius-sm);
188
+ /* Recessed well when unchecked */
189
+ box-shadow:
190
+ inset 0 1px 3px rgba(0, 0, 0, 0.3),
191
+ inset 0 0 0 1px rgba(0, 0, 0, 0.06);
188
192
  transition: background var(--sx-transition-fast), border-color var(--sx-transition-fast),
189
193
  box-shadow var(--sx-transition-fast);
190
194
  color: #fff;
@@ -216,16 +220,22 @@ function handleChange(e: Event) {
216
220
  padding: 3px 4px;
217
221
  }
218
222
 
219
- /* Checked -- vermilion fill, white checkmark */
223
+ /* Checked -- forge gradient fill, raised from the well */
220
224
  .sx-checkbox-box-checked {
221
- background: var(--sx-color-primary);
222
- border-color: var(--sx-color-primary);
225
+ background: linear-gradient(135deg, #FF6B35, #C8A84E);
226
+ border-color: rgba(255, 107, 53, 0.6);
227
+ box-shadow:
228
+ 0 1px 0 0 rgba(0, 0, 0, 0.15),
229
+ 0 0 6px -2px rgba(255, 107, 53, 0.3);
223
230
  }
224
231
 
225
- /* Indeterminate -- same as checked */
232
+ /* Indeterminate -- same forge gradient */
226
233
  .sx-checkbox-box-indeterminate {
227
- background: var(--sx-color-primary);
228
- border-color: var(--sx-color-primary);
234
+ background: linear-gradient(135deg, #FF6B35, #C8A84E);
235
+ border-color: rgba(255, 107, 53, 0.6);
236
+ box-shadow:
237
+ 0 1px 0 0 rgba(0, 0, 0, 0.15),
238
+ 0 0 6px -2px rgba(255, 107, 53, 0.3);
229
239
  }
230
240
 
231
241
  /* Hover -- border brightens on unchecked box */
@@ -233,10 +243,20 @@ function handleChange(e: Event) {
233
243
  border-color: var(--sx-color-border-hover);
234
244
  }
235
245
 
236
- /* Focus -- primary outline */
246
+ /* Focus -- primary outline with forge glow */
237
247
  .sx-checkbox-input:focus-visible + .sx-checkbox-box {
238
248
  outline: 2px solid var(--sx-color-primary);
239
249
  outline-offset: 2px;
250
+ box-shadow:
251
+ inset 0 1px 3px rgba(0, 0, 0, 0.3),
252
+ 0 0 12px -4px rgba(255, 107, 53, 0.2);
253
+ }
254
+
255
+ .sx-checkbox-input:focus-visible + .sx-checkbox-box-checked,
256
+ .sx-checkbox-input:focus-visible + .sx-checkbox-box-indeterminate {
257
+ box-shadow:
258
+ 0 1px 0 0 rgba(0, 0, 0, 0.15),
259
+ 0 0 10px -2px rgba(255, 107, 53, 0.4);
240
260
  }
241
261
 
242
262
  /* High contrast / forced colors: solid outline so focus is visible (APG) */
@@ -249,6 +269,9 @@ function handleChange(e: Event) {
249
269
 
250
270
  .sx-checkbox-box-error {
251
271
  border-color: var(--sx-color-red);
272
+ box-shadow:
273
+ inset 0 1px 3px rgba(0, 0, 0, 0.3),
274
+ 0 0 8px -4px rgba(220, 38, 38, 0.2);
252
275
  }
253
276
 
254
277
  .sx-checkbox-content {
@@ -623,6 +623,7 @@ onMount(() => {
623
623
  /* ========================================
624
624
  TRIGGER -- Same style as TextInput
625
625
  ======================================== */
626
+ /* Trigger — recessed channel, same as TextInput */
626
627
  .sx-select-trigger {
627
628
  display: flex;
628
629
  align-items: center;
@@ -638,6 +639,11 @@ onMount(() => {
638
639
  cursor: pointer;
639
640
  text-align: left;
640
641
  transition: border-color var(--sx-transition-fast), box-shadow var(--sx-transition-fast);
642
+
643
+ /* Recessed inset */
644
+ box-shadow:
645
+ inset 0 1px 3px rgba(0, 0, 0, 0.3),
646
+ inset 0 0 0 1px rgba(0, 0, 0, 0.06);
641
647
  }
642
648
 
643
649
  .sx-select-trigger:hover:not(:disabled) {
@@ -647,22 +653,32 @@ onMount(() => {
647
653
  .sx-select-trigger:focus-visible {
648
654
  outline: none;
649
655
  border-color: var(--sx-color-primary);
650
- box-shadow: 0 0 0 3px var(--sx-color-primary-ring);
656
+ box-shadow:
657
+ inset 0 1px 2px rgba(0, 0, 0, 0.2),
658
+ 0 0 0 3px var(--sx-color-primary-ring),
659
+ 0 0 12px -4px rgba(255, 107, 53, 0.15);
651
660
  }
652
661
 
653
662
  .sx-select-trigger-open {
654
663
  border-color: var(--sx-color-primary);
655
- box-shadow: 0 0 0 3px var(--sx-color-primary-ring);
664
+ box-shadow:
665
+ inset 0 1px 2px rgba(0, 0, 0, 0.2),
666
+ 0 0 0 3px var(--sx-color-primary-ring),
667
+ 0 0 12px -4px rgba(255, 107, 53, 0.15);
656
668
  }
657
669
 
658
670
  .sx-select-trigger-error {
659
671
  border-color: var(--sx-color-red);
660
- box-shadow: 0 0 0 3px var(--sx-color-red-ring);
672
+ box-shadow:
673
+ inset 0 1px 2px rgba(0, 0, 0, 0.2),
674
+ 0 0 0 3px var(--sx-color-red-ring),
675
+ 0 0 10px -4px rgba(220, 38, 38, 0.15);
661
676
  }
662
677
 
663
678
  .sx-select-trigger-disabled {
664
679
  opacity: 0.5;
665
680
  cursor: not-allowed;
681
+ box-shadow: none;
666
682
  }
667
683
 
668
684
  /* ========================================