@material/web 2.5.1-nightly.b4de401.0 → 2.5.1-nightly.bd360db.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 (261) hide show
  1. package/button/internal/button.d.ts +10 -0
  2. package/button/internal/button.js +23 -2
  3. package/button/internal/button.js.map +1 -1
  4. package/chips/internal/assist-chip.d.ts +10 -0
  5. package/chips/internal/assist-chip.js +20 -1
  6. package/chips/internal/assist-chip.js.map +1 -1
  7. package/chips/internal/chip.js +3 -1
  8. package/chips/internal/chip.js.map +1 -1
  9. package/chips/internal/input-chip.d.ts +10 -0
  10. package/chips/internal/input-chip.js +20 -1
  11. package/chips/internal/input-chip.js.map +1 -1
  12. package/custom-elements.json +25295 -20106
  13. package/iconbutton/internal/icon-button.d.ts +10 -0
  14. package/iconbutton/internal/icon-button.js +21 -2
  15. package/iconbutton/internal/icon-button.js.map +1 -1
  16. package/internal/directives/safe-href.d.ts +23 -0
  17. package/internal/directives/safe-href.js +44 -0
  18. package/internal/directives/safe-href.js.map +1 -0
  19. package/labs/aria/buttons/keyboard_click_handler.d.ts +25 -0
  20. package/labs/aria/buttons/keyboard_click_handler.js +74 -0
  21. package/labs/aria/buttons/keyboard_click_handler.js.map +1 -0
  22. package/labs/aria/buttons/md-aria-toggle.d.ts +29 -0
  23. package/labs/aria/buttons/md-aria-toggle.js +67 -0
  24. package/labs/aria/buttons/md-aria-toggle.js.map +1 -0
  25. package/labs/aria/buttons/toggle.d.ts +40 -0
  26. package/labs/aria/buttons/toggle.js +100 -0
  27. package/labs/aria/buttons/toggle.js.map +1 -0
  28. package/labs/aria/command.d.ts +18 -0
  29. package/labs/aria/command.js +204 -0
  30. package/labs/aria/command.js.map +1 -0
  31. package/labs/aria/menu/fieldset.d.ts +36 -0
  32. package/labs/aria/menu/fieldset.js +103 -0
  33. package/labs/aria/menu/fieldset.js.map +1 -0
  34. package/labs/aria/menu/internal.d.ts +15 -0
  35. package/labs/aria/menu/internal.js +16 -0
  36. package/labs/aria/menu/internal.js.map +1 -0
  37. package/labs/aria/menu/md-aria-fieldset.d.ts +11 -0
  38. package/labs/aria/menu/md-aria-fieldset.js +8 -0
  39. package/labs/aria/menu/md-aria-fieldset.js.map +1 -0
  40. package/labs/aria/menu/md-aria-menuitem.d.ts +11 -0
  41. package/labs/aria/menu/md-aria-menuitem.js +8 -0
  42. package/labs/aria/menu/md-aria-menuitem.js.map +1 -0
  43. package/labs/aria/menu/md-aria-menulist.d.ts +11 -0
  44. package/labs/aria/menu/md-aria-menulist.js +8 -0
  45. package/labs/aria/menu/md-aria-menulist.js.map +1 -0
  46. package/labs/aria/menu/menuitem.d.ts +59 -0
  47. package/labs/aria/menu/menuitem.js +237 -0
  48. package/labs/aria/menu/menuitem.js.map +1 -0
  49. package/labs/aria/menu/menulist.d.ts +21 -0
  50. package/labs/aria/menu/menulist.js +102 -0
  51. package/labs/aria/menu/menulist.js.map +1 -0
  52. package/labs/aria/menu/shared-slotted-content.d.ts +10 -0
  53. package/labs/aria/menu/shared-slotted-content.js +51 -0
  54. package/labs/aria/menu/shared-slotted-content.js.map +1 -0
  55. package/labs/aria/pseudo-classes.d.ts +19 -0
  56. package/labs/aria/pseudo-classes.js +22 -0
  57. package/labs/aria/pseudo-classes.js.map +1 -0
  58. package/labs/aria/query-associated.d.ts +23 -0
  59. package/labs/aria/query-associated.js +36 -0
  60. package/labs/aria/query-associated.js.map +1 -0
  61. package/labs/aria/tabs/md-aria-tab.d.ts +11 -0
  62. package/labs/aria/tabs/md-aria-tab.js +8 -0
  63. package/labs/aria/tabs/md-aria-tab.js.map +1 -0
  64. package/labs/aria/tabs/md-aria-tablist.d.ts +11 -0
  65. package/labs/aria/tabs/md-aria-tablist.js +8 -0
  66. package/labs/aria/tabs/md-aria-tablist.js.map +1 -0
  67. package/labs/aria/tabs/md-aria-tabpanel.d.ts +11 -0
  68. package/labs/aria/tabs/md-aria-tabpanel.js +8 -0
  69. package/labs/aria/tabs/md-aria-tabpanel.js.map +1 -0
  70. package/labs/aria/tabs/tab.d.ts +33 -0
  71. package/labs/aria/tabs/tab.js +93 -0
  72. package/labs/aria/tabs/tab.js.map +1 -0
  73. package/labs/aria/tabs/tablist.d.ts +65 -0
  74. package/labs/aria/tabs/tablist.js +206 -0
  75. package/labs/aria/tabs/tablist.js.map +1 -0
  76. package/labs/aria/tabs/tabpanel.d.ts +26 -0
  77. package/labs/aria/tabs/tabpanel.js +53 -0
  78. package/labs/aria/tabs/tabpanel.js.map +1 -0
  79. package/labs/gb/components/appbar/_app-bar-tokens.scss +136 -0
  80. package/labs/gb/components/appbar/app-bar-element.d.ts +54 -0
  81. package/labs/gb/components/appbar/app-bar-element.js +145 -0
  82. package/labs/gb/components/appbar/app-bar-element.js.map +1 -0
  83. package/labs/gb/components/appbar/app-bar.css +4 -0
  84. package/labs/gb/components/appbar/app-bar.css.map +1 -0
  85. package/labs/gb/components/appbar/app-bar.cssresult.d.ts +3 -0
  86. package/labs/gb/components/appbar/app-bar.cssresult.js +14 -0
  87. package/labs/gb/components/appbar/app-bar.cssresult.js.map +1 -0
  88. package/labs/gb/components/appbar/app-bar.d.ts +71 -0
  89. package/labs/gb/components/appbar/app-bar.js +96 -0
  90. package/labs/gb/components/appbar/app-bar.js.map +1 -0
  91. package/labs/gb/components/appbar/app-bar.scss +168 -0
  92. package/labs/gb/components/appbar/md-gb-app-bar.d.ts +12 -0
  93. package/labs/gb/components/appbar/md-gb-app-bar.js +8 -0
  94. package/labs/gb/components/appbar/md-gb-app-bar.js.map +1 -0
  95. package/labs/gb/components/badge/badge-element.d.ts +1 -0
  96. package/labs/gb/components/badge/badge-element.js +1 -0
  97. package/labs/gb/components/badge/badge-element.js.map +1 -1
  98. package/labs/gb/components/badge/badge.css +1 -1
  99. package/labs/gb/components/badge/badge.css.map +1 -1
  100. package/labs/gb/components/badge/badge.cssresult.js +1 -1
  101. package/labs/gb/components/badge/badge.cssresult.js.map +1 -1
  102. package/labs/gb/components/badge/badge.scss +1 -0
  103. package/labs/gb/components/button/_button-tokens.scss +28 -22
  104. package/labs/gb/components/button/button-element.d.ts +20 -5
  105. package/labs/gb/components/button/button-element.js +43 -8
  106. package/labs/gb/components/button/button-element.js.map +1 -1
  107. package/labs/gb/components/button/button.css +1 -1
  108. package/labs/gb/components/button/button.css.map +1 -1
  109. package/labs/gb/components/button/button.cssresult.js +1 -1
  110. package/labs/gb/components/button/button.cssresult.js.map +1 -1
  111. package/labs/gb/components/button/button.js +1 -1
  112. package/labs/gb/components/button/button.js.map +1 -1
  113. package/labs/gb/components/button/button.scss +5 -6
  114. package/labs/gb/components/card/card-element.d.ts +1 -0
  115. package/labs/gb/components/card/card-element.js +1 -0
  116. package/labs/gb/components/card/card-element.js.map +1 -1
  117. package/labs/gb/components/checkbox/checkbox-element.d.ts +1 -0
  118. package/labs/gb/components/checkbox/checkbox-element.js +1 -0
  119. package/labs/gb/components/checkbox/checkbox-element.js.map +1 -1
  120. package/labs/gb/components/chip/_chip-tokens.scss +167 -0
  121. package/labs/gb/components/chip/chip-element.d.ts +84 -0
  122. package/labs/gb/components/chip/chip-element.js +255 -0
  123. package/labs/gb/components/chip/chip-element.js.map +1 -0
  124. package/labs/gb/components/chip/chip.css +4 -0
  125. package/labs/gb/components/chip/chip.css.map +1 -0
  126. package/labs/gb/components/chip/chip.cssresult.d.ts +3 -0
  127. package/labs/gb/components/chip/chip.cssresult.js +14 -0
  128. package/labs/gb/components/chip/chip.cssresult.js.map +1 -0
  129. package/labs/gb/components/chip/chip.d.ts +77 -0
  130. package/labs/gb/components/chip/chip.js +99 -0
  131. package/labs/gb/components/chip/chip.js.map +1 -0
  132. package/labs/gb/components/chip/chip.scss +100 -0
  133. package/labs/gb/components/chip/md-gb-chip.d.ts +13 -0
  134. package/labs/gb/components/chip/md-gb-chip.js +9 -0
  135. package/labs/gb/components/chip/md-gb-chip.js.map +1 -0
  136. package/labs/gb/components/divider/divider-element.d.ts +1 -0
  137. package/labs/gb/components/divider/divider-element.js +1 -0
  138. package/labs/gb/components/divider/divider-element.js.map +1 -1
  139. package/labs/gb/components/fab/_fab-tokens.scss +4 -1
  140. package/labs/gb/components/fab/fab-element.d.ts +2 -0
  141. package/labs/gb/components/fab/fab-element.js +2 -0
  142. package/labs/gb/components/fab/fab-element.js.map +1 -1
  143. package/labs/gb/components/fab/fab.css +1 -1
  144. package/labs/gb/components/fab/fab.css.map +1 -1
  145. package/labs/gb/components/fab/fab.cssresult.js +1 -1
  146. package/labs/gb/components/fab/fab.cssresult.js.map +1 -1
  147. package/labs/gb/components/fab/fab.scss +2 -0
  148. package/labs/gb/components/iconbutton/_icon-button-tokens.scss +13 -4
  149. package/labs/gb/components/iconbutton/icon-button-element.d.ts +15 -1
  150. package/labs/gb/components/iconbutton/icon-button-element.js +38 -4
  151. package/labs/gb/components/iconbutton/icon-button-element.js.map +1 -1
  152. package/labs/gb/components/iconbutton/icon-button.css +1 -1
  153. package/labs/gb/components/iconbutton/icon-button.css.map +1 -1
  154. package/labs/gb/components/iconbutton/icon-button.cssresult.js +1 -1
  155. package/labs/gb/components/iconbutton/icon-button.cssresult.js.map +1 -1
  156. package/labs/gb/components/iconbutton/icon-button.js +1 -1
  157. package/labs/gb/components/iconbutton/icon-button.js.map +1 -1
  158. package/labs/gb/components/iconbutton/icon-button.scss +8 -0
  159. package/labs/gb/components/list/_list-tokens.scss +11 -14
  160. package/labs/gb/components/list/list-element.d.ts +1 -0
  161. package/labs/gb/components/list/list-element.js +1 -0
  162. package/labs/gb/components/list/list-element.js.map +1 -1
  163. package/labs/gb/components/list/list-item-element.d.ts +5 -0
  164. package/labs/gb/components/list/list-item-element.js +5 -0
  165. package/labs/gb/components/list/list-item-element.js.map +1 -1
  166. package/labs/gb/components/list/list.css +1 -1
  167. package/labs/gb/components/list/list.css.map +1 -1
  168. package/labs/gb/components/list/list.cssresult.js +1 -1
  169. package/labs/gb/components/list/list.cssresult.js.map +1 -1
  170. package/labs/gb/components/list/list.scss +6 -0
  171. package/labs/gb/components/menu/_menu-tokens.scss +45 -16
  172. package/labs/gb/components/menu/menu-element.d.ts +1 -0
  173. package/labs/gb/components/menu/menu-element.js +1 -0
  174. package/labs/gb/components/menu/menu-element.js.map +1 -1
  175. package/labs/gb/components/menu/menu-group-element.d.ts +1 -0
  176. package/labs/gb/components/menu/menu-group-element.js +1 -0
  177. package/labs/gb/components/menu/menu-group-element.js.map +1 -1
  178. package/labs/gb/components/menu/menu-item-element.d.ts +5 -1
  179. package/labs/gb/components/menu/menu-item-element.js +5 -1
  180. package/labs/gb/components/menu/menu-item-element.js.map +1 -1
  181. package/labs/gb/components/menu/menu.css +1 -1
  182. package/labs/gb/components/menu/menu.css.map +1 -1
  183. package/labs/gb/components/menu/menu.cssresult.js +1 -1
  184. package/labs/gb/components/menu/menu.cssresult.js.map +1 -1
  185. package/labs/gb/components/menu/menu.scss +4 -0
  186. package/labs/gb/components/radio/radio-element.d.ts +1 -0
  187. package/labs/gb/components/radio/radio-element.js +1 -0
  188. package/labs/gb/components/radio/radio-element.js.map +1 -1
  189. package/labs/gb/components/shared/pseudo-classes.d.ts +1 -7
  190. package/labs/gb/components/shared/pseudo-classes.js +1 -9
  191. package/labs/gb/components/shared/pseudo-classes.js.map +1 -1
  192. package/labs/gb/components/shared/update-class-list.d.ts +22 -0
  193. package/labs/gb/components/shared/update-class-list.js +26 -0
  194. package/labs/gb/components/shared/update-class-list.js.map +1 -0
  195. package/labs/gb/components/splitbutton/split-button-element.d.ts +1 -0
  196. package/labs/gb/components/splitbutton/split-button-element.js +1 -0
  197. package/labs/gb/components/splitbutton/split-button-element.js.map +1 -1
  198. package/labs/gb/components/switch/switch-element.d.ts +1 -0
  199. package/labs/gb/components/switch/switch-element.js +1 -0
  200. package/labs/gb/components/switch/switch-element.js.map +1 -1
  201. package/labs/gb/components/switch/switch.js +5 -2
  202. package/labs/gb/components/switch/switch.js.map +1 -1
  203. package/labs/gb/components/tabs/_tabs-tokens.scss +177 -0
  204. package/labs/gb/components/tabs/md-gb-tab.d.ts +12 -0
  205. package/labs/gb/components/tabs/md-gb-tab.js +8 -0
  206. package/labs/gb/components/tabs/md-gb-tab.js.map +1 -0
  207. package/labs/gb/components/tabs/md-gb-tabs.d.ts +12 -0
  208. package/labs/gb/components/tabs/md-gb-tabs.js +8 -0
  209. package/labs/gb/components/tabs/md-gb-tabs.js.map +1 -0
  210. package/labs/gb/components/tabs/tab-element.d.ts +42 -0
  211. package/labs/gb/components/tabs/tab-element.js +75 -0
  212. package/labs/gb/components/tabs/tab-element.js.map +1 -0
  213. package/labs/gb/components/tabs/tabs-element.d.ts +37 -0
  214. package/labs/gb/components/tabs/tabs-element.js +67 -0
  215. package/labs/gb/components/tabs/tabs-element.js.map +1 -0
  216. package/labs/gb/components/tabs/tabs.css +4 -0
  217. package/labs/gb/components/tabs/tabs.css.map +1 -0
  218. package/labs/gb/components/tabs/tabs.cssresult.d.ts +3 -0
  219. package/labs/gb/components/tabs/tabs.cssresult.js +14 -0
  220. package/labs/gb/components/tabs/tabs.cssresult.js.map +1 -0
  221. package/labs/gb/components/tabs/tabs.d.ts +98 -0
  222. package/labs/gb/components/tabs/tabs.js +112 -0
  223. package/labs/gb/components/tabs/tabs.js.map +1 -0
  224. package/labs/gb/components/tabs/tabs.scss +301 -0
  225. package/labs/gb/components/toolbar/_toolbar-tokens.scss +70 -0
  226. package/labs/gb/components/toolbar/md-gb-toolbar.d.ts +12 -0
  227. package/labs/gb/components/toolbar/md-gb-toolbar.js +8 -0
  228. package/labs/gb/components/toolbar/md-gb-toolbar.js.map +1 -0
  229. package/labs/gb/components/toolbar/toolbar-element.d.ts +56 -0
  230. package/labs/gb/components/toolbar/toolbar-element.js +120 -0
  231. package/labs/gb/components/toolbar/toolbar-element.js.map +1 -0
  232. package/labs/gb/components/toolbar/toolbar.css +4 -0
  233. package/labs/gb/components/toolbar/toolbar.css.map +1 -0
  234. package/labs/gb/components/toolbar/toolbar.cssresult.d.ts +3 -0
  235. package/labs/gb/components/toolbar/toolbar.cssresult.js +14 -0
  236. package/labs/gb/components/toolbar/toolbar.cssresult.js.map +1 -0
  237. package/labs/gb/components/toolbar/toolbar.d.ts +56 -0
  238. package/labs/gb/components/toolbar/toolbar.js +60 -0
  239. package/labs/gb/components/toolbar/toolbar.js.map +1 -0
  240. package/labs/gb/components/toolbar/toolbar.scss +240 -0
  241. package/labs/gb/styles/icon/icon-element.d.ts +1 -0
  242. package/labs/gb/styles/icon/icon-element.js +1 -0
  243. package/labs/gb/styles/icon/icon-element.js.map +1 -1
  244. package/labs/gb/styles/tailwind.css +1 -1
  245. package/labs/gb/styles/tailwind.css.map +1 -1
  246. package/labs/gb/styles/tailwind.cssresult.js +1 -1
  247. package/labs/gb/styles/tailwind.cssresult.js.map +1 -1
  248. package/labs/gb/styles/tailwind.scss +2 -0
  249. package/list/internal/listitem/list-item.d.ts +10 -0
  250. package/list/internal/listitem/list-item.js +20 -1
  251. package/list/internal/listitem/list-item.js.map +1 -1
  252. package/menu/internal/menuitem/menu-item.d.ts +10 -0
  253. package/menu/internal/menuitem/menu-item.js +20 -1
  254. package/menu/internal/menuitem/menu-item.js.map +1 -1
  255. package/package.json +2 -1
  256. package/radio/internal/single-selection-controller.js +4 -1
  257. package/radio/internal/single-selection-controller.js.map +1 -1
  258. package/testing/harness.js +3 -0
  259. package/testing/harness.js.map +1 -1
  260. package/types/command-event.d.ts +34 -0
  261. package/types/popover.d.ts +25 -0
