m3-svelte 5.11.0 → 5.12.1

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.
@@ -11,6 +11,7 @@
11
11
  variant?: "elevated" | "filled" | "tonal" | "outlined" | "text";
12
12
  square?: boolean;
13
13
  iconType?: "none" | "left" | "full";
14
+ size?: "xs" | "s" | "m" | "l" | "xl";
14
15
  children: Snippet;
15
16
  } & ActionProps;
16
17
 
@@ -18,35 +19,32 @@
18
19
  variant = "filled",
19
20
  square = false,
20
21
  iconType = "none",
22
+ size = "s",
21
23
  children,
22
24
  ...props
23
25
  }: Props = $props();
24
26
  </script>
25
27
 
26
28
  {#if "for" in props}
27
- <label class="m3-container m3-font-label-large {variant} icon-{iconType}" class:square {...props}>
29
+ <label class="m3-container {variant} {size} icon-{iconType}" class:square {...props}>
28
30
  <Layer />
29
31
  {@render children()}
30
32
  </label>
31
33
  {:else if "href" in props}
32
- <a class="m3-container m3-font-label-large {variant} icon-{iconType}" class:square {...props}>
34
+ <a class="m3-container {variant} {size} icon-{iconType}" class:square {...props}>
33
35
  <Layer />
34
36
  {@render children()}
35
37
  </a>
36
38
  {:else if "summary" in props}
37
39
  {@const { summary: _, ...extra } = props}
38
- <summary
39
- class="m3-container m3-font-label-large {variant} icon-{iconType}"
40
- class:square
41
- {...extra}
42
- >
40
+ <summary class="m3-container {variant} {size} icon-{iconType}" class:square {...extra}>
43
41
  <Layer />
44
42
  {@render children()}
45
43
  </summary>
46
44
  {:else}
47
45
  <button
48
46
  type={"onclick" in props ? "button" : "submit"}
49
- class="m3-container m3-font-label-large {variant} icon-{iconType}"
47
+ class="m3-container {variant} {size} icon-{iconType}"
50
48
  class:square
51
49
  {...props}
52
50
  >
@@ -56,16 +54,79 @@
56
54
  {/if}
57
55
 
58
56
  <style>
59
- :root {
57
+ .m3-container.xs {
58
+ height: calc(2rem + var(--m3-util-density-term));
59
+ padding: 0 0.75rem;
60
+ gap: 0.5rem;
61
+ --m3-button-shape: 1rem;
62
+ --m3-button-square-shape: var(--m3-util-rounding-medium);
63
+ --m3-button-pressed-shape: var(--m3-util-rounding-small);
64
+ font-family: var(--m3-font-label, var(--m3-font));
65
+ font-size: var(--m3-font-label-large-size, 0.875rem);
66
+ line-height: var(--m3-font-label-large-height, 1.429);
67
+ letter-spacing: var(--m3-font-label-large-tracking, 0.006rem);
68
+ font-weight: var(--m3-font-label-large-weight, 500);
69
+ }
70
+
71
+ .m3-container.s {
72
+ height: calc(2.5rem + var(--m3-util-density-term));
73
+ padding: 0 1rem;
74
+ gap: 0.5rem;
60
75
  --m3-button-shape: 1.25rem;
76
+ --m3-button-square-shape: var(--m3-util-rounding-medium);
77
+ --m3-button-pressed-shape: var(--m3-util-rounding-small);
78
+ font-family: var(--m3-font-label, var(--m3-font));
79
+ font-size: var(--m3-font-label-large-size, 0.875rem);
80
+ line-height: var(--m3-font-label-large-height, 1.429);
81
+ letter-spacing: var(--m3-font-label-large-tracking, 0.006rem);
82
+ font-weight: var(--m3-font-label-large-weight, 500);
83
+ }
84
+
85
+ .m3-container.m {
86
+ height: calc(3.5rem + var(--m3-util-density-term));
87
+ padding: 0 1.5rem;
88
+ gap: 0.5rem;
89
+ --m3-button-shape: 1.75rem;
90
+ --m3-button-square-shape: var(--m3-util-rounding-large);
91
+ --m3-button-pressed-shape: var(--m3-util-rounding-medium);
92
+ font-family: var(--m3-font-title, var(--m3-font));
93
+ font-size: var(--m3-font-title-medium-size, 1rem);
94
+ line-height: var(--m3-font-title-medium-height, 1.5);
95
+ letter-spacing: var(--m3-font-title-medium-tracking, 0);
96
+ font-weight: var(--m3-font-title-medium-weight, 500);
97
+ }
98
+
99
+ .m3-container.l {
100
+ height: calc(6rem + var(--m3-util-density-term));
101
+ padding: 0 3rem;
102
+ gap: 0.75rem;
103
+ --m3-button-shape: 3rem;
104
+ --m3-button-square-shape: var(--m3-util-rounding-extra-large);
105
+ --m3-button-pressed-shape: var(--m3-util-rounding-large);
106
+ font-family: var(--m3-font-headline, var(--m3-font));
107
+ font-size: var(--m3-font-headline-small-size, 1.5rem);
108
+ line-height: var(--m3-font-headline-small-height, 1.333);
109
+ letter-spacing: var(--m3-font-headline-small-tracking, 0);
110
+ font-weight: var(--m3-font-headline-small-weight, 400);
111
+ }
112
+
113
+ .m3-container.xl {
114
+ height: calc(8.5rem + var(--m3-util-density-term));
115
+ padding: 0 4rem;
116
+ gap: 1rem;
117
+ --m3-button-shape: 4.25rem;
118
+ --m3-button-square-shape: var(--m3-util-rounding-extra-large);
119
+ --m3-button-pressed-shape: var(--m3-util-rounding-large);
120
+ font-family: var(--m3-font-headline, var(--m3-font));
121
+ font-size: var(--m3-font-headline-large-size, 2rem);
122
+ line-height: var(--m3-font-headline-large-height, 1.25);
123
+ letter-spacing: var(--m3-font-headline-large-tracking, 0);
124
+ font-weight: var(--m3-font-headline-large-weight, 400);
61
125
  }
62
126
 
63
127
  .m3-container {
64
128
  display: inline-flex;
65
129
  border: none;
66
- height: calc(2.5rem + var(--m3-util-density-term));
67
- gap: 0.5rem;
68
- padding: 0 1rem;
69
130
  border-radius: var(--m3-button-shape);
70
131
  transition:
71
132
  border-radius var(--m3-util-easing-fast-spatial),
@@ -121,6 +182,14 @@
121
182
  outline: 1px solid rgb(var(--m3-scheme-outline-variant));
122
183
  outline-offset: -1px;
123
184
  }
185
+ &.outlined.l {
186
+ outline-width: 2px;
187
+ outline-offset: -2px;
188
+ }
189
+ &.outlined.xl {
190
+ outline-width: 3px;
191
+ outline-offset: -3px;
192
+ }
124
193
  &.outlined:not(:disabled, :global(input:disabled) + label) {
125
194
  outline-color: rgb(var(--m3-scheme-outline-variant));
126
195
  color: rgb(var(--m3-scheme-on-surface-variant));
@@ -145,28 +214,73 @@
145
214
 
146
215
  &.square:not(:is(:global(input:checked) + label, :global(:open) > summary)),
147
216
  &:is(:global(input:checked) + label, :global(:open) > summary):not(.square) {
148
- border-radius: var(--m3-util-rounding-medium);
217
+ border-radius: var(--m3-button-square-shape);
149
218
  }
150
219
  &:active:not(:disabled, :global(input:disabled) + label) {
151
- border-radius: var(--m3-util-rounding-small) !important;
220
+ border-radius: var(--m3-button-pressed-shape) !important;
152
221
  }
153
222
  }
154
223
 
155
224
  .m3-container > :global(*) {
156
225
  flex-shrink: 0;
157
226
  }
158
- .icon-left > :global(svg) {
159
- width: 1.125rem;
160
- height: 1.125rem;
227
+
228
+ .xs.icon-left > :global(svg),
229
+ .s.icon-left > :global(svg) {
230
+ width: 1.25rem;
231
+ height: 1.25rem;
161
232
  }
162
- .icon-full {
233
+ .m.icon-left > :global(svg) {
234
+ width: 1.5rem;
235
+ height: 1.5rem;
236
+ }
237
+ .l.icon-left > :global(svg) {
238
+ width: 2rem;
239
+ height: 2rem;
240
+ }
241
+ .xl.icon-left > :global(svg) {
242
+ width: 2.5rem;
243
+ height: 2.5rem;
244
+ }
245
+
246
+ .xs.icon-full {
247
+ width: 2rem;
248
+ padding: 0;
249
+ }
250
+ .s.icon-full {
163
251
  width: 2.5rem;
164
252
  padding: 0;
165
253
  }
166
- .icon-full > :global(svg) {
254
+ .m.icon-full {
255
+ width: 3.5rem;
256
+ padding: 0;
257
+ }
258
+ .l.icon-full {
259
+ width: 6rem;
260
+ padding: 0;
261
+ }
262
+ .xl.icon-full {
263
+ width: 8.5rem;
264
+ padding: 0;
265
+ }
266
+
267
+ .xs.icon-full > :global(svg),
268
+ .s.icon-full > :global(svg) {
269
+ width: 1.25rem;
270
+ height: 1.25rem;
271
+ }
272
+ .m.icon-full > :global(svg) {
167
273
  width: 1.5rem;
168
274
  height: 1.5rem;
169
275
  }
276
+ .l.icon-full > :global(svg) {
277
+ width: 2rem;
278
+ height: 2rem;
279
+ }
280
+ .xl.icon-full > :global(svg) {
281
+ width: 2.5rem;
282
+ height: 2.5rem;
283
+ }
170
284
 
171
285
  .m3-container {
172
286
  print-color-adjust: exact;
@@ -9,6 +9,7 @@ type Props = {
9
9
  variant?: "elevated" | "filled" | "tonal" | "outlined" | "text";
10
10
  square?: boolean;
11
11
  iconType?: "none" | "left" | "full";
12
+ size?: "xs" | "s" | "m" | "l" | "xl";
12
13
  children: Snippet;
13
14
  } & ActionProps;
14
15
  declare const Button: import("svelte").Component<Props, {}, "">;
@@ -6,15 +6,17 @@
6
6
  toggle = $bindable(),
7
7
  variant,
8
8
  round = false,
9
+ size,
9
10
  children,
10
11
  }: {
11
12
  toggle: boolean;
12
13
  variant?: "filled" | "tonal";
13
14
  round?: boolean;
15
+ size?: "xs" | "s" | "m" | "l" | "xl";
14
16
  children: Snippet;
15
17
  } = $props();
16
18
  const id = $props.id();
17
19
  </script>
18
20
 
19
21
  <input type="checkbox" {id} bind:checked={toggle} />
20
- <Button for={id} {variant} square={!round} {children} />
22
+ <Button for={id} {variant} square={!round} {size} {children} />
@@ -3,6 +3,7 @@ type $$ComponentProps = {
3
3
  toggle: boolean;
4
4
  variant?: "filled" | "tonal";
5
5
  round?: boolean;
6
+ size?: "xs" | "s" | "m" | "l" | "xl";
6
7
  children: Snippet;
7
8
  };
8
9
  declare const TogglePrimitive: import("svelte").Component<$$ComponentProps, {}, "toggle">;
@@ -5,6 +5,7 @@
5
5
  percent,
6
6
  size = 48,
7
7
  thickness = 4,
8
+ ...extra
8
9
  }: { percent: number; size?: number; thickness?: number } & HTMLAttributes<SVGElement> = $props();
9
10
 
10
11
  let r = $derived(size / 2 - thickness / 2);
@@ -18,6 +19,7 @@
18
19
  xmlns="http://www.w3.org/2000/svg"
19
20
  class="m3-container"
20
21
  role="progressbar"
22
+ {...extra}
21
23
  >
22
24
  <circle
23
25
  cx={size / 2}
@@ -1,13 +1,16 @@
1
1
  <script lang="ts">
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+
2
4
  let {
3
5
  sToHalfway = 1,
4
6
  size = 48,
5
7
  thickness = 2,
8
+ ...extra
6
9
  }: {
7
10
  sToHalfway?: number;
8
11
  size?: number;
9
12
  thickness?: number;
10
- } = $props();
13
+ } & HTMLAttributes<SVGElement> = $props();
11
14
 
12
15
  let r = $derived(size / 2 - thickness / 2);
13
16
  let circumference = $derived(Math.PI * r * 2);
@@ -23,6 +26,7 @@
23
26
  role="progressbar"
24
27
  style:--speed="{sToHalfway * 8}s"
25
28
  style:--circumference={circumference}
29
+ {...extra}
26
30
  >
27
31
  <circle
28
32
  cx={size / 2}
@@ -1,8 +1,9 @@
1
+ import type { HTMLAttributes } from "svelte/elements";
1
2
  type $$ComponentProps = {
2
3
  sToHalfway?: number;
3
4
  size?: number;
4
5
  thickness?: number;
5
- };
6
+ } & HTMLAttributes<SVGElement>;
6
7
  declare const CircularProgressEstimate: import("svelte").Component<$$ComponentProps, {}, "">;
7
8
  type CircularProgressEstimate = ReturnType<typeof CircularProgressEstimate>;
8
9
  export default CircularProgressEstimate;
@@ -112,13 +112,6 @@
112
112
  currentColor 8%
113
113
  );
114
114
  }
