@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.
- package/README.md +1 -1
- package/dist/dialogs/ContextMenu/ContextMenu.svelte +17 -7
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +1 -1
- package/dist/dialogs/Modal/Modal.svelte +37 -4
- package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
- package/dist/feedback/Alert/Alert.svelte +67 -19
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
- package/dist/feedback/ProgressBar/ProgressBar.svelte +33 -11
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +3 -3
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -1
- package/dist/feedback/Skeleton/Skeleton.svelte +12 -4
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +1 -1
- package/dist/feedback/Spinner/Spinner.svelte +5 -3
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +2 -2
- package/dist/feedback/Toast/Toaster.svelte +45 -13
- package/dist/feedback/Toast/Toaster.svelte.d.ts +1 -1
- package/dist/forms/Checkbox/Checkbox.svelte +37 -9
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +28 -12
- package/dist/forms/Select/Select.svelte.d.ts +1 -1
- package/dist/forms/Slider/Slider.svelte +66 -38
- package/dist/forms/Slider/Slider.svelte.d.ts +2 -2
- package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -1
- package/dist/forms/TextInput/TextInput.svelte +35 -7
- package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
- package/dist/forms/Textarea/Textarea.svelte +22 -7
- package/dist/forms/Textarea/Textarea.svelte.d.ts +1 -1
- package/dist/forms/Toggle/Toggle.svelte +71 -12
- package/dist/forms/Toggle/Toggle.svelte.d.ts +1 -1
- package/dist/layout/Card/Card.svelte +128 -5
- package/dist/layout/Card/Card.svelte.d.ts +4 -1
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +1 -1
- package/dist/layout/Container/Container.svelte.d.ts +1 -1
- package/dist/layout/ThermalBackground/ThermalBackground.svelte +275 -0
- package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +14 -0
- package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
- package/dist/layout/ThermalBackground/index.d.ts +2 -0
- package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
- package/dist/layout/ThermalBackground/index.js +1 -0
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +1 -0
- package/dist/navigation/CommandPalette/CommandPalette.svelte +45 -11
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +1 -1
- package/dist/navigation/NavMenu/NavMenu.svelte +800 -0
- package/dist/navigation/NavMenu/NavMenu.svelte.d.ts +81 -0
- package/dist/navigation/NavMenu/NavMenu.svelte.d.ts.map +1 -0
- package/dist/navigation/NavMenu/index.d.ts +3 -0
- package/dist/navigation/NavMenu/index.d.ts.map +1 -0
- package/dist/navigation/NavMenu/index.js +1 -0
- package/dist/navigation/Tabs/Tabs.svelte +73 -11
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +1 -1
- package/dist/navigation/index.d.ts +2 -0
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -0
- package/dist/primitives/Badge/Badge.svelte +68 -21
- package/dist/primitives/Badge/Badge.svelte.d.ts +1 -1
- package/dist/primitives/Button/Button.svelte +254 -34
- package/dist/primitives/Button/Button.svelte.d.ts +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +10 -2
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +1 -1
- package/dist/styles/tokens.css +202 -64
- package/package.json +3 -3
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
export interface NavMenuItem {
|
|
3
|
+
type: 'item';
|
|
4
|
+
/** Unique identifier for active state matching */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Display label */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Link target (renders <a>); omit for button behavior */
|
|
9
|
+
href?: string;
|
|
10
|
+
/** Icon snippet */
|
|
11
|
+
icon?: Snippet;
|
|
12
|
+
/** Badge text (e.g. "New", count) */
|
|
13
|
+
badge?: string | number;
|
|
14
|
+
/** Disabled state */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Nested sub-items */
|
|
17
|
+
children?: NavMenuItem[];
|
|
18
|
+
}
|
|
19
|
+
export interface NavMenuGroup {
|
|
20
|
+
type: 'group';
|
|
21
|
+
/** Group heading label */
|
|
22
|
+
label: string;
|
|
23
|
+
/** Whether the group starts collapsed */
|
|
24
|
+
defaultCollapsed?: boolean;
|
|
25
|
+
/** Items in this group */
|
|
26
|
+
items: NavMenuEntry[];
|
|
27
|
+
}
|
|
28
|
+
export interface NavMenuSeparator {
|
|
29
|
+
type: 'separator';
|
|
30
|
+
}
|
|
31
|
+
export type NavMenuEntry = NavMenuItem | NavMenuGroup | NavMenuSeparator;
|
|
32
|
+
interface Props {
|
|
33
|
+
/** Menu entries: items, groups, and separators */
|
|
34
|
+
items: NavMenuEntry[];
|
|
35
|
+
/** ID of the currently active item */
|
|
36
|
+
activeId?: string;
|
|
37
|
+
/** Fired when an item is activated (click or Enter) */
|
|
38
|
+
onselect?: (id: string, href?: string) => void;
|
|
39
|
+
/** Whether groups can be collapsed (default true) */
|
|
40
|
+
collapsible?: boolean;
|
|
41
|
+
/** Additional CSS class */
|
|
42
|
+
class?: string;
|
|
43
|
+
/** Accessible label for the nav element */
|
|
44
|
+
label?: string;
|
|
45
|
+
/** Test ID */
|
|
46
|
+
testId?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* NavMenu
|
|
50
|
+
*
|
|
51
|
+
* INFRARED — Persistent navigation menu with collapsible groups, sub-items,
|
|
52
|
+
* icons, badges, and keyboard navigation. Built for sidebars, settings panels,
|
|
53
|
+
* and any vertical nav structure.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* <NavMenu
|
|
57
|
+
* items={[
|
|
58
|
+
* {
|
|
59
|
+
* type: 'group',
|
|
60
|
+
* label: 'Getting Started',
|
|
61
|
+
* items: [
|
|
62
|
+
* { type: 'item', id: 'intro', label: 'Introduction', href: '/' },
|
|
63
|
+
* { type: 'item', id: 'install', label: 'Installation', href: '/install', badge: 'New' },
|
|
64
|
+
* ]
|
|
65
|
+
* },
|
|
66
|
+
* { type: 'separator' },
|
|
67
|
+
* {
|
|
68
|
+
* type: 'item',
|
|
69
|
+
* id: 'settings',
|
|
70
|
+
* label: 'Settings',
|
|
71
|
+
* href: '/settings',
|
|
72
|
+
* icon: settingsIcon,
|
|
73
|
+
* }
|
|
74
|
+
* ]}
|
|
75
|
+
* activeId="intro"
|
|
76
|
+
* />
|
|
77
|
+
*/
|
|
78
|
+
declare const NavMenu: import("svelte").Component<Props, {}, "">;
|
|
79
|
+
type NavMenu = ReturnType<typeof NavMenu>;
|
|
80
|
+
export default NavMenu;
|
|
81
|
+
//# sourceMappingURL=NavMenu.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavMenu.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/NavMenu/NavMenu.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAOzE,UAAU,KAAK;IACd,kDAAkD;IAClD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AA2TD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/navigation/NavMenu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NavMenu } from './NavMenu.svelte';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Tabs
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED tabbed interface with underline indicator.
|
|
5
5
|
Clean structure, dark surfaces, world-class accessibility.
|
|
6
6
|
|
|
7
7
|
@example
|
|
@@ -198,7 +198,7 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
/* ========================================
|
|
201
|
-
TABLIST —
|
|
201
|
+
TABLIST — Recessed rail with depth
|
|
202
202
|
======================================== */
|
|
203
203
|
.sx-tabs-list {
|
|
204
204
|
display: flex;
|
|
@@ -211,6 +211,7 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
|
211
211
|
position: relative;
|
|
212
212
|
background: var(--sx-color-surface);
|
|
213
213
|
border-bottom: 1px solid var(--sx-color-border);
|
|
214
|
+
box-shadow: inset 0 -2px 4px -2px rgba(0, 0, 0, 0.2);
|
|
214
215
|
}
|
|
215
216
|
|
|
216
217
|
.sx-tabs-list-sm {
|
|
@@ -266,23 +267,75 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
|
266
267
|
|
|
267
268
|
.sx-tab:hover:not(.sx-tab-disabled):not(.sx-tab-selected) {
|
|
268
269
|
color: var(--sx-color-text);
|
|
269
|
-
background: var(--sx-color-
|
|
270
|
+
background: var(--sx-color-primary-subtle);
|
|
270
271
|
}
|
|
271
272
|
|
|
272
273
|
.sx-tab:active:not(.sx-tab-disabled):not(.sx-tab-selected) {
|
|
273
|
-
background: var(--sx-color-
|
|
274
|
+
background: var(--sx-color-primary-hover);
|
|
274
275
|
}
|
|
275
276
|
|
|
276
|
-
/* Selected tab —
|
|
277
|
+
/* Selected tab — elevated with subtle depth */
|
|
277
278
|
.sx-tab-selected {
|
|
278
279
|
color: var(--sx-color-text);
|
|
279
280
|
font-weight: 600;
|
|
280
|
-
border-bottom-color:
|
|
281
|
+
border-bottom-color: transparent;
|
|
281
282
|
}
|
|
282
283
|
|
|
283
|
-
/*
|
|
284
|
+
/* Forge-gradient indicator rail — multi-color strip with glow bleed */
|
|
285
|
+
.sx-tab::after {
|
|
286
|
+
content: '';
|
|
287
|
+
position: absolute;
|
|
288
|
+
bottom: -1px;
|
|
289
|
+
left: var(--sx-space-4);
|
|
290
|
+
right: var(--sx-space-4);
|
|
291
|
+
height: 3px;
|
|
292
|
+
background:
|
|
293
|
+
linear-gradient(
|
|
294
|
+
90deg,
|
|
295
|
+
#FF6B35,
|
|
296
|
+
#C8A84E 50%,
|
|
297
|
+
#3D8B8B
|
|
298
|
+
);
|
|
299
|
+
background-size: 200% 100%;
|
|
300
|
+
border-radius: 3px 3px 0 0;
|
|
301
|
+
transform: scaleX(0);
|
|
302
|
+
transform-origin: center;
|
|
303
|
+
transition:
|
|
304
|
+
transform var(--sx-duration-base) var(--sx-ease-out),
|
|
305
|
+
box-shadow var(--sx-duration-base) var(--sx-ease-out);
|
|
306
|
+
box-shadow: none;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.sx-tab-sm::after {
|
|
310
|
+
left: var(--sx-space-3);
|
|
311
|
+
right: var(--sx-space-3);
|
|
312
|
+
height: 2px;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.sx-tab-lg::after {
|
|
316
|
+
left: var(--sx-space-5);
|
|
317
|
+
right: var(--sx-space-5);
|
|
318
|
+
height: 3px;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.sx-tab-selected::after {
|
|
322
|
+
transform: scaleX(1);
|
|
323
|
+
animation: sx-tab-forge 6s ease-in-out infinite;
|
|
324
|
+
|
|
325
|
+
/* Glow bleed underneath the indicator */
|
|
326
|
+
box-shadow:
|
|
327
|
+
0 0 8px -1px rgba(255, 107, 53, 0.4),
|
|
328
|
+
0 0 16px -4px rgba(200, 168, 78, 0.2);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
@keyframes sx-tab-forge {
|
|
332
|
+
0%, 100% { background-position: 0% 50%; }
|
|
333
|
+
50% { background-position: 100% 50%; }
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Focus — primary ring */
|
|
284
337
|
.sx-tab:focus-visible {
|
|
285
|
-
outline: 2px solid var(--sx-color-
|
|
338
|
+
outline: 2px solid var(--sx-color-primary);
|
|
286
339
|
outline-offset: -2px;
|
|
287
340
|
border-radius: var(--sx-radius-sm);
|
|
288
341
|
}
|
|
@@ -313,16 +366,16 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
|
313
366
|
min-width: 18px;
|
|
314
367
|
height: 18px;
|
|
315
368
|
padding: 0 var(--sx-space-1-5);
|
|
316
|
-
background: var(--sx-color-
|
|
369
|
+
background: var(--sx-color-primary-active);
|
|
317
370
|
border: none;
|
|
318
371
|
font-size: var(--sx-text-xs);
|
|
319
372
|
font-weight: 600;
|
|
320
|
-
color: var(--sx-color-
|
|
373
|
+
color: var(--sx-color-primary);
|
|
321
374
|
border-radius: var(--sx-radius-full);
|
|
322
375
|
}
|
|
323
376
|
|
|
324
377
|
.sx-tab-selected .sx-tab-badge {
|
|
325
|
-
background: rgba(
|
|
378
|
+
background: rgba(255, 107, 53, 0.18);
|
|
326
379
|
}
|
|
327
380
|
|
|
328
381
|
/* ========================================
|
|
@@ -371,5 +424,14 @@ function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
|
371
424
|
.sx-tab {
|
|
372
425
|
transition: none;
|
|
373
426
|
}
|
|
427
|
+
|
|
428
|
+
.sx-tab::after {
|
|
429
|
+
transition: none;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.sx-tab-selected::after {
|
|
433
|
+
animation: none;
|
|
434
|
+
background: linear-gradient(90deg, #FF6B35, #C8A84E);
|
|
435
|
+
}
|
|
374
436
|
}
|
|
375
437
|
</style>
|
|
@@ -2,4 +2,6 @@ export { Tabs } from './Tabs/index.js';
|
|
|
2
2
|
export type { TabOption } from './Tabs/index.js';
|
|
3
3
|
export { CommandPalette } from './CommandPalette/index.js';
|
|
4
4
|
export type { CommandItem, CommandGroup } from './CommandPalette/index.js';
|
|
5
|
+
export { NavMenu } from './NavMenu/index.js';
|
|
6
|
+
export type { NavMenuItem, NavMenuGroup, NavMenuSeparator, NavMenuEntry } from './NavMenu/index.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/navigation/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component Badge
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
INFRARED — Status badge for labels, counts, and states.
|
|
5
5
|
Pill-shaped, translucent backgrounds, role="status" for screen readers.
|
|
6
6
|
|
|
7
7
|
@example
|
|
@@ -79,17 +79,21 @@ let {
|
|
|
79
79
|
{/if}
|
|
80
80
|
|
|
81
81
|
<style>
|
|
82
|
-
/* Base */
|
|
82
|
+
/* Base — stamped metal tag with thin extrusion */
|
|
83
83
|
.sx-badge {
|
|
84
84
|
display: inline-flex;
|
|
85
85
|
align-items: center;
|
|
86
86
|
gap: var(--sx-space-1);
|
|
87
87
|
font-family: var(--sx-font-body);
|
|
88
|
-
font-weight:
|
|
88
|
+
font-weight: 600;
|
|
89
|
+
letter-spacing: 0.02em;
|
|
89
90
|
white-space: nowrap;
|
|
90
91
|
transition: box-shadow var(--sx-transition-fast);
|
|
91
92
|
border: 1px solid transparent;
|
|
92
|
-
box-shadow:
|
|
93
|
+
box-shadow:
|
|
94
|
+
0 1px 0 0 rgba(0, 0, 0, 0.2),
|
|
95
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2);
|
|
96
|
+
animation: sx-badge-pop 200ms var(--sx-ease-spring) both;
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
/* Pill shape for all non-dot badges */
|
|
@@ -153,90 +157,133 @@ let {
|
|
|
153
157
|
}
|
|
154
158
|
|
|
155
159
|
/* ========================================
|
|
156
|
-
STATUS VARIANTS -
|
|
160
|
+
STATUS VARIANTS - INFRARED
|
|
157
161
|
======================================== */
|
|
158
162
|
|
|
159
|
-
/* Neutral */
|
|
163
|
+
/* Neutral — metal surface */
|
|
160
164
|
.sx-badge-neutral {
|
|
161
165
|
background: var(--sx-color-surface-2);
|
|
162
166
|
color: var(--sx-color-text-secondary);
|
|
167
|
+
border-color: rgba(255, 255, 255, 0.04);
|
|
168
|
+
border-bottom-color: rgba(0, 0, 0, 0.15);
|
|
163
169
|
}
|
|
164
170
|
|
|
165
171
|
.sx-badge-dot.sx-badge-neutral {
|
|
166
172
|
background: var(--sx-color-text-secondary);
|
|
167
173
|
border: none;
|
|
174
|
+
box-shadow: 0 0 4px -1px rgba(160, 160, 180, 0.3);
|
|
168
175
|
}
|
|
169
176
|
|
|
170
|
-
/* Primary —
|
|
177
|
+
/* Primary — vermilion stamped tag */
|
|
171
178
|
.sx-badge-primary {
|
|
172
|
-
background: var(--sx-color-
|
|
173
|
-
color: var(--sx-color-
|
|
179
|
+
background: var(--sx-color-primary-active);
|
|
180
|
+
color: var(--sx-color-primary);
|
|
181
|
+
border-color: rgba(255, 107, 53, 0.1);
|
|
182
|
+
border-bottom-color: rgba(160, 50, 10, 0.2);
|
|
183
|
+
box-shadow:
|
|
184
|
+
0 1px 0 0 rgba(160, 50, 10, 0.25),
|
|
185
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2),
|
|
186
|
+
0 0 6px -2px rgba(255, 107, 53, 0.15);
|
|
174
187
|
}
|
|
175
188
|
|
|
176
189
|
.sx-badge-dot.sx-badge-primary {
|
|
177
|
-
background: var(--sx-color-
|
|
190
|
+
background: var(--sx-color-primary);
|
|
178
191
|
border: none;
|
|
192
|
+
box-shadow: 0 0 6px -1px rgba(255, 107, 53, 0.4);
|
|
179
193
|
}
|
|
180
194
|
|
|
181
|
-
/* Success — green */
|
|
195
|
+
/* Success — green stamped tag */
|
|
182
196
|
.sx-badge-success {
|
|
183
197
|
background: var(--sx-color-green-subtle);
|
|
184
198
|
color: var(--sx-color-green);
|
|
199
|
+
border-color: rgba(34, 197, 94, 0.08);
|
|
200
|
+
border-bottom-color: rgba(20, 100, 50, 0.2);
|
|
201
|
+
box-shadow:
|
|
202
|
+
0 1px 0 0 rgba(20, 100, 50, 0.25),
|
|
203
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2),
|
|
204
|
+
0 0 6px -2px rgba(34, 197, 94, 0.12);
|
|
185
205
|
}
|
|
186
206
|
|
|
187
207
|
.sx-badge-dot.sx-badge-success {
|
|
188
208
|
background: var(--sx-color-green);
|
|
189
209
|
border: none;
|
|
210
|
+
box-shadow: 0 0 6px -1px rgba(34, 197, 94, 0.4);
|
|
190
211
|
}
|
|
191
212
|
|
|
192
|
-
/* Warning —
|
|
213
|
+
/* Warning — brass stamped tag */
|
|
193
214
|
.sx-badge-warning {
|
|
194
|
-
background: var(--sx-color-
|
|
195
|
-
color: var(--sx-color-
|
|
215
|
+
background: var(--sx-color-brass-subtle);
|
|
216
|
+
color: var(--sx-color-secondary);
|
|
217
|
+
border-color: rgba(200, 168, 78, 0.08);
|
|
218
|
+
border-bottom-color: rgba(130, 108, 50, 0.2);
|
|
219
|
+
box-shadow:
|
|
220
|
+
0 1px 0 0 rgba(130, 108, 50, 0.25),
|
|
221
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2),
|
|
222
|
+
0 0 6px -2px rgba(200, 168, 78, 0.12);
|
|
196
223
|
}
|
|
197
224
|
|
|
198
225
|
.sx-badge-dot.sx-badge-warning {
|
|
199
|
-
background: var(--sx-color-
|
|
226
|
+
background: var(--sx-color-secondary);
|
|
200
227
|
border: none;
|
|
228
|
+
box-shadow: 0 0 6px -1px rgba(200, 168, 78, 0.4);
|
|
201
229
|
}
|
|
202
230
|
|
|
203
|
-
/* Error —
|
|
231
|
+
/* Error — crimson stamped tag */
|
|
204
232
|
.sx-badge-error {
|
|
205
233
|
background: var(--sx-color-red-hover);
|
|
206
234
|
color: var(--sx-color-red);
|
|
235
|
+
border-color: rgba(220, 38, 38, 0.08);
|
|
236
|
+
border-bottom-color: rgba(140, 20, 20, 0.2);
|
|
237
|
+
box-shadow:
|
|
238
|
+
0 1px 0 0 rgba(140, 20, 20, 0.25),
|
|
239
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2),
|
|
240
|
+
0 0 6px -2px rgba(220, 38, 38, 0.12);
|
|
207
241
|
}
|
|
208
242
|
|
|
209
243
|
.sx-badge-dot.sx-badge-error {
|
|
210
244
|
background: var(--sx-color-red);
|
|
211
245
|
border: none;
|
|
246
|
+
box-shadow: 0 0 6px -1px rgba(220, 38, 38, 0.4);
|
|
212
247
|
}
|
|
213
248
|
|
|
214
|
-
/* Info —
|
|
249
|
+
/* Info — teal stamped tag */
|
|
215
250
|
.sx-badge-info {
|
|
216
|
-
background: var(--sx-color-
|
|
217
|
-
color: var(--sx-color-
|
|
251
|
+
background: var(--sx-color-teal-subtle);
|
|
252
|
+
color: var(--sx-color-teal);
|
|
253
|
+
border-color: rgba(61, 139, 139, 0.08);
|
|
254
|
+
border-bottom-color: rgba(30, 80, 80, 0.2);
|
|
255
|
+
box-shadow:
|
|
256
|
+
0 1px 0 0 rgba(30, 80, 80, 0.25),
|
|
257
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.2),
|
|
258
|
+
0 0 6px -2px rgba(61, 139, 139, 0.12);
|
|
218
259
|
}
|
|
219
260
|
|
|
220
261
|
.sx-badge-dot.sx-badge-info {
|
|
221
|
-
background: var(--sx-color-
|
|
262
|
+
background: var(--sx-color-teal);
|
|
222
263
|
border: none;
|
|
264
|
+
box-shadow: 0 0 6px -1px rgba(61, 139, 139, 0.4);
|
|
223
265
|
}
|
|
224
266
|
|
|
225
|
-
/* Outline —
|
|
267
|
+
/* Outline — recessed stamp, no fill */
|
|
226
268
|
.sx-badge-outline {
|
|
227
269
|
background: transparent;
|
|
228
270
|
color: var(--sx-color-text-secondary);
|
|
229
271
|
border: 1px solid var(--sx-color-border-strong);
|
|
272
|
+
box-shadow:
|
|
273
|
+
inset 0 1px 2px rgba(0, 0, 0, 0.15),
|
|
274
|
+
0 1px 0 0 rgba(255, 255, 255, 0.03);
|
|
230
275
|
}
|
|
231
276
|
|
|
232
277
|
.sx-badge-dot.sx-badge-outline {
|
|
233
278
|
background: var(--sx-color-border-strong);
|
|
234
279
|
border: none;
|
|
280
|
+
box-shadow: none;
|
|
235
281
|
}
|
|
236
282
|
|
|
237
283
|
@media (prefers-reduced-motion: reduce) {
|
|
238
284
|
.sx-badge {
|
|
239
285
|
transition: none;
|
|
286
|
+
animation: none;
|
|
240
287
|
}
|
|
241
288
|
}
|
|
242
289
|
</style>
|
|
@@ -20,7 +20,7 @@ interface Props {
|
|
|
20
20
|
/**
|
|
21
21
|
* Badge
|
|
22
22
|
*
|
|
23
|
-
*
|
|
23
|
+
* INFRARED — Status badge for labels, counts, and states.
|
|
24
24
|
* Pill-shaped, translucent backgrounds, role="status" for screen readers.
|
|
25
25
|
*
|
|
26
26
|
* @example
|