material 3.3.2 → 3.3.4

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 (189) hide show
  1. package/README.md +2 -2
  2. package/dist/components/menu/features/controller.js +23 -75
  3. package/dist/components/menu/features/opener.js +3 -15
  4. package/dist/components/menu/types.d.ts +1 -0
  5. package/dist/components/slider/config.js +0 -46
  6. package/dist/components/slider/features/controller.js +805 -171
  7. package/dist/components/slider/features/dom.js +29 -62
  8. package/dist/components/slider/features/index.js +1 -3
  9. package/dist/components/slider/features/states.js +2 -30
  10. package/dist/components/slider/slider.js +3 -6
  11. package/dist/components/slider/types.d.ts +0 -26
  12. package/dist/components/split-button/features/menu-on-demand.js +141 -0
  13. package/dist/components/split-button/features/menu.js +3 -4
  14. package/dist/core/canvas/resize.d.ts +1 -1
  15. package/dist/core/canvas/resize.js +24 -11
  16. package/dist/core/dom/classes.js +17 -118
  17. package/dist/core/dom/create.d.ts +0 -2
  18. package/dist/core/dom/create.js +0 -72
  19. package/dist/core/utils/mobile.js +9 -29
  20. package/dist/elements/preupgrade/badge.css +1 -1
  21. package/dist/elements/preupgrade/bottom-app-bar.css +1 -1
  22. package/dist/elements/preupgrade/bottom-sheet.css +1 -1
  23. package/dist/elements/preupgrade/button-group.css +1 -1
  24. package/dist/elements/preupgrade/button.css +1 -1
  25. package/dist/elements/preupgrade/card.css +1 -1
  26. package/dist/elements/preupgrade/carousel.css +1 -1
  27. package/dist/elements/preupgrade/checkbox.css +1 -1
  28. package/dist/elements/preupgrade/chips.css +1 -1
  29. package/dist/elements/preupgrade/datepicker.css +1 -1
  30. package/dist/elements/preupgrade/dialog.css +1 -1
  31. package/dist/elements/preupgrade/divider.css +1 -1
  32. package/dist/elements/preupgrade/drawer.css +1 -1
  33. package/dist/elements/preupgrade/extended-fab.css +1 -1
  34. package/dist/elements/preupgrade/fab-menu.css +1 -1
  35. package/dist/elements/preupgrade/fab.css +1 -1
  36. package/dist/elements/preupgrade/icon-button.css +1 -1
  37. package/dist/elements/preupgrade/list.css +1 -1
  38. package/dist/elements/preupgrade/loading-indicator.css +1 -1
  39. package/dist/elements/preupgrade/menu.css +1 -1
  40. package/dist/elements/preupgrade/navigation-bar.css +1 -1
  41. package/dist/elements/preupgrade/navigation-rail.css +1 -1
  42. package/dist/elements/preupgrade/progress.css +1 -1
  43. package/dist/elements/preupgrade/radios.css +1 -1
  44. package/dist/elements/preupgrade/search.css +1 -1
  45. package/dist/elements/preupgrade/select.css +1 -1
  46. package/dist/elements/preupgrade/side-sheet.css +1 -1
  47. package/dist/elements/preupgrade/slider.css +1 -1
  48. package/dist/elements/preupgrade/snackbar.css +1 -1
  49. package/dist/elements/preupgrade/split-button.css +1 -1
  50. package/dist/elements/preupgrade/switch.css +1 -1
  51. package/dist/elements/preupgrade/tabs.css +1 -1
  52. package/dist/elements/preupgrade/text-field.css +1 -1
  53. package/dist/elements/preupgrade/timepicker.css +1 -1
  54. package/dist/elements/preupgrade/toolbar.css +1 -1
  55. package/dist/elements/preupgrade/tooltip.css +1 -1
  56. package/dist/elements/preupgrade/top-app-bar.css +1 -1
  57. package/dist/elements/preupgrade.css +1 -1
  58. package/dist/package.json +1 -1
  59. package/dist/styles/badge.css +1 -1
  60. package/dist/styles/base.css +1 -1
  61. package/dist/styles/bottom-app-bar.css +1 -1
  62. package/dist/styles/bottom-sheet.css +1 -1
  63. package/dist/styles/button-group.css +1 -1
  64. package/dist/styles/button.css +1 -1
  65. package/dist/styles/card.css +1 -1
  66. package/dist/styles/carousel.css +1 -1
  67. package/dist/styles/checkbox.css +1 -1
  68. package/dist/styles/chips.css +1 -1
  69. package/dist/styles/contrast.css +1 -1
  70. package/dist/styles/datepicker.css +1 -1
  71. package/dist/styles/dialog.css +1 -1
  72. package/dist/styles/divider.css +1 -1
  73. package/dist/styles/drawer.css +1 -1
  74. package/dist/styles/extended-fab.css +1 -1
  75. package/dist/styles/fab-menu.css +1 -1
  76. package/dist/styles/fab.css +1 -1
  77. package/dist/styles/icon-button.css +1 -1
  78. package/dist/styles/list.css +1 -1
  79. package/dist/styles/loading-indicator.css +1 -1
  80. package/dist/styles/menu.css +1 -1
  81. package/dist/styles/navigation-bar.css +1 -1
  82. package/dist/styles/navigation-rail.css +1 -1
  83. package/dist/styles/progress.css +1 -1
  84. package/dist/styles/radios.css +1 -1
  85. package/dist/styles/search.css +1 -1
  86. package/dist/styles/select.css +1 -1
  87. package/dist/styles/side-sheet.css +1 -1
  88. package/dist/styles/slider.css +1 -1
  89. package/dist/styles/snackbar.css +1 -1
  90. package/dist/styles/split-button.css +1 -1
  91. package/dist/styles/switch.css +1 -1
  92. package/dist/styles/tabs.css +1 -1
  93. package/dist/styles/text-field.css +1 -1
  94. package/dist/styles/timepicker.css +1 -1
  95. package/dist/styles/toolbar.css +1 -1
  96. package/dist/styles/tooltip.css +1 -1
  97. package/dist/styles/top-app-bar.css +1 -1
  98. package/dist/styles/typography.css +1 -1
  99. package/dist/styles/utilities.css +1 -1
  100. package/dist/styles.css +1 -1
  101. package/dist/themes/autumn-contrast.css +1 -1
  102. package/dist/themes/autumn.css +1 -1
  103. package/dist/themes/baseline-contrast.css +1 -1
  104. package/dist/themes/baseline.css +1 -1
  105. package/dist/themes/brownbeige-contrast.css +1 -1
  106. package/dist/themes/brownbeige.css +1 -1
  107. package/dist/themes/content-contrast.css +1 -1
  108. package/dist/themes/content.css +1 -1
  109. package/dist/themes/desert-contrast.css +1 -1
  110. package/dist/themes/desert.css +1 -1
  111. package/dist/themes/expressive-contrast.css +1 -1
  112. package/dist/themes/expressive.css +1 -1
  113. package/dist/themes/fidelity-contrast.css +1 -1
  114. package/dist/themes/fidelity.css +1 -1
  115. package/dist/themes/forest-contrast.css +1 -1
  116. package/dist/themes/forest.css +1 -1
  117. package/dist/themes/fruit-salad-contrast.css +1 -1
  118. package/dist/themes/fruit-salad.css +1 -1
  119. package/dist/themes/highcontrast-contrast.css +1 -1
  120. package/dist/themes/highcontrast.css +1 -1
  121. package/dist/themes/monochrome-contrast.css +1 -1
  122. package/dist/themes/monochrome.css +1 -1
  123. package/dist/themes/neutral-contrast.css +1 -1
  124. package/dist/themes/neutral.css +1 -1
  125. package/dist/themes/ocean-contrast.css +1 -1
  126. package/dist/themes/ocean.css +1 -1
  127. package/dist/themes/rainbow-contrast.css +1 -1
  128. package/dist/themes/rainbow.css +1 -1
  129. package/dist/themes/sageivory-contrast.css +1 -1
  130. package/dist/themes/sageivory.css +1 -1
  131. package/dist/themes/spring-contrast.css +1 -1
  132. package/dist/themes/spring.css +1 -1
  133. package/dist/themes/summer-contrast.css +1 -1
  134. package/dist/themes/summer.css +1 -1
  135. package/dist/themes/sunset-contrast.css +1 -1
  136. package/dist/themes/sunset.css +1 -1
  137. package/dist/themes/tealcaramel-contrast.css +1 -1
  138. package/dist/themes/tealcaramel.css +1 -1
  139. package/dist/themes/vibrant-contrast.css +1 -1
  140. package/dist/themes/vibrant.css +1 -1
  141. package/package.json +1 -1
  142. package/dist/components/badge/types.js +0 -1
  143. package/dist/components/bottom-app-bar/types.js +0 -1
  144. package/dist/components/bottom-sheet/types.js +0 -1
  145. package/dist/components/button/types.js +0 -1
  146. package/dist/components/button-group/types.js +0 -1
  147. package/dist/components/card/features.js +0 -217
  148. package/dist/components/card/types.js +0 -1
  149. package/dist/components/carousel/types.js +0 -1
  150. package/dist/components/checkbox/types.js +0 -1
  151. package/dist/components/chips/chip/constants.js +0 -18
  152. package/dist/components/chips/chip/index.js +0 -1
  153. package/dist/components/chips/schema.js +0 -46
  154. package/dist/components/chips/types.js +0 -1
  155. package/dist/components/dialog/types.js +0 -1
  156. package/dist/components/divider/types.js +0 -1
  157. package/dist/components/drawer/types.js +0 -1
  158. package/dist/components/extended-fab/types.js +0 -1
  159. package/dist/components/fab/types.js +0 -1
  160. package/dist/components/fab-menu/types.js +0 -1
  161. package/dist/components/icon-button/types.js +0 -1
  162. package/dist/components/list/types.js +0 -1
  163. package/dist/components/loading-indicator/types.js +0 -1
  164. package/dist/components/menu/types.js +0 -14
  165. package/dist/components/navigation-bar/types.js +0 -1
  166. package/dist/components/navigation-rail/types.js +0 -1
  167. package/dist/components/progress/features/index.js +0 -4
  168. package/dist/components/progress/features/resize-observer.js +0 -40
  169. package/dist/components/progress/types.js +0 -1
  170. package/dist/components/radios/types.js +0 -1
  171. package/dist/components/search/types.js +0 -1
  172. package/dist/components/select/types.js +0 -4
  173. package/dist/components/side-sheet/types.js +0 -1
  174. package/dist/components/slider/api.js +0 -108
  175. package/dist/components/slider/features/handlers.js +0 -379
  176. package/dist/components/slider/features/range.js +0 -70
  177. package/dist/components/slider/features/tracks.js +0 -287
  178. package/dist/components/snackbar/types.js +0 -1
  179. package/dist/components/split-button/types.js +0 -1
  180. package/dist/components/switch/types.js +0 -1
  181. package/dist/components/tabs/scroll-indicators.js +0 -78
  182. package/dist/components/tabs/state.js +0 -44
  183. package/dist/components/tabs/types.js +0 -1
  184. package/dist/components/text-field/types.js +0 -18
  185. package/dist/components/toolbar/types.js +0 -1
  186. package/dist/components/top-app-bar/types.js +0 -1
  187. package/dist/core/utils/validate.js +0 -114
  188. package/dist/react/jsx.js +0 -2
  189. package/dist/solid/jsx.js +0 -1
