m3-svelte 3.6.0 → 4.0.0-beta.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.
Files changed (131) hide show
  1. package/package/buttons/Button.svelte +142 -78
  2. package/package/buttons/Button.svelte.d.ts +17 -34
  3. package/package/buttons/ConnectedButtons.svelte +26 -0
  4. package/package/buttons/ConnectedButtons.svelte.d.ts +8 -0
  5. package/package/buttons/FAB.svelte +30 -15
  6. package/package/buttons/FAB.svelte.d.ts +14 -25
  7. package/package/containers/BottomSheet.svelte +33 -27
  8. package/package/containers/BottomSheet.svelte.d.ts +7 -21
  9. package/package/containers/Card.svelte +45 -14
  10. package/package/containers/Card.svelte.d.ts +10 -30
  11. package/package/containers/Dialog.svelte +46 -32
  12. package/package/containers/Dialog.svelte.d.ts +9 -34
  13. package/package/containers/ListItem.svelte +78 -14
  14. package/package/containers/ListItem.svelte.d.ts +14 -25
  15. package/package/containers/Menu.svelte +6 -3
  16. package/package/containers/Menu.svelte.d.ts +6 -28
  17. package/package/containers/MenuItem.svelte +15 -5
  18. package/package/containers/MenuItem.svelte.d.ts +7 -29
  19. package/package/containers/Snackbar.svelte +35 -37
  20. package/package/containers/Snackbar.svelte.d.ts +7 -22
  21. package/package/containers/SnackbarItem.svelte +6 -6
  22. package/package/containers/SnackbarItem.svelte.d.ts +6 -29
  23. package/package/containers/StandardSideSheet.svelte +14 -8
  24. package/package/containers/StandardSideSheet.svelte.d.ts +7 -30
  25. package/package/forms/Checkbox.svelte +19 -4
  26. package/package/forms/Checkbox.svelte.d.ts +6 -29
  27. package/package/forms/Chip.svelte +41 -29
  28. package/package/forms/Chip.svelte.d.ts +18 -41
  29. package/package/forms/CircularProgress.svelte +4 -6
  30. package/package/forms/CircularProgress.svelte.d.ts +4 -20
  31. package/package/forms/CircularProgressIndeterminate.svelte +3 -4
  32. package/package/forms/CircularProgressIndeterminate.svelte.d.ts +2 -20
  33. package/package/forms/DatePickerDocked.svelte +52 -35
  34. package/package/forms/DatePickerDocked.svelte.d.ts +6 -22
  35. package/package/forms/LinearProgress.svelte +10 -5
  36. package/package/forms/LinearProgress.svelte.d.ts +4 -20
  37. package/package/forms/LinearProgressIndeterminate.svelte +4 -3
  38. package/package/forms/LinearProgressIndeterminate.svelte.d.ts +2 -20
  39. package/package/forms/RadioAnim1.svelte +10 -4
  40. package/package/forms/RadioAnim1.svelte.d.ts +6 -29
  41. package/package/forms/RadioAnim2.svelte +10 -4
  42. package/package/forms/RadioAnim2.svelte.d.ts +6 -29
  43. package/package/forms/RadioAnim3.svelte +10 -4
  44. package/package/forms/RadioAnim3.svelte.d.ts +6 -29
  45. package/package/forms/Slider.svelte +32 -26
  46. package/package/forms/Slider.svelte.d.ts +5 -21
  47. package/package/forms/SliderTicks.svelte +40 -33
  48. package/package/forms/SliderTicks.svelte.d.ts +5 -21
  49. package/package/forms/Switch.svelte +23 -21
  50. package/package/forms/Switch.svelte.d.ts +5 -22
  51. package/package/forms/TextField.svelte +36 -19
  52. package/package/forms/TextField.svelte.d.ts +14 -27
  53. package/package/forms/TextFieldMultiline.svelte +21 -21
  54. package/package/forms/TextFieldMultiline.svelte.d.ts +6 -23
  55. package/package/forms/TextFieldOutlined.svelte +36 -18
  56. package/package/forms/TextFieldOutlined.svelte.d.ts +14 -26
  57. package/package/forms/TextFieldOutlinedMultiline.svelte +21 -21
  58. package/package/forms/TextFieldOutlinedMultiline.svelte.d.ts +6 -23
  59. package/package/forms/_picker/Actions.svelte +16 -18
  60. package/package/forms/_picker/Actions.svelte.d.ts +7 -22
  61. package/package/forms/_picker/CalendarPicker.svelte +14 -4
  62. package/package/forms/_picker/CalendarPicker.svelte.d.ts +4 -18
  63. package/package/forms/_picker/FocusPicker.svelte +8 -9
  64. package/package/forms/_picker/FocusPicker.svelte.d.ts +5 -21
  65. package/package/forms/_picker/Header.svelte +20 -9
  66. package/package/forms/_picker/Header.svelte.d.ts +4 -18
  67. package/package/forms/_picker/Item.svelte +15 -6
  68. package/package/forms/_picker/Item.svelte.d.ts +8 -23
  69. package/package/index.d.ts +3 -9
  70. package/package/index.js +1 -8
  71. package/package/misc/Layer.svelte +7 -3
  72. package/package/misc/Layer.svelte.d.ts +5 -17
  73. package/package/misc/StyleFromScheme.svelte +6 -2
  74. package/package/misc/StyleFromScheme.svelte.d.ts +5 -19
  75. package/package/misc/_icon.svelte +12 -5
  76. package/package/misc/_icon.svelte.d.ts +5 -19
  77. package/package/misc/_ripple.svelte +11 -3
  78. package/package/misc/_ripple.svelte.d.ts +5 -17
  79. package/package/misc/_ripplesimple.svelte +4 -0
  80. package/package/misc/_ripplesimple.svelte.d.ts +5 -25
  81. package/package/misc/_styling.svelte +7 -3
  82. package/package/misc/_styling.svelte.d.ts +5 -19
  83. package/package/misc/animation.js +1 -5
  84. package/package/misc/easing.js +1 -28
  85. package/package/misc/recommended-styles.css +2 -2
  86. package/package/misc/styles.css +135 -107
  87. package/package/misc/utils.d.ts +1 -0
  88. package/package/misc/utils.js +5 -0
  89. package/package/nav/NavDrawer.svelte +9 -5
  90. package/package/nav/NavDrawer.svelte.d.ts +6 -30
  91. package/package/nav/NavDrawerButton.svelte +22 -12
  92. package/package/nav/NavDrawerButton.svelte.d.ts +8 -31
  93. package/package/nav/NavDrawerLink.svelte +21 -12
  94. package/package/nav/NavDrawerLink.svelte.d.ts +8 -30
  95. package/package/nav/NavList.svelte +13 -9
  96. package/package/nav/NavList.svelte.d.ts +7 -31
  97. package/package/nav/NavListButton.svelte +26 -22
  98. package/package/nav/NavListButton.svelte.d.ts +9 -33
  99. package/package/nav/NavListLink.svelte +26 -23
  100. package/package/nav/NavListLink.svelte.d.ts +9 -32
  101. package/package/nav/Tabs.svelte +20 -19
  102. package/package/nav/Tabs.svelte.d.ts +5 -22
  103. package/package/nav/TabsLink.svelte +22 -18
  104. package/package/nav/TabsLink.svelte.d.ts +5 -22
  105. package/package/nav/VariableTabs.svelte +25 -20
  106. package/package/nav/VariableTabs.svelte.d.ts +5 -22
  107. package/package/nav/VariableTabsLink.svelte +29 -22
  108. package/package/nav/VariableTabsLink.svelte.d.ts +5 -22
  109. package/package/utils/ChipChooser.svelte +10 -4
  110. package/package/utils/ChipChooser.svelte.d.ts +5 -19
  111. package/package/utils/DateField.svelte +24 -18
  112. package/package/utils/DateField.svelte.d.ts +4 -19
  113. package/package/utils/Divider.svelte +5 -1
  114. package/package/utils/Divider.svelte.d.ts +4 -18
  115. package/package.json +44 -43
  116. package/package/buttons/ButtonLink.svelte +0 -116
  117. package/package/buttons/ButtonLink.svelte.d.ts +0 -34
  118. package/package/buttons/SegmentedButtonContainer.svelte +0 -27
  119. package/package/buttons/SegmentedButtonContainer.svelte.d.ts +0 -31
  120. package/package/buttons/SegmentedButtonItem.svelte +0 -119
  121. package/package/buttons/SegmentedButtonItem.svelte.d.ts +0 -34
  122. package/package/containers/CardClickable.svelte +0 -78
  123. package/package/containers/CardClickable.svelte.d.ts +0 -34
  124. package/package/containers/ListItemButton.svelte +0 -86
  125. package/package/containers/ListItemButton.svelte.d.ts +0 -31
  126. package/package/containers/ListItemLabel.svelte +0 -82
  127. package/package/containers/ListItemLabel.svelte.d.ts +0 -29
  128. package/package/containers/SnackbarAnim.svelte +0 -127
  129. package/package/containers/SnackbarAnim.svelte.d.ts +0 -33
  130. package/package/forms/CheckboxAnim.svelte +0 -116
  131. package/package/forms/CheckboxAnim.svelte.d.ts +0 -31
