@salmexio/ui 0.1.1 → 0.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/dist/dialogs/Modal/Modal.svelte +140 -140
- package/dist/dialogs/Modal/Modal.svelte.d.ts.map +1 -1
- package/dist/feedback/Alert/Alert.svelte +63 -63
- package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -1
- package/dist/feedback/Spinner/Spinner.svelte +55 -55
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/forms/Checkbox/Checkbox.svelte +64 -64
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts.map +1 -1
- package/dist/forms/TextInput/TextInput.svelte +141 -141
- package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/layout/Card/Card.svelte +59 -59
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +34 -34
- package/dist/layout/Container/Container.svelte.d.ts.map +1 -1
- package/dist/navigation/Tabs/Tabs.svelte +100 -101
- package/dist/navigation/Tabs/Tabs.svelte.d.ts.map +1 -1
- package/dist/primitives/Badge/Badge.svelte +35 -42
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.svelte +47 -47
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- package/dist/routes/+layout.svelte +1 -1
- package/dist/styles/tokens.css +92 -86
- package/dist/utils/keyboard.js +3 -3
- package/dist/windowing/Window/Window.svelte +602 -0
- package/dist/windowing/Window/Window.svelte.d.ts +65 -0
- package/dist/windowing/Window/Window.svelte.d.ts.map +1 -0
- package/dist/windowing/Window/index.d.ts +2 -0
- package/dist/windowing/Window/index.d.ts.map +1 -0
- package/dist/windowing/Window/index.js +1 -0
- package/dist/windowing/WindowManager/WindowManager.svelte +410 -0
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +38 -0
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +1 -0
- package/dist/windowing/WindowManager/index.d.ts +2 -0
- package/dist/windowing/WindowManager/index.d.ts.map +1 -0
- package/dist/windowing/WindowManager/index.js +1 -0
- package/dist/windowing/index.d.ts +5 -0
- package/dist/windowing/index.d.ts.map +1 -0
- package/dist/windowing/index.js +3 -0
- package/dist/windowing/windowStore.svelte.d.ts +49 -0
- package/dist/windowing/windowStore.svelte.d.ts.map +1 -0
- package/dist/windowing/windowStore.svelte.js +170 -0
- package/package.json +1 -1
|
@@ -5,40 +5,40 @@
|
|
|
5
5
|
Sharp edges, no rounded corners; supports semantic elements.
|
|
6
6
|
-->
|
|
7
7
|
<script lang="ts">
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
8
|
+
import type { Snippet } from 'svelte';
|
|
9
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
10
|
+
import { cn } from '../../utils/cn.js';
|
|
11
|
+
|
|
12
|
+
type ContainerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'prose' | 'full';
|
|
13
|
+
type ContainerPadding = 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
14
|
+
|
|
15
|
+
interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'class'> {
|
|
16
|
+
size?: ContainerSize;
|
|
17
|
+
paddingX?: ContainerPadding;
|
|
18
|
+
paddingY?: ContainerPadding;
|
|
19
|
+
padding?: ContainerPadding;
|
|
20
|
+
centered?: boolean;
|
|
21
|
+
as?: 'div' | 'main' | 'section' | 'article';
|
|
22
|
+
id?: string;
|
|
23
|
+
class?: string;
|
|
24
|
+
children?: Snippet;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
size = 'xl',
|
|
29
|
+
paddingX,
|
|
30
|
+
paddingY,
|
|
31
|
+
padding = 'md',
|
|
32
|
+
centered = true,
|
|
33
|
+
as = 'div',
|
|
34
|
+
id,
|
|
35
|
+
class: className = '',
|
|
36
|
+
children,
|
|
37
|
+
...restProps
|
|
38
|
+
}: Props = $props();
|
|
39
|
+
|
|
40
|
+
const resolvedPaddingX = $derived(paddingX ?? padding);
|
|
41
|
+
const resolvedPaddingY = $derived(paddingY ?? 'none');
|
|
42
42
|
</script>
|
|
43
43
|
|
|
44
44
|
<svelte:element
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.svelte.d.ts","sourceRoot":"","sources":["../../../src/layout/Container/Container.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Container.svelte.d.ts","sourceRoot":"","sources":["../../../src/layout/Container/Container.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAItD,KAAK,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AACjF,KAAK,gBAAgB,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D,UAAU,KAAM,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACpE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA4CD;;;;;GAKG;AACH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -20,107 +20,106 @@
|
|
|
20
20
|
</Tabs>
|
|
21
21
|
-->
|
|
22
22
|
<script lang="ts">
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
23
|
+
import type { Snippet } from 'svelte';
|
|
24
|
+
import { cn } from '../../utils/cn.js';
|
|
25
|
+
|
|
26
|
+
type TabsSize = 'sm' | 'md' | 'lg';
|
|
27
|
+
|
|
28
|
+
export interface TabOption {
|
|
29
|
+
/** Unique value for the tab */
|
|
30
|
+
value: string;
|
|
31
|
+
/** Display label */
|
|
32
|
+
label: string;
|
|
33
|
+
/** Optional icon snippet */
|
|
34
|
+
icon?: Snippet;
|
|
35
|
+
/** Optional badge (count or label) */
|
|
36
|
+
badge?: number | string;
|
|
37
|
+
/** Whether this tab is disabled */
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface Props {
|
|
42
|
+
/** Unique identifier */
|
|
43
|
+
id?: string;
|
|
44
|
+
/** Accessible label for tablist (required for screen readers) */
|
|
45
|
+
label: string;
|
|
46
|
+
/** Tab definitions */
|
|
47
|
+
tabs: TabOption[];
|
|
48
|
+
/** Currently selected tab value */
|
|
49
|
+
value?: string;
|
|
50
|
+
/** Size variant */
|
|
51
|
+
size?: TabsSize;
|
|
52
|
+
/** Additional CSS classes */
|
|
53
|
+
class?: string;
|
|
54
|
+
/** Change handler */
|
|
55
|
+
onchange?: (value: string) => void;
|
|
56
|
+
/** Panel content - receives active tab value */
|
|
57
|
+
children?: Snippet<[activeValue: string]>;
|
|
58
|
+
/** Test ID */
|
|
59
|
+
testId?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let {
|
|
63
|
+
id = `tabs-${Math.random().toString(36).substr(2, 9)}`,
|
|
64
|
+
label,
|
|
65
|
+
tabs,
|
|
66
|
+
value = '',
|
|
67
|
+
size = 'md',
|
|
68
|
+
class: className = '',
|
|
69
|
+
onchange,
|
|
70
|
+
children,
|
|
71
|
+
testId
|
|
72
|
+
}: Props = $props();
|
|
73
|
+
|
|
74
|
+
function getTabId(index: number) {
|
|
75
|
+
return `${id}-tab-${index}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getPanelId(index: number) {
|
|
79
|
+
return `${id}-panel-${index}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function activateTab(index: number) {
|
|
83
|
+
const tab = tabs[index];
|
|
84
|
+
if (!tab || tab.disabled) return;
|
|
85
|
+
if (value === tab.value) return;
|
|
86
|
+
onchange?.(tab.value);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function handleKeydown(event: KeyboardEvent, currentIndex: number) {
|
|
90
|
+
let nextIndex = currentIndex;
|
|
91
|
+
|
|
92
|
+
if (event.key === 'ArrowRight') {
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
nextIndex = currentIndex + 1;
|
|
95
|
+
if (nextIndex >= tabs.length) nextIndex = 0;
|
|
96
|
+
} else if (event.key === 'ArrowLeft') {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
nextIndex = currentIndex - 1;
|
|
99
|
+
if (nextIndex < 0) nextIndex = tabs.length - 1;
|
|
100
|
+
} else if (event.key === 'Home') {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
nextIndex = 0;
|
|
103
|
+
} else if (event.key === 'End') {
|
|
104
|
+
event.preventDefault();
|
|
105
|
+
nextIndex = tabs.length - 1;
|
|
106
|
+
} else {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Skip disabled tabs
|
|
111
|
+
while (tabs[nextIndex]?.disabled && nextIndex !== currentIndex) {
|
|
112
|
+
nextIndex = event.key === 'ArrowRight' || event.key === 'End' ? nextIndex + 1 : nextIndex - 1;
|
|
113
|
+
if (nextIndex >= tabs.length) nextIndex = 0;
|
|
114
|
+
if (nextIndex < 0) nextIndex = tabs.length - 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (!tabs[nextIndex]?.disabled) {
|
|
118
|
+
activateTab(nextIndex);
|
|
119
|
+
const el = document.getElementById(getTabId(nextIndex));
|
|
120
|
+
el?.focus();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
124
123
|
</script>
|
|
125
124
|
|
|
126
125
|
<div class={cn('salmex-tabs-root', className)} data-testid={testId} {id}>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/navigation/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,WAAW,SAAS;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,KAAK;IACd,wBAAwB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AA8GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
|
|
@@ -9,48 +9,41 @@
|
|
|
9
9
|
<Badge status="warning" size="lg" dot />
|
|
10
10
|
-->
|
|
11
11
|
<script lang="ts">
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
pill = false,
|
|
48
|
-
dot = false,
|
|
49
|
-
icon,
|
|
50
|
-
class: className = '',
|
|
51
|
-
children,
|
|
52
|
-
'aria-label': ariaLabel
|
|
53
|
-
}: Props = $props();
|
|
12
|
+
import type { Snippet } from 'svelte';
|
|
13
|
+
import { cn } from '../../utils/cn.js';
|
|
14
|
+
|
|
15
|
+
type BadgeSize = 'sm' | 'md' | 'lg';
|
|
16
|
+
type BadgeStatus = 'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info' | 'outline';
|
|
17
|
+
|
|
18
|
+
interface Props {
|
|
19
|
+
/** Semantic status / variant */
|
|
20
|
+
status?: BadgeStatus;
|
|
21
|
+
/** Size */
|
|
22
|
+
size?: BadgeSize;
|
|
23
|
+
/** Pill shape (fully rounded) — we use minimal radius by default */
|
|
24
|
+
pill?: boolean;
|
|
25
|
+
/** Dot-only indicator (no text), use with aria-label for a11y */
|
|
26
|
+
dot?: boolean;
|
|
27
|
+
/** Optional icon before label */
|
|
28
|
+
icon?: Snippet;
|
|
29
|
+
/** Additional class names */
|
|
30
|
+
class?: string;
|
|
31
|
+
/** Badge content (ignored when dot) */
|
|
32
|
+
children?: Snippet;
|
|
33
|
+
/** Accessible label when dot (required when dot for a11y) */
|
|
34
|
+
'aria-label'?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let {
|
|
38
|
+
status = 'neutral',
|
|
39
|
+
size = 'md',
|
|
40
|
+
pill = false,
|
|
41
|
+
dot = false,
|
|
42
|
+
icon,
|
|
43
|
+
class: className = '',
|
|
44
|
+
children,
|
|
45
|
+
'aria-label': ariaLabel
|
|
46
|
+
}: Props = $props();
|
|
54
47
|
</script>
|
|
55
48
|
|
|
56
49
|
{#if dot}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/Badge.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Badge.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Badge/Badge.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACpC,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhG,UAAU,KAAK;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAuDD;;;;;;;;;GASG;AACH,QAAA,MAAM,KAAK,2CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
|
|
@@ -16,53 +16,53 @@
|
|
|
16
16
|
</Button>
|
|
17
17
|
-->
|
|
18
18
|
<script lang="ts">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
19
|
+
import type { Snippet } from 'svelte';
|
|
20
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
21
|
+
import { cn } from '../../utils/cn.js';
|
|
22
|
+
|
|
23
|
+
type ButtonSize = 'sm' | 'md' | 'lg';
|
|
24
|
+
type ButtonVariant = 'default' | 'primary' | 'flat';
|
|
25
|
+
|
|
26
|
+
interface Props extends Omit<HTMLButtonAttributes, 'class'> {
|
|
27
|
+
/** Visual variant of the button */
|
|
28
|
+
variant?: ButtonVariant;
|
|
29
|
+
/** Size of the button */
|
|
30
|
+
size?: ButtonSize;
|
|
31
|
+
/** Whether the button takes full width */
|
|
32
|
+
fullWidth?: boolean;
|
|
33
|
+
/** Icon to display on the left */
|
|
34
|
+
iconLeft?: Snippet;
|
|
35
|
+
/** Icon to display on the right */
|
|
36
|
+
iconRight?: Snippet;
|
|
37
|
+
/** Whether this is an icon-only button (requires aria-label) */
|
|
38
|
+
iconOnly?: boolean;
|
|
39
|
+
/** Additional CSS classes */
|
|
40
|
+
class?: string;
|
|
41
|
+
/** Button content */
|
|
42
|
+
children?: Snippet;
|
|
43
|
+
/** Test ID for e2e testing */
|
|
44
|
+
testId?: string;
|
|
45
|
+
/** Keyboard shortcut hint (e.g., "Ctrl+S") */
|
|
46
|
+
shortcut?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let {
|
|
50
|
+
variant = 'default',
|
|
51
|
+
size = 'md',
|
|
52
|
+
fullWidth = false,
|
|
53
|
+
disabled = false,
|
|
54
|
+
type = 'button',
|
|
55
|
+
iconLeft,
|
|
56
|
+
iconRight,
|
|
57
|
+
iconOnly = false,
|
|
58
|
+
class: className = '',
|
|
59
|
+
children,
|
|
60
|
+
testId,
|
|
61
|
+
shortcut,
|
|
62
|
+
...restProps
|
|
63
|
+
}: Props = $props();
|
|
64
|
+
|
|
65
|
+
const isDisabled = $derived(disabled);
|
|
66
66
|
</script>
|
|
67
67
|
|
|
68
68
|
<button
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"Button.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Button/Button.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,KAAK,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,UAAU,KAAM,SAAQ,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC;IAC1D,mCAAmC;IACnC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yBAAyB;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAkED;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
|