@salmexio/ui 1.0.0 → 1.2.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 (64) hide show
  1. package/README.md +1 -1
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +17 -7
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +1 -1
  4. package/dist/dialogs/Modal/Modal.svelte +37 -4
  5. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  6. package/dist/feedback/Alert/Alert.svelte +67 -19
  7. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  8. package/dist/feedback/ProgressBar/ProgressBar.svelte +33 -11
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +3 -3
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -1
  11. package/dist/feedback/Skeleton/Skeleton.svelte +12 -4
  12. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +1 -1
  13. package/dist/feedback/Spinner/Spinner.svelte +5 -3
  14. package/dist/feedback/Spinner/Spinner.svelte.d.ts +2 -2
  15. package/dist/feedback/Toast/Toaster.svelte +45 -13
  16. package/dist/feedback/Toast/Toaster.svelte.d.ts +1 -1
  17. package/dist/forms/Checkbox/Checkbox.svelte +37 -9
  18. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  19. package/dist/forms/Select/Select.svelte +28 -12
  20. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  21. package/dist/forms/Slider/Slider.svelte +66 -38
  22. package/dist/forms/Slider/Slider.svelte.d.ts +2 -2
  23. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -1
  24. package/dist/forms/TextInput/TextInput.svelte +35 -7
  25. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  26. package/dist/forms/Textarea/Textarea.svelte +22 -7
  27. package/dist/forms/Textarea/Textarea.svelte.d.ts +1 -1
  28. package/dist/forms/Toggle/Toggle.svelte +71 -12
  29. package/dist/forms/Toggle/Toggle.svelte.d.ts +1 -1
  30. package/dist/layout/Card/Card.svelte +128 -5
  31. package/dist/layout/Card/Card.svelte.d.ts +4 -1
  32. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  33. package/dist/layout/Container/Container.svelte +1 -1
  34. package/dist/layout/Container/Container.svelte.d.ts +1 -1
  35. package/dist/layout/ThermalBackground/ThermalBackground.svelte +275 -0
  36. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +14 -0
  37. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
  38. package/dist/layout/ThermalBackground/index.d.ts +2 -0
  39. package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
  40. package/dist/layout/ThermalBackground/index.js +1 -0
  41. package/dist/layout/index.d.ts +1 -0
  42. package/dist/layout/index.d.ts.map +1 -1
  43. package/dist/layout/index.js +1 -0
  44. package/dist/navigation/CommandPalette/CommandPalette.svelte +45 -11
  45. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +1 -1
  46. package/dist/navigation/NavMenu/NavMenu.svelte +800 -0
  47. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts +81 -0
  48. package/dist/navigation/NavMenu/NavMenu.svelte.d.ts.map +1 -0
  49. package/dist/navigation/NavMenu/index.d.ts +3 -0
  50. package/dist/navigation/NavMenu/index.d.ts.map +1 -0
  51. package/dist/navigation/NavMenu/index.js +1 -0
  52. package/dist/navigation/Tabs/Tabs.svelte +73 -11
  53. package/dist/navigation/Tabs/Tabs.svelte.d.ts +1 -1
  54. package/dist/navigation/index.d.ts +2 -0
  55. package/dist/navigation/index.d.ts.map +1 -1
  56. package/dist/navigation/index.js +1 -0
  57. package/dist/primitives/Badge/Badge.svelte +68 -21
  58. package/dist/primitives/Badge/Badge.svelte.d.ts +1 -1
  59. package/dist/primitives/Button/Button.svelte +254 -34
  60. package/dist/primitives/Button/Button.svelte.d.ts +1 -1
  61. package/dist/primitives/Tooltip/Tooltip.svelte +10 -2
  62. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
  63. package/dist/styles/tokens.css +202 -64
  64. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Button
3
3
 
4
- Neo-Brutalist Dark — Glassmorphism button with glow effects.
4
+ INFRARED — Glassmorphism button with glow effects.
5
5
  Clean geometry, expressive energy, world-class accessibility.
6
6
 
7
7
  @example
@@ -107,7 +107,7 @@ const isDisabled = $derived(disabled);
107
107
 
108
108
  <style>
109
109
  /* ========================================
110
- BASE BUTTON - Neo-Brutalist Dark
110
+ BASE BUTTON - INFRARED
111
111
  ======================================== */