115
- &:active {
116
- background-color: color-mix(
117
- in oklab,
118
- rgb(var(--m3-scheme-surface-container-highest)),
119
- currentColor 12%
120
- );
121
- }
122
115
  }
123
116
 
124
117
  box-shadow: inset 0px -1px var(--secondary-color);
@@ -11,8 +11,6 @@
11
11
 
12
12
  let time = $state(0);
13
13
 
14
- let top = $derived(thickness * 0.5);
15
- let bottom = $derived(height - thickness * 0.5);
16
14
  let left = $derived(thickness * 0.5);
17
15
  let right = $derived(width - thickness * 0.5);
18
16
  let percentX = $derived((percent / 100) * (right - left) + left);
@@ -20,7 +18,7 @@
20
18
  const getSMILData = (time: number) => {
21
19
  let paths: string[] = [];
22
20
  for (let x = 0; x <= 1000; x += 1000 / 30) {
23
- paths.push(linear(top, bottom, left, percentX, time + x));
21
+ paths.push(linear(height / 2 - thickness / 2, height / 2, left, percentX, time + x));
24
22
  }
25
23
  return paths.join(";");
26
24
  };
@@ -8,8 +8,6 @@
8
8
  thickness = 4,
9
9
  }: { sToHalfway?: number; width?: number; height?: number; thickness?: number } = $props();
