@salmexio/ui 0.2.0 → 0.3.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 (42) hide show
  1. package/dist/dialogs/ContextMenu/ContextMenu.svelte +521 -0
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +53 -0
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -0
  4. package/dist/dialogs/ContextMenu/index.d.ts +3 -0
  5. package/dist/dialogs/ContextMenu/index.d.ts.map +1 -0
  6. package/dist/dialogs/ContextMenu/index.js +1 -0
  7. package/dist/dialogs/index.d.ts +2 -0
  8. package/dist/dialogs/index.d.ts.map +1 -1
  9. package/dist/dialogs/index.js +1 -0
  10. package/dist/feedback/Alert/Alert.svelte +1 -62
  11. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  12. package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -1
  13. package/dist/forms/Select/Select.svelte +883 -0
  14. package/dist/forms/Select/Select.svelte.d.ts +68 -0
  15. package/dist/forms/Select/Select.svelte.d.ts.map +1 -0
  16. package/dist/forms/Select/index.d.ts +3 -0
  17. package/dist/forms/Select/index.d.ts.map +1 -0
  18. package/dist/forms/Select/index.js +1 -0
  19. package/dist/forms/index.d.ts +2 -0
  20. package/dist/forms/index.d.ts.map +1 -1
  21. package/dist/forms/index.js +1 -0
  22. package/dist/layout/Card/Card.svelte +29 -169
  23. package/dist/layout/Card/Card.svelte.d.ts +3 -9
  24. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  25. package/dist/navigation/CommandPalette/CommandPalette.svelte +574 -0
  26. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +47 -0
  27. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -0
  28. package/dist/navigation/CommandPalette/index.d.ts +3 -0
  29. package/dist/navigation/CommandPalette/index.d.ts.map +1 -0
  30. package/dist/navigation/CommandPalette/index.js +1 -0
  31. package/dist/navigation/index.d.ts +2 -0
  32. package/dist/navigation/index.d.ts.map +1 -1
  33. package/dist/navigation/index.js +1 -0
  34. package/dist/primitives/Badge/Badge.svelte +45 -9
  35. package/dist/primitives/Badge/Badge.svelte.d.ts +0 -2
  36. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  37. package/dist/primitives/Button/Button.svelte +40 -14
  38. package/dist/primitives/Button/Button.svelte.d.ts +1 -1
  39. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  40. package/dist/styles/tokens.css +4 -4
  41. package/dist/windowing/Window/Window.svelte +3 -3
  42. package/package.json +1 -1