@@ -44,6 +44,16 @@ export declare class IconButton extends iconButtonBaseClass {
44
44
  * Sets the underlying `HTMLAnchorElement`'s `target` attribute.
45
45
  */
46
46
  target: LinkTarget | '';
47
+ /**
48
+ * Sets the underlying `HTMLAnchorElement`'s `rel` attribute when `href` is
49
+ * set.
50
+ */
51
+ rel: string;
52
+ /**
53
+ * Sets the underlying `HTMLAnchorElement`'s `referrerpolicy` attribute when
54
+ * `href` is set.
55
+ */
56
+ referrerPolicy: string;
47
57
  /**
48
58
  * The `aria-label` of the button when the button is toggleable and selected.
49
59
  */
@@ -12,6 +12,7 @@ import { classMap } from 'lit/directives/class-map.js';
12
12
  import { literal, html as staticHtml } from 'lit/static-html.js';
13
13
  import { mixinDelegatesAria } from '../../internal/aria/delegate.js';
14
14
  import { isRtl } from '../../internal/controller/is-rtl.js';
15
+ import { safeHref } from '../../internal/directives/safe-href.js';
15
16
  import { afterDispatch, setupDispatchHooks, } from '../../internal/events/dispatch-hooks.js';
16
17
  import { mixinElementInternals } from '../../labs/behaviors/element-internals.js';
17
18
  import { mixinFormAssociated } from '../../labs/behaviors/form-associated.js';
@@ -54,6 +55,16 @@ export class IconButton extends iconButtonBaseClass {
54
55
  * Sets the underlying `HTMLAnchorElement`'s `target` attribute.
55
56
  */
56
57
  this.target = '';
58
+ /**
59
+ * Sets the underlying `HTMLAnchorElement`'s `rel` attribute when `href` is
60
+ * set.
61
+ */
62
+ this.rel = '';
63
+ /**
64
+ * Sets the underlying `HTMLAnchorElement`'s `referrerpolicy` attribute when
65
+ * `href` is set.
66
+ */
67
+ this.referrerPolicy = '';
57
68
  /**
58
69
  * The `aria-label` of the button when the button is toggleable and selected.
59
70
  */
@@ -96,7 +107,7 @@ export class IconButton extends iconButtonBaseClass {
96
107
  // Additionally, native change event is not an InputEvent.
97
108
  this.dispatchEvent(new Event('change', { bubbles: true }));
98
109
  });
99
- });
110
+ }, { capture: true });
100
111
  }