10
10
 
11
- let top = $derived(thickness * 0.5);
12
- let bottom = $derived(height - thickness * 0.5);
13
11
  let left = $derived(thickness * 0.5);
14
12
  let right = $derived(width - thickness * 0.5);
15
13
  let endTime = $derived(sToHalfway * 8);
@@ -21,14 +19,23 @@
21
19
  let value = 1 - Math.pow(0.5, time / sToHalfway);
22
20
  if (value == 0) value = 0.001;
23
21
  const ms = time * 1000;
24
- paths.push(linear(top, bottom, left, right, ms, value * (right - left) + left));
22
+ paths.push(
23
+ linear(
24
+ height / 2 - thickness / 2,
25
+ height / 2,
26
+ left,
27
+ right,
28
+ ms,
29
+ value * (right - left) + left,
30
+ ),
31
+ );
25
32
  }
26
33
  return paths.join(";");
27
34
  });
28
35
  const infiniteSMIL = $derived.by(() => {
29
36
  let paths: string[] = [];
30
37
  for (let time = 0; time <= 1; time += 1 / 30) {
31
- paths.push(linear(top, bottom, left, right, time * 1000));
38
+ paths.push(linear(height / 2 - thickness / 2, height / 2, left, right, time * 1000));
32
39
  }
33
40
  return paths.join(";");
34
41
  });