@@ -20,8 +20,6 @@ interface Props {
20
20
  status?: BadgeStatus;
21
21
  /** Size */
22
22
  size?: BadgeSize;
23
- /** Pill shape (fully rounded) — we use minimal radius by default */
24
- pill?: boolean;
25
23
  /** Dot-only indicator (no text), use with aria-label for a11y */
26
24
  dot?: boolean;
27
25
  /** Optional icon before label */
@@ -37,7 +35,6 @@ interface Props {
37
35
  let {
38
36
  status = 'neutral',
39
37
  size = 'md',
40
- pill = false,
41
38
  dot = false,
42
39
  icon,
43
40
  class: className = '',
@@ -66,7 +63,6 @@ let {
66
63
  'salmex-badge',
67
64
  `salmex-badge-${size}`,
68
65
  `salmex-badge-${status}`,
69
- pill && 'salmex-badge-pill',
70
66
  status === 'primary' && 'salmex-badge-has-accent',
71
67
  className
72
68
  )}
@@ -99,12 +95,8 @@ let {
99
95
  box-shadow: var(--salmex-shadow-sm);
100
96
  }
101
97
 
102
- .salmex-badge-pill {
103
- border-radius: 9999px;
104
- }
105
-
106
98
  /* Stay sharp — minimal radius, Basquiat style */
107
- .salmex-badge:not(.salmex-badge-pill) {
99
+ .salmex-badge:not(.salmex-badge-dot) {
108
100
  border-radius: var(--salmex-radius-none);
109
101
  }
110
102
 
@@ -308,6 +300,28 @@ let {
308
300
  box-shadow: var(--salmex-shadow-sm);
309
301
  }
310
302
 
303
+ :global([data-theme='dark']) .salmex-badge-error {
304
+ background: rgb(var(--salmex-street-red) / 0.2);
305
+ color: rgb(var(--salmex-street-red));
306
+ border-color: rgb(var(--salmex-street-red));
307
+ }
308
+
309
+ :global([data-theme='dark']) .salmex-badge-dot.salmex-badge-error {
310
+ background: rgb(var(--salmex-street-red));
311
+ }
312
+
313
+ @media (prefers-color-scheme: dark) {
314
+ :global(:root:not([data-theme='light'])) .salmex-badge-error {
315
+ background: rgb(var(--salmex-street-red) / 0.2);
316
+ color: rgb(var(--salmex-street-red));
317
+ border-color: rgb(var(--salmex-street-red));
318
+ }
319
+
320
+ :global(:root:not([data-theme='light'])) .salmex-badge-dot.salmex-badge-error {
321
+ background: rgb(var(--salmex-street-red));
322
+ }
323
+ }
324
+
311
325
  /* Info — electric blue, flat */
312
326
  .salmex-badge-info {
313
327
  background: rgb(var(--salmex-info) / 0.18);
@@ -322,6 +336,28 @@ let {
322
336
  box-shadow: var(--salmex-shadow-sm);
323
337
  }
324
338
 
339
+ :global([data-theme='dark']) .salmex-badge-info {
340
+ background: rgb(var(--salmex-primary-light) / 0.2);
341
+ color: rgb(var(--salmex-primary-light));
342
+ border-color: rgb(var(--salmex-primary-light));
343
+ }
344
+
345
+ :global([data-theme='dark']) .salmex-badge-dot.salmex-badge-info {
346
+ background: rgb(var(--salmex-primary-light));
347
+ }
348
+
349
+ @media (prefers-color-scheme: dark) {
350
+ :global(:root:not([data-theme='light'])) .salmex-badge-info {
351
+ background: rgb(var(--salmex-primary-light) / 0.2);
352
+ color: rgb(var(--salmex-primary-light));
353
+ border-color: rgb(var(--salmex-primary-light));
354
+ }
355
+
356
+ :global(:root:not([data-theme='light'])) .salmex-badge-dot.salmex-badge-info {
357
+ background: rgb(var(--salmex-primary-light));
358
+ }
359
+ }
360
+
325
361
  /* Outline — transparent, bold border, no inset (flat) */
326
362
  .salmex-badge-outline {
327
363
  background: rgb(var(--salmex-button-face) / 0.5);
@@ -6,8 +6,6 @@ interface Props {
6
6
  status?: BadgeStatus;
7
7
  /** Size */
8
8
  size?: BadgeSize;
9
- /** Pill shape (fully rounded) — we use minimal radius by default */
10
- pill?: boolean;
11
9
  /** Dot-only indicator (no text), use with aria-label for a11y */
12
10
  dot?: boolean;
13
11
  /** Optional icon before label */
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/Badge.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpC,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhG,UAAU,KAAK;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAuDD;;;;;;;;;GASG;AACH,QAAA,MAAM,KAAK,2CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Badge.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/Badge.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpC,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhG,UAAU,KAAK;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAqDD;;;;;;;;;GASG;AACH,QAAA,MAAM,KAAK,2CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
@@ -21,7 +21,7 @@ import type { HTMLButtonAttributes } from 'svelte/elements';
21
21
  import { cn } from '../../utils/cn.js';
22
22
 
23
23
  type ButtonSize = 'sm' | 'md' | 'lg';
24
- type ButtonVariant = 'default' | 'primary' | 'flat';
24
+ type ButtonVariant = 'default' | 'primary' | 'ghost';
25
25
 
26
26
  interface Props extends Omit<HTMLButtonAttributes, 'class'> {
27
27
  /** Visual variant of the button */
@@ -311,29 +311,55 @@ const isDisabled = $derived(disabled);
311
311
  2px 2px 0 rgb(0 0 0 / 0.3);
312
312
  }
313
313
 
314
- /* Flat variant - minimal but bold on interaction */
315
- .salmex-btn-flat {
314
+ /* Ghost variant visible border at rest, full 3D bevel on hover */
315
+ .salmex-btn-ghost {
316
316
  background: transparent;
317
- box-shadow: none;
317
+ box-shadow: 0 0 0 2px rgb(var(--salmex-border-dark));
318
318
  color: rgb(var(--salmex-text-primary));
319
319
  font-weight: 600;
320
320
  }
321
321
 
322
- .salmex-btn-flat:hover:not(:disabled) {
323
- background: rgb(var(--salmex-hover-layer) / 0.15);
322
+ .salmex-btn-ghost:hover:not(:disabled) {
323
+ background: rgb(var(--salmex-button-face));
324
+ transform: translateY(-1px);
324
325
  box-shadow:
325
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
326
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
327
- 0 0 0 1px rgb(var(--salmex-border-light));
328
- color: rgb(var(--salmex-electric-blue));
326
+ inset 2px 2px 0 rgb(var(--salmex-button-highlight)),
327
+ inset 3px 3px 0 rgb(var(--salmex-button-light)),
328
+ inset -2px -2px 0 rgb(var(--salmex-button-dark-edge)),
329
+ inset -3px -3px 0 rgb(var(--salmex-button-shadow)),
330
+ 0 0 0 2px rgb(var(--salmex-border-dark)),
331
+ 4px 4px 0 rgb(0 0 0 / 0.25);
329
332
  }
330
333
 
331
- .salmex-btn-flat:active:not(:disabled) {
334
+ .salmex-btn-ghost:active:not(:disabled) {
332
335
  background: rgb(var(--salmex-button-face));
333
336
  box-shadow:
334
- inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
335
- inset 1px 1px 0 rgb(var(--salmex-button-shadow));
336
- transform: translate(1px, 1px);
337
+ inset -2px -2px 0 rgb(var(--salmex-button-highlight)),
338
+ inset -3px -3px 0 rgb(var(--salmex-button-light)),
339
+ inset 2px 2px 0 rgb(var(--salmex-button-dark-edge)),
340
+ inset 3px 3px 0 rgb(var(--salmex-button-shadow)),
341
+ 0 0 0 2px rgb(var(--salmex-border-dark)),
342
+ 2px 2px 0 rgb(0 0 0 / 0.3);
343
+ transform: translate(2px, 2px);
344
+ }
345
+
346
+ .salmex-btn-ghost:focus-visible {
347
+ outline: none;
348
+ box-shadow:
349
+ 0 0 0 2px rgb(var(--salmex-border-dark)),
350
+ 0 0 0 4px rgb(var(--salmex-midnight-black)),
351
+ 0 0 0 7px rgb(var(--salmex-crown-yellow));
352
+ }
353
+
354
+ :global([data-theme='dark']) .salmex-btn-ghost:focus-visible {
355
+ box-shadow:
356
+ 0 0 0 2px rgb(var(--salmex-border-dark)),
357
+ 0 0 0 5px rgb(var(--salmex-crown-yellow));
358
+ }
359
+
360
+ /* Dark mode — more visible yellow underline on primary */
361
+ :global([data-theme='dark']) .salmex-btn-primary::after {
362
+ opacity: 0.9;
337
363
  }
338
364
 
339
365
  /* ========================================
@@ -1,7 +1,7 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
3
  type ButtonSize = 'sm' | 'md' | 'lg';
4
- type ButtonVariant = 'default' | 'primary' | 'flat';
4
+ type ButtonVariant = 'default' | 'primary' | 'ghost';
5
5
  interface Props extends Omit<HTMLButtonAttributes, 'class'> {
6
6
  /** Visual variant of the button */
7
7
  variant?: ButtonVariant;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,KAAK,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,UAAU,KAAM,SAAQ,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC;IAC1D,mCAAmC;IACnC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yBAAyB;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAkED;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,KAAK,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,UAAU,KAAM,SAAQ,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC;IAC1D,mCAAmC;IACnC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yBAAyB;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAkED;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -184,9 +184,9 @@
184
184
  --salmex-window-surface: 22 22 22;
185
185
  --salmex-titlebar-bold: 0 140 255; /* Brighter blue for dark mode */
186
186
  --salmex-button-face: 32 32 32;
187
- --salmex-button-shadow: 60 60 60;
187
+ --salmex-button-shadow: 50 50 50;
188
188
  --salmex-button-dark-edge: 8 8 8;
189
- --salmex-button-highlight: 80 80 80;
189
+ --salmex-button-highlight: 90 90 90;
190
190
  --salmex-button-light: 50 50 50;
191
191
 
192
192
  /* Text - high contrast */
@@ -238,9 +238,9 @@
238
238
  --salmex-window-surface: 22 22 22;
239
239
  --salmex-titlebar-bold: 0 140 255;
240
240
  --salmex-button-face: 32 32 32;
241
- --salmex-button-shadow: 60 60 60;
241
+ --salmex-button-shadow: 50 50 50;
242
242
  --salmex-button-dark-edge: 8 8 8;
243
- --salmex-button-highlight: 80 80 80;
243
+ --salmex-button-highlight: 90 90 90;
244
244
  --salmex-button-light: 50 50 50;
245
245
  --salmex-text-primary: 255 255 255;
246
246
  --salmex-text-secondary: 200 200 200;
@@ -410,12 +410,12 @@ function handleKeyDown(e: KeyboardEvent) {
410
410
  color: rgb(var(--salmex-text-disabled));
411
411
  }
412
412
 
413
- /* Dark mode */
413
+ /* Dark mode — darker gradient for better text contrast (~5-6:1) */
414
414
  :global([data-theme='dark']) .salmex-win-titlebar {
415
415
  background: linear-gradient(
416
416
  90deg,
417
- rgb(0 100 220),
418
- rgb(0 140 255)
417
+ rgb(0 75 180),
418
+ rgb(0 105 210)
419
419
  );
420
420
  }
421
421
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salmexio/ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Salmex I/O Design System — Win2K-inspired UI component library for Salmex and Salmex I/O products",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",