112
112
  .sx-btn {
113
113
  position: relative;
@@ -134,11 +134,11 @@ const isDisabled = $derived(disabled);
134
134
 
135
135
  /* Focus */
136
136
  .sx-btn:focus-visible {
137
- outline: 2px solid var(--sx-color-cyan);
137
+ outline: 2px solid var(--sx-color-primary);
138
138
  outline-offset: 2px;
139
139
  }
140
140
 
141
- /* Primary focus needs white outline since cyan-on-cyan is invisible */
141
+ /* Primary focus needs white outline since vermilion-on-vermilion is invisible */
142
142
  .sx-btn-primary:focus-visible {
143
143
  outline-color: var(--sx-white);
144
144
  }
@@ -206,38 +206,174 @@ const isDisabled = $derived(disabled);
206
206
  }
207
207
 
208
208
  /* ========================================
209
- VARIANT STYLES - Neo-Brutalist Dark
209
+ VARIANT STYLES - INFRARED
210
210
  ======================================== */
211
211
 
212
- /* Default variant */
212
+ /* Default variant — Neutral 3D panel.
213
+ Same physical language as primary but with neutral
214
+ surface colors. Top-lit bevel + stacked extrusion. */
213
215
  .sx-btn-default {
214
216
  background: var(--sx-color-surface-2);
215
217
  color: var(--sx-color-text);
216
218
  border: 1px solid var(--sx-color-border-strong);
219
+ overflow: hidden;
220
+
221
+ /* 3D extrusion — neutral dark tones */
222
+ box-shadow:
223
+ 0 1px 0 0 rgba(255, 255, 255, 0.04),
224
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
225
+ 0 2px 0 0 rgba(0, 0, 0, 0.15),
226
+ 0 3px 0 0 rgba(0, 0, 0, 0.1),
227
+ 0 5px 10px -3px rgba(0, 0, 0, 0.4);
217
228
  }
218
229
 
219
- /* Primary variant cyan glow */
230
+ /* Top-lit bevel for default */
231
+ .sx-btn-default::before {
232
+ content: '';
233
+ position: absolute;
234
+ inset: 0;
235
+ border-radius: inherit;
236
+ pointer-events: none;
237
+ z-index: 1;
238
+ background:
239
+ linear-gradient(
240
+ 180deg,
241
+ rgba(255, 255, 255, 0.06) 0%,
242
+ rgba(255, 255, 255, 0.02) 35%,
243
+ transparent 50%,
244
+ rgba(0, 0, 0, 0.08) 100%
245
+ );
246
+ }
247
+
248
+ .sx-btn-default:hover:not(:disabled) {
249
+ transform: translateY(-2px);
250
+ border-color: var(--sx-color-border-hover);
251
+ box-shadow:
252
+ 0 1px 0 0 rgba(255, 255, 255, 0.05),
253
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
254
+ 0 2px 0 0 rgba(0, 0, 0, 0.15),
255
+ 0 3px 0 0 rgba(0, 0, 0, 0.1),
256
+ 0 4px 0 0 rgba(0, 0, 0, 0.06),
257
+ 0 8px 16px -3px rgba(0, 0, 0, 0.5);
258
+ }
259
+
260
+ .sx-btn-default:active:not(:disabled) {
261
+ transform: translateY(1px);
262
+ box-shadow:
263
+ 0 1px 0 0 rgba(0, 0, 0, 0.1),
264
+ 0 1px 3px -1px rgba(0, 0, 0, 0.2);
265
+ transition: transform 60ms ease, box-shadow 60ms ease;
266
+ }
267
+
268
+ /* Primary variant — INFRARED Forge.
269
+ Multi-color gradient surface (vermilion → brass → teal) that
270
+ drifts slowly. 3D extruded depth via stacked box-shadows.
271
+ Top-lit bevel highlight via ::before. Grain texture via ::after.
272
+ Traveling border-light sweep on hover. */
220
273
  .sx-btn-primary {
221
- background: var(--sx-color-cyan);
274
+ background:
275
+ linear-gradient(
276
+ 135deg,
277
+ #FF6B35 0%,
278
+ #E05520 20%,
279
+ #C8A84E 50%,
280
+ #8B8B3D 80%,
281
+ #FF6B35 100%
282
+ );
283
+ background-size: 300% 300%;
222
284
  color: var(--sx-color-text-inverse);
223
285
  border: none;
224
- font-weight: 600;
286
+ font-weight: 700;
287
+ letter-spacing: 0.3px;
288
+ overflow: hidden;
289
+ isolation: isolate;
290
+ animation: sx-forge-drift 8s ease-in-out infinite;
291
+
292
+ /* 3D extrusion — stacked shadows create physical depth */
293
+ box-shadow:
294
+ 0 1px 0 0 rgba(255, 140, 90, 0.4),
295
+ 0 2px 0 0 #A63D10,
296
+ 0 3px 0 0 #8B3210,
297
+ 0 4px 0 0 #702810,
298
+ 0 6px 12px -2px rgba(0, 0, 0, 0.5),
299
+ 0 0 16px -4px rgba(255, 107, 53, 0.3);
300
+ }
301
+
302
+ /* Top-lit bevel — light source from above */
303
+ .sx-btn-primary::before {
304
+ content: '';
305
+ position: absolute;
306
+ inset: 0;
307
+ border-radius: inherit;
308
+ pointer-events: none;
309
+ z-index: 1;
310
+ background:
311
+ linear-gradient(
312
+ 180deg,
313
+ rgba(255, 255, 255, 0.25) 0%,
314
+ rgba(255, 255, 255, 0.08) 30%,
315
+ transparent 50%,
316
+ rgba(0, 0, 0, 0.15) 100%
317
+ );
318
+ }
319
+
320
+ /* Grain texture — SVG feTurbulence noise at low opacity */
321
+ .sx-btn-primary::after {
322
+ content: '';
323
+ position: absolute;
324
+ inset: 0;
325
+ border-radius: inherit;
326
+ pointer-events: none;
327
+ z-index: 2;
328
+ opacity: 0.08;
329
+ mix-blend-mode: overlay;
330
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
331
+ }
332
+
333
+ /* Gradient drift — visible color shift across the surface */
334
+ @keyframes sx-forge-drift {
335
+ 0%, 100% { background-position: 0% 50%; }
336
+ 25% { background-position: 100% 0%; }
337
+ 50% { background-position: 100% 100%; }
338
+ 75% { background-position: 0% 100%; }
225
339
  }