@@ -1,50 +1,169 @@
1
1
  <script lang="ts">
2
- import type { HTMLButtonAttributes } from "svelte/elements";
2
+ import type {
3
+ HTMLButtonAttributes,
4
+ HTMLAnchorAttributes,
5
+ HTMLLabelAttributes,
6
+ } from "svelte/elements";
7
+ import type { Snippet } from "svelte";
3
8
  import Layer from "../misc/Layer.svelte";
4
- export let display = "inline-flex";
5
- export let extraOptions: HTMLButtonAttributes = {};
6
- export let iconType: "none" | "left" | "full" = "none";
7
- export let type: "elevated" | "filled" | "tonal" | "outlined" | "text";
8
- export let disabled = false;
9
+
10
+ // If you want a toggle button, use `for` with an `<input>`.
11
+ type ActionProps =
12
+ | ({ click: () => void; disabled?: boolean } & HTMLButtonAttributes)
13
+ | ({ href: string } & HTMLAnchorAttributes)
14
+ | ({ for: string } & HTMLLabelAttributes);
15
+ type Props = {
16
+ variant: "elevated" | "filled" | "tonal" | "outlined" | "text";
17
+ square?: boolean;
18
+ iconType?: "none" | "left" | "full";
19
+ children: Snippet;
20
+ } & ActionProps;
21
+
22
+ let props: Props = $props();
9
23
  </script>
