@m3e/web 2.5.8 → 2.5.10
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.
- package/dist/all.js +267 -75
- package/dist/all.js.map +1 -1
- package/dist/all.min.js +56 -56
- package/dist/all.min.js.map +1 -1
- package/dist/button-group.js +39 -13
- package/dist/button-group.js.map +1 -1
- package/dist/button-group.min.js +1 -1
- package/dist/button-group.min.js.map +1 -1
- package/dist/button.js +63 -31
- package/dist/button.js.map +1 -1
- package/dist/button.min.js +1 -1
- package/dist/button.min.js.map +1 -1
- package/dist/core.js +37 -1
- package/dist/core.js.map +1 -1
- package/dist/core.min.js +1 -1
- package/dist/core.min.js.map +1 -1
- package/dist/css-custom-data.json +444 -444
- package/dist/custom-elements.json +2985 -2881
- package/dist/html-custom-data.json +126 -126
- package/dist/icon-button.js +63 -31
- package/dist/icon-button.js.map +1 -1
- package/dist/icon-button.min.js +1 -1
- package/dist/icon-button.min.js.map +1 -1
- package/dist/src/button/ButtonElement.d.ts.map +1 -1
- package/dist/src/button/styles/ButtonSizeStyle.d.ts.map +1 -1
- package/dist/src/button/styles/ButtonStyle.d.ts.map +1 -1
- package/dist/src/button-group/ButtonGroupElement.d.ts.map +1 -1
- package/dist/src/core/shared/tokens/DesignToken.d.ts +18 -0
- package/dist/src/core/shared/tokens/DesignToken.d.ts.map +1 -1
- package/dist/src/core/shared/tokens/MeasurementToken.d.ts +34 -0
- package/dist/src/core/shared/tokens/MeasurementToken.d.ts.map +1 -0
- package/dist/src/icon-button/IconButtonElement.d.ts.map +1 -1
- package/dist/src/icon-button/styles/IconButtonSizeStyle.d.ts.map +1 -1
- package/dist/src/icon-button/styles/IconButtonStyle.d.ts.map +1 -1
- package/dist/src/theme/ThemeElement.d.ts.map +1 -1
- package/dist/src/toc/TocElement.d.ts.map +1 -1
- package/dist/theme.js +51 -2
- package/dist/theme.js.map +1 -1
- package/dist/theme.min.js +31 -31
- package/dist/theme.min.js.map +1 -1
- package/dist/toc.js +19 -2
- package/dist/toc.js.map +1 -1
- package/dist/toc.min.js +1 -1
- package/dist/toc.min.js.map +1 -1
- package/package.json +1 -1
package/dist/button-group.js
CHANGED
|
@@ -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, waitForUpgrade, 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.
|
|
@@ -130,11 +121,18 @@ let M3eButtonGroupElement = class M3eButtonGroupElement extends Role(LitElement,
|
|
|
130
121
|
};
|
|
131
122
|
_M3eButtonGroupElement_pressedController = new WeakMap();
|
|
132
123
|
_M3eButtonGroupElement_instances = new WeakSet();
|
|
133
|
-
_M3eButtonGroupElement_updateButtons =
|
|
124
|
+
_M3eButtonGroupElement_updateButtons = /** @private */
|
|
125
|
+
async function _M3eButtonGroupElement_updateButtons() {
|
|
134
126
|
const buttons = this.buttons;
|
|
135
127
|
for (const target of __classPrivateFieldGet(this, _M3eButtonGroupElement_pressedController, "f").targets) {
|
|
136
128
|
__classPrivateFieldGet(this, _M3eButtonGroupElement_pressedController, "f").unobserve(target);
|
|
137
129
|
}
|
|
130
|
+
for (const button of this.buttons) {
|
|
131
|
+
await waitForUpgrade(button);
|
|
132
|
+
if (button.isUpdatePending) {
|
|
133
|
+
await button.updateComplete;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
138
136
|
const canToggle = [...buttons].some(x => x.toggle);
|
|
139
137
|
// disable-role is an internal attribute to by split-button to disable setting roles.
|
|
140
138
|
if (!this.hasAttribute("disable-role")) {
|
|
@@ -172,6 +170,34 @@ _M3eButtonGroupElement_handleChange = function _M3eButtonGroupElement_handleChan
|
|
|
172
170
|
}
|
|
173
171
|
}
|
|
174
172
|
};
|
|
173
|
+
_M3eButtonGroupElement_handlePressedChange = function _M3eButtonGroupElement_handlePressedChange(pressed) {
|
|
174
|
+
const base = this._base;
|
|
175
|
+
if (!base) return;
|
|
176
|
+
if (!pressed || this.variant === "connected") {
|
|
177
|
+
const button = this.buttons.find(x => x === document.activeElement);
|
|
178
|
+
if (!prefersReducedMotion() && button) {
|
|
179
|
+
button.addEventListener("transitionend", () => queueMicrotask(() => {
|
|
180
|
+
// Pressed state is tested to ensure this runs only when the button
|
|
181
|
+
// is no longer pressed. This handles changes to pressed state in
|
|
182
|
+
// quick succession.
|
|
183
|
+
if (!hasCustomState(button, "--pressed")) {
|
|
184
|
+
__classPrivateFieldGet(this, _M3eButtonGroupElement_instances, "m", _M3eButtonGroupElement_cleanupPressed).call(this, base);
|
|
185
|
+
}
|
|
186
|
+
}), {
|
|
187
|
+
once: true
|
|
188
|
+
});
|
|
189
|
+
} else {
|
|
190
|
+
__classPrivateFieldGet(this, _M3eButtonGroupElement_instances, "m", _M3eButtonGroupElement_cleanupPressed).call(this, base);
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
base.classList.add("pressed");
|
|
194
|
+
base.style.setProperty("--_button-group-width", `${base.getBoundingClientRect().width}px`);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
_M3eButtonGroupElement_cleanupPressed = function _M3eButtonGroupElement_cleanupPressed(base) {
|
|
198
|
+
base.style.removeProperty("--_button-group-width");
|
|
199
|
+
base.classList.remove("pressed");
|
|
200
|
+
};
|
|
175
201
|
/** The styles of the element. */
|
|
176
202
|
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
203
|
__decorate([query(".base")], M3eButtonGroupElement.prototype, "_base", void 0);
|
package/dist/button-group.js.map
CHANGED
|
@@ -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 waitForUpgrade,\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 async #updateButtons(): Promise<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 for (const button of this.buttons) {\r\n await waitForUpgrade(button);\r\n if (button.isUpdatePending) {\r\n await button.updateComplete;\r\n }\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","button","waitForUpgrade","isUpdatePending","updateComplete","canToggle","some","x","toggle","buttonRole","forEach","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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"}
|
package/dist/button-group.min.js
CHANGED
|
@@ -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,waitForUpgrade as c,setCustomState as u,addCustomState as p,isSelectedMixin as h,prefersReducedMotion as m,hasCustomState as g,DesignToken as b,customElement as v}from"@m3e/web/core";var f,x,z,_,$,y;let q=class extends(l(s,"group")){constructor(){super(...arguments),f.add(this),x.set(this,new d(this,{target:null,capture:!0,minPressedDuration:150,isPressedKey:e=>" "===e,callback:t=>e(this,f,"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,f,"m",z).call(this),t.has("variant")&&this._base?.style.removeProperty("--_button-group-width")}render(){return a`<div class="base"><slot @slotchange="${e(this,f,"m",z)}" @change="${e(this,f,"m",_)}"></slot></div>`}};x=new WeakMap,f=new WeakSet,z=async function(){const t=this.buttons;for(const t of e(this,x,"f").targets)e(this,x,"f").unobserve(t);for(const e of this.buttons)await c(e),e.isUpdatePending&&await e.updateComplete;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,x,"f").observe(s),u(s,"--connected","connected"===this.variant),p(s,"--grouped"),u(s,"--first",0==r),u(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)}})},_=function(e){if(!this.multi&&e.target instanceof HTMLElement&&("M3E-BUTTON"===e.target.tagName||"M3E-ICON-BUTTON"===e.target.tagName)){if(!h(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);!m()&&t?t.addEventListener("transitionend",()=>queueMicrotask(()=>{g(t,"--pressed")||e(this,f,"m",y).call(this,s)}),{once:!0}):e(this,f,"m",y).call(this,s)}},y=function(e){e.style.removeProperty("--_button-group-width"),e.classList.remove("pressed")},q.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, ${b.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${b.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${b.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, ${b.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-small-inner-shape, ${b.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-small-inner-pressed-shape, ${b.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, ${b.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-small-inner-shape, ${b.shape.corner.small} ); --_button-end-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${b.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, ${b.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-small-inner-shape, ${b.shape.corner.small} ); --_button-start-shape-pressed-morph: var( --m3e-connected-button-group-small-inner-pressed-shape, ${b.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, ${b.shape.corner.small} ); --_button-square-end-shape: var( --m3e-connected-button-group-medium-inner-shape, ${b.shape.corner.small} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${b.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, ${b.shape.corner.small} ); --_button-square-start-shape: var( --m3e-connected-button-group-medium-inner-shape, ${b.shape.corner.small} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-medium-inner-pressed-shape, ${b.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, ${b.shape.corner.large} ); --_button-square-end-shape: var( --m3e-connected-button-group-large-inner-shape, ${b.shape.corner.large} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${b.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, ${b.shape.corner.large} ); --_button-square-start-shape: var( --m3e-connected-button-group-large-inner-shape, ${b.shape.corner.large} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-large-inner-pressed-shape, ${b.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, ${b.shape.corner.largeIncreased} ); --_button-square-end-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${b.shape.corner.largeIncreased} ); --_button-square-end-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${b.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, ${b.shape.corner.largeIncreased} ); --_button-square-start-shape: var( --m3e-connected-button-group-extra-large-inner-shape, ${b.shape.corner.largeIncreased} ); --_button-square-start-pressed-shape: var( --m3e-connected-button-group-extra-large-inner-pressed-shape, ${b.shape.corner.large} ); }`,t([n(".base")],q.prototype,"_base",void 0),t([o({reflect:!0})],q.prototype,"variant",void 0),t([o({reflect:!0})],q.prototype,"size",void 0),t([o({type:Boolean})],q.prototype,"multi",void 0),t([i({slot:"",selector:"m3e-button,m3e-icon-button",flatten:!0})],q.prototype,"buttons",void 0),q=t([v("m3e-button-group")],q);export{q 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 waitForUpgrade,\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 async #updateButtons(): Promise<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 for (const button of this.buttons) {\r\n await waitForUpgrade(button);\r\n if (button.isUpdatePending) {\r\n await button.updateComplete;\r\n }\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","async","buttons","targets","unobserve","button","waitForUpgrade","isUpdatePending","updateComplete","canToggle","some","x","toggle","buttonRole","forEach","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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"}
|