@m3e/web 2.5.7 → 2.5.9

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 (77) hide show
  1. package/dist/all.js +3908 -987
  2. package/dist/all.js.map +1 -1
  3. package/dist/all.min.js +119 -56
  4. package/dist/all.min.js.map +1 -1
  5. package/dist/button-group.js +31 -12
  6. package/dist/button-group.js.map +1 -1
  7. package/dist/button-group.min.js +1 -1
  8. package/dist/button-group.min.js.map +1 -1
  9. package/dist/button.js +62 -30
  10. package/dist/button.js.map +1 -1
  11. package/dist/button.min.js +1 -1
  12. package/dist/button.min.js.map +1 -1
  13. package/dist/card.js +2 -2
  14. package/dist/card.js.map +1 -1
  15. package/dist/card.min.js +1 -1
  16. package/dist/card.min.js.map +1 -1
  17. package/dist/content-pane.js +1 -1
  18. package/dist/content-pane.js.map +1 -1
  19. package/dist/content-pane.min.js +1 -1
  20. package/dist/content-pane.min.js.map +1 -1
  21. package/dist/core.js +57 -5
  22. package/dist/core.js.map +1 -1
  23. package/dist/core.min.js +1 -1
  24. package/dist/core.min.js.map +1 -1
  25. package/dist/css-custom-data.json +370 -355
  26. package/dist/custom-elements.json +5331 -5173
  27. package/dist/drawer-container.js +13 -7
  28. package/dist/drawer-container.js.map +1 -1
  29. package/dist/drawer-container.min.js +1 -1
  30. package/dist/drawer-container.min.js.map +1 -1
  31. package/dist/html-custom-data.json +276 -276
  32. package/dist/icon-button.js +62 -30
  33. package/dist/icon-button.js.map +1 -1
  34. package/dist/icon-button.min.js +1 -1
  35. package/dist/icon-button.min.js.map +1 -1
  36. package/dist/loading-indicator.js +8 -8
  37. package/dist/loading-indicator.js.map +1 -1
  38. package/dist/loading-indicator.min.js +1 -1
  39. package/dist/loading-indicator.min.js.map +1 -1
  40. package/dist/slide-group.js +1 -1
  41. package/dist/slide-group.js.map +1 -1
  42. package/dist/slide-group.min.js.map +1 -1
  43. package/dist/snackbar.js +2 -2
  44. package/dist/snackbar.js.map +1 -1
  45. package/dist/snackbar.min.js +1 -1
  46. package/dist/snackbar.min.js.map +1 -1
  47. package/dist/src/button/ButtonElement.d.ts.map +1 -1
  48. package/dist/src/button/styles/ButtonSizeStyle.d.ts.map +1 -1
  49. package/dist/src/button/styles/ButtonStyle.d.ts.map +1 -1
  50. package/dist/src/button-group/ButtonGroupElement.d.ts.map +1 -1
  51. package/dist/src/card/styles/CardStyle.d.ts.map +1 -1
  52. package/dist/src/content-pane/ContentPaneElement.d.ts.map +1 -1
  53. package/dist/src/core/shared/controllers/ScrollController.d.ts.map +1 -1
  54. package/dist/src/core/shared/tokens/DesignToken.d.ts +18 -0
  55. package/dist/src/core/shared/tokens/DesignToken.d.ts.map +1 -1
  56. package/dist/src/core/shared/tokens/MeasurementToken.d.ts +34 -0
  57. package/dist/src/core/shared/tokens/MeasurementToken.d.ts.map +1 -0
  58. package/dist/src/drawer-container/DrawerContainerElement.d.ts.map +1 -1
  59. package/dist/src/drawer-container/DrawerToggleElement.d.ts.map +1 -1
  60. package/dist/src/icon-button/IconButtonElement.d.ts.map +1 -1
  61. package/dist/src/icon-button/styles/IconButtonSizeStyle.d.ts.map +1 -1
  62. package/dist/src/icon-button/styles/IconButtonStyle.d.ts.map +1 -1
  63. package/dist/src/loading-indicator/LoadingIndicatorElement.d.ts +1 -1
  64. package/dist/src/loading-indicator/LoadingIndicatorElement.d.ts.map +1 -1
  65. package/dist/src/snackbar/SnackbarElement.d.ts.map +1 -1
  66. package/dist/src/theme/ThemeElement.d.ts.map +1 -1
  67. package/dist/src/toc/TocElement.d.ts +4 -0
  68. package/dist/src/toc/TocElement.d.ts.map +1 -1
  69. package/dist/theme.js +3580 -834
  70. package/dist/theme.js.map +1 -1
  71. package/dist/theme.min.js +94 -31
  72. package/dist/theme.min.js.map +1 -1
  73. package/dist/toc.js +42 -8
  74. package/dist/toc.js.map +1 -1
  75. package/dist/toc.min.js +1 -1
  76. package/dist/toc.min.js.map +1 -1
  77. package/package.json +2 -2
@@ -6,9 +6,9 @@
6
6
  import { __classPrivateFieldGet, __decorate } from 'tslib';
7
7
  import { LitElement, html, css } from 'lit';
8
8
  import { query, property, queryAssignedElements } from 'lit/decorators.js';
9
- import { Role, PressedController, setCustomState, addCustomState, isSelectedMixin, DesignToken, customElement } from '@m3e/web/core';
9
+ import { Role, PressedController, setCustomState, addCustomState, isSelectedMixin, prefersReducedMotion, hasCustomState, DesignToken, customElement } from '@m3e/web/core';
10
10
 
11
- var _M3eButtonGroupElement_instances, _M3eButtonGroupElement_pressedController, _M3eButtonGroupElement_updateButtons, _M3eButtonGroupElement_handleChange;
11
+ var _M3eButtonGroupElement_instances, _M3eButtonGroupElement_pressedController, _M3eButtonGroupElement_updateButtons, _M3eButtonGroupElement_handleChange, _M3eButtonGroupElement_handlePressedChange, _M3eButtonGroupElement_cleanupPressed;
12
12
  /**
13
13
  * Organizes buttons and adds interactions between them.
14
14
  *
@@ -73,16 +73,7 @@ let M3eButtonGroupElement = class M3eButtonGroupElement extends Role(LitElement,
73
73
  capture: true,
74
74
  minPressedDuration: 150,
75
75
  isPressedKey: key => key === " ",
76
- callback: pressed => {
77
- if (!this._base) return;
78
- if (!pressed || this.variant === "connected") {
79
- this._base.style.removeProperty("--_button-group-width");
80
- this._base.classList.remove("pressed");
81
- } else {
82
- this._base.classList.add("pressed");
83
- this._base.style.setProperty("--_button-group-width", `${this._base.getBoundingClientRect().width}px`);
84
- }
85
- }
76
+ callback: pressed => __classPrivateFieldGet(this, _M3eButtonGroupElement_instances, "m", _M3eButtonGroupElement_handlePressedChange).call(this, pressed)
86
77
  }));
87
78
  /**
88
79
  * The appearance variant of the group.
@@ -172,6 +163,34 @@ _M3eButtonGroupElement_handleChange = function _M3eButtonGroupElement_handleChan
172
163
  }
173
164
  }
174
165
  };
166
+ _M3eButtonGroupElement_handlePressedChange = function _M3eButtonGroupElement_handlePressedChange(pressed) {
167
+ const base = this._base;
168
+ if (!base) return;
169
+ if (!pressed || this.variant === "connected") {
170
+ const button = this.buttons.find(x => x === document.activeElement);
171
+ if (!prefersReducedMotion() && button) {
172
+ button.addEventListener("transitionend", () => queueMicrotask(() => {
173
+ // Pressed state is tested to ensure this runs only when the button
174
+ // is no longer pressed. This handles changes to pressed state in
175
+ // quick succession.
176
+ if (!hasCustomState(button, "--pressed")) {
177
+ __classPrivateFieldGet(this, _M3eButtonGroupElement_instances, "m", _M3eButtonGroupElement_cleanupPressed).call(this, base);
178
+ }
179
+ }), {
180
+ once: true
181
+ });
182
+ } else {
183
+ __classPrivateFieldGet(this, _M3eButtonGroupElement_instances, "m", _M3eButtonGroupElement_cleanupPressed).call(this, base);
184
+ }
185
+ } else {
186
+ base.classList.add("pressed");
187
+ base.style.setProperty("--_button-group-width", `${base.getBoundingClientRect().width}px`);
188
+ }
189
+ };
190
+ _M3eButtonGroupElement_cleanupPressed = function _M3eButtonGroupElement_cleanupPressed(base) {
191
+ base.style.removeProperty("--_button-group-width");
192
+ base.classList.remove("pressed");
193
+ };
175
194
  /** The styles of the element. */