10
24
 
11
- <button
12
- on:click|stopPropagation
13
- {disabled}
14
- class="m3-container m3-font-label-large {type} icon-{iconType}"
15
- style="display: {display};"
16
- {...extraOptions}
17
- >
18
- <Layer />
19
- <slot />
20
- </button>
25
+ {#if "click" in props}
26
+ {@const {
27
+ variant,
28
+ click,
29
+ disabled,
30
+ square = false,
31
+ iconType = "none",
32
+ children,
33
+ ...extra
34
+ } = props}
35
+ <button
36
+ onclick={click}
37
+ {disabled}
38
+ class="m3-container m3-font-label-large {variant} icon-{iconType}"
39
+ class:square
40
+ {...extra}
41
+ >
42
+ <Layer morph />
43
+ {@render children()}
44
+ </button>
45
+ {:else if "href" in props}
46
+ {@const { variant, href, square = false, iconType = "none", children, ...extra } = props}
47
+ <a
48
+ {href}
49
+ class="m3-container m3-font-label-large {variant} icon-{iconType}"
50
+ class:square
51
+ {...extra}
52
+ >
53
+ <Layer morph />
54
+ {@render children()}
55
+ </a>
56
+ {:else}
57
+ {@const { variant, for: forItem, square = false, iconType = "none", children, ...extra } = props}
58
+ <label
59
+ for={forItem}
60
+ class="m3-container m3-font-label-large {variant} icon-{iconType}"
61
+ class:square
62
+ {...extra}
63
+ >
64
+ <Layer morph />
65
+ {@render children()}
66
+ </label>
67
+ {/if}
21
68
 
22
69
  <style>
23
70
  :root {
24
- --m3-button-shape: var(--m3-util-rounding-full);
71
+ --m3-button-shape: 1.25rem;
25
72
  }
26
73
 
27
74
  .m3-container {
75
+ display: inline-flex;
28
76
  border: none;
29
77
  height: 2.5rem;
30
- padding: 0 1.5rem;
78
+ gap: 0.5rem;
79
+ padding: 0 1rem;
31
80
  border-radius: var(--m3-button-shape);
32
81
  transition: all 200ms;
33
82
 
34
83
  align-items: center;
35
84
  justify-content: center;
36
85
  cursor: pointer;
86
+ user-select: none;
37
87
  position: relative;
38
88
  overflow: hidden;
89
+ -webkit-tap-highlight-color: transparent;
90
+
91
+ &:disabled,
92
+ &:is(:global(input:disabled) + label) {
93
+ background-color: rgb(var(--m3-scheme-on-surface) / 0.12);
94
+ color: rgb(var(--m3-scheme-on-surface) / 0.38);
95
+ cursor: auto;
96
+ }
97
+
98
+ &.elevated:not(:disabled, :global(input:disabled) + label) {
99
+ background-color: rgb(var(--m3-scheme-surface-container-low));
100
+ color: rgb(var(--m3-scheme-primary));
101
+ box-shadow: var(--m3-util-elevation-1);
102
+ &:is(:global(input:checked) + .m3-container) {
103
+ background-color: rgb(var(--m3-scheme-primary));
104
+ color: rgb(var(--m3-scheme-on-primary));
105
+ }
106
+ @media (hover: hover) {
107
+ &:hover {
108
+ box-shadow: var(--m3-util-elevation-2);
109
+ }
110
+ }
111
+ }
112
+ &.filled:not(:disabled, :global(input:disabled) + label) {
113
+ background-color: rgb(var(--m3-scheme-primary));
114
+ color: rgb(var(--m3-scheme-on-primary));
115
+ &:is(:global(input:not(:checked)) + label) {
116
+ background-color: rgb(var(--m3-scheme-surface-container));
117
+ color: rgb(var(--m3-scheme-on-surface-variant));
118
+ }
119
+ }
120
+ &.tonal:not(:disabled, :global(input:disabled) + label) {
121
+ background-color: rgb(var(--m3-scheme-secondary-container));
122
+ color: rgb(var(--m3-scheme-on-secondary-container));
123
+ &:is(:global(input:checked) + label) {
124
+ background-color: rgb(var(--m3-scheme-secondary));
125
+ color: rgb(var(--m3-scheme-on-secondary));
126
+ }
127
+ }
128
+ &.outlined {
129
+ outline: 1px solid rgb(var(--m3-scheme-outline));
130
+ outline-offset: -1px;
131
+ }
132
+ &.outlined:not(:disabled, :global(input:disabled) + label) {
133
+ outline-color: rgb(var(--m3-scheme-outline));
134
+ color: rgb(var(--m3-scheme-primary));
135
+ &:is(:global(input:checked) + label) {
136
+ outline-color: rgb(var(--m3-scheme-inverse-surface));
137
+ background-color: rgb(var(--m3-scheme-inverse-surface));
138
+ color: rgb(var(--m3-scheme-inverse-on-surface));
139
+ }
140
+ }
141
+ &.outlined:is(:disabled, :global(input:disabled) + label) {
142
+ outline-color: rgb(var(--m3-scheme-on-surface) / 0.12);
143
+ background-color: transparent;
144
+ }
145
+ &.text:not(:disabled, :global(input:disabled) + label) {
146
+ background-color: transparent;
147
+ color: rgb(var(--m3-scheme-primary));
148
+ }
149
+ @media (hover: hover) {
150
+ &:is(.filled, .tonal):not(:disabled, label):hover {
151
+ box-shadow: var(--m3-util-elevation-1);
152
+ }
153
+ }
154
+
155
+ &.square:not(:global(input:checked) + label),
156
+ &:is(:global(input:checked) + label):not(.square) {
157
+ border-radius: var(--m3-util-rounding-medium);
158
+ }
159
+ &:global(.activated) {
160
+ border-radius: var(--m3-util-rounding-small) !important;
161
+ }
39
162
  }
40
163
 
41
164
  .m3-container > :global(*) {
42
165
  flex-shrink: 0;
43
166
  }
44
- .icon-left {
45
- padding-left: 1rem;
46
- gap: 0.5rem;
47
- }
48
167
  .icon-left > :global(svg) {
49
168
  width: 1.125rem;
50
169
  height: 1.125rem;
@@ -58,61 +177,6 @@
58
177
  height: 1.5rem;
59
178
  }
60
179
 
61
- .m3-container:disabled {
62
- background-color: rgb(var(--m3-scheme-on-surface) / 0.12);
63
- color: rgb(var(--m3-scheme-on-surface) / 0.38);
64
- cursor: auto;
65
- }
66
-
67
- .m3-container:enabled.elevated {
68
- background-color: rgb(var(--m3-scheme-surface-container-low));
69
- color: rgb(var(--m3-scheme-primary));
70
- box-shadow: var(--m3-util-elevation-1);
71
- }
72
-
73
- .m3-container:enabled.filled {
74
- background-color: rgb(var(--m3-scheme-primary));
75
- color: rgb(var(--m3-scheme-on-primary));
76
- }
77
-
78
- .m3-container:enabled.tonal {
79
- background-color: rgb(var(--m3-scheme-secondary-container));
80
- color: rgb(var(--m3-scheme-on-secondary-container));
81
- }
82
-
83
- .m3-container.outlined {
84
- background-color: transparent;
85
- border: 0.0625rem solid rgb(var(--m3-scheme-on-surface) / 0.12);
86
- }
87
- .m3-container:enabled.outlined {
88
- border: 0.0625rem solid rgb(var(--m3-scheme-outline));
89
- color: rgb(var(--m3-scheme-primary));
90
- }
91
-
92
- .m3-container.text {
93
- background-color: transparent;
94
- padding: 0 0.75rem;
95
- color: rgb(var(--m3-scheme-primary));
96
- }
97
- .m3-container.text.icon-left {
98
- padding-right: 1rem;
99
- }
100
-
101
- .m3-container {
102
- -webkit-tap-highlight-color: transparent;
103
- }
104
- @media (hover: hover) {
105
- .m3-container:enabled.elevated:hover {
106
- box-shadow: var(--m3-util-elevation-2);
107
- }
108
- .m3-container:enabled.filled:hover {
109
- box-shadow: var(--m3-util-elevation-1);
110
- }
111
- .m3-container:enabled.tonal:hover {
112
- box-shadow: var(--m3-util-elevation-1);
113
- }
114
- }
115
-
116
180
  .m3-container {
117
181
  print-color-adjust: exact;
118
182
  -webkit-print-color-adjust: exact;
@@ -120,7 +184,7 @@
120
184
  @media screen and (forced-colors: active) {
121
185
  .m3-container:is(.elevated, .filled, .tonal) {
122
186
  background-color: transparent;
123
- border: 0.0625rem solid;
187
+ border: 1px solid;
124
188
  }
125
189
  .m3-container:disabled {
126
190
  opacity: 0.38;
@@ -1,36 +1,19 @@
1
- import type { HTMLButtonAttributes } from "svelte/elements";
2
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
16
- default: any;
17
- } ? Props extends Record<string, never> ? any : {
18
- children?: any;
19
- } : {});
20
- declare const Button: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
21
- display?: string;
22
- extraOptions?: HTMLButtonAttributes;
23
- iconType?: "none" | "left" | "full";
24
- type: "elevated" | "filled" | "tonal" | "outlined" | "text";
1
+ import type { HTMLButtonAttributes, HTMLAnchorAttributes, HTMLLabelAttributes } from "svelte/elements";
2
+ import type { Snippet } from "svelte";
3
+ type ActionProps = ({
4
+ click: () => void;
25
5
  disabled?: boolean;
26
- }, {
27
- default: {};
28
- }>, {
29
- click: MouseEvent;
30
- } & {
31
- [evt: string]: CustomEvent<any>;
32
- }, {
33
- default: {};
34
- }, {}, string>;
35
- type Button = InstanceType<typeof Button>;
6
+ } & HTMLButtonAttributes) | ({
7
+ href: string;
8
+ } & HTMLAnchorAttributes) | ({
9
+ for: string;
10
+ } & HTMLLabelAttributes);
11
+ type Props = {
12
+ variant: "elevated" | "filled" | "tonal" | "outlined" | "text";
13
+ square?: boolean;
14
+ iconType?: "none" | "left" | "full";
15
+ children: Snippet;
16
+ } & ActionProps;
17
+ declare const Button: import("svelte").Component<Props, {}, "">;
18
+ type Button = ReturnType<typeof Button>;
36
19
  export default Button;
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+
4
+ let { round = false, children }: { round?: boolean; children: Snippet } = $props();
5
+ </script>
6
+
7
+ <div class="m3-container" class:round>
8
+ {@render children()}
9
+ </div>
10
+
11
+ <style>
12
+ .m3-container {
13
+ display: grid;
14
+ grid-auto-flow: column;
15
+ grid-auto-columns: 1fr;
16
+ gap: 0.125rem;
17
+ border-radius: var(--m3-util-rounding-full);
18
+ overflow: hidden;
19
+
20
+ > :global(input) {
21
+ position: absolute;
22
+ opacity: 0;
23
+ pointer-events: none;
24
+ }
25
+ }
26
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ round?: boolean;
4
+ children: Snippet;
5
+ };
6
+ declare const ConnectedButtons: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type ConnectedButtons = ReturnType<typeof ConnectedButtons>;
8
+ export default ConnectedButtons;
@@ -1,27 +1,41 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLButtonAttributes } from "svelte/elements";
3
- import Icon from "../misc/_icon.svelte";
4
3
  import type { IconifyIcon } from "@iconify/types";