226
340
 
227
341
  .sx-btn-primary:hover:not(:disabled) {
228
- transform: translateY(-2px);
229
- box-shadow: var(--sx-shadow-glow-cyan);
342
+ transform: translateY(-3px);
343
+ animation: sx-forge-drift 5s ease-in-out infinite;
344
+
345
+ /* Lift increases the extrusion depth */
346
+ box-shadow:
347
+ 0 1px 0 0 rgba(255, 140, 90, 0.5),
348
+ 0 2px 0 0 #A63D10,
349
+ 0 3px 0 0 #8B3210,
350
+ 0 4px 0 0 #702810,
351
+ 0 5px 0 0 #5A2010,
352
+ 0 6px 0 0 #451810,
353
+ 0 10px 20px -3px rgba(0, 0, 0, 0.6),
354
+ 0 0 28px -4px rgba(255, 107, 53, 0.5);
230
355
  }
231
356
 
357
+ /* Active — press into the surface, collapse depth */
232
358
  .sx-btn-primary:active:not(:disabled) {
233
- transform: translateY(0);
234
- box-shadow: var(--sx-shadow-sm);
359
+ transform: translateY(2px);
360
+ box-shadow:
361
+ 0 1px 0 0 #8B3210,
362
+ 0 2px 4px -1px rgba(0, 0, 0, 0.4),
363
+ 0 0 8px -3px rgba(255, 107, 53, 0.2);
364
+ transition: transform 60ms ease, box-shadow 60ms ease;
365
+ }
366
+
367
+ .sx-btn-primary:disabled {
368
+ animation-play-state: paused;
235
369
  }
236
370
 
237
- /* Ghost variant — transparent, subtle */
371
+ /* Ghost variant — Flat at rest, materializes on hover.
372
+ Rises out of the surface with a thin extrusion when
373
+ you reach for it. Stays part of the physical language. */
238
374
  .sx-btn-ghost {
239
375
  background: transparent;
240
- border: none;
376
+ border: 1px solid transparent;
241
377
  color: var(--sx-color-text-secondary);
242
378
  box-shadow: none;
243
379
  }
@@ -245,33 +381,86 @@ const isDisabled = $derived(disabled);
245
381
  .sx-btn-ghost:hover:not(:disabled) {
246
382
  background: var(--sx-color-surface-2);
247
383
  color: var(--sx-color-text);
248
- transform: none;
249
- box-shadow: none;
384
+ border-color: var(--sx-color-border);
385
+ transform: translateY(-1px);
386
+
387
+ /* Materializes — thin extrusion appears */
388
+ box-shadow:
389
+ 0 1px 0 0 rgba(255, 255, 255, 0.03),
390
+ 0 1px 0 0 rgba(0, 0, 0, 0.15),
391
+ 0 2px 0 0 rgba(0, 0, 0, 0.08),
392
+ 0 3px 6px -2px rgba(0, 0, 0, 0.25);
250
393
  }
251
394
 
