@salmexio/ui 0.4.0 → 1.0.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 (110) hide show
  1. package/README.md +52 -3
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
  4. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
  5. package/dist/dialogs/Modal/Modal.svelte +112 -116
  6. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  7. package/dist/feedback/Alert/Alert.svelte +115 -221
  8. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -0
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
  11. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  12. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  13. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  14. package/dist/feedback/ProgressBar/index.js +1 -0
  15. package/dist/feedback/Skeleton/Skeleton.svelte +153 -0
  16. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
  17. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  18. package/dist/feedback/Skeleton/index.d.ts +2 -0
  19. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  20. package/dist/feedback/Skeleton/index.js +1 -0
  21. package/dist/feedback/Spinner/Spinner.svelte +86 -151
  22. package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
  23. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
  24. package/dist/feedback/Toast/Toaster.svelte +431 -0
  25. package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
  26. package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
  27. package/dist/feedback/Toast/index.d.ts +4 -0
  28. package/dist/feedback/Toast/index.d.ts.map +1 -0
  29. package/dist/feedback/Toast/index.js +2 -0
  30. package/dist/feedback/Toast/toastStore.d.ts +34 -0
  31. package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
  32. package/dist/feedback/Toast/toastStore.js +43 -0
  33. package/dist/feedback/index.d.ts +4 -0
  34. package/dist/feedback/index.d.ts.map +1 -1
  35. package/dist/feedback/index.js +3 -0
  36. package/dist/forms/Checkbox/Checkbox.svelte +82 -104
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +137 -179
  39. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  40. package/dist/forms/Slider/Slider.svelte +356 -0
  41. package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
  42. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
  43. package/dist/forms/Slider/index.d.ts +2 -0
  44. package/dist/forms/Slider/index.d.ts.map +1 -0
  45. package/dist/forms/Slider/index.js +1 -0
  46. package/dist/forms/TextInput/TextInput.svelte +151 -167
  47. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  48. package/dist/forms/Textarea/Textarea.svelte +615 -0
  49. package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
  50. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  51. package/dist/forms/Textarea/index.d.ts +2 -0
  52. package/dist/forms/Textarea/index.d.ts.map +1 -0
  53. package/dist/forms/Textarea/index.js +1 -0
  54. package/dist/forms/Toggle/Toggle.svelte +239 -0
  55. package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
  56. package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
  57. package/dist/forms/Toggle/index.d.ts +2 -0
  58. package/dist/forms/Toggle/index.d.ts.map +1 -0
  59. package/dist/forms/Toggle/index.js +1 -0
  60. package/dist/forms/index.d.ts +3 -0
  61. package/dist/forms/index.d.ts.map +1 -1
  62. package/dist/forms/index.js +3 -0
  63. package/dist/index.d.ts +0 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +0 -1
  66. package/dist/layout/Card/Card.svelte +64 -39
  67. package/dist/layout/Card/Card.svelte.d.ts +1 -1
  68. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  69. package/dist/layout/Container/Container.svelte +71 -71
  70. package/dist/layout/Container/Container.svelte.d.ts +2 -2
  71. package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
  72. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
  73. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
  74. package/dist/navigation/Tabs/Tabs.svelte +95 -181
  75. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  76. package/dist/primitives/Badge/Badge.svelte +83 -220
  77. package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
  78. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  79. package/dist/primitives/Button/Button.svelte +144 -195
  80. package/dist/primitives/Button/Button.svelte.d.ts +3 -3
  81. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  82. package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
  83. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
  84. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  85. package/dist/primitives/Tooltip/index.d.ts +2 -0
  86. package/dist/primitives/Tooltip/index.d.ts.map +1 -0
  87. package/dist/primitives/Tooltip/index.js +1 -0
  88. package/dist/primitives/index.d.ts +1 -0
  89. package/dist/primitives/index.d.ts.map +1 -1
  90. package/dist/primitives/index.js +1 -0
  91. package/dist/styles/tokens.css +197 -265
  92. package/package.json +5 -5
  93. package/dist/windowing/Window/Window.svelte +0 -637
  94. package/dist/windowing/Window/Window.svelte.d.ts +0 -65
  95. package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
  96. package/dist/windowing/Window/index.d.ts +0 -2
  97. package/dist/windowing/Window/index.d.ts.map +0 -1
  98. package/dist/windowing/Window/index.js +0 -1
  99. package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
  100. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
  101. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
  102. package/dist/windowing/WindowManager/index.d.ts +0 -2
  103. package/dist/windowing/WindowManager/index.d.ts.map +0 -1
  104. package/dist/windowing/WindowManager/index.js +0 -1
  105. package/dist/windowing/index.d.ts +0 -5
  106. package/dist/windowing/index.d.ts.map +0 -1
  107. package/dist/windowing/index.js +0 -3
  108. package/dist/windowing/windowStore.svelte.d.ts +0 -49
  109. package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
  110. package/dist/windowing/windowStore.svelte.js +0 -170