4
+ import Icon from "../misc/_icon.svelte";
5
5
  import Layer from "../misc/Layer.svelte";
6
6
 
7
- export let display = "inline-flex";
8
- export let extraOptions: HTMLButtonAttributes = {};
9
- export let color: "primary" | "surface" | "secondary" | "tertiary" = "primary";
10
- export let size: "small" | "normal" | "large" = "normal";
11
- export let elevation: "normal" | "lowered" | "none" = "normal";
12
- export let icon: IconifyIcon | undefined = undefined;
13
- export let text: string | undefined = undefined;
14
- $: {
15
- if (!icon && !text) console.warn("you need at least something in a FAB");
16
- if (size != "normal" && text) console.warn("extended fabs are supposed to use size normal");
17
- }
7
+ type ContentProps =
8
+ | {
9
+ size?: "normal";
10
+ icon?: IconifyIcon;
11
+ text: string;
12
+ }
13
+ | {
14
+ size?: "small" | "normal" | "large";
15
+ icon: IconifyIcon;
16
+ text?: undefined;
17
+ };
18
+
19
+ let {
20
+ color = "primary",
21
+ elevation = "normal",
22
+ click,
23
+ size = "normal",
24
+ icon,
25
+ text,
26
+ ...extra
27
+ }: {
28
+ color?: "primary" | "surface" | "secondary" | "tertiary";
29
+ elevation?: "normal" | "lowered" | "none";
30
+ click: () => void;
31
+ } & ContentProps &
32
+ HTMLButtonAttributes = $props();
18
33
  </script>
