@material/web 2.5.1-nightly.56a486b.0 → 2.5.1-nightly.703aed2.0
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/custom-elements.json +29543 -23432
- package/labs/aria/buttons/keyboard_click_handler.d.ts +25 -0
- package/labs/aria/buttons/keyboard_click_handler.js +74 -0
- package/labs/aria/buttons/keyboard_click_handler.js.map +1 -0
- package/labs/aria/buttons/md-aria-toggle.d.ts +29 -0
- package/labs/aria/buttons/md-aria-toggle.js +67 -0
- package/labs/aria/buttons/md-aria-toggle.js.map +1 -0
- package/labs/aria/buttons/toggle.d.ts +40 -0
- package/labs/aria/buttons/toggle.js +100 -0
- package/labs/aria/buttons/toggle.js.map +1 -0
- package/labs/aria/menu/fieldset.d.ts +36 -0
- package/labs/aria/menu/fieldset.js +103 -0
- package/labs/aria/menu/fieldset.js.map +1 -0
- package/labs/aria/menu/internal.d.ts +15 -0
- package/labs/aria/menu/internal.js +16 -0
- package/labs/aria/menu/internal.js.map +1 -0
- package/labs/aria/menu/md-aria-fieldset.d.ts +11 -0
- package/labs/aria/menu/md-aria-fieldset.js +8 -0
- package/labs/aria/menu/md-aria-fieldset.js.map +1 -0
- package/labs/aria/menu/md-aria-menubar.d.ts +11 -0
- package/labs/aria/menu/md-aria-menubar.js +8 -0
- package/labs/aria/menu/md-aria-menubar.js.map +1 -0
- package/labs/aria/menu/menubar.d.ts +15 -0
- package/labs/aria/menu/menubar.js +45 -0
- package/labs/aria/menu/menubar.js.map +1 -0
- package/labs/aria/menu/menuitem.d.ts +37 -4
- package/labs/aria/menu/menuitem.js +172 -21
- package/labs/aria/menu/menuitem.js.map +1 -1
- package/labs/aria/menu/menulist.d.ts +2 -6
- package/labs/aria/menu/menulist.js +12 -46
- package/labs/aria/menu/menulist.js.map +1 -1
- package/labs/aria/menu/shared-slotted-content.d.ts +10 -0
- package/labs/aria/menu/shared-slotted-content.js +51 -0
- package/labs/aria/menu/shared-slotted-content.js.map +1 -0
- package/labs/aria/pseudo-classes.d.ts +19 -0
- package/labs/aria/pseudo-classes.js +22 -0
- package/labs/aria/pseudo-classes.js.map +1 -0
- package/labs/aria/tabs/tab.js +5 -0
- package/labs/aria/tabs/tab.js.map +1 -1
- package/labs/gb/components/appbar/app-bar.css +1 -1
- package/labs/gb/components/appbar/app-bar.css.map +1 -1
- package/labs/gb/components/appbar/app-bar.cssresult.js +1 -1
- package/labs/gb/components/appbar/app-bar.cssresult.js.map +1 -1
- package/labs/gb/components/appbar/app-bar.scss +1 -0
- package/labs/gb/components/badge/badge.css +1 -1
- package/labs/gb/components/badge/badge.css.map +1 -1
- package/labs/gb/components/badge/badge.cssresult.js +1 -1
- package/labs/gb/components/badge/badge.cssresult.js.map +1 -1
- package/labs/gb/components/badge/badge.scss +1 -0
- package/labs/gb/components/button/button-element.d.ts +2 -0
- package/labs/gb/components/button/button-element.js +15 -2
- package/labs/gb/components/button/button-element.js.map +1 -1
- package/labs/gb/components/button/button.css +1 -1
- package/labs/gb/components/button/button.css.map +1 -1
- package/labs/gb/components/button/button.cssresult.js +1 -1
- package/labs/gb/components/button/button.cssresult.js.map +1 -1
- package/labs/gb/components/button/button.scss +1 -0
- package/labs/gb/components/buttongroup/_button-group-tokens.scss +123 -0
- package/labs/gb/components/buttongroup/button-group-element.d.ts +65 -0
- package/labs/gb/components/buttongroup/button-group-element.js +277 -0
- package/labs/gb/components/buttongroup/button-group-element.js.map +1 -0
- package/labs/gb/components/buttongroup/button-group.css +5 -0
- package/labs/gb/components/buttongroup/button-group.css.map +1 -0
- package/labs/gb/components/buttongroup/button-group.cssresult.d.ts +3 -0
- package/labs/gb/components/buttongroup/button-group.cssresult.js +15 -0
- package/labs/gb/components/buttongroup/button-group.cssresult.js.map +1 -0
- package/labs/gb/components/buttongroup/button-group.d.ts +96 -0
- package/labs/gb/components/buttongroup/button-group.js +105 -0
- package/labs/gb/components/buttongroup/button-group.js.map +1 -0
- package/labs/gb/components/buttongroup/button-group.scss +282 -0
- package/labs/gb/components/buttongroup/md-gb-button-group.d.ts +12 -0
- package/labs/gb/components/buttongroup/md-gb-button-group.js +8 -0
- package/labs/gb/components/buttongroup/md-gb-button-group.js.map +1 -0
- package/labs/gb/components/chip/chip.css +1 -1
- package/labs/gb/components/chip/chip.css.map +1 -1
- package/labs/gb/components/chip/chip.cssresult.js +1 -1
- package/labs/gb/components/chip/chip.cssresult.js.map +1 -1
- package/labs/gb/components/chip/chip.scss +1 -0
- package/labs/gb/components/fab/fab.css +1 -1
- package/labs/gb/components/fab/fab.css.map +1 -1
- package/labs/gb/components/fab/fab.cssresult.js +1 -1
- package/labs/gb/components/fab/fab.cssresult.js.map +1 -1
- package/labs/gb/components/fab/fab.scss +1 -0
- package/labs/gb/components/iconbutton/icon-button-element.d.ts +2 -0
- package/labs/gb/components/iconbutton/icon-button-element.js +15 -2
- package/labs/gb/components/iconbutton/icon-button-element.js.map +1 -1
- package/labs/gb/components/iconbutton/icon-button.css +1 -1
- package/labs/gb/components/iconbutton/icon-button.css.map +1 -1
- package/labs/gb/components/iconbutton/icon-button.cssresult.js +1 -1
- package/labs/gb/components/iconbutton/icon-button.cssresult.js.map +1 -1
- package/labs/gb/components/iconbutton/icon-button.scss +1 -0
- package/labs/gb/components/list/list.css +1 -1
- package/labs/gb/components/list/list.css.map +1 -1
- package/labs/gb/components/list/list.cssresult.js +1 -1
- package/labs/gb/components/list/list.cssresult.js.map +1 -1
- package/labs/gb/components/list/list.scss +1 -0
- package/labs/gb/components/menu/menu.css +1 -1
- package/labs/gb/components/menu/menu.css.map +1 -1
- package/labs/gb/components/menu/menu.cssresult.js +1 -1
- package/labs/gb/components/menu/menu.cssresult.js.map +1 -1
- package/labs/gb/components/menu/menu.scss +1 -0
- package/labs/gb/components/navbar/_nav-bar-tokens.scss +53 -0
- package/labs/gb/components/navbar/md-gb-nav-bar-item.d.ts +12 -0
- package/labs/gb/components/navbar/md-gb-nav-bar-item.js +10 -0
- package/labs/gb/components/navbar/md-gb-nav-bar-item.js.map +1 -0
- package/labs/gb/components/navbar/md-gb-nav-bar.d.ts +12 -0
- package/labs/gb/components/navbar/md-gb-nav-bar.js +10 -0
- package/labs/gb/components/navbar/md-gb-nav-bar.js.map +1 -0
- package/labs/gb/components/navbar/nav-bar-element.d.ts +58 -0
- package/labs/gb/components/navbar/nav-bar-element.js +116 -0
- package/labs/gb/components/navbar/nav-bar-element.js.map +1 -0
- package/labs/gb/components/navbar/nav-bar-item-element.d.ts +41 -0
- package/labs/gb/components/navbar/nav-bar-item-element.js +146 -0
- package/labs/gb/components/navbar/nav-bar-item-element.js.map +1 -0
- package/labs/gb/components/navbar/nav-bar.css +4 -0
- package/labs/gb/components/navbar/nav-bar.css.map +1 -0
- package/labs/gb/components/navbar/nav-bar.cssresult.d.ts +3 -0
- package/labs/gb/components/navbar/nav-bar.cssresult.js +14 -0
- package/labs/gb/components/navbar/nav-bar.cssresult.js.map +1 -0
- package/labs/gb/components/navbar/nav-bar.d.ts +86 -0
- package/labs/gb/components/navbar/nav-bar.js +92 -0
- package/labs/gb/components/navbar/nav-bar.js.map +1 -0
- package/labs/gb/components/navbar/nav-bar.scss +295 -0
- package/labs/gb/components/shared/pseudo-classes.d.ts +1 -7
- package/labs/gb/components/shared/pseudo-classes.js +1 -9
- package/labs/gb/components/shared/pseudo-classes.js.map +1 -1
- package/labs/gb/components/shared/update-class-list.d.ts +22 -0
- package/labs/gb/components/shared/update-class-list.js +26 -0
- package/labs/gb/components/shared/update-class-list.js.map +1 -0
- package/labs/gb/components/slider/_slider-tokens.scss +82 -0
- package/labs/gb/components/slider/md-gb-slider.d.ts +12 -0
- package/labs/gb/components/slider/md-gb-slider.js +8 -0
- package/labs/gb/components/slider/md-gb-slider.js.map +1 -0
- package/labs/gb/components/slider/slider-element.d.ts +145 -0
- package/labs/gb/components/slider/slider-element.js +934 -0
- package/labs/gb/components/slider/slider-element.js.map +1 -0
- package/labs/gb/components/slider/slider.css +1 -0
- package/labs/gb/components/slider/slider.css.map +1 -0
- package/labs/gb/components/slider/slider.cssresult.d.ts +3 -0
- package/labs/gb/components/slider/slider.cssresult.js +11 -0
- package/labs/gb/components/slider/slider.cssresult.js.map +1 -0
- package/labs/gb/components/slider/slider.d.ts +169 -0
- package/labs/gb/components/slider/slider.js +452 -0
- package/labs/gb/components/slider/slider.js.map +1 -0
- package/labs/gb/components/slider/slider.scss +661 -0
- package/labs/gb/components/tabs/_tabs-tokens.scss +177 -0
- package/labs/gb/components/tabs/md-gb-tab.d.ts +12 -0
- package/labs/gb/components/tabs/md-gb-tab.js +8 -0
- package/labs/gb/components/tabs/md-gb-tab.js.map +1 -0
- package/labs/gb/components/tabs/md-gb-tabs.d.ts +12 -0
- package/labs/gb/components/tabs/md-gb-tabs.js +8 -0
- package/labs/gb/components/tabs/md-gb-tabs.js.map +1 -0
- package/labs/gb/components/tabs/tab-element.d.ts +42 -0
- package/labs/gb/components/tabs/tab-element.js +75 -0
- package/labs/gb/components/tabs/tab-element.js.map +1 -0
- package/labs/gb/components/tabs/tabs-element.d.ts +37 -0
- package/labs/gb/components/tabs/tabs-element.js +67 -0
- package/labs/gb/components/tabs/tabs-element.js.map +1 -0
- package/labs/gb/components/tabs/tabs.css +4 -0
- package/labs/gb/components/tabs/tabs.css.map +1 -0
- package/labs/gb/components/tabs/tabs.cssresult.d.ts +3 -0
- package/labs/gb/components/tabs/tabs.cssresult.js +14 -0
- package/labs/gb/components/tabs/tabs.cssresult.js.map +1 -0
- package/labs/gb/components/tabs/tabs.d.ts +98 -0
- package/labs/gb/components/tabs/tabs.js +112 -0
- package/labs/gb/components/tabs/tabs.js.map +1 -0
- package/labs/gb/components/tabs/tabs.scss +301 -0
- package/labs/gb/components/toolbar/_toolbar-tokens.scss +70 -0
- package/labs/gb/components/toolbar/md-gb-toolbar.d.ts +12 -0
- package/labs/gb/components/toolbar/md-gb-toolbar.js +8 -0
- package/labs/gb/components/toolbar/md-gb-toolbar.js.map +1 -0
- package/labs/gb/components/toolbar/toolbar-element.d.ts +56 -0
- package/labs/gb/components/toolbar/toolbar-element.js +120 -0
- package/labs/gb/components/toolbar/toolbar-element.js.map +1 -0
- package/labs/gb/components/toolbar/toolbar.css +4 -0
- package/labs/gb/components/toolbar/toolbar.css.map +1 -0
- package/labs/gb/components/toolbar/toolbar.cssresult.d.ts +3 -0
- package/labs/gb/components/toolbar/toolbar.cssresult.js +14 -0
- package/labs/gb/components/toolbar/toolbar.cssresult.js.map +1 -0
- package/labs/gb/components/toolbar/toolbar.d.ts +56 -0
- package/labs/gb/components/toolbar/toolbar.js +60 -0
- package/labs/gb/components/toolbar/toolbar.js.map +1 -0
- package/labs/gb/components/toolbar/toolbar.scss +240 -0
- package/labs/gb/styles/tailwind.css +1 -1
- package/labs/gb/styles/tailwind.css.map +1 -1
- package/labs/gb/styles/tailwind.cssresult.js +1 -1
- package/labs/gb/styles/tailwind.cssresult.js.map +1 -1
- package/labs/gb/styles/tailwind.scss +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { CSSResultOrNative, LitElement, PropertyValues } from 'lit';
|
|
7
|
+
import { type ButtonElement } from '../button/button-element.js';
|
|
8
|
+
import { type ButtonGroupSelection, type ButtonGroupVariant } from './button-group.js';
|
|
9
|
+
declare const baseClass: import("@material/web/labs/behaviors/mixin.js").MixinReturn<typeof LitElement, import("../../../behaviors/element-internals.js").WithElementInternals>;
|
|
10
|
+
/**
|
|
11
|
+
* A Material Design button group component.
|
|
12
|
+
*
|
|
13
|
+
* @slot - Used to display buttons.
|
|
14
|
+
* @fires {InputEvent} input - Fired when selection changes. --bubbles --composed
|
|
15
|
+
* @fires {Event} change - Fired when selection changes. --bubbles
|
|
16
|
+
* @cssprop --between-space
|
|
17
|
+
* @cssprop --pressed-item-width-multiplier
|
|
18
|
+
* @cssprop --motion-spring-fast-spatial
|
|
19
|
+
* @cssprop --motion-spring-fast-spatial-duration
|
|
20
|
+
* @cssprop --inner-corner-size
|
|
21
|
+
* @cssprop --pressed-inner-corner-size
|
|
22
|
+
* @cssprop --outer-corner-size
|
|
23
|
+
* @cssprop --outer-corner-square-size
|
|
24
|
+
*/
|
|
25
|
+
export declare class ButtonGroupElement extends baseClass {
|
|
26
|
+
/** @nocollapse */
|
|
27
|
+
static styles: CSSResultOrNative[];
|
|
28
|
+
constructor();
|
|
29
|
+
/** The visual variant of the button group. */
|
|
30
|
+
variant: ButtonGroupVariant;
|
|
31
|
+
/** The selection mode. */
|
|
32
|
+
selection: ButtonGroupSelection;
|
|
33
|
+
/** Whether selection is required in single-select mode. */
|
|
34
|
+
required: boolean;
|
|
35
|
+
/** Whether the button group is disabled. */
|
|
36
|
+
disabled: boolean;
|
|
37
|
+
private readonly assignedElementsList;
|
|
38
|
+
private readonly groupDisabledButtons;
|
|
39
|
+
private readonly childObserver;
|
|
40
|
+
/** Returns all child `md-gb-button` elements. */
|
|
41
|
+
get buttons(): ButtonElement[];
|
|
42
|
+
/** Returns currently selected buttons. */
|
|
43
|
+
get selectedButtons(): ButtonElement[];
|
|
44
|
+
/** Returns index of first selected button or -1. */
|
|
45
|
+
get selectedIndex(): number;
|
|
46
|
+
/** Returns indices of all selected buttons. */
|
|
47
|
+
get selectedIndices(): number[];
|
|
48
|
+
/** Value of the currently selected button (or first selected). */
|
|
49
|
+
get value(): string;
|
|
50
|
+
/** Silent setter for single-select mode. */
|
|
51
|
+
set value(val: string);
|
|
52
|
+
/** Values of all currently selected buttons. */
|
|
53
|
+
get values(): string[];
|
|
54
|
+
connectedCallback(): void;
|
|
55
|
+
disconnectedCallback(): void;
|
|
56
|
+
protected firstUpdated(changedProperties: PropertyValues<this>): void;
|
|
57
|
+
protected updated(changedProperties: PropertyValues<this>): void;
|
|
58
|
+
private syncSelectionFromChild;
|
|
59
|
+
private syncButtonsDisabledAndType;
|
|
60
|
+
private normalizeGroupSelection;
|
|
61
|
+
private observeChildren;
|
|
62
|
+
protected handleSlotChange(): void;
|
|
63
|
+
protected render(): import("lit-html").TemplateResult<1>;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { __decorate } from "tslib";
|
|
7
|
+
import { html, LitElement } from 'lit';
|
|
8
|
+
import { property, queryAssignedElements } from 'lit/decorators.js';
|
|
9
|
+
import { internals, mixinElementInternals, } from '../../../behaviors/element-internals.js';
|
|
10
|
+
import { adoptStyles } from '../../styles/adopt-styles.js';
|
|
11
|
+
import { updateClassList } from '../shared/update-class-list.js';
|
|
12
|
+
import { buttonGroupClasses, normalizeSelection, shouldBlockToggle, } from './button-group.js';
|
|
13
|
+
import buttonGroupStyles from './button-group.css' with { type: 'css' }; // github-only
|
|
14
|
+
// import buttonGroupStyles from './button-group.cssresult.js'; // google3-only
|
|
15
|
+
// Separate variable needed for closure.
|
|
16
|
+
const baseClass = mixinElementInternals(LitElement);
|
|
17
|
+
/**
|
|
18
|
+
* A Material Design button group component.
|
|
19
|
+
*
|
|
20
|
+
* @slot - Used to display buttons.
|
|
21
|
+
* @fires {InputEvent} input - Fired when selection changes. --bubbles --composed
|
|
22
|
+
* @fires {Event} change - Fired when selection changes. --bubbles
|
|
23
|
+
* @cssprop --between-space
|
|
24
|
+
* @cssprop --pressed-item-width-multiplier
|
|
25
|
+
* @cssprop --motion-spring-fast-spatial
|
|
26
|
+
* @cssprop --motion-spring-fast-spatial-duration
|
|
27
|
+
* @cssprop --inner-corner-size
|
|
28
|
+
* @cssprop --pressed-inner-corner-size
|
|
29
|
+
* @cssprop --outer-corner-size
|
|
30
|
+
* @cssprop --outer-corner-square-size
|
|
31
|
+
*/
|
|
32
|
+
export class ButtonGroupElement extends baseClass {
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
/** The visual variant of the button group. */
|
|
36
|
+
this.variant = 'standard';
|
|
37
|
+
/** The selection mode. */
|
|
38
|
+
this.selection = 'none';
|
|
39
|
+
/** Whether selection is required in single-select mode. */
|
|
40
|
+
this.required = false;
|
|
41
|
+
/** Whether the button group is disabled. */
|
|
42
|
+
this.disabled = false;
|
|
43
|
+
this.groupDisabledButtons = new WeakSet();
|
|
44
|
+
this.childObserver = new MutationObserver((mutations) => {
|
|
45
|
+
for (const mutation of mutations) {
|
|
46
|
+
if (mutation.attributeName === 'selected') {
|
|
47
|
+
const target = mutation.target;
|
|
48
|
+
if (this.selection === 'single') {
|
|
49
|
+
if (target.selected) {
|
|
50
|
+
this.normalizeGroupSelection({ preferred: target });
|
|
51
|
+
}
|
|
52
|
+
else if (this.required) {
|
|
53
|
+
const anySelected = this.buttons.some((b) => b.selected);
|
|
54
|
+
if (!anySelected) {
|
|
55
|
+
this.normalizeGroupSelection();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
this[internals].role = 'toolbar';
|
|
63
|
+
const handleClick = (event) => {
|
|
64
|
+
const path = event.composedPath();
|
|
65
|
+
const button = this.buttons.find((b) => path.includes(b));
|
|
66
|
+
if (!button)
|
|
67
|
+
return;
|
|
68
|
+
if (button.disabled || button.softDisabled) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
event.stopImmediatePropagation();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const index = this.buttons.indexOf(button);
|
|
74
|
+
if (shouldBlockToggle(this.buttons, index, {
|
|
75
|
+
selection: this.selection,
|
|
76
|
+
required: this.required,
|
|
77
|
+
})) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const handleInput = (event) => {
|
|
82
|
+
if (event.target === this)
|
|
83
|
+
return;
|
|
84
|
+
const path = event.composedPath();
|
|
85
|
+
const child = this.buttons.find((b) => path.includes(b));
|
|
86
|
+
if (!child || child.disabled || child.softDisabled)
|
|
87
|
+
return;
|
|
88
|
+
event.stopImmediatePropagation();
|
|
89
|
+
this.syncSelectionFromChild(child);
|
|
90
|
+
this.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));
|
|
91
|
+
};
|
|
92
|
+
const handleChange = (event) => {
|
|
93
|
+
if (event.target === this)
|
|
94
|
+
return;
|
|
95
|
+
const path = event.composedPath();
|
|
96
|
+
const child = this.buttons.find((b) => path.includes(b));
|
|
97
|
+
if (!child || child.disabled || child.softDisabled)
|
|
98
|
+
return;
|
|
99
|
+
event.stopImmediatePropagation();
|
|
100
|
+
this.syncSelectionFromChild(child);
|
|
101
|
+
this.dispatchEvent(new Event('change', { bubbles: true }));
|
|
102
|
+
};
|
|
103
|
+
this.addEventListener('click', handleClick);
|
|
104
|
+
this.addEventListener('input', handleInput);
|
|
105
|
+
this.addEventListener('change', handleChange);
|
|
106
|
+
}
|
|
107
|
+
/** Returns all child `md-gb-button` elements. */
|
|
108
|
+
get buttons() {
|
|
109
|
+
return this.assignedElementsList.filter((node) => node.localName === 'md-gb-button');
|
|
110
|
+
}
|
|
111
|
+
/** Returns currently selected buttons. */
|
|
112
|
+
get selectedButtons() {
|
|
113
|
+
return this.buttons.filter((b) => b.selected);
|
|
114
|
+
}
|
|
115
|
+
/** Returns index of first selected button or -1. */
|
|
116
|
+
get selectedIndex() {
|
|
117
|
+
return this.buttons.findIndex((b) => b.selected);
|
|
118
|
+
}
|
|
119
|
+
/** Returns indices of all selected buttons. */
|
|
120
|
+
get selectedIndices() {
|
|
121
|
+
const indices = [];
|
|
122
|
+
const buttons = this.buttons;
|
|
123
|
+
for (let i = 0; i < buttons.length; i++) {
|
|
124
|
+
if (buttons[i].selected) {
|
|
125
|
+
indices.push(i);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return indices;
|
|
129
|
+
}
|
|
130
|
+
/** Value of the currently selected button (or first selected). */
|
|
131
|
+
get value() {
|
|
132
|
+
return this.selectedButtons[0]?.value ?? '';
|
|
133
|
+
}
|
|
134
|
+
/** Silent setter for single-select mode. */
|
|
135
|
+
set value(val) {
|
|
136
|
+
if (this.selection !== 'single')
|
|
137
|
+
return;
|
|
138
|
+
for (const b of this.buttons) {
|
|
139
|
+
b.selected = b.value === val;
|
|
140
|
+
}
|
|
141
|
+
this.normalizeGroupSelection();
|
|
142
|
+
}
|
|
143
|
+
/** Values of all currently selected buttons. */
|
|
144
|
+
get values() {
|
|
145
|
+
return this.selectedButtons.map((b) => b.value);
|
|
146
|
+
}
|
|
147
|
+
connectedCallback() {
|
|
148
|
+
super.connectedCallback();
|
|
149
|
+
adoptStyles(this, buttonGroupStyles);
|
|
150
|
+
updateClassList(this, buttonGroupClasses({
|
|
151
|
+
variant: this.variant,
|
|
152
|
+
disabled: this.disabled,
|
|
153
|
+
}));
|
|
154
|
+
if (this.hasUpdated) {
|
|
155
|
+
this.observeChildren();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
disconnectedCallback() {
|
|
159
|
+
super.disconnectedCallback();
|
|
160
|
+
this.childObserver.disconnect();
|
|
161
|
+
}
|
|
162
|
+
firstUpdated(changedProperties) {
|
|
163
|
+
super.firstUpdated(changedProperties);
|
|
164
|
+
this.syncButtonsDisabledAndType();
|
|
165
|
+
this.normalizeGroupSelection();
|
|
166
|
+
this.observeChildren();
|
|
167
|
+
}
|
|
168
|
+
updated(changedProperties) {
|
|
169
|
+
super.updated(changedProperties);
|
|
170
|
+
if (!this.hasAttribute('focusgroup')) {
|
|
171
|
+
this.setAttribute('focusgroup', 'toolbar wrap inline');
|
|
172
|
+
}
|
|
173
|
+
if (changedProperties.has('variant') || changedProperties.has('disabled')) {
|
|
174
|
+
updateClassList(this, buttonGroupClasses({
|
|
175
|
+
variant: this.variant,
|
|
176
|
+
disabled: this.disabled,
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
if (changedProperties.has('selection') ||
|
|
180
|
+
changedProperties.has('disabled')) {
|
|
181
|
+
this.syncButtonsDisabledAndType();
|
|
182
|
+
}
|
|
183
|
+
if (changedProperties.has('selection') ||
|
|
184
|
+
changedProperties.has('required')) {
|
|
185
|
+
this.normalizeGroupSelection();
|
|
186
|
+
this.observeChildren();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
syncSelectionFromChild(child) {
|
|
190
|
+
// ButtonElement updates its own `selected` property on the `change` event;
|
|
191
|
+
// during an `input` event, the custom element's `selected` property has not
|
|
192
|
+
// yet been updated by its internal listener, so we inspect `aria-pressed` on
|
|
193
|
+
// the inner button element to capture the immediate interactive toggle state.
|
|
194
|
+
const innerBtn = child.shadowRoot?.querySelector('[part="btn"]');
|
|
195
|
+
if (innerBtn) {
|
|
196
|
+
const isPressed = innerBtn.getAttribute('aria-pressed') === 'true' ||
|
|
197
|
+
innerBtn.ariaPressed === 'true';
|
|
198
|
+
child.selected = isPressed;
|
|
199
|
+
}
|
|
200
|
+
if (this.selection === 'single') {
|
|
201
|
+
if (child.selected) {
|
|
202
|
+
for (const button of this.buttons) {
|
|
203
|
+
if (button !== child) {
|
|
204
|
+
button.selected = false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
syncButtonsDisabledAndType() {
|
|
211
|
+
const buttons = this.buttons;
|
|
212
|
+
for (const button of buttons) {
|
|
213
|
+
const hasHref = button.hasAttribute('href') || Boolean(button.href);
|
|
214
|
+
if (!hasHref) {
|
|
215
|
+
const targetType = this.selection === 'none' ? 'button' : 'toggle';
|
|
216
|
+
button.setAttribute('type', targetType);
|
|
217
|
+
}
|
|
218
|
+
if (this.disabled) {
|
|
219
|
+
if (!button.disabled) {
|
|
220
|
+
this.groupDisabledButtons.add(button);
|
|
221
|
+
button.disabled = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
if (this.groupDisabledButtons.has(button)) {
|
|
226
|
+
this.groupDisabledButtons.delete(button);
|
|
227
|
+
button.disabled = false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
normalizeGroupSelection(options = {}) {
|
|
233
|
+
normalizeSelection(this.buttons, {
|
|
234
|
+
selection: this.selection,
|
|
235
|
+
required: this.required,
|
|
236
|
+
preferred: options.preferred,
|
|
237
|
+
});
|
|
238
|
+
this.childObserver.takeRecords();
|
|
239
|
+
}
|
|
240
|
+
observeChildren() {
|
|
241
|
+
this.childObserver.disconnect();
|
|
242
|
+
for (const button of this.buttons) {
|
|
243
|
+
this.childObserver.observe(button, {
|
|
244
|
+
attributes: true,
|
|
245
|
+
attributeFilter: ['selected'],
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
handleSlotChange() {
|
|
250
|
+
this.syncButtonsDisabledAndType();
|
|
251
|
+
const selected = this.buttons.filter((b) => b.selected);
|
|
252
|
+
const preferred = selected[selected.length - 1];
|
|
253
|
+
this.normalizeGroupSelection({ preferred });
|
|
254
|
+
this.observeChildren();
|
|
255
|
+
}
|
|
256
|
+
render() {
|
|
257
|
+
return html `<slot @slotchange=${this.handleSlotChange}></slot>`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** @nocollapse */
|
|
261
|
+
ButtonGroupElement.styles = [buttonGroupStyles];
|
|
262
|
+
__decorate([
|
|
263
|
+
property({ reflect: true })
|
|
264
|
+
], ButtonGroupElement.prototype, "variant", void 0);
|
|
265
|
+
__decorate([
|
|
266
|
+
property({ reflect: true })
|
|
267
|
+
], ButtonGroupElement.prototype, "selection", void 0);
|
|
268
|
+
__decorate([
|
|
269
|
+
property({ type: Boolean, reflect: true })
|
|
270
|
+
], ButtonGroupElement.prototype, "required", void 0);
|
|
271
|
+
__decorate([
|
|
272
|
+
property({ type: Boolean, reflect: true })
|
|
273
|
+
], ButtonGroupElement.prototype, "disabled", void 0);
|
|
274
|
+
__decorate([
|
|
275
|
+
queryAssignedElements({ flatten: true })
|
|
276
|
+
], ButtonGroupElement.prototype, "assignedElementsList", void 0);
|
|
277
|
+
//# sourceMappingURL=button-group-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-group-element.js","sourceRoot":"","sources":["button-group-element.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {CSSResultOrNative, html, LitElement, PropertyValues} from 'lit';\nimport {property, queryAssignedElements} from 'lit/decorators.js';\nimport {\n internals,\n mixinElementInternals,\n} from '../../../behaviors/element-internals.js';\nimport {adoptStyles} from '../../styles/adopt-styles.js';\nimport {type ButtonElement} from '../button/button-element.js';\nimport {updateClassList} from '../shared/update-class-list.js';\nimport {\n buttonGroupClasses,\n type ButtonGroupSelection,\n type ButtonGroupVariant,\n normalizeSelection,\n shouldBlockToggle,\n} from './button-group.js';\n\nimport buttonGroupStyles from './button-group.css' with {type: 'css'}; // github-only\n// import buttonGroupStyles from './button-group.cssresult.js'; // google3-only\n\n// Separate variable needed for closure.\nconst baseClass = mixinElementInternals(LitElement);\n\n/**\n * A Material Design button group component.\n *\n * @slot - Used to display buttons.\n * @fires {InputEvent} input - Fired when selection changes. --bubbles --composed\n * @fires {Event} change - Fired when selection changes. --bubbles\n * @cssprop --between-space\n * @cssprop --pressed-item-width-multiplier\n * @cssprop --motion-spring-fast-spatial\n * @cssprop --motion-spring-fast-spatial-duration\n * @cssprop --inner-corner-size\n * @cssprop --pressed-inner-corner-size\n * @cssprop --outer-corner-size\n * @cssprop --outer-corner-square-size\n */\nexport class ButtonGroupElement extends baseClass {\n /** @nocollapse */\n static override styles: CSSResultOrNative[] = [buttonGroupStyles];\n\n constructor() {\n super();\n this[internals].role = 'toolbar';\n\n const handleClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n const button = this.buttons.find((b) => path.includes(b));\n if (!button) return;\n\n if (button.disabled || button.softDisabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n\n const index = this.buttons.indexOf(button);\n if (\n shouldBlockToggle(this.buttons, index, {\n selection: this.selection,\n required: this.required,\n })\n ) {\n event.preventDefault();\n }\n };\n\n const handleInput = (event: Event): void => {\n if (event.target === this) return;\n\n const path = event.composedPath();\n const child = this.buttons.find((b) => path.includes(b));\n if (!child || child.disabled || child.softDisabled) return;\n\n event.stopImmediatePropagation();\n this.syncSelectionFromChild(child);\n this.dispatchEvent(\n new InputEvent('input', {bubbles: true, composed: true}),\n );\n };\n\n const handleChange = (event: Event): void => {\n if (event.target === this) return;\n\n const path = event.composedPath();\n const child = this.buttons.find((b) => path.includes(b));\n if (!child || child.disabled || child.softDisabled) return;\n\n event.stopImmediatePropagation();\n this.syncSelectionFromChild(child);\n this.dispatchEvent(new Event('change', {bubbles: true}));\n };\n\n this.addEventListener('click', handleClick);\n this.addEventListener('input', handleInput);\n this.addEventListener('change', handleChange);\n }\n\n /** The visual variant of the button group. */\n @property({reflect: true}) variant: ButtonGroupVariant = 'standard';\n\n /** The selection mode. */\n @property({reflect: true}) selection: ButtonGroupSelection = 'none';\n\n /** Whether selection is required in single-select mode. */\n @property({type: Boolean, reflect: true}) required = false;\n\n /** Whether the button group is disabled. */\n @property({type: Boolean, reflect: true}) disabled = false;\n\n @queryAssignedElements({flatten: true})\n private readonly assignedElementsList!: HTMLElement[];\n\n private readonly groupDisabledButtons = new WeakSet<HTMLElement>();\n\n private readonly childObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.attributeName === 'selected') {\n const target = mutation.target as ButtonElement;\n if (this.selection === 'single') {\n if (target.selected) {\n this.normalizeGroupSelection({preferred: target});\n } else if (this.required) {\n const anySelected = this.buttons.some((b) => b.selected);\n if (!anySelected) {\n this.normalizeGroupSelection();\n }\n }\n }\n }\n }\n });\n\n /** Returns all child `md-gb-button` elements. */\n get buttons(): ButtonElement[] {\n return this.assignedElementsList.filter(\n (node): node is ButtonElement => node.localName === 'md-gb-button',\n );\n }\n\n /** Returns currently selected buttons. */\n get selectedButtons(): ButtonElement[] {\n return this.buttons.filter((b) => b.selected);\n }\n\n /** Returns index of first selected button or -1. */\n get selectedIndex(): number {\n return this.buttons.findIndex((b) => b.selected);\n }\n\n /** Returns indices of all selected buttons. */\n get selectedIndices(): number[] {\n const indices: number[] = [];\n const buttons = this.buttons;\n for (let i = 0; i < buttons.length; i++) {\n if (buttons[i].selected) {\n indices.push(i);\n }\n }\n return indices;\n }\n\n /** Value of the currently selected button (or first selected). */\n get value(): string {\n return this.selectedButtons[0]?.value ?? '';\n }\n\n /** Silent setter for single-select mode. */\n set value(val: string) {\n if (this.selection !== 'single') return;\n for (const b of this.buttons) {\n b.selected = b.value === val;\n }\n this.normalizeGroupSelection();\n }\n\n /** Values of all currently selected buttons. */\n get values(): string[] {\n return this.selectedButtons.map((b) => b.value);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n adoptStyles(this, buttonGroupStyles);\n updateClassList(\n this,\n buttonGroupClasses({\n variant: this.variant,\n disabled: this.disabled,\n }),\n );\n if (this.hasUpdated) {\n this.observeChildren();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.childObserver.disconnect();\n }\n\n protected override firstUpdated(\n changedProperties: PropertyValues<this>,\n ): void {\n super.firstUpdated(changedProperties);\n this.syncButtonsDisabledAndType();\n this.normalizeGroupSelection();\n this.observeChildren();\n }\n\n protected override updated(changedProperties: PropertyValues<this>): void {\n super.updated(changedProperties);\n if (!this.hasAttribute('focusgroup')) {\n this.setAttribute('focusgroup', 'toolbar wrap inline');\n }\n\n if (changedProperties.has('variant') || changedProperties.has('disabled')) {\n updateClassList(\n this,\n buttonGroupClasses({\n variant: this.variant,\n disabled: this.disabled,\n }),\n );\n }\n\n if (\n changedProperties.has('selection') ||\n changedProperties.has('disabled')\n ) {\n this.syncButtonsDisabledAndType();\n }\n\n if (\n changedProperties.has('selection') ||\n changedProperties.has('required')\n ) {\n this.normalizeGroupSelection();\n this.observeChildren();\n }\n }\n\n private syncSelectionFromChild(child: ButtonElement): void {\n // ButtonElement updates its own `selected` property on the `change` event;\n // during an `input` event, the custom element's `selected` property has not\n // yet been updated by its internal listener, so we inspect `aria-pressed` on\n // the inner button element to capture the immediate interactive toggle state.\n const innerBtn = child.shadowRoot?.querySelector('[part=\"btn\"]');\n if (innerBtn) {\n const isPressed =\n innerBtn.getAttribute('aria-pressed') === 'true' ||\n (innerBtn as HTMLElement).ariaPressed === 'true';\n child.selected = isPressed;\n }\n\n if (this.selection === 'single') {\n if (child.selected) {\n for (const button of this.buttons) {\n if (button !== child) {\n button.selected = false;\n }\n }\n }\n }\n }\n\n private syncButtonsDisabledAndType(): void {\n const buttons = this.buttons;\n for (const button of buttons) {\n const hasHref = button.hasAttribute('href') || Boolean(button.href);\n if (!hasHref) {\n const targetType = this.selection === 'none' ? 'button' : 'toggle';\n button.setAttribute('type', targetType);\n }\n\n if (this.disabled) {\n if (!button.disabled) {\n this.groupDisabledButtons.add(button);\n button.disabled = true;\n }\n } else {\n if (this.groupDisabledButtons.has(button)) {\n this.groupDisabledButtons.delete(button);\n button.disabled = false;\n }\n }\n }\n }\n\n private normalizeGroupSelection(\n options: {preferred?: ButtonElement} = {},\n ): void {\n normalizeSelection(this.buttons, {\n selection: this.selection,\n required: this.required,\n preferred: options.preferred,\n });\n this.childObserver.takeRecords();\n }\n\n private observeChildren(): void {\n this.childObserver.disconnect();\n for (const button of this.buttons) {\n this.childObserver.observe(button, {\n attributes: true,\n attributeFilter: ['selected'],\n });\n }\n }\n\n protected handleSlotChange(): void {\n this.syncButtonsDisabledAndType();\n const selected = this.buttons.filter((b) => b.selected);\n const preferred = selected[selected.length - 1];\n this.normalizeGroupSelection({preferred});\n this.observeChildren();\n }\n\n protected override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`;\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright 2026 Google LLC
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/@layer md.sys, md.comp.ripple, md.comp.focus-ring, md.comp.button;@layer md.comp.button-group{.btn-group{--between-space: 8px;--pressed-item-width-multiplier: 1.15;--motion-spring-fast-spatial: linear( 0, 0.099, 0.317, 0.561, 0.775, 0.934, 1.034, 1.083, 1.095, 1.084, 1.063, 1.04, 1.02, 1.005, 0.996, 0.992, 0.991, 0.992, 0.994, 0.996, 1 );--motion-spring-fast-spatial-duration: 350ms;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2);--outer-corner-square-size: var(--md-sys-shape-corner-sm);display:inline-flex;align-items:center;gap:var(--between-space);overflow:visible;interpolate-size:allow-keywords}.btn-group>.btn,.btn-group>*{white-space:nowrap;flex-shrink:0;min-inline-size:max-content}.btn-group-standard,.btn-group:not(.btn-group-connected){flex-wrap:wrap;--between-space: 12px}.btn-group-standard:has(>:is([size=xs],.btn-xs)),.btn-group:not(.btn-group-connected):has(>:is([size=xs],.btn-xs)){--between-space: 18px}.btn-group-standard:has(>:is([size=sm],.btn-sm)),.btn-group:not(.btn-group-connected):has(>:is([size=sm],.btn-sm)){--between-space: 12px}.btn-group-standard:has(>:is([size=md],.btn-md)),.btn-group:not(.btn-group-connected):has(>:is([size=md],.btn-md)){--between-space: 8px}.btn-group-standard:has(>:is([size=lg],.btn-lg)),.btn-group:not(.btn-group-connected):has(>:is([size=lg],.btn-lg)){--between-space: 8px}.btn-group-standard:has(>:is([size=xl],.btn-xl)),.btn-group:not(.btn-group-connected):has(>:is([size=xl],.btn-xl)){--between-space: 8px}.btn-group-connected{flex-wrap:nowrap;--between-space: 2px;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected:has(>:is([size=xs],.btn-xs)){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=sm],.btn-sm)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=md],.btn-md)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=lg],.btn-lg)){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected:has(>:is([size=xl],.btn-xl)){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>.btn,.btn-group-connected>*::part(btn){--outer-corner-size: calc(var(--container-height) / 2);border-radius:var(--inner-corner-size);transition:border-radius var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial),var(--ripple-transition)}.btn-group-connected>.btn.btn-xs,.btn-group-connected>.btn:is([size=xs],.btn-xs)::part(btn),.btn-group-connected>*::part(btn).btn-xs,.btn-group-connected>*::part(btn):is([size=xs],.btn-xs)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-sm,.btn-group-connected>.btn:is([size=sm],.btn-sm)::part(btn),.btn-group-connected>*::part(btn).btn-sm,.btn-group-connected>*::part(btn):is([size=sm],.btn-sm)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-md,.btn-group-connected>.btn:is([size=md],.btn-md)::part(btn),.btn-group-connected>*::part(btn).btn-md,.btn-group-connected>*::part(btn):is([size=md],.btn-md)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-lg,.btn-group-connected>.btn:is([size=lg],.btn-lg)::part(btn),.btn-group-connected>*::part(btn).btn-lg,.btn-group-connected>*::part(btn):is([size=lg],.btn-lg)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected>.btn.btn-xl,.btn-group-connected>.btn:is([size=xl],.btn-xl)::part(btn),.btn-group-connected>*::part(btn).btn-xl,.btn-group-connected>*::part(btn):is([size=xl],.btn-xl)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--outer-corner-square-size)}.btn-group-connected>[size=xs][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xs.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>[size=sm][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-sm.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=md][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-md.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=lg][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-lg.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[size=xl][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xl.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg-increased)}.btn-group-connected>.btn:is(.btn-selected,[aria-pressed=true]),.btn-group-connected>:is([selected],[aria-pressed=true])::part(btn){--inner-corner-size: calc(var(--container-height) / 2);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected>.btn:active:not(:disabled,.disabled),.btn-group-connected>:active:not([disabled],[soft-disabled])::part(btn){--inner-corner-size: var(--pressed-inner-corner-size)}.btn-group-connected>.btn:is(:first-child,:nth-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:first-child,:nth-child(1 of :not([hidden]))):not(:only-child)::part(btn
|
|
5
|
+
){border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--inner-corner-size);border-end-end-radius:var(--inner-corner-size)}.btn-group-connected>.btn:is(:last-child,:nth-last-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:last-child,:nth-last-child(1 of :not([hidden]))):not(:only-child)::part(btn){border-start-start-radius:var(--inner-corner-size);border-end-start-radius:var(--inner-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group-connected>.btn:only-child,.btn-group-connected>:only-child::part(btn){border-radius:var(--outer-corner-size);border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group>.btn.btn-outlined:is(.btn-selected,[aria-pressed=true]),.btn-group>[color=outlined]:is([selected],[aria-pressed=true])::part(btn){--outline-color: transparent;border-color:rgba(0,0,0,0);background-color:var(--md-sys-color-inverse-surface);color:var(--md-sys-color-inverse-on-surface)}.btn-group-connected>.btn:is(.btn-xs,.btn-sm),.btn-group-connected>:is([size=xs],[size=sm]){min-inline-size:48px}.btn-group>.btn:focus-within,.btn-group>:focus-within{z-index:1}@supports(width: calc-size(auto, size)){.btn-group:not(.btn-group-connected)>.btn,.btn-group:not(.btn-group-connected)>*{transition:width var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial)}.btn-group:not(.btn-group-connected)>.btn:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>.btn:active:not([disabled],[soft-disabled]),.btn-group:not(.btn-group-connected)>*:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>*:active:not([disabled],[soft-disabled]){width:calc-size(auto,max(size,size*var(--pressed-item-width-multiplier)))}}.btn-group>.btn:is(.btn-xs,.btn-sm),.btn-group>:is([size=xs],[size=sm]){position:relative}.btn-group>.btn:is(.btn-xs,.btn-sm)::before,.btn-group>.btn:is(.btn-xs,.btn-sm)::part(btn)::before,.btn-group>:is([size=xs],[size=sm])::before,.btn-group>:is([size=xs],[size=sm])::part(btn)::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:48px;min-height:48px;z-index:0}@media(prefers-reduced-motion: reduce){.btn-group>.btn,.btn-group>*::part(btn),.btn-group>*{transition-duration:0s}}}/*# sourceMappingURL=button-group.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["button-group.scss","_button-group-tokens.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA,GAOA,kEAEA,4BACE,WCHA,qBACA,sCACA,gLAuBA,6CACA,mDACA,2DACA,uDACA,0DDxBE,oBACA,mBACA,yBACA,iBACA,gCAIF,6BAEE,mBACA,cACA,4BAIF,yDAEE,eCeF,sBDZE,mHCQF,sBDJE,mHCQF,sBDJE,mHCQF,qBDJE,mHCQF,qBDJE,mHCQF,qBDFA,qBACE,iBCKF,qBAUA,mDACA,2DAmBA,uDD9BE,kDCKF,mDACA,2DDFE,kDCMF,mDACA,2DDHE,kDCOF,mDACA,2DDJE,kDCQF,mDACA,2DDLE,kDCSF,6DACA,2DDJA,4DAEE,uDACA,uCACA,WACE,oHAIF,wMC1BF,mDACA,2DD8BE,wMC1BF,mDACA,2DD8BE,wMC1BF,mDACA,2DD8BE,wMC1BF,mDACA,2DD8BE,wMC1BF,6DACA,2DDgCA,mKAIE,qDAIF,+KAIE,mDAGF,+KAIE,mDAGF,+KAIE,mDAGF,+KAIE,mDAGF,+KAIE,6DAIF,oIAEE,uDACA,uDAIF,kIAEE,sDAIF;AAAA,MAQE,mDACA,iDACA,iDACA,+CAIF,2MAQE,mDACA,iDACA,iDACA,+CAIF,iFAEE,uCACA,mDACA,iDACA,iDACA,+CAIF,6IAGE,6BACA,2BACA,qDACA,6CAIF,4FAEE,qBAIF,sDAEE,UAIF,wCACE,iFAEE,8FAGA,gTAEE,2EASN,wEAEE,kBAEA,sMAEE,WACA,kBACA,QACA,SACA,gCACA,WACA,YACA,gBACA,UAKJ,uCACE,qDAGE","file":"button-group.css"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
// Generated stylesheet for ./labs/gb/components/buttongroup/button-group.css.
|
|
7
|
+
import { css } from 'lit';
|
|
8
|
+
export const styles = css `/*!
|
|
9
|
+
* Copyright 2026 Google LLC
|
|
10
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
*/@layer md.sys, md.comp.ripple, md.comp.focus-ring, md.comp.button;@layer md.comp.button-group{.btn-group{--between-space: 8px;--pressed-item-width-multiplier: 1.15;--motion-spring-fast-spatial: linear( 0, 0.099, 0.317, 0.561, 0.775, 0.934, 1.034, 1.083, 1.095, 1.084, 1.063, 1.04, 1.02, 1.005, 0.996, 0.992, 0.991, 0.992, 0.994, 0.996, 1 );--motion-spring-fast-spatial-duration: 350ms;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2);--outer-corner-square-size: var(--md-sys-shape-corner-sm);display:inline-flex;align-items:center;gap:var(--between-space);overflow:visible;interpolate-size:allow-keywords}.btn-group>.btn,.btn-group>*{white-space:nowrap;flex-shrink:0;min-inline-size:max-content}.btn-group-standard,.btn-group:not(.btn-group-connected){flex-wrap:wrap;--between-space: 12px}.btn-group-standard:has(>:is([size=xs],.btn-xs)),.btn-group:not(.btn-group-connected):has(>:is([size=xs],.btn-xs)){--between-space: 18px}.btn-group-standard:has(>:is([size=sm],.btn-sm)),.btn-group:not(.btn-group-connected):has(>:is([size=sm],.btn-sm)){--between-space: 12px}.btn-group-standard:has(>:is([size=md],.btn-md)),.btn-group:not(.btn-group-connected):has(>:is([size=md],.btn-md)){--between-space: 8px}.btn-group-standard:has(>:is([size=lg],.btn-lg)),.btn-group:not(.btn-group-connected):has(>:is([size=lg],.btn-lg)){--between-space: 8px}.btn-group-standard:has(>:is([size=xl],.btn-xl)),.btn-group:not(.btn-group-connected):has(>:is([size=xl],.btn-xl)){--between-space: 8px}.btn-group-connected{flex-wrap:nowrap;--between-space: 2px;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected:has(>:is([size=xs],.btn-xs)){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=sm],.btn-sm)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=md],.btn-md)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=lg],.btn-lg)){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected:has(>:is([size=xl],.btn-xl)){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>.btn,.btn-group-connected>*::part(btn){--outer-corner-size: calc(var(--container-height) / 2);border-radius:var(--inner-corner-size);transition:border-radius var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial),var(--ripple-transition)}.btn-group-connected>.btn.btn-xs,.btn-group-connected>.btn:is([size=xs],.btn-xs)::part(btn),.btn-group-connected>*::part(btn).btn-xs,.btn-group-connected>*::part(btn):is([size=xs],.btn-xs)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-sm,.btn-group-connected>.btn:is([size=sm],.btn-sm)::part(btn),.btn-group-connected>*::part(btn).btn-sm,.btn-group-connected>*::part(btn):is([size=sm],.btn-sm)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-md,.btn-group-connected>.btn:is([size=md],.btn-md)::part(btn),.btn-group-connected>*::part(btn).btn-md,.btn-group-connected>*::part(btn):is([size=md],.btn-md)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-lg,.btn-group-connected>.btn:is([size=lg],.btn-lg)::part(btn),.btn-group-connected>*::part(btn).btn-lg,.btn-group-connected>*::part(btn):is([size=lg],.btn-lg)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected>.btn.btn-xl,.btn-group-connected>.btn:is([size=xl],.btn-xl)::part(btn),.btn-group-connected>*::part(btn).btn-xl,.btn-group-connected>*::part(btn):is([size=xl],.btn-xl)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--outer-corner-square-size)}.btn-group-connected>[size=xs][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xs.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>[size=sm][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-sm.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=md][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-md.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=lg][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-lg.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[size=xl][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xl.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg-increased)}.btn-group-connected>.btn:is(.btn-selected,[aria-pressed=true]),.btn-group-connected>:is([selected],[aria-pressed=true])::part(btn){--inner-corner-size: calc(var(--container-height) / 2);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected>.btn:active:not(:disabled,.disabled),.btn-group-connected>:active:not([disabled],[soft-disabled])::part(btn){--inner-corner-size: var(--pressed-inner-corner-size)}.btn-group-connected>.btn:is(:first-child,:nth-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:first-child,:nth-child(1 of :not([hidden]))):not(:only-child)::part(btn
|
|
12
|
+
){border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--inner-corner-size);border-end-end-radius:var(--inner-corner-size)}.btn-group-connected>.btn:is(:last-child,:nth-last-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:last-child,:nth-last-child(1 of :not([hidden]))):not(:only-child)::part(btn){border-start-start-radius:var(--inner-corner-size);border-end-start-radius:var(--inner-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group-connected>.btn:only-child,.btn-group-connected>:only-child::part(btn){border-radius:var(--outer-corner-size);border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group>.btn.btn-outlined:is(.btn-selected,[aria-pressed=true]),.btn-group>[color=outlined]:is([selected],[aria-pressed=true])::part(btn){--outline-color: transparent;border-color:rgba(0,0,0,0);background-color:var(--md-sys-color-inverse-surface);color:var(--md-sys-color-inverse-on-surface)}.btn-group-connected>.btn:is(.btn-xs,.btn-sm),.btn-group-connected>:is([size=xs],[size=sm]){min-inline-size:48px}.btn-group>.btn:focus-within,.btn-group>:focus-within{z-index:1}@supports(width: calc-size(auto, size)){.btn-group:not(.btn-group-connected)>.btn,.btn-group:not(.btn-group-connected)>*{transition:width var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial)}.btn-group:not(.btn-group-connected)>.btn:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>.btn:active:not([disabled],[soft-disabled]),.btn-group:not(.btn-group-connected)>*:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>*:active:not([disabled],[soft-disabled]){width:calc-size(auto,max(size,size*var(--pressed-item-width-multiplier)))}}.btn-group>.btn:is(.btn-xs,.btn-sm),.btn-group>:is([size=xs],[size=sm]){position:relative}.btn-group>.btn:is(.btn-xs,.btn-sm)::before,.btn-group>.btn:is(.btn-xs,.btn-sm)::part(btn)::before,.btn-group>:is([size=xs],[size=sm])::before,.btn-group>:is([size=xs],[size=sm])::part(btn)::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:48px;min-height:48px;z-index:0}@media(prefers-reduced-motion: reduce){.btn-group>.btn,.btn-group>*::part(btn),.btn-group>*{transition-duration:0s}}}
|
|
13
|
+
`;
|
|
14
|
+
export default styles.styleSheet;
|
|
15
|
+
//# sourceMappingURL=button-group.cssresult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-group.cssresult.js","sourceRoot":"","sources":["button-group.cssresult.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,8EAA8E;AAC9E,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;CAKxB,CAAC;AACF,eAAe,MAAM,CAAC,UAAW,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n// Generated stylesheet for ./labs/gb/components/buttongroup/button-group.css.\nimport {css} from 'lit';\nexport const styles = css`/*!\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */@layer md.sys, md.comp.ripple, md.comp.focus-ring, md.comp.button;@layer md.comp.button-group{.btn-group{--between-space: 8px;--pressed-item-width-multiplier: 1.15;--motion-spring-fast-spatial: linear( 0, 0.099, 0.317, 0.561, 0.775, 0.934, 1.034, 1.083, 1.095, 1.084, 1.063, 1.04, 1.02, 1.005, 0.996, 0.992, 0.991, 0.992, 0.994, 0.996, 1 );--motion-spring-fast-spatial-duration: 350ms;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2);--outer-corner-square-size: var(--md-sys-shape-corner-sm);display:inline-flex;align-items:center;gap:var(--between-space);overflow:visible;interpolate-size:allow-keywords}.btn-group>.btn,.btn-group>*{white-space:nowrap;flex-shrink:0;min-inline-size:max-content}.btn-group-standard,.btn-group:not(.btn-group-connected){flex-wrap:wrap;--between-space: 12px}.btn-group-standard:has(>:is([size=xs],.btn-xs)),.btn-group:not(.btn-group-connected):has(>:is([size=xs],.btn-xs)){--between-space: 18px}.btn-group-standard:has(>:is([size=sm],.btn-sm)),.btn-group:not(.btn-group-connected):has(>:is([size=sm],.btn-sm)){--between-space: 12px}.btn-group-standard:has(>:is([size=md],.btn-md)),.btn-group:not(.btn-group-connected):has(>:is([size=md],.btn-md)){--between-space: 8px}.btn-group-standard:has(>:is([size=lg],.btn-lg)),.btn-group:not(.btn-group-connected):has(>:is([size=lg],.btn-lg)){--between-space: 8px}.btn-group-standard:has(>:is([size=xl],.btn-xl)),.btn-group:not(.btn-group-connected):has(>:is([size=xl],.btn-xl)){--between-space: 8px}.btn-group-connected{flex-wrap:nowrap;--between-space: 2px;--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected:has(>:is([size=xs],.btn-xs)){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=sm],.btn-sm)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=md],.btn-md)){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected:has(>:is([size=lg],.btn-lg)){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected:has(>:is([size=xl],.btn-xl)){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>.btn,.btn-group-connected>*::part(btn){--outer-corner-size: calc(var(--container-height) / 2);border-radius:var(--inner-corner-size);transition:border-radius var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial),var(--ripple-transition)}.btn-group-connected>.btn.btn-xs,.btn-group-connected>.btn:is([size=xs],.btn-xs)::part(btn),.btn-group-connected>*::part(btn).btn-xs,.btn-group-connected>*::part(btn):is([size=xs],.btn-xs)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-xs);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-sm,.btn-group-connected>.btn:is([size=sm],.btn-sm)::part(btn),.btn-group-connected>*::part(btn).btn-sm,.btn-group-connected>*::part(btn):is([size=sm],.btn-sm)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-md,.btn-group-connected>.btn:is([size=md],.btn-md)::part(btn),.btn-group-connected>*::part(btn).btn-md,.btn-group-connected>*::part(btn):is([size=md],.btn-md)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-sm);--pressed-inner-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>.btn.btn-lg,.btn-group-connected>.btn:is([size=lg],.btn-lg)::part(btn),.btn-group-connected>*::part(btn).btn-lg,.btn-group-connected>*::part(btn):is([size=lg],.btn-lg)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg);--pressed-inner-corner-size: var(--md-sys-shape-corner-md)}.btn-group-connected>.btn.btn-xl,.btn-group-connected>.btn:is([size=xl],.btn-xl)::part(btn),.btn-group-connected>*::part(btn).btn-xl,.btn-group-connected>*::part(btn):is([size=xl],.btn-xl)::part(btn){--inner-corner-size: var(--md-sys-shape-corner-lg-increased);--pressed-inner-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--outer-corner-square-size)}.btn-group-connected>[size=xs][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xs.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-xs)}.btn-group-connected>[size=sm][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-sm.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=md][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-md.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-sm)}.btn-group-connected>[size=lg][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-lg.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg)}.btn-group-connected>[size=xl][square]:not([selected]):not([aria-pressed=true])::part(btn),.btn-group-connected>.btn-xl.btn-square:not(.btn-selected):not([aria-pressed=true]){--outer-corner-size: var(--md-sys-shape-corner-lg-increased)}.btn-group-connected>.btn:is(.btn-selected,[aria-pressed=true]),.btn-group-connected>:is([selected],[aria-pressed=true])::part(btn){--inner-corner-size: calc(var(--container-height) / 2);--outer-corner-size: calc(var(--container-height) / 2)}.btn-group-connected>.btn:active:not(:disabled,.disabled),.btn-group-connected>:active:not([disabled],[soft-disabled])::part(btn){--inner-corner-size: var(--pressed-inner-corner-size)}.btn-group-connected>.btn:is(:first-child,:nth-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:first-child,:nth-child(1 of :not([hidden]))):not(:only-child)::part(btn\n ){border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--inner-corner-size);border-end-end-radius:var(--inner-corner-size)}.btn-group-connected>.btn:is(:last-child,:nth-last-child(1 of .btn:not([hidden]))):not(:only-child),.btn-group-connected>:is(:last-child,:nth-last-child(1 of :not([hidden]))):not(:only-child)::part(btn){border-start-start-radius:var(--inner-corner-size);border-end-start-radius:var(--inner-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group-connected>.btn:only-child,.btn-group-connected>:only-child::part(btn){border-radius:var(--outer-corner-size);border-start-start-radius:var(--outer-corner-size);border-end-start-radius:var(--outer-corner-size);border-start-end-radius:var(--outer-corner-size);border-end-end-radius:var(--outer-corner-size)}.btn-group>.btn.btn-outlined:is(.btn-selected,[aria-pressed=true]),.btn-group>[color=outlined]:is([selected],[aria-pressed=true])::part(btn){--outline-color: transparent;border-color:rgba(0,0,0,0);background-color:var(--md-sys-color-inverse-surface);color:var(--md-sys-color-inverse-on-surface)}.btn-group-connected>.btn:is(.btn-xs,.btn-sm),.btn-group-connected>:is([size=xs],[size=sm]){min-inline-size:48px}.btn-group>.btn:focus-within,.btn-group>:focus-within{z-index:1}@supports(width: calc-size(auto, size)){.btn-group:not(.btn-group-connected)>.btn,.btn-group:not(.btn-group-connected)>*{transition:width var(--motion-spring-fast-spatial-duration) var(--motion-spring-fast-spatial)}.btn-group:not(.btn-group-connected)>.btn:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>.btn:active:not([disabled],[soft-disabled]),.btn-group:not(.btn-group-connected)>*:active:not(:disabled,.disabled),.btn-group:not(.btn-group-connected)>*:active:not([disabled],[soft-disabled]){width:calc-size(auto,max(size,size*var(--pressed-item-width-multiplier)))}}.btn-group>.btn:is(.btn-xs,.btn-sm),.btn-group>:is([size=xs],[size=sm]){position:relative}.btn-group>.btn:is(.btn-xs,.btn-sm)::before,.btn-group>.btn:is(.btn-xs,.btn-sm)::part(btn)::before,.btn-group>:is([size=xs],[size=sm])::before,.btn-group>:is([size=xs],[size=sm])::part(btn)::before{content:\"\";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:48px;min-height:48px;z-index:0}@media(prefers-reduced-motion: reduce){.btn-group>.btn,.btn-group>*::part(btn),.btn-group>*{transition-duration:0s}}}\n`;\nexport default styles.styleSheet!;\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { type ClassInfo } from 'lit/directives/class-map.js';
|
|
7
|
+
/** Button group variant layout types. */
|
|
8
|
+
export type ButtonGroupVariant = 'standard' | 'connected';
|
|
9
|
+
/** Button group selection types. */
|
|
10
|
+
export type ButtonGroupSelection = 'none' | 'single' | 'multiple';
|
|
11
|
+
/** Button group variant layout configurations. */
|
|
12
|
+
export declare const BUTTON_GROUP_VARIANTS: {
|
|
13
|
+
readonly standard: "standard";
|
|
14
|
+
readonly connected: "connected";
|
|
15
|
+
};
|
|
16
|
+
/** Button group selection configurations. */
|
|
17
|
+
export declare const BUTTON_GROUP_SELECTIONS: {
|
|
18
|
+
readonly none: "none";
|
|
19
|
+
readonly single: "single";
|
|
20
|
+
readonly multiple: "multiple";
|
|
21
|
+
};
|
|
22
|
+
/** Button group classes. */
|
|
23
|
+
export declare const BUTTON_GROUP_CLASSES: {
|
|
24
|
+
btnGroup: string;
|
|
25
|
+
btnGroupStandard: string;
|
|
26
|
+
btnGroupConnected: string;
|
|
27
|
+
disabled: string;
|
|
28
|
+
};
|
|
29
|
+
/** The state provided to the `buttonGroupClasses()` function. */
|
|
30
|
+
export interface ButtonGroupClassesState {
|
|
31
|
+
/** The visual variant of the button group. Defaults to `'standard'`. */
|
|
32
|
+
variant?: ButtonGroupVariant;
|
|
33
|
+
/** Whether the button group is disabled. */
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the button group classes to apply to an element based on the given state.
|
|
38
|
+
*
|
|
39
|
+
* @param state The state of the button group.
|
|
40
|
+
* @return An object of class names and truthy values if they apply.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buttonGroupClasses({ variant, disabled, }?: ButtonGroupClassesState): ClassInfo;
|
|
43
|
+
/**
|
|
44
|
+
* A Lit directive that applies button group classes.
|
|
45
|
+
*/
|
|
46
|
+
export declare const buttonGroup: (state?: ButtonGroupClassesState & import("../shared/directives.js").AdditionalClasses) => import("lit-html/directive.js").DirectiveResult;
|
|
47
|
+
/**
|
|
48
|
+
* An item managed by a ButtonGroup.
|
|
49
|
+
*/
|
|
50
|
+
export interface ButtonGroupItem {
|
|
51
|
+
selected?: boolean;
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
softDisabled?: boolean;
|
|
54
|
+
href?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Checks if a ButtonGroupItem is selectable.
|
|
58
|
+
* Disabled, soft-disabled, or link items are not selectable.
|
|
59
|
+
*/
|
|
60
|
+
export declare function isItemSelectable(item: ButtonGroupItem): boolean;
|
|
61
|
+
/** Options provided to the `normalizeSelection()` function. */
|
|
62
|
+
export interface NormalizeSelectionOptions<T extends ButtonGroupItem = ButtonGroupItem> {
|
|
63
|
+
/** The selection mode. */
|
|
64
|
+
selection?: ButtonGroupSelection;
|
|
65
|
+
/** Whether selection is required in single-select mode. */
|
|
66
|
+
required?: boolean;
|
|
67
|
+
/** The item preferred to keep selected during normalization. */
|
|
68
|
+
preferred?: T;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Pure selection normalization logic for button groups.
|
|
72
|
+
*
|
|
73
|
+
* - In 'none' mode: clears all selected items.
|
|
74
|
+
* - In 'single' mode: enforces at most 1 item selected.
|
|
75
|
+
* - If preferred is given and selected, keeps preferred and clears others.
|
|
76
|
+
* - Otherwise keeps the last selected item and clears earlier ones.
|
|
77
|
+
* - If required is true and 0 items are selected, auto-selects the first selectable item.
|
|
78
|
+
* - In 'multiple' mode: items keep their selected states as is.
|
|
79
|
+
*
|
|
80
|
+
* Mutates `item.selected` in place.
|
|
81
|
+
*/
|
|
82
|
+
export declare function normalizeSelection<T extends ButtonGroupItem>(items: T[], options: NormalizeSelectionOptions<T>): void;
|
|
83
|
+
/** Options provided to the `shouldBlockToggle()` function. */
|
|
84
|
+
export interface ShouldBlockToggleOptions {
|
|
85
|
+
/** The selection mode. */
|
|
86
|
+
selection?: ButtonGroupSelection;
|
|
87
|
+
/** Whether selection is required in single-select mode. */
|
|
88
|
+
required?: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pure helper to determine if a toggle interaction on item `i` should be blocked.
|
|
92
|
+
*
|
|
93
|
+
* In required single-select mode, clicking an already selected button must not deselect it,
|
|
94
|
+
* ensuring exactly 1 item remains selected at all times.
|
|
95
|
+
*/
|
|
96
|
+
export declare function shouldBlockToggle(items: ButtonGroupItem[], i: number, options: ShouldBlockToggleOptions): boolean;
|