101
112
  willUpdate() {
102
113
  // Link buttons cannot be disabled or soft-disabled.
@@ -141,9 +152,11 @@ export class IconButton extends iconButtonBaseClass {
141
152
  <a
142
153
  class="link"
143
154
  id="link"
144
- href="${this.href}"
155
+ href=${safeHref(this.href)}
145
156
  download="${this.download || nothing}"
146
157
  target="${this.target || nothing}"
158
+ rel=${this.rel || nothing}
159
+ referrerpolicy=${this.referrerPolicy || nothing}
147
160
  aria-label="${ariaLabel || nothing}">
148
161
  ${this.renderTouchTarget()}
149
162
  </a>
@@ -205,6 +218,12 @@ __decorate([
205
218
  __decorate([
206
219
  property()
207
220
  ], IconButton.prototype, "target", void 0);
221
+ __decorate([
222
+ property()
223
+ ], IconButton.prototype, "rel", void 0);
224
+ __decorate([
225
+ property()
226
+ ], IconButton.prototype, "referrerPolicy", void 0);
208
227
  __decorate([
209
228
  property({ attribute: 'aria-label-selected' })
210
229
  ], IconButton.prototype, "ariaLabelSelected", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"icon-button.js","sourceRoot":"","sources":["icon-button.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {literal, html as staticHtml} from 'lit/static-html.js';\n\nimport {ARIAMixinStrict} from '../../internal/aria/aria.js';\nimport {mixinDelegatesAria} from '../../internal/aria/delegate.js';\nimport {isRtl} from '../../internal/controller/is-rtl.js';\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../internal/events/dispatch-hooks.js';\nimport {mixinElementInternals} from '../../labs/behaviors/element-internals.js';\nimport {mixinFormAssociated} from '../../labs/behaviors/form-associated.js';\nimport {mixinFormSubmitter} from '../../labs/behaviors/form-submitter.js';\n\ntype LinkTarget = '_blank' | '_parent' | '_self' | '_top';\n\n// Separate variable needed for closure.\nconst iconButtonBaseClass = mixinDelegatesAria(\n mixinFormSubmitter(mixinFormAssociated(mixinElementInternals(LitElement))),\n);\n\n/**\n * A button for rendering icons.\n *\n * @fires input {InputEvent} Dispatched when a toggle button toggles --bubbles\n * --composed\n * @fires change {Event} Dispatched when a toggle button toggles --bubbles\n */\nexport class IconButton extends iconButtonBaseClass {\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n /**\n * \"Soft-disables\" the icon button (disabled but still focusable).\n *\n * Use this when an icon button needs increased visibility when disabled. See\n * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_disabled_controls\n * for more guidance on when this is needed.\n */\n @property({type: Boolean, attribute: 'soft-disabled', reflect: true})\n softDisabled = false;\n\n /**\n * Flips the icon if it is in an RTL context at startup.\n */\n @property({type: Boolean, attribute: 'flip-icon-in-rtl'})\n flipIconInRtl = false;\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `href` resource attribute.\n */\n @property() href = '';\n\n /**\n * The filename to use when downloading the linked resource.\n * If not specified, the browser will determine a filename.\n * This is only applicable when the icon button is used as a link (`href` is set).\n */\n @property() download = '';\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `target` attribute.\n */\n @property() target: LinkTarget | '' = '';\n\n /**\n * The `aria-label` of the button when the button is toggleable and selected.\n */\n @property({attribute: 'aria-label-selected'}) ariaLabelSelected = '';\n\n /**\n * When true, the button will toggle between selected and unselected\n * states\n */\n @property({type: Boolean}) toggle = false;\n\n /**\n * Sets the selected state. When false, displays the default icon. When true,\n * displays the selected icon, or the default icon If no `slot=\"selected\"`\n * icon is provided.\n */\n @property({type: Boolean, reflect: true}) selected = false;\n\n @state() private flipIcon = isRtl(this, this.flipIconInRtl);\n\n constructor() {\n super();\n if (isServer) return;\n setupDispatchHooks(this, 'click');\n this.addEventListener('click', (event) => {\n // If the button is soft-disabled or a disabled link, we need to\n // explicitly prevent the click from propagating to other event listeners\n // as well as prevent the default action. This is because the underlying\n // `<button>` or `<a>` element is not actually `:disabled`.\n if (this.softDisabled || (this.disabled && this.href)) {\n event.stopImmediatePropagation();\n event.preventDefault();\n return;\n }\n\n // Save current selected state to toggle, since an external event listener\n // may also change the selected state on click.\n const wasSelected = this.selected;\n afterDispatch(event, () => {\n if (!this.toggle || this.disabled || event.defaultPrevented) {\n return;\n }\n\n this.selected = !wasSelected;\n this.dispatchEvent(\n new InputEvent('input', {bubbles: true, composed: true}),\n );\n // Bubbles but does not compose to mimic native browser <input> & <select>\n // Additionally, native change event is not an InputEvent.\n this.dispatchEvent(new Event('change', {bubbles: true}));\n });\n });\n }\n\n protected override willUpdate() {\n // Link buttons cannot be disabled or soft-disabled.\n if (this.href) {\n this.disabled = false;\n this.softDisabled = false;\n }\n }\n\n protected override render() {\n const tag = this.href ? literal`div` : literal`button`;\n // Needed for closure conformance\n const {ariaLabel, ariaHasPopup, ariaExpanded} = this as ARIAMixinStrict;\n const hasToggledAriaLabel = ariaLabel && this.ariaLabelSelected;\n const ariaPressedValue = !this.toggle ? nothing : this.selected;\n let ariaLabelValue: string | null | typeof nothing = nothing;\n if (!this.href) {\n ariaLabelValue =\n hasToggledAriaLabel && this.selected\n ? this.ariaLabelSelected\n : ariaLabel;\n }\n return staticHtml`<${tag}\n class=\"icon-button ${classMap(this.getRenderClasses())}\"\n id=\"button\"\n aria-label=\"${ariaLabelValue || nothing}\"\n aria-haspopup=\"${(!this.href && ariaHasPopup) || nothing}\"\n aria-expanded=\"${(!this.href && ariaExpanded) || nothing}\"\n aria-pressed=\"${ariaPressedValue}\"\n aria-disabled=${(!this.href && this.softDisabled) || nothing}\n ?disabled=\"${!this.href && this.disabled}\">\n ${this.renderFocusRing()}\n ${this.renderRipple()}\n ${!this.selected ? this.renderIcon() : nothing}\n ${this.selected ? this.renderSelectedIcon() : nothing}\n ${this.href ? this.renderLink() : this.renderTouchTarget()}\n </${tag}>`;\n }\n\n private renderLink() {\n // Needed for closure conformance\n const {ariaLabel} = this as ARIAMixinStrict;\n return html`\n <a\n class=\"link\"\n id=\"link\"\n href=\"${this.href}\"\n download=\"${this.download || nothing}\"\n target=\"${this.target || nothing}\"\n aria-label=\"${ariaLabel || nothing}\">\n ${this.renderTouchTarget()}\n </a>\n `;\n }\n\n protected getRenderClasses() {\n return {\n 'flip-icon': this.flipIcon,\n 'selected': this.toggle && this.selected,\n };\n }\n\n private renderIcon() {\n return html`<span class=\"icon\"><slot></slot></span>`;\n }\n\n private renderSelectedIcon() {\n // Use default slot as fallback to not require specifying multiple icons\n return html`<span class=\"icon icon--selected\"\n ><slot name=\"selected\"><slot></slot></slot\n ></span>`;\n }\n\n private renderTouchTarget() {\n return html`<span class=\"touch\"></span>`;\n }\n\n private renderFocusRing() {\n // TODO(b/310046938): use the same id for both elements\n return html`<md-focus-ring\n part=\"focus-ring\"\n for=${this.href ? 'link' : 'button'}></md-focus-ring>`;\n }\n\n private renderRipple() {\n const isRippleDisabled = !this.href && (this.disabled || this.softDisabled);\n // TODO(b/310046938): use the same id for both elements\n return html`<md-ripple\n for=${this.href ? 'link' : nothing}\n ?disabled=\"${isRippleDisabled}\"></md-ripple>`;\n }\n\n override connectedCallback() {\n this.flipIcon = isRtl(this, this.flipIconInRtl);\n super.connectedCallback();\n }\n}\n"]}
1
+ {"version":3,"file":"icon-button.js","sourceRoot":"","sources":["icon-button.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport '../../focus/md-focus-ring.js';\nimport '../../ripple/ripple.js';\n\nimport {html, isServer, LitElement, nothing} from 'lit';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\nimport {literal, html as staticHtml} from 'lit/static-html.js';\n\nimport {ARIAMixinStrict} from '../../internal/aria/aria.js';\nimport {mixinDelegatesAria} from '../../internal/aria/delegate.js';\nimport {isRtl} from '../../internal/controller/is-rtl.js';\nimport {safeHref} from '../../internal/directives/safe-href.js';\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../internal/events/dispatch-hooks.js';\nimport {mixinElementInternals} from '../../labs/behaviors/element-internals.js';\nimport {mixinFormAssociated} from '../../labs/behaviors/form-associated.js';\nimport {mixinFormSubmitter} from '../../labs/behaviors/form-submitter.js';\n\ntype LinkTarget = '_blank' | '_parent' | '_self' | '_top';\n\n// Separate variable needed for closure.\nconst iconButtonBaseClass = mixinDelegatesAria(\n mixinFormSubmitter(mixinFormAssociated(mixinElementInternals(LitElement))),\n);\n\n/**\n * A button for rendering icons.\n *\n * @fires input {InputEvent} Dispatched when a toggle button toggles --bubbles\n * --composed\n * @fires change {Event} Dispatched when a toggle button toggles --bubbles\n */\nexport class IconButton extends iconButtonBaseClass {\n /** @nocollapse */\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n /**\n * \"Soft-disables\" the icon button (disabled but still focusable).\n *\n * Use this when an icon button needs increased visibility when disabled. See\n * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_disabled_controls\n * for more guidance on when this is needed.\n */\n @property({type: Boolean, attribute: 'soft-disabled', reflect: true})\n softDisabled = false;\n\n /**\n * Flips the icon if it is in an RTL context at startup.\n */\n @property({type: Boolean, attribute: 'flip-icon-in-rtl'})\n flipIconInRtl = false;\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `href` resource attribute.\n */\n @property() href = '';\n\n /**\n * The filename to use when downloading the linked resource.\n * If not specified, the browser will determine a filename.\n * This is only applicable when the icon button is used as a link (`href` is set).\n */\n @property() download = '';\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `target` attribute.\n */\n @property() target: LinkTarget | '' = '';\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `rel` attribute when `href` is\n * set.\n */\n @property() rel = '';\n\n /**\n * Sets the underlying `HTMLAnchorElement`'s `referrerpolicy` attribute when\n * `href` is set.\n */\n @property() referrerPolicy = '';\n\n /**\n * The `aria-label` of the button when the button is toggleable and selected.\n */\n @property({attribute: 'aria-label-selected'}) ariaLabelSelected = '';\n\n /**\n * When true, the button will toggle between selected and unselected\n * states\n */\n @property({type: Boolean}) toggle = false;\n\n /**\n * Sets the selected state. When false, displays the default icon. When true,\n * displays the selected icon, or the default icon If no `slot=\"selected\"`\n * icon is provided.\n */\n @property({type: Boolean, reflect: true}) selected = false;\n\n @state() private flipIcon = isRtl(this, this.flipIconInRtl);\n\n constructor() {\n super();\n if (isServer) return;\n setupDispatchHooks(this, 'click');\n this.addEventListener(\n 'click',\n (event) => {\n // If the button is soft-disabled or a disabled link, we need to\n // explicitly prevent the click from propagating to other event listeners\n // as well as prevent the default action. This is because the underlying\n // `<button>` or `<a>` element is not actually `:disabled`.\n if (this.softDisabled || (this.disabled && this.href)) {\n event.stopImmediatePropagation();\n event.preventDefault();\n return;\n }\n\n // Save current selected state to toggle, since an external event listener\n // may also change the selected state on click.\n const wasSelected = this.selected;\n afterDispatch(event, () => {\n if (!this.toggle || this.disabled || event.defaultPrevented) {\n return;\n }\n\n this.selected = !wasSelected;\n this.dispatchEvent(\n new InputEvent('input', {bubbles: true, composed: true}),\n );\n // Bubbles but does not compose to mimic native browser <input> & <select>\n // Additionally, native change event is not an InputEvent.\n this.dispatchEvent(new Event('change', {bubbles: true}));\n });\n },\n {capture: true},\n );\n }\n\n protected override willUpdate() {\n // Link buttons cannot be disabled or soft-disabled.\n if (this.href) {\n this.disabled = false;\n this.softDisabled = false;\n }\n }\n\n protected override render() {\n const tag = this.href ? literal`div` : literal`button`;\n // Needed for closure conformance\n const {ariaLabel, ariaHasPopup, ariaExpanded} = this as ARIAMixinStrict;\n const hasToggledAriaLabel = ariaLabel && this.ariaLabelSelected;\n const ariaPressedValue = !this.toggle ? nothing : this.selected;\n let ariaLabelValue: string | null | typeof nothing = nothing;\n if (!this.href) {\n ariaLabelValue =\n hasToggledAriaLabel && this.selected\n ? this.ariaLabelSelected\n : ariaLabel;\n }\n return staticHtml`<${tag}\n class=\"icon-button ${classMap(this.getRenderClasses())}\"\n id=\"button\"\n aria-label=\"${ariaLabelValue || nothing}\"\n aria-haspopup=\"${(!this.href && ariaHasPopup) || nothing}\"\n aria-expanded=\"${(!this.href && ariaExpanded) || nothing}\"\n aria-pressed=\"${ariaPressedValue}\"\n aria-disabled=${(!this.href && this.softDisabled) || nothing}\n ?disabled=\"${!this.href && this.disabled}\">\n ${this.renderFocusRing()}\n ${this.renderRipple()}\n ${!this.selected ? this.renderIcon() : nothing}\n ${this.selected ? this.renderSelectedIcon() : nothing}\n ${this.href ? this.renderLink() : this.renderTouchTarget()}\n </${tag}>`;\n }\n\n private renderLink() {\n // Needed for closure conformance\n const {ariaLabel} = this as ARIAMixinStrict;\n return html`\n <a\n class=\"link\"\n id=\"link\"\n href=${safeHref(this.href)}\n download=\"${this.download || nothing}\"\n target=\"${this.target || nothing}\"\n rel=${this.rel || nothing}\n referrerpolicy=${this.referrerPolicy || nothing}\n aria-label=\"${ariaLabel || nothing}\">\n ${this.renderTouchTarget()}\n </a>\n `;\n }\n\n protected getRenderClasses() {\n return {\n 'flip-icon': this.flipIcon,\n 'selected': this.toggle && this.selected,\n };\n }\n\n private renderIcon() {\n return html`<span class=\"icon\"><slot></slot></span>`;\n }\n\n private renderSelectedIcon() {\n // Use default slot as fallback to not require specifying multiple icons\n return html`<span class=\"icon icon--selected\"\n ><slot name=\"selected\"><slot></slot></slot\n ></span>`;\n }\n\n private renderTouchTarget() {\n return html`<span class=\"touch\"></span>`;\n }\n\n private renderFocusRing() {\n // TODO(b/310046938): use the same id for both elements\n return html`<md-focus-ring\n part=\"focus-ring\"\n for=${this.href ? 'link' : 'button'}></md-focus-ring>`;\n }\n\n private renderRipple() {\n const isRippleDisabled = !this.href && (this.disabled || this.softDisabled);\n // TODO(b/310046938): use the same id for both elements\n return html`<md-ripple\n for=${this.href ? 'link' : nothing}\n ?disabled=\"${isRippleDisabled}\"></md-ripple>`;\n }\n\n override connectedCallback() {\n this.flipIcon = isRtl(this, this.flipIconInRtl);\n super.connectedCallback();\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { noChange, nothing } from 'lit';
7
+ import { type AttributePart, Directive, type DirectiveParameters, type PartInfo } from 'lit/directive.js';
8
+ /**
9
+ * A Lit directive that sanitizes URLs for href attributes and properties.
10
+ */
11
+ export declare class SafeHrefDirective extends Directive {
12
+ constructor(partInfo: PartInfo);
13
+ render(value?: string | null | undefined | typeof nothing): string | typeof nothing;
14
+ update(part: AttributePart, [value]: DirectiveParameters<SafeHrefDirective>): typeof noChange | typeof nothing;
15
+ }
16
+ /**
17
+ * A Lit directive that sanitizes URLs for `href` attribute and property
18
+ * bindings.
19
+ *
20
+ * @param value The URL value to sanitize.
21
+ * @return A directive result that renders the sanitized URL or `nothing`.
22
+ */
23
+ export declare const safeHref: (value?: string | typeof nothing) => import("lit-html/directive.js").DirectiveResult<typeof SafeHrefDirective>;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { noChange, nothing } from 'lit';
7
+ import { directive, Directive, PartType, } from 'lit/directive.js';
8
+ import { setAnchorHref } from 'safevalues/dom';
9
+ /**
10
+ * A Lit directive that sanitizes URLs for href attributes and properties.
11
+ */
12
+ export class SafeHrefDirective extends Directive {
13
+ constructor(partInfo) {
14
+ super(partInfo);
15
+ if (partInfo.type !== PartType.ATTRIBUTE &&
16
+ partInfo.type !== PartType.PROPERTY) {
17
+ throw new Error('safeHref can only be used on attribute or property bindings');
18
+ }
19
+ if (partInfo.name !== 'href') {
20
+ throw new Error('safeHref() directive can only be used on "href" attribute or property bindings.');
21
+ }
22
+ }
23
+ render(value) {
24
+ return value || nothing;
25
+ }
26
+ update(part, [value]) {
27
+ const element = part.element;
28
+ element.removeAttribute('href');
29
+ if (!value || value === nothing) {
30
+ return nothing;
31
+ }
32
+ setAnchorHref(element, value);
33
+ return noChange;
34
+ }
35
+ }
36
+ /**
37
+ * A Lit directive that sanitizes URLs for `href` attribute and property
38
+ * bindings.
39
+ *
40
+ * @param value The URL value to sanitize.
41
+ * @return A directive result that renders the sanitized URL or `nothing`.
42
+ */
43
+ export const safeHref = directive(SafeHrefDirective);
44
+ //# sourceMappingURL=safe-href.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-href.js","sourceRoot":"","sources":["safe-href.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,KAAK,CAAC;AACtC,OAAO,EAEL,SAAS,EACT,SAAS,EAGT,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C,YAAY,QAAkB;QAC5B,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IACE,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS;YACpC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,EACnC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CACJ,KAAkD;QAElD,OAAO,KAAK,IAAI,OAAO,CAAC;IAC1B,CAAC;IAEQ,MAAM,CACb,IAAmB,EACnB,CAAC,KAAK,CAAyC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAA4B,CAAC;QAClD,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {noChange, nothing} from 'lit';\nimport {\n type AttributePart,\n directive,\n Directive,\n type DirectiveParameters,\n type PartInfo,\n PartType,\n} from 'lit/directive.js';\nimport {setAnchorHref} from 'safevalues/dom';\n\n/**\n * A Lit directive that sanitizes URLs for href attributes and properties.\n */\nexport class SafeHrefDirective extends Directive {\n constructor(partInfo: PartInfo) {\n super(partInfo);\n if (\n partInfo.type !== PartType.ATTRIBUTE &&\n partInfo.type !== PartType.PROPERTY\n ) {\n throw new Error(\n 'safeHref can only be used on attribute or property bindings',\n );\n }\n if (partInfo.name !== 'href') {\n throw new Error(\n 'safeHref() directive can only be used on \"href\" attribute or property bindings.',\n );\n }\n }\n\n render(\n value?: string | null | undefined | typeof nothing,\n ): string | typeof nothing {\n return value || nothing;\n }\n\n override update(\n part: AttributePart,\n [value]: DirectiveParameters<SafeHrefDirective>,\n ) {\n const element = part.element as HTMLAnchorElement;\n element.removeAttribute('href');\n if (!value || value === nothing) {\n return nothing;\n }\n setAnchorHref(element, value);\n return noChange;\n }\n}\n\n/**\n * A Lit directive that sanitizes URLs for `href` attribute and property\n * bindings.\n *\n * @param value The URL value to sanitize.\n * @return A directive result that renders the sanitized URL or `nothing`.\n */\nexport const safeHref = directive(SafeHrefDirective);\n"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Options for configuring keyboard click handling.
8
+ */
9
+ export interface KeyboardClickHandlerOptions {
10
+ /**
11
+ * Optional function to determine if the element is disabled.
12
+ *
13
+ * Defaults to checking for disabled attributes or pseudo-classes.
14
+ */
15
+ isDisabled?: () => boolean;
16
+ }
17
+ /**
18
+ * Sets up button-like keyboard click activation for an element (Enter on
19
+ * keydown, Space on keyup).
20
+ *
21
+ * @param element The target HTMLElement.
22
+ * @param options Additional setup options.
23
+ * @return A cleanup function that removes all registered listeners.
24
+ */
25
+ export declare function setupKeyboardClickHandler(element: HTMLElement, options?: KeyboardClickHandlerOptions): () => void;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { afterDispatch, setupDispatchHooks, } from '../../../internal/events/dispatch-hooks.js';
7
+ import { isDisabled as defaultIsDisabled } from '../pseudo-classes.js';
8
+ /**
9
+ * Sets up button-like keyboard click activation for an element (Enter on
10
+ * keydown, Space on keyup).
11
+ *
12
+ * @param element The target HTMLElement.
13
+ * @param options Additional setup options.
14
+ * @return A cleanup function that removes all registered listeners.
15
+ */
16
+ export function setupKeyboardClickHandler(element, options) {
17
+ const isDisabled = options?.isDisabled ?? (() => defaultIsDisabled(element));
18
+ // Tracks whether Space was pressed down on this element.
19
+ let isSpacePressed = false;
20
+ // Intercepts event dispatch to allow `afterDispatch` callbacks to run after
21
+ // the event has completely finished bubbling.
22
+ setupDispatchHooks(element, 'keydown', 'keyup');
23
+ const isSpace = (event) => event.key === ' ';
24
+ const isEnter = (event) => event.key === 'Enter';
25
+ const onKeyDown = (event) => {
26
+ if (!(isSpace(event) || isEnter(event)) || isDisabled()) {
27
+ return;
28
+ }
29
+ // Defer activation until after dispatch so keydown listeners can cancel
30
+ // via preventDefault().
31
+ afterDispatch(event, () => {
32
+ if (event.defaultPrevented) {
33
+ return;
34
+ }
35
+ if (isSpace(event)) {
36
+ // Space activates on keyup, record that it is currently pressed.
37
+ isSpacePressed = true;
38
+ // Space natively scrolls the page unless prevented synchronously on
39
+ // keydown.
40
+ event.preventDefault();
41
+ }
42
+ else if (isEnter(event)) {
43
+ // Enter activates on keydown.
44
+ element.click();
45
+ }
46
+ });
47
+ };
48
+ const onKeyUp = (event) => {
49
+ if (!isSpace(event) || isDisabled()) {
50
+ return;
51
+ }
52
+ // Space activates on keyup. Defer click until after dispatch so keyup
53
+ // listeners can cancel via preventDefault().
54
+ afterDispatch(event, () => {
55
+ const wasSpacePressed = isSpacePressed;
56
+ isSpacePressed = false;
57
+ if (!event.defaultPrevented && wasSpacePressed) {
58
+ element.click();
59
+ }
60
+ });
61
+ };
62
+ // Reset pressed state if focus leaves the element before keyup.
63
+ const onBlur = () => {
64
+ isSpacePressed = false;
65
+ };
66
+ const controller = new AbortController();
67
+ element.addEventListener('keydown', onKeyDown, { signal: controller.signal });
68
+ element.addEventListener('keyup', onKeyUp, { signal: controller.signal });
69
+ element.addEventListener('blur', onBlur, { signal: controller.signal });
70
+ return () => {
71
+ controller.abort();
72
+ };
73
+ }
74
+ //# sourceMappingURL=keyboard_click_handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard_click_handler.js","sourceRoot":"","sources":["keyboard_click_handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,GACnB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAC,UAAU,IAAI,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAcrE;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAoB,EACpB,OAAqC;IAErC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7E,yDAAyD;IACzD,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,4EAA4E;IAC5E,8CAA8C;IAC9C,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;IAC5D,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC;IAEhE,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;QACzC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,wBAAwB;QACxB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE;YACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,iEAAiE;gBACjE,cAAc,GAAG,IAAI,CAAC;gBACtB,oEAAoE;gBACpE,WAAW;gBACX,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,8BAA8B;gBAC9B,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE;QACvC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,sEAAsE;QACtE,6CAA6C;QAC7C,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE;YACxB,MAAM,eAAe,GAAG,cAAc,CAAC;YACvC,cAAc,GAAG,KAAK,CAAC;YAEvB,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,eAAe,EAAE,CAAC;gBAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,gEAAgE;IAChE,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,cAAc,GAAG,KAAK,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;IACxE,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;IAEtE,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../../internal/events/dispatch-hooks.js';\nimport {isDisabled as defaultIsDisabled} from '../pseudo-classes.js';\n\n/**\n * Options for configuring keyboard click handling.\n */\nexport interface KeyboardClickHandlerOptions {\n /**\n * Optional function to determine if the element is disabled.\n *\n * Defaults to checking for disabled attributes or pseudo-classes.\n */\n isDisabled?: () => boolean;\n}\n\n/**\n * Sets up button-like keyboard click activation for an element (Enter on\n * keydown, Space on keyup).\n *\n * @param element The target HTMLElement.\n * @param options Additional setup options.\n * @return A cleanup function that removes all registered listeners.\n */\nexport function setupKeyboardClickHandler(\n element: HTMLElement,\n options?: KeyboardClickHandlerOptions,\n): () => void {\n const isDisabled = options?.isDisabled ?? (() => defaultIsDisabled(element));\n\n // Tracks whether Space was pressed down on this element.\n let isSpacePressed = false;\n\n // Intercepts event dispatch to allow `afterDispatch` callbacks to run after\n // the event has completely finished bubbling.\n setupDispatchHooks(element, 'keydown', 'keyup');\n\n const isSpace = (event: KeyboardEvent) => event.key === ' ';\n const isEnter = (event: KeyboardEvent) => event.key === 'Enter';\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!(isSpace(event) || isEnter(event)) || isDisabled()) {\n return;\n }\n\n // Defer activation until after dispatch so keydown listeners can cancel\n // via preventDefault().\n afterDispatch(event, () => {\n if (event.defaultPrevented) {\n return;\n }\n\n if (isSpace(event)) {\n // Space activates on keyup, record that it is currently pressed.\n isSpacePressed = true;\n // Space natively scrolls the page unless prevented synchronously on\n // keydown.\n event.preventDefault();\n } else if (isEnter(event)) {\n // Enter activates on keydown.\n element.click();\n }\n });\n };\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isSpace(event) || isDisabled()) {\n return;\n }\n\n // Space activates on keyup. Defer click until after dispatch so keyup\n // listeners can cancel via preventDefault().\n afterDispatch(event, () => {\n const wasSpacePressed = isSpacePressed;\n isSpacePressed = false;\n\n if (!event.defaultPrevented && wasSpacePressed) {\n element.click();\n }\n });\n };\n\n // Reset pressed state if focus leaves the element before keyup.\n const onBlur = () => {\n isSpacePressed = false;\n };\n\n const controller = new AbortController();\n element.addEventListener('keydown', onKeyDown, {signal: controller.signal});\n element.addEventListener('keyup', onKeyUp, {signal: controller.signal});\n element.addEventListener('blur', onBlur, {signal: controller.signal});\n\n return () => {\n controller.abort();\n };\n}\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CSSResultGroup } from 'lit';
7
+ import { AriaToggleElement } from './toggle.js';
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ /** An ARIA toggle button element. */
11
+ 'md-aria-toggle': MdAriaToggleElement;
12
+ }
13
+ }
14
+ /**
15
+ * An ARIA toggle button element with default properties and styles.
16
+ */
17
+ export declare class MdAriaToggleElement extends AriaToggleElement {
18
+ static styles: CSSResultGroup;
19
+ /**
20
+ * Whether the toggle button is selected.
21
+ */
22
+ get selected(): boolean;
23
+ set selected(value: boolean);
24
+ /**
25
+ * Whether the toggle button is disabled.
26
+ */
27
+ get disabled(): boolean;
28
+ set disabled(value: boolean);
29
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { __decorate } from "tslib";
7
+ import { css } from 'lit';
8
+ import { customElement, property } from 'lit/decorators.js';
9
+ import { AriaToggleElement, isToggleDisabled, isTogglePressed } from './toggle.js';
10
+ /**
11
+ * An ARIA toggle button element with default properties and styles.
12
+ */
13
+ let MdAriaToggleElement = class MdAriaToggleElement extends AriaToggleElement {
14
+ /**
15
+ * Whether the toggle button is selected.
16
+ */
17
+ get selected() {
18
+ return this[isTogglePressed];
19
+ }
20
+ set selected(value) {
21
+ const oldValue = this.selected;
22
+ this[isTogglePressed] = value;
23
+ this.requestUpdate('selected', oldValue); // Remove when Lit 2 support is dropped.
24
+ }
25
+ /**
26
+ * Whether the toggle button is disabled.
27
+ */
28
+ get disabled() {
29
+ return this[isToggleDisabled];
30
+ }
31
+ set disabled(value) {
32
+ const oldValue = this.disabled;
33
+ this[isToggleDisabled] = value;
34
+ this.requestUpdate('disabled', oldValue); // Remove when Lit 2 support is dropped.
35
+ }
36
+ };
37
+ MdAriaToggleElement.styles = [
38
+ AriaToggleElement.styles,
39
+ css `
40
+ :host {
41
+ background-color: ButtonFace;
42
+ color: ButtonText;
43
+ }
44
+ :host(:state(selected)) {
45
+ background-color: SelectedItem;
46
+ color: SelectedItemText;
47
+ }
48
+ :host(:focus-visible) {
49
+ outline: 2px solid AccentColor;
50
+ outline-offset: 2px;
51
+ }
52
+ :host(:state(disabled)) {
53
+ opacity: 38%;
54
+ }
55
+ `,
56
+ ];
57
+ __decorate([
58
+ property({ type: Boolean, reflect: true })
59
+ ], MdAriaToggleElement.prototype, "selected", null);
60
+ __decorate([
61
+ property({ type: Boolean, reflect: true })
62
+ ], MdAriaToggleElement.prototype, "disabled", null);
63
+ MdAriaToggleElement = __decorate([
64
+ customElement('md-aria-toggle')
65
+ ], MdAriaToggleElement);
66
+ export { MdAriaToggleElement };
67
+ //# sourceMappingURL=md-aria-toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-aria-toggle.js","sourceRoot":"","sources":["md-aria-toggle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,OAAO,EAAC,GAAG,EAAiB,MAAM,KAAK,CAAC;AACxC,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAC,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC;AASjF;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,iBAAiB;IAsBxD;;OAEG;IAEH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,CAAC,KAAc;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,wCAAwC;IACpF,CAAC;IAED;;OAEG;IAEH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,QAAQ,CAAC,KAAc;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,wCAAwC;IACpF,CAAC;;AA7Ce,0BAAM,GAAmB;IACvC,iBAAiB,CAAC,MAAM;IACxB,GAAG,CAAA;;;;;;;;;;;;;;;;KAgBF;CACF,AAnBqB,CAmBpB;AAMF;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;mDAGxC;AAWD;IADC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;mDAGxC;AAzCU,mBAAmB;IAD/B,aAAa,CAAC,gBAAgB,CAAC;GACnB,mBAAmB,CA+C/B","sourcesContent":["/**\n * @license\n * Copyright 2026 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {css, CSSResultGroup} from 'lit';\nimport {customElement, property} from 'lit/decorators.js';\n\nimport {AriaToggleElement, isToggleDisabled, isTogglePressed} from './toggle.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n /** An ARIA toggle button element. */\n 'md-aria-toggle': MdAriaToggleElement;\n }\n}\n\n/**\n * An ARIA toggle button element with default properties and styles.\n */\n@customElement('md-aria-toggle')\nexport class MdAriaToggleElement extends AriaToggleElement {\n static override styles: CSSResultGroup = [\n AriaToggleElement.styles,\n css`\n :host {\n background-color: ButtonFace;\n color: ButtonText;\n }\n :host(:state(selected)) {\n background-color: SelectedItem;\n color: SelectedItemText;\n }\n :host(:focus-visible) {\n outline: 2px solid AccentColor;\n outline-offset: 2px;\n }\n :host(:state(disabled)) {\n opacity: 38%;\n }\n `,\n ];\n\n /**\n * Whether the toggle button is selected.\n */\n @property({type: Boolean, reflect: true})\n get selected(): boolean {\n return this[isTogglePressed];\n }\n set selected(value: boolean) {\n const oldValue = this.selected;\n this[isTogglePressed] = value;\n this.requestUpdate('selected', oldValue); // Remove when Lit 2 support is dropped.\n }\n\n /**\n * Whether the toggle button is disabled.\n */\n @property({type: Boolean, reflect: true})\n get disabled(): boolean {\n return this[isToggleDisabled];\n }\n set disabled(value: boolean) {\n const oldValue = this.disabled;\n this[isToggleDisabled] = value;\n this.requestUpdate('disabled', oldValue); // Remove when Lit 2 support is dropped.\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CSSResultGroup, LitElement } from 'lit';
7
+ declare const baseClass: import("../../behaviors/mixin.js").MixinReturn<import("../../behaviors/mixin.js").MixinReturn<import("../../behaviors/mixin.js").MixinReturn<typeof LitElement, import("../../behaviors/element-internals.js").WithElementInternals>, import("../../behaviors/custom-state-set.js").WithCustomStateSet>, import("../../behaviors/focusable.js").Focusable>;
8
+ /**
9
+ * A unique symbol used to check if the toggle button is disabled.
10
+ */
11
+ export declare const isToggleDisabled: unique symbol;
12
+ /**
13
+ * A unique symbol used to check if the toggle button is pressed.
14
+ */
15
+ export declare const isTogglePressed: unique symbol;
16
+ /**
17
+ * An ARIA toggle button element.
18
+ *
19
+ * @fires {InputEvent} input - Fired when the toggle button is pressed or unpressed. --bubbles --composed
20
+ * @fires {Event} change - Fired when the toggle button is pressed or unpressed. --bubbles
21
+ * @cssstate selected - Whether the toggle button is selected.
22
+ * @cssstate enabled - True when the toggle button is enabled.
23
+ * @cssstate disabled - True when the toggle button is disabled.
24
+ */
25
+ export declare class AriaToggleElement extends baseClass {
26
+ static styles: CSSResultGroup;
27
+ /**
28
+ * Whether the toggle button is selected.
29
+ */
30
+ get [isTogglePressed](): boolean;
31
+ set [isTogglePressed](value: boolean);
32
+ /**
33
+ * Whether the toggle button is disabled.
34
+ */
35
+ get [isToggleDisabled](): boolean;
36
+ set [isToggleDisabled](value: boolean);
37
+ constructor();
38
+ protected render(): import("lit-html").TemplateResult<1>;
39
+ }
40
+ export {};
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { css, html, isServer, LitElement } from 'lit';
7
+ import { afterDispatch, setupDispatchHooks, } from '../../../internal/events/dispatch-hooks.js';
8
+ import { mixinCustomStateSet, toggleState, } from '../../behaviors/custom-state-set.js';
9
+ import { internals, mixinElementInternals, } from '../../behaviors/element-internals.js';
10
+ import { isFocusable, mixinFocusable } from '../../behaviors/focusable.js';
11
+ import { setupKeyboardClickHandler } from './keyboard_click_handler.js';
12
+ const baseClass = mixinFocusable(mixinCustomStateSet(mixinElementInternals(LitElement)));
13
+ /**
14
+ * A unique symbol used to check if the toggle button is disabled.
15
+ */
16
+ export const isToggleDisabled = Symbol('isToggleDisabled');
17
+ /**
18
+ * A unique symbol used to check if the toggle button is pressed.
19
+ */
20
+ export const isTogglePressed = Symbol('isTogglePressed');
21
+ /**
22
+ * An ARIA toggle button element.
23
+ *
24
+ * @fires {InputEvent} input - Fired when the toggle button is pressed or unpressed. --bubbles --composed
25
+ * @fires {Event} change - Fired when the toggle button is pressed or unpressed. --bubbles
26
+ * @cssstate selected - Whether the toggle button is selected.
27
+ * @cssstate enabled - True when the toggle button is enabled.
28
+ * @cssstate disabled - True when the toggle button is disabled.
29
+ */
30
+ export class AriaToggleElement extends baseClass {
31
+ /**
32
+ * Whether the toggle button is selected.
33
+ */
34
+ get [isTogglePressed]() {
35
+ return this[internals].ariaPressed === 'true';
36
+ }
37
+ set [isTogglePressed](value) {
38
+ value = Boolean(value); // coerce for safety
39
+ this[internals].ariaPressed = String(value);
40
+ this[toggleState]('selected', value);
41
+ }
42
+ /**
43
+ * Whether the toggle button is disabled.
44
+ */
45
+ get [isToggleDisabled]() {
46
+ return this[internals].ariaDisabled === 'true';
47
+ }
48
+ set [isToggleDisabled](value) {
49
+ value = Boolean(value); // coerce for safety
50
+ this[internals].ariaDisabled = String(value);
51
+ this[toggleState]('disabled', value);
52
+ this[toggleState]('enabled', !value);
53
+ this[isFocusable] = !value;
54
+ }
55
+ constructor() {
56
+ super();
57
+ if (isServer)
58
+ return;
59
+ this[internals].role = 'button';
60
+ this[isTogglePressed] = false;
61
+ this[isToggleDisabled] = false;
62
+ setupDispatchHooks(this, 'click');
63
+ setupKeyboardClickHandler(this);
64
+ this.addEventListener('click', (event) => {
65
+ if (this[isToggleDisabled]) {
66
+ event.stopImmediatePropagation();
67
+ event.preventDefault();
68
+ return;
69
+ }
70
+ // Toggle state updates synchronously during capture phase before
71
+ // bubbling to other listeners. This ensures `event.target` has the
72
+ // correct state.
73
+ const wasPressed = this[isTogglePressed];
74
+ this[isTogglePressed] = !wasPressed;
75
+ afterDispatch(event, () => {
76
+ if (event.defaultPrevented) {
77
+ // Revert state if a listener cancels the click event after the
78
+ // event has finished bubbling.
79
+ this[isTogglePressed] = wasPressed;
80
+ return;
81
+ }
82
+ this.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));
83
+ this.dispatchEvent(new Event('change', { bubbles: true }));
84
+ });
85
+ }, { capture: true });
86
+ }
87
+ render() {
88
+ return html `<slot></slot>`;
89
+ }
90
+ }
91
+ AriaToggleElement.styles = css `
92
+ :host {
93
+ display: inline-flex;
94
+ user-select: none;
95
+ }
96
+ :host(:state(enabled)) {
97
+ cursor: pointer;
98
+ }
99
+ `;
100
+ //# sourceMappingURL=toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.js","sourceRoot":"","sources":["toggle.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 {css, CSSResultGroup, html, isServer, LitElement} from 'lit';\n\nimport {\n afterDispatch,\n setupDispatchHooks,\n} from '../../../internal/events/dispatch-hooks.js';\nimport {\n mixinCustomStateSet,\n toggleState,\n} from '../../behaviors/custom-state-set.js';\nimport {\n internals,\n mixinElementInternals,\n} from '../../behaviors/element-internals.js';\nimport {isFocusable, mixinFocusable} from '../../behaviors/focusable.js';\nimport {setupKeyboardClickHandler} from './keyboard_click_handler.js';\n\nconst baseClass = mixinFocusable(\n mixinCustomStateSet(mixinElementInternals(LitElement)),\n);\n\n/**\n * A unique symbol used to check if the toggle button is disabled.\n */\nexport const isToggleDisabled = Symbol('isToggleDisabled');\n\n/**\n * A unique symbol used to check if the toggle button is pressed.\n */\nexport const isTogglePressed = Symbol('isTogglePressed');\n\n/**\n * An ARIA toggle button element.\n *\n * @fires {InputEvent} input - Fired when the toggle button is pressed or unpressed. --bubbles --composed\n * @fires {Event} change - Fired when the toggle button is pressed or unpressed. --bubbles\n * @cssstate selected - Whether the toggle button is selected.\n * @cssstate enabled - True when the toggle button is enabled.\n * @cssstate disabled - True when the toggle button is disabled.\n */\nexport class AriaToggleElement extends baseClass {\n static override styles: CSSResultGroup = css`\n :host {\n display: inline-flex;\n user-select: none;\n }\n :host(:state(enabled)) {\n cursor: pointer;\n }\n `;\n\n /**\n * Whether the toggle button is selected.\n */\n get [isTogglePressed](): boolean {\n return this[internals].ariaPressed === 'true';\n }\n set [isTogglePressed](value: boolean) {\n value = Boolean(value); // coerce for safety\n this[internals].ariaPressed = String(value);\n this[toggleState]('selected', value);\n }\n\n /**\n * Whether the toggle button is disabled.\n */\n get [isToggleDisabled](): boolean {\n return this[internals].ariaDisabled === 'true';\n }\n set [isToggleDisabled](value: boolean) {\n value = Boolean(value); // coerce for safety\n this[internals].ariaDisabled = String(value);\n this[toggleState]('disabled', value);\n this[toggleState]('enabled', !value);\n this[isFocusable] = !value;\n }\n\n constructor() {\n super();\n if (isServer) return;\n\n this[internals].role = 'button';\n this[isTogglePressed] = false;\n this[isToggleDisabled] = false;\n\n setupDispatchHooks(this, 'click');\n setupKeyboardClickHandler(this);\n\n this.addEventListener(\n 'click',\n (event: MouseEvent) => {\n if (this[isToggleDisabled]) {\n event.stopImmediatePropagation();\n event.preventDefault();\n return;\n }\n\n // Toggle state updates synchronously during capture phase before\n // bubbling to other listeners. This ensures `event.target` has the\n // correct state.\n const wasPressed = this[isTogglePressed];\n this[isTogglePressed] = !wasPressed;\n afterDispatch(event, () => {\n if (event.defaultPrevented) {\n // Revert state if a listener cancels the click event after the\n // event has finished bubbling.\n this[isTogglePressed] = wasPressed;\n return;\n }\n\n this.dispatchEvent(\n new InputEvent('input', {bubbles: true, composed: true}),\n );\n this.dispatchEvent(new Event('change', {bubbles: true}));\n });\n },\n {capture: true},\n );\n }\n\n protected override render() {\n return html`<slot></slot>`;\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Performs the 'shared command invoker activation steps' for a button or
8
+ * menuitem, to be called when that element is activated: either runs a command
9
+ * (i.e. the element has `command` and `commandfor` attributes) or changes a
10
+ * popover's state (i.e. the element has the `popovertarget` and possibly
11
+ * `popovertargetaction` attributes).
12
+ *
13
+ * https://whatpr.org/html/12011/popover.html#shared-command-invoker-activation-steps
14
+ *
15
+ * @param element The button or menuitem being activated.
16
+ * @param event The event that activated `element`.
17
+ */
18
+ export declare function sharedCommandInvokerActivationSteps(element: HTMLElement, event: Event): void;