19
34
 
20
35
  <button
21
- on:click
36
+ onclick={click}
22
37
  class="m3-container m3-font-label-large color-{color} size-{size} elevation-{elevation}"
23
- style="display: {display};"
24
- {...extraOptions}
38
+ {...extra}
25
39
  >
26
40
  <Layer />
27
41
  {#if icon}
@@ -39,6 +53,7 @@
39
53
  --m3-fab-large-shape: var(--m3-util-rounding-extra-large);
40
54
  }
41
55
  button {
56
+ display: inline-flex;
42
57
  border: none;
43
58
  position: relative;
44
59
  overflow: hidden;
@@ -1,30 +1,19 @@
1
1
  import type { HTMLButtonAttributes } from "svelte/elements";
2
2
  import type { IconifyIcon } from "@iconify/types";
3
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
- $$bindings?: Bindings;
6
- } & Exports;
7
- (internal: unknown, props: Props & {
8
- $$events?: Events;
9
- $$slots?: Slots;
10
- }): Exports & {
11
- $set?: any;
12
- $on?: any;
13
- };
14
- z_$$bindings?: Bindings;
15
- }
16
- declare const Fab: $$__sveltets_2_IsomorphicComponent<{
17
- display?: string;
18
- extraOptions?: HTMLButtonAttributes;
19
- color?: "primary" | "surface" | "secondary" | "tertiary";
3
+ type ContentProps = {
4
+ size?: "normal";
5
+ icon?: IconifyIcon;
6
+ text: string;
7
+ } | {
20
8
  size?: "small" | "normal" | "large";
9
+ icon: IconifyIcon;
10
+ text?: undefined;
11
+ };
12
+ type $$ComponentProps = {
13
+ color?: "primary" | "surface" | "secondary" | "tertiary";
21
14
  elevation?: "normal" | "lowered" | "none";
22
- icon?: IconifyIcon | undefined;
23
- text?: string | undefined;
24
- }, {
25
- click: MouseEvent;
26
- } & {
27
- [evt: string]: CustomEvent<any>;
28
- }, {}, {}, string>;
29
- type Fab = InstanceType<typeof Fab>;
15
+ click: () => void;
16
+ } & ContentProps & HTMLButtonAttributes;
17
+ declare const Fab: import("svelte").Component<$$ComponentProps, {}, "">;
18
+ type Fab = ReturnType<typeof Fab>;
30
19
  export default Fab;
