@noxlovette/material 0.4.8 → 0.5.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.
Files changed (144) hide show
  1. package/dist/animation/Shapes.stories.svelte +56 -0
  2. package/dist/animation/Shapes.stories.svelte.d.ts +3 -0
  3. package/dist/animation/TransitionPatterns.stories.svelte +359 -0
  4. package/dist/animation/TransitionPatterns.stories.svelte.d.ts +3 -0
  5. package/dist/animation/containerTransform.d.ts +35 -12
  6. package/dist/animation/containerTransform.js +31 -138
  7. package/dist/animation/enterExit.d.ts +30 -3
  8. package/dist/animation/enterExit.js +69 -22
  9. package/dist/animation/index.d.ts +2 -1
  10. package/dist/animation/index.js +2 -1
  11. package/dist/animation/presence.svelte.d.ts +47 -0
  12. package/dist/animation/presence.svelte.js +84 -0
  13. package/dist/animation/shapeMorph.svelte.d.ts +52 -0
  14. package/dist/animation/shapeMorph.svelte.js +112 -0
  15. package/dist/animation/shapesAnimatableSmall.d.ts +28 -22
  16. package/dist/animation/shapesAnimatableSmall.js +32 -23
  17. package/dist/animation/sharedAxisTransition.d.ts +57 -37
  18. package/dist/animation/sharedAxisTransition.js +74 -22
  19. package/dist/animation/skeleton.d.ts +16 -0
  20. package/dist/animation/skeleton.js +28 -0
  21. package/dist/animation/spring.d.ts +61 -0
  22. package/dist/animation/spring.js +53 -0
  23. package/dist/animation/springValue.svelte.d.ts +22 -0
  24. package/dist/animation/springValue.svelte.js +42 -0
  25. package/dist/animation/transition.d.ts +3 -1
  26. package/dist/animation/transition.js +3 -1
  27. package/dist/attachments/clickOutside.d.ts +13 -0
  28. package/dist/attachments/clickOutside.js +18 -0
  29. package/dist/attachments/index.d.ts +1 -0
  30. package/dist/attachments/index.js +1 -0
  31. package/dist/components/buttons/FAB.svelte +23 -16
  32. package/dist/components/buttons/FABMenu.svelte +24 -29
  33. package/dist/components/buttons/FABMenu.svelte.d.ts +2 -1
  34. package/dist/components/buttons/FABMenuItem.svelte +23 -20
  35. package/dist/components/buttons/FABMenuItem.svelte.d.ts +5 -1
  36. package/dist/components/buttons/split-button/SplitButton.svelte +10 -17
  37. package/dist/components/buttons/split-button/theme.js +1 -1
  38. package/dist/components/buttons/types.d.ts +3 -3
  39. package/dist/components/cards/theme.js +1 -1
  40. package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +8 -12
  41. package/dist/components/containers/bottom-sheet/BottomSheet.svelte +67 -55
  42. package/dist/components/containers/bottom-sheet/BottomSheet.svelte.d.ts +1 -1
  43. package/dist/components/containers/bottom-sheet/types.d.ts +8 -2
  44. package/dist/components/containers/context-menu/ContextMenu.svelte +23 -36
  45. package/dist/components/containers/context-menu/theme.js +2 -2
  46. package/dist/components/containers/dialogue/Dialogue.svelte +49 -65
  47. package/dist/components/containers/link-preview/LinkPreview.svelte +12 -23
  48. package/dist/components/containers/link-preview/theme.d.ts +3 -3
  49. package/dist/components/containers/menu/Menu.svelte +14 -21
  50. package/dist/components/containers/menu/MenuSub.svelte +10 -17
  51. package/dist/components/containers/pane/DraggablePane.svelte +90 -5
  52. package/dist/components/containers/pane/DraggablePane.svelte.d.ts +1 -1
  53. package/dist/components/containers/pane/theme.js +2 -2
  54. package/dist/components/containers/popover/Popover.svelte +31 -42
  55. package/dist/components/containers/popover/theme.d.ts +3 -3
  56. package/dist/components/containers/scroll-area/theme.js +2 -2
  57. package/dist/components/containers/side-sheet/SideSheet.stories.svelte +10 -15
  58. package/dist/components/containers/side-sheet/SideSheet.svelte +44 -44
  59. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +4 -3
  60. package/dist/components/containers/side-sheet/types.d.ts +8 -2
  61. package/dist/components/date/DateField.svelte +99 -92
  62. package/dist/components/date/DateField.svelte.d.ts +4 -5
  63. package/dist/components/date/DateRangeField.svelte +127 -155
  64. package/dist/components/date/DateRangeField.svelte.d.ts +4 -5
  65. package/dist/components/date/calendarMotion.d.ts +9 -0
  66. package/dist/components/date/calendarMotion.js +23 -0
  67. package/dist/components/date/theme.d.ts +95 -0
  68. package/dist/components/date/theme.js +103 -14
  69. package/dist/components/date/types.d.ts +13 -0
  70. package/dist/components/forms/checkbox/theme.js +2 -2
  71. package/dist/components/forms/command/theme.d.ts +3 -3
  72. package/dist/components/forms/command/theme.js +1 -1
  73. package/dist/components/forms/pin/theme.js +2 -2
  74. package/dist/components/forms/radio-group/theme.js +2 -2
  75. package/dist/components/forms/select/Select.svelte +42 -54
  76. package/dist/components/forms/select/theme.js +4 -4
  77. package/dist/components/forms/slider/Slider.svelte +144 -126
  78. package/dist/components/forms/slider/Slider.svelte.d.ts +3 -0
  79. package/dist/components/forms/slider/theme.d.ts +154 -48
  80. package/dist/components/forms/slider/theme.js +60 -20
  81. package/dist/components/forms/slider/types.d.ts +1 -1
  82. package/dist/components/forms/switch/theme.js +4 -4
  83. package/dist/components/forms/textfield/Textfield.svelte +1 -1
  84. package/dist/components/forms/textfield/theme.d.ts +12 -0
  85. package/dist/components/forms/textfield/theme.js +30 -10
  86. package/dist/components/forms/toggle-group/theme.js +1 -1
  87. package/dist/components/forms/tooltip/Tooltip.svelte +24 -35
  88. package/dist/components/nav/breadcrumb/theme.js +1 -1
  89. package/dist/components/nav/navbar/theme.js +2 -2
  90. package/dist/components/nav/rail/Rail.svelte +4 -5
  91. package/dist/components/nav/rail/theme.js +7 -7
  92. package/dist/components/nav/tabs/TabHolder.svelte +29 -3
  93. package/dist/components/nav/tabs/TabHolder.svelte.d.ts +3 -1
  94. package/dist/components/nav/tabs/theme.js +1 -1
  95. package/dist/components/progress/CircularProgress.svelte +78 -4
  96. package/dist/components/progress/CircularProgress.svelte.d.ts +5 -0
  97. package/dist/components/progress/LinearProgress.svelte +70 -7
  98. package/dist/components/progress/LinearProgress.svelte.d.ts +5 -0
  99. package/dist/components/progress/WavyLinearProgress.svelte +27 -3
  100. package/dist/components/progress/WavyLinearProgress.svelte.d.ts +3 -0
  101. package/dist/components/progress/_wavy.d.ts +2 -0
  102. package/dist/components/progress/_wavy.js +3 -1
  103. package/dist/components/snackbar/Snackbar.svelte +13 -17
  104. package/dist/components/table/TableBody.svelte +3 -16
  105. package/dist/components/table/TableBody.svelte.d.ts +1 -5
  106. package/dist/components/table/TableHeader.svelte +1 -1
  107. package/dist/components/table/theme.js +1 -1
  108. package/dist/components/table/types.d.ts +0 -7
  109. package/dist/components/time/TimeField.stories.svelte +41 -0
  110. package/dist/components/time/TimeField.stories.svelte.d.ts +19 -0
  111. package/dist/components/time/TimeField.svelte +69 -62
  112. package/dist/components/time/TimeField.svelte.d.ts +6 -0
  113. package/dist/components/time/TimepickerInput.svelte +8 -4
  114. package/dist/components/time/types.d.ts +11 -1
  115. package/dist/components/toolbar/theme.js +2 -2
  116. package/dist/index.d.ts +1 -1
  117. package/dist/index.js +1 -1
  118. package/dist/styles/component.css +21 -22
  119. package/dist/styles/motion.css +317 -38
  120. package/dist/utils/Layer.svelte +16 -29
  121. package/dist/utils/icon/LoadingIndicator.svelte +61 -22
  122. package/dist/utils/icon/loadingShapes.d.ts +1 -0
  123. package/dist/utils/icon/loadingShapes.js +16 -0
  124. package/package.json +5 -2
  125. package/dist/actions/clickOutside.d.ts +0 -3
  126. package/dist/actions/clickOutside.js +0 -13
  127. package/dist/actions/floating.d.ts +0 -20
  128. package/dist/actions/floating.js +0 -87
  129. package/dist/actions/index.d.ts +0 -6
  130. package/dist/actions/index.js +0 -6
  131. package/dist/actions/keyboard.d.ts +0 -3
  132. package/dist/actions/keyboard.js +0 -14
  133. package/dist/actions/portal.d.ts +0 -3
  134. package/dist/actions/portal.js +0 -8
  135. package/dist/actions/positionFloating.d.ts +0 -10
  136. package/dist/actions/positionFloating.js +0 -59
  137. package/dist/actions/rovingFocusGroup.d.ts +0 -20
  138. package/dist/actions/rovingFocusGroup.js +0 -82
  139. package/dist/animation/easing.d.ts +0 -6
  140. package/dist/animation/easing.js +0 -78
  141. package/dist/animation/outroClass.d.ts +0 -3
  142. package/dist/animation/outroClass.js +0 -20
  143. package/dist/animation/transitionTypes.d.ts +0 -8
  144. package/dist/animation/transitionTypes.js +0 -1
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './actions/index.js';
2
1
  export * from './animation/index.js';