176
195
  M3eButtonGroupElement.styles = css`:host { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } .base { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } :host([variant="standard"]) { justify-content: center; } :host([variant="connected"]) .base { flex: 1 1 auto; } :host([variant="standard"]) .base { width: fit-content; flex: none; } :host([variant="standard"]) .base.pressed { justify-content: space-between; width: var(--_button-group-width); } :host([variant="standard"][size="extra-small"]) .base { column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem); } :host([variant="standard"][size="small"]) .base { column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem); } :host([variant="standard"][size="medium"]).base { column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem); } :host([variant="standard"][size="large"]) .base { column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem); } :host([variant="standard"][size="extra-large"]) .base { column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem); } :host([variant="connected"]) .base { column-gap: var(--m3e-connected-button-group-spacing, 0.125rem); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--first), :--first)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--last), :--last)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--first), :--first)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-end-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--last), :--last)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${DesignToken.shape.corner.small} ); --_button-start-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--first), :--first)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--last), :--last)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${DesignToken.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${DesignToken.shape.corner.extraSmall} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--first), :--first)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${DesignToken.shape.corner.large} ); --_button-square-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${DesignToken.shape.corner.large} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${DesignToken.shape.corner.medium} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--last), :--last)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${DesignToken.shape.corner.large} ); --_button-square-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${DesignToken.shape.corner.large} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${DesignToken.shape.corner.medium} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--first), :--first)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${DesignToken.shape.corner.largeIncreased} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${DesignToken.shape.corner.largeIncreased} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${DesignToken.shape.corner.large} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--last), :--last)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${DesignToken.shape.corner.largeIncreased} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${DesignToken.shape.corner.largeIncreased} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${DesignToken.shape.corner.large} ); }`;