@@ -1,31 +1,32 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from "svelte";
2
+ import type { Snippet } from "svelte";
3
3
  import type { TransitionConfig } from "svelte/transition";
4
4
  import { easeEmphasizedAccel, easeEmphasizedDecel } from "../misc/easing";
5
5
  import { outroClass } from "../misc/animation";
6
6
 
7
- let height = 480;
8
- let container: HTMLDivElement;
9
- let isDragging = false,
10
- startY = 0;
11
- $: if (height < 48) dispatch("close", "low");
7
+ let { children, close }: { children: Snippet; close: (reason: "esc" | "click" | "low") => void } =
8
+ $props();
9
+
10
+ let height = $state(480);
11
+ let container: HTMLDivElement | undefined = $state();
12
+ let isDragging = $state(false),
13
+ startY = $state(0);
12
14
 
13
- const dispatch = createEventDispatcher();
14
15
  const open = (node: HTMLDialogElement) => node.showModal();
15
16
  const heightAnim = (
16
17
  node: HTMLDialogElement,
17
- options: Record<string, unknown> = {},
18
+ options: { duration: number; easing: typeof easeEmphasizedDecel },
18
19
  ): TransitionConfig => {
19
20
  if (node.clientHeight < height) height = node.clientHeight;
20
21
  return {
21
- duration: 400,
22
- easing: easeEmphasizedDecel,
23
- ...options,
22
+ duration: options.duration,
23
+ easing: options.easing,
24
24
  css: (t) => `max-height: ${t * height}px`,
25
25
  };
26
26
  };
