@salmexio/ui 0.3.1 → 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 +96 -93
  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 -102
  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 +88 -154
  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 -103
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +136 -177
  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 +148 -164
  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 -40
  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 +410 -181
  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 +94 -178
  75. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  76. package/dist/primitives/Badge/Badge.svelte +85 -223
  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 +138 -208
  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 +200 -259
  92. package/package.json +5 -5
  93. package/dist/windowing/Window/Window.svelte +0 -602
  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 -410
  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,302 +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
-
128
- /* Bold 3D effect - stronger than original Win2K */
129
- box-shadow:
130
- /* Top-left highlight */
131
- inset 2px 2px 0 rgb(var(--salmex-button-highlight)),
132
- inset 3px 3px 0 rgb(var(--salmex-button-light)),
133
- /* Bottom-right shadow */
134
- inset -2px -2px 0 rgb(var(--salmex-button-dark-edge)),
135
- inset -3px -3px 0 rgb(var(--salmex-button-shadow)),
136
- /* Outer bold border */
137
- 0 0 0 2px rgb(var(--salmex-border-dark)),
138
- /* Flat shadow - Basquiat style */
139
- 4px 4px 0 rgb(0 0 0 / 0.25);
140
-
141
- transition: all var(--salmex-transition-fast);
142
- text-transform: uppercase;
143
- 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);
144
133
  }
145
134
 
146
- /* Focus - use global yellow ring (visible in light and dark) */
147
- .salmex-btn:focus-visible {
148
- outline: none;
149
- box-shadow:
150
- inset 2px 2px 0 rgb(var(--salmex-button-highlight)),
151
- inset 3px 3px 0 rgb(var(--salmex-button-light)),
152
- inset -2px -2px 0 rgb(var(--salmex-button-dark-edge)),
153
- inset -3px -3px 0 rgb(var(--salmex-button-shadow)),
154
- 0 0 0 2px rgb(var(--salmex-border-dark)),
155
- 4px 4px 0 rgb(0 0 0 / 0.25),
156
- 0 0 0 2px rgb(var(--salmex-midnight-black)),
157
- 0 0 0 5px rgb(var(--salmex-crown-yellow));
135
+ /* Focus */
136
+ .sx-btn:focus-visible {
137
+ outline: 2px solid var(--sx-color-cyan);
138
+ outline-offset: 2px;
158
139
  }
159
140
 
160
- :global([data-theme='dark']) .salmex-btn:focus-visible {
161
- box-shadow:
162
- inset 2px 2px 0 rgb(var(--salmex-button-highlight)),
163
- inset 3px 3px 0 rgb(var(--salmex-button-light)),
164
- inset -2px -2px 0 rgb(var(--salmex-button-dark-edge)),
165
- inset -3px -3px 0 rgb(var(--salmex-button-shadow)),
166
- 0 0 0 2px rgb(var(--salmex-border-dark)),
167
- 4px 4px 0 rgb(0 0 0 / 0.25),
168
- 0 0 0 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);
169
144
  }
170
145
 
171
- /* Hover state - energetic highlight */
172
- .salmex-btn:hover:not(:disabled) {
173
- background: rgb(var(--salmex-button-light));
174
- transform: translateY(-1px);
175
- box-shadow:
176
- inset 2px 2px 0 rgb(var(--salmex-button-highlight)),
177
- inset 3px 3px 0 rgb(var(--salmex-button-light)),
178
- inset -2px -2px 0 rgb(var(--salmex-button-dark-edge)),
179
- inset -3px -3px 0 rgb(var(--salmex-button-shadow)),
180
- 0 0 0 2px rgb(var(--salmex-border-dark)),
181
- 5px 5px 0 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);
182
151
  }
183
152
 