177
196
  __decorate([query(".base")], M3eButtonGroupElement.prototype, "_base", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.js","sources":["../../src/button-group/ButtonGroupElement.ts"],"sourcesContent":["import { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property, query, queryAssignedElements } from \"lit/decorators.js\";\r\n\r\nimport {\r\n PressedController,\r\n Role,\r\n isSelectedMixin,\r\n DesignToken,\r\n setCustomState,\r\n addCustomState,\r\n customElement,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { M3eButtonElement } from \"@m3e/web/button\";\r\nimport { M3eIconButtonElement } from \"@m3e/web/icon-button\";\r\n\r\nimport { ButtonGroupVariant } from \"./ButtonGroupVariant\";\r\nimport { ButtonGroupSize } from \"./ButtonGroupSize\";\r\n\r\n/**\r\n * Organizes buttons and adds interactions between them.\r\n *\r\n * @description\r\n * The `m3e-button-group` component arranges multiple buttons into a unified, expressive layout,\r\n * supporting both `standard` and `connected` variants. It enables seamless, accessible grouping\r\n * of actions, adapts to various sizes, and ensures consistent spacing, shape, and alignment.\r\n * Designed according to Material 3 principles, it empowers users to interact with related actions\r\n * in a visually harmonious and intuitive way.\r\n *\r\n * @example\r\n * The following example illustrates a standard button group.\r\n * ``` html\r\n * <m3e-button-group>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_bold\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_italic\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_underlined\"></m3e-icon></m3e-icon-button>\r\n * </m3e-button-group>\r\n * ```\r\n * @example\r\n * The next example illustrates a connected button group.\r\n * ```html\r\n * <m3e-button-group variant=\"connected\">\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Start</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Directions</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Share</m3e-button>\r\n * </m3e-button-group>\r\n * ```\r\n *\r\n * @tag m3e-button-group\r\n *\r\n * @slot - Renders the buttons of the group.\r\n *\r\n * @attr multi - Whether multiple toggle buttons can be selected.\r\n * @attr size - The size of the group.\r\n * @attr variant - The appearance variant of the group.\r\n *\r\n * @cssprop --m3e-standard-button-group-extra-small-spacing - Spacing between buttons in standard variant, extra-small size.\r\n * @cssprop --m3e-standard-button-group-small-spacing - Spacing between buttons in standard variant, small size.\r\n * @cssprop --m3e-standard-button-group-medium-spacing - Spacing between buttons in standard variant, medium size.\r\n * @cssprop --m3e-standard-button-group-large-spacing - Spacing between buttons in standard variant, large size.\r\n * @cssprop --m3e-standard-button-group-extra-large-spacing - Spacing between buttons in standard variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-spacing - Spacing between buttons in connected variant.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-shape - Corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-pressed-shape - Pressed corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-shape - Corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-pressed-shape - Pressed corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-shape - Corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-pressed-shape - Pressed corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-large-inner-shape - Corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-large-inner-pressed-shape - Pressed corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-shape - Corner shape for connected variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-pressed-shape - Pressed corner shape for connected variant, extra-large size.\r\n */\r\n@customElement(\"m3e-button-group\")\r\nexport class M3eButtonGroupElement extends Role(LitElement, \"group\") {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n .base {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n :host([variant=\"standard\"]) {\r\n justify-content: center;\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n flex: 1 1 auto;\r\n }\r\n :host([variant=\"standard\"]) .base {\r\n width: fit-content;\r\n flex: none;\r\n }\r\n :host([variant=\"standard\"]) .base.pressed {\r\n justify-content: space-between;\r\n width: var(--_button-group-width);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem);\r\n }\r\n :host([variant=\"standard\"][size=\"small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem);\r\n }\r\n :host([variant=\"standard\"][size=\"medium\"]).base {\r\n column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n column-gap: var(--m3e-connected-button-group-spacing, 0.125rem);\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--first), :--first)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-end-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--last), :--last)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-start-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--first), :--first)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--last), :--last)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--first), :--first)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--last), :--last)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n `;\r\n\r\n /** @private */ readonly #pressedController = new PressedController(this, {\r\n target: null,\r\n capture: true,\r\n minPressedDuration: 150,\r\n isPressedKey: (key) => key === \" \",\r\n callback: (pressed) => {\r\n if (!this._base) return;\r\n if (!pressed || this.variant === \"connected\") {\r\n this._base.style.removeProperty(\"--_button-group-width\");\r\n this._base.classList.remove(\"pressed\");\r\n } else {\r\n this._base.classList.add(\"pressed\");\r\n this._base.style.setProperty(\"--_button-group-width\", `${this._base.getBoundingClientRect().width}px`);\r\n }\r\n },\r\n });\r\n\r\n @query(\".base\") private readonly _base?: HTMLElement;\r\n\r\n /**\r\n * The appearance variant of the group.\r\n * @default \"standard\"\r\n */\r\n @property({ reflect: true }) variant: ButtonGroupVariant = \"standard\";\r\n\r\n /**\r\n * The size of the group.\r\n * @default \"small\"\r\n */\r\n @property({ reflect: true }) size: ButtonGroupSize = \"small\";\r\n\r\n /**\r\n * Whether multiple toggle buttons can be selected.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) multi = false;\r\n\r\n /** The buttons contained by the group. */\r\n @queryAssignedElements({ slot: \"\", selector: \"m3e-button,m3e-icon-button\", flatten: true })\r\n readonly buttons!: ReadonlyArray<M3eButtonElement | M3eIconButtonElement>;\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n\r\n if (this.hasAttribute(\"disable-role\")) {\r\n this.role = null;\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n this._base?.classList.remove(\"pressed\");\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"multi\") || changedProperties.has(\"variant\")) {\r\n this.#updateButtons();\r\n }\r\n if (changedProperties.has(\"variant\")) {\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"base\">\r\n <slot @slotchange=\"${this.#updateButtons}\" @change=\"${this.#handleChange}\"></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n #updateButtons(): void {\r\n const buttons = this.buttons;\r\n for (const target of this.#pressedController.targets) {\r\n this.#pressedController.unobserve(target);\r\n }\r\n const canToggle = [...buttons].some((x) => x.toggle);\r\n\r\n // disable-role is an internal attribute to by split-button to disable setting roles.\r\n if (!this.hasAttribute(\"disable-role\")) {\r\n this.role = canToggle && !this.multi ? \"radiogroup\" : \"group\";\r\n }\r\n\r\n const buttonRole = this.role === \"radiogroup\" ? \"radio\" : \"button\";\r\n\r\n buttons.forEach((button, i) => {\r\n this.#pressedController.observe(button);\r\n setCustomState(button, \"--connected\", this.variant === \"connected\");\r\n addCustomState(button, \"--grouped\");\r\n setCustomState(button, \"--first\", i == 0);\r\n setCustomState(button, \"--last\", i == buttons.length - 1);\r\n\r\n if (!this.hasAttribute(\"disable-role\") && button.role !== buttonRole && button.toggle) {\r\n const checked = !button.toggle ? null : button.selected ? \"true\" : \"false\";\r\n button.role = buttonRole;\r\n if (button.role === \"button\") {\r\n button.ariaPressed = checked;\r\n button.ariaChecked = null;\r\n } else {\r\n button.ariaChecked = checked;\r\n button.ariaPressed = null;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @private */\r\n #handleChange(e: Event): void {\r\n if (this.multi || !(e.target instanceof HTMLElement)) return;\r\n if (e.target.tagName === \"M3E-BUTTON\" || e.target.tagName === \"M3E-ICON-BUTTON\") {\r\n if (!isSelectedMixin(e.target) || !e.target.selected) {\r\n return;\r\n }\r\n\r\n for (const button of this.buttons) {\r\n if (button === e.target || !button.selected) continue;\r\n button.selected = false;\r\n }\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-button-group\": M3eButtonGroupElement;\r\n }\r\n}\r\n"],"names":["M3eButtonGroupElement","Role","LitElement","constructor","_M3eButtonGroupElement_pressedController","set","PressedController","target","capture","minPressedDuration","isPressedKey","key","callback","pressed","_base","variant","style","removeProperty","classList","remove","add","setProperty","getBoundingClientRect","width","size","multi","connectedCallback","hasAttribute","role","disconnectedCallback","update","changedProperties","has","__classPrivateFieldGet","_M3eButtonGroupElement_instances","_M3eButtonGroupElement_updateButtons","call","render","html","_M3eButtonGroupElement_handleChange","buttons","targets","unobserve","canToggle","some","x","toggle","buttonRole","forEach","button","i","observe","setCustomState","addCustomState","length","checked","selected","ariaPressed","ariaChecked","e","HTMLElement","tagName","isSelectedMixin","styles","css","DesignToken","shape","corner","small","extraSmall","large","medium","largeIncreased","__decorate","query","prototype","property","reflect","type","Boolean","queryAssignedElements","slot","selector","flatten","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"button-group.js","sources":["../../src/button-group/ButtonGroupElement.ts"],"sourcesContent":["import { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property, query, queryAssignedElements } from \"lit/decorators.js\";\r\n\r\nimport {\r\n PressedController,\r\n Role,\r\n isSelectedMixin,\r\n DesignToken,\r\n setCustomState,\r\n addCustomState,\r\n customElement,\r\n prefersReducedMotion,\r\n hasCustomState,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { M3eButtonElement } from \"@m3e/web/button\";\r\nimport { M3eIconButtonElement } from \"@m3e/web/icon-button\";\r\n\r\nimport { ButtonGroupVariant } from \"./ButtonGroupVariant\";\r\nimport { ButtonGroupSize } from \"./ButtonGroupSize\";\r\n\r\n/**\r\n * Organizes buttons and adds interactions between them.\r\n *\r\n * @description\r\n * The `m3e-button-group` component arranges multiple buttons into a unified, expressive layout,\r\n * supporting both `standard` and `connected` variants. It enables seamless, accessible grouping\r\n * of actions, adapts to various sizes, and ensures consistent spacing, shape, and alignment.\r\n * Designed according to Material 3 principles, it empowers users to interact with related actions\r\n * in a visually harmonious and intuitive way.\r\n *\r\n * @example\r\n * The following example illustrates a standard button group.\r\n * ``` html\r\n * <m3e-button-group>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_bold\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_italic\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_underlined\"></m3e-icon></m3e-icon-button>\r\n * </m3e-button-group>\r\n * ```\r\n * @example\r\n * The next example illustrates a connected button group.\r\n * ```html\r\n * <m3e-button-group variant=\"connected\">\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Start</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Directions</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Share</m3e-button>\r\n * </m3e-button-group>\r\n * ```\r\n *\r\n * @tag m3e-button-group\r\n *\r\n * @slot - Renders the buttons of the group.\r\n *\r\n * @attr multi - Whether multiple toggle buttons can be selected.\r\n * @attr size - The size of the group.\r\n * @attr variant - The appearance variant of the group.\r\n *\r\n * @cssprop --m3e-standard-button-group-extra-small-spacing - Spacing between buttons in standard variant, extra-small size.\r\n * @cssprop --m3e-standard-button-group-small-spacing - Spacing between buttons in standard variant, small size.\r\n * @cssprop --m3e-standard-button-group-medium-spacing - Spacing between buttons in standard variant, medium size.\r\n * @cssprop --m3e-standard-button-group-large-spacing - Spacing between buttons in standard variant, large size.\r\n * @cssprop --m3e-standard-button-group-extra-large-spacing - Spacing between buttons in standard variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-spacing - Spacing between buttons in connected variant.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-shape - Corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-pressed-shape - Pressed corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-shape - Corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-pressed-shape - Pressed corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-shape - Corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-pressed-shape - Pressed corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-large-inner-shape - Corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-large-inner-pressed-shape - Pressed corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-shape - Corner shape for connected variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-pressed-shape - Pressed corner shape for connected variant, extra-large size.\r\n */\r\n@customElement(\"m3e-button-group\")\r\nexport class M3eButtonGroupElement extends Role(LitElement, \"group\") {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n .base {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n :host([variant=\"standard\"]) {\r\n justify-content: center;\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n flex: 1 1 auto;\r\n }\r\n :host([variant=\"standard\"]) .base {\r\n width: fit-content;\r\n flex: none;\r\n }\r\n :host([variant=\"standard\"]) .base.pressed {\r\n justify-content: space-between;\r\n width: var(--_button-group-width);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem);\r\n }\r\n :host([variant=\"standard\"][size=\"small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem);\r\n }\r\n :host([variant=\"standard\"][size=\"medium\"]).base {\r\n column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n column-gap: var(--m3e-connected-button-group-spacing, 0.125rem);\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--first), :--first)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-end-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--last), :--last)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-start-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--first), :--first)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--last), :--last)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--first), :--first)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--last), :--last)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n `;\r\n\r\n /** @private */ readonly #pressedController = new PressedController(this, {\r\n target: null,\r\n capture: true,\r\n minPressedDuration: 150,\r\n isPressedKey: (key) => key === \" \",\r\n callback: (pressed) => this.#handlePressedChange(pressed),\r\n });\r\n\r\n @query(\".base\") private readonly _base?: HTMLElement;\r\n\r\n /**\r\n * The appearance variant of the group.\r\n * @default \"standard\"\r\n */\r\n @property({ reflect: true }) variant: ButtonGroupVariant = \"standard\";\r\n\r\n /**\r\n * The size of the group.\r\n * @default \"small\"\r\n */\r\n @property({ reflect: true }) size: ButtonGroupSize = \"small\";\r\n\r\n /**\r\n * Whether multiple toggle buttons can be selected.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) multi = false;\r\n\r\n /** The buttons contained by the group. */\r\n @queryAssignedElements({ slot: \"\", selector: \"m3e-button,m3e-icon-button\", flatten: true })\r\n readonly buttons!: ReadonlyArray<M3eButtonElement | M3eIconButtonElement>;\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n\r\n if (this.hasAttribute(\"disable-role\")) {\r\n this.role = null;\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n this._base?.classList.remove(\"pressed\");\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"multi\") || changedProperties.has(\"variant\")) {\r\n this.#updateButtons();\r\n }\r\n if (changedProperties.has(\"variant\")) {\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"base\">\r\n <slot @slotchange=\"${this.#updateButtons}\" @change=\"${this.#handleChange}\"></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n #updateButtons(): void {\r\n const buttons = this.buttons;\r\n for (const target of this.#pressedController.targets) {\r\n this.#pressedController.unobserve(target);\r\n }\r\n const canToggle = [...buttons].some((x) => x.toggle);\r\n\r\n // disable-role is an internal attribute to by split-button to disable setting roles.\r\n if (!this.hasAttribute(\"disable-role\")) {\r\n this.role = canToggle && !this.multi ? \"radiogroup\" : \"group\";\r\n }\r\n\r\n const buttonRole = this.role === \"radiogroup\" ? \"radio\" : \"button\";\r\n\r\n buttons.forEach((button, i) => {\r\n this.#pressedController.observe(button);\r\n setCustomState(button, \"--connected\", this.variant === \"connected\");\r\n addCustomState(button, \"--grouped\");\r\n setCustomState(button, \"--first\", i == 0);\r\n setCustomState(button, \"--last\", i == buttons.length - 1);\r\n\r\n if (!this.hasAttribute(\"disable-role\") && button.role !== buttonRole && button.toggle) {\r\n const checked = !button.toggle ? null : button.selected ? \"true\" : \"false\";\r\n button.role = buttonRole;\r\n if (button.role === \"button\") {\r\n button.ariaPressed = checked;\r\n button.ariaChecked = null;\r\n } else {\r\n button.ariaChecked = checked;\r\n button.ariaPressed = null;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @private */\r\n #handleChange(e: Event): void {\r\n if (this.multi || !(e.target instanceof HTMLElement)) return;\r\n if (e.target.tagName === \"M3E-BUTTON\" || e.target.tagName === \"M3E-ICON-BUTTON\") {\r\n if (!isSelectedMixin(e.target) || !e.target.selected) {\r\n return;\r\n }\r\n\r\n for (const button of this.buttons) {\r\n if (button === e.target || !button.selected) continue;\r\n button.selected = false;\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handlePressedChange(pressed: boolean): void {\r\n const base = this._base;\r\n if (!base) return;\r\n if (!pressed || this.variant === \"connected\") {\r\n const button = this.buttons.find((x) => x === document.activeElement);\r\n if (!prefersReducedMotion() && button) {\r\n button.addEventListener(\r\n \"transitionend\",\r\n () =>\r\n queueMicrotask(() => {\r\n // Pressed state is tested to ensure this runs only when the button\r\n // is no longer pressed. This handles changes to pressed state in\r\n // quick succession.\r\n\r\n if (!hasCustomState(button, \"--pressed\")) {\r\n this.#cleanupPressed(base);\r\n }\r\n }),\r\n { once: true },\r\n );\r\n } else {\r\n this.#cleanupPressed(base);\r\n }\r\n } else {\r\n base.classList.add(\"pressed\");\r\n base.style.setProperty(\"--_button-group-width\", `${base.getBoundingClientRect().width}px`);\r\n }\r\n }\r\n\r\n /** @private */\r\n #cleanupPressed(base: HTMLElement): void {\r\n base.style.removeProperty(\"--_button-group-width\");\r\n base.classList.remove(\"pressed\");\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-button-group\": M3eButtonGroupElement;\r\n }\r\n}\r\n"],"names":["M3eButtonGroupElement","Role","LitElement","constructor","_M3eButtonGroupElement_pressedController","set","PressedController","target","capture","minPressedDuration","isPressedKey","key","callback","pressed","__classPrivateFieldGet","_M3eButtonGroupElement_instances","_M3eButtonGroupElement_handlePressedChange","call","variant","size","multi","connectedCallback","hasAttribute","role","disconnectedCallback","_base","style","removeProperty","classList","remove","update","changedProperties","has","_M3eButtonGroupElement_updateButtons","render","html","_M3eButtonGroupElement_handleChange","buttons","targets","unobserve","canToggle","some","x","toggle","buttonRole","forEach","button","i","observe","setCustomState","addCustomState","length","checked","selected","ariaPressed","ariaChecked","e","HTMLElement","tagName","isSelectedMixin","base","find","document","activeElement","prefersReducedMotion","addEventListener","queueMicrotask","hasCustomState","_M3eButtonGroupElement_cleanupPressed","once","add","setProperty","getBoundingClientRect","width","styles","css","DesignToken","shape","corner","small","extraSmall","large","medium","largeIncreased","__decorate","query","prototype","property","reflect","type","Boolean","queryAssignedElements","slot","selector","flatten","customElement"],"mappings":"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"}