2
+ export * from './attachments/index.js';
3
3
  export * from './components/index.js';
4
4
  export * from './utils/index.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export * from './actions/index.js';
2
1
  export * from './animation/index.js';
2
+ export * from './attachments/index.js';
3
3
  export * from './components/index.js';
4
4
  export * from './utils/index.js';
@@ -12,17 +12,20 @@
12
12
  * `fixed`/`absolute`/`sticky` override. Baking it into this custom class's own compiled
13
13
  * CSS rule would set `position` outside of anything twMerge can see or override. */
14
14
  @apply state-layer md-sys-state-focus-indicator disabled:bg-md-sys-color-on-surface/10 disabled:text-md-sys-color-on-surface/38 disabled:before:bg-md-sys-color-on-surface/38 inline-flex items-center justify-center select-none disabled:cursor-not-allowed;
15
- transition: box-shadow var(--md-sys-motion-duration, 200ms)
16
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
15
+ transition: box-shadow var(--md-sys-motion-duration-effects-spring)
16
+ var(--md-sys-motion-timing-function-effects-spring);
17
17
  }
18
18
 
19
+ /* Shape morphs run on the fast spatial spring in both directions (press and release). */
19
20
  .md-btn-morph {
20
21
  border-radius: var(--btn-shape-override, var(--btn-shape, 9999px));
21
- transition: border-radius 200ms var(--md-sys-motion-timing-function-emphasized-accel);
22
+ transition: border-radius var(--md-sys-motion-duration-fast-spatial)
23
+ var(--md-sys-motion-timing-function-fast-spatial);
22
24
 
23
25
  &::before {
24
26
  border-radius: inherit;
25
- transition: border-radius 200ms var(--md-sys-motion-timing-function-emphasized-accel);
27
+ transition: border-radius var(--md-sys-motion-duration-fast-spatial)
28
+ var(--md-sys-motion-timing-function-fast-spatial);
26
29
  }
27
30
 
28
31
  &:active:not(:disabled) {
@@ -30,7 +33,6 @@
30
33
  --btn-pressed-shape,
31
34
  var(--btn-shape-override, var(--btn-shape, 9999px))
32
35
  ) !important;
33
- transition-timing-function: var(--md-sys-motion-timing-function-emphasized-decel);
34
36
  }
35
37
  }
36
38
 
@@ -85,9 +87,10 @@
85
87
  > * {
86
88
  padding-inline: var(--btn-group-base-px, 1rem);
87
89
  transition:
88
- padding-inline var(--md-sys-motion-duration-fast-spatial, 350ms)
89
- var(--md-sys-motion-timing-function-fast-spatial, cubic-bezier(0.42, 1.67, 0.21, 0.9)),
90
- border-radius 200ms var(--md-sys-motion-timing-function-emphasized-accel);
90
+ padding-inline var(--md-sys-motion-duration-fast-spatial)
91
+ var(--md-sys-motion-timing-function-fast-spatial),
92
+ border-radius var(--md-sys-motion-duration-fast-spatial)
93
+ var(--md-sys-motion-timing-function-fast-spatial);
91
94
  }
92
95
 
93
96
  > *:active:not(:disabled) {
@@ -114,11 +117,12 @@
114
117
  .md-btn-connected {
115
118
  border-radius: var(--cbg-inner, 9999px);
116
119
  transition:
117
- border-radius 250ms var(--md-sys-motion-timing-function-emphasized-accel),
118
- background-color var(--md-sys-motion-duration-fast, 150ms)
119
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1)),
120
- color var(--md-sys-motion-duration-fast, 150ms)
121
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
120
+ border-radius var(--md-sys-motion-duration-fast-spatial)
121
+ var(--md-sys-motion-timing-function-fast-spatial),
122
+ background-color var(--md-sys-motion-duration-fast-effects-spring)
123
+ var(--md-sys-motion-timing-function-fast-effects-spring),
124
+ color var(--md-sys-motion-duration-fast-effects-spring)
125
+ var(--md-sys-motion-timing-function-fast-effects-spring);
122
126
 
123
127
  &:only-child {
124
128
  border-radius: var(--cbg-outer, 9999px);
@@ -144,11 +148,6 @@
144
148
  &:active:not(:disabled),
145
149
  &[data-state='on'] {
146
150
  border-radius: var(--cbg-inner, 4px) !important;
147
- transition-timing-function: var(--md-sys-motion-timing-function-emphasized-decel);
148
- }
149
-
150
- &:active:not(:disabled) {
151
- transition-duration: 150ms;
152
151
  }
153
152
  }
154
153
 
@@ -245,8 +244,8 @@
245
244
 
246
245
  .text-link {
247
246
  @apply text-md-sys-color-primary hover:text-md-sys-color-secondary underline;
248
- transition: color var(--md-sys-motion-duration, 200ms)
249
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
247
+ transition: color var(--md-sys-motion-duration-effects-spring)
248
+ var(--md-sys-motion-timing-function-effects-spring);
250
249
  }