184
- /* Active (pressed) state - inverted shadow */
185
- .salmex-btn:active:not(:disabled) {
186
- box-shadow:
187
- /* Inverted shadows */
188
- inset -2px -2px 0 rgb(var(--salmex-button-highlight)),
189
- inset -3px -3px 0 rgb(var(--salmex-button-light)),
190
- inset 2px 2px 0 rgb(var(--salmex-button-dark-edge)),
191
- inset 3px 3px 0 rgb(var(--salmex-button-shadow)),
192
- 0 0 0 2px rgb(var(--salmex-border-dark)),
193
- 2px 2px 0 rgb(0 0 0 / 0.3);
194
-
195
- /* Shift down-right for pressed effect */
196
- transform: translate(2px, 2px);
153
+ /* Active (pressed) state */
154
+ .sx-btn:active:not(:disabled) {
155
+ transform: translateY(0);
156
+ box-shadow: var(--sx-shadow-sm);
197
157
  }
198
158
 
199
159
  /* Disabled state */
200
- .salmex-btn:disabled {
160
+ .sx-btn:disabled {
201
161
  opacity: 0.5;
202
162
  cursor: not-allowed;
203
- color: rgb(var(--salmex-text-disabled));
204
- filter: grayscale(0.5);
163
+ color: var(--sx-color-text-disabled);
205
164
  }
206
165
 
207
166
  /* ========================================
208
167
  SIZE VARIANTS
209
168
  ======================================== */
210
- .salmex-btn-sm {
169
+ .sx-btn-sm {
211
170
  height: 28px;
212
- padding: 0 var(--salmex-space-3);
213
- font-size: var(--salmex-font-size-xs);
171
+ padding: 0 var(--sx-space-2);
172
+ font-size: var(--sx-text-xs);
214
173
  }
215
174
 
216
- .salmex-btn-md {
175
+ .sx-btn-md {
217
176
  height: 36px;
218
- padding: 0 var(--salmex-space-5);
219
- font-size: var(--salmex-font-size-base);
177
+ padding: 0 var(--sx-space-4);
178
+ font-size: var(--sx-text-sm);
220
179
  }
221
180
 
222
- .salmex-btn-lg {
181
+ .sx-btn-lg {
223
182
  height: 44px;
224
- padding: 0 var(--salmex-space-6);
225
- font-size: var(--salmex-font-size-md);
183
+ padding: 0 var(--sx-space-5);
184
+ font-size: var(--sx-text-base);
226
185
  }
227
186
 
228
187
  /* Icon-only variants */
229
- .salmex-btn-icon-only.salmex-btn-sm {
188
+ .sx-btn-icon-only.sx-btn-sm {
230
189
  width: 28px;
231
190
  padding: 0;
232
191
  }
233
192
 
234
- .salmex-btn-icon-only.salmex-btn-md {
193
+ .sx-btn-icon-only.sx-btn-md {
235
194
  width: 36px;
236
195
  padding: 0;
237
196
  }
238
197
 
239
- .salmex-btn-icon-only.salmex-btn-lg {
198
+ .sx-btn-icon-only.sx-btn-lg {
240
199
  width: 44px;
241
200
  padding: 0;
242
201
  }
243
202
 
244
203
  /* Full width */
245
- .salmex-btn-full-width {
204
+ .sx-btn-full-width {
246
205
  width: 100%;
247
206
  }
248
207
 
249
208
  /* ========================================
250
- VARIANT STYLES - Neo-Expressionist
209
+ VARIANT STYLES - Neo-Brutalist Dark
251
210
  ======================================== */
252
-
253
- /* Default variant - bold canvas */
254
- .salmex-btn-default {
255
- color: rgb(var(--salmex-text-primary));
256
- }
257
211
 
258
- /* Primary variant - electric blue with yellow accent */
259
- .salmex-btn-primary {
260
- background: linear-gradient(135deg,
261
- rgb(var(--salmex-electric-blue)),
262
- rgb(var(--salmex-titlebar-bold))
263
- );
264
- color: rgb(var(--salmex-chalk-white));
265
- font-weight: 900;
266
-
267
- box-shadow:
268
- inset 2px 2px 0 rgba(255, 255, 255, 0.3),
269
- inset 3px 3px 0 rgba(255, 255, 255, 0.15),
270
- inset -2px -2px 0 rgba(0, 0, 0, 0.4),
271
- inset -3px -3px 0 rgba(0, 0, 0, 0.2),
272
- 0 0 0 2px rgb(var(--salmex-border-dark)),
273
- 4px 4px 0 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);
274
217
  }
275
218
 
276
- /* Yellow accent underline on primary */
277
- .salmex-btn-primary::after {
278
- content: '';
279
- position: absolute;
280
- bottom: 4px;
281
- left: 10%;
282
- width: 80%;
283
- height: 2px;
284
- background: rgb(var(--salmex-crown-yellow));
285
- 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;
286
225
  }
287
226
 
288
- .salmex-btn-primary:hover:not(:disabled) {
289
- background: linear-gradient(135deg,
290
- rgb(var(--salmex-primary-light)),
291
- rgb(var(--salmex-electric-blue))
292
- );
293
- transform: translateY(-1px);
294
- box-shadow:
295
- inset 2px 2px 0 rgba(255, 255, 255, 0.3),
296
- inset 3px 3px 0 rgba(255, 255, 255, 0.15),
297
- inset -2px -2px 0 rgba(0, 0, 0, 0.4),
298
- inset -3px -3px 0 rgba(0, 0, 0, 0.2),
299
- 0 0 0 2px rgb(var(--salmex-border-dark)),
300
- 5px 5px 0 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);
301
230
  }
302
231
 
303
- .salmex-btn-primary:active:not(:disabled) {
304
- transform: translate(2px, 2px);
305
- box-shadow:
306
- inset -2px -2px 0 rgba(255, 255, 255, 0.3),
307
- inset -3px -3px 0 rgba(255, 255, 255, 0.15),
308
- inset 2px 2px 0 rgba(0, 0, 0, 0.4),
309
- inset 3px 3px 0 rgba(0, 0, 0, 0.2),
310
- 0 0 0 2px rgb(var(--salmex-border-dark)),
311
- 2px 2px 0 rgb(0 0 0 / 0.3);
232
+ .sx-btn-primary:active:not(:disabled) {
233
+ transform: translateY(0);
234
+ box-shadow: var(--sx-shadow-sm);
312
235
  }
313
236
 
314
- /* Ghost variant — visible border at rest, full 3D bevel on hover */
315
- .salmex-btn-ghost {
237
+ /* Ghost variant — transparent, subtle */
238
+ .sx-btn-ghost {
316
239
  background: transparent;
317
- box-shadow: 0 0 0 2px rgb(var(--salmex-border-dark));
318
- color: rgb(var(--salmex-text-primary));
319
- font-weight: 600;
240
+ border: none;
241
+ color: var(--sx-color-text-secondary);
242
+ box-shadow: none;
320
243
  }
321
244
 
322
- .salmex-btn-ghost:hover:not(:disabled) {
323
- background: rgb(var(--salmex-button-face));
324
- transform: translateY(-1px);
325
- box-shadow:
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);
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;
332
250
  }
333
251
 
334
- .salmex-btn-ghost:active:not(:disabled) {
335
- background: rgb(var(--salmex-button-face));
336
- box-shadow:
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);
252
+ .sx-btn-ghost:active:not(:disabled) {
253
+ background: var(--sx-color-surface-2);
254
+ transform: translateY(0);
255
+ box-shadow: none;
344
256
  }
345
257
 
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));
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);
352
263
  }
353
264
 
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));
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);
358
270
  }
