material 3.3.4 → 3.4.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 (152) hide show
  1. package/README.md +2 -2
  2. package/dist/components/badge/api.js +7 -5
  3. package/dist/components/badge/config.js +3 -15
  4. package/dist/components/badge/features.js +6 -10
  5. package/dist/components/chips/chip/chip.js +3 -0
  6. package/dist/components/chips/types.d.ts +1 -0
  7. package/dist/components/dialog/api.js +109 -109
  8. package/dist/components/dialog/config.js +0 -52
  9. package/dist/components/dialog/dialog.js +2 -2
  10. package/dist/components/dialog/features.js +113 -65
  11. package/dist/components/dialog/types.d.ts +2 -3
  12. package/dist/components/search/features/input.js +1 -1
  13. package/dist/components/search/features/structure.js +1 -1
  14. package/dist/components/search/types.d.ts +1 -0
  15. package/dist/components/select/features.js +2 -0
  16. package/dist/components/select/types.d.ts +1 -0
  17. package/dist/components/slider/features/dom.js +27 -9
  18. package/dist/components/tabs/tab.js +2 -1
  19. package/dist/components/text-field/config.js +21 -1
  20. package/dist/components/text-field/types.d.ts +1 -0
  21. package/dist/core/compose/features/badge.js +1 -1
  22. package/dist/core/compose/features/textinput.d.ts +1 -0
  23. package/dist/core/compose/features/textinput.js +1 -0
  24. package/dist/core/dom/focus.js +2 -2
  25. package/dist/elements/css/dialog.css +1 -1
  26. package/dist/elements/css/dialog.js +1 -1
  27. package/dist/elements/css/switch.css +1 -1
  28. package/dist/elements/css/switch.js +1 -1
  29. package/dist/elements/preupgrade/badge.css +1 -1
  30. package/dist/elements/preupgrade/bottom-app-bar.css +1 -1
  31. package/dist/elements/preupgrade/bottom-sheet.css +1 -1
  32. package/dist/elements/preupgrade/button-group.css +1 -1
  33. package/dist/elements/preupgrade/button.css +1 -1
  34. package/dist/elements/preupgrade/card.css +1 -1
  35. package/dist/elements/preupgrade/carousel.css +1 -1
  36. package/dist/elements/preupgrade/checkbox.css +1 -1
  37. package/dist/elements/preupgrade/chips.css +1 -1
  38. package/dist/elements/preupgrade/datepicker.css +1 -1
  39. package/dist/elements/preupgrade/dialog.css +1 -1
  40. package/dist/elements/preupgrade/divider.css +1 -1
  41. package/dist/elements/preupgrade/drawer.css +1 -1
  42. package/dist/elements/preupgrade/extended-fab.css +1 -1
  43. package/dist/elements/preupgrade/fab-menu.css +1 -1
  44. package/dist/elements/preupgrade/fab.css +1 -1
  45. package/dist/elements/preupgrade/icon-button.css +1 -1
  46. package/dist/elements/preupgrade/list.css +1 -1
  47. package/dist/elements/preupgrade/loading-indicator.css +1 -1
  48. package/dist/elements/preupgrade/menu.css +1 -1
  49. package/dist/elements/preupgrade/navigation-bar.css +1 -1
  50. package/dist/elements/preupgrade/navigation-rail.css +1 -1
  51. package/dist/elements/preupgrade/progress.css +1 -1
  52. package/dist/elements/preupgrade/radios.css +1 -1
  53. package/dist/elements/preupgrade/search.css +1 -1
  54. package/dist/elements/preupgrade/select.css +1 -1
  55. package/dist/elements/preupgrade/side-sheet.css +1 -1
  56. package/dist/elements/preupgrade/slider.css +1 -1
  57. package/dist/elements/preupgrade/snackbar.css +1 -1
  58. package/dist/elements/preupgrade/split-button.css +1 -1
  59. package/dist/elements/preupgrade/switch.css +1 -1
  60. package/dist/elements/preupgrade/tabs.css +1 -1
  61. package/dist/elements/preupgrade/text-field.css +1 -1
  62. package/dist/elements/preupgrade/timepicker.css +1 -1
  63. package/dist/elements/preupgrade/toolbar.css +1 -1
  64. package/dist/elements/preupgrade/tooltip.css +1 -1
  65. package/dist/elements/preupgrade/top-app-bar.css +1 -1
  66. package/dist/elements/preupgrade.css +1 -1
  67. package/dist/package.json +1 -1
  68. package/dist/styles/badge.css +1 -1
  69. package/dist/styles/base.css +1 -1
  70. package/dist/styles/bottom-app-bar.css +1 -1
  71. package/dist/styles/bottom-sheet.css +1 -1
  72. package/dist/styles/button-group.css +1 -1
  73. package/dist/styles/button.css +1 -1
  74. package/dist/styles/card.css +1 -1
  75. package/dist/styles/carousel.css +1 -1
  76. package/dist/styles/checkbox.css +1 -1
  77. package/dist/styles/chips.css +1 -1
  78. package/dist/styles/contrast.css +1 -1
  79. package/dist/styles/datepicker.css +1 -1
  80. package/dist/styles/dialog.css +2 -2
  81. package/dist/styles/divider.css +1 -1
  82. package/dist/styles/drawer.css +1 -1
  83. package/dist/styles/extended-fab.css +1 -1
  84. package/dist/styles/fab-menu.css +1 -1
  85. package/dist/styles/fab.css +1 -1
  86. package/dist/styles/icon-button.css +1 -1
  87. package/dist/styles/list.css +1 -1
  88. package/dist/styles/loading-indicator.css +1 -1
  89. package/dist/styles/menu.css +1 -1
  90. package/dist/styles/navigation-bar.css +1 -1
  91. package/dist/styles/navigation-rail.css +1 -1
  92. package/dist/styles/progress.css +1 -1
  93. package/dist/styles/radios.css +1 -1
  94. package/dist/styles/search.css +1 -1
  95. package/dist/styles/select.css +1 -1
  96. package/dist/styles/side-sheet.css +1 -1
  97. package/dist/styles/slider.css +1 -1
  98. package/dist/styles/snackbar.css +1 -1
  99. package/dist/styles/split-button.css +1 -1
  100. package/dist/styles/switch.css +2 -2
  101. package/dist/styles/tabs.css +1 -1
  102. package/dist/styles/text-field.css +1 -1
  103. package/dist/styles/timepicker.css +1 -1
  104. package/dist/styles/toolbar.css +1 -1
  105. package/dist/styles/tooltip.css +1 -1
  106. package/dist/styles/top-app-bar.css +1 -1
  107. package/dist/styles/typography.css +1 -1
  108. package/dist/styles/utilities.css +1 -1
  109. package/dist/styles.css +2 -2
  110. package/dist/themes/autumn-contrast.css +1 -1
  111. package/dist/themes/autumn.css +1 -1
  112. package/dist/themes/baseline-contrast.css +1 -1
  113. package/dist/themes/baseline.css +1 -1
  114. package/dist/themes/brownbeige-contrast.css +1 -1
  115. package/dist/themes/brownbeige.css +1 -1
  116. package/dist/themes/content-contrast.css +1 -1
  117. package/dist/themes/content.css +1 -1
  118. package/dist/themes/desert-contrast.css +1 -1
  119. package/dist/themes/desert.css +1 -1
  120. package/dist/themes/expressive-contrast.css +1 -1
  121. package/dist/themes/expressive.css +1 -1
  122. package/dist/themes/fidelity-contrast.css +1 -1
  123. package/dist/themes/fidelity.css +1 -1
  124. package/dist/themes/forest-contrast.css +1 -1
  125. package/dist/themes/forest.css +1 -1
  126. package/dist/themes/fruit-salad-contrast.css +1 -1
  127. package/dist/themes/fruit-salad.css +1 -1
  128. package/dist/themes/highcontrast-contrast.css +1 -1
  129. package/dist/themes/highcontrast.css +1 -1
  130. package/dist/themes/monochrome-contrast.css +1 -1
  131. package/dist/themes/monochrome.css +1 -1
  132. package/dist/themes/neutral-contrast.css +1 -1
  133. package/dist/themes/neutral.css +1 -1
  134. package/dist/themes/ocean-contrast.css +1 -1
  135. package/dist/themes/ocean.css +1 -1
  136. package/dist/themes/rainbow-contrast.css +1 -1
  137. package/dist/themes/rainbow.css +1 -1
  138. package/dist/themes/sageivory-contrast.css +1 -1
  139. package/dist/themes/sageivory.css +1 -1
  140. package/dist/themes/spring-contrast.css +1 -1
  141. package/dist/themes/spring.css +1 -1
  142. package/dist/themes/summer-contrast.css +1 -1
  143. package/dist/themes/summer.css +1 -1
  144. package/dist/themes/sunset-contrast.css +1 -1
  145. package/dist/themes/sunset.css +1 -1
  146. package/dist/themes/tealcaramel-contrast.css +1 -1
  147. package/dist/themes/tealcaramel.css +1 -1
  148. package/dist/themes/vibrant-contrast.css +1 -1
  149. package/dist/themes/vibrant.css +1 -1
  150. package/package.json +1 -1
  151. package/src/styles/components/_dialog.scss +8 -0
  152. package/src/styles/components/_switch.scss +15 -5
