m3-svelte 5.4.0 → 5.6.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/package/buttons/Button.svelte +4 -10
- package/package/buttons/Button.svelte.d.ts +3 -6
- package/package/containers/Dialog.svelte +35 -37
- package/package/containers/Dialog.svelte.d.ts +4 -0
- package/package/forms/Checkbox.svelte +1 -0
- package/package/forms/Chip.svelte +20 -13
- package/package/forms/Chip.svelte.d.ts +3 -3
- package/package/forms/RadioAnim1.svelte +1 -0
- package/package/forms/RadioAnim2.svelte +1 -0
- package/package/forms/RadioAnim3.svelte +1 -0
- package/package/forms/Select.svelte +2 -1
- package/package/forms/SelectOutlined.svelte +3 -3
- package/package/forms/Slider.svelte +127 -147
- package/package/forms/Slider.svelte.d.ts +1 -1
- package/package/forms/SliderTicks.svelte +2 -2
- package/package/forms/SliderTicks.svelte.d.ts +2 -2
- package/package/forms/TextField.svelte +4 -3
- package/package/forms/TextFieldMultiline.svelte +4 -3
- package/package/forms/TextFieldOutlined.svelte +7 -3
- package/package/forms/TextFieldOutlinedMultiline.svelte +7 -3
- package/package/index.d.ts +1 -0
- package/package/index.js +1 -0
- package/package/misc/_icon.svelte +14 -1
- package/package/misc/typing-utils.d.ts +3 -1
- package/package/utils/badge.d.ts +11 -0
- package/package/utils/badge.js +30 -0
- package/package.json +9 -9
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type {
|
|
3
|
-
HTMLButtonAttributes,
|
|
4
|
-
HTMLAnchorAttributes,
|
|
5
|
-
HTMLLabelAttributes,
|
|
6
|
-
} from "svelte/elements";
|
|
2
|
+
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
7
3
|
import type { Snippet } from "svelte";
|
|
4
|
+
import type { LabelAttrs, AnchorAttrs } from "../misc/typing-utils";
|
|
8
5
|
import Layer from "../misc/Layer.svelte";
|
|
9
6
|
|
|
10
7
|
// If you want a toggle button, use `for` with a checkbox input.
|
|
11
|
-
type ActionProps =
|
|
12
|
-
| ({ for: string } & HTMLLabelAttributes)
|
|
13
|
-
| ({ href: string } & HTMLAnchorAttributes)
|
|
14
|
-
| HTMLButtonAttributes;
|
|
8
|
+
type ActionProps = LabelAttrs | AnchorAttrs | HTMLButtonAttributes;
|
|
15
9
|
type Props = {
|
|
16
10
|
variant?: "elevated" | "filled" | "tonal" | "outlined" | "text";
|
|
17
11
|
square?: boolean;
|
|
@@ -61,7 +55,7 @@
|
|
|
61
55
|
{:else}
|
|
62
56
|
{@const { variant = "filled", square = false, iconType = "none", children, ...extra } = props}
|
|
63
57
|
<button
|
|
64
|
-
type={"onclick" in extra ? "button" :
|
|
58
|
+
type={"onclick" in extra ? "button" : "submit"}
|
|
65
59
|
class="m3-container m3-font-label-large {variant} icon-{iconType}"
|
|
66
60
|
class:square
|
|
67
61
|
{...extra}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import type { HTMLButtonAttributes
|
|
1
|
+
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
} & HTMLLabelAttributes) | ({
|
|
6
|
-
href: string;
|
|
7
|
-
} & HTMLAnchorAttributes) | HTMLButtonAttributes;
|
|
3
|
+
import type { LabelAttrs, AnchorAttrs } from "../misc/typing-utils";
|
|
4
|
+
type ActionProps = LabelAttrs | AnchorAttrs | HTMLButtonAttributes;
|
|
8
5
|
type Props = {
|
|
9
6
|
variant?: "elevated" | "filled" | "tonal" | "outlined" | "text";
|
|
10
7
|
square?: boolean;
|
|
@@ -10,10 +10,7 @@
|
|
|
10
10
|
buttons,
|
|
11
11
|
children,
|
|
12
12
|
open = $bindable(),
|
|
13
|
-
|
|
14
|
-
closeOnClick = true,
|
|
15
|
-
onEsc,
|
|
16
|
-
onClick,
|
|
13
|
+
closedby = "any",
|
|
17
14
|
...extra
|
|
18
15
|
}: {
|
|
19
16
|
icon?: IconifyIcon | undefined;
|
|
@@ -21,9 +18,13 @@
|
|
|
21
18
|
buttons: Snippet;
|
|
22
19
|
children: Snippet;
|
|
23
20
|
open: boolean;
|
|
21
|
+
/** @deprecated use closedby instead */
|
|
24
22
|
closeOnEsc?: boolean;
|
|
23
|
+
/** @deprecated use closedby instead */
|
|
25
24
|
closeOnClick?: boolean;
|
|
25
|
+
/** @deprecated listen to `open` state changes instead of onEsc */
|
|
26
26
|
onEsc?: () => void;
|
|
27
|
+
/** @deprecated listen to `open` state changes instead of onClick */
|
|
27
28
|
onClick?: () => void;
|
|
28
29
|
} & HTMLDialogAttributes = $props();
|
|
29
30
|
|
|
@@ -37,39 +38,41 @@
|
|
|
37
38
|
|
|
38
39
|
<dialog
|
|
39
40
|
class="m3-container"
|
|
41
|
+
ontoggle={(e) => {
|
|
42
|
+
open = e.newState == "open";
|
|
43
|
+
}}
|
|
40
44
|
oncancel={(e) => {
|
|
41
45
|
if (e.target != e.currentTarget) return;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
e.preventDefault();
|
|
45
|
-
return;
|
|
46
|
+
if (extra.closeOnEsc && extra.onEsc) {
|
|
47
|
+
extra.onEsc();
|
|
46
48
|
}
|
|
47
|
-
|
|
48
|
-
onEsc?.();
|
|
49
|
-
open = false;
|
|
50
49
|
}}
|
|
51
50
|
onclick={(e) => {
|
|
52
51
|
if (e.target != e.currentTarget) return;
|
|
53
|
-
if (closeOnClick) {
|
|
54
|
-
onClick
|
|
55
|
-
open = false;
|
|
52
|
+
if (extra.closeOnClick && extra.onClick) {
|
|
53
|
+
extra.onClick();
|
|
56
54
|
}
|
|
57
55
|
}}
|
|
58
56
|
bind:this={dialog}
|
|
57
|
+
closedby={closedby ||
|
|
58
|
+
(extra.closeOnClick == false && extra.closeOnEsc == false
|
|
59
|
+
? "none"
|
|
60
|
+
: extra.closeOnClick == false
|
|
61
|
+
? "closerequest"
|
|
62
|
+
: "any")}
|
|
63
|
+
role="alertdialog"
|
|
59
64
|
{...extra}
|
|
60
65
|
>
|
|
61
|
-
|
|
62
|
-
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
{@render children()}
|
|
68
|
-
</div>
|
|
69
|
-
<div class="buttons">
|
|
70
|
-
{@render buttons()}
|
|
71
|
-
</div>
|
|
66
|
+
{#if icon}
|
|
67
|
+
<Icon {icon} width="1.5rem" height="1.5rem" />
|
|
68
|
+
{/if}
|
|
69
|
+
<p class="headline m3-font-headline-small" class:center={icon}>{headline}</p>
|
|
70
|
+
<div class="content m3-font-body-medium">
|
|
71
|
+
{@render children()}
|
|
72
72
|
</div>
|
|
73
|
+
<form method="dialog" class="buttons">
|
|
74
|
+
{@render buttons()}
|
|
75
|
+
</form>
|
|
73
76
|
</dialog>
|
|
74
77
|
|
|
75
78
|
<style>
|
|
@@ -85,20 +88,15 @@
|
|
|
85
88
|
border-radius: var(--m3-dialog-shape);
|
|
86
89
|
min-width: 17.5rem;
|
|
87
90
|
max-width: 35rem;
|
|
88
|
-
padding: 0;
|
|
89
|
-
overflow: auto;
|
|
90
|
-
}
|
|
91
|
-
.d {
|
|
92
|
-
display: flex;
|
|
93
|
-
flex-direction: column;
|
|
94
91
|
padding: 1.5rem;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
overflow: auto;
|
|
93
|
+
> :global(svg) {
|
|
94
|
+
color: rgb(var(--m3-scheme-secondary));
|
|
98
95
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
flex-shrink: 0;
|
|
97
|
+
align-self: center;
|
|
98
|
+
margin-bottom: 1rem;
|
|
99
|
+
}
|
|
102
100
|
}
|
|
103
101
|
.headline {
|
|
104
102
|
color: rgb(var(--m3-scheme-on-surface));
|
|
@@ -7,9 +7,13 @@ type $$ComponentProps = {
|
|
|
7
7
|
buttons: Snippet;
|
|
8
8
|
children: Snippet;
|
|
9
9
|
open: boolean;
|
|
10
|
+
/** @deprecated use closedby instead */
|
|
10
11
|
closeOnEsc?: boolean;
|
|
12
|
+
/** @deprecated use closedby instead */
|
|
11
13
|
closeOnClick?: boolean;
|
|
14
|
+
/** @deprecated listen to `open` state changes instead of onEsc */
|
|
12
15
|
onEsc?: () => void;
|
|
16
|
+
/** @deprecated listen to `open` state changes instead of onClick */
|
|
13
17
|
onClick?: () => void;
|
|
14
18
|
} & HTMLDialogAttributes;
|
|
15
19
|
declare const Dialog: import("svelte").Component<$$ComponentProps, {}, "open">;
|
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
import type { IconifyIcon } from "@iconify/types";
|
|
4
4
|
import Icon from "../misc/_icon.svelte";
|
|
5
5
|
import Layer from "../misc/Layer.svelte";
|
|
6
|
-
import type { ButtonAttrs } from "../misc/typing-utils";
|
|
6
|
+
import type { LabelAttrs, AnchorAttrs, ButtonAttrs } from "../misc/typing-utils";
|
|
7
|
+
|
|
8
|
+
type ActionProps = LabelAttrs | AnchorAttrs | ButtonAttrs;
|
|
7
9
|
|
|
8
10
|
let {
|
|
9
11
|
variant,
|
|
10
12
|
icon,
|
|
11
13
|
trailingIcon,
|
|
12
14
|
elevated = false,
|
|
13
|
-
disabled = false,
|
|
14
15
|
selected = false,
|
|
15
16
|
children,
|
|
16
17
|
...extra
|
|
@@ -28,20 +29,12 @@
|
|
|
28
29
|
icon?: IconifyIcon | undefined;
|
|
29
30
|
trailingIcon?: IconifyIcon | undefined;
|
|
30
31
|
elevated?: boolean;
|
|
31
|
-
disabled?: boolean;
|
|
32
32
|
selected?: boolean;
|
|
33
33
|
children: Snippet;
|
|
34
|
-
} &
|
|
34
|
+
} & ActionProps = $props();
|
|
35
35
|
</script>
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
type="button"
|
|
39
|
-
class="m3-container {variant}"
|
|
40
|
-
class:elevated
|
|
41
|
-
class:selected
|
|
42
|
-
{disabled}
|
|
43
|
-
{...extra}
|
|
44
|
-
>
|
|
37
|
+
{#snippet content()}
|
|
45
38
|
<Layer />
|
|
46
39
|
{#if icon}
|
|
47
40
|
<Icon {icon} class="leading" />
|
|
@@ -50,7 +43,21 @@
|
|
|
50
43
|
{#if trailingIcon}
|
|
51
44
|
<Icon icon={trailingIcon} class="trailing" />
|
|
52
45
|
{/if}
|
|
53
|
-
|
|
46
|
+
{/snippet}
|
|
47
|
+
|
|
48
|
+
{#if "for" in extra}
|
|
49
|
+
<label class="m3-container {variant}" class:elevated class:selected {...extra}>
|
|
50
|
+
{@render content()}
|
|
51
|
+
</label>
|
|
52
|
+
{:else if "href" in extra}
|
|
53
|
+
<a class="m3-container {variant}" class:elevated class:selected {...extra}>
|
|
54
|
+
{@render content()}
|
|
55
|
+
</a>
|
|
56
|
+
{:else}
|
|
57
|
+
<button class="m3-container {variant}" class:elevated class:selected {...extra} type="button">
|
|
58
|
+
{@render content()}
|
|
59
|
+
</button>
|
|
60
|
+
{/if}
|
|
54
61
|
|
|
55
62
|
<style>
|
|
56
63
|
:root {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
2
|
import type { IconifyIcon } from "@iconify/types";
|
|
3
|
-
import type { ButtonAttrs } from "../misc/typing-utils";
|
|
3
|
+
import type { LabelAttrs, AnchorAttrs, ButtonAttrs } from "../misc/typing-utils";
|
|
4
|
+
type ActionProps = LabelAttrs | AnchorAttrs | ButtonAttrs;
|
|
4
5
|
type $$ComponentProps = {
|
|
5
6
|
/**
|
|
6
7
|
* general is filter/suggestion since they're the same.
|
|
@@ -15,10 +16,9 @@ type $$ComponentProps = {
|
|
|
15
16
|
icon?: IconifyIcon | undefined;
|
|
16
17
|
trailingIcon?: IconifyIcon | undefined;
|
|
17
18
|
elevated?: boolean;
|
|
18
|
-
disabled?: boolean;
|
|
19
19
|
selected?: boolean;
|
|
20
20
|
children: Snippet;
|
|
21
|
-
} &
|
|
21
|
+
} & ActionProps;
|
|
22
22
|
declare const Chip: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
23
23
|
type Chip = ReturnType<typeof Chip>;
|
|
24
24
|
export default Chip;
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
<style>
|
|
48
48
|
:root {
|
|
49
49
|
--m3-menu-shape: var(--m3-util-rounding-extra-small);
|
|
50
|
+
--m3-field-filled-shape: var(--m3-util-rounding-extra-small);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
.m3-container {
|
|
@@ -92,7 +93,7 @@
|
|
|
92
93
|
);
|
|
93
94
|
padding-inline: 1rem;
|
|
94
95
|
|
|
95
|
-
border-radius: var(--m3-
|
|
96
|
+
border-radius: var(--m3-field-filled-shape) var(--m3-field-filled-shape) 0 0;
|
|
96
97
|
background-color: rgb(var(--m3-scheme-surface-container-highest));
|
|
97
98
|
transition:
|
|
98
99
|
background-color var(--m3-util-easing-fast),
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
*/
|
|
53
53
|
:root {
|
|
54
54
|
--m3-menu-shape: var(--m3-util-rounding-extra-small);
|
|
55
|
-
--m3-
|
|
55
|
+
--m3-field-outlined-shape: var(--m3-util-rounding-extra-small);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
.m3-container {
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
position: absolute;
|
|
80
80
|
inset: 0;
|
|
81
81
|
border: 1px solid var(--outline-color);
|
|
82
|
-
border-radius: var(--m3-
|
|
82
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
83
83
|
pointer-events: none;
|
|
84
84
|
transition: all 100ms;
|
|
85
85
|
}
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
height: calc(3.5rem + var(--m3-util-density-term));
|
|
110
110
|
padding-inline: 1rem;
|
|
111
111
|
|
|
112
|
-
border-radius: var(--m3-
|
|
112
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
113
113
|
background-color: transparent;
|
|
114
114
|
color: rgb(var(--m3-scheme-on-surface));
|
|
115
115
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
size = "xs",
|
|
15
15
|
leadingIcon,
|
|
16
16
|
trailingIcon,
|
|
17
|
-
|
|
17
|
+
stops: _stops = false,
|
|
18
18
|
endStops = true,
|
|
19
19
|
format = (n: number) => {
|
|
20
20
|
return n.toFixed(0);
|
|
@@ -30,10 +30,12 @@
|
|
|
30
30
|
size?: "xs" | "s" | "m" | "l" | "xl";
|
|
31
31
|
leadingIcon?: IconifyIcon;
|
|
32
32
|
trailingIcon?: IconifyIcon;
|
|
33
|
-
|
|
33
|
+
stops?: boolean;
|
|
34
34
|
endStops?: boolean;
|
|
35
35
|
format?: (n: number) => string;
|
|
36
36
|
} & Omit<HTMLInputAttributes, "size"> = $props();
|
|
37
|
+
// @ts-expect-error deprecated backwards compatibility with ticks
|
|
38
|
+
let stops = $derived(extra.ticks ? true : _stops);
|
|
37
39
|
let containerWidth = $state(600);
|
|
38
40
|
|
|
39
41
|
const valueDisplayed = new Spring(value, { stiffness: 0.3, damping: 1 });
|
|
@@ -45,23 +47,27 @@
|
|
|
45
47
|
};
|
|
46
48
|
|
|
47
49
|
const range = $derived(max - min);
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
const handle = $derived((valueDisplayed.current - min) / range);
|
|
51
|
+
const stopList = $derived.by(() => {
|
|
52
|
+
const output: number[] = [];
|
|
53
|
+
const add = (stop: number) => {
|
|
54
|
+
if (leadingIcon && stop == 0) return;
|
|
55
|
+
if (trailingIcon && stop == 1) return;
|
|
56
|
+
output.push(stop);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
if (stops && typeof step == "number") {
|
|
60
|
+
for (let i = 0; i <= range; i += step) add(i / range);
|
|
61
|
+
}
|
|
62
|
+
if (endStops && !output.includes(1)) {
|
|
63
|
+
add(1);
|
|
64
|
+
}
|
|
55
65
|
|
|
56
|
-
return
|
|
66
|
+
return output;
|
|
57
67
|
});
|
|
58
68
|
</script>
|
|
59
69
|
|
|
60
|
-
<div
|
|
61
|
-
class="m3-container {size}"
|
|
62
|
-
style:--percent="{percent * 100}%"
|
|
63
|
-
bind:offsetWidth={containerWidth}
|
|
64
|
-
>
|
|
70
|
+
<div class="m3-container {size}" style:--handle={handle - 0.5} bind:offsetWidth={containerWidth}>
|
|
65
71
|
<input
|
|
66
72
|
type="range"
|
|
67
73
|
oninput={updateValue}
|
|
@@ -72,33 +78,28 @@
|
|
|
72
78
|
{disabled}
|
|
73
79
|
{...extra}
|
|
74
80
|
/>
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
<div class="track-1">
|
|
82
|
+
{#each stopList as stop}
|
|
83
|
+
<div class="stop" style:--x={stop - 0.5}></div>
|
|
84
|
+
{/each}
|
|
85
|
+
</div>
|
|
86
|
+
<div class="track-2">
|
|
87
|
+
{#each stopList as stop}
|
|
88
|
+
<div class="stop" style:--x={stop - 0.5}></div>
|
|
89
|
+
{/each}
|
|
90
|
+
</div>
|
|
77
91
|
{#if leadingIcon}
|
|
78
92
|
<Icon
|
|
79
93
|
icon={leadingIcon}
|
|
80
|
-
class={"leading" + (containerWidth *
|
|
94
|
+
class={"leading" + (containerWidth * handle < (size == "xl" ? 48 : 40) ? " pop" : "")}
|
|
81
95
|
/>
|
|
82
96
|
{/if}
|
|
83
97
|
{#if trailingIcon}
|
|
84
98
|
<Icon
|
|
85
99
|
icon={trailingIcon}
|
|
86
|
-
class={"trailing" + (containerWidth * (1 -
|
|
100
|
+
class={"trailing" + (containerWidth * (1 - handle) < (size == "xl" ? 48 : 40) ? " pop" : "")}
|
|
87
101
|
/>
|
|
88
102
|
{/if}
|
|
89
|
-
{#if ticks}
|
|
90
|
-
{#each tickList as tick}
|
|
91
|
-
<div
|
|
92
|
-
class="tick"
|
|
93
|
-
class:hidden={Math.abs(tick - percent) < 0.01}
|
|
94
|
-
class:inactive={tick > percent}
|
|
95
|
-
style:--x={tick - 0.5}
|
|
96
|
-
></div>
|
|
97
|
-
{/each}
|
|
98
|
-
{/if}
|
|
99
|
-
{#if endStops && !ticks && !trailingIcon}
|
|
100
|
-
<div class="endstop" class:hidden={containerWidth * (1 - percent) < 14}></div>
|
|
101
|
-
{/if}
|
|
102
103
|
<div class="handle"></div>
|
|
103
104
|
{#if showValue}
|
|
104
105
|
<div class="value m3-font-label-large">{format(value)}</div>
|
|
@@ -118,6 +119,11 @@
|
|
|
118
119
|
min-width: 10rem;
|
|
119
120
|
print-color-adjust: exact;
|
|
120
121
|
-webkit-print-color-adjust: exact;
|
|
122
|
+
|
|
123
|
+
--functional-width: calc(100% - 2 * (0.25rem + 0.125rem));
|
|
124
|
+
--handle-left: calc(50% + var(--functional-width) * var(--handle) - 0.125rem - 0.375rem);
|
|
125
|
+
--handle-center: calc(50% + var(--functional-width) * var(--handle));
|
|
126
|
+
--handle-right: calc(50% + var(--functional-width) * var(--handle) + 0.125rem + 0.375rem);
|
|
121
127
|
}
|
|
122
128
|
|
|
123
129
|
.m3-container.xs {
|
|
@@ -160,15 +166,15 @@
|
|
|
160
166
|
width: var(--icon-size);
|
|
161
167
|
height: var(--icon-size);
|
|
162
168
|
top: 50%;
|
|
163
|
-
inset-inline-start: 0
|
|
169
|
+
inset-inline-start: 0;
|
|
170
|
+
margin-inline-start: 0.25rem;
|
|
164
171
|
translate: 0 -50%;
|
|
165
172
|
pointer-events: none;
|
|
166
173
|
color: rgb(var(--m3-scheme-secondary-container));
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
.m3-container :global(.leading.pop) {
|
|
170
|
-
inset-inline-start: var(--
|
|
171
|
-
margin-inline-start: 0.625rem;
|
|
177
|
+
inset-inline-start: var(--handle-right);
|
|
172
178
|
color: rgb(var(--m3-scheme-primary));
|
|
173
179
|
}
|
|
174
180
|
|
|
@@ -177,113 +183,118 @@
|
|
|
177
183
|
width: var(--icon-size);
|
|
178
184
|
height: var(--icon-size);
|
|
179
185
|
top: 50%;
|
|
180
|
-
inset-inline-end: 0
|
|
186
|
+
inset-inline-end: 0;
|
|
187
|
+
margin-inline-end: 0.25rem;
|
|
181
188
|
translate: 0 -50%;
|
|
182
189
|
pointer-events: none;
|
|
183
190
|
color: rgb(var(--m3-scheme-primary));
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
.m3-container :global(.trailing.pop) {
|
|
187
|
-
inset-inline-end:
|
|
188
|
-
margin-inline-end: 0.625rem;
|
|
194
|
+
inset-inline-end: calc(100% - var(--handle-left));
|
|
189
195
|
color: rgb(var(--m3-scheme-secondary-container));
|
|
190
196
|
}
|
|
191
197
|
|
|
192
|
-
.endstop {
|
|
193
|
-
position: absolute;
|
|
194
|
-
width: 4px;
|
|
195
|
-
height: 4px;
|
|
196
|
-
border-radius: var(--m3-util-rounding-full);
|
|
197
|
-
top: 50%;
|
|
198
|
-
inset-inline-end: 4px;
|
|
199
|
-
translate: 0 -50%;
|
|
200
|
-
background-color: rgb(var(--m3-scheme-on-secondary-container));
|
|
201
|
-
pointer-events: none;
|
|
202
|
-
&.hidden {
|
|
203
|
-
display: none;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
198
|
input {
|
|
208
199
|
position: absolute;
|
|
209
|
-
|
|
210
|
-
|
|
200
|
+
width: calc(var(--functional-width) + 1rem);
|
|
201
|
+
left: 50%;
|
|
202
|
+
translate: -50% 0;
|
|
211
203
|
height: 100%;
|
|
212
204
|
|
|
213
205
|
opacity: 0;
|
|
214
206
|
appearance: none;
|
|
215
207
|
margin: 0;
|
|
216
|
-
cursor: pointer;
|
|
217
|
-
}
|
|
218
208
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
inset-inline-start: 0;
|
|
223
|
-
top: 50%;
|
|
224
|
-
translate: 0 -50%;
|
|
225
|
-
width: calc(var(--percent) - 0.375rem);
|
|
226
|
-
height: var(--track-height);
|
|
227
|
-
pointer-events: none;
|
|
228
|
-
|
|
229
|
-
background-color: rgb(var(--m3-scheme-primary));
|
|
230
|
-
border-start-start-radius: var(--track-radius);
|
|
231
|
-
border-end-start-radius: var(--track-radius);
|
|
232
|
-
border-start-end-radius: var(--m3-slider-track-in-shape);
|
|
233
|
-
border-end-end-radius: var(--m3-slider-track-in-shape);
|
|
209
|
+
&:enabled {
|
|
210
|
+
cursor: pointer;
|
|
211
|
+
}
|
|
234
212
|
}
|
|
235
213
|
|
|
236
|
-
.track
|
|
214
|
+
.track-1,
|
|
215
|
+
.track-2 {
|
|
237
216
|
position: absolute;
|
|
238
|
-
|
|
239
|
-
inset-inline-end: 0;
|
|
217
|
+
inset-inline: 0;
|
|
240
218
|
top: 50%;
|
|
241
219
|
translate: 0 -50%;
|
|
242
|
-
width: calc(100% - var(--percent) - 0.375rem);
|
|
243
220
|
height: var(--track-height);
|
|
244
221
|
pointer-events: none;
|
|
222
|
+
}
|
|
223
|
+
.track-1 {
|
|
224
|
+
background-color: rgb(var(--m3-scheme-primary));
|
|
225
|
+
clip-path: inset(
|
|
226
|
+
0 calc(100% - var(--handle-left)) 0 0 round var(--track-radius)
|
|
227
|
+
var(--m3-slider-track-in-shape) var(--m3-slider-track-in-shape) var(--track-radius)
|
|
228
|
+
);
|
|
229
|
+
&:dir(rtl) {
|
|
230
|
+
clip-path: inset(
|
|
231
|
+
0 0 0 calc(100% - var(--handle-left)) round var(--m3-slider-track-in-shape)
|
|
232
|
+
var(--track-radius) var(--track-radius) var(--m3-slider-track-in-shape)
|
|
233
|
+
);
|
|
234
|
+
}
|
|
245
235
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
236
|
+
@media screen and (forced-colors: active) {
|
|
237
|
+
background-color: selecteditem;
|
|
238
|
+
}
|
|
239
|
+
&:is(input:disabled ~ .track-1) {
|
|
240
|
+
background-color: rgb(var(--m3-scheme-on-surface) / 0.38);
|
|
241
|
+
@media screen and (forced-colors: active) {
|
|
242
|
+
background-color: canvastext;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
251
245
|
}
|
|
246
|
+
.track-2 {
|
|
247
|
+
background-color: rgb(var(--m3-scheme-secondary-container));
|
|
248
|
+
clip-path: inset(
|
|
249
|
+
0 0 0 var(--handle-right) round var(--m3-slider-track-in-shape) var(--track-radius)
|
|
250
|
+
var(--track-radius) var(--m3-slider-track-in-shape)
|
|
251
|
+
);
|
|
252
|
+
&:dir(rtl) {
|
|
253
|
+
clip-path: inset(
|
|
254
|
+
0 var(--handle-right) 0 0 round var(--track-radius) var(--m3-slider-track-in-shape)
|
|
255
|
+
var(--m3-slider-track-in-shape) var(--track-radius)
|
|
256
|
+
);
|
|
257
|
+
}
|
|
252
258
|
|
|
253
|
-
|
|
259
|
+
@media screen and (forced-colors: active) {
|
|
260
|
+
background-color: canvastext;
|
|
261
|
+
}
|
|
262
|
+
&:is(input:disabled ~ .track-2) {
|
|
263
|
+
background-color: rgb(var(--m3-scheme-on-surface) / 0.12);
|
|
264
|
+
@media screen and (forced-colors: active) {
|
|
265
|
+
background-color: graytext;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
.stop {
|
|
254
270
|
position: absolute;
|
|
255
271
|
width: 4px;
|
|
256
272
|
height: 4px;
|
|
257
273
|
border-radius: var(--m3-util-rounding-full);
|
|
258
274
|
top: 50%;
|
|
259
|
-
inset-inline-start: calc(50% + (100% - 0.
|
|
275
|
+
inset-inline-start: calc(50% + (100% - 0.5rem - 0.25rem) * var(--x));
|
|
260
276
|
translate: -50% -50%;
|
|
261
277
|
&:dir(rtl) {
|
|
262
278
|
translate: 50% -50%;
|
|
263
279
|
}
|
|
264
|
-
|
|
280
|
+
&:is(.track-1 > .stop) {
|
|
281
|
+
background-color: rgb(var(--m3-scheme-on-primary));
|
|
282
|
+
&:is(input:disabled ~ .track-1 > .stop) {
|
|
283
|
+
background-color: rgb(var(--m3-scheme-inverse-on-surface));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
&:is(.track-2 > .stop) {
|
|
287
|
+
background-color: rgb(var(--m3-scheme-primary));
|
|
288
|
+
&:is(input:disabled ~ .track-2 > .stop) {
|
|
289
|
+
background-color: rgb(var(--m3-scheme-on-surface) / 0.38);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
265
292
|
pointer-events: none;
|
|
266
293
|
}
|
|
267
294
|
|
|
268
|
-
.tick.hidden {
|
|
269
|
-
display: none;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
.tick.inactive {
|
|
273
|
-
background-color: rgb(var(--m3-scheme-on-secondary-container));
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
:global(.leading) ~ .tick:nth-child(1 of div.tick) {
|
|
277
|
-
display: none;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
:global(.trailing) ~ .tick:nth-last-child(1 of div.tick) {
|
|
281
|
-
display: none;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
295
|
.handle {
|
|
285
296
|
position: absolute;
|
|
286
|
-
inset-inline-start: var(--
|
|
297
|
+
inset-inline-start: var(--handle-center);
|
|
287
298
|
translate: -50% 0;
|
|
288
299
|
&:dir(rtl) {
|
|
289
300
|
translate: 50% 0;
|
|
@@ -295,6 +306,16 @@
|
|
|
295
306
|
|
|
296
307
|
pointer-events: none;
|
|
297
308
|
transition: width var(--m3-util-easing);
|
|
309
|
+
|
|
310
|
+
@media screen and (forced-colors: active) {
|
|
311
|
+
background-color: selecteditem;
|
|
312
|
+
}
|
|
313
|
+
&:is(input:disabled ~ .handle) {
|
|
314
|
+
background-color: rgb(var(--m3-scheme-on-surface) / 0.38);
|
|
315
|
+
@media screen and (forced-colors: active) {
|
|
316
|
+
background-color: graytext;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
298
319
|
}
|
|
299
320
|
|
|
300
321
|
.value {
|
|
@@ -309,7 +330,7 @@
|
|
|
309
330
|
padding: 0.75rem 1rem;
|
|
310
331
|
border-radius: var(--m3-slider-handle-shape);
|
|
311
332
|
|
|
312
|
-
inset-inline-start: var(--
|
|
333
|
+
inset-inline-start: var(--handle-center);
|
|
313
334
|
bottom: calc(var(--handle-height) + 4px);
|
|
314
335
|
translate: -50% 0;
|
|
315
336
|
&:dir(rtl) {
|
|
@@ -320,6 +341,10 @@
|
|
|
320
341
|
pointer-events: none;
|
|
321
342
|
transition: opacity var(--m3-util-easing);
|
|
322
343
|
z-index: 1;
|
|
344
|
+
@media screen and (forced-colors: active) {
|
|
345
|
+
border: 2px solid selecteditem;
|
|
346
|
+
overflow: hidden;
|
|
347
|
+
}
|
|
323
348
|
}
|
|
324
349
|
|
|
325
350
|
input:focus-visible ~ .handle {
|
|
@@ -338,49 +363,4 @@
|
|
|
338
363
|
input:enabled:active ~ .value {
|
|
339
364
|
opacity: 1;
|
|
340
365
|
}
|
|
341
|
-
|
|
342
|
-
input:disabled {
|
|
343
|
-
cursor: auto;
|
|
344
|
-
}
|
|
345
|
-
input:disabled ~ .track::before {
|
|
346
|
-
background-color: rgb(var(--m3-scheme-on-surface) / 0.38);
|
|
347
|
-
}
|
|
348
|
-
input:disabled ~ .track::after {
|
|
349
|
-
background-color: rgb(var(--m3-scheme-on-surface) / 0.12);
|
|
350
|
-
}
|
|
351
|
-
input:disabled ~ .handle {
|
|
352
|
-
background-color: rgb(var(--m3-scheme-on-surface) / 0.38);
|
|
353
|
-
}
|
|
354
|
-
input:disabled ~ .tick {
|
|
355
|
-
background-color: rgb(var(--m3-scheme-inverse-on-surface));
|
|
356
|
-
}
|
|
357
|
-
input:disabled ~ .tick.inactive,
|
|
358
|
-
input:disabled ~ .endstop {
|
|
359
|
-
background-color: rgb(var(--m3-scheme-on-surface));
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
@media screen and (forced-colors: active) {
|
|
363
|
-
.track::before {
|
|
364
|
-
background-color: selecteditem;
|
|
365
|
-
}
|
|
366
|
-
.track::after {
|
|
367
|
-
background-color: canvastext;
|
|
368
|
-
}
|
|
369
|
-
.handle {
|
|
370
|
-
background-color: selecteditem;
|
|
371
|
-
}
|
|
372
|
-
.value {
|
|
373
|
-
border: 2px solid selecteditem;
|
|
374
|
-
overflow: hidden;
|
|
375
|
-
}
|
|
376
|
-
input:disabled + .track::before {
|
|
377
|
-
background-color: canvastext;
|
|
378
|
-
}
|
|
379
|
-
input:disabled + .track::after {
|
|
380
|
-
background-color: graytext;
|
|
381
|
-
}
|
|
382
|
-
input:disabled ~ .handle {
|
|
383
|
-
background-color: graytext;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
366
|
</style>
|
|
@@ -10,7 +10,7 @@ type $$ComponentProps = {
|
|
|
10
10
|
size?: "xs" | "s" | "m" | "l" | "xl";
|
|
11
11
|
leadingIcon?: IconifyIcon;
|
|
12
12
|
trailingIcon?: IconifyIcon;
|
|
13
|
-
|
|
13
|
+
stops?: boolean;
|
|
14
14
|
endStops?: boolean;
|
|
15
15
|
format?: (n: number) => string;
|
|
16
16
|
} & Omit<HTMLInputAttributes, "size">;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { ComponentProps } from "svelte";
|
|
7
7
|
import Slider from "./Slider.svelte";
|
|
8
8
|
|
|
9
|
-
let props: Omit<ComponentProps<typeof Slider>, "
|
|
9
|
+
let props: Omit<ComponentProps<typeof Slider>, "stops"> = $props();
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
|
-
<Slider {...props}
|
|
12
|
+
<Slider {...props} stops={true}></Slider>
|
|
@@ -9,9 +9,9 @@ declare const SliderTicks: import("svelte").Component<Omit<{
|
|
|
9
9
|
size?: "xs" | "s" | "m" | "l" | "xl";
|
|
10
10
|
leadingIcon?: import("@iconify/types").IconifyIcon;
|
|
11
11
|
trailingIcon?: import("@iconify/types").IconifyIcon;
|
|
12
|
-
|
|
12
|
+
stops?: boolean;
|
|
13
13
|
endStops?: boolean;
|
|
14
14
|
format?: (n: number) => string;
|
|
15
|
-
} & Omit<import("svelte/elements").HTMLInputAttributes, "size">, "
|
|
15
|
+
} & Omit<import("svelte/elements").HTMLInputAttributes, "size">, "stops">, {}, "">;
|
|
16
16
|
type SliderTicks = ReturnType<typeof SliderTicks>;
|
|
17
17
|
export default SliderTicks;
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
|
|
63
63
|
<style>
|
|
64
64
|
:root {
|
|
65
|
-
|
|
65
|
+
/* "textfield" is deprecated */
|
|
66
|
+
--m3-field-filled-shape: var(--m3-textfield-filled-shape, var(--m3-util-rounding-extra-small));
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
.m3-container {
|
|
@@ -80,7 +81,7 @@
|
|
|
80
81
|
border: none;
|
|
81
82
|
outline: none;
|
|
82
83
|
padding: 1.5rem 1rem 0.5rem 1rem;
|
|
83
|
-
border-radius: var(--m3-
|
|
84
|
+
border-radius: var(--m3-field-filled-shape) var(--m3-field-filled-shape) 0 0;
|
|
84
85
|
background-color: rgb(var(--m3-scheme-surface-container-highest));
|
|
85
86
|
color: rgb(var(--m3-scheme-on-surface));
|
|
86
87
|
}
|
|
@@ -118,7 +119,7 @@
|
|
|
118
119
|
.layer {
|
|
119
120
|
position: absolute;
|
|
120
121
|
inset: 0;
|
|
121
|
-
border-radius: var(--m3-
|
|
122
|
+
border-radius: var(--m3-field-filled-shape) var(--m3-field-filled-shape) 0 0;
|
|
122
123
|
pointer-events: none;
|
|
123
124
|
transition: all 100ms;
|
|
124
125
|
&:is(input:enabled:hover ~ .layer) {
|
|
@@ -57,7 +57,8 @@
|
|
|
57
57
|
|
|
58
58
|
<style>
|
|
59
59
|
:root {
|
|
60
|
-
|
|
60
|
+
/* "textfield" is deprecated */
|
|
61
|
+
--m3-field-filled-shape: var(--m3-textfield-filled-shape, var(--m3-util-rounding-extra-small));
|
|
61
62
|
}
|
|
62
63
|
.m3-container {
|
|
63
64
|
display: inline-flex;
|
|
@@ -74,7 +75,7 @@
|
|
|
74
75
|
border: none;
|
|
75
76
|
outline: none;
|
|
76
77
|
padding: 1.5rem 1rem 0.5rem 1rem;
|
|
77
|
-
border-radius: var(--m3-
|
|
78
|
+
border-radius: var(--m3-field-filled-shape) var(--m3-field-filled-shape) 0 0;
|
|
78
79
|
background-color: rgb(var(--m3-scheme-surface-container-highest));
|
|
79
80
|
color: rgb(var(--m3-scheme-on-surface));
|
|
80
81
|
resize: none;
|
|
@@ -113,7 +114,7 @@
|
|
|
113
114
|
.layer {
|
|
114
115
|
position: absolute;
|
|
115
116
|
inset: 0;
|
|
116
|
-
border-radius: var(--m3-
|
|
117
|
+
border-radius: var(--m3-field-filled-shape) var(--m3-field-filled-shape) 0 0;
|
|
117
118
|
pointer-events: none;
|
|
118
119
|
transition: all 100ms;
|
|
119
120
|
&:is(textarea:enabled:hover ~ .layer) {
|
|
@@ -66,7 +66,11 @@
|
|
|
66
66
|
do this: <TextFieldOutlined --m3-util-background="rgb(var(--m3-scheme-surface-container))" />
|
|
67
67
|
*/
|
|
68
68
|
:root {
|
|
69
|
-
|
|
69
|
+
/* "textfield" is deprecated */
|
|
70
|
+
--m3-field-outlined-shape: var(
|
|
71
|
+
--m3-textfield-outlined-shape,
|
|
72
|
+
var(--m3-util-rounding-extra-small)
|
|
73
|
+
);
|
|
70
74
|
}
|
|
71
75
|
.m3-container {
|
|
72
76
|
display: inline-flex;
|
|
@@ -83,7 +87,7 @@
|
|
|
83
87
|
border: none;
|
|
84
88
|
outline: none;
|
|
85
89
|
padding: 1rem;
|
|
86
|
-
border-radius: var(--m3-
|
|
90
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
87
91
|
background-color: transparent;
|
|
88
92
|
color: rgb(var(--m3-scheme-on-surface));
|
|
89
93
|
}
|
|
@@ -122,7 +126,7 @@
|
|
|
122
126
|
position: absolute;
|
|
123
127
|
inset: 0;
|
|
124
128
|
border: 1px solid rgb(var(--error, var(--m3-scheme-outline)));
|
|
125
|
-
border-radius: var(--m3-
|
|
129
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
126
130
|
pointer-events: none;
|
|
127
131
|
transition: all 100ms;
|
|
128
132
|
&:is(input:enabled:hover ~ .layer) {
|
|
@@ -61,7 +61,11 @@
|
|
|
61
61
|
do this: <TextFieldOutlinedMultiline --m3-util-background="rgb(var(--m3-scheme-surface-container))" />
|
|
62
62
|
*/
|
|
63
63
|
:root {
|
|
64
|
-
|
|
64
|
+
/* "textfield" is deprecated */
|
|
65
|
+
--m3-field-outlined-shape: var(
|
|
66
|
+
--m3-textfield-outlined-shape,
|
|
67
|
+
var(--m3-util-rounding-extra-small)
|
|
68
|
+
);
|
|
65
69
|
}
|
|
66
70
|
.m3-container {
|
|
67
71
|
display: inline-flex;
|
|
@@ -78,7 +82,7 @@
|
|
|
78
82
|
border: none;
|
|
79
83
|
outline: none;
|
|
80
84
|
padding: 1rem;
|
|
81
|
-
border-radius: var(--m3-
|
|
85
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
82
86
|
background-color: transparent;
|
|
83
87
|
color: rgb(var(--m3-scheme-on-surface));
|
|
84
88
|
resize: none;
|
|
@@ -118,7 +122,7 @@
|
|
|
118
122
|
position: absolute;
|
|
119
123
|
inset: 0;
|
|
120
124
|
border: 1px solid rgb(var(--error, var(--m3-scheme-outline)));
|
|
121
|
-
border-radius: var(--m3-
|
|
125
|
+
border-radius: var(--m3-field-outlined-shape);
|
|
122
126
|
pointer-events: none;
|
|
123
127
|
transition: all 100ms;
|
|
124
128
|
&:is(textarea:enabled:hover ~ .layer) {
|
package/package/index.d.ts
CHANGED
|
@@ -49,5 +49,6 @@ export { default as Tabs } from "./nav/Tabs.svelte";
|
|
|
49
49
|
export { default as TabsLink } from "./nav/TabsLink.svelte";
|
|
50
50
|
export { default as VariableTabs } from "./nav/VariableTabs.svelte";
|
|
51
51
|
export { default as VariableTabsLink } from "./nav/VariableTabsLink.svelte";
|
|
52
|
+
export * from "./utils/badge.js";
|
|
52
53
|
export { default as ChipChooser } from "./utils/ChipChooser.svelte";
|
|
53
54
|
export { default as Divider } from "./utils/Divider.svelte";
|
package/package/index.js
CHANGED
|
@@ -48,5 +48,6 @@ export { default as Tabs } from "./nav/Tabs.svelte";
|
|
|
48
48
|
export { default as TabsLink } from "./nav/TabsLink.svelte";
|
|
49
49
|
export { default as VariableTabs } from "./nav/VariableTabs.svelte";
|
|
50
50
|
export { default as VariableTabsLink } from "./nav/VariableTabsLink.svelte";
|
|
51
|
+
export * from "./utils/badge.js";
|
|
51
52
|
export { default as ChipChooser } from "./utils/ChipChooser.svelte";
|
|
52
53
|
export { default as Divider } from "./utils/Divider.svelte";
|
|
@@ -14,6 +14,19 @@
|
|
|
14
14
|
} = $props();
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
|
-
<svg
|
|
17
|
+
<svg
|
|
18
|
+
{width}
|
|
19
|
+
{height}
|
|
20
|
+
class={clazz}
|
|
21
|
+
data-badge={icon.body.includes("<!--badge-->") ? "" : undefined}
|
|
22
|
+
viewBox="0 0 {icon.width} {icon.height}"
|
|
23
|
+
>
|
|
18
24
|
{@html icon.body}
|
|
19
25
|
</svg>
|
|
26
|
+
|
|
27
|
+
<style>
|
|
28
|
+
/* deprecated: eventually want to just do this for all icons */
|
|
29
|
+
svg[data-badge] {
|
|
30
|
+
overflow: visible;
|
|
31
|
+
}
|
|
32
|
+
</style>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
1
|
+
import type { HTMLLabelAttributes, HTMLAnchorAttributes, HTMLButtonAttributes } from "svelte/elements";
|
|
2
|
+
export type LabelAttrs = HTMLLabelAttributes & Required<Pick<HTMLLabelAttributes, "for">>;
|
|
3
|
+
export type AnchorAttrs = HTMLAnchorAttributes & Required<Pick<HTMLAnchorAttributes, "href">>;
|
|
2
4
|
export type NotButton<T> = Omit<T, "onclick">;
|
|
3
5
|
export type ButtonAttrs = HTMLButtonAttributes & Required<Pick<HTMLButtonAttributes, "onclick">>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IconifyIcon } from "@iconify/types";
|
|
2
|
+
export declare const addBadge: (icon: IconifyIcon, n?: number) => {
|
|
3
|
+
body: string;
|
|
4
|
+
left?: number;
|
|
5
|
+
top?: number;
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
rotate?: number;
|
|
9
|
+
hFlip?: boolean;
|
|
10
|
+
vFlip?: boolean;
|
|
11
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const addBadge = (icon, n) => {
|
|
2
|
+
const { width, height } = icon;
|
|
3
|
+
if (!width || !height)
|
|
4
|
+
throw new Error("Icon must have icon and height");
|
|
5
|
+
let badge;
|
|
6
|
+
if (n) {
|
|
7
|
+
const x = width - 12;
|
|
8
|
+
const y = 14 - 16; // 14 down, 16 up
|
|
9
|
+
const max = 999;
|
|
10
|
+
const text = n > max ? `${max}+` : n.toString();
|
|
11
|
+
badge =
|
|
12
|
+
`<!--badge--><foreignObject x="${x}" y="${y}" width="40" height="16">` +
|
|
13
|
+
`<div class="m3-font-label-small" style="${[
|
|
14
|
+
"background-color:rgb(var(--m3-scheme-error))",
|
|
15
|
+
"color:rgb(var(--m3-scheme-on-error))",
|
|
16
|
+
"width:max-content",
|
|
17
|
+
"padding-inline:4px",
|
|
18
|
+
"border-radius:var(--m3-util-rounding-full)",
|
|
19
|
+
].join(";")}">` +
|
|
20
|
+
text +
|
|
21
|
+
`</div>`;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
badge = `<circle cx="${width - 3}" cy="3" r="3" fill="rgb(var(--m3-scheme-error))"/>`;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...icon,
|
|
28
|
+
body: icon.body + badge,
|
|
29
|
+
};
|
|
30
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "m3-svelte",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.6.0",
|
|
4
4
|
"license": "Apache-2.0 OR GPL-3.0-only",
|
|
5
5
|
"repository": "KTibow/m3-svelte",
|
|
6
6
|
"author": {
|
|
@@ -36,16 +36,16 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@iconify/types": "^2.0.0",
|
|
38
38
|
"@ktibow/iconset-material-symbols": "^0.0.1755063979",
|
|
39
|
-
"@ktibow/material-color-utilities-nightly": "^0.3.
|
|
40
|
-
"svelte": "^5.38.
|
|
39
|
+
"@ktibow/material-color-utilities-nightly": "^0.3.11756085020728",
|
|
40
|
+
"svelte": "^5.38.3"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@eslint/compat": "^1.3.2",
|
|
44
|
-
"@eslint/js": "^9.
|
|
44
|
+
"@eslint/js": "^9.34.0",
|
|
45
45
|
"@sveltejs/adapter-static": "^3.0.9",
|
|
46
|
-
"@sveltejs/kit": "^2.
|
|
47
|
-
"@sveltejs/package": "^2.
|
|
48
|
-
"@sveltejs/vite-plugin-svelte": "^6.1.
|
|
46
|
+
"@sveltejs/kit": "^2.36.2",
|
|
47
|
+
"@sveltejs/package": "^2.5.0",
|
|
48
|
+
"@sveltejs/vite-plugin-svelte": "^6.1.3",
|
|
49
49
|
"eslint": "^9.27.0",
|
|
50
50
|
"eslint-config-prettier": "^10.1.8",
|
|
51
51
|
"eslint-plugin-svelte": "^3.11.0",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"svelte-check": "^4.3.1",
|
|
58
58
|
"svelte-highlight": "^7.8.3",
|
|
59
59
|
"typescript": "^5.9.2",
|
|
60
|
-
"typescript-eslint": "^8.
|
|
61
|
-
"vite": "^7.1.
|
|
60
|
+
"typescript-eslint": "^8.41.0",
|
|
61
|
+
"vite": "^7.1.3"
|
|
62
62
|
},
|
|
63
63
|
"keywords": [
|
|
64
64
|
"svelte",
|