@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.
- package/README.md +52 -3
- package/dist/dialogs/ContextMenu/ContextMenu.svelte +96 -93
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
- package/dist/dialogs/Modal/Modal.svelte +112 -102
- package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
- package/dist/feedback/Alert/Alert.svelte +115 -221
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
- package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.d.ts +2 -0
- package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.js +1 -0
- package/dist/feedback/Skeleton/Skeleton.svelte +153 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.d.ts +2 -0
- package/dist/feedback/Skeleton/index.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.js +1 -0
- package/dist/feedback/Spinner/Spinner.svelte +88 -154
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/feedback/Toast/Toaster.svelte +431 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast/index.d.ts +4 -0
- package/dist/feedback/Toast/index.d.ts.map +1 -0
- package/dist/feedback/Toast/index.js +2 -0
- package/dist/feedback/Toast/toastStore.d.ts +34 -0
- package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
- package/dist/feedback/Toast/toastStore.js +43 -0
- package/dist/feedback/index.d.ts +4 -0
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/feedback/index.js +3 -0
- package/dist/forms/Checkbox/Checkbox.svelte +82 -103
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +136 -177
- package/dist/forms/Select/Select.svelte.d.ts +1 -1
- package/dist/forms/Slider/Slider.svelte +356 -0
- package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
- package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
- package/dist/forms/Slider/index.d.ts +2 -0
- package/dist/forms/Slider/index.d.ts.map +1 -0
- package/dist/forms/Slider/index.js +1 -0
- package/dist/forms/TextInput/TextInput.svelte +148 -164
- package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
- package/dist/forms/Textarea/Textarea.svelte +615 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
- package/dist/forms/Textarea/index.d.ts +2 -0
- package/dist/forms/Textarea/index.d.ts.map +1 -0
- package/dist/forms/Textarea/index.js +1 -0
- package/dist/forms/Toggle/Toggle.svelte +239 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
- package/dist/forms/Toggle/index.d.ts +2 -0
- package/dist/forms/Toggle/index.d.ts.map +1 -0
- package/dist/forms/Toggle/index.js +1 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +3 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/layout/Card/Card.svelte +64 -40
- package/dist/layout/Card/Card.svelte.d.ts +1 -1
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +71 -71
- package/dist/layout/Container/Container.svelte.d.ts +2 -2
- package/dist/navigation/CommandPalette/CommandPalette.svelte +410 -181
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
- package/dist/navigation/Tabs/Tabs.svelte +94 -178
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte +85 -223
- package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.svelte +138 -208
- package/dist/primitives/Button/Button.svelte.d.ts +3 -3
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.d.ts +2 -0
- package/dist/primitives/Tooltip/index.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.js +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/styles/tokens.css +200 -259
- package/package.json +5 -5
- package/dist/windowing/Window/Window.svelte +0 -602
- package/dist/windowing/Window/Window.svelte.d.ts +0 -65
- package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
- package/dist/windowing/Window/index.d.ts +0 -2
- package/dist/windowing/Window/index.d.ts.map +0 -1
- package/dist/windowing/Window/index.js +0 -1
- package/dist/windowing/WindowManager/WindowManager.svelte +0 -410
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.d.ts +0 -2
- package/dist/windowing/WindowManager/index.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.js +0 -1
- package/dist/windowing/index.d.ts +0 -5
- package/dist/windowing/index.d.ts.map +0 -1
- package/dist/windowing/index.js +0 -3
- package/dist/windowing/windowStore.svelte.d.ts +0 -49
- package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
- package/dist/windowing/windowStore.svelte.js +0 -170
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Button
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
'
|
|
72
|
-
`
|
|
73
|
-
`
|
|
74
|
-
iconOnly && '
|
|
75
|
-
fullWidth && !iconOnly && '
|
|
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="
|
|
83
|
+
<span class="sx-btn-content">
|
|
84
84
|
{#if iconLeft}
|
|
85
|
-
<span class="
|
|
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="
|
|
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="
|
|
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 -
|
|
110
|
+
BASE BUTTON - Neo-Brutalist Dark
|
|
111
111
|
======================================== */
|
|
112
|
-
.
|
|
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(--
|
|
118
|
-
font-family: var(--
|
|
119
|
-
font-weight:
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
border:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
147
|
-
.
|
|
148
|
-
outline:
|
|
149
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
172
|
-
.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
|
185
|
-
.
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
.
|
|
160
|
+
.sx-btn:disabled {
|
|
201
161
|
opacity: 0.5;
|
|
202
162
|
cursor: not-allowed;
|
|
203
|
-
color:
|
|
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
|
-
.
|
|
169
|
+
.sx-btn-sm {
|
|
211
170
|
height: 28px;
|
|
212
|
-
padding: 0 var(--
|
|
213
|
-
font-size: var(--
|
|
171
|
+
padding: 0 var(--sx-space-2);
|
|
172
|
+
font-size: var(--sx-text-xs);
|
|
214
173
|
}
|
|
215
174
|
|
|
216
|
-
.
|
|
175
|
+
.sx-btn-md {
|
|
217
176
|
height: 36px;
|
|
218
|
-
padding: 0 var(--
|
|
219
|
-
font-size: var(--
|
|
177
|
+
padding: 0 var(--sx-space-4);
|
|
178
|
+
font-size: var(--sx-text-sm);
|
|
220
179
|
}
|
|
221
180
|
|
|
222
|
-
.
|
|
181
|
+
.sx-btn-lg {
|
|
223
182
|
height: 44px;
|
|
224
|
-
padding: 0 var(--
|
|
225
|
-
font-size: var(--
|
|
183
|
+
padding: 0 var(--sx-space-5);
|
|
184
|
+
font-size: var(--sx-text-base);
|
|
226
185
|
}
|
|
227
186
|
|
|
228
187
|
/* Icon-only variants */
|
|
229
|
-
.
|
|
188
|
+
.sx-btn-icon-only.sx-btn-sm {
|
|
230
189
|
width: 28px;
|
|
231
190
|
padding: 0;
|
|
232
191
|
}
|
|
233
192
|
|
|
234
|
-
.
|
|
193
|
+
.sx-btn-icon-only.sx-btn-md {
|
|
235
194
|
width: 36px;
|
|
236
195
|
padding: 0;
|
|
237
196
|
}
|
|
238
197
|
|
|
239
|
-
.
|
|
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
|
-
.
|
|
204
|
+
.sx-btn-full-width {
|
|
246
205
|
width: 100%;
|
|
247
206
|
}
|
|
248
207
|
|
|
249
208
|
/* ========================================
|
|
250
|
-
VARIANT STYLES - Neo-
|
|
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
|
-
/*
|
|
259
|
-
.
|
|
260
|
-
background:
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
/*
|
|
277
|
-
.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
.
|
|
289
|
-
|
|
290
|
-
|
|
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
|
-
.
|
|
304
|
-
transform:
|
|
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 —
|
|
315
|
-
.
|
|
237
|
+
/* Ghost variant — transparent, subtle */
|
|
238
|
+
.sx-btn-ghost {
|
|
316
239
|
background: transparent;
|
|
317
|
-
|
|
318
|
-
color:
|
|
319
|
-
|
|
240
|
+
border: none;
|
|
241
|
+
color: var(--sx-color-text-secondary);
|
|
242
|
+
box-shadow: none;
|
|
320
243
|
}
|
|
321
244
|
|
|
322
|
-
.
|
|
323
|
-
background:
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
-
.
|
|
335
|
-
background:
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
.
|
|
280
|
+
.sx-btn-content {
|
|
369
281
|
display: inline-flex;
|
|
370
282
|
align-items: center;
|
|
371
|
-
gap: var(--
|
|
283
|
+
gap: var(--sx-space-2);
|
|
372
284
|
position: relative;
|
|
373
285
|
z-index: 1;
|
|
374
286
|
}
|
|
375
287
|
|
|
376
|
-
.
|
|
288
|
+
.sx-btn-icon {
|
|
377
289
|
display: inline-flex;
|
|
378
290
|
flex-shrink: 0;
|
|
379
291
|
line-height: 0;
|
|
380
292
|
}
|
|
381
293
|
|
|
382
|
-
.
|
|
383
|
-
margin-left: var(--
|
|
294
|
+
.sx-btn-shortcut {
|
|
295
|
+
margin-left: var(--sx-space-3);
|
|
384
296
|
font-size: 0.8em;
|
|
385
|
-
opacity: 0.
|
|
386
|
-
font-family: var(--
|
|
297
|
+
opacity: 0.9;
|
|
298
|
+
font-family: var(--sx-font-mono);
|
|
387
299
|
font-weight: 600;
|
|
388
300
|
padding: 2px 6px;
|
|
389
|
-
background:
|
|
390
|
-
border-radius:
|
|
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
|
-
.
|
|
327
|
+
.sx-btn {
|
|
398
328
|
transition: none;
|
|
399
329
|
}
|
|
400
|
-
|
|
401
|
-
.
|
|
330
|
+
|
|
331
|
+
.sx-btn:hover:not(:disabled) {
|
|
402
332
|
transform: none;
|
|
403
333
|
}
|
|
404
|
-
|
|
405
|
-
.
|
|
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
|
-
*
|
|
31
|
-
*
|
|
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;
|
|
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"}
|