@@ -1,14 +1,14 @@
1
1
  <!--
2
2
  @component Button
3
-
4
- Win2K × Basquiat - Bold 3D button with neo-expressionist flair.
5
- Raw structure, expressive energy, world-class accessibility.
6
-
3
+
4
+ Neo-Brutalist Dark Glassmorphism button with glow effects.
5
+ Clean geometry, expressive energy, world-class accessibility.
6
+
7
7
  @example
8
8
  <Button variant="default" size="md" onclick={() => handleClick()}>
9
9
  Click me
10
10
  </Button>
11
-
11
+
12
12
  @example
13
13
  <Button variant="primary" disabled>
14
14
  <Icon slot="icon-left" />
@@ -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' | 'ghost';
24
+ type ButtonVariant = 'default' | 'primary' | 'ghost' | 'danger';
25
25
 
26
26
  interface Props extends Omit<HTMLButtonAttributes, 'class'> {
27
27
  /** Visual variant of the button */
@@ -68,11 +68,11 @@ const isDisabled = $derived(disabled);
68
68
  <button
69
69
  {type}
70
70
  class={cn(
71
- 'salmex-btn',
72
- `salmex-btn-${variant}`,
73
- `salmex-btn-${size}`,
74
- iconOnly && 'salmex-btn-icon-only',
75
- fullWidth && !iconOnly && 'salmex-btn-full-width',
71
+ 'sx-btn',
72
+ `sx-btn-${variant}`,
73
+ `sx-btn-${size}`,
74
+ iconOnly && 'sx-btn-icon-only',
75
+ fullWidth && !iconOnly && 'sx-btn-full-width',
76
76
  className
77
77
  )}
78
78
  disabled={isDisabled}
@@ -80,9 +80,9 @@ const isDisabled = $derived(disabled);
80
80
  data-testid={testId}
81
81
  {...restProps}
82
82
  >
83
- <span class="salmex-btn-content">
83
+ <span class="sx-btn-content">
84
84
  {#if iconLeft}
85
- <span class="salmex-btn-icon" aria-hidden="true">
85
+ <span class="sx-btn-icon" aria-hidden="true">
86
86
  {@render iconLeft()}
87
87
  </span>
88
88
  {/if}
@@ -92,13 +92,13 @@ const isDisabled = $derived(disabled);
92
92
  {/if}
93
93
 
94
94
  {#if iconRight}
95
- <span class="salmex-btn-icon" aria-hidden="true">
95
+ <span class="sx-btn-icon" aria-hidden="true">
96
96
  {@render iconRight()}
97
97
  </span>
98
98
  {/if}
99
99
 
100
100
  {#if shortcut}
101
- <span class="salmex-btn-shortcut" aria-label="Keyboard shortcut: {shortcut}">
101
+ <span class="sx-btn-shortcut" aria-label="Keyboard shortcut: {shortcut}">
102
102
  {shortcut}
103
103
  </span>
104
104
  {/if}
@@ -107,283 +107,232 @@ const isDisabled = $derived(disabled);
107
107
 
108
108
  <style>
109
109
  /* ========================================
110
- BASE BUTTON - Basquiat × Win2K 3D
110
+ BASE BUTTON - Neo-Brutalist Dark
111
111
  ======================================== */
112
- .salmex-btn {
112
+ .sx-btn {
113
113
  position: relative;
114
114
  display: inline-flex;
115
115
  align-items: center;
116
116
  justify-content: center;
117
- gap: var(--salmex-space-2);
118
- font-family: var(--salmex-font-system);
119
- font-weight: 700;
117
+ gap: var(--sx-space-2);
118
+ font-family: var(--sx-font-body);
119
+ font-weight: 600;
120
120
  cursor: pointer;
121
121
  user-select: none;
122
122
  -webkit-tap-highlight-color: transparent;
123
-
124
- /* Canvas-like button surface */
125
- background: rgb(var(--salmex-button-face));
126
- border: none;
127
- border-radius: var(--salmex-radius-md);
128
-
129
- /* Bold 3D effect - stronger than original Win2K */
130
- box-shadow:
131
- /* Top-left highlight */
132
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
133
- /* Bottom-right shadow */
134
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
135
- /* Outer bold border */
136
- 0 0 0 2px rgb(var(--salmex-border-dark)),
137
- /* Flat shadow - Basquiat style */
138
- 4px 4px 1px rgb(0 0 0 / 0.25);
139
-
140
- transition: all var(--salmex-transition-fast);
141
- text-transform: uppercase;
142
- letter-spacing: 0.3px;
123
+
124
+ background: var(--sx-color-surface-2);
125
+ border: 1px solid var(--sx-color-border-strong);
126
+ border-radius: var(--sx-radius-md);
127
+ color: var(--sx-color-text);
128
+ box-shadow: var(--sx-shadow-sm);
129
+
130
+ transition: transform var(--sx-transition-fast), box-shadow var(--sx-transition-fast),
131
+ background var(--sx-transition-fast), border-color var(--sx-transition-fast),
132
+ color var(--sx-transition-fast);
143
133
  }
144
134
 
145
- /* Focus - use global yellow ring (visible in light and dark) */
146
- .salmex-btn:focus-visible {
147
- outline: none;
148
- box-shadow:
149
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
150
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
151
- 0 0 0 2px rgb(var(--salmex-border-dark)),
152
- 4px 4px 1px rgb(0 0 0 / 0.25),
153
- 0 0 0 2px rgb(var(--salmex-midnight-black)),
154
- 0 0 2px 4px rgb(var(--salmex-crown-yellow));
135
+ /* Focus */
136
+ .sx-btn:focus-visible {
137
+ outline: 2px solid var(--sx-color-cyan);
138
+ outline-offset: 2px;
155
139
  }
156
140
 
157
- :global([data-theme='dark']) .salmex-btn:focus-visible {
158
- box-shadow:
159
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
160
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
161
- 0 0 0 2px rgb(var(--salmex-border-dark)),
162
- 4px 4px 1px rgb(0 0 0 / 0.25),
163
- 0 0 2px 3px rgb(var(--salmex-crown-yellow));
141
+ /* Primary focus needs white outline since cyan-on-cyan is invisible */
142
+ .sx-btn-primary:focus-visible {
143
+ outline-color: var(--sx-white);
164
144
  }
165
145
 
166
- /* Hover state - energetic highlight */
167
- .salmex-btn:hover:not(:disabled) {
168
- background: rgb(var(--salmex-button-light));
169
- transform: translateY(-1px);
170
- box-shadow:
171
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
172
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
173
- 0 0 0 2px rgb(var(--salmex-border-dark)),
174
- 5px 5px 1px rgb(0 0 0 / 0.3);
146
+ /* Hover state */
147
+ .sx-btn:hover:not(:disabled) {
148
+ transform: translateY(-2px);
149
+ box-shadow: var(--sx-shadow-md);
150
+ border-color: var(--sx-color-border-hover);
175
151
  }
176
152
 
177
- /* Active (pressed) state - inverted shadow */
178
- .salmex-btn:active:not(:disabled) {
179
- box-shadow:
180
- /* Inverted shadows */
181
- inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
182
- inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
183
- 0 0 0 2px rgb(var(--salmex-border-dark)),
184
- 2px 2px 1px rgb(0 0 0 / 0.3);
185
-
186
- /* Shift down-right for pressed effect */
187
- transform: translate(1px, 1px);
153
+ /* Active (pressed) state */
154
+ .sx-btn:active:not(:disabled) {
155
+ transform: translateY(0);
156
+ box-shadow: var(--sx-shadow-sm);
188
157
  }
189
158
 
190
159
  /* Disabled state */
191
- .salmex-btn:disabled {
160
+ .sx-btn:disabled {
192
161
  opacity: 0.5;
193
162
  cursor: not-allowed;
194
- color: rgb(var(--salmex-text-disabled));
195
- filter: grayscale(0.5);
163
+ color: var(--sx-color-text-disabled);
196
164
  }
197
165
 
198
166
  /* ========================================
199
167
  SIZE VARIANTS
200
168
  ======================================== */
201
- .salmex-btn-sm {
202
- height: 24px;
203
- padding: 0 var(--salmex-space-2);
204
- font-size: var(--salmex-font-size-xs);
169
+ .sx-btn-sm {
170
+ height: 28px;
171
+ padding: 0 var(--sx-space-2);
172
+ font-size: var(--sx-text-xs);
205
173
  }
206
174
 
207
- .salmex-btn-md {
208
- height: 32px;
209
- padding: 0 var(--salmex-space-4);
210
- font-size: var(--salmex-font-size-base);
175
+ .sx-btn-md {
176
+ height: 36px;
177
+ padding: 0 var(--sx-space-4);
178
+ font-size: var(--sx-text-sm);
211
179
  }
212
180
 
213
- .salmex-btn-lg {
214
- height: 40px;
215
- padding: 0 var(--salmex-space-5);
216
- font-size: var(--salmex-font-size-md);
181
+ .sx-btn-lg {
182
+ height: 44px;
183
+ padding: 0 var(--sx-space-5);
184
+ font-size: var(--sx-text-base);
217
185
  }
218
186
 
219
187
  /* Icon-only variants */
220
- .salmex-btn-icon-only.salmex-btn-sm {
221
- width: 24px;
188
+ .sx-btn-icon-only.sx-btn-sm {
189
+ width: 28px;
222
190
  padding: 0;
223
191
  }
224
192
 
225
- .salmex-btn-icon-only.salmex-btn-md {
226
- width: 32px;
193
+ .sx-btn-icon-only.sx-btn-md {
194
+ width: 36px;
227
195
  padding: 0;
228
196
  }
229
197
 
230
- .salmex-btn-icon-only.salmex-btn-lg {
231
- width: 40px;
198
+ .sx-btn-icon-only.sx-btn-lg {
199
+ width: 44px;
232
200
  padding: 0;
233
201
  }
234
202
 
235
203
  /* Full width */
236
- .salmex-btn-full-width {
204
+ .sx-btn-full-width {
237
205
  width: 100%;
238
206
  }
239
207
 
240
208
  /* ========================================
241
- VARIANT STYLES - Neo-Expressionist
209
+ VARIANT STYLES - Neo-Brutalist Dark
242
210
  ======================================== */
243
-
244
- /* Default variant - bold canvas */
245
- .salmex-btn-default {
246
- color: rgb(var(--salmex-text-primary));
247
- }
248
211
 
249
- /* Primary variant - electric blue with yellow accent */
250
- .salmex-btn-primary {
251
- background: linear-gradient(135deg,
252
- rgb(var(--salmex-electric-blue)),
253
- rgb(var(--salmex-titlebar-bold))
254
- );
255
- color: rgb(var(--salmex-chalk-white));
256
- font-weight: 900;
257
-
258
- box-shadow:
259
- inset 1px 1px 0 rgba(255, 255, 255, 0.3),
260
- inset -1px -1px 0 rgba(0, 0, 0, 0.4),
261
- 0 0 0 2px rgb(var(--salmex-border-dark)),
262
- 4px 4px 1px rgb(0 0 0 / 0.35);
212
+ /* Default variant */
213
+ .sx-btn-default {
214
+ background: var(--sx-color-surface-2);
215
+ color: var(--sx-color-text);
216
+ border: 1px solid var(--sx-color-border-strong);
263
217
  }
264
218
 
265
- /* Yellow accent underline on primary */
266
- .salmex-btn-primary::after {
267
- content: '';
268
- position: absolute;
269
- bottom: 4px;
270
- left: 10%;
271
- width: 80%;
272
- height: 2px;
273
- background: rgb(var(--salmex-crown-yellow));
274
- opacity: 0.7;
219
+ /* Primary variant cyan glow */
220
+ .sx-btn-primary {
221
+ background: var(--sx-color-cyan);
222
+ color: var(--sx-color-text-inverse);
223
+ border: none;
224
+ font-weight: 600;
275
225
  }
276
226
 
277
- .salmex-btn-primary:hover:not(:disabled) {
278
- background: linear-gradient(135deg,
279
- rgb(var(--salmex-primary-light)),
280
- rgb(var(--salmex-electric-blue))
281
- );
282
- transform: translateY(-1px);
283
- box-shadow:
284
- inset 1px 1px 0 rgba(255, 255, 255, 0.3),
285
- inset -1px -1px 0 rgba(0, 0, 0, 0.4),
286
- 0 0 0 2px rgb(var(--salmex-border-dark)),
287
- 5px 5px 1px rgb(0 0 0 / 0.4);
227
+ .sx-btn-primary:hover:not(:disabled) {
228
+ transform: translateY(-2px);
229
+ box-shadow: var(--sx-shadow-glow-cyan);
288
230
  }
289
231
 
290
- .salmex-btn-primary:active:not(:disabled) {
291
- transform: translate(1px, 1px);
292
- box-shadow:
293
- inset -1px -1px 0 rgba(255, 255, 255, 0.3),
294
- inset 1px 1px 0 rgba(0, 0, 0, 0.4),
295
- 0 0 0 2px rgb(var(--salmex-border-dark)),
296
- 2px 2px 1px rgb(0 0 0 / 0.3);
232
+ .sx-btn-primary:active:not(:disabled) {
233
+ transform: translateY(0);
234
+ box-shadow: var(--sx-shadow-sm);
297
235
  }
298
236
 
299
- /* Ghost variant — visible border at rest, full 3D bevel on hover */
300
- .salmex-btn-ghost {
237
+ /* Ghost variant — transparent, subtle */
238
+ .sx-btn-ghost {
301
239
  background: transparent;
302
- box-shadow: 0 0 0 2px rgb(var(--salmex-border-dark));
303
- color: rgb(var(--salmex-text-primary));
304
- font-weight: 600;
240
+ border: none;
241
+ color: var(--sx-color-text-secondary);
242
+ box-shadow: none;
305
243
  }
306
244
 
307
- .salmex-btn-ghost:hover:not(:disabled) {
308
- background: rgb(var(--salmex-button-face));
309
- transform: translateY(-1px);
310
- box-shadow:
311
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
312
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
313
- 0 0 0 2px rgb(var(--salmex-border-dark)),
314
- 4px 4px 1px rgb(0 0 0 / 0.25);
245
+ .sx-btn-ghost:hover:not(:disabled) {
246
+ background: var(--sx-color-surface-2);
247
+ color: var(--sx-color-text);
248
+ transform: none;
249
+ box-shadow: none;
315
250
  }
316
251
 
317
- .salmex-btn-ghost:active:not(:disabled) {
318
- background: rgb(var(--salmex-button-face));
319
- box-shadow:
320
- inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
321
- inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
322
- 0 0 0 2px rgb(var(--salmex-border-dark)),
323
- 2px 2px 1px rgb(0 0 0 / 0.3);
324
- transform: translate(1px, 1px);
252
+ .sx-btn-ghost:active:not(:disabled) {
253
+ background: var(--sx-color-surface-2);
254
+ transform: translateY(0);
255
+ box-shadow: none;
325
256
  }
326
257
 
327
- .salmex-btn-ghost:focus-visible {
328
- outline: none;
329
- box-shadow:
330
- 0 0 0 2px rgb(var(--salmex-border-dark)),
331
- 0 0 0 2px rgb(var(--salmex-midnight-black)),
332
- 0 0 2px 5px rgb(var(--salmex-crown-yellow));
258
+ /* Danger variant — red glow */
259
+ .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);
333
263
  }
334
264
 
335
- :global([data-theme='dark']) .salmex-btn-ghost:focus-visible {
336
- box-shadow:
337
- 0 0 0 2px rgb(var(--salmex-border-dark)),
338
- 0 0 2px 4px rgb(var(--salmex-crown-yellow));
265
+ .sx-btn-danger:hover:not(:disabled) {
266
+ background: rgba(255, 59, 59, 0.2);
267
+ transform: translateY(-2px);
268
+ box-shadow: var(--sx-shadow-glow-red);
269
+ border-color: rgba(255, 59, 59, 0.4);
339
270
  }
340
271
 
341
- /* Dark mode — more visible yellow underline on primary */
342
- :global([data-theme='dark']) .salmex-btn-primary::after {
343
- opacity: 0.9;
272
+ .sx-btn-danger:active:not(:disabled) {
273
+ transform: translateY(0);
274
+ box-shadow: var(--sx-shadow-sm);
344
275
  }
345
276
 
346
277
  /* ========================================
347
278
  CONTENT & LAYOUT
348
279
  ======================================== */
349
- .salmex-btn-content {
280
+ .sx-btn-content {
350
281
  display: inline-flex;
351
282
  align-items: center;
352
- gap: var(--salmex-space-2);
283
+ gap: var(--sx-space-2);
353
284
  position: relative;
354
285
  z-index: 1;
355
286
  }
356
287
 
357
- .salmex-btn-icon {
288
+ .sx-btn-icon {
358
289
  display: inline-flex;
359
290
  flex-shrink: 0;
360
291
  line-height: 0;
361
292
  }
362
293
 
363
- .salmex-btn-shortcut {
364
- margin-left: var(--salmex-space-3);
294
+ .sx-btn-shortcut {
295
+ margin-left: var(--sx-space-3);
365
296
  font-size: 0.8em;
366
- opacity: 0.8;
367
- font-family: var(--salmex-font-mono);
297
+ opacity: 0.9;
298
+ font-family: var(--sx-font-mono);
368
299
  font-weight: 600;
369
300
  padding: 2px 6px;
370
- background: rgba(0, 0, 0, 0.1);
371
- border-radius: var(--salmex-radius-sm);
301
+ background: var(--sx-color-surface-3);
302
+ border-radius: var(--sx-radius-sm);
303
+ }
304
+
305
+ /* Shortcut on primary: white text on darker translucent bg */
306
+ .sx-btn-primary .sx-btn-shortcut {
307
+ background: rgba(0, 0, 0, 0.3);
308
+ color: var(--sx-white);
309
+ }
310
+
311
+ /* Shortcut on danger: match the red text */
312
+ .sx-btn-danger .sx-btn-shortcut {
313
+ background: rgba(255, 59, 59, 0.15);
314
+ color: var(--sx-color-red);
315
+ }
316
+
317
+ /* Shortcut on ghost: subtle */
318
+ .sx-btn-ghost .sx-btn-shortcut {
319
+ background: var(--sx-color-surface-2);
320
+ color: var(--sx-color-text-secondary);
372
321
  }
373
322
 
374
323
  /* ========================================
375
324
  REDUCED MOTION
376
325
  ======================================== */
377
326
  @media (prefers-reduced-motion: reduce) {
378
- .salmex-btn {
327
+ .sx-btn {
379
328
  transition: none;
380
329
  }
381
-
382
- .salmex-btn:hover:not(:disabled) {
330
+
331
+ .sx-btn:hover:not(:disabled) {
383
332
  transform: none;
384
333
  }
385
-
386
- .salmex-btn:active:not(:disabled) {
334
+
335
+ .sx-btn:active:not(:disabled) {
387
336
  transform: none;
388
337
  }
389
338
  }
@@ -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' | 'ghost';
4
+ type ButtonVariant = 'default' | 'primary' | 'ghost' | 'danger';
5
5
  interface Props extends Omit<HTMLButtonAttributes, 'class'> {
6
6
  /** Visual variant of the button */
7
7
  variant?: ButtonVariant;
@@ -27,8 +27,8 @@ interface Props extends Omit<HTMLButtonAttributes, 'class'> {
27
27
  /**
28
28
  * Button
29
29
  *
30
- * Win2K × Basquiat - Bold 3D button with neo-expressionist flair.
31
- * Raw structure, expressive energy, world-class accessibility.
30
+ * Neo-Brutalist Dark Glassmorphism button with glow effects.
31
+ * Clean geometry, expressive energy, world-class accessibility.
32
32
  *
33
33
  * @example
34
34
  * <Button variant="default" size="md" onclick={() => handleClick()}>
@@ -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,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"}
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,GAAG,QAAQ,CAAC;AAEhE,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"}