@@ -1,9 +1,7 @@
1
- import { getOverlayConfig } from "./config.js";
2
1
  import createButton from "../button/index.js";
3
- import { createDivider } from "../divider/index.js";
4
2
  import { addClass, removeClass } from "../../core/dom/classes.js";
5
3
  import { setHTML } from "../../core/dom/html.js";
6
- import { activeElementOf, deepActiveElement, tabStops, wrapTab } from "../../core/dom/focus.js";
4
+ import { deepActiveElement, tabStops, wrapTab } from "../../core/dom/focus.js";
7
5
  import { hideFromTopLayer, onModalEscape, onTopLayerClose, showInTopLayer } from "../../core/dom/layer.js";
8
6
  const DIALOG_EVENTS = {
9
7
  OPEN: "open",
@@ -18,17 +16,8 @@ export const withStructure = (config, getComponent) => (component) => {
18
16
  const uid = `${component.getClass("dialog")}-${++dialogCount}`;
19
17
  const titleId = `${uid}-title`;
20
18
  const contentId = `${uid}-content`;
21
- const overlayConfig = getOverlayConfig();
22
- const overlay = document.createElement(overlayConfig.tag || "div");
19
+ const overlay = document.createElement("div");
23
20
  overlay.classList.add(component.getClass("dialog__overlay"));
24
- if (overlayConfig.attributes &&
25
- typeof overlayConfig.attributes === "object") {
26
- Object.entries(overlayConfig.attributes).forEach(([key, value]) => {
27
- if (key && typeof key === "string" && value !== undefined) {
28
- overlay.setAttribute(key, String(value));
29
- }
30
- });
31
- }
32
21
  if (config.zIndex) {
33
22
  overlay.style.zIndex = String(config.zIndex);
34
23
  }
@@ -95,10 +84,8 @@ export const withStructure = (config, getComponent) => (component) => {
95
84
  return footer;
96
85
  };
97
86
  const createDividerElement = () => {
98
- const divider = createDivider({
99
- variant: "full-width",
100
- class: component.getClass("dialog__divider"),
101
- });
87
+ const divider = document.createElement("hr");
88
+ divider.classList.add(component.getClass("dialog__divider"));
102
89
  return divider;
103
90
  };
104
91
  const header = createHeader();
@@ -129,16 +116,16 @@ export const withStructure = (config, getComponent) => (component) => {
129
116
  let footerDivider = null;
130
117
  if (config.divider) {
131
118
  headerDivider = createDividerElement();
132
- headerDivider.element.classList.add(component.getClass("dialog__header-divider"));
133
- component.element.appendChild(headerDivider.element);
119
+ headerDivider.classList.add(component.getClass("dialog__header-divider"));
120
+ component.element.appendChild(headerDivider);
134
121
  if (footer) {
135
122
  footerDivider = createDividerElement();
136
- footerDivider.element.classList.add(component.getClass("dialog__footer-divider"));
123
+ footerDivider.classList.add(component.getClass("dialog__footer-divider"));
137
124
  }
138
125
  }
139
126
  component.element.appendChild(content);
140
127
  if (footerDivider) {
141
- component.element.appendChild(footerDivider.element);
128
+ component.element.appendChild(footerDivider);
142
129
  }
143
130
  if (footer) {
144
131
  component.element.appendChild(footer);
@@ -170,29 +157,25 @@ export const withDivider = () => (component) => {
170
157
  divider: {
171
158
  toggleDivider(show) {
172
159
  if (show && !component.structure.headerDivider) {
173
- const headerDivider = createDivider({
174
- variant: "full-width",
175
- class: `${component.getClass("dialog__divider")} ${component.getClass("dialog__header-divider")}`,
176
- });
177
- component.element.insertBefore(headerDivider.element, component.structure.content);
160
+ const headerDivider = document.createElement("hr");
161
+ headerDivider.classList.add(component.getClass("dialog__divider"), component.getClass("dialog__header-divider"));
162
+ component.element.insertBefore(headerDivider, component.structure.content);
178
163
  component.structure.headerDivider = headerDivider;
179
164
  if (component.structure.footer &&
180
165
  !component.structure.footerDivider) {
181
- const footerDivider = createDivider({
182
- variant: "full-width",
183
- class: `${component.getClass("dialog__divider")} ${component.getClass("dialog__footer-divider")}`,
184
- });
185
- component.element.insertBefore(footerDivider.element, component.structure.footer);
166
+ const footerDivider = document.createElement("hr");
167
+ footerDivider.classList.add(component.getClass("dialog__divider"), component.getClass("dialog__footer-divider"));
168
+ component.element.insertBefore(footerDivider, component.structure.footer);
186
169
  component.structure.footerDivider = footerDivider;
187
170
  }
188
171
  }
189
172
  else if (!show) {
190
173
  if (component.structure.headerDivider) {
191
- component.structure.headerDivider.element.remove();
174
+ component.structure.headerDivider.remove();
192
175
  component.structure.headerDivider = null;
193
176
  }
194
177
  if (component.structure.footerDivider) {
195
- component.structure.footerDivider.element.remove();
178
+ component.structure.footerDivider.remove();
196
179
  component.structure.footerDivider = null;
197
180
  }
198
181
  }
@@ -251,39 +234,42 @@ export const withVisibility = (getComponent) => (component) => {
251
234
  let showTimer;
252
235
  let afterOpenTimer;
253
236
  let afterCloseTimer;
237
+ let afterOpenWaiting = false;
254
238
  const openDuration = component.config.animationDuration ?? 500;
255
239
  const closeDuration = component.config.animationDuration ?? 150;
256
240
  const top = component.config.layer === "top";
257
241
  const scrim = top ? component.element : component.overlay;
258
- const focusableElements = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';
259
242
  let previouslyFocusedElement = null;
260
243
  let mouseDownOnOverlay = false;
261
244
  const inerted = [];
262
245
  let scrollLock = null;
263
- const focusable = () => Array.from(component.element.querySelectorAll(focusableElements)).filter((el) => !el.hasAttribute("disabled") &&
264
- el.getAttribute("aria-hidden") !== "true" &&
265
- (el.offsetWidth > 0 || el.offsetHeight > 0 || el === activeElementOf(el)));
266
- function handleTabKey(e) {
267
- if (e.key !== "Tab")
246
+ let focusFrame;
247
+ let focusView;
248
+ let focusRequest = 0;
249
+ let focusPending = false;
250
+ const cancelFocusFrame = () => {
251
+ focusRequest += 1;
252
+ focusPending = false;
253
+ if (focusFrame !== undefined) {
254
+ focusView?.cancelAnimationFrame(focusFrame);
255
+ focusFrame = undefined;
256
+ focusView = undefined;
257
+ }
258
+ };
259
+ const emitAfterOpen = () => {
260
+ afterOpenWaiting = false;
261
+ if (!opened || typeof component.emit !== "function")
268
262
  return;
269
- const elements = focusable();
270
- if (elements.length === 0) {
271
- e.preventDefault();
272
- component.element.focus();
263
+ component.emit(DIALOG_EVENTS.AFTER_OPEN, { dialog: getComponent() });
264
+ };
265
+ const afterOpenDue = () => {
266
+ afterOpenTimer = undefined;
267
+ if (focusPending) {
268
+ afterOpenWaiting = true;
273
269
  return;
274
270
  }
275
- const first = elements[0];
276
- const last = elements[elements.length - 1];
277
- const active = activeElementOf(component.element);
278
- if (e.shiftKey && (active === first || !component.element.contains(active))) {
279
- last.focus();
280
- e.preventDefault();
281
- }
282
- else if (!e.shiftKey && active === last) {
283
- first.focus();
284
- e.preventDefault();
285
- }
286
- }
271
+ emitAfterOpen();
272
+ };
287
273
  const inertBackground = () => {
288
274
  if (component.config.modal === false)
289
275
  return;
@@ -313,20 +299,76 @@ export const withVisibility = (getComponent) => (component) => {
313
299
  scrollLock = null;
314
300
  }
315
301
  };
302
+ let containerPosition = null;
303
+ const unscopeScrim = () => {
304
+ removeClass(component.overlay, `${component.getClass("dialog__overlay")}--contained`);
305
+ if (containerPosition === null)
306
+ return;
307
+ component.structure.container.style.position = containerPosition;
308
+ containerPosition = null;
309
+ };
310
+ const scopeScrim = () => {
311
+ const container = component.structure.container;
312
+ if (top || container === document.body)
313
+ return;
314
+ if (getComputedStyle(container).position === "static") {
315
+ containerPosition ?? (containerPosition = container.style.position);
316
+ container.style.position = "relative";
317
+ }
318
+ addClass(component.overlay, `${component.getClass("dialog__overlay")}--contained`);
319
+ if (!container.clientHeight ||
320
+ container.clientWidth < component.element.offsetWidth ||
321
+ container.clientHeight < component.element.offsetHeight) {
322
+ unscopeScrim();
323
+ }
324
+ };
316
325
  const handleWrap = (e) => wrapTab(component.element, e);
326
+ const focusWhenVisible = (target) => {
327
+ const view = target.ownerDocument.defaultView;
328
+ if (!view || typeof view.requestAnimationFrame !== "function") {
329
+ target.focus();
330
+ focusPending = false;
331
+ if (afterOpenWaiting)
332
+ emitAfterOpen();
333
+ return;
334
+ }
335
+ cancelFocusFrame();
336
+ const request = focusRequest;
337
+ const settle = () => {
338
+ focusFrame = undefined;
339
+ if (request !== focusRequest)
340
+ return;
341
+ if (!opened || !target.isConnected) {
342
+ focusPending = false;
343
+ if (afterOpenWaiting)
344
+ emitAfterOpen();
345
+ return;
346
+ }
347
+ if (view.getComputedStyle(target).visibility !== "hidden") {
348
+ target.focus();
349
+ focusPending = false;
350
+ if (afterOpenWaiting)
351
+ emitAfterOpen();
352
+ return;
353
+ }
354
+ focusPending = true;
355
+ focusFrame = view.requestAnimationFrame(settle);
356
+ focusView = view;
357
+ };
358
+ settle();
359
+ };
317
360
  const trapFocus = () => {
318
361
  inertBackground();
319
362
  if (component.config.autofocus !== false) {
320
363
  const requested = component.element.querySelector("[autofocus]");
321
- const target = requested || (top ? tabStops(component.element) : focusable())[0] || component.element;
322
- target.focus();
364
+ const target = requested || tabStops(component.element)[0] || component.element;
365
+ focusWhenVisible(target);
323
366
  }
324
367
  if (component.config.trapFocus !== false) {
325
- component.element.addEventListener("keydown", top ? handleWrap : handleTabKey);
368
+ component.element.addEventListener("keydown", handleWrap);
326
369
  }
327
370
  };
328
371
  const releaseFocus = () => {
329
- component.element.removeEventListener("keydown", handleTabKey);
330
372
  component.element.removeEventListener("keydown", handleWrap);
331
373
  releaseBackground();
332
374
  if (previouslyFocusedElement) {
@@ -390,6 +432,7 @@ export const withVisibility = (getComponent) => (component) => {
390
432
  component.element.setAttribute("open", "");
391
433
  }
392
434
  };
435
+ scopeScrim();
393
436
  if (isOpen) {
394
437
  if (top)
395
438
  showModal();
@@ -417,6 +460,8 @@ export const withVisibility = (getComponent) => (component) => {
417
460
  return;
418
461
  opened = true;
419
462
  clearTimeout(afterCloseTimer);
463
+ afterOpenWaiting = false;
464
+ focusPending = false;
420
465
  if (top) {
421
466
  showModal();
422
467
  void component.element.offsetWidth;
@@ -426,9 +471,7 @@ export const withVisibility = (getComponent) => (component) => {
426
471
  component.emit(DIALOG_EVENTS.OPEN, { dialog: getComponent() });
427
472
  if (!opened)
428
473
  return;
429
- afterOpenTimer = setTimeout(() => {
430
- component.emit(DIALOG_EVENTS.AFTER_OPEN, { dialog: getComponent() });
431
- }, openDuration);
474
+ afterOpenTimer = setTimeout(afterOpenDue, openDuration);
432
475
  return;
433
476
  }
434
477
  if (component.element.parentNode !== component.overlay) {
@@ -438,6 +481,7 @@ export const withVisibility = (getComponent) => (component) => {
438
481
  const container = component.structure.container || document.body;
439
482
  container.appendChild(component.overlay);
440
483
  }
484
+ scopeScrim();
441
485
  setupEvents();
442
486
  if (typeof component.emit === "function") {
443
487
  component.emit(DIALOG_EVENTS.OPEN, { dialog: getComponent() });
@@ -449,9 +493,7 @@ export const withVisibility = (getComponent) => (component) => {
449
493
  addClass(component.element, `${component.getClass("dialog")}--visible`);
450
494
  trapFocus();
451
495
  if (typeof component.emit === "function") {
452
- afterOpenTimer = setTimeout(() => {
453
- component.emit(DIALOG_EVENTS.AFTER_OPEN, { dialog: getComponent() });
454
- }, openDuration);
496
+ afterOpenTimer = setTimeout(afterOpenDue, openDuration);
455
497
  }
456
498
  }, 10);
457
499
  },
@@ -474,6 +516,8 @@ export const withVisibility = (getComponent) => (component) => {
474
516
  opened = false;
475
517
  clearTimeout(showTimer);
476
518
  clearTimeout(afterOpenTimer);
519
+ afterOpenWaiting = false;
520
+ cancelFocusFrame();
477
521
  const dialogVisibleClass = `${component.getClass("dialog")}--visible`;
478
522
  const overlayVisibleClass = `${component.getClass("dialog__overlay")}--visible`;
479
523
  removeClass(component.element, dialogVisibleClass);
@@ -491,6 +535,7 @@ export const withVisibility = (getComponent) => (component) => {
491
535
  if (!top && component.overlay && component.overlay.parentNode) {
492
536
  component.overlay.parentNode.removeChild(component.overlay);
493
537
  }
538
+ unscopeScrim();
494
539
  if (typeof component.emit === "function") {
495
540
  component.emit(DIALOG_EVENTS.AFTER_CLOSE, { dialog: getComponent() });
496
541
  }
@@ -515,7 +560,10 @@ export const withVisibility = (getComponent) => (component) => {
515
560
  clearTimeout(showTimer);
516
561
  clearTimeout(afterOpenTimer);
517
562
  clearTimeout(afterCloseTimer);
563
+ afterOpenWaiting = false;
564
+ cancelFocusFrame();
518
565
  cleanupEvents();
566
+ unscopeScrim();
519
567
  },
520
568
  };
521
569
  if (component && component.on) {
@@ -1,5 +1,4 @@
1
1
  import type { ButtonComponent } from "../button/types.js";
2
- import type { DividerComponent } from "../divider/types.js";
3
2
  import type { EventCallback } from "../../core/state/emitter.js";
4
3
  export type DialogSize = 'small' | 'medium' | 'large' | 'fullwidth' | 'fullscreen';
5
4
  export type DialogAnimation = 'scale' | 'slide-up' | 'slide-down' | 'fade';
@@ -51,8 +50,8 @@ export interface DialogStructure {
51
50
  header: HTMLElement;
52
51
  content: HTMLElement;
53
52
  footer: HTMLElement | null;
54
- headerDivider: DividerComponent | null;
55
- footerDivider: DividerComponent | null;
53
+ headerDivider: HTMLElement | null;
54
+ footerDivider: HTMLElement | null;
56
55
  container: HTMLElement;
57
56
  }
58
57
  export interface DialogButtonRecord {
@@ -76,7 +76,7 @@ export const withInput = (config, getComponent) => (component) => {
76
76
  const input = component.structure?.input;
77
77
  if (input) {
78
78
  input.placeholder = text;
79
- input.setAttribute("aria-label", text);
79
+ input.setAttribute("aria-label", config.ariaLabel || text);
80
80
  }
81
81
  };
82
82
  const getPlaceholder = () => {
@@ -77,7 +77,7 @@ export const withStructure = (config) => (component) => {
77
77
  const inputAttributes = {
78
78
  type: "text",
79
79
  placeholder,
80
- "aria-label": placeholder,
80
+ "aria-label": config.ariaLabel || placeholder,
81
81
  role: "combobox",
82
82
  "aria-autocomplete": "list",
83
83
  "aria-expanded": String(isViewState),
@@ -45,6 +45,7 @@ export interface SearchConfig {
45
45
  variant?: SearchVariant;
46
46
  disabled?: boolean;
47
47
  placeholder?: string;
48
+ ariaLabel?: string;
48
49
  value?: string;
49
50
  name?: string;
50
51
  leadingIcon?: string;
@@ -29,6 +29,8 @@ export const withTextField = (config) => (component) => {
29
29
  });
30
30
  textField.element.classList.add(`${config.prefix || "mtrl"}-select`);
31
31
  if (textField.input) {
32
+ if (config.ariaLabel)
33
+ textField.input.setAttribute("aria-label", config.ariaLabel);
32
34
  const input = textField.input;
33
35
  input.addEventListener("keydown", (e) => {
34
36
  const allowedKeys = [
@@ -21,6 +21,7 @@ export interface SelectConfig {
21
21
  variant?: SelectVariant | string;
22
22
  density?: "default" | "compact" | string;
23
23
  label?: string;
24
+ ariaLabel?: string;
24
25
  name?: string;
25
26
  required?: boolean;
26
27
  menu?: {
@@ -16,10 +16,8 @@ export const withDom = (config) => (component) => {
16
16
  setStyles(container, {
17
17
  position: "relative",
18
18
  });
19
- const label = config.label || "";
20
- const handleLabel = config.range && label ? `${label} minimum` : label;
21
- const secondHandleLabel = label ? `${label} maximum` : "";
22
- const handleElement = (index, handleValue, name) => {
19
+ const label = config.ariaLabel || config.label || "";
20
+ const handleElement = (index, handleValue) => {
23
21
  const attributes = {
24
22
  role: "slider",
25
23
  "aria-valuemin": String(min),
@@ -31,9 +29,6 @@ export const withDom = (config) => (component) => {
31
29
  "data-value": String(handleValue),
32
30
  "data-handle-index": String(index),
33
31
  };
34
- if (name) {
35
- attributes["aria-label"] = name;
36
- }
37
32
  const element = createElement({
38
33
  tag: "div",
39
34
  className: getClass("slider__handle"),
@@ -61,15 +56,38 @@ export const withDom = (config) => (component) => {
61
56
  });
62
57
  return element;
63
58
  };
64
- const handle = handleElement(0, value, handleLabel);
59
+ const handle = handleElement(0, value);
65
60
  const valueBubble = bubbleElement(0, value);
66
61
  let secondHandle;
67
62
  let secondValueBubble;
68
63
  if (config.range) {
69
64
  const secondValue = config.secondValue !== undefined ? config.secondValue : max;
70
- secondHandle = handleElement(1, secondValue, secondHandleLabel);
65
+ secondHandle = handleElement(1, secondValue);
71
66
  secondValueBubble = bubbleElement(1, secondValue);
72
67
  }
68
+ [handle, secondHandle].forEach((target, index) => {
69
+ if (!target)
70
+ return;
71
+ const endpoint = config.range ? index ? "maximum" : "minimum" : "";
72
+ if (label)
73
+ target.setAttribute("aria-label", endpoint ? `${label} ${endpoint}` : label);
74
+ if (config.ariaLabelledBy) {
75
+ let labelledBy = config.ariaLabelledBy;
76
+ if (endpoint) {
77
+ const suffix = createElement({
78
+ tag: "span",
79
+ text: endpoint,
80
+ attributes: {
81
+ id: `${getClass("slider")}-${Math.random().toString(36).slice(2, 9)}`,
82
+ hidden: true,
83
+ },
84
+ container: target,
85
+ });
86
+ labelledBy += ` ${suffix.id}`;
87
+ }
88
+ target.setAttribute("aria-labelledby", labelledBy);
89
+ }
90
+ });
73
91
  const name = config.name;
74
92
  const formFields = name
75
93
  ? [
@@ -203,7 +203,8 @@ export const createTab = (config = {}) => {
203
203
  },
204
204
  };
205
205
  const announceBadge = () => {
206
- const count = tab.badge?.isVisible() ? tab.badge.getContent() : "";
206
+ const count = tab.badge?.isVisible()
207
+ ? tab.badge.element.getAttribute("aria-label") || tab.badge.getContent() : "";
207
208
  const label = baseConfig.ariaLabel || button.getText();
208
209
  const name = [label, count].filter(Boolean).join(", ");
209
210
  if (name !== label) {
@@ -1,10 +1,30 @@
1
1
  import { createComponentConfig, createElementConfig, } from "../../core/config/component.js";
2
2
  import { TEXT_FIELD_DEFAULTS } from "./constants.js";
3
+ import { warnDev } from "../../core/utils/warn.js";
3
4
  export const defaultConfig = {
4
5
  type: TEXT_FIELD_DEFAULTS.TYPE,
5
6
  variant: TEXT_FIELD_DEFAULTS.VARIANT,
6
7
  };
7
- export const createBaseConfig = (config = {}) => createComponentConfig(defaultConfig, config, "text-field");
8
+ export const createBaseConfig = (config = {}) => {
9
+ if ( /*#__PURE__*/(() => {
10
+ try {
11
+ return process.env.NODE_ENV !== "production";
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ })() && process.env.NODE_ENV !== "production") {
17
+ const KEY_LIST = "type variant density name label value placeholder required noAsterisk disabled readonly maxLength pattern autocomplete leadingIcon trailingIcon trailingIconLabel onTrailingClick supportingText error prefixText suffixText class prefix componentName className parent id title tabIndex style data role ariaLabel ariaDescribedBy ariaLabelledBy ariaHidden multiline";
18
+ const _complete = true;
19
+ const _sound = true;
20
+ const CONFIG_KEYS = KEY_LIST.split(" ");
21
+ for (const key of Object.keys(config)) {
22
+ if (!CONFIG_KEYS.includes(key))
23
+ warnDev("text-field", `unknown config key "${key}"`);
24
+ }
25
+ }
26
+ return createComponentConfig(defaultConfig, config, "text-field");
27
+ };
8
28
  export const getElementConfig = (config) => createElementConfig(config, {
9
29
  tag: "div",
10
30
  className: config.class,
@@ -29,6 +29,7 @@ export interface TextFieldConfig {
29
29
  density?: TextFieldDensity | string;
30
30
  name?: string;
31
31
  label?: string;
32
+ ariaLabel?: string;
32
33
  value?: string;
33
34
  placeholder?: string;
34
35
  required?: boolean;
@@ -34,7 +34,7 @@ export const withBadge = (config) => (component) => {
34
34
  const badgeClass = badge.getClass("badge");
35
35
  const shows = badge.element.classList.contains(`${badgeClass}--positioned`)
36
36
  && !badge.element.classList.contains(`${badgeClass}--invisible`)
37
- && badge.getLabel() !== "";
37
+ && (badge.getLabel() !== "" || (badge.element.getAttribute("aria-label") ?? "") !== "");
38
38
  if (shows)
39
39
  addIdRef(target, "aria-describedby", badgeId);
40
40
  else
@@ -10,6 +10,7 @@ export interface TextInputConfig {
10
10
  autocomplete?: string;
11
11
  value?: string;
12
12
  placeholder?: string;
13
+ ariaLabel?: string;
13
14
  readonly?: boolean;
14
15
  }
15
16
  export interface TextInputFeature {
@@ -13,6 +13,7 @@ export const withTextInput = (config = {}) => (component) => {
13
13
  autocomplete: config.autocomplete,
14
14
  value: isMultiline ? undefined : config.value || "",
15
15
  placeholder: config.placeholder || " ",
16
+ "aria-label": config.ariaLabel,
16
17
  };
17
18
  if (!isMultiline) {
18
19
  attributes.type = config.type || "text";
@@ -10,8 +10,8 @@ export const deepActiveElement = () => {
10
10
  };
11
11
  const isTabStop = (element) => element.tabIndex !== undefined &&
12
12
  element.tabIndex >= 0 &&
13
- !element.matches(":disabled, [inert] *, [inert]") &&
14
- element.getClientRects().length > 0;
13
+ !element.matches(":disabled, [inert] *, [inert], [aria-hidden='true']") &&
14
+ (element.offsetWidth > 0 || element.getClientRects().length > 0);
15
15
  export const tabStops = (container) => {
16
16
  const found = [];
17
17
  const visit = (element) => {
@@ -1 +1 @@
1
- .mtrl-dialog__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0);visibility:hidden;z-index:1000;display:flex;align-items:center;justify-content:center;overflow:auto;padding:24px;box-sizing:border-box;transition:background-color 150ms linear,visibility 0s linear 150ms}.mtrl-dialog__overlay--visible{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);visibility:visible;transition:background-color 500ms linear,visibility 0s}.mtrl-dialog{position:relative;background-color:var(--mtrl-sys-color-surface-container-high);color:var(--mtrl-sys-color-on-surface);border-radius:var(--mtrl-sys-shape-corner-extra-large, 28px);max-width:560px;min-width:280px;width:100%;margin:auto;box-shadow:0px 1px 3px rgba(0,0,0,.3),0px 4px 8px 3px rgba(0,0,0,.15);transform-origin:top center;transform:translateY(-50px) scaleY(0.35);opacity:0;pointer-events:none;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms}.mtrl-dialog .mtrl-dialog__header,.mtrl-dialog .mtrl-dialog__content,.mtrl-dialog .mtrl-dialog__footer{opacity:0;transition:opacity 100ms linear}.mtrl-dialog--visible{transform:translateY(0) scaleY(1);opacity:1;pointer-events:auto;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}.mtrl-dialog--visible .mtrl-dialog__header,.mtrl-dialog--visible .mtrl-dialog__content{opacity:1;transition:opacity 250ms linear 50ms}.mtrl-dialog--visible .mtrl-dialog__footer{opacity:1;transition:opacity 300ms linear 150ms}.mtrl-dialog--small{width:80%;max-width:360px}.mtrl-dialog--medium{width:90%;max-width:560px}.mtrl-dialog--large{width:95%;max-width:560px}.mtrl-dialog--fullwidth{width:100%;max-width:none;margin:24px}.mtrl-dialog--fullscreen{width:100%;height:100%;max-width:none;max-height:none;margin:0;border-radius:0;transform-origin:center center;transform:translateY(24px)}.mtrl-dialog--fullscreen.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog--slide-up{transform:translateY(24px) scaleY(0.35)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--slide-down{transform:translateY(-24px) scaleY(0.35)}.mtrl-dialog--slide-down.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--fade{transform:none}.mtrl-dialog--fade.mtrl-dialog--visible{transform:none}.mtrl-dialog--scale{transform-origin:center center;transform:scale(0.8)}.mtrl-dialog--scale.mtrl-dialog--visible{transform:scale(1)}dialog.mtrl-dialog{position:fixed;inset:0;height:fit-content;max-height:calc(100% - 48px);padding:0;border:0;overflow:visible;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible{transform:none;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}dialog.mtrl-dialog.mtrl-dialog--fullwidth{width:auto}dialog.mtrl-dialog.mtrl-dialog--fullscreen{height:100%;max-height:none}dialog.mtrl-dialog::backdrop{background-color:rgba(0,0,0,0);transition:background-color 150ms linear,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible::backdrop{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);transition:background-color 500ms linear}.mtrl-dialog__icon{display:flex;align-items:center;justify-content:center;padding:24px 24px 0 24px;color:var(--mtrl-sys-color-secondary)}.mtrl-dialog__icon svg,.mtrl-dialog__icon .mtrl-dialog__icon-content{width:24px;height:24px}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-content{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-title{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-subtitle{text-align:center}.mtrl-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;padding:24px 24px 16px 24px}.mtrl-dialog__icon+.mtrl-dialog__header{padding-top:16px}.mtrl-dialog__header-content{flex:1}.mtrl-dialog__header-title{margin:0;color:var(--mtrl-sys-color-on-surface);font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:24px;line-height:32px;letter-spacing:0;font-weight:400}.mtrl-dialog__header-subtitle{margin:4px 0 0 0;font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;color:var(--mtrl-sys-color-on-surface-variant)}.mtrl-dialog__header-close{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin:-8px -8px 0 0;padding:8px;background:rgba(0,0,0,0);border:none;border-radius:50%;cursor:pointer;color:var(--mtrl-sys-color-on-surface-variant);transition:background-color 100ms cubic-bezier(0.2, 0, 0, 1);position:relative}.mtrl-dialog__header-close:hover{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 8%, transparent)}.mtrl-dialog__header-close:focus{outline:none;background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close:focus-visible{outline:2px solid var(--mtrl-sys-color-primary);outline-offset:2px}.mtrl-dialog__header-close:active{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close svg{width:24px;height:24px}.mtrl-dialog__header-close::after{content:"";position:absolute;width:48px;height:48px;top:50%;left:50%;transform:translate(-50%, -50%)}:where(.mtrl-rtl) .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:-8px 0 0 -8px}.mtrl-dialog__header:empty{display:none}.mtrl-dialog__header:not(:has(*))+.mtrl-dialog__content,.mtrl-dialog>.mtrl-dialog__content:first-child{padding-top:24px}.mtrl-dialog__content{padding:0 24px;color:var(--mtrl-sys-color-on-surface-variant);font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;overflow:visible}.mtrl-dialog__content--scrollable{overflow-y:auto;max-height:60vh;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.2) rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar{width:8px}.mtrl-dialog__content--scrollable::-webkit-scrollbar-track{background:rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2);border-radius:4px}.mtrl-dialog__content p{margin:0 0 16px 0}.mtrl-dialog__content p:last-child{margin-bottom:0}.mtrl-dialog__content--emphasis{color:var(--mtrl-sys-color-on-surface)}.mtrl-dialog__content:last-child{padding-bottom:24px}.mtrl-dialog__footer{display:flex;align-items:center;justify-content:flex-end;padding:24px 24px 24px 24px;gap:8px}.mtrl-dialog__footer--left{justify-content:flex-start}.mtrl-dialog__footer--center{justify-content:center}.mtrl-dialog__footer--space-between{justify-content:space-between}.mtrl-dialog__footer--stacked{flex-direction:column-reverse;align-items:stretch;gap:8px}.mtrl-dialog--fullscreen{display:flex;flex-direction:column}.mtrl-dialog--fullscreen .mtrl-dialog__header{display:flex;align-items:center;min-height:56px;padding:0 24px;gap:8px}.mtrl-dialog--fullscreen .mtrl-dialog__header-close{order:-1;margin:0 0 0 -8px}:where(.mtrl-rtl) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog--fullscreen .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:0 -8px 0 0}.mtrl-dialog--fullscreen .mtrl-dialog__header-title{font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:22px;line-height:28px;letter-spacing:0;font-weight:400;text-align:start}.mtrl-dialog--fullscreen .mtrl-dialog__content{flex:1;overflow-y:auto;padding:24px}.mtrl-dialog--fullscreen .mtrl-dialog__footer{min-height:56px;padding:0 24px;box-sizing:border-box}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{margin:0;border:none;height:1px;background-color:var(--mtrl-sys-color-outline-variant)}@media(prefers-reduced-motion: reduce){.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog__overlay,.mtrl-dialog__overlay--visible{transition:opacity 100ms linear}.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog--scale,.mtrl-dialog--slide-up,.mtrl-dialog--slide-down,.mtrl-dialog--fullscreen{transform:none}}@media(forced-colors: active){.mtrl-dialog{border:2px solid CurrentColor}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{background-color:CurrentColor}.mtrl-dialog__header-close:focus-visible{outline:2px solid CurrentColor}}@media(max-width: 600px){.mtrl-dialog{min-width:280px;width:calc(100% - 32px);max-width:100%;margin:16px;transform-origin:bottom center}.mtrl-dialog--fullscreen{width:100%;height:100%;margin:0;transform-origin:center center}.mtrl-dialog__overlay{padding:16px;align-items:flex-end}.mtrl-dialog__overlay.mtrl-dialog--fullscreen{padding:0}.mtrl-dialog__content--scrollable{max-height:50vh}.mtrl-dialog--slide-up{transform:translateY(24px)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog__footer--responsive{flex-direction:column-reverse;align-items:stretch}}@media print{.mtrl-dialog__overlay{position:static;background:none;padding:0}.mtrl-dialog{box-shadow:none;border:1px solid #000;max-width:100%;transform:none;opacity:1}}
1
+ .mtrl-dialog__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0);visibility:hidden;z-index:1000;display:flex;align-items:center;justify-content:center;overflow:auto;padding:24px;box-sizing:border-box;transition:background-color 150ms linear,visibility 0s linear 150ms}.mtrl-dialog__overlay--contained{position:absolute}.mtrl-dialog__overlay--visible{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);visibility:visible;transition:background-color 500ms linear,visibility 0s}.mtrl-dialog{position:relative;background-color:var(--mtrl-sys-color-surface-container-high);color:var(--mtrl-sys-color-on-surface);border-radius:var(--mtrl-sys-shape-corner-extra-large, 28px);max-width:560px;min-width:280px;width:100%;margin:auto;box-shadow:0px 1px 3px rgba(0,0,0,.3),0px 4px 8px 3px rgba(0,0,0,.15);transform-origin:top center;transform:translateY(-50px) scaleY(0.35);opacity:0;pointer-events:none;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms}.mtrl-dialog .mtrl-dialog__header,.mtrl-dialog .mtrl-dialog__content,.mtrl-dialog .mtrl-dialog__footer{opacity:0;transition:opacity 100ms linear}.mtrl-dialog--visible{transform:translateY(0) scaleY(1);opacity:1;pointer-events:auto;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}.mtrl-dialog--visible .mtrl-dialog__header,.mtrl-dialog--visible .mtrl-dialog__content{opacity:1;transition:opacity 250ms linear 50ms}.mtrl-dialog--visible .mtrl-dialog__footer{opacity:1;transition:opacity 300ms linear 150ms}.mtrl-dialog--small{width:80%;max-width:360px}.mtrl-dialog--medium{width:90%;max-width:560px}.mtrl-dialog--large{width:95%;max-width:560px}.mtrl-dialog--fullwidth{width:100%;max-width:none;margin:24px}.mtrl-dialog--fullscreen{width:100%;height:100%;max-width:none;max-height:none;margin:0;border-radius:0;transform-origin:center center;transform:translateY(24px)}.mtrl-dialog--fullscreen.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog--slide-up{transform:translateY(24px) scaleY(0.35)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--slide-down{transform:translateY(-24px) scaleY(0.35)}.mtrl-dialog--slide-down.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--fade{transform:none}.mtrl-dialog--fade.mtrl-dialog--visible{transform:none}.mtrl-dialog--scale{transform-origin:center center;transform:scale(0.8)}.mtrl-dialog--scale.mtrl-dialog--visible{transform:scale(1)}dialog.mtrl-dialog{position:fixed;inset:0;height:fit-content;max-height:calc(100% - 48px);padding:0;border:0;overflow:visible;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible{transform:none;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}dialog.mtrl-dialog.mtrl-dialog--fullwidth{width:auto}dialog.mtrl-dialog.mtrl-dialog--fullscreen{height:100%;max-height:none}dialog.mtrl-dialog::backdrop{background-color:rgba(0,0,0,0);transition:background-color 150ms linear,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible::backdrop{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);transition:background-color 500ms linear}.mtrl-dialog__icon{display:flex;align-items:center;justify-content:center;padding:24px 24px 0 24px;color:var(--mtrl-sys-color-secondary)}.mtrl-dialog__icon svg,.mtrl-dialog__icon .mtrl-dialog__icon-content{width:24px;height:24px}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-content{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-title{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-subtitle{text-align:center}.mtrl-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;padding:24px 24px 16px 24px}.mtrl-dialog__icon+.mtrl-dialog__header{padding-top:16px}.mtrl-dialog__header-content{flex:1}.mtrl-dialog__header-title{margin:0;color:var(--mtrl-sys-color-on-surface);font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:24px;line-height:32px;letter-spacing:0;font-weight:400}.mtrl-dialog__header-subtitle{margin:4px 0 0 0;font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;color:var(--mtrl-sys-color-on-surface-variant)}.mtrl-dialog__header-close{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin:-8px -8px 0 0;padding:8px;background:rgba(0,0,0,0);border:none;border-radius:50%;cursor:pointer;color:var(--mtrl-sys-color-on-surface-variant);transition:background-color 100ms cubic-bezier(0.2, 0, 0, 1);position:relative}.mtrl-dialog__header-close:hover{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 8%, transparent)}.mtrl-dialog__header-close:focus{outline:none;background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close:focus-visible{outline:2px solid var(--mtrl-sys-color-primary);outline-offset:2px}.mtrl-dialog__header-close:active{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close svg{width:24px;height:24px}.mtrl-dialog__header-close::after{content:"";position:absolute;width:48px;height:48px;top:50%;left:50%;transform:translate(-50%, -50%)}:where(.mtrl-rtl) .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:-8px 0 0 -8px}.mtrl-dialog__header:empty{display:none}.mtrl-dialog__header:not(:has(*))+.mtrl-dialog__content,.mtrl-dialog>.mtrl-dialog__content:first-child{padding-top:24px}.mtrl-dialog__content{padding:0 24px;color:var(--mtrl-sys-color-on-surface-variant);font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;overflow:visible}.mtrl-dialog__content--scrollable{overflow-y:auto;max-height:60vh;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.2) rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar{width:8px}.mtrl-dialog__content--scrollable::-webkit-scrollbar-track{background:rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2);border-radius:4px}.mtrl-dialog__content p{margin:0 0 16px 0}.mtrl-dialog__content p:last-child{margin-bottom:0}.mtrl-dialog__content--emphasis{color:var(--mtrl-sys-color-on-surface)}.mtrl-dialog__content:last-child{padding-bottom:24px}.mtrl-dialog__footer{display:flex;align-items:center;justify-content:flex-end;padding:24px 24px 24px 24px;gap:8px}.mtrl-dialog__footer--left{justify-content:flex-start}.mtrl-dialog__footer--center{justify-content:center}.mtrl-dialog__footer--space-between{justify-content:space-between}.mtrl-dialog__footer--stacked{flex-direction:column-reverse;align-items:stretch;gap:8px}.mtrl-dialog--fullscreen{display:flex;flex-direction:column}.mtrl-dialog--fullscreen .mtrl-dialog__header{display:flex;align-items:center;min-height:56px;padding:0 24px;gap:8px}.mtrl-dialog--fullscreen .mtrl-dialog__header-close{order:-1;margin:0 0 0 -8px}:where(.mtrl-rtl) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog--fullscreen .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:0 -8px 0 0}.mtrl-dialog--fullscreen .mtrl-dialog__header-title{font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:22px;line-height:28px;letter-spacing:0;font-weight:400;text-align:start}.mtrl-dialog--fullscreen .mtrl-dialog__content{flex:1;overflow-y:auto;padding:24px}.mtrl-dialog--fullscreen .mtrl-dialog__footer{min-height:56px;padding:0 24px;box-sizing:border-box}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{margin:0;border:none;height:1px;background-color:var(--mtrl-sys-color-outline-variant)}@media(prefers-reduced-motion: reduce){.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog__overlay,.mtrl-dialog__overlay--visible{transition:opacity 100ms linear}.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog--scale,.mtrl-dialog--slide-up,.mtrl-dialog--slide-down,.mtrl-dialog--fullscreen{transform:none}}@media(forced-colors: active){.mtrl-dialog{border:2px solid CurrentColor}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{background-color:CurrentColor}.mtrl-dialog__header-close:focus-visible{outline:2px solid CurrentColor}}@media(max-width: 600px){.mtrl-dialog{min-width:280px;width:calc(100% - 32px);max-width:100%;margin:16px;transform-origin:bottom center}.mtrl-dialog--fullscreen{width:100%;height:100%;margin:0;transform-origin:center center}.mtrl-dialog__overlay{padding:16px;align-items:flex-end}.mtrl-dialog__overlay.mtrl-dialog--fullscreen{padding:0}.mtrl-dialog__content--scrollable{max-height:50vh}.mtrl-dialog--slide-up{transform:translateY(24px)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog__footer--responsive{flex-direction:column-reverse;align-items:stretch}}@media print{.mtrl-dialog__overlay{position:static;background:none;padding:0}.mtrl-dialog{box-shadow:none;border:1px solid #000;max-width:100%;transform:none;opacity:1}}
@@ -2,4 +2,4 @@ import "./ripple.js";
2
2
  import "./button.js";
3
3
  import "./divider.js";
4
4
  import { registerStyles } from "../styles.js";
5
- registerStyles({ "dialog": ".mtrl-dialog__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0);visibility:hidden;z-index:1000;display:flex;align-items:center;justify-content:center;overflow:auto;padding:24px;box-sizing:border-box;transition:background-color 150ms linear,visibility 0s linear 150ms}.mtrl-dialog__overlay--visible{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);visibility:visible;transition:background-color 500ms linear,visibility 0s}.mtrl-dialog{position:relative;background-color:var(--mtrl-sys-color-surface-container-high);color:var(--mtrl-sys-color-on-surface);border-radius:var(--mtrl-sys-shape-corner-extra-large, 28px);max-width:560px;min-width:280px;width:100%;margin:auto;box-shadow:0px 1px 3px rgba(0,0,0,.3),0px 4px 8px 3px rgba(0,0,0,.15);transform-origin:top center;transform:translateY(-50px) scaleY(0.35);opacity:0;pointer-events:none;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms}.mtrl-dialog .mtrl-dialog__header,.mtrl-dialog .mtrl-dialog__content,.mtrl-dialog .mtrl-dialog__footer{opacity:0;transition:opacity 100ms linear}.mtrl-dialog--visible{transform:translateY(0) scaleY(1);opacity:1;pointer-events:auto;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}.mtrl-dialog--visible .mtrl-dialog__header,.mtrl-dialog--visible .mtrl-dialog__content{opacity:1;transition:opacity 250ms linear 50ms}.mtrl-dialog--visible .mtrl-dialog__footer{opacity:1;transition:opacity 300ms linear 150ms}.mtrl-dialog--small{width:80%;max-width:360px}.mtrl-dialog--medium{width:90%;max-width:560px}.mtrl-dialog--large{width:95%;max-width:560px}.mtrl-dialog--fullwidth{width:100%;max-width:none;margin:24px}.mtrl-dialog--fullscreen{width:100%;height:100%;max-width:none;max-height:none;margin:0;border-radius:0;transform-origin:center center;transform:translateY(24px)}.mtrl-dialog--fullscreen.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog--slide-up{transform:translateY(24px) scaleY(0.35)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--slide-down{transform:translateY(-24px) scaleY(0.35)}.mtrl-dialog--slide-down.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--fade{transform:none}.mtrl-dialog--fade.mtrl-dialog--visible{transform:none}.mtrl-dialog--scale{transform-origin:center center;transform:scale(0.8)}.mtrl-dialog--scale.mtrl-dialog--visible{transform:scale(1)}dialog.mtrl-dialog{position:fixed;inset:0;height:fit-content;max-height:calc(100% - 48px);padding:0;border:0;overflow:visible;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible{transform:none;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}dialog.mtrl-dialog.mtrl-dialog--fullwidth{width:auto}dialog.mtrl-dialog.mtrl-dialog--fullscreen{height:100%;max-height:none}dialog.mtrl-dialog::backdrop{background-color:rgba(0,0,0,0);transition:background-color 150ms linear,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible::backdrop{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);transition:background-color 500ms linear}.mtrl-dialog__icon{display:flex;align-items:center;justify-content:center;padding:24px 24px 0 24px;color:var(--mtrl-sys-color-secondary)}.mtrl-dialog__icon svg,.mtrl-dialog__icon .mtrl-dialog__icon-content{width:24px;height:24px}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-content{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-title{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-subtitle{text-align:center}.mtrl-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;padding:24px 24px 16px 24px}.mtrl-dialog__icon+.mtrl-dialog__header{padding-top:16px}.mtrl-dialog__header-content{flex:1}.mtrl-dialog__header-title{margin:0;color:var(--mtrl-sys-color-on-surface);font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:24px;line-height:32px;letter-spacing:0;font-weight:400}.mtrl-dialog__header-subtitle{margin:4px 0 0 0;font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;color:var(--mtrl-sys-color-on-surface-variant)}.mtrl-dialog__header-close{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin:-8px -8px 0 0;padding:8px;background:rgba(0,0,0,0);border:none;border-radius:50%;cursor:pointer;color:var(--mtrl-sys-color-on-surface-variant);transition:background-color 100ms cubic-bezier(0.2, 0, 0, 1);position:relative}.mtrl-dialog__header-close:hover{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 8%, transparent)}.mtrl-dialog__header-close:focus{outline:none;background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close:focus-visible{outline:2px solid var(--mtrl-sys-color-primary);outline-offset:2px}.mtrl-dialog__header-close:active{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close svg{width:24px;height:24px}.mtrl-dialog__header-close::after{content:\"\";position:absolute;width:48px;height:48px;top:50%;left:50%;transform:translate(-50%, -50%)}:where(.mtrl-rtl) .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:-8px 0 0 -8px}.mtrl-dialog__header:empty{display:none}.mtrl-dialog__header:not(:has(*))+.mtrl-dialog__content,.mtrl-dialog>.mtrl-dialog__content:first-child{padding-top:24px}.mtrl-dialog__content{padding:0 24px;color:var(--mtrl-sys-color-on-surface-variant);font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;overflow:visible}.mtrl-dialog__content--scrollable{overflow-y:auto;max-height:60vh;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.2) rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar{width:8px}.mtrl-dialog__content--scrollable::-webkit-scrollbar-track{background:rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2);border-radius:4px}.mtrl-dialog__content p{margin:0 0 16px 0}.mtrl-dialog__content p:last-child{margin-bottom:0}.mtrl-dialog__content--emphasis{color:var(--mtrl-sys-color-on-surface)}.mtrl-dialog__content:last-child{padding-bottom:24px}.mtrl-dialog__footer{display:flex;align-items:center;justify-content:flex-end;padding:24px 24px 24px 24px;gap:8px}.mtrl-dialog__footer--left{justify-content:flex-start}.mtrl-dialog__footer--center{justify-content:center}.mtrl-dialog__footer--space-between{justify-content:space-between}.mtrl-dialog__footer--stacked{flex-direction:column-reverse;align-items:stretch;gap:8px}.mtrl-dialog--fullscreen{display:flex;flex-direction:column}.mtrl-dialog--fullscreen .mtrl-dialog__header{display:flex;align-items:center;min-height:56px;padding:0 24px;gap:8px}.mtrl-dialog--fullscreen .mtrl-dialog__header-close{order:-1;margin:0 0 0 -8px}:where(.mtrl-rtl) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog--fullscreen .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:0 -8px 0 0}.mtrl-dialog--fullscreen .mtrl-dialog__header-title{font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:22px;line-height:28px;letter-spacing:0;font-weight:400;text-align:start}.mtrl-dialog--fullscreen .mtrl-dialog__content{flex:1;overflow-y:auto;padding:24px}.mtrl-dialog--fullscreen .mtrl-dialog__footer{min-height:56px;padding:0 24px;box-sizing:border-box}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{margin:0;border:none;height:1px;background-color:var(--mtrl-sys-color-outline-variant)}@media(prefers-reduced-motion: reduce){.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog__overlay,.mtrl-dialog__overlay--visible{transition:opacity 100ms linear}.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog--scale,.mtrl-dialog--slide-up,.mtrl-dialog--slide-down,.mtrl-dialog--fullscreen{transform:none}}@media(forced-colors: active){.mtrl-dialog{border:2px solid CurrentColor}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{background-color:CurrentColor}.mtrl-dialog__header-close:focus-visible{outline:2px solid CurrentColor}}@media(max-width: 600px){.mtrl-dialog{min-width:280px;width:calc(100% - 32px);max-width:100%;margin:16px;transform-origin:bottom center}.mtrl-dialog--fullscreen{width:100%;height:100%;margin:0;transform-origin:center center}.mtrl-dialog__overlay{padding:16px;align-items:flex-end}.mtrl-dialog__overlay.mtrl-dialog--fullscreen{padding:0}.mtrl-dialog__content--scrollable{max-height:50vh}.mtrl-dialog--slide-up{transform:translateY(24px)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog__footer--responsive{flex-direction:column-reverse;align-items:stretch}}@media print{.mtrl-dialog__overlay{position:static;background:none;padding:0}.mtrl-dialog{box-shadow:none;border:1px solid #000;max-width:100%;transform:none;opacity:1}}" });
5
+ registerStyles({ "dialog": ".mtrl-dialog__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0);visibility:hidden;z-index:1000;display:flex;align-items:center;justify-content:center;overflow:auto;padding:24px;box-sizing:border-box;transition:background-color 150ms linear,visibility 0s linear 150ms}.mtrl-dialog__overlay--contained{position:absolute}.mtrl-dialog__overlay--visible{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);visibility:visible;transition:background-color 500ms linear,visibility 0s}.mtrl-dialog{position:relative;background-color:var(--mtrl-sys-color-surface-container-high);color:var(--mtrl-sys-color-on-surface);border-radius:var(--mtrl-sys-shape-corner-extra-large, 28px);max-width:560px;min-width:280px;width:100%;margin:auto;box-shadow:0px 1px 3px rgba(0,0,0,.3),0px 4px 8px 3px rgba(0,0,0,.15);transform-origin:top center;transform:translateY(-50px) scaleY(0.35);opacity:0;pointer-events:none;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms}.mtrl-dialog .mtrl-dialog__header,.mtrl-dialog .mtrl-dialog__content,.mtrl-dialog .mtrl-dialog__footer{opacity:0;transition:opacity 100ms linear}.mtrl-dialog--visible{transform:translateY(0) scaleY(1);opacity:1;pointer-events:auto;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}.mtrl-dialog--visible .mtrl-dialog__header,.mtrl-dialog--visible .mtrl-dialog__content{opacity:1;transition:opacity 250ms linear 50ms}.mtrl-dialog--visible .mtrl-dialog__footer{opacity:1;transition:opacity 300ms linear 150ms}.mtrl-dialog--small{width:80%;max-width:360px}.mtrl-dialog--medium{width:90%;max-width:560px}.mtrl-dialog--large{width:95%;max-width:560px}.mtrl-dialog--fullwidth{width:100%;max-width:none;margin:24px}.mtrl-dialog--fullscreen{width:100%;height:100%;max-width:none;max-height:none;margin:0;border-radius:0;transform-origin:center center;transform:translateY(24px)}.mtrl-dialog--fullscreen.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog--slide-up{transform:translateY(24px) scaleY(0.35)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--slide-down{transform:translateY(-24px) scaleY(0.35)}.mtrl-dialog--slide-down.mtrl-dialog--visible{transform:translateY(0) scaleY(1)}.mtrl-dialog--fade{transform:none}.mtrl-dialog--fade.mtrl-dialog--visible{transform:none}.mtrl-dialog--scale{transform-origin:center center;transform:scale(0.8)}.mtrl-dialog--scale.mtrl-dialog--visible{transform:scale(1)}dialog.mtrl-dialog{position:fixed;inset:0;height:fit-content;max-height:calc(100% - 48px);padding:0;border:0;overflow:visible;transition:transform 150ms cubic-bezier(0.3, 0, 0.8, 0.15),opacity 50ms linear 100ms,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible{transform:none;transition:transform 500ms cubic-bezier(0.3, 0, 0, 1),opacity 50ms linear}dialog.mtrl-dialog.mtrl-dialog--fullwidth{width:auto}dialog.mtrl-dialog.mtrl-dialog--fullscreen{height:100%;max-height:none}dialog.mtrl-dialog::backdrop{background-color:rgba(0,0,0,0);transition:background-color 150ms linear,display 150ms allow-discrete,overlay 150ms allow-discrete}dialog.mtrl-dialog.mtrl-dialog--visible::backdrop{background-color:color-mix(in srgb, var(--mtrl-sys-color-scrim) 32%, transparent);transition:background-color 500ms linear}.mtrl-dialog__icon{display:flex;align-items:center;justify-content:center;padding:24px 24px 0 24px;color:var(--mtrl-sys-color-secondary)}.mtrl-dialog__icon svg,.mtrl-dialog__icon .mtrl-dialog__icon-content{width:24px;height:24px}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-content{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-title{text-align:center}.mtrl-dialog__icon+.mtrl-dialog__header .mtrl-dialog__header-subtitle{text-align:center}.mtrl-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;padding:24px 24px 16px 24px}.mtrl-dialog__icon+.mtrl-dialog__header{padding-top:16px}.mtrl-dialog__header-content{flex:1}.mtrl-dialog__header-title{margin:0;color:var(--mtrl-sys-color-on-surface);font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:24px;line-height:32px;letter-spacing:0;font-weight:400}.mtrl-dialog__header-subtitle{margin:4px 0 0 0;font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;color:var(--mtrl-sys-color-on-surface-variant)}.mtrl-dialog__header-close{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin:-8px -8px 0 0;padding:8px;background:rgba(0,0,0,0);border:none;border-radius:50%;cursor:pointer;color:var(--mtrl-sys-color-on-surface-variant);transition:background-color 100ms cubic-bezier(0.2, 0, 0, 1);position:relative}.mtrl-dialog__header-close:hover{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 8%, transparent)}.mtrl-dialog__header-close:focus{outline:none;background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close:focus-visible{outline:2px solid var(--mtrl-sys-color-primary);outline-offset:2px}.mtrl-dialog__header-close:active{background-color:color-mix(in srgb, var(--mtrl-sys-color-on-surface) 10%, transparent)}.mtrl-dialog__header-close svg{width:24px;height:24px}.mtrl-dialog__header-close::after{content:\"\";position:absolute;width:48px;height:48px;top:50%;left:50%;transform:translate(-50%, -50%)}:where(.mtrl-rtl) .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:-8px 0 0 -8px}.mtrl-dialog__header:empty{display:none}.mtrl-dialog__header:not(:has(*))+.mtrl-dialog__content,.mtrl-dialog>.mtrl-dialog__content:first-child{padding-top:24px}.mtrl-dialog__content{padding:0 24px;color:var(--mtrl-sys-color-on-surface-variant);font-family:var(--mtrl-ref-typeface-plain, Roboto, sans-serif);font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:400;overflow:visible}.mtrl-dialog__content--scrollable{overflow-y:auto;max-height:60vh;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.2) rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar{width:8px}.mtrl-dialog__content--scrollable::-webkit-scrollbar-track{background:rgba(0,0,0,.05)}.mtrl-dialog__content--scrollable::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2);border-radius:4px}.mtrl-dialog__content p{margin:0 0 16px 0}.mtrl-dialog__content p:last-child{margin-bottom:0}.mtrl-dialog__content--emphasis{color:var(--mtrl-sys-color-on-surface)}.mtrl-dialog__content:last-child{padding-bottom:24px}.mtrl-dialog__footer{display:flex;align-items:center;justify-content:flex-end;padding:24px 24px 24px 24px;gap:8px}.mtrl-dialog__footer--left{justify-content:flex-start}.mtrl-dialog__footer--center{justify-content:center}.mtrl-dialog__footer--space-between{justify-content:space-between}.mtrl-dialog__footer--stacked{flex-direction:column-reverse;align-items:stretch;gap:8px}.mtrl-dialog--fullscreen{display:flex;flex-direction:column}.mtrl-dialog--fullscreen .mtrl-dialog__header{display:flex;align-items:center;min-height:56px;padding:0 24px;gap:8px}.mtrl-dialog--fullscreen .mtrl-dialog__header-close{order:-1;margin:0 0 0 -8px}:where(.mtrl-rtl) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,:where(:host(.mtrl-rtl)) .mtrl-dialog--fullscreen .mtrl-dialog__header-close,[dir=rtl] .mtrl-dialog--fullscreen .mtrl-dialog__header-close:not(:where(.mtrl-ltr,.mtrl-ltr *)){margin:0 -8px 0 0}.mtrl-dialog--fullscreen .mtrl-dialog__header-title{font-family:var(--mtrl-ref-typeface-brand, Roboto, sans-serif);font-size:22px;line-height:28px;letter-spacing:0;font-weight:400;text-align:start}.mtrl-dialog--fullscreen .mtrl-dialog__content{flex:1;overflow-y:auto;padding:24px}.mtrl-dialog--fullscreen .mtrl-dialog__footer{min-height:56px;padding:0 24px;box-sizing:border-box}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{margin:0;border:none;height:1px;background-color:var(--mtrl-sys-color-outline-variant)}@media(prefers-reduced-motion: reduce){.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog__overlay,.mtrl-dialog__overlay--visible{transition:opacity 100ms linear}.mtrl-dialog,.mtrl-dialog--visible,.mtrl-dialog--scale,.mtrl-dialog--slide-up,.mtrl-dialog--slide-down,.mtrl-dialog--fullscreen{transform:none}}@media(forced-colors: active){.mtrl-dialog{border:2px solid CurrentColor}.mtrl-dialog__header-divider,.mtrl-dialog__footer-divider{background-color:CurrentColor}.mtrl-dialog__header-close:focus-visible{outline:2px solid CurrentColor}}@media(max-width: 600px){.mtrl-dialog{min-width:280px;width:calc(100% - 32px);max-width:100%;margin:16px;transform-origin:bottom center}.mtrl-dialog--fullscreen{width:100%;height:100%;margin:0;transform-origin:center center}.mtrl-dialog__overlay{padding:16px;align-items:flex-end}.mtrl-dialog__overlay.mtrl-dialog--fullscreen{padding:0}.mtrl-dialog__content--scrollable{max-height:50vh}.mtrl-dialog--slide-up{transform:translateY(24px)}.mtrl-dialog--slide-up.mtrl-dialog--visible{transform:translateY(0)}.mtrl-dialog__footer--responsive{flex-direction:column-reverse;align-items:stretch}}@media print{.mtrl-dialog__overlay{position:static;background:none;padding:0}.mtrl-dialog{box-shadow:none;border:1px solid #000;max-width:100%;transform:none;opacity:1}}" });