@@ -1,2 +1,2 @@
1
- export declare const linear: (t: number, b: number, from: number, to: number, time: number, cutoffTo?: number) => string;
1
+ export declare const linear: (amp: number, center: number, from: number, to: number, time: number, cutoffTo?: number) => string;
2
2
  export declare const trackOpacity: (right: number, x: number) => number;
@@ -2,7 +2,7 @@ const frequencyT = (Math.PI * 2) / 1000;
2
2
  const frequencyX = (Math.PI * 2) / 40;
3
3
  const round2 = (x) => Math.round(x * 100) / 100;
4
4
  const round1 = (x) => Math.round(x * 10) / 10;
5
- export const linear = (t, b, from, to, time, cutoffTo) => {
5
+ export const linear = (amp, center, from, to, time, cutoffTo) => {
6
6
  time = time * frequencyT;
7
7
  time %= Math.PI * 2;
8
8
  if (from >= to)
@@ -10,8 +10,8 @@ export const linear = (t, b, from, to, time, cutoffTo) => {
10
10
  let path = "";
11
11
  for (let xIterator = from; xIterator <= to; xIterator += 0.5) {
12
12
  const x = cutoffTo ? Math.min(cutoffTo, xIterator) : xIterator;
13
- const sinV = (Math.sin(x * frequencyX + time) + 1) * 0.5;
14
- const y = sinV * (t - b) + b;
13
+ const sinV = Math.sin(x * frequencyX + time);
14
+ const y = sinV * amp + center;
15
15
  if (x == from) {
16
16
  path = `M ${round1(x)} ${round2(y)}`;
17
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "m3-svelte",
3
- "version": "5.11.0",
3
+ "version": "5.12.1",
4
4
  "license": "Apache-2.0 OR GPL-3.0-only",
5
5
  "repository": "KTibow/m3-svelte",
6
6
  "author": {
@@ -35,13 +35,13 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@iconify/types": "^2.0.0",
38
- "@ktibow/iconset-material-symbols": "~0.0.1760591837",
39
- "@ktibow/material-color-utilities-nightly": "^0.3.11760728781000",
40
- "svelte": "^5.41.0"
38
+ "@ktibow/iconset-material-symbols": "~0.0.1761892960",
39
+ "@ktibow/material-color-utilities-nightly": "^0.3.11761929426000",
40
+ "svelte": "^5.43.2"
41
41
  },
42
42
  "devDependencies": {
43
- "@eslint/compat": "^1.4.0",
44
- "@eslint/js": "^9.38.0",
43
+ "@eslint/compat": "^1.4.1",
44
+ "@eslint/js": "^9.39.0",
45
45
  "@sveltejs/adapter-static": "^3.0.10",
46
46
  "@sveltejs/kit": "^2.47.1",
47
47
  "@sveltejs/package": "^2.5.4",
@@ -50,15 +50,15 @@
50
50
  "eslint-config-prettier": "^10.1.8",
51
51
  "eslint-plugin-svelte": "^3.12.4",
52
52
  "fast-glob": "^3.3.3",
53
- "globals": "^16.4.0",
53
+ "globals": "^16.5.0",
54
54
  "prettier": "^3.6.2",
55
55
  "prettier-plugin-svelte": "^3.4.0",
56
- "publint": "^0.3.14",
56
+ "publint": "^0.3.15",
57
57
  "svelte-check": "^4.3.3",
58
- "svelte-highlight": "^7.8.4",
58
+ "svelte-highlight": "^7.9.0",
59
59
  "typescript": "^5.9.3",
60
- "typescript-eslint": "^8.46.1",
61
- "vite": "^7.1.10"
60
+ "typescript-eslint": "^8.46.3",
61
+ "vite": "^7.1.12"
62
62
  },
63
63
  "keywords": [
64
64
  "svelte",