@@ -3,5 +3,5 @@
3
3
  * Copyright (c) 2025–2026 matraic
4
4
  * See LICENSE file in the project root for full license text.
5
5
  */
6
- import{__classPrivateFieldGet as e,__decorate as t}from"tslib";import{LitElement as s,html as a,css as r}from"lit";import{query as n,property as o,queryAssignedElements as i}from"lit/decorators.js";import{Role as l,PressedController as d,setCustomState as c,addCustomState as p,isSelectedMixin as u,DesignToken as h,customElement as m}from"@m3e/web/core";var g,b,v,f;let x=class extends(l(s,"group")){constructor(){super(...arguments),g.add(this),b.set(this,new d(this,{target:null,capture:!0,minPressedDuration:150,isPressedKey:e=>" "===e,callback:e=>{this._base&&(e&&"connected"!==this.variant?(this._base.classList.add("pressed"),this._base.style.setProperty("--_button-group-width",`${this._base.getBoundingClientRect().width}px`)):(this._base.style.removeProperty("--_button-group-width"),this._base.classList.remove("pressed")))}})),this.variant="standard",this.size="small",this.multi=!1}connectedCallback(){super.connectedCallback(),this.hasAttribute("disable-role")&&(this.role=null)}disconnectedCallback(){super.disconnectedCallback(),this._base?.style.removeProperty("--_button-group-width"),this._base?.classList.remove("pressed")}update(t){super.update(t),(t.has("multi")||t.has("variant"))&&e(this,g,"m",v).call(this),t.has("variant")&&this._base?.style.removeProperty("--_button-group-width")}render(){return a`<div class="base"><slot @slotchange="${e(this,g,"m",v)}" @change="${e(this,g,"m",f)}"></slot></div>`}};b=new WeakMap,g=new WeakSet,v=function(){const t=this.buttons;for(const t of e(this,b,"f").targets)e(this,b,"f").unobserve(t);const s=[...t].some(e=>e.toggle);this.hasAttribute("disable-role")||(this.role=s&&!this.multi?"radiogroup":"group");const a="radiogroup"===this.role?"radio":"button";t.forEach((s,r)=>{if(e(this,b,"f").observe(s),c(s,"--connected","connected"===this.variant),p(s,"--grouped"),c(s,"--first",0==r),c(s,"--last",r==t.length-1),!this.hasAttribute("disable-role")&&s.role!==a&&s.toggle){const e=s.toggle?s.selected?"true":"false":null;s.role=a,"button"===s.role?(s.ariaPressed=e,s.ariaChecked=null):(s.ariaChecked=e,s.ariaPressed=null)}})},f=function(e){if(!this.multi&&e.target instanceof HTMLElement&&("M3E-BUTTON"===e.target.tagName||"M3E-ICON-BUTTON"===e.target.tagName)){if(!u(e.target)||!e.target.selected)return;for(const t of this.buttons)t!==e.target&&t.selected&&(t.selected=!1)}},x.styles=r`:host { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } .base { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } :host([variant="standard"]) { justify-content: center; } :host([variant="connected"]) .base { flex: 1 1 auto; } :host([variant="standard"]) .base { width: fit-content; flex: none; } :host([variant="standard"]) .base.pressed { justify-content: space-between; width: var(--_button-group-width); } :host([variant="standard"][size="extra-small"]) .base { column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem); } :host([variant="standard"][size="small"]) .base { column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem); } :host([variant="standard"][size="medium"]).base { column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem); } :host([variant="standard"][size="large"]) .base { column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem); } :host([variant="standard"][size="extra-large"]) .base { column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem); } :host([variant="connected"]) .base { column-gap: var(--m3e-connected-button-group-spacing, 0.125rem); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--first), :--first)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${h.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${h.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--last), :--last)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${h.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${h.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--first), :--first)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${h.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${h.shape.corner.small} ); --_button-end-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--last), :--last)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${h.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${h.shape.corner.small} ); --_button-start-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--first), :--first)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${h.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${h.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--last), :--last)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${h.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${h.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${h.shape.corner.extraSmall} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--first), :--first)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${h.shape.corner.large} ); --_button-square-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${h.shape.corner.large} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${h.shape.corner.medium} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--last), :--last)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${h.shape.corner.large} ); --_button-square-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${h.shape.corner.large} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${h.shape.corner.medium} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--first), :--first)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${h.shape.corner.largeIncreased} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${h.shape.corner.largeIncreased} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${h.shape.corner.large} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--last), :--last)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${h.shape.corner.largeIncreased} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${h.shape.corner.largeIncreased} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${h.shape.corner.large} ); }`,t([n(".base")],x.prototype,"_base",void 0),t([o({reflect:!0})],x.prototype,"variant",void 0),t([o({reflect:!0})],x.prototype,"size",void 0),t([o({type:Boolean})],x.prototype,"multi",void 0),t([i({slot:"",selector:"m3e-button,m3e-icon-button",flatten:!0})],x.prototype,"buttons",void 0),x=t([m("m3e-button-group")],x);export{x as M3eButtonGroupElement};
6
+ import{__classPrivateFieldGet as e,__decorate as t}from"tslib";import{LitElement as s,html as a,css as r}from"lit";import{query as n,property as o,queryAssignedElements as i}from"lit/decorators.js";import{Role as l,PressedController as d,setCustomState as c,addCustomState as u,isSelectedMixin as p,prefersReducedMotion as h,hasCustomState as m,DesignToken as g,customElement as b}from"@m3e/web/core";var v,f,x,z,_,$;let y=class extends(l(s,"group")){constructor(){super(...arguments),v.add(this),f.set(this,new d(this,{target:null,capture:!0,minPressedDuration:150,isPressedKey:e=>" "===e,callback:t=>e(this,v,"m",_).call(this,t)})),this.variant="standard",this.size="small",this.multi=!1}connectedCallback(){super.connectedCallback(),this.hasAttribute("disable-role")&&(this.role=null)}disconnectedCallback(){super.disconnectedCallback(),this._base?.style.removeProperty("--_button-group-width"),this._base?.classList.remove("pressed")}update(t){super.update(t),(t.has("multi")||t.has("variant"))&&e(this,v,"m",x).call(this),t.has("variant")&&this._base?.style.removeProperty("--_button-group-width")}render(){return a`<div class="base"><slot @slotchange="${e(this,v,"m",x)}" @change="${e(this,v,"m",z)}"></slot></div>`}};f=new WeakMap,v=new WeakSet,x=function(){const t=this.buttons;for(const t of e(this,f,"f").targets)e(this,f,"f").unobserve(t);const s=[...t].some(e=>e.toggle);this.hasAttribute("disable-role")||(this.role=s&&!this.multi?"radiogroup":"group");const a="radiogroup"===this.role?"radio":"button";t.forEach((s,r)=>{if(e(this,f,"f").observe(s),c(s,"--connected","connected"===this.variant),u(s,"--grouped"),c(s,"--first",0==r),c(s,"--last",r==t.length-1),!this.hasAttribute("disable-role")&&s.role!==a&&s.toggle){const e=s.toggle?s.selected?"true":"false":null;s.role=a,"button"===s.role?(s.ariaPressed=e,s.ariaChecked=null):(s.ariaChecked=e,s.ariaPressed=null)}})},z=function(e){if(!this.multi&&e.target instanceof HTMLElement&&("M3E-BUTTON"===e.target.tagName||"M3E-ICON-BUTTON"===e.target.tagName)){if(!p(e.target)||!e.target.selected)return;for(const t of this.buttons)t!==e.target&&t.selected&&(t.selected=!1)}},_=function(t){const s=this._base;if(s)if(t&&"connected"!==this.variant)s.classList.add("pressed"),s.style.setProperty("--_button-group-width",`${s.getBoundingClientRect().width}px`);else{const t=this.buttons.find(e=>e===document.activeElement);!h()&&t?t.addEventListener("transitionend",()=>queueMicrotask(()=>{m(t,"--pressed")||e(this,v,"m",$).call(this,s)}),{once:!0}):e(this,v,"m",$).call(this,s)}},$=function(e){e.style.removeProperty("--_button-group-width"),e.classList.remove("pressed")},y.styles=r`:host { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } .base { display: flex; vertical-align: middle; flex-wrap: nowrap; align-items: center; } :host([variant="standard"]) { justify-content: center; } :host([variant="connected"]) .base { flex: 1 1 auto; } :host([variant="standard"]) .base { width: fit-content; flex: none; } :host([variant="standard"]) .base.pressed { justify-content: space-between; width: var(--_button-group-width); } :host([variant="standard"][size="extra-small"]) .base { column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem); } :host([variant="standard"][size="small"]) .base { column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem); } :host([variant="standard"][size="medium"]).base { column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem); } :host([variant="standard"][size="large"]) .base { column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem); } :host([variant="standard"][size="extra-large"]) .base { column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem); } :host([variant="connected"]) .base { column-gap: var(--m3e-connected-button-group-spacing, 0.125rem); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--first), :--first)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${g.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${g.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="extra-small"]) ::slotted(:is(:state(--last), :--last)[size="extra-small"]), :host([variant="connected"][size="extra-small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${g.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${g.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--first), :--first)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${g.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${g.shape.corner.small} ); --_button-end-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="small"]) ::slotted(:is(:state(--last), :--last)[size="small"]), :host([variant="connected"][size="small"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="small"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${g.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${g.shape.corner.small} ); --_button-start-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--first), :--first)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${g.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${g.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="medium"]) ::slotted(:is(:state(--last), :--last)[size="medium"]), :host([variant="connected"][size="medium"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="medium"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${g.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${g.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${g.shape.corner.extraSmall} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--first), :--first)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${g.shape.corner.large} ); --_button-square-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${g.shape.corner.large} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${g.shape.corner.medium} ); } :host([variant="connected"][size="large"]) ::slotted(:is(:state(--last), :--last)[size="large"]), :host([variant="connected"][size="large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${g.shape.corner.large} ); --_button-square-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${g.shape.corner.large} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${g.shape.corner.medium} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--first), :--first)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${g.shape.corner.largeIncreased} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${g.shape.corner.largeIncreased} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${g.shape.corner.large} ); } :host([variant="connected"][size="extra-large"]) ::slotted(:is(:state(--last), :--last)[size="extra-large"]), :host([variant="connected"][size="extra-large"]) ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size="extra-large"]) { --_button-rounded-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${g.shape.corner.largeIncreased} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${g.shape.corner.largeIncreased} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${g.shape.corner.large} ); }`,t([n(".base")],y.prototype,"_base",void 0),t([o({reflect:!0})],y.prototype,"variant",void 0),t([o({reflect:!0})],y.prototype,"size",void 0),t([o({type:Boolean})],y.prototype,"multi",void 0),t([i({slot:"",selector:"m3e-button,m3e-icon-button",flatten:!0})],y.prototype,"buttons",void 0),y=t([b("m3e-button-group")],y);export{y as M3eButtonGroupElement};
7
7
  //# sourceMappingURL=button-group.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.min.js","sources":["../../src/button-group/ButtonGroupElement.ts"],"sourcesContent":["import { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property, query, queryAssignedElements } from \"lit/decorators.js\";\r\n\r\nimport {\r\n PressedController,\r\n Role,\r\n isSelectedMixin,\r\n DesignToken,\r\n setCustomState,\r\n addCustomState,\r\n customElement,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { M3eButtonElement } from \"@m3e/web/button\";\r\nimport { M3eIconButtonElement } from \"@m3e/web/icon-button\";\r\n\r\nimport { ButtonGroupVariant } from \"./ButtonGroupVariant\";\r\nimport { ButtonGroupSize } from \"./ButtonGroupSize\";\r\n\r\n/**\r\n * Organizes buttons and adds interactions between them.\r\n *\r\n * @description\r\n * The `m3e-button-group` component arranges multiple buttons into a unified, expressive layout,\r\n * supporting both `standard` and `connected` variants. It enables seamless, accessible grouping\r\n * of actions, adapts to various sizes, and ensures consistent spacing, shape, and alignment.\r\n * Designed according to Material 3 principles, it empowers users to interact with related actions\r\n * in a visually harmonious and intuitive way.\r\n *\r\n * @example\r\n * The following example illustrates a standard button group.\r\n * ``` html\r\n * <m3e-button-group>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_bold\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_italic\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_underlined\"></m3e-icon></m3e-icon-button>\r\n * </m3e-button-group>\r\n * ```\r\n * @example\r\n * The next example illustrates a connected button group.\r\n * ```html\r\n * <m3e-button-group variant=\"connected\">\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Start</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Directions</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Share</m3e-button>\r\n * </m3e-button-group>\r\n * ```\r\n *\r\n * @tag m3e-button-group\r\n *\r\n * @slot - Renders the buttons of the group.\r\n *\r\n * @attr multi - Whether multiple toggle buttons can be selected.\r\n * @attr size - The size of the group.\r\n * @attr variant - The appearance variant of the group.\r\n *\r\n * @cssprop --m3e-standard-button-group-extra-small-spacing - Spacing between buttons in standard variant, extra-small size.\r\n * @cssprop --m3e-standard-button-group-small-spacing - Spacing between buttons in standard variant, small size.\r\n * @cssprop --m3e-standard-button-group-medium-spacing - Spacing between buttons in standard variant, medium size.\r\n * @cssprop --m3e-standard-button-group-large-spacing - Spacing between buttons in standard variant, large size.\r\n * @cssprop --m3e-standard-button-group-extra-large-spacing - Spacing between buttons in standard variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-spacing - Spacing between buttons in connected variant.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-shape - Corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-pressed-shape - Pressed corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-shape - Corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-pressed-shape - Pressed corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-shape - Corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-pressed-shape - Pressed corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-large-inner-shape - Corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-large-inner-pressed-shape - Pressed corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-shape - Corner shape for connected variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-pressed-shape - Pressed corner shape for connected variant, extra-large size.\r\n */\r\n@customElement(\"m3e-button-group\")\r\nexport class M3eButtonGroupElement extends Role(LitElement, \"group\") {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n .base {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n :host([variant=\"standard\"]) {\r\n justify-content: center;\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n flex: 1 1 auto;\r\n }\r\n :host([variant=\"standard\"]) .base {\r\n width: fit-content;\r\n flex: none;\r\n }\r\n :host([variant=\"standard\"]) .base.pressed {\r\n justify-content: space-between;\r\n width: var(--_button-group-width);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem);\r\n }\r\n :host([variant=\"standard\"][size=\"small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem);\r\n }\r\n :host([variant=\"standard\"][size=\"medium\"]).base {\r\n column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n column-gap: var(--m3e-connected-button-group-spacing, 0.125rem);\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--first), :--first)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-end-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--last), :--last)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-start-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--first), :--first)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--last), :--last)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--first), :--first)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--last), :--last)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n `;\r\n\r\n /** @private */ readonly #pressedController = new PressedController(this, {\r\n target: null,\r\n capture: true,\r\n minPressedDuration: 150,\r\n isPressedKey: (key) => key === \" \",\r\n callback: (pressed) => {\r\n if (!this._base) return;\r\n if (!pressed || this.variant === \"connected\") {\r\n this._base.style.removeProperty(\"--_button-group-width\");\r\n this._base.classList.remove(\"pressed\");\r\n } else {\r\n this._base.classList.add(\"pressed\");\r\n this._base.style.setProperty(\"--_button-group-width\", `${this._base.getBoundingClientRect().width}px`);\r\n }\r\n },\r\n });\r\n\r\n @query(\".base\") private readonly _base?: HTMLElement;\r\n\r\n /**\r\n * The appearance variant of the group.\r\n * @default \"standard\"\r\n */\r\n @property({ reflect: true }) variant: ButtonGroupVariant = \"standard\";\r\n\r\n /**\r\n * The size of the group.\r\n * @default \"small\"\r\n */\r\n @property({ reflect: true }) size: ButtonGroupSize = \"small\";\r\n\r\n /**\r\n * Whether multiple toggle buttons can be selected.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) multi = false;\r\n\r\n /** The buttons contained by the group. */\r\n @queryAssignedElements({ slot: \"\", selector: \"m3e-button,m3e-icon-button\", flatten: true })\r\n readonly buttons!: ReadonlyArray<M3eButtonElement | M3eIconButtonElement>;\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n\r\n if (this.hasAttribute(\"disable-role\")) {\r\n this.role = null;\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n this._base?.classList.remove(\"pressed\");\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"multi\") || changedProperties.has(\"variant\")) {\r\n this.#updateButtons();\r\n }\r\n if (changedProperties.has(\"variant\")) {\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"base\">\r\n <slot @slotchange=\"${this.#updateButtons}\" @change=\"${this.#handleChange}\"></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n #updateButtons(): void {\r\n const buttons = this.buttons;\r\n for (const target of this.#pressedController.targets) {\r\n this.#pressedController.unobserve(target);\r\n }\r\n const canToggle = [...buttons].some((x) => x.toggle);\r\n\r\n // disable-role is an internal attribute to by split-button to disable setting roles.\r\n if (!this.hasAttribute(\"disable-role\")) {\r\n this.role = canToggle && !this.multi ? \"radiogroup\" : \"group\";\r\n }\r\n\r\n const buttonRole = this.role === \"radiogroup\" ? \"radio\" : \"button\";\r\n\r\n buttons.forEach((button, i) => {\r\n this.#pressedController.observe(button);\r\n setCustomState(button, \"--connected\", this.variant === \"connected\");\r\n addCustomState(button, \"--grouped\");\r\n setCustomState(button, \"--first\", i == 0);\r\n setCustomState(button, \"--last\", i == buttons.length - 1);\r\n\r\n if (!this.hasAttribute(\"disable-role\") && button.role !== buttonRole && button.toggle) {\r\n const checked = !button.toggle ? null : button.selected ? \"true\" : \"false\";\r\n button.role = buttonRole;\r\n if (button.role === \"button\") {\r\n button.ariaPressed = checked;\r\n button.ariaChecked = null;\r\n } else {\r\n button.ariaChecked = checked;\r\n button.ariaPressed = null;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @private */\r\n #handleChange(e: Event): void {\r\n if (this.multi || !(e.target instanceof HTMLElement)) return;\r\n if (e.target.tagName === \"M3E-BUTTON\" || e.target.tagName === \"M3E-ICON-BUTTON\") {\r\n if (!isSelectedMixin(e.target) || !e.target.selected) {\r\n return;\r\n }\r\n\r\n for (const button of this.buttons) {\r\n if (button === e.target || !button.selected) continue;\r\n button.selected = false;\r\n }\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-button-group\": M3eButtonGroupElement;\r\n }\r\n}\r\n"],"names":["M3eButtonGroupElement","Role","LitElement","constructor","_M3eButtonGroupElement_pressedController","set","this","PressedController","target","capture","minPressedDuration","isPressedKey","key","callback","pressed","_base","variant","classList","add","style","setProperty","getBoundingClientRect","width","removeProperty","remove","size","multi","connectedCallback","super","hasAttribute","role","disconnectedCallback","update","changedProperties","has","__classPrivateFieldGet","_M3eButtonGroupElement_instances","_M3eButtonGroupElement_updateButtons","call","render","html","_M3eButtonGroupElement_handleChange","buttons","targets","unobserve","canToggle","some","x","toggle","buttonRole","forEach","button","i","observe","setCustomState","addCustomState","length","checked","selected","ariaPressed","ariaChecked","e","HTMLElement","tagName","isSelectedMixin","styles","css","DesignToken","shape","corner","small","extraSmall","large","medium","largeIncreased","__decorate","query","prototype","property","reflect","type","Boolean","queryAssignedElements","slot","selector","flatten","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"button-group.min.js","sources":["../../src/button-group/ButtonGroupElement.ts"],"sourcesContent":["import { css, CSSResultGroup, html, LitElement, PropertyValues } from \"lit\";\r\nimport { property, query, queryAssignedElements } from \"lit/decorators.js\";\r\n\r\nimport {\r\n PressedController,\r\n Role,\r\n isSelectedMixin,\r\n DesignToken,\r\n setCustomState,\r\n addCustomState,\r\n customElement,\r\n prefersReducedMotion,\r\n hasCustomState,\r\n} from \"@m3e/web/core\";\r\n\r\nimport { M3eButtonElement } from \"@m3e/web/button\";\r\nimport { M3eIconButtonElement } from \"@m3e/web/icon-button\";\r\n\r\nimport { ButtonGroupVariant } from \"./ButtonGroupVariant\";\r\nimport { ButtonGroupSize } from \"./ButtonGroupSize\";\r\n\r\n/**\r\n * Organizes buttons and adds interactions between them.\r\n *\r\n * @description\r\n * The `m3e-button-group` component arranges multiple buttons into a unified, expressive layout,\r\n * supporting both `standard` and `connected` variants. It enables seamless, accessible grouping\r\n * of actions, adapts to various sizes, and ensures consistent spacing, shape, and alignment.\r\n * Designed according to Material 3 principles, it empowers users to interact with related actions\r\n * in a visually harmonious and intuitive way.\r\n *\r\n * @example\r\n * The following example illustrates a standard button group.\r\n * ``` html\r\n * <m3e-button-group>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_bold\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_italic\"></m3e-icon></m3e-icon-button>\r\n * <m3e-icon-button variant=\"tonal\" toggle><m3e-icon name=\"format_underlined\"></m3e-icon></m3e-icon-button>\r\n * </m3e-button-group>\r\n * ```\r\n * @example\r\n * The next example illustrates a connected button group.\r\n * ```html\r\n * <m3e-button-group variant=\"connected\">\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Start</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Directions</m3e-button>\r\n * <m3e-button variant=\"tonal\" shape=\"square\" toggle>Share</m3e-button>\r\n * </m3e-button-group>\r\n * ```\r\n *\r\n * @tag m3e-button-group\r\n *\r\n * @slot - Renders the buttons of the group.\r\n *\r\n * @attr multi - Whether multiple toggle buttons can be selected.\r\n * @attr size - The size of the group.\r\n * @attr variant - The appearance variant of the group.\r\n *\r\n * @cssprop --m3e-standard-button-group-extra-small-spacing - Spacing between buttons in standard variant, extra-small size.\r\n * @cssprop --m3e-standard-button-group-small-spacing - Spacing between buttons in standard variant, small size.\r\n * @cssprop --m3e-standard-button-group-medium-spacing - Spacing between buttons in standard variant, medium size.\r\n * @cssprop --m3e-standard-button-group-large-spacing - Spacing between buttons in standard variant, large size.\r\n * @cssprop --m3e-standard-button-group-extra-large-spacing - Spacing between buttons in standard variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-spacing - Spacing between buttons in connected variant.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-shape - Corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-extra-small-inner-pressed-shape - Pressed corner shape for connected variant, extra-small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-shape - Corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-small-inner-pressed-shape - Pressed corner shape for connected variant, small size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-shape - Corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-medium-inner-pressed-shape - Pressed corner shape for connected variant, medium size.\r\n * @cssprop --m3e-connected-button-group-large-inner-shape - Corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-large-inner-pressed-shape - Pressed corner shape for connected variant, large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-shape - Corner shape for connected variant, extra-large size.\r\n * @cssprop --m3e-connected-button-group-extra-large-inner-pressed-shape - Pressed corner shape for connected variant, extra-large size.\r\n */\r\n@customElement(\"m3e-button-group\")\r\nexport class M3eButtonGroupElement extends Role(LitElement, \"group\") {\r\n /** The styles of the element. */\r\n static override styles: CSSResultGroup = css`\r\n :host {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n .base {\r\n display: flex;\r\n vertical-align: middle;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n :host([variant=\"standard\"]) {\r\n justify-content: center;\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n flex: 1 1 auto;\r\n }\r\n :host([variant=\"standard\"]) .base {\r\n width: fit-content;\r\n flex: none;\r\n }\r\n :host([variant=\"standard\"]) .base.pressed {\r\n justify-content: space-between;\r\n width: var(--_button-group-width);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-small-spacing, 1.125rem);\r\n }\r\n :host([variant=\"standard\"][size=\"small\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-small-spacing, 0.75rem);\r\n }\r\n :host([variant=\"standard\"][size=\"medium\"]).base {\r\n column-gap: var(--m3e-standard-button-group-medium-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"standard\"][size=\"extra-large\"]) .base {\r\n column-gap: var(--m3e-standard-button-group-extra-large-spacing, 0.5rem);\r\n }\r\n :host([variant=\"connected\"]) .base {\r\n column-gap: var(--m3e-connected-button-group-spacing, 0.125rem);\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-small\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-small\"]),\r\n :host([variant=\"connected\"][size=\"extra-small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--first), :--first)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-end-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"small\"]) ::slotted(:is(:state(--last), :--last)[size=\"small\"]),\r\n :host([variant=\"connected\"][size=\"small\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"small\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-small-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-start-shape-pressed-morph: var(\r\n --m3e-connected-button-group-small-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--first), :--first)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"medium\"]) ::slotted(:is(:state(--last), :--last)[size=\"medium\"]),\r\n :host([variant=\"connected\"][size=\"medium\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"medium\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-medium-inner-shape,\r\n ${DesignToken.shape.corner.small}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-medium-inner-pressed-shape,\r\n ${DesignToken.shape.corner.extraSmall}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--first), :--first)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"large\"]) ::slotted(:is(:state(--last), :--last)[size=\"large\"]),\r\n :host([variant=\"connected\"][size=\"large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-large-inner-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.medium}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--first), :--first)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-end-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n :host([variant=\"connected\"][size=\"extra-large\"]) ::slotted(:is(:state(--last), :--last)[size=\"extra-large\"]),\r\n :host([variant=\"connected\"][size=\"extra-large\"])\r\n ::slotted(:not(:is(:state(--first), :--first)):not(:is(:state(--last), :--last))[size=\"extra-large\"]) {\r\n --_button-rounded-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-shape,\r\n ${DesignToken.shape.corner.largeIncreased}\r\n );\r\n --_button-square-start-pressed-shape: var(\r\n --m3e-connected-button-group-extra-large-inner-pressed-shape,\r\n ${DesignToken.shape.corner.large}\r\n );\r\n }\r\n `;\r\n\r\n /** @private */ readonly #pressedController = new PressedController(this, {\r\n target: null,\r\n capture: true,\r\n minPressedDuration: 150,\r\n isPressedKey: (key) => key === \" \",\r\n callback: (pressed) => this.#handlePressedChange(pressed),\r\n });\r\n\r\n @query(\".base\") private readonly _base?: HTMLElement;\r\n\r\n /**\r\n * The appearance variant of the group.\r\n * @default \"standard\"\r\n */\r\n @property({ reflect: true }) variant: ButtonGroupVariant = \"standard\";\r\n\r\n /**\r\n * The size of the group.\r\n * @default \"small\"\r\n */\r\n @property({ reflect: true }) size: ButtonGroupSize = \"small\";\r\n\r\n /**\r\n * Whether multiple toggle buttons can be selected.\r\n * @default false\r\n */\r\n @property({ type: Boolean }) multi = false;\r\n\r\n /** The buttons contained by the group. */\r\n @queryAssignedElements({ slot: \"\", selector: \"m3e-button,m3e-icon-button\", flatten: true })\r\n readonly buttons!: ReadonlyArray<M3eButtonElement | M3eIconButtonElement>;\r\n\r\n /** @inheritdoc */\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n\r\n if (this.hasAttribute(\"disable-role\")) {\r\n this.role = null;\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n this._base?.classList.remove(\"pressed\");\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override update(changedProperties: PropertyValues<this>): void {\r\n super.update(changedProperties);\r\n\r\n if (changedProperties.has(\"multi\") || changedProperties.has(\"variant\")) {\r\n this.#updateButtons();\r\n }\r\n if (changedProperties.has(\"variant\")) {\r\n this._base?.style.removeProperty(\"--_button-group-width\");\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected override render(): unknown {\r\n return html`<div class=\"base\">\r\n <slot @slotchange=\"${this.#updateButtons}\" @change=\"${this.#handleChange}\"></slot>\r\n </div>`;\r\n }\r\n\r\n /** @private */\r\n #updateButtons(): void {\r\n const buttons = this.buttons;\r\n for (const target of this.#pressedController.targets) {\r\n this.#pressedController.unobserve(target);\r\n }\r\n const canToggle = [...buttons].some((x) => x.toggle);\r\n\r\n // disable-role is an internal attribute to by split-button to disable setting roles.\r\n if (!this.hasAttribute(\"disable-role\")) {\r\n this.role = canToggle && !this.multi ? \"radiogroup\" : \"group\";\r\n }\r\n\r\n const buttonRole = this.role === \"radiogroup\" ? \"radio\" : \"button\";\r\n\r\n buttons.forEach((button, i) => {\r\n this.#pressedController.observe(button);\r\n setCustomState(button, \"--connected\", this.variant === \"connected\");\r\n addCustomState(button, \"--grouped\");\r\n setCustomState(button, \"--first\", i == 0);\r\n setCustomState(button, \"--last\", i == buttons.length - 1);\r\n\r\n if (!this.hasAttribute(\"disable-role\") && button.role !== buttonRole && button.toggle) {\r\n const checked = !button.toggle ? null : button.selected ? \"true\" : \"false\";\r\n button.role = buttonRole;\r\n if (button.role === \"button\") {\r\n button.ariaPressed = checked;\r\n button.ariaChecked = null;\r\n } else {\r\n button.ariaChecked = checked;\r\n button.ariaPressed = null;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @private */\r\n #handleChange(e: Event): void {\r\n if (this.multi || !(e.target instanceof HTMLElement)) return;\r\n if (e.target.tagName === \"M3E-BUTTON\" || e.target.tagName === \"M3E-ICON-BUTTON\") {\r\n if (!isSelectedMixin(e.target) || !e.target.selected) {\r\n return;\r\n }\r\n\r\n for (const button of this.buttons) {\r\n if (button === e.target || !button.selected) continue;\r\n button.selected = false;\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n #handlePressedChange(pressed: boolean): void {\r\n const base = this._base;\r\n if (!base) return;\r\n if (!pressed || this.variant === \"connected\") {\r\n const button = this.buttons.find((x) => x === document.activeElement);\r\n if (!prefersReducedMotion() && button) {\r\n button.addEventListener(\r\n \"transitionend\",\r\n () =>\r\n queueMicrotask(() => {\r\n // Pressed state is tested to ensure this runs only when the button\r\n // is no longer pressed. This handles changes to pressed state in\r\n // quick succession.\r\n\r\n if (!hasCustomState(button, \"--pressed\")) {\r\n this.#cleanupPressed(base);\r\n }\r\n }),\r\n { once: true },\r\n );\r\n } else {\r\n this.#cleanupPressed(base);\r\n }\r\n } else {\r\n base.classList.add(\"pressed\");\r\n base.style.setProperty(\"--_button-group-width\", `${base.getBoundingClientRect().width}px`);\r\n }\r\n }\r\n\r\n /** @private */\r\n #cleanupPressed(base: HTMLElement): void {\r\n base.style.removeProperty(\"--_button-group-width\");\r\n base.classList.remove(\"pressed\");\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m3e-button-group\": M3eButtonGroupElement;\r\n }\r\n}\r\n"],"names":["M3eButtonGroupElement","Role","LitElement","constructor","_M3eButtonGroupElement_pressedController","set","this","PressedController","target","capture","minPressedDuration","isPressedKey","key","callback","pressed","__classPrivateFieldGet","_M3eButtonGroupElement_instances","_M3eButtonGroupElement_handlePressedChange","call","variant","size","multi","connectedCallback","super","hasAttribute","role","disconnectedCallback","_base","style","removeProperty","classList","remove","update","changedProperties","has","_M3eButtonGroupElement_updateButtons","render","html","_M3eButtonGroupElement_handleChange","buttons","targets","unobserve","canToggle","some","x","toggle","buttonRole","forEach","button","i","observe","setCustomState","addCustomState","length","checked","selected","ariaPressed","ariaChecked","e","HTMLElement","tagName","isSelectedMixin","base","add","setProperty","getBoundingClientRect","width","find","document","activeElement","prefersReducedMotion","addEventListener","queueMicrotask","hasCustomState","_M3eButtonGroupElement_cleanupPressed","once","styles","css","DesignToken","shape","corner","small","extraSmall","large","medium","largeIncreased","__decorate","query","prototype","property","reflect","type","Boolean","queryAssignedElements","slot","selector","flatten","customElement"],"mappings":"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"}