251
250
 
252
251
  .text-link.md-sys-typescale-label-small {
@@ -270,7 +269,7 @@
270
269
  @utility state-layer {
271
270
  @apply before:pointer-events-none before:absolute before:inset-0 before:content-[''];
272
271
  &::before {
273
- transition: background-color var(--md-sys-motion-duration-fast, 150ms)
274
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
272
+ transition: background-color var(--md-sys-motion-duration-fast-effects-spring)
273
+ var(--md-sys-motion-timing-function-fast-effects-spring);
275
274
  }
276
275
  }
@@ -1,54 +1,333 @@
1
1
  @theme {
2
- /* Expressive easing */
3
- --md-sys-motion-timing-function-fast-spatial: cubic-bezier(0.42, 1.67, 0.21, 0.9);
4
- --md-sys-motion-duration-fast-spatial: 350ms;
2
+ /* Expressive springs — generated from src/lib/animation/spring.ts, do not edit by hand.
3
+ Regenerate with `bun scripts/generate-motion-springs.ts`. Each is a `linear()` sampling of a
4
+ real spring plus its settle time. Spatial tokens overshoot; effects tokens don't. */
5
+ /* @generated:springs:start */
6
+ --md-sys-motion-timing-function-fast-spatial: linear(
7
+ 0,
8
+ 0.0373,
9
+ 0.1315,
10
+ 0.2592,
11
+ 0.4017,
12
+ 0.5444,
13
+ 0.6773,
14
+ 0.794,
15
+ 0.8908,
16
+ 0.9669,
17
+ 1.023,
18
+ 1.061,
19
+ 1.0835,
20
+ 1.0935,
21
+ 1.094,
22
+ 1.0877,
23
+ 1.0771,
24
+ 1.0642,
25
+ 1.0505,
26
+ 1.0373,
27
+ 1.0253,
28
+ 1.0151,
29
+ 1.0068,
30
+ 1.0005,
31
+ 0.996,
32
+ 0.9931,
33
+ 0.9915,
34
+ 0.991,
35
+ 0.9913,
36
+ 0.9921,
37
+ 0.9932,
38
+ 0.9945,
39
+ 0.9958,
40
+ 0.997,
41
+ 0.9981,
42
+ 0.9989,
43
+ 0.9996,
44
+ 1.0002,
45
+ 1.0005,
46
+ 1.0007,
47
+ 1
48
+ );
49
+ --md-sys-motion-duration-fast-spatial: 410ms;
5
50
  --md-sys-motion-easing-fast-spatial: var(--md-sys-motion-timing-function-fast-spatial)
6
51
  var(--md-sys-motion-duration-fast-spatial);
7
52
 
8
- --md-sys-motion-timing-function-spatial: cubic-bezier(0.38, 1.21, 0.22, 1);
9
- --md-sys-motion-duration-spatial: 500ms;
53
+ --md-sys-motion-timing-function-spatial: linear(
54
+ 0,
55
+ 0.0178,
56
+ 0.0639,
57
+ 0.1291,
58
+ 0.206,
59
+ 0.2888,
60
+ 0.373,
61
+ 0.4554,
62
+ 0.5338,
63
+ 0.6066,
64
+ 0.6728,
65
+ 0.732,
66
+ 0.7841,
67
+ 0.8294,
68
+ 0.868,
69
+ 0.9006,
70
+ 0.9276,
71
+ 0.9498,
72
+ 0.9675,
73
+ 0.9816,
74
+ 0.9924,
75
+ 1.0005,
76
+ 1.0064,
77
+ 1.0105,
78
+ 1.0131,
79
+ 1.0146,
80
+ 1.0151,
81
+ 1.015,
82
+ 1.0145,
83
+ 1.0135,
84
+ 1.0124,
85
+ 1.0112,
86
+ 1.0099,
87
+ 1.0086,
88
+ 1.0074,
89
+ 1.0063,
90
+ 1.0053,
91
+ 1.0043,
92
+ 1.0035,
93
+ 1.0028,
94
+ 1.0022,
95
+ 1.0017,
96
+ 1.0012,
97
+ 1.0009,
98
+ 1.0006,
99
+ 1.0003,
100
+ 1.0002,
101
+ 1,
102
+ 1
103
+ );
104
+ --md-sys-motion-duration-spatial: 490ms;
10
105
  --md-sys-motion-easing-spatial: var(--md-sys-motion-timing-function-spatial)
11
106
  var(--md-sys-motion-duration-spatial);
12
107
 
13
- --md-sys-motion-timing-function-slow-spatial: cubic-bezier(0.39, 1.29, 0.35, 0.98);
14
- --md-sys-motion-duration-slow-spatial: 650ms;
108
+ --md-sys-motion-timing-function-slow-spatial: linear(
109
+ 0,
110
+ 0.0095,
111
+ 0.0354,
112
+ 0.0736,
113
+ 0.121,
114
+ 0.1749,
115
+ 0.2329,
116
+ 0.2931,
117
+ 0.3539,
118
+ 0.4141,
119
+ 0.4728,
120
+ 0.5291,
121
+ 0.5825,
122
+ 0.6326,
123
+ 0.6792,
124
+ 0.7221,
125
+ 0.7613,
126
+ 0.7969,
127
+ 0.8289,
128
+ 0.8575,
129
+ 0.8828,
130
+ 0.9051,
131
+ 0.9245,
132
+ 0.9414,
133
+ 0.9559,
134
+ 0.9682,
135
+ 0.9785,
136
+ 0.9872,
137
+ 0.9943,
138
+ 1,
139
+ 1.0046,
140
+ 1.0081,
141
+ 1.0108,
142
+ 1.0127,
143
+ 1.014,
144
+ 1.0148,
145
+ 1.0151,
146
+ 1.0151,
147
+ 1.0148,
148
+ 1.0143,
149
+ 1.0137,
150
+ 1.0129,
151
+ 1.012,
152
+ 1.0111,
153
+ 1.0102,
154
+ 1.0093,
155
+ 1.0084,
156
+ 1.0075,
157
+ 1.0067,
158
+ 1.0059,
159
+ 1.0052,
160
+ 1.0045,
161
+ 1.0039,
162
+ 1.0033,
163
+ 1.0028,
164
+ 1.0024,
165
+ 1.0019,
166
+ 1.0016,
167
+ 1.0013,
168
+ 1.001,
169
+ 1.0008,
170
+ 1.0006,
171
+ 1.0004,
172
+ 1.0003,
173
+ 1.0001,
174
+ 1
175
+ );
176
+ --md-sys-motion-duration-slow-spatial: 660ms;
15
177
  --md-sys-motion-easing-slow-spatial: var(--md-sys-motion-timing-function-slow-spatial)
16
178
  var(--md-sys-motion-duration-slow-spatial);
17
179
 
18
- /* Standard easing — md.sys.motion.easing.standard, cubic-bezier(0.2, 0, 0, 1) per
19
- m3.material.io/styles/motion/easing-and-duration/tokens-specs. Same curve across all
20
- three durations; only the duration changes per tier. */
21
- --md-sys-motion-timing-function-fast: cubic-bezier(0.2, 0, 0, 1);
22
- --md-sys-motion-duration-fast: 150ms;
23
- --md-sys-motion-easing-fast: var(--md-sys-motion-timing-function-fast)
24
- var(--md-sys-motion-duration-fast);
25
-
26
- --md-sys-motion-timing-function: cubic-bezier(0.2, 0, 0, 1);
27
- --md-sys-motion-duration: 200ms;
28
- --md-sys-motion-easing: var(--md-sys-motion-timing-function) var(--md-sys-motion-duration);
180
+ --md-sys-motion-timing-function-fast-effects-spring: linear(
181
+ 0,
182
+ 0.1389,
183
+ 0.3737,
184
+ 0.5809,
185
+ 0.7331,
186
+ 0.8356,
187
+ 0.9011,
188
+ 0.9416,
189
+ 0.966,
190
+ 0.9804,
191
+ 0.9888,
192
+ 0.9936,
193
+ 0.9964,
194
+ 0.998,
195
+ 0.9989,
196
+ 0.9994,
197
+ 0.9997,
198
+ 0.9998,
199
+ 1
200
+ );
201
+ --md-sys-motion-duration-fast-effects-spring: 190ms;
202
+ --md-sys-motion-easing-fast-effects-spring: var(
203
+ --md-sys-motion-timing-function-fast-effects-spring
204
+ )
205
+ var(--md-sys-motion-duration-fast-effects-spring);
29
206
 
30
- --md-sys-motion-timing-function-slow: cubic-bezier(0.2, 0, 0, 1);
31
- --md-sys-motion-duration-slow: 300ms;
32
- --md-sys-motion-easing-slow: var(--md-sys-motion-timing-function-slow)
33
- var(--md-sys-motion-duration-slow);
207
+ --md-sys-motion-timing-function-effects-spring: linear(
208
+ 0,
209
+ 0.0657,
210
+ 0.2023,
211
+ 0.354,
212
+ 0.4947,
213
+ 0.6144,
214
+ 0.7111,
215
+ 0.7866,
216
+ 0.8442,
217
+ 0.8873,
218
+ 0.9191,
219
+ 0.9423,
220
+ 0.9591,
221
+ 0.9711,
222
+ 0.9797,
223
+ 0.9858,
224
+ 0.9901,
225
+ 0.9931,
226
+ 0.9952,
227
+ 0.9967,
228
+ 0.9977,
229
+ 0.9984,
230
+ 0.9989,
231
+ 0.9993,
232
+ 0.9995,
233
+ 0.9996,
234
+ 1
235
+ );
236
+ --md-sys-motion-duration-effects-spring: 270ms;
237
+ --md-sys-motion-easing-effects-spring: var(--md-sys-motion-timing-function-effects-spring)
238
+ var(--md-sys-motion-duration-effects-spring);
34
239
 
35
- --md-sys-motion-timing-function-emphasized: linear(
240
+ --md-sys-motion-timing-function-slow-effects-spring: linear(
36
241
  0,
37
- 0.034 6%,
38
- 0.073 9%,
39
- 0.126 11%,
40
- 0.194 13%,
41
- 0.273 15%,
42
- 0.351 16%,
43
- 0.541 18%,
44
- 0.652 20%,
45
- 0.755 24%,
46
- 0.839 30%,
47
- 0.91 39%,
48
- 0.959 53%,
49
- 0.989 72%,
242
+ 0.0349,
243
+ 0.1158,
244
+ 0.2173,
245
+ 0.3239,
246
+ 0.4265,
247
+ 0.5204,
248
+ 0.6034,
249
+ 0.675,
250
+ 0.7357,
251
+ 0.7865,
252
+ 0.8285,
253
+ 0.8629,
254
+ 0.8908,
255
+ 0.9134,
256
+ 0.9315,
257
+ 0.946,
258
+ 0.9576,
259
+ 0.9667,
260
+ 0.974,
261
+ 0.9797,
262
+ 0.9841,
263
+ 0.9877,
264
+ 0.9904,
265
+ 0.9926,
266
+ 0.9942,
267
+ 0.9955,
268
+ 0.9965,
269
+ 0.9973,
270
+ 0.9979,
271
+ 0.9984,
272
+ 0.9988,
273
+ 0.9991,
274
+ 0.9993,
275
+ 0.9994,
276
+ 0.9996,
50
277
  1
51
278
  );
52
- --md-sys-motion-timing-function-emphasized-accel: cubic-bezier(0.3, 0, 0.8, 0.15);
53
- --md-sys-motion-timing-function-emphasized-decel: cubic-bezier(0.05, 0.7, 0.1, 1);
279
+ --md-sys-motion-duration-slow-effects-spring: 370ms;
280
+ --md-sys-motion-easing-slow-effects-spring: var(
281
+ --md-sys-motion-timing-function-slow-effects-spring
282
+ )
283
+ var(--md-sys-motion-duration-slow-effects-spring);
284
+ /* @generated:springs:end */
285
+ }
286
+
287
+ /*
288
+ One utility per Expressive spring, setting duration + timing function together. Pair with a
289
+ Tailwind transition-property utility: `transition-colors md-sys-motion-fast-effects`.
290
+ They set Tailwind's own --tw-duration/--tw-ease, so they win over `transition-*` regardless of
291
+ source order.
292
+
293
+ - spatial: position, size, shape (transform, width, top, border-radius…). Overshoots slightly.
294
+ - effects: color, opacity, shadow. Critically damped, never overshoots.
295
+ - fast-*: small parts and direct feedback (handles, indicators, hover/press); default: component
296
+ containers; slow-*: large or full-screen surfaces.
297
+ */
298
+ @utility md-sys-motion-fast-spatial {
299
+ --tw-duration: var(--md-sys-motion-duration-fast-spatial);
300
+ --tw-ease: var(--md-sys-motion-timing-function-fast-spatial);
301
+ transition-duration: var(--md-sys-motion-duration-fast-spatial);
302
+ transition-timing-function: var(--md-sys-motion-timing-function-fast-spatial);
303
+ }
304
+ @utility md-sys-motion-spatial {
305
+ --tw-duration: var(--md-sys-motion-duration-spatial);
306
+ --tw-ease: var(--md-sys-motion-timing-function-spatial);
307
+ transition-duration: var(--md-sys-motion-duration-spatial);
308
+ transition-timing-function: var(--md-sys-motion-timing-function-spatial);
309
+ }
310
+ @utility md-sys-motion-slow-spatial {
311
+ --tw-duration: var(--md-sys-motion-duration-slow-spatial);
312
+ --tw-ease: var(--md-sys-motion-timing-function-slow-spatial);
313
+ transition-duration: var(--md-sys-motion-duration-slow-spatial);
314
+ transition-timing-function: var(--md-sys-motion-timing-function-slow-spatial);
315
+ }
316
+ @utility md-sys-motion-fast-effects {
317
+ --tw-duration: var(--md-sys-motion-duration-fast-effects-spring);
318
+ --tw-ease: var(--md-sys-motion-timing-function-fast-effects-spring);
319
+ transition-duration: var(--md-sys-motion-duration-fast-effects-spring);
320
+ transition-timing-function: var(--md-sys-motion-timing-function-fast-effects-spring);
321
+ }
322
+ @utility md-sys-motion-effects {
323
+ --tw-duration: var(--md-sys-motion-duration-effects-spring);
324
+ --tw-ease: var(--md-sys-motion-timing-function-effects-spring);
325
+ transition-duration: var(--md-sys-motion-duration-effects-spring);
326
+ transition-timing-function: var(--md-sys-motion-timing-function-effects-spring);
327
+ }
328
+ @utility md-sys-motion-slow-effects {
329
+ --tw-duration: var(--md-sys-motion-duration-slow-effects-spring);
330
+ --tw-ease: var(--md-sys-motion-timing-function-slow-effects-spring);
331
+ transition-duration: var(--md-sys-motion-duration-slow-effects-spring);
332
+ transition-timing-function: var(--md-sys-motion-timing-function-slow-effects-spring);
54
333
  }
@@ -1,4 +1,7 @@
1
1
  <script module lang="ts">
2
+ import { animate } from 'motion';
3
+ import { springTokens, springTransition } from '../animation/spring.js';
4
+
2
5
  let initialized = false;
3
6
 
4
7
  const activePointerRipples: (() => void)[] = [];
@@ -24,7 +27,6 @@
24
27
  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return null;
25
28
 
26
29
  const size = Math.hypot(Math.max(x, width - x), Math.max(y, height - y)) * 2.5;
27
- const speed = Math.max(Math.min(Math.log(size) * 50, 600), 200);
28
30
 
29
31
  const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient');
30
32
  gradient.id = `ripple-${Date.now()}-${Math.random().toString(36).slice(2)}`;
@@ -44,20 +46,12 @@
44
46
  const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
45
47
  circle.setAttribute('cx', `${x}`);
46
48
  circle.setAttribute('cy', `${y}`);
47
- circle.setAttribute('r', '0');
49
+ circle.setAttribute('r', `${size / 2}`);
48
50
  circle.setAttribute('fill', `url(#${gradient.id})`);
49
-
50
- const expand = document.createElementNS('http://www.w3.org/2000/svg', 'animate');
51
- expand.setAttribute('attributeName', 'r');
52
- expand.setAttribute('from', '0');
53
- expand.setAttribute('to', `${size / 2}`);
54
- expand.setAttribute('dur', `${speed}ms`);
55
- expand.setAttribute('fill', 'freeze');
56
- expand.setAttribute('calcMode', 'spline');
57
- // md.sys.motion.easing.standard: cubic-bezier(0.2, 0, 0, 1) — keep in sync with
58
- // --md-sys-motion-timing-function in motion.css (SMIL keySplines can't reference CSS vars).
59
- expand.setAttribute('keySplines', '0.2 0, 0 1');
60
- circle.appendChild(expand);
51
+ // Grow by scale rather than `r`: transform runs on WAAPI, an SVG attribute would not.
52
+ circle.style.transformBox = 'fill-box';
53
+ circle.style.transformOrigin = 'center';
54
+ circle.style.transform = 'scale(0)';
61
55
 
62
56
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
63
57
  svg.classList.add('m3-ripple');
@@ -99,20 +93,13 @@
99
93
 
100
94
  node.appendChild(svg);
101
95
 
96
+ // Ripples are an effect, not layout: critically damped springs, no overshoot.
97
+ animate(circle, { transform: 'scale(1)' }, springTransition(springTokens.slowEffects));
98
+
102
99
  return () => {
103
- const fade = document.createElementNS('http://www.w3.org/2000/svg', 'animate');
104
- fade.setAttribute('attributeName', 'opacity');
105
- fade.setAttribute('from', '1');
106
- fade.setAttribute('to', '0');
107
- fade.setAttribute('dur', '800ms');
108
- fade.setAttribute('fill', 'freeze');
109
- fade.setAttribute('calcMode', 'spline');
110
- // md.sys.motion.easing.standard: cubic-bezier(0.2, 0, 0, 1) — keep in sync with
111
- // --md-sys-motion-timing-function in motion.css (SMIL keySplines can't reference CSS vars).
112
- fade.setAttribute('keySplines', '0.2 0, 0 1');
113
- circle.appendChild(fade);
114
- fade.beginElement();
115
- setTimeout(() => svg.remove(), 800);
100
+ animate(circle, { opacity: 0 }, springTransition(springTokens.slowEffects)).then(() =>
101
+ svg.remove()
102
+ );
116
103
  };
117
104
  };
118
105
 
@@ -199,8 +186,8 @@
199
186
 
200
187
  background-color: currentColor;
201
188
  opacity: 0;
202
- transition: opacity var(--md-sys-motion-duration-fast, 150ms)
203
- var(--md-sys-motion-timing-function, cubic-bezier(0.2, 0, 0, 1));
189
+ transition: opacity var(--md-sys-motion-duration-fast-effects-spring)
190
+ var(--md-sys-motion-timing-function-fast-effects-spring);
204
191
 
205
192
  &:not(
206
193
  :global(input:disabled + label) > .tint,
@@ -1,3 +1,61 @@
1
+ <script module lang="ts">
2
+ import { animate, mix, type AnimationPlaybackControls } from 'motion';
3
+ import type { Attachment } from 'svelte/attachments';
4
+ import { springTransition } from '../../animation/spring.js';
5
+ import { LOADING_SHAPES } from './loadingShapes.js';
6
+
7
+ /*
8
+ Component-level values from the M3 loading indicator (Jetpack Compose `LoadingIndicator`, the
9
+ reference implementation): a new morph every 650ms on a 200 / 0.6 spring, each morph adding a
10
+ quarter turn, on top of a constant full turn every 4666ms. The spring is the component's own,
11
+ not one of the system springs in spring.ts.
12
+ https://m3.material.io/components/loading-indicator/specs
13
+ */
14
+ const MORPH_INTERVAL_MS = 650;
15
+ const MORPH_SPRING = springTransition({ stiffness: 200, dampingRatio: 0.6 });
16
+ const MORPH_ROTATION_DEG = 90;
17
+ const GLOBAL_ROTATION_S = 4.666;
18
+
19
+ /** Constant spin — a linear transform, so Motion hands it to WAAPI. */
20
+ const spin: Attachment<SVGGElement> = (group) => {
21
+ const controls = animate(
22
+ group,
23
+ { transform: ['rotate(0deg)', 'rotate(360deg)'] },
24
+ { duration: GLOBAL_ROTATION_S, ease: 'linear', repeat: Infinity }
25
+ );
26
+ return () => controls.stop();
27
+ };
28
+
29
+ /** Morphs to the next shape every interval; the spring's overshoot also swings the quarter turn. */
30
+ const morph: Attachment<SVGPathElement> = (path) => {
31
+ let index = 0;
32
+ let controls: AnimationPlaybackControls | undefined;
33
+
34
+ const next = () => {
35
+ const shape = mix(
36
+ LOADING_SHAPES[index % LOADING_SHAPES.length],
37
+ LOADING_SHAPES[(index + 1) % LOADING_SHAPES.length]
38
+ );
39
+ const turn = (index % 4) * MORPH_ROTATION_DEG;
40
+ controls = animate(0, 1, {
41
+ ...MORPH_SPRING,
42
+ onUpdate: (progress) => {
43
+ path.setAttribute('d', shape(progress));
44
+ path.setAttribute('transform', `rotate(${turn + progress * MORPH_ROTATION_DEG} 24 24)`);
45
+ }
46
+ });
47
+ index++;
48
+ };
49
+
50
+ next();
51
+ const timer = setInterval(next, MORPH_INTERVAL_MS);
52
+ return () => {
53
+ clearInterval(timer);
54
+ controls?.stop();
55
+ };
56
+ };
57
+ </script>
58
+
1
59
  <script lang="ts">
2
60
  import type { LoadingIndicatorProps } from './types.js';
3
61
  import { loadingIndicator } from './theme.js';
@@ -14,26 +72,7 @@
14
72
  </script>
15
73
 
16
74
  <svg width={size} height={size} class={styling} viewBox="0 0 48 48">
17
- <path fill="currentColor">
18
- <animate
19
- attributeName="d"
20
- dur="5s"
21
- repeatCount="indefinite"
22
- calcMode="spline"
23
- keySplines="0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8"
24
- keyTimes="0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1"
25
- values="m37.4 24.7 0.5 0.7 0.8 0.9 0.8 1.0 0.6 1.0 -0.1 0.8 -0.0 0.1 -0.6 0.7 -1.1 0.5 -1.3 0.3 -1.0 0.2 -0.9 0.4 -0.7 1.1 0.1 1.0 0.1 1.1 0.0 1.2 -0.2 1.1 -0.4 0.5 -0.3 0.2 -0.8 0.2 -1.2 -0.4 -1.2 -0.4 -1.0 -0.5 -0.8 -0.1 -1.3 0.5 -0.5 0.8 -0.6 0.9 -0.6 1.0 -0.8 0.8 -0.8 0.2 -0.1 -0.0 -0.9 -0.3 -0.8 -1.0 -0.6 -1.0 -0.6 -0.9 -0.5 -0.7 -1.3 -0.3 -0.9 0.2 -0.9 0.4 -1.2 0.5 -1.2 0.3 -0.8 -0.3 -0.0 -0.1 -0.6 -0.6 -0.1 -1.2 0.1 -1.2 0.0 -1.1 0.0 -0.9 -0.7 -1.1 -0.9 -0.3 -1.1 -0.3 -1.2 -0.3 -1.1 -0.4 -0.5 -0.8 -0.0 0.0 -0.1 -0.9 0.6 -1.0 0.8 -0.9 0.8 -0.9 0.5 -0.7 -0.0 -1.4 -0.5 -0.7 -0.8 -0.9 -0.8 -0.9 -0.6 -1.0 0.1 -0.9 0.0 -0.0 0.5 -0.8 1.1 -0.4 1.2 -0.3 1.1 -0.3 0.9 -0.3 0.7 -1.1 0.0 -0.9 -0.0 -1.1 -0.1 -1.2 0.1 -1.2 0.6 -0.6 0.0 -0.1 0.8 -0.3 1.2 0.3 1.2 0.5 0.9 0.4 0.9 0.2 1.3 -0.3 0.5 -0.7 0.6 -0.9 0.6 -1.0 0.8 -1.0 0.9 -0.3 0.1 0.0 0.8 0.2 0.8 0.8 0.6 1.0 0.6 0.9 0.5 0.8 1.3 0.5 0.8 -0.1 1.0 -0.5 1.2 -0.4 1.2 -0.4 0.8 0.2 0.3 0.2 0.4 0.5 0.2 1.1 -0.0 1.2 -0.1 1.1 -0.1 1.0 0.7 1.1 0.9 0.4 1.0 0.2 1.3 0.3 1.1 0.5 0.6 0.7 0.0 0.1 0.1 0.8 -0.5 1.0 -0.9 1.0 -0.8 0.9 -0.5 0.7 z;m39.9 24.0 -0.3 0.8 -0.4 0.8 -0.3 0.8 -0.2 1.5 0.1 0.9 0.1 0.9 -0.1 0.9 -0.2 0.8 -0.3 0.8 -0.2 0.4 -0.3 0.4 -0.5 0.7 -0.7 0.5 -0.8 0.4 -0.8 0.4 -0.8 0.4 -1.2 1.0 -0.5 0.7 -0.5 0.8 -0.6 0.6 -0.6 0.6 -0.8 0.4 -0.4 0.2 -0.5 0.1 -0.9 0.2 -0.8 -0.0 -0.9 -0.2 -0.9 -0.3 -0.8 -0.1 -1.6 -0.1 -0.8 0.2 -0.9 0.3 -0.9 0.2 -0.8 -0.0 -0.9 -0.2 -0.5 -0.1 -0.4 -0.2 -0.8 -0.4 -0.6 -0.5 -0.6 -0.7 -0.5 -0.8 -0.5 -0.7 -1.2 -1.0 -0.7 -0.4 -0.9 -0.4 -0.8 -0.4 -0.6 -0.5 -0.6 -0.7 -0.3 -0.4 -0.2 -0.4 -0.3 -0.8 -0.2 -0.8 -0.1 -0.9 0.1 -0.9 0.1 -0.9 -0.2 -1.5 -0.3 -0.8 -0.4 -0.8 -0.3 -0.8 -0.2 -0.8 -0.1 -0.9 0.1 -0.7 -0.0 -0.2 0.2 -0.8 0.4 -0.8 0.5 -0.7 0.6 -0.6 0.7 -0.7 0.5 -0.6 0.6 -1.3 0.3 -0.9 0.2 -0.8 0.3 -0.8 0.5 -0.7 0.5 -0.6 0.2 -0.2 0.5 -0.4 0.8 -0.4 0.8 -0.3 0.8 -0.2 0.9 -0.0 0.8 -0.1 1.4 -0.5 0.7 -0.4 0.7 -0.5 0.7 -0.5 0.8 -0.3 0.8 -0.2 0.9 -0.1 0.0 -0.0 0.8 0.1 0.9 0.2 0.8 0.3 0.7 0.5 0.7 0.5 0.7 0.4 1.4 0.5 0.8 0.1 0.9 0.0 0.9 0.2 0.8 0.3 0.7 0.4 0.5 0.4 0.2 0.1 0.5 0.7 0.5 0.7 0.3 0.8 0.2 0.8 0.3 0.9 0.6 1.3 0.5 0.6 0.7 0.7 0.6 0.6 0.5 0.7 0.4 0.8 0.2 0.8 0.0 0.2 0.1 0.7 -0.1 0.9 z;m38.9 24.2 -0.2 0.8 -0.2 0.7 -0.3 0.8 -0.2 0.8 -0.3 0.7 -0.2 0.8 -0.3 0.8 -0.2 0.7 -0.3 0.8 -0.2 0.8 -0.3 0.7 -0.2 0.8 -0.4 1.0 -0.4 0.8 -0.4 0.8 -0.6 0.6 -0.7 0.5 0.0 0.1 -0.7 0.4 -0.8 0.3 -0.8 0.3 -0.9 0.1 -1.1 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -0.8 -0.0 -1.1 -0.0 -0.9 -0.1 -0.8 -0.3 -0.8 -0.3 -0.7 -0.5 -0.1 0.0 -0.6 -0.5 -0.6 -0.7 -0.4 -0.7 -0.4 -0.8 -0.4 -1.0 -0.2 -0.8 -0.3 -0.7 -0.2 -0.8 -0.3 -0.8 -0.2 -0.7 -0.3 -0.8 -0.2 -0.8 -0.3 -0.7 -0.2 -0.8 -0.3 -0.7 -0.2 -0.8 -0.3 -0.8 -0.2 -0.7 -0.3 -1.1 -0.2 -0.9 -0.0 -0.8 0.0 -0.9 0.2 -0.8 0.1 -0.1 0.3 -0.7 0.4 -0.8 0.6 -0.6 0.6 -0.6 0.9 -0.7 0.6 -0.5 0.7 -0.4 0.6 -0.5 0.7 -0.5 0.6 -0.4 0.7 -0.5 0.6 -0.5 0.7 -0.5 0.6 -0.4 0.7 -0.5 0.6 -0.5 0.7 -0.4 0.6 -0.5 0.9 -0.7 0.8 -0.4 0.8 -0.3 0.8 -0.2 0.8 -0.0 0.1 -0.0 0.9 0.0 0.8 0.2 0.8 0.3 0.8 0.4 0.9 0.7 0.6 0.5 0.7 0.4 0.6 0.5 0.7 0.5 0.6 0.4 0.7 0.5 0.6 0.5 0.7 0.5 0.6 0.4 0.7 0.5 0.6 0.5 0.7 0.4 0.6 0.5 0.9 0.7 0.6 0.6 0.6 0.7 0.4 0.7 0.3 0.7 0.0 0.1 0.2 0.8 0.1 0.9 -0.0 0.9 -0.2 0.8 -0.3 1.1 z;m39.6 24.0 -0.1 0.8 -0.3 0.8 -0.2 0.8 -0.3 0.7 -0.3 0.8 -0.4 0.7 -0.4 0.7 -0.5 0.6 -0.4 0.6 -0.6 0.6 -0.6 0.6 -0.4 0.4 -0.6 0.6 -0.4 0.5 -0.9 0.8 -0.5 0.5 -0.6 0.6 -0.4 0.4 -0.7 0.7 -0.5 0.5 -0.6 0.4 -0.7 0.5 -0.6 0.4 -0.7 0.4 -0.7 0.3 -0.8 0.3 -0.8 0.3 -0.8 0.2 -0.8 0.1 -0.8 0.1 -0.8 0.1 -0.9 0.0 -0.8 -0.0 -0.9 -0.1 -0.8 -0.2 -0.8 -0.2 -0.9 -0.2 -0.8 -0.3 -0.8 -0.4 -0.8 -0.4 -0.7 -0.5 -0.7 -0.5 -0.7 -0.5 -0.6 -0.6 -0.1 -0.1 -0.5 -0.6 -0.6 -0.7 -0.5 -0.7 -0.5 -0.8 -0.4 -0.7 -0.4 -0.8 -0.3 -0.8 -0.2 -0.8 -0.2 -0.9 -0.2 -0.8 -0.1 -0.9 0.0 -0.8 0.0 -0.9 0.1 -0.8 0.1 -0.8 0.1 -0.8 0.3 -0.8 0.2 -0.8 0.3 -0.7 0.4 -0.8 0.3 -0.7 0.5 -0.6 0.4 -0.7 0.4 -0.5 0.6 -0.6 0.6 -0.7 0.4 -0.4 0.6 -0.6 0.5 -0.4 0.8 -0.9 0.5 -0.5 0.6 -0.6 0.4 -0.4 0.7 -0.7 0.5 -0.5 0.6 -0.4 0.7 -0.5 0.6 -0.4 0.7 -0.4 0.7 -0.3 0.8 -0.3 0.8 -0.3 0.8 -0.2 0.8 -0.1 0.8 -0.1 0.8 -0.1 0.9 -0.0 0.8 0.0 0.9 0.1 0.8 0.2 0.8 0.2 0.9 0.2 0.8 0.4 0.8 0.3 0.8 0.4 0.7 0.5 0.7 0.5 0.7 0.5 0.6 0.7 0.1 -0.0 0.5 0.6 0.6 0.7 0.5 0.7 0.5 0.8 0.4 0.7 0.3 0.8 0.4 0.8 0.2 0.8 0.2 0.9 0.2 0.8 0.1 0.9 0.0 0.8 -0.0 0.8 -0.1 0.9 z;m40.0 24.0 -0.1 0.8 -0.5 0.8 -0.6 0.8 -0.6 0.6 -0.6 0.7 -0.5 0.6 -0.7 1.2 -0.1 0.7 -0.1 0.8 -0.0 0.9 -0.1 0.9 -0.1 0.9 -0.2 0.9 -0.5 0.7 -0.0 0.0 -0.7 0.5 -0.9 0.2 -0.9 0.1 -0.9 0.1 -0.8 0.0 -0.8 0.1 -0.8 0.1 -1.2 0.7 -0.6 0.5 -0.7 0.6 -0.6 0.6 -0.8 0.6 -0.8 0.5 -0.8 0.1 -0.0 0.0 -0.8 -0.1 -0.8 -0.5 -0.8 -0.6 -0.6 -0.6 -0.7 -0.6 -0.6 -0.5 -1.2 -0.7 -0.7 -0.1 -0.8 -0.1 -0.9 -0.0 -0.9 -0.1 -0.9 -0.1 -0.9 -0.2 -0.7 -0.5 -0.0 0.0 -0.5 -0.7 -0.2 -0.9 -0.1 -0.9 -0.1 -0.9 -0.0 -0.8 -0.1 -0.8 -0.1 -0.8 -0.7 -1.2 -0.5 -0.6 -0.6 -0.7 -0.6 -0.6 -0.6 -0.8 -0.5 -0.8 -0.1 -0.8 -0.0 -0.0 0.1 -0.8 0.5 -0.8 0.6 -0.8 0.6 -0.6 0.6 -0.7 0.5 -0.6 0.7 -1.2 0.1 -0.7 0.1 -0.8 0.0 -0.9 0.1 -0.9 0.1 -0.9 0.2 -0.9 0.5 -0.7 -0.0 -0.0 0.7 -0.5 0.9 -0.2 0.9 -0.1 0.9 -0.1 0.8 -0.0 0.8 -0.1 0.8 -0.1 1.2 -0.7 0.6 -0.5 0.7 -0.6 0.6 -0.6 0.8 -0.6 0.8 -0.5 0.8 -0.1 0.0 -0.0 0.8 0.1 0.8 0.5 0.8 0.6 0.6 0.6 0.7 0.6 0.6 0.5 1.2 0.7 0.7 0.1 0.8 0.1 0.9 0.0 0.9 0.1 0.9 0.1 0.9 0.2 0.7 0.5 0.0 -0.0 0.5 0.7 0.2 0.9 0.1 0.9 0.1 0.9 0.0 0.8 0.1 0.8 0.1 0.8 0.7 1.2 0.5 0.6 0.6 0.7 0.6 0.6 0.6 0.8 0.5 0.8 0.1 0.8 z;m36.9 24.6 0.1 0.7 0.2 0.8 0.2 0.7 0.4 0.9 0.4 0.9 0.2 0.9 0.1 1.0 0.1 0.9 -0.1 0.9 -0.3 0.9 -0.3 0.9 -0.4 0.8 -0.5 0.8 -0.6 0.6 -0.1 0.1 -0.6 0.6 -0.8 0.5 -0.8 0.4 -0.9 0.3 -0.9 0.3 -0.9 0.1 -0.9 -0.1 -1.0 -0.1 -0.9 -0.2 -0.9 -0.4 -0.9 -0.4 -0.7 -0.2 -0.8 -0.2 -0.7 -0.1 -1.2 0.0 -0.7 0.1 -0.8 0.2 -0.7 0.2 -0.9 0.4 -0.9 0.4 -0.9 0.2 -1.0 0.1 -0.9 0.1 -0.9 -0.1 -0.9 -0.3 -0.9 -0.3 -0.8 -0.4 -0.8 -0.5 -0.6 -0.6 -0.1 -0.1 -0.6 -0.6 -0.5 -0.8 -0.4 -0.8 -0.3 -0.9 -0.3 -0.9 -0.1 -0.9 0.1 -0.9 0.1 -1.0 0.2 -0.9 0.4 -0.9 0.4 -0.9 0.2 -0.7 0.2 -0.8 0.1 -0.7 -0.0 -1.2 -0.1 -0.7 -0.2 -0.8 -0.2 -0.7 -0.4 -0.9 -0.4 -0.9 -0.2 -0.9 -0.1 -1.0 -0.1 -0.9 0.1 -0.9 0.3 -0.9 0.3 -0.9 0.4 -0.8 0.5 -0.8 0.6 -0.6 0.1 -0.1 0.6 -0.6 0.8 -0.5 0.8 -0.4 0.9 -0.3 0.9 -0.3 0.9 -0.1 0.9 0.1 1.0 0.1 0.9 0.2 0.9 0.4 0.9 0.4 0.7 0.2 0.8 0.2 0.7 0.1 1.2 -0.0 0.7 -0.1 0.8 -0.2 0.7 -0.2 0.9 -0.4 0.9 -0.4 0.9 -0.2 1.0 -0.1 0.9 -0.1 0.9 0.1 0.9 0.3 0.9 0.3 0.8 0.4 0.8 0.5 0.6 0.6 0.1 0.1 0.6 0.6 0.5 0.8 0.4 0.8 0.3 0.9 0.3 0.9 0.1 0.9 -0.1 0.9 -0.1 1.0 -0.2 0.9 -0.4 0.9 -0.4 0.9 -0.2 0.7 -0.2 0.8 -0.1 0.7 z;m37.7 24.0 -0.3 0.7 -0.4 0.7 -0.3 0.6 -0.3 0.7 -0.4 0.6 -0.3 0.5 -0.4 0.6 -0.4 0.5 -0.4 0.5 -0.4 0.5 -0.4 0.5 -0.4 0.5 -0.3 0.4 -0.5 0.4 -0.8 0.8 -0.4 0.5 -0.4 0.3 -0.5 0.4 -0.5 0.4 -0.5 0.4 -0.5 0.4 -0.5 0.4 -0.6 0.4 -0.5 0.3 -0.6 0.4 -0.7 0.3 -0.6 0.3 -0.7 0.4 -0.7 0.3 -0.7 0.2 -0.7 0.3 -0.9 0.3 -0.8 0.2 -0.8 0.1 -0.9 0.1 -1.0 0.1 -0.9 -0.0 -0.9 -0.1 -0.9 -0.1 -0.9 -0.3 -0.9 -0.3 -0.8 -0.4 -0.8 -0.6 -0.7 -0.6 -0.0 0.0 -0.6 -0.7 -0.6 -0.8 -0.4 -0.8 -0.3 -0.9 -0.3 -0.9 -0.1 -0.9 -0.1 -0.9 0.0 -0.9 0.1 -1.0 0.1 -0.9 0.1 -0.8 0.2 -0.8 0.3 -0.9 0.3 -0.7 0.2 -0.7 0.3 -0.7 0.4 -0.7 0.3 -0.6 0.3 -0.7 0.4 -0.6 0.3 -0.5 0.4 -0.6 0.4 -0.5 0.4 -0.5 0.4 -0.5 0.4 -0.5 0.4 -0.5 0.3 -0.4 0.5 -0.4 0.8 -0.8 0.4 -0.5 0.4 -0.3 0.5 -0.4 0.5 -0.4 0.5 -0.4 0.5 -0.4 0.5 -0.4 0.6 -0.4 0.5 -0.3 0.6 -0.4 0.7 -0.3 0.6 -0.3 0.7 -0.4 0.7 -0.3 0.7 -0.2 0.7 -0.3 0.9 -0.3 0.8 -0.2 0.8 -0.1 0.9 -0.1 1.0 -0.1 0.9 0.0 0.9 0.1 0.9 0.1 0.9 0.3 0.9 0.3 0.8 0.4 0.8 0.6 0.7 0.6 -0.0 0.0 0.6 0.7 0.6 0.8 0.4 0.8 0.3 0.9 0.3 0.9 0.1 0.9 0.1 0.9 -0.0 0.9 -0.1 1.0 -0.1 0.9 -0.1 0.8 -0.2 0.8 -0.3 0.9 -0.3 0.7 z;m37.4 24.7 0.5 0.7 0.8 0.9 0.8 1.0 0.6 1.0 -0.1 0.8 -0.0 0.1 -0.6 0.7 -1.1 0.5 -1.3 0.3 -1.0 0.2 -0.9 0.4 -0.7 1.1 0.1 1.0 0.1 1.1 0.0 1.2 -0.2 1.1 -0.4 0.5 -0.3 0.2 -0.8 0.2 -1.2 -0.4 -1.2 -0.4 -1.0 -0.5 -0.8 -0.1 -1.3 0.5 -0.5 0.8 -0.6 0.9 -0.6 1.0 -0.8 0.8 -0.8 0.2 -0.1 -0.0 -0.9 -0.3 -0.8 -1.0 -0.6 -1.0 -0.6 -0.9 -0.5 -0.7 -1.3 -0.3 -0.9 0.2 -0.9 0.4 -1.2 0.5 -1.2 0.3 -0.8 -0.3 -0.0 -0.1 -0.6 -0.6 -0.1 -1.2 0.1 -1.2 0.0 -1.1 0.0 -0.9 -0.7 -1.1 -0.9 -0.3 -1.1 -0.3 -1.2 -0.3 -1.1 -0.4 -0.5 -0.8 -0.0 0.0 -0.1 -0.9 0.6 -1.0 0.8 -0.9 0.8 -0.9 0.5 -0.7 -0.0 -1.4 -0.5 -0.7 -0.8 -0.9 -0.8 -0.9 -0.6 -1.0 0.1 -0.9 0.0 -0.0 0.5 -0.8 1.1 -0.4 1.2 -0.3 1.1 -0.3 0.9 -0.3 0.7 -1.1 0.0 -0.9 -0.0 -1.1 -0.1 -1.2 0.1 -1.2 0.6 -0.6 0.0 -0.1 0.8 -0.3 1.2 0.3 1.2 0.5 0.9 0.4 0.9 0.2 1.3 -0.3 0.5 -0.7 0.6 -0.9 0.6 -1.0 0.8 -1.0 0.9 -0.3 0.1 0.0 0.8 0.2 0.8 0.8 0.6 1.0 0.6 0.9 0.5 0.8 1.3 0.5 0.8 -0.1 1.0 -0.5 1.2 -0.4 1.2 -0.4 0.8 0.2 0.3 0.2 0.4 0.5 0.2 1.1 -0.0 1.2 -0.1 1.1 -0.1 1.0 0.7 1.1 0.9 0.4 1.0 0.2 1.3 0.3 1.1 0.5 0.6 0.7 0.0 0.1 0.1 0.8 -0.5 1.0 -0.9 1.0 -0.8 0.9 -0.5 0.7 z"
26
- />
27
- <animateTransform
28
- attributeName="transform"
29
- attributeType="XML"
30
- type="rotate"
31
- dur="5s"
32
- repeatCount="indefinite"
33
- calcMode="spline"
34
- keySplines="0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8; 0.5 0.2 0 0.8"
35
- keyTimes="0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1"
36
- values="0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24"
37
- />
38
- </path>
75
+ <g style="transform-box: view-box; transform-origin: center" {@attach spin}>
76
+ <path fill="currentColor" d={LOADING_SHAPES[0]} {@attach morph} />
77
+ </g>
39
78
  </svg>