252
395
  .sx-btn-ghost:active:not(:disabled) {
253
396
  background: var(--sx-color-surface-2);
254
397
  transform: translateY(0);
255
- box-shadow: none;
398
+ box-shadow:
399
+ 0 1px 0 0 rgba(0, 0, 0, 0.08),
400
+ 0 1px 2px -1px rgba(0, 0, 0, 0.15);
401
+ transition: transform 60ms ease, box-shadow 60ms ease;
256
402
  }
257
403
 
258
- /* Danger variant — red glow */
404
+ /* Danger variant — Dark crimson surface, light text.
405
+ Red enough to read as danger, dark enough to not
406
+ overwhelm. Light text for readability. */
259
407
  .sx-btn-danger {
260
- background: var(--sx-color-red-hover);
261
- color: var(--sx-color-red);
262
- border: 1px solid rgba(255, 59, 59, 0.2);
408
+ background: #3A1010;
409
+ color: var(--sx-color-text);
410
+ border: 1px solid rgba(220, 38, 38, 0.3);
411
+ overflow: hidden;
412
+
413
+ /* 3D extrusion — deep crimson tones */
414
+ box-shadow:
415
+ 0 1px 0 0 rgba(220, 60, 60, 0.12),
416
+ 0 2px 0 0 #2A0808,
417
+ 0 3px 0 0 #1E0505,
418
+ 0 4px 0 0 #140303,
419
+ 0 6px 12px -2px rgba(0, 0, 0, 0.5),
420
+ 0 0 12px -4px rgba(220, 38, 38, 0.2);
421
+ }
422
+
423
+ /* Top-lit bevel for danger — red-tinted highlight */
424
+ .sx-btn-danger::before {
425
+ content: '';
426
+ position: absolute;
427
+ inset: 0;
428
+ border-radius: inherit;
429
+ pointer-events: none;
430
+ z-index: 1;
431
+ background:
432
+ linear-gradient(
433
+ 180deg,
434
+ rgba(220, 60, 60, 0.12) 0%,
435
+ rgba(255, 255, 255, 0.04) 25%,
436
+ transparent 50%,
437
+ rgba(0, 0, 0, 0.15) 100%
438
+ );
263
439
  }
264
440
 
265
441
  .sx-btn-danger:hover:not(:disabled) {
266
- background: rgba(255, 59, 59, 0.2);
267
442
  transform: translateY(-2px);
268
- box-shadow: var(--sx-shadow-glow-red);
269
- border-color: rgba(255, 59, 59, 0.4);
443
+ background: #451212;
444
+ border-color: rgba(220, 38, 38, 0.45);
445
+
446
+ box-shadow:
447
+ 0 1px 0 0 rgba(220, 60, 60, 0.18),
448
+ 0 2px 0 0 #2A0808,
449
+ 0 3px 0 0 #1E0505,
450
+ 0 4px 0 0 #140303,
451
+ 0 5px 0 0 #0C0202,
452
+ 0 9px 18px -3px rgba(0, 0, 0, 0.6),
453
+ 0 0 22px -4px rgba(220, 38, 38, 0.3);
270
454
  }
271
455
 
272
456
  .sx-btn-danger:active:not(:disabled) {
273
- transform: translateY(0);
274
- box-shadow: var(--sx-shadow-sm);
457
+ transform: translateY(2px);
458
+ background: #2A0808;
459
+ box-shadow:
460
+ 0 1px 0 0 #1E0505,
461
+ 0 2px 4px -1px rgba(0, 0, 0, 0.4),
462
+ 0 0 6px -3px rgba(220, 38, 38, 0.12);
463
+ transition: transform 60ms ease, box-shadow 60ms ease;
275
464
  }
276
465
 
277
466
  /* ========================================
@@ -282,7 +471,7 @@ const isDisabled = $derived(disabled);
282
471
  align-items: center;
283
472
  gap: var(--sx-space-2);
284
473
  position: relative;
285
- z-index: 1;
474
+ z-index: 3;
286
475
  }
287
476
 
288
477
  .sx-btn-icon {
@@ -302,16 +491,18 @@ const isDisabled = $derived(disabled);
302
491
  border-radius: var(--sx-radius-sm);
303
492
  }
304
493
 
305
- /* Shortcut on primary: white text on darker translucent bg */
494
+ /* Shortcut on primary: frosted inset against the multi-color fill */
306
495
  .sx-btn-primary .sx-btn-shortcut {
307
- background: rgba(0, 0, 0, 0.3);
308
- color: var(--sx-white);
496
+ background: rgba(0, 0, 0, 0.25);
497
+ color: var(--sx-color-text-inverse);
498
+ border: 1px solid rgba(255, 255, 255, 0.1);
309
499
  }