359
271
 
360
- /* Dark mode — more visible yellow underline on primary */
361
- :global([data-theme='dark']) .salmex-btn-primary::after {
362
- opacity: 0.9;
272
+ .sx-btn-danger:active:not(:disabled) {
273
+ transform: translateY(0);
274
+ box-shadow: var(--sx-shadow-sm);
363
275
  }
364
276
 
365
277
  /* ========================================
366
278
  CONTENT & LAYOUT
367
279
  ======================================== */
368
- .salmex-btn-content {
280
+ .sx-btn-content {
369
281
  display: inline-flex;
370
282
  align-items: center;
371
- gap: var(--salmex-space-2);
283
+ gap: var(--sx-space-2);
372
284
  position: relative;
373
285
  z-index: 1;
374
286
  }
375
287
 
376
- .salmex-btn-icon {
288
+ .sx-btn-icon {
377
289
  display: inline-flex;
378
290
  flex-shrink: 0;
379
291
  line-height: 0;
380
292
  }
381
293
 
382
- .salmex-btn-shortcut {
383
- margin-left: var(--salmex-space-3);
294
+ .sx-btn-shortcut {
295
+ margin-left: var(--sx-space-3);
384
296
  font-size: 0.8em;
385
- opacity: 0.8;
386
- font-family: var(--salmex-font-mono);
297
+ opacity: 0.9;
298
+ font-family: var(--sx-font-mono);
387
299
  font-weight: 600;
388
300
  padding: 2px 6px;
389
- background: rgba(0, 0, 0, 0.1);
390
- border-radius: 2px;
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);
391
321
  }
392
322
 
393
323
  /* ========================================
394
324
  REDUCED MOTION
395
325
  ======================================== */
396
326
  @media (prefers-reduced-motion: reduce) {
397
- .salmex-btn {
327
+ .sx-btn {
398
328
  transition: none;
399
329
  }
400
-
401
- .salmex-btn:hover:not(:disabled) {
330
+
331
+ .sx-btn:hover:not(:disabled) {
402
332
  transform: none;
403
333
  }
404
-
405
- .salmex-btn:active:not(:disabled) {
334
+
335
+ .sx-btn:active:not(:disabled) {
406
336
  transform: none;
407
337
  }
408
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"}