@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.
Files changed (189) hide show
  1. package/custom-elements.json +29543 -23432
  2. package/labs/aria/buttons/keyboard_click_handler.d.ts +25 -0
  3. package/labs/aria/buttons/keyboard_click_handler.js +74 -0
  4. package/labs/aria/buttons/keyboard_click_handler.js.map +1 -0
  5. package/labs/aria/buttons/md-aria-toggle.d.ts +29 -0
  6. package/labs/aria/buttons/md-aria-toggle.js +67 -0
  7. package/labs/aria/buttons/md-aria-toggle.js.map +1 -0
  8. package/labs/aria/buttons/toggle.d.ts +40 -0
  9. package/labs/aria/buttons/toggle.js +100 -0
  10. package/labs/aria/buttons/toggle.js.map +1 -0
  11. package/labs/aria/menu/fieldset.d.ts +36 -0
  12. package/labs/aria/menu/fieldset.js +103 -0
  13. package/labs/aria/menu/fieldset.js.map +1 -0
  14. package/labs/aria/menu/internal.d.ts +15 -0
  15. package/labs/aria/menu/internal.js +16 -0
  16. package/labs/aria/menu/internal.js.map +1 -0
  17. package/labs/aria/menu/md-aria-fieldset.d.ts +11 -0
  18. package/labs/aria/menu/md-aria-fieldset.js +8 -0
  19. package/labs/aria/menu/md-aria-fieldset.js.map +1 -0
  20. package/labs/aria/menu/md-aria-menubar.d.ts +11 -0
  21. package/labs/aria/menu/md-aria-menubar.js +8 -0
  22. package/labs/aria/menu/md-aria-menubar.js.map +1 -0
  23. package/labs/aria/menu/menubar.d.ts +15 -0
  24. package/labs/aria/menu/menubar.js +45 -0
  25. package/labs/aria/menu/menubar.js.map +1 -0
  26. package/labs/aria/menu/menuitem.d.ts +37 -4
  27. package/labs/aria/menu/menuitem.js +172 -21
  28. package/labs/aria/menu/menuitem.js.map +1 -1
  29. package/labs/aria/menu/menulist.d.ts +2 -6
  30. package/labs/aria/menu/menulist.js +12 -46
  31. package/labs/aria/menu/menulist.js.map +1 -1
  32. package/labs/aria/menu/shared-slotted-content.d.ts +10 -0
  33. package/labs/aria/menu/shared-slotted-content.js +51 -0
  34. package/labs/aria/menu/shared-slotted-content.js.map +1 -0
  35. package/labs/aria/pseudo-classes.d.ts +19 -0
  36. package/labs/aria/pseudo-classes.js +22 -0
  37. package/labs/aria/pseudo-classes.js.map +1 -0
  38. package/labs/aria/tabs/tab.js +5 -0
  39. package/labs/aria/tabs/tab.js.map +1 -1
  40. package/labs/gb/components/appbar/app-bar.css +1 -1
  41. package/labs/gb/components/appbar/app-bar.css.map +1 -1
  42. package/labs/gb/components/appbar/app-bar.cssresult.js +1 -1
  43. package/labs/gb/components/appbar/app-bar.cssresult.js.map +1 -1
  44. package/labs/gb/components/appbar/app-bar.scss +1 -0
  45. package/labs/gb/components/badge/badge.css +1 -1
  46. package/labs/gb/components/badge/badge.css.map +1 -1
  47. package/labs/gb/components/badge/badge.cssresult.js +1 -1
  48. package/labs/gb/components/badge/badge.cssresult.js.map +1 -1
  49. package/labs/gb/components/badge/badge.scss +1 -0
  50. package/labs/gb/components/button/button-element.d.ts +2 -0
  51. package/labs/gb/components/button/button-element.js +15 -2
  52. package/labs/gb/components/button/button-element.js.map +1 -1
  53. package/labs/gb/components/button/button.css +1 -1
  54. package/labs/gb/components/button/button.css.map +1 -1
  55. package/labs/gb/components/button/button.cssresult.js +1 -1
  56. package/labs/gb/components/button/button.cssresult.js.map +1 -1
  57. package/labs/gb/components/button/button.scss +1 -0
  58. package/labs/gb/components/buttongroup/_button-group-tokens.scss +123 -0
  59. package/labs/gb/components/buttongroup/button-group-element.d.ts +65 -0
  60. package/labs/gb/components/buttongroup/button-group-element.js +277 -0
  61. package/labs/gb/components/buttongroup/button-group-element.js.map +1 -0
  62. package/labs/gb/components/buttongroup/button-group.css +5 -0
  63. package/labs/gb/components/buttongroup/button-group.css.map +1 -0
  64. package/labs/gb/components/buttongroup/button-group.cssresult.d.ts +3 -0
  65. package/labs/gb/components/buttongroup/button-group.cssresult.js +15 -0
  66. package/labs/gb/components/buttongroup/button-group.cssresult.js.map +1 -0
  67. package/labs/gb/components/buttongroup/button-group.d.ts +96 -0
  68. package/labs/gb/components/buttongroup/button-group.js +105 -0
  69. package/labs/gb/components/buttongroup/button-group.js.map +1 -0
  70. package/labs/gb/components/buttongroup/button-group.scss +282 -0
  71. package/labs/gb/components/buttongroup/md-gb-button-group.d.ts +12 -0
  72. package/labs/gb/components/buttongroup/md-gb-button-group.js +8 -0
  73. package/labs/gb/components/buttongroup/md-gb-button-group.js.map +1 -0
  74. package/labs/gb/components/chip/chip.css +1 -1
  75. package/labs/gb/components/chip/chip.css.map +1 -1
  76. package/labs/gb/components/chip/chip.cssresult.js +1 -1
  77. package/labs/gb/components/chip/chip.cssresult.js.map +1 -1
  78. package/labs/gb/components/chip/chip.scss +1 -0
  79. package/labs/gb/components/fab/fab.css +1 -1
  80. package/labs/gb/components/fab/fab.css.map +1 -1
  81. package/labs/gb/components/fab/fab.cssresult.js +1 -1
  82. package/labs/gb/components/fab/fab.cssresult.js.map +1 -1
  83. package/labs/gb/components/fab/fab.scss +1 -0
  84. package/labs/gb/components/iconbutton/icon-button-element.d.ts +2 -0
  85. package/labs/gb/components/iconbutton/icon-button-element.js +15 -2
  86. package/labs/gb/components/iconbutton/icon-button-element.js.map +1 -1
  87. package/labs/gb/components/iconbutton/icon-button.css +1 -1
  88. package/labs/gb/components/iconbutton/icon-button.css.map +1 -1
  89. package/labs/gb/components/iconbutton/icon-button.cssresult.js +1 -1
  90. package/labs/gb/components/iconbutton/icon-button.cssresult.js.map +1 -1
  91. package/labs/gb/components/iconbutton/icon-button.scss +1 -0
  92. package/labs/gb/components/list/list.css +1 -1
  93. package/labs/gb/components/list/list.css.map +1 -1
  94. package/labs/gb/components/list/list.cssresult.js +1 -1
  95. package/labs/gb/components/list/list.cssresult.js.map +1 -1
  96. package/labs/gb/components/list/list.scss +1 -0
  97. package/labs/gb/components/menu/menu.css +1 -1
  98. package/labs/gb/components/menu/menu.css.map +1 -1
  99. package/labs/gb/components/menu/menu.cssresult.js +1 -1
  100. package/labs/gb/components/menu/menu.cssresult.js.map +1 -1
  101. package/labs/gb/components/menu/menu.scss +1 -0
  102. package/labs/gb/components/navbar/_nav-bar-tokens.scss +53 -0
  103. package/labs/gb/components/navbar/md-gb-nav-bar-item.d.ts +12 -0
  104. package/labs/gb/components/navbar/md-gb-nav-bar-item.js +10 -0
  105. package/labs/gb/components/navbar/md-gb-nav-bar-item.js.map +1 -0
  106. package/labs/gb/components/navbar/md-gb-nav-bar.d.ts +12 -0
  107. package/labs/gb/components/navbar/md-gb-nav-bar.js +10 -0
  108. package/labs/gb/components/navbar/md-gb-nav-bar.js.map +1 -0
  109. package/labs/gb/components/navbar/nav-bar-element.d.ts +58 -0
  110. package/labs/gb/components/navbar/nav-bar-element.js +116 -0
  111. package/labs/gb/components/navbar/nav-bar-element.js.map +1 -0
  112. package/labs/gb/components/navbar/nav-bar-item-element.d.ts +41 -0
  113. package/labs/gb/components/navbar/nav-bar-item-element.js +146 -0
  114. package/labs/gb/components/navbar/nav-bar-item-element.js.map +1 -0
  115. package/labs/gb/components/navbar/nav-bar.css +4 -0
  116. package/labs/gb/components/navbar/nav-bar.css.map +1 -0
  117. package/labs/gb/components/navbar/nav-bar.cssresult.d.ts +3 -0
  118. package/labs/gb/components/navbar/nav-bar.cssresult.js +14 -0
  119. package/labs/gb/components/navbar/nav-bar.cssresult.js.map +1 -0
  120. package/labs/gb/components/navbar/nav-bar.d.ts +86 -0
  121. package/labs/gb/components/navbar/nav-bar.js +92 -0
  122. package/labs/gb/components/navbar/nav-bar.js.map +1 -0
  123. package/labs/gb/components/navbar/nav-bar.scss +295 -0
  124. package/labs/gb/components/shared/pseudo-classes.d.ts +1 -7
  125. package/labs/gb/components/shared/pseudo-classes.js +1 -9
  126. package/labs/gb/components/shared/pseudo-classes.js.map +1 -1
  127. package/labs/gb/components/shared/update-class-list.d.ts +22 -0
  128. package/labs/gb/components/shared/update-class-list.js +26 -0
  129. package/labs/gb/components/shared/update-class-list.js.map +1 -0
  130. package/labs/gb/components/slider/_slider-tokens.scss +82 -0
  131. package/labs/gb/components/slider/md-gb-slider.d.ts +12 -0
  132. package/labs/gb/components/slider/md-gb-slider.js +8 -0
  133. package/labs/gb/components/slider/md-gb-slider.js.map +1 -0
  134. package/labs/gb/components/slider/slider-element.d.ts +145 -0
  135. package/labs/gb/components/slider/slider-element.js +934 -0
  136. package/labs/gb/components/slider/slider-element.js.map +1 -0
  137. package/labs/gb/components/slider/slider.css +1 -0
  138. package/labs/gb/components/slider/slider.css.map +1 -0
  139. package/labs/gb/components/slider/slider.cssresult.d.ts +3 -0
  140. package/labs/gb/components/slider/slider.cssresult.js +11 -0
  141. package/labs/gb/components/slider/slider.cssresult.js.map +1 -0
  142. package/labs/gb/components/slider/slider.d.ts +169 -0
  143. package/labs/gb/components/slider/slider.js +452 -0
  144. package/labs/gb/components/slider/slider.js.map +1 -0
  145. package/labs/gb/components/slider/slider.scss +661 -0
  146. package/labs/gb/components/tabs/_tabs-tokens.scss +177 -0
  147. package/labs/gb/components/tabs/md-gb-tab.d.ts +12 -0
  148. package/labs/gb/components/tabs/md-gb-tab.js +8 -0
  149. package/labs/gb/components/tabs/md-gb-tab.js.map +1 -0
  150. package/labs/gb/components/tabs/md-gb-tabs.d.ts +12 -0
  151. package/labs/gb/components/tabs/md-gb-tabs.js +8 -0
  152. package/labs/gb/components/tabs/md-gb-tabs.js.map +1 -0
  153. package/labs/gb/components/tabs/tab-element.d.ts +42 -0
  154. package/labs/gb/components/tabs/tab-element.js +75 -0
  155. package/labs/gb/components/tabs/tab-element.js.map +1 -0
  156. package/labs/gb/components/tabs/tabs-element.d.ts +37 -0
  157. package/labs/gb/components/tabs/tabs-element.js +67 -0
  158. package/labs/gb/components/tabs/tabs-element.js.map +1 -0
  159. package/labs/gb/components/tabs/tabs.css +4 -0
  160. package/labs/gb/components/tabs/tabs.css.map +1 -0
  161. package/labs/gb/components/tabs/tabs.cssresult.d.ts +3 -0
  162. package/labs/gb/components/tabs/tabs.cssresult.js +14 -0
  163. package/labs/gb/components/tabs/tabs.cssresult.js.map +1 -0
  164. package/labs/gb/components/tabs/tabs.d.ts +98 -0
  165. package/labs/gb/components/tabs/tabs.js +112 -0
  166. package/labs/gb/components/tabs/tabs.js.map +1 -0
  167. package/labs/gb/components/tabs/tabs.scss +301 -0
  168. package/labs/gb/components/toolbar/_toolbar-tokens.scss +70 -0
  169. package/labs/gb/components/toolbar/md-gb-toolbar.d.ts +12 -0
  170. package/labs/gb/components/toolbar/md-gb-toolbar.js +8 -0
  171. package/labs/gb/components/toolbar/md-gb-toolbar.js.map +1 -0
  172. package/labs/gb/components/toolbar/toolbar-element.d.ts +56 -0
  173. package/labs/gb/components/toolbar/toolbar-element.js +120 -0
  174. package/labs/gb/components/toolbar/toolbar-element.js.map +1 -0
  175. package/labs/gb/components/toolbar/toolbar.css +4 -0
  176. package/labs/gb/components/toolbar/toolbar.css.map +1 -0
  177. package/labs/gb/components/toolbar/toolbar.cssresult.d.ts +3 -0
  178. package/labs/gb/components/toolbar/toolbar.cssresult.js +14 -0
  179. package/labs/gb/components/toolbar/toolbar.cssresult.js.map +1 -0
  180. package/labs/gb/components/toolbar/toolbar.d.ts +56 -0
  181. package/labs/gb/components/toolbar/toolbar.js +60 -0
  182. package/labs/gb/components/toolbar/toolbar.js.map +1 -0
  183. package/labs/gb/components/toolbar/toolbar.scss +240 -0
  184. package/labs/gb/styles/tailwind.css +1 -1
  185. package/labs/gb/styles/tailwind.css.map +1 -1
  186. package/labs/gb/styles/tailwind.cssresult.js +1 -1
  187. package/labs/gb/styles/tailwind.cssresult.js.map +1 -1
  188. package/labs/gb/styles/tailwind.scss +2 -0
  189. 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,3 @@
1
+ export declare const styles: import("lit").CSSResult;
2
+ declare const _default: CSSStyleSheet;
3
+ export default _default;
@@ -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;