27
27
 
28
28
  const moveWheel = (e: WheelEvent) => {
29
+ e.preventDefault();
29
30
  height += e.deltaY;
30
31
  if (container && container.clientHeight < height) height = container.clientHeight;
31
32
  };
@@ -36,50 +37,55 @@
36
37
  startY = e.clientY;
37
38
  }
38
39
  };
40
+ $effect(() => {
41
+ if (height < 48) close("low");
42
+ });
39
43
  </script>
40
44
 
41
45
  <svelte:window
42
- on:mousemove={moveMouse}
43
- on:mouseup={() => (isDragging = false)}
44
- on:touchmove={(e) => moveMouse(e.touches[0])}
45
- on:touchend={() => (isDragging = false)}
46
+ onmousemove={moveMouse}
47
+ onmouseup={() => (isDragging = false)}
48
+ ontouchmove={(e) => moveMouse(e.touches[0])}
49
+ ontouchend={() => (isDragging = false)}
46
50
  />
47
51
 
48
- <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
49
52
  <dialog
50
53
  class="m3-container"
51
- style="max-height: {height}px"
54
+ style:max-height="{height}px"
52
55
  use:open
53
56
  use:outroClass
54
- on:cancel|preventDefault={() => {
55
- dispatch("close", "browser");
57
+ oncancel={(e) => {
58
+ e.preventDefault();
59
+ close("esc");
56
60
  }}
57
- on:mousedown|self={() => {
58
- dispatch("close", "click");
61
+ onmousedown={(e) => {
62
+ if (e.target != e.currentTarget) return;
63
+ close("click");
59
64
  }}
60
- on:wheel|preventDefault={moveWheel}
61
- in:heightAnim
65
+ onwheel={moveWheel}
66
+ in:heightAnim={{ easing: easeEmphasizedDecel, duration: 400 }}
62
67
  out:heightAnim={{ easing: easeEmphasizedAccel, duration: 300 }}
63
68
  >
64
69
  <div
65
70
  class="container"
66
71
  bind:this={container}
67
- on:touchstart={(e) => {
72
+ ontouchstart={(e) => {
68
73
  isDragging = true;
69
74
  startY = e.touches[0].clientY;
70
75
  }}
71
76
  >
72
- <!-- svelte-ignore a11y-no-static-element-interactions -->
77
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
73
78
  <div
74
79
  class="handle-container"
75
- on:mousedown|preventDefault={(e) => {
80
+ onmousedown={(e) => {
81
+ e.preventDefault();
76
82
  isDragging = true;
77
83
  startY = e.clientY;
78
84
  }}
79
85
  >
80
86
  <div class="handle"></div>
81
87
  </div>
82
- <slot />
88
+ {@render children()}
83
89
  </div>
84
90
  </dialog>
85
91
 
@@ -1,22 +1,8 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const BottomSheet: $$__sveltets_2_IsomorphicComponent<any, {
15
- close: CustomEvent<any>;
16
- } & {
17
- [evt: string]: CustomEvent<any>;
18
- }, {
19
- default: {};
20
- }, {}, string>;
21
- type BottomSheet = InstanceType<typeof BottomSheet>;
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ close: (reason: "esc" | "click" | "low") => void;
5
+ };
6
+ declare const BottomSheet: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type BottomSheet = ReturnType<typeof BottomSheet>;
22
8
  export default BottomSheet;