package/README.md CHANGED
@@ -91,10 +91,10 @@ What a bundler keeps, minified and gzipped (kB is 1,000 bytes), measured from th
91
91
  <!-- sizes -->
92
92
  | Import | gzip |
93
93
  |--------|-----:|
94
- | `createButton` from `material`, with code splitting: the initial chunks (the progress indicator loads on demand) | 7.7 kB |
94
+ | `createButton` from `material`, with code splitting: the initial chunks (the progress indicator loads on demand) | 7.6 kB |
95
95
  | `createButton`, without code splitting (the progress indicator included) | 13.9 kB |
96
96
  | `createButton`, `createTextField` and `createCheckbox`, without code splitting | 20.2 kB |
97
- | Everything the root exports (`export * from 'material'`), without code splitting | 127.9 kB |
97
+ | Everything the root exports (`export * from 'material'`), without code splitting | 127.1 kB |
98
98
  | `material/styles/base` | 2.9 kB |
99
99
  | `material/styles/base` and `material/styles/button` | 5.2 kB |
100
100
  | `material/styles`, the full stylesheet | 63.7 kB |
@@ -45,23 +45,11 @@ const withController = (config, getComponent) => (component) => {
45
45
  return eventData;
46
46
  },
47
47
  };
48
- const getOpenerElement = () => {
49
- if (component.opener && typeof component.opener.getOpener === "function") {
50
- return component.opener.getOpener();
51
- }
52
- const { opener } = config;
53
- if (typeof opener === "string") {
54
- const element = document.querySelector(opener);
55
- if (!element) {
56
- console.warn(`Menu opener not found: ${opener}`);
57
- return null;
58
- }
59
- return element;
60
- }
61
- if (typeof opener === "object" && opener !== null && "element" in opener) {
62
- return opener.element;
63
- }
64
- return opener;
48
+ const getOpenerElement = () => getComponent().getOpener() ?? null;
49
+ const reposition = () => {
50
+ const opener = getOpenerElement();
51
+ if (opener)
52
+ component.position?.positionMenu(opener);
65
53
  };
66
54
  const createMenuItem = (item, index) => {
67
55
  const itemElement = document.createElement("li");
@@ -287,10 +275,7 @@ const withController = (config, getComponent) => (component) => {
287
275
  if (topLayer)
288
276
  showInTopLayer(component.element, { kind: "popover-manual" });
289
277
  showTimer = tasks.setTimeout(() => {
290
- const openerElement = getOpenerElement();
291
- if (openerElement && component.position) {
292
- component.position.positionMenu(openerElement);
293
- }
278
+ reposition();
294
279
  component.element.setAttribute("aria-hidden", "false");
295
280
  component.element.style.transform = "";
296
281
  component.element.style.opacity = "";
@@ -298,24 +283,7 @@ const withController = (config, getComponent) => (component) => {
298
283
  component.element.classList.add(`${component.getClass("menu--visible")}`);
299
284
  if (!listbox)
300
285
  focusTimer = tasks.setTimeout(() => {
301
- if (component.keyboard && component.keyboard.handleInitialFocus) {
302
- component.keyboard.handleInitialFocus(component.element, interactionType);
303
- }
304
- else {
305
- const items = Array.from(component.element.querySelectorAll(`.${component.getClass("menu__item")}`));
306
- items.forEach((item) => {
307
- item.tabIndex = -1;
308
- });
309
- if (items.length > 0)
310
- items[0].tabIndex = 0;
311
- if (interactionType === "keyboard" && items.length > 0) {
312
- items[0].focus();
313
- }
314
- else {
315
- component.element.tabIndex = -1;
316
- component.element.focus();
317
- }
318
- }
286
+ component.keyboard?.handleInitialFocus(component.element, interactionType);
319
287
  }, 100);
320
288
  window.addEventListener("resize", handleWindowResize, {
321
289
  passive: true,
@@ -406,26 +374,18 @@ const withController = (config, getComponent) => (component) => {
406
374
  }
407
375
  }
408
376
  else if (isTargetInsideSubmenu) {
409
- if (component.keyboard && component.keyboard.handleMenuKeydown) {
410
- component.keyboard.handleMenuKeydown(e, state, {
411
- closeMenu,
412
- findItemById,
413
- ...submenuActions,
414
- });
415
- }
416
- else if (e.key === "Escape") {
417
- e.preventDefault();
418
- closeMenu(e, true);
419
- }
377
+ component.keyboard?.handleMenuKeydown(e, state, {
378
+ closeMenu,
379
+ findItemById,
380
+ ...submenuActions,
381
+ });
420
382
  }
421
383
  else {
422
- if (component.keyboard && component.keyboard.handleMenuKeydown) {
423
- component.keyboard.handleMenuKeydown(e, state, {
424
- closeMenu,
425
- findItemById,
426
- ...submenuActions,
427
- });
428
- }
384
+ component.keyboard?.handleMenuKeydown(e, state, {
385
+ closeMenu,
386
+ findItemById,
387
+ ...submenuActions,
388
+ });
429
389
  }
430
390
  }
431
391
  };
@@ -435,10 +395,7 @@ const withController = (config, getComponent) => (component) => {
435
395
  closeMenu(undefined, true);
436
396
  }
437
397
  else {
438
- const openerElement = getOpenerElement();
439
- if (openerElement && component.position) {
440
- component.position.positionMenu(openerElement);
441
- }
398
+ reposition();
442
399
  }
443
400
  }
444
401
  };
@@ -447,19 +404,13 @@ const withController = (config, getComponent) => (component) => {
447
404
  return;
448
405
  if (state.visible) {
449
406
  tasks.requestAnimationFrame(() => {
450
- const openerElement = getOpenerElement();
451
- if (openerElement && component.position) {
452
- component.position.positionMenu(openerElement);
453
- }
407
+ reposition();
454
408
  });
455
409
  }
456
410
  };
457
411
  const initMenu = () => {
458
412
  if (state.visible) {
459
- const openerElement = getOpenerElement();
460
- if (openerElement && component.position) {
461
- component.position.positionMenu(openerElement);
462
- }
413
+ reposition();
463
414
  component.element.classList.add(`${component.getClass("menu--visible")}`);
464
415
  if (config.closeOnClickOutside) {
465
416
  document.addEventListener("click", handleDocumentClick);
@@ -493,8 +444,8 @@ const withController = (config, getComponent) => (component) => {
493
444
  });
494
445
  });
495
446
  renderMenuItems();
496
- if (!listbox && component.keyboard && component.keyboard.setupKeyboardHandlers) {
497
- component.keyboard.setupKeyboardHandlers(component.element, state, {
447
+ if (!listbox) {
448
+ component.keyboard?.setupKeyboardHandlers(component.element, state, {
498
449
  closeMenu,
499
450
  findItemById,
500
451
  ...submenuActions,
@@ -550,10 +501,7 @@ const withController = (config, getComponent) => (component) => {
550
501
  setPosition: (position) => {
551
502
  state.position = position;
552
503
  if (state.visible) {
553
- const openerElement = getOpenerElement();
554
- if (openerElement && component.position) {
555
- component.position.positionMenu(openerElement);
556
- }
504
+ reposition();
557
505
  }
558
506
  return component;
559
507
  },
@@ -2,16 +2,7 @@ import { createMenuTasks } from "./tasks.js";
2
2
  import { focusWithin } from "./layer.js";
3
3
  const withOpener = (config) => (component) => {
4
4
  const tasks = createMenuTasks();
5
- let isTabNavigation = false;
6
- let tabTimeout = null;
7
- const handleTabKey = (e) => {
8
- isTabNavigation = e.key === "Tab";
9
- tasks.clearTimeout(tabTimeout);
10
- tabTimeout = tasks.setTimeout(() => {
11
- isTabNavigation = false;
12
- }, 100);
13
- };
14
- document.addEventListener("keydown", handleTabKey);
5
+ const isTabNavigationActive = () => component.keyboard?.isTabNavigationActive?.() ?? false;
15
6
  const state = {
16
7
  openerElement: null,
17
8
  openerComponent: null,
@@ -203,7 +194,7 @@ const withOpener = (config) => (component) => {
203
194
  if (!component.menu || !component.menu.isOpen())
204
195
  return;
205
196
  const relatedTarget = e.relatedTarget;
206
- if (isTabNavigation) {
197
+ if (isTabNavigationActive()) {
207
198
  tasks.setTimeout(() => {
208
199
  if (component.menu && component.menu.isOpen()) {
209
200
  component.menu.close(e, false);
@@ -228,8 +219,6 @@ const withOpener = (config) => (component) => {
228
219
  };
229
220
  const cleanup = () => {
230
221
  tasks.cancelAll();
231
- tabTimeout = null;
232
- isTabNavigation = false;
233
222
  if (state.openerElement) {
234
223
  if (!config.manualOpen) {
235
224
  state.openerElement.removeEventListener("click", handleOpenerClick);
@@ -254,7 +243,6 @@ const withOpener = (config) => (component) => {
254
243
  if (tasks.destroyed)
255
244
  return;
256
245
  tasks.destroy();
257
- document.removeEventListener("keydown", handleTabKey);
258
246
  cleanup();
259
247
  originalDestroy.call(component.lifecycle);
260
248
  };
@@ -269,7 +257,7 @@ const withOpener = (config) => (component) => {
269
257
  if (state.openerElement && !config.listbox) {
270
258
  state.openerElement.setAttribute("aria-expanded", "false");
271
259
  setOpenerActive(false);
272
- if (event.restoreFocus && !isTabNavigation) {
260
+ if (event.restoreFocus && !isTabNavigationActive()) {
273
261
  restoreFocusToOpener();
274
262
  }
275
263
  }
@@ -165,6 +165,7 @@ export interface MenuFeatureHost {
165
165
  removeKeyboardHandlers: (element: HTMLElement) => void;
166
166
  handleMenuKeydown: (e: KeyboardEvent, state: KeyboardMenuState, actions: KeyboardActions) => void;
167
167
  handleInitialFocus: (menuElement: HTMLElement, interactionType: "keyboard" | "mouse") => void;
168
+ isTabNavigationActive: () => boolean;
168
169
  };
169
170
  submenu?: {
170
171
  handleSubmenuClick: (item: MenuItem, index: number, itemElement: HTMLElement) => void;
@@ -62,49 +62,3 @@ export const getElementConfig = (config) => {
62
62
  interactive: true,
63
63
  });
64
64
  };
65
- export const getApiConfig = (comp) => ({
66
- slider: {
67
- setValue: (v, t) => comp.slider?.setValue(v, t),
68
- getValue: () => comp.slider?.getValue() ?? 0,
69
- setSecondValue: (v, t) => comp.slider?.setSecondValue(v, t),
70
- getSecondValue: () => comp.slider?.getSecondValue() ?? null,
71
- setMin: (m) => comp.slider?.setMin(m),
72
- getMin: () => comp.slider?.getMin() ?? 0,
73
- setMax: (m) => comp.slider?.setMax(m),
74
- getMax: () => comp.slider?.getMax() ?? 100,
75
- setStep: (s) => comp.slider?.setStep(s),
76
- getStep: () => comp.slider?.getStep() ?? 1,
77
- regenerateTicks: () => comp.slider?.regenerateTicks?.(),
78
- },
79
- disabled: {
80
- enable: () => comp.disabled?.enable?.(),
81
- disable: () => comp.disabled?.disable?.(),
82
- isDisabled: () => comp.disabled?.isDisabled?.() ?? false,
83
- },
84
- appearance: {
85
- setColor: (c) => comp.appearance?.setColor?.(c),
86
- getColor: () => comp.appearance?.getColor?.() ?? "primary",
87
- setSize: (s) => comp.setSize?.(s),
88
- getSize: () => comp.getSize?.() ?? "XS",
89
- showTicks: (s) => comp.appearance?.showTicks?.(s),
90
- showCurrentValue: (s) => comp.appearance?.showCurrentValue?.(s),
91
- },
92
- text: {
93
- setText: (t) => comp.label?.setText?.(t),
94
- getText: () => comp.label?.getText?.() ?? "",
95
- },
96
- icon: {
97
- setIcon: (h) => comp.icon?.setIcon?.(h),
98
- getIcon: () => comp.icon?.getIcon?.() ?? "",
99
- },
100
- insetIcon: {
101
- setInsetIcon: (icon, atMin) => comp.setInsetIcon?.(icon, atMin),
102
- },
103
- events: {
104
- on: (e, h) => comp.on?.(e, h),
105
- off: (e, h) => comp.off?.(e, h),
106
- },
107
- lifecycle: {
108
- destroy: () => comp.lifecycle?.destroy?.(),
109
- },
110
- });