310
500
 
311
- /* Shortcut on danger: match the red text */
501
+ /* Shortcut on danger: red-tinted badge */
312
502
  .sx-btn-danger .sx-btn-shortcut {
313
- background: rgba(255, 59, 59, 0.15);
314
- color: var(--sx-color-red);
503
+ background: rgba(220, 38, 38, 0.12);
504
+ color: var(--sx-color-text);
505
+ border: 1px solid rgba(220, 38, 38, 0.15);
315
506
  }
316
507
 
317
508
  /* Shortcut on ghost: subtle */
@@ -335,5 +526,34 @@ const isDisabled = $derived(disabled);
335
526
  .sx-btn:active:not(:disabled) {
336
527
  transform: none;
337
528
  }
529
+
530
+ /* Primary — solid gradient, no drift, simple depth */
531
+ .sx-btn-primary {
532
+ animation: none;
533
+ background: linear-gradient(135deg, #FF6B35, #C8A84E);
534
+ box-shadow:
535
+ 0 2px 0 0 #8B3210,
536
+ 0 4px 8px -2px rgba(0, 0, 0, 0.4);
537
+ }
538
+
539
+ .sx-btn-primary:hover:not(:disabled) {
540
+ box-shadow:
541
+ 0 3px 0 0 #8B3210,
542
+ 0 6px 12px -2px rgba(0, 0, 0, 0.5);
543
+ }
544
+
545
+ /* Default — simple depth */
546
+ .sx-btn-default {
547
+ box-shadow:
548
+ 0 2px 0 0 rgba(0, 0, 0, 0.15),
549
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
550
+ }
551
+
552
+ /* Danger — simple depth */
553
+ .sx-btn-danger {
554
+ box-shadow:
555
+ 0 2px 0 0 #4A0A0A,
556
+ 0 4px 8px -2px rgba(0, 0, 0, 0.3);
557
+ }
338
558
  }
339
559
  </style>
@@ -27,7 +27,7 @@ interface Props extends Omit<HTMLButtonAttributes, 'class'> {
27
27
  /**
28
28
  * Button
29
29
  *
30
- * Neo-Brutalist Dark — Glassmorphism button with glow effects.
30
+ * INFRARED — Glassmorphism button with glow effects.
31
31
  * Clean geometry, expressive energy, world-class accessibility.
32
32
  *
33
33
  * @example
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Tooltip
3
3
 
4
- Neo-Brutalist Dark — Accessible tooltip with configurable placement,
4
+ INFRARED — Accessible tooltip with configurable placement,
5
5
  keyboard support, hover/focus triggers, and arrow indicator.
6
6
  Uses fixed positioning with smart viewport-aware flipping.
7
7
 
@@ -187,13 +187,21 @@ function positionTooltip() {
187
187
  padding: var(--sx-space-1-5) var(--sx-space-3);
188
188
  background: var(--sx-color-surface-3);
189
189
  border: 1px solid var(--sx-color-border-strong);
190
+ border-top-color: rgba(255, 255, 255, 0.06);
190
191
  border-radius: var(--sx-radius-sm);
191
192
  font-family: var(--sx-font-body);
192
193
  font-size: var(--sx-text-xs);
193
194
  font-weight: 500;
194
195
  color: var(--sx-color-text);
195
196
  line-height: var(--sx-leading-normal);
196
- box-shadow: var(--sx-shadow-lg);
197
+ box-shadow:
198
+ /* Thin 3D extrusion */
199
+ 0 1px 0 0 rgba(0, 0, 0, 0.2),
200
+ 0 2px 0 0 rgba(0, 0, 0, 0.1),
201
+ /* Ambient shadow */
202
+ 0 4px 12px -2px rgba(0, 0, 0, 0.4),
203
+ /* Subtle warm edge glow */
204
+ 0 0 8px -4px rgba(255, 107, 53, 0.1);
197
205
  pointer-events: none;
198
206
  animation: sx-tooltip-in 150ms var(--sx-ease-out) both;
199
207
  word-wrap: break-word;
@@ -18,7 +18,7 @@ interface Props {
18
18
  /**
19
19
  * Tooltip
20
20
  *
21
- * Neo-Brutalist Dark — Accessible tooltip with configurable placement,
21
+ * INFRARED — Accessible tooltip with configurable placement,
22
22
  * keyboard support, hover/focus triggers, and arrow indicator.
23
23
  * Uses fixed positioning with smart viewport-aware flipping.
24
24
  *