@tylertech/forge 3.10.5 → 3.11.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 (154) hide show
  1. package/custom-elements.json +341 -139
  2. package/dist/app-bar/forge-app-bar.css +11 -5
  3. package/dist/button/forge-button.css +12 -6
  4. package/dist/checkbox/forge-checkbox.css +21 -17
  5. package/dist/chips/forge-chips.css +10 -4
  6. package/dist/field/forge-field.css +7 -5
  7. package/dist/floating-action-button/forge-floating-action-button.css +10 -6
  8. package/dist/forge.css +6 -1
  9. package/dist/icon-button/forge-icon-button.css +10 -4
  10. package/dist/lib.js +22 -22
  11. package/dist/lib.js.map +4 -4
  12. package/dist/list/forge-list.css +57 -3
  13. package/dist/radio/forge-radio.css +20 -12
  14. package/dist/skip-link/forge-skip-link.css +36 -32
  15. package/dist/switch/forge-switch.css +7 -5
  16. package/dist/table/forge-table.css +6 -1
  17. package/dist/vscode.html-custom-data.json +53 -43
  18. package/esm/accordion/accordion.d.ts +2 -0
  19. package/esm/accordion/accordion.js +2 -0
  20. package/esm/app-bar/app-bar/app-bar-adapter.js +2 -2
  21. package/esm/app-bar/app-bar/app-bar.d.ts +1 -1
  22. package/esm/app-bar/app-bar/app-bar.js +1 -1
  23. package/esm/app-bar/help-button/app-bar-help-button.d.ts +1 -1
  24. package/esm/app-bar/help-button/app-bar-help-button.js +1 -1
  25. package/esm/app-bar/menu-button/app-bar-menu-button.d.ts +1 -1
  26. package/esm/app-bar/menu-button/app-bar-menu-button.js +1 -1
  27. package/esm/app-bar/notification-button/app-bar-notification-button.d.ts +2 -0
  28. package/esm/app-bar/notification-button/app-bar-notification-button.js +2 -0
  29. package/esm/app-bar/profile-button/app-bar-profile-button-adapter.d.ts +2 -1
  30. package/esm/app-bar/profile-button/app-bar-profile-button-adapter.js +2 -0
  31. package/esm/app-bar/profile-button/app-bar-profile-button.d.ts +2 -0
  32. package/esm/app-bar/profile-button/app-bar-profile-button.js +2 -0
  33. package/esm/app-bar/search/app-bar-search.d.ts +2 -0
  34. package/esm/app-bar/search/app-bar-search.js +2 -0
  35. package/esm/autocomplete/autocomplete.d.ts +2 -0
  36. package/esm/autocomplete/autocomplete.js +2 -0
  37. package/esm/backdrop/backdrop.d.ts +2 -0
  38. package/esm/backdrop/backdrop.js +2 -0
  39. package/esm/badge/badge.d.ts +2 -0
  40. package/esm/badge/badge.js +2 -0
  41. package/esm/button/base/base-button-adapter.js +2 -2
  42. package/esm/button-area/button-area-adapter.js +2 -2
  43. package/esm/button-toggle/button-toggle/button-toggle-adapter.js +2 -2
  44. package/esm/button-toggle/button-toggle/button-toggle.d.ts +2 -0
  45. package/esm/button-toggle/button-toggle/button-toggle.js +2 -0
  46. package/esm/button-toggle/button-toggle-group/button-toggle-group.d.ts +1 -1
  47. package/esm/button-toggle/button-toggle-group/button-toggle-group.js +1 -1
  48. package/esm/calendar/calendar-menu/calendar-menu.js +1 -1
  49. package/esm/calendar/calendar.d.ts +2 -0
  50. package/esm/calendar/calendar.js +3 -1
  51. package/esm/card/card.d.ts +2 -0
  52. package/esm/card/card.js +2 -0
  53. package/esm/chip-field/chip-field.d.ts +2 -0
  54. package/esm/chip-field/chip-field.js +2 -0
  55. package/esm/chips/chip/chip-adapter.js +2 -2
  56. package/esm/chips/chip/chip.d.ts +2 -0
  57. package/esm/chips/chip/chip.js +2 -0
  58. package/esm/color-picker/color-picker.d.ts +2 -0
  59. package/esm/color-picker/color-picker.js +3 -1
  60. package/esm/core/utils/a11y-utils.js +17 -0
  61. package/esm/core/utils/utils.js +8 -2
  62. package/esm/date-picker/date-picker.d.ts +2 -0
  63. package/esm/date-picker/date-picker.js +2 -0
  64. package/esm/date-range-picker/date-range-picker.d.ts +2 -0
  65. package/esm/date-range-picker/date-range-picker.js +2 -0
  66. package/esm/deprecated/button/deprecated-button.js +3 -3
  67. package/esm/deprecated/icon-button/deprecated-icon-button.js +2 -2
  68. package/esm/drawer/drawer/drawer.d.ts +2 -0
  69. package/esm/drawer/drawer/drawer.js +3 -1
  70. package/esm/drawer/mini-drawer/mini-drawer.d.ts +2 -0
  71. package/esm/drawer/mini-drawer/mini-drawer.js +3 -1
  72. package/esm/drawer/modal-drawer/modal-drawer.d.ts +2 -0
  73. package/esm/drawer/modal-drawer/modal-drawer.js +3 -1
  74. package/esm/field/field-adapter.js +2 -2
  75. package/esm/field/field-core.d.ts +3 -3
  76. package/esm/focus-indicator/focus-indicator-constants.d.ts +1 -11
  77. package/esm/focus-indicator/focus-indicator-constants.js +2 -17
  78. package/esm/focus-indicator/focus-indicator.d.ts +52 -25
  79. package/esm/focus-indicator/focus-indicator.js +137 -61
  80. package/esm/focus-indicator/index.d.ts +0 -2
  81. package/esm/focus-indicator/index.js +0 -2
  82. package/esm/icon-button/icon-button.d.ts +2 -0
  83. package/esm/icon-button/icon-button.js +2 -0
  84. package/esm/keyboard-shortcut/keyboard-shortcut.d.ts +2 -0
  85. package/esm/keyboard-shortcut/keyboard-shortcut.js +2 -0
  86. package/esm/list/list/list.js +1 -1
  87. package/esm/list/list-item/list-item-constants.js +1 -1
  88. package/esm/list/list-item/list-item-core.d.ts +2 -0
  89. package/esm/list/list-item/list-item-core.js +29 -6
  90. package/esm/list/list-item/list-item.d.ts +1 -0
  91. package/esm/list/list-item/list-item.js +2 -1
  92. package/esm/list-dropdown/list-dropdown-constants.d.ts +6 -0
  93. package/esm/list-dropdown/list-dropdown-constants.js +6 -1
  94. package/esm/list-dropdown/list-dropdown-utils.js +28 -1
  95. package/esm/menu/menu.d.ts +2 -0
  96. package/esm/menu/menu.js +2 -0
  97. package/esm/page-state/page-state.d.ts +2 -1
  98. package/esm/page-state/page-state.js +2 -1
  99. package/esm/paginator/paginator.d.ts +2 -0
  100. package/esm/paginator/paginator.js +2 -0
  101. package/esm/popover/popover.js +1 -1
  102. package/esm/profile-card/profile-card.d.ts +2 -0
  103. package/esm/profile-card/profile-card.js +2 -0
  104. package/esm/select/core/base-select-constants.d.ts +4 -0
  105. package/esm/select/core/base-select-core.d.ts +22 -2
  106. package/esm/select/core/base-select-core.js +217 -40
  107. package/esm/select/option/option.d.ts +2 -0
  108. package/esm/select/option/option.js +2 -0
  109. package/esm/select/option-group/option-group.d.ts +2 -0
  110. package/esm/select/option-group/option-group.js +2 -0
  111. package/esm/select/select/select-constants.d.ts +5 -0
  112. package/esm/select/select/select-constants.js +5 -2
  113. package/esm/select/select/select.d.ts +14 -2
  114. package/esm/select/select/select.js +22 -1
  115. package/esm/select/select-dropdown/select-dropdown.d.ts +2 -0
  116. package/esm/select/select-dropdown/select-dropdown.js +2 -0
  117. package/esm/split-button/split-button.js +1 -1
  118. package/esm/split-view/split-view/split-view.d.ts +2 -0
  119. package/esm/split-view/split-view/split-view.js +2 -0
  120. package/esm/split-view/split-view-panel/split-view-panel.d.ts +2 -0
  121. package/esm/split-view/split-view-panel/split-view-panel.js +3 -1
  122. package/esm/stepper/step/step.d.ts +2 -0
  123. package/esm/stepper/step/step.js +3 -1
  124. package/esm/stepper/stepper/stepper.d.ts +2 -0
  125. package/esm/stepper/stepper/stepper.js +2 -0
  126. package/esm/table/table-utils.js +3 -0
  127. package/esm/table/table.d.ts +2 -0
  128. package/esm/table/table.js +4 -1
  129. package/esm/tabs/tab/tab-adapter.js +2 -2
  130. package/esm/tabs/tab/tab.d.ts +2 -0
  131. package/esm/tabs/tab/tab.js +2 -0
  132. package/esm/time-picker/time-picker.d.ts +2 -0
  133. package/esm/time-picker/time-picker.js +2 -0
  134. package/esm/tooltip/tooltip-adapter.d.ts +6 -0
  135. package/esm/tooltip/tooltip-adapter.js +9 -0
  136. package/esm/tooltip/tooltip-constants.d.ts +1 -0
  137. package/esm/tooltip/tooltip-constants.js +2 -1
  138. package/esm/tooltip/tooltip-core.d.ts +20 -0
  139. package/esm/tooltip/tooltip-core.js +96 -2
  140. package/esm/tooltip/tooltip.js +1 -1
  141. package/esm/view-switcher/view/view.d.ts +2 -0
  142. package/esm/view-switcher/view/view.js +2 -0
  143. package/esm/view-switcher/view-switcher.d.ts +2 -0
  144. package/esm/view-switcher/view-switcher.js +2 -0
  145. package/package.json +4 -4
  146. package/sass/focus-indicator/focus-indicator.scss +1 -1
  147. package/sass/icon-button/forge-icon-button.scss +3 -3
  148. package/sass/list/forge-list.scss +6 -6
  149. package/sass/table/_core.scss +13 -1
  150. package/sass/tooltip/_core.scss +0 -2
  151. package/esm/focus-indicator/focus-indicator-adapter.d.ts +0 -29
  152. package/esm/focus-indicator/focus-indicator-adapter.js +0 -37
  153. package/esm/focus-indicator/focus-indicator-core.d.ts +0 -48
  154. package/esm/focus-indicator/focus-indicator-core.js +0 -129
@@ -3,34 +3,20 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import { __decorate } from "tslib";
7
- import { attachShadowTemplate, coerceBoolean, customElement, coreProperty } from '@tylertech/forge-core';
8
- import { BaseComponent } from '../core/base/base-component';
9
- import { FocusIndicatorAdapter } from './focus-indicator-adapter';
10
- import { FOCUS_INDICATOR_CONSTANTS } from './focus-indicator-constants';
11
- import { FocusIndicatorCore } from './focus-indicator-core';
12
- const template = '<template></template>';
13
- const styles = ':host{--_focus-indicator-display:var(--forge-focus-indicator-display, flex);--_focus-indicator-width:var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));--_focus-indicator-active-width:var(--forge-focus-indicator-active-width, 6px);--_focus-indicator-color:var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));--_focus-indicator-shape:var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));--_focus-indicator-duration:var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));--_focus-indicator-easing:var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));--_focus-indicator-shape-start-start:var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));--_focus-indicator-shape-start-end:var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));--_focus-indicator-shape-end-end:var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));--_focus-indicator-shape-end-start:var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));--_focus-indicator-outward-offset:var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));--_focus-indicator-inward-offset:var(--forge-focus-indicator-inward-offset, 0px);--_focus-indicator-offset-block:var(--forge-focus-indicator-offset-block, 0);--_focus-indicator-offset-inline:var(--forge-focus-indicator-offset-inline, 0)}:host{animation-delay:0s,calc(var(--_focus-indicator-duration) * .25);animation-duration:calc(var(--_focus-indicator-duration) * .25),calc(var(--_focus-indicator-duration) * .75);animation-timing-function:var(--_focus-indicator-easing);box-sizing:border-box;color:var(--_focus-indicator-color);display:none;pointer-events:none;position:absolute;margin-block:var(--_focus-indicator-offset-block);margin-inline:var(--_focus-indicator-offset-inline)}:host([hidden]){display:none}:host([active]){display:var(--_focus-indicator-display)}:host(:not([inward])){animation-name:forge-focus-indicator-outward-grow,forge-focus-indicator-outward-shrink;border-end-end-radius:calc(var(--_focus-indicator-shape-end-end) + var(--_focus-indicator-outward-offset));border-end-start-radius:calc(var(--_focus-indicator-shape-end-start) + var(--_focus-indicator-outward-offset));border-start-end-radius:calc(var(--_focus-indicator-shape-start-end) + var(--_focus-indicator-outward-offset));border-start-start-radius:calc(var(--_focus-indicator-shape-start-start) + var(--_focus-indicator-outward-offset));inset:calc(-1 * var(--_focus-indicator-outward-offset));outline:var(--_focus-indicator-width) solid currentColor}:host([inward]){animation-name:forge-focus-indicator-inward-grow,forge-focus-indicator-inward-shrink;border-end-end-radius:calc(var(--_focus-indicator-shape-end-end) - var(--_focus-indicator-inward-offset));border-end-start-radius:calc(var(--_focus-indicator-shape-end-start) - var(--_focus-indicator-inward-offset));border-start-end-radius:calc(var(--_focus-indicator-shape-start-end) - var(--_focus-indicator-inward-offset));border-start-start-radius:calc(var(--_focus-indicator-shape-start-start) - var(--_focus-indicator-inward-offset));border:var(--_focus-indicator-width) solid currentColor;inset:var(--_focus-indicator-inward-offset)}:host([circular]){--_focus-indicator-shape:var(--forge-focus-indicator-shape, 50%)}@keyframes forge-focus-indicator-outward-grow{from{outline-width:0}to{outline-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-outward-shrink{from{outline-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-inward-grow{from{border-width:0}to{border-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-inward-shrink{from{border-width:var(--_focus-indicator-active-width)}}@media (prefers-reduced-motion){:host{animation:none}}';
6
+ var _FocusIndicatorComponent_instances, _FocusIndicatorComponent_targetElement, _FocusIndicatorComponent_internals, _FocusIndicatorComponent_detachTargetListeners, _FocusIndicatorComponent_attachTargetListeners, _FocusIndicatorComponent_handleTargetInteraction, _FocusIndicatorComponent_isActive, _FocusIndicatorComponent_handleTargetChange, _FocusIndicatorComponent_handleActiveChange, _a;
7
+ import { __classPrivateFieldGet, __classPrivateFieldSet, __decorate } from "tslib";
8
+ import { CUSTOM_ELEMENT_NAME_PROPERTY } from '@tylertech/forge-core';
9
+ import { nothing, unsafeCSS } from 'lit';
10
+ import { customElement, property } from 'lit/decorators.js';
11
+ import { BaseLitElement } from '../core/base/base-lit-element';
12
+ import { locateTargetHeuristic, toggleState } from '../core/utils/utils';
13
+ const styles = ':host{--_focus-indicator-display:var(--forge-focus-indicator-display, flex);--_focus-indicator-width:var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));--_focus-indicator-active-width:var(--forge-focus-indicator-active-width, 6px);--_focus-indicator-color:var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));--_focus-indicator-shape:var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));--_focus-indicator-duration:var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));--_focus-indicator-easing:var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));--_focus-indicator-shape-start-start:var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));--_focus-indicator-shape-start-end:var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));--_focus-indicator-shape-end-end:var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));--_focus-indicator-shape-end-start:var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));--_focus-indicator-outward-offset:var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));--_focus-indicator-inward-offset:var(--forge-focus-indicator-inward-offset, 0px);--_focus-indicator-offset-block:var(--forge-focus-indicator-offset-block, 0);--_focus-indicator-offset-inline:var(--forge-focus-indicator-offset-inline, 0)}:host{animation-delay:0s,calc(var(--_focus-indicator-duration) * .25);animation-duration:calc(var(--_focus-indicator-duration) * .25),calc(var(--_focus-indicator-duration) * .75);animation-timing-function:var(--_focus-indicator-easing);box-sizing:border-box;color:var(--_focus-indicator-color);display:none;pointer-events:none;position:absolute;margin-block:var(--_focus-indicator-offset-block);margin-inline:var(--_focus-indicator-offset-inline)}:host([hidden]){display:none}:host(:where(:state(active),[active])){display:var(--_focus-indicator-display)}:host(:not([inward])){animation-name:forge-focus-indicator-outward-grow,forge-focus-indicator-outward-shrink;border-end-end-radius:calc(var(--_focus-indicator-shape-end-end) + var(--_focus-indicator-outward-offset));border-end-start-radius:calc(var(--_focus-indicator-shape-end-start) + var(--_focus-indicator-outward-offset));border-start-end-radius:calc(var(--_focus-indicator-shape-start-end) + var(--_focus-indicator-outward-offset));border-start-start-radius:calc(var(--_focus-indicator-shape-start-start) + var(--_focus-indicator-outward-offset));inset:calc(-1 * var(--_focus-indicator-outward-offset));outline:var(--_focus-indicator-width) solid currentColor}:host([inward]){animation-name:forge-focus-indicator-inward-grow,forge-focus-indicator-inward-shrink;border-end-end-radius:calc(var(--_focus-indicator-shape-end-end) - var(--_focus-indicator-inward-offset));border-end-start-radius:calc(var(--_focus-indicator-shape-end-start) - var(--_focus-indicator-inward-offset));border-start-end-radius:calc(var(--_focus-indicator-shape-start-end) - var(--_focus-indicator-inward-offset));border-start-start-radius:calc(var(--_focus-indicator-shape-start-start) - var(--_focus-indicator-inward-offset));border:var(--_focus-indicator-width) solid currentColor;inset:var(--_focus-indicator-inward-offset)}:host([circular]){--_focus-indicator-shape:var(--forge-focus-indicator-shape, 50%)}@keyframes forge-focus-indicator-outward-grow{from{outline-width:0}to{outline-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-outward-shrink{from{outline-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-inward-grow{from{border-width:0}to{border-width:var(--_focus-indicator-active-width)}}@keyframes forge-focus-indicator-inward-shrink{from{border-width:var(--_focus-indicator-active-width)}}@media (prefers-reduced-motion){:host{animation:none}}';
14
+ export const FOCUS_INDICATOR_TAG_NAME = 'forge-focus-indicator';
14
15
  /**
15
16
  * @tag forge-focus-indicator
16
17
  *
17
18
  * @summary Renders a focus indicator when an attached element matches `:focus-visible`.
18
19
  *
19
- * @property {HTMLElement} targetElement - The element to attach the focus indicator to.
20
- * @property {string} target - The id of the element to attach the focus indicator to.
21
- * @property {boolean} [active=false] - Controls whether the indicator is active.
22
- * @property {boolean} [inward=false] - Controls whether the indicator renders inward.
23
- * @property {boolean} [circular=false] - Controls whether the indicator renders circular.
24
- * @property {boolean} [allowFocus=false] - Controls whether the indicator renders when the target element matches `:focus` instead of `:focus-visible`.
25
- * @property {FocusIndicatorFocusMode} [focusMode="focusin"] - The focus mode to use.
26
- *
27
- * @attribute {string} target - The id of the element to attach the focus indicator to.
28
- * @attribute {boolean} [active=false] - Controls whether the indicator is active.
29
- * @attribute {boolean} [inward=false] - Controls whether the indicator renders inward.
30
- * @attribute {boolean} [circular=false] - Controls whether the indicator renders circular.
31
- * @attribute {boolean} [allow-focus=false] - Controls whether the indicator renders when the target element matches `:focus` instead of `:focus-visible`.
32
- * @attribute {FocusIndicatorFocusMode} [focus-mode="focusin"] - The focus mode to use.
33
- *
34
20
  * @cssproperty --forge-focus-indicator-display - The `display` style. Defaults to `flex`.
35
21
  * @cssproperty --forge-focus-indicator-width - The width of the focus indicator when resting.
36
22
  * @cssproperty --forge-focus-indicator-active-width - The width of the focus indicator when active. When animating this is the max extent.
@@ -54,68 +40,158 @@ const styles = ':host{--_focus-indicator-display:var(--forge-focus-indicator-dis
54
40
  * @cssclass forge-focus-indicator--active - Forces the focus indicator to be visible.
55
41
  * @cssclass forge-focus-indicator--inward - Renders the focus inside the target element.
56
42
  */
57
- let FocusIndicatorComponent = class FocusIndicatorComponent extends BaseComponent {
58
- static get observedAttributes() {
59
- return Object.values(FOCUS_INDICATOR_CONSTANTS.attributes);
43
+ let FocusIndicatorComponent = class FocusIndicatorComponent extends BaseLitElement {
44
+ /**
45
+ * The element to attach the focus indicator to.
46
+ * @default undefined
47
+ */
48
+ set targetElement(value) {
49
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_detachTargetListeners).call(this);
50
+ __classPrivateFieldSet(this, _FocusIndicatorComponent_targetElement, value, "f");
51
+ if (this.isConnected) {
52
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_attachTargetListeners).call(this);
53
+ }
54
+ }
55
+ get targetElement() {
56
+ return __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f");
60
57
  }
61
58
  constructor() {
62
59
  super();
63
- attachShadowTemplate(this, template, styles);
64
- this._core = new FocusIndicatorCore(new FocusIndicatorAdapter(this));
60
+ _FocusIndicatorComponent_instances.add(this);
61
+ /**
62
+ * The id of the element to attach the focus indicator to.
63
+ * @default null
64
+ * @attribute
65
+ */
66
+ this.target = null;
67
+ /**
68
+ * Controls whether the indicator is active.
69
+ * @default false
70
+ * @attribute
71
+ */
72
+ this.active = false;
73
+ /**
74
+ * Controls whether the indicator renders inward.
75
+ * @default false
76
+ * @attribute
77
+ */
78
+ this.inward = false;
79
+ /**
80
+ * Controls whether the indicator renders circular.
81
+ * @default false
82
+ * @attribute
83
+ */
84
+ this.circular = false;
85
+ /**
86
+ * Controls whether the indicator renders when the target element matches `:focus` instead of `:focus-visible`.
87
+ * @default false
88
+ * @attribute allow-focus
89
+ */
90
+ this.allowFocus = false;
91
+ /**
92
+ * The focus mode to use. Valid values are `focusin` (default) and `focus`.
93
+ * @default 'focusin'
94
+ * @attribute focus-mode
95
+ */
96
+ this.focusMode = 'focusin';
97
+ _FocusIndicatorComponent_targetElement.set(this, void 0);
98
+ _FocusIndicatorComponent_internals.set(this, void 0);
99
+ __classPrivateFieldSet(this, _FocusIndicatorComponent_internals, this.attachInternals(), "f");
65
100
  }
66
101
  connectedCallback() {
67
- this._core.initialize();
102
+ super.connectedCallback();
103
+ if (!__classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")) {
104
+ __classPrivateFieldSet(this, _FocusIndicatorComponent_targetElement, locateTargetHeuristic(this, this.target) ?? undefined, "f");
105
+ }
106
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_attachTargetListeners).call(this);
68
107
  }
69
108
  disconnectedCallback() {
70
- this._core.destroy();
109
+ super.disconnectedCallback();
110
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_detachTargetListeners).call(this);
111
+ __classPrivateFieldSet(this, _FocusIndicatorComponent_targetElement, undefined, "f");
71
112
  }
72
- attributeChangedCallback(name, oldValue, newValue) {
73
- switch (name) {
74
- case FOCUS_INDICATOR_CONSTANTS.attributes.TARGET:
75
- this.target = newValue;
76
- break;
77
- case FOCUS_INDICATOR_CONSTANTS.attributes.ACTIVE:
78
- this.active = coerceBoolean(newValue);
79
- break;
80
- case FOCUS_INDICATOR_CONSTANTS.attributes.INWARD:
81
- this.inward = coerceBoolean(newValue);
82
- break;
83
- case FOCUS_INDICATOR_CONSTANTS.attributes.CIRCULAR:
84
- this.circular = coerceBoolean(newValue);
85
- break;
86
- case FOCUS_INDICATOR_CONSTANTS.attributes.ALLOW_FOCUS:
87
- this.allowFocus = coerceBoolean(newValue);
88
- break;
89
- case FOCUS_INDICATOR_CONSTANTS.attributes.FOCUS_MODE:
90
- this.focusMode = newValue;
91
- break;
113
+ willUpdate(changedProperties) {
114
+ if (this.hasUpdated) {
115
+ if (changedProperties.has('target')) {
116
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetChange).call(this);
117
+ }
118
+ }
119
+ if (changedProperties.has('active')) {
120
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleActiveChange).call(this);
92
121
  }
93
122
  }
123
+ render() {
124
+ return nothing; // This component does not render any elements, it only applies encapsulated styles to the host element.
125
+ }
126
+ };
127
+ _FocusIndicatorComponent_targetElement = new WeakMap();
128
+ _FocusIndicatorComponent_internals = new WeakMap();
129
+ _FocusIndicatorComponent_instances = new WeakSet();
130
+ _a = CUSTOM_ELEMENT_NAME_PROPERTY;
131
+ _FocusIndicatorComponent_detachTargetListeners = function _FocusIndicatorComponent_detachTargetListeners() {
132
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.removeEventListener(this.focusMode, __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
133
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.removeEventListener('focusout', __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
134
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.removeEventListener('pointerdown', __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
135
+ };
136
+ _FocusIndicatorComponent_attachTargetListeners = function _FocusIndicatorComponent_attachTargetListeners() {
137
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.addEventListener(this.focusMode, __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
138
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.addEventListener('focusout', __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
139
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f")?.addEventListener('pointerdown', __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_handleTargetInteraction).bind(this));
140
+ };
141
+ _FocusIndicatorComponent_handleTargetInteraction = function _FocusIndicatorComponent_handleTargetInteraction(evt) {
142
+ const target = evt.target;
143
+ switch (evt.type) {
144
+ case this.focusMode:
145
+ this.active = __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_isActive).call(this, this.allowFocus ? ':focus' : ':focus-visible', target);
146
+ break;
147
+ case 'focusout':
148
+ this.active = false;
149
+ break;
150
+ case 'pointerdown':
151
+ this.active = this.allowFocus ? __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_isActive).call(this, ':focus', target) : __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_isActive).call(this, ':focus-visible', target);
152
+ break;
153
+ }
154
+ };
155
+ _FocusIndicatorComponent_isActive = function _FocusIndicatorComponent_isActive(selector, el) {
156
+ const targetedEl = el ?? __classPrivateFieldGet(this, _FocusIndicatorComponent_targetElement, "f");
157
+ return !!targetedEl?.matches(selector);
158
+ };
159
+ _FocusIndicatorComponent_handleTargetChange = function _FocusIndicatorComponent_handleTargetChange() {
160
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_detachTargetListeners).call(this);
161
+ if (this.isConnected) {
162
+ __classPrivateFieldSet(this, _FocusIndicatorComponent_targetElement, locateTargetHeuristic(this, this.target) ?? undefined, "f");
163
+ __classPrivateFieldGet(this, _FocusIndicatorComponent_instances, "m", _FocusIndicatorComponent_attachTargetListeners).call(this);
164
+ }
165
+ };
166
+ _FocusIndicatorComponent_handleActiveChange = function _FocusIndicatorComponent_handleActiveChange() {
167
+ this.toggleAttribute('active', this.active);
168
+ toggleState(__classPrivateFieldGet(this, _FocusIndicatorComponent_internals, "f"), 'active', this.active);
94
169
  };
170
+ FocusIndicatorComponent.styles = unsafeCSS(styles);
171
+ /** @deprecated Used for compatibility with legacy Forge @customElement decorator. */
172
+ FocusIndicatorComponent[_a] = FOCUS_INDICATOR_TAG_NAME;
95
173
  __decorate([
96
- coreProperty()
97
- ], FocusIndicatorComponent.prototype, "targetElement", void 0);
174
+ property({ attribute: false })
175
+ ], FocusIndicatorComponent.prototype, "targetElement", null);
98
176
  __decorate([
99
- coreProperty()
177
+ property({ type: String })
100
178
  ], FocusIndicatorComponent.prototype, "target", void 0);
101
179
  __decorate([
102
- coreProperty()
180
+ property({ type: Boolean, reflect: true })
103
181
  ], FocusIndicatorComponent.prototype, "active", void 0);
104
182
  __decorate([
105
- coreProperty()
183
+ property({ type: Boolean, reflect: true })
106
184
  ], FocusIndicatorComponent.prototype, "inward", void 0);
107
185
  __decorate([
108
- coreProperty()
186
+ property({ type: Boolean, reflect: true })
109
187
  ], FocusIndicatorComponent.prototype, "circular", void 0);
110
188
  __decorate([
111
- coreProperty()
189
+ property({ type: Boolean, attribute: 'allow-focus' })
112
190
  ], FocusIndicatorComponent.prototype, "allowFocus", void 0);
113
191
  __decorate([
114
- coreProperty()
192
+ property({ attribute: 'focus-mode' })
115
193
  ], FocusIndicatorComponent.prototype, "focusMode", void 0);
116
194
  FocusIndicatorComponent = __decorate([
117
- customElement({
118
- name: FOCUS_INDICATOR_CONSTANTS.elementName
119
- })
195
+ customElement(FOCUS_INDICATOR_TAG_NAME)
120
196
  ], FocusIndicatorComponent);
121
197
  export { FocusIndicatorComponent };
@@ -3,8 +3,6 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- export * from './focus-indicator-adapter';
7
6
  export * from './focus-indicator-constants';
8
- export * from './focus-indicator-core';
9
7
  export * from './focus-indicator';
10
8
  export declare function defineFocusIndicatorComponent(): void;
@@ -5,9 +5,7 @@
5
5
  */
6
6
  import { defineCustomElement } from '@tylertech/forge-core';
7
7
  import { FocusIndicatorComponent } from './focus-indicator';
8
- export * from './focus-indicator-adapter';
9
8
  export * from './focus-indicator-constants';
10
- export * from './focus-indicator-core';
11
9
  export * from './focus-indicator';
12
10
  export function defineFocusIndicatorComponent() {
13
11
  defineCustomElement(FocusIndicatorComponent);
@@ -25,6 +25,8 @@ declare global {
25
25
  }
26
26
  }
27
27
  /**
28
+ * @summary A clickable button component that displays an icon with support for different variants, themes, toggle states, and accessibility features.
29
+ *
28
30
  * @tag forge-icon-button
29
31
  *
30
32
  * @globalconfig variant
@@ -16,6 +16,8 @@ import { IconButtonAdapter } from './icon-button-adapter';
16
16
  const template = '<template><div class=\"forge-icon-button\" part=\"root\"><slot name=\"start\"></slot><slot></slot><slot name=\"on\"></slot><slot name=\"end\"></slot><slot name=\"badge\"></slot><forge-focus-indicator target=\":host\" part=\"focus-indicator\"></forge-focus-indicator><forge-state-layer target=\":host\" exportparts=\"surface:state-layer\"></forge-state-layer></div></template>';
17
17
  const styles = ':host{--_icon-button-display:var(--forge-icon-button-display, inline-flex);--_icon-button-disabled-cursor:var(--forge-icon-button-disabled-cursor, not-allowed)}:host{display:var(--_icon-button-display);position:relative;outline:0;-webkit-tap-highlight-color:transparent}:host([hidden]){display:none}.forge-icon-button{--_icon-button-size:var(--forge-icon-button-size, 48px);--_icon-button-gap:var(--forge-icon-button-gap, 0);--_icon-button-icon-color:var(--forge-icon-button-icon-color, currentColor);--_icon-button-background-color:var(--forge-icon-button-background-color, none);--_icon-button-icon-size:var(--forge-icon-button-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.5));--_icon-button-cursor:var(--forge-icon-button-cursor, pointer);--_icon-button-padding:var(--forge-icon-button-padding, var(--forge-spacing-xxsmall, 4px));--_icon-button-border:var(--forge-icon-button-border, none);--_icon-button-shadow:var(--forge-icon-button-shadow, none);--_icon-button-transition-duration:var(--forge-icon-button-transition-duration, var(--forge-animation-duration-short3, 150ms));--_icon-button-transition-timing:var(--forge-icon-button-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));--_icon-button-shape:var(--forge-icon-button-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));--_icon-button-shape-start-start:var(--forge-icon-button-shape-start-start, var(--_icon-button-shape));--_icon-button-shape-start-end:var(--forge-icon-button-shape-start-end, var(--_icon-button-shape));--_icon-button-shape-end-start:var(--forge-icon-button-shape-end-start, var(--_icon-button-shape));--_icon-button-shape-end-end:var(--forge-icon-button-shape-end-end, var(--_icon-button-shape));--_icon-button-shape-squared:var(--forge-icon-button-shape-squared, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_icon-button-outlined-border-width:var(--forge-icon-button-outlined-border-width, 1px);--_icon-button-outlined-border-style:var(--forge-icon-button-outlined-border-style, solid);--_icon-button-outlined-border-color:var(--forge-icon-button-outlined-border-color, var(--_icon-button-icon-color));--_icon-button-tonal-icon-color:var(--forge-icon-button-tonal-icon-color, var(--forge-theme-on-primary-container, #222c62));--_icon-button-tonal-background-color:var(--forge-icon-button-tonal-background-color, var(--forge-theme-primary-container, #d1d5ed));--_icon-button-filled-icon-color:var(--forge-icon-button-filled-icon-color, var(--forge-theme-on-primary, #ffffff));--_icon-button-filled-background-color:var(--forge-icon-button-filled-background-color, var(--forge-theme-primary, #3f51b5));--_icon-button-raised-shadow:var(--forge-icon-button-raised-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));--_icon-button-raised-hover-shadow:var(--forge-icon-button-raised-hover-shadow, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));--_icon-button-raised-active-shadow:var(--forge-icon-button-raised-active-shadow, 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12));--_icon-button-raised-disabled-shadow:var(--forge-icon-button-raised-disabled-shadow, none);--_icon-button-density-small-size:var(--forge-icon-button-density-small-size, 24px);--_icon-button-density-small-padding:var(--forge-icon-button-density-small-padding, var(--forge-spacing-xxxsmall, 2px));--_icon-button-density-small-icon-size:var(--forge-icon-button-density-small-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.125));--_icon-button-density-medium-size:var(--forge-icon-button-density-medium-size, 36px);--_icon-button-density-medium-padding:var(--forge-icon-button-density-medium-padding, var(--forge-spacing-xxsmall, 4px));--_icon-button-density-large-size:var(--forge-icon-button-density-large-size, var(--_icon-button-size));--_icon-button-toggle-on-background-color:var(--forge-icon-button-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));--_icon-button-tonal-toggle-background-color:var(--forge-icon-button-tonal-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));--_icon-button-filled-toggle-background-color:var(--forge-icon-button-filled-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));--_icon-button-filled-toggle-icon-color:var(--forge-icon-button-filled-toggle-icon-color, var(--forge-theme-primary, #3f51b5));--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-primary, #3f51b5));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-primary, #ffffff));--_icon-button-disabled-opacity:var(--forge-icon-button-disabled-opacity, 0.38);--_icon-button-popover-icon-padding:var(--forge-icon-button-popover-icon-padding, var(--forge-spacing-xsmall, 8px));--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-primary, #3f51b5))}.forge-icon-button{position:relative;z-index:0;display:var(--_icon-button-display);align-items:center;justify-content:center;gap:var(--_icon-button-gap);box-sizing:border-box;height:var(--_icon-button-density-large-size);min-width:var(--_icon-button-density-large-size);border:var(--_icon-button-border);border-start-start-radius:var(--_icon-button-shape-start-start);border-start-end-radius:var(--_icon-button-shape-start-end);border-end-start-radius:var(--_icon-button-shape-end-start);border-end-end-radius:var(--_icon-button-shape-end-end);padding:var(--_icon-button-padding);box-shadow:var(--_icon-button-shadow);color:var(--_icon-button-icon-color);background:var(--_icon-button-background-color);font-size:var(--_icon-button-icon-size);cursor:var(--_icon-button-cursor);user-select:none;transition-property:box-shadow,background;transition-duration:var(--_icon-button-transition-duration);transition-timing-function:var(--_icon-button-transition-timing)}.forge-icon-button ::slotted(:is([slot=start],[slot=end])){font-size:var(--_icon-button-icon-size);height:var(--_icon-button-icon-size);width:var(--_icon-button-icon-size);font-weight:inherit}::slotted(a){height:100%;width:100%;outline:0;border-radius:var(--_icon-button-shape);padding-inline:var(--_icon-button-padding);display:flex;align-items:center;justify-content:center;gap:var(--_icon-button-gap);color:var(--_icon-button-icon-color);text-decoration:none}forge-focus-indicator{--forge-focus-indicator-color:var(--_icon-button-focus-indicator-color);--forge-focus-indicator-shape-start-start:var(--_icon-button-shape-start-start);--forge-focus-indicator-shape-start-end:var(--_icon-button-shape-start-end);--forge-focus-indicator-shape-end-start:var(--_icon-button-shape-end-start);--forge-focus-indicator-shape-end-end:var(--_icon-button-shape-end-end)}:host(:is([variant=icon],:not([variant]))){--forge-focus-indicator-outward-offset:0px}forge-state-layer{--forge-state-layer-color:var(--_icon-button-icon-color)}:host([popover-icon]) .forge-icon-button{--_icon-button-padding:var(--_icon-button-popover-icon-padding)}:host([variant=outlined]) .forge-icon-button{border-width:var(--_icon-button-outlined-border-width);border-style:var(--_icon-button-outlined-border-style);border-color:var(--_icon-button-outlined-border-color)}:host([variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--_icon-button-tonal-icon-color);--_icon-button-background-color:var(--_icon-button-tonal-background-color)}:host(:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--_icon-button-filled-icon-color);--_icon-button-background-color:var(--_icon-button-filled-background-color)}:host([variant=raised]) .forge-icon-button{--_icon-button-shadow:var(--_icon-button-raised-shadow)}:host([variant=raised]) .forge-icon-button:hover{--_icon-button-raised-shadow:var(--_icon-button-raised-hover-shadow)}:host([variant=raised]) .forge-icon-button:active{--_icon-button-raised-shadow:var(--_icon-button-raised-active-shadow)}:host(:is(:not([toggle]),[toggle]:not([pressed]))) slot[name=on]{display:none}:host([toggle][pressed]) slot:not([name]){display:none}:host([toggle][pressed]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-background-color:var(--_icon-button-toggle-on-background-color);--_icon-button-icon-color:var(--_icon-button-toggle-on-icon-color)}:host([toggle][pressed][variant=outlined]) .forge-icon-button{--_icon-button-background-color:var(--_icon-button-outlined-toggle-on-background-color);--_icon-button-icon-color:var(--_icon-button-outlined-toggle-on-icon-color)}:host([toggle]:not([pressed])[variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--_icon-button-tonal-toggle-background-color)}:host([toggle][pressed][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--_icon-button-tonal-toggle-on-icon-color);--_icon-button-background-color:var(--_icon-button-tonal-toggle-on-background-color)}:host([toggle]:not([pressed]):is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--_icon-button-filled-toggle-icon-color);--_icon-button-background-color:var(--_icon-button-filled-toggle-background-color)}:host([toggle][pressed]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--_icon-button-filled-toggle-on-icon-color);--_icon-button-background-color:var(--_icon-button-filled-toggle-on-background-color)}::slotted([slot=badge]){position:absolute;top:0;left:60%;z-index:1;pointer-events:none}::slotted(forge-badge[slot=badge][dot]){top:8px}:host(:is([dense],[density=small],[density=medium])) ::slotted(forge-badge[slot=badge]:not([dot])){top:-25%}:host(:is([dense],[density=small],[density=medium])) ::slotted(forge-badge[slot=badge][dot]){top:0}:host(:is([dense],[density=small])) ::slotted(forge-badge[slot=badge]){--forge-typography-label1-line-height:normal;--forge-badge-height:auto}::slotted(forge-circular-progress){--forge-circular-progress-indicator-color:var(--_icon-button-icon-color);--forge-circular-progress-track-color:transparent;--forge-circular-progress-size:1em}:host(:is([dense],[density=small])) .forge-icon-button{--_icon-button-size:var(--_icon-button-density-small-size);--_icon-button-icon-size:var(--_icon-button-density-small-icon-size);--_icon-button-padding:var(--_icon-button-density-small-padding)}:host(:is([dense],[density=small])) ::slotted(*){font-size:var(--_icon-button-density-small-icon-size)}:host([density=medium]) .forge-icon-button{--_icon-button-size:var(--_icon-button-density-medium-size);--_icon-button-padding:var(--_icon-button-density-medium-padding)}:host([shape=squared]) .forge-icon-button{--_icon-button-shape:var(--_icon-button-shape-squared)}:host([disabled]){cursor:var(--_icon-button-disabled-cursor)}:host([disabled]) .forge-icon-button{pointer-events:none;opacity:var(--_icon-button-disabled-opacity)}:host([disabled][variant=raised]) .forge-icon-button{--_icon-button-raised-shadow:var(--_icon-button-raised-disabled-shadow)}:host(:not([toggle])[theme=primary]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-primary, #3f51b5))}:host([toggle][theme=primary]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5))}:host([toggle][theme=primary][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-primary, #3f51b5));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5))}:host([theme=primary]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-primary, #3f51b5))}:host(:not([toggle])[theme=secondary]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-secondary, #ffc107))}:host([toggle][theme=secondary]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-secondary, #ffc107))}:host([toggle][theme=secondary][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-secondary, #ffc107));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-secondary-container, #fff0c3));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-secondary, #ffc107))}:host(:not([toggle])[theme=secondary][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-secondary-container, #8a6804));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-secondary-container, #fff0c3))}:host([toggle]:not([pressed])[theme=secondary][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-secondary-container, #fff0c3))}:host([toggle][theme=secondary][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-secondary-container, #fff0c3));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-secondary-container, #8a6804))}:host(:not([toggle])[theme=secondary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-secondary, #000000));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-secondary, #ffc107))}:host([toggle]:not([pressed])[theme=secondary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-secondary, #ffc107));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-secondary-container, #fff0c3))}:host([toggle][theme=secondary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-secondary, #ffc107));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-secondary, #000000))}:host([theme=secondary]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-secondary, #ffc107))}:host(:not([toggle])[theme=tertiary]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-tertiary, #3d5afe))}:host([toggle][theme=tertiary]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-tertiary, #3d5afe))}:host([toggle][theme=tertiary][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-tertiary, #3d5afe));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-tertiary-container, #d0d7ff));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-tertiary, #3d5afe))}:host(:not([toggle])[theme=tertiary][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-tertiary-container, #213189));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-tertiary-container, #d0d7ff))}:host([toggle]:not([pressed])[theme=tertiary][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-tertiary-container, #d0d7ff))}:host([toggle][theme=tertiary][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-tertiary-container, #d0d7ff));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-tertiary-container, #213189))}:host(:not([toggle])[theme=tertiary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-tertiary, #ffffff));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-tertiary, #3d5afe))}:host([toggle]:not([pressed])[theme=tertiary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-tertiary, #3d5afe));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-tertiary-container, #d0d7ff))}:host([toggle][theme=tertiary]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-tertiary, #3d5afe));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-tertiary, #ffffff))}:host([theme=tertiary]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-tertiary, #3d5afe))}:host(:not([toggle])[theme=success]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-success, #2e7d32))}:host([toggle][theme=success]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-success, #2e7d32))}:host([toggle][theme=success][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-success, #2e7d32));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-success-container, #cde0ce));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-success, #2e7d32))}:host(:not([toggle])[theme=success][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-success-container, #19441b));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-success-container, #cde0ce))}:host([toggle]:not([pressed])[theme=success][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-success-container, #cde0ce))}:host([toggle][theme=success][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-success-container, #cde0ce));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-success-container, #19441b))}:host(:not([toggle])[theme=success]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-success, #ffffff));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-success, #2e7d32))}:host([toggle]:not([pressed])[theme=success]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-success, #2e7d32));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-success-container, #cde0ce))}:host([toggle][theme=success]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-success, #2e7d32));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-success, #ffffff))}:host([theme=success]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-success, #2e7d32))}:host(:not([toggle])[theme=error]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-error, #b00020))}:host([toggle][theme=error]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-error, #b00020))}:host([toggle][theme=error][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-error, #b00020));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-error-container, #ecc2c9));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-error, #b00020))}:host(:not([toggle])[theme=error][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-error-container, #5f0011));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-error-container, #ecc2c9))}:host([toggle]:not([pressed])[theme=error][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-error-container, #ecc2c9))}:host([toggle][theme=error][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-error-container, #ecc2c9));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-error-container, #5f0011))}:host(:not([toggle])[theme=error]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-error, #ffffff));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-error, #b00020))}:host([toggle]:not([pressed])[theme=error]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-error, #b00020));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-error-container, #ecc2c9))}:host([toggle][theme=error]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-error, #b00020));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-error, #ffffff))}:host([theme=error]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-error, #b00020))}:host(:not([toggle])[theme=warning]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-warning, #d14900))}:host([toggle][theme=warning]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-warning, #d14900))}:host([toggle][theme=warning][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-warning, #d14900));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-warning-container, #f4d3c2));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-warning, #d14900))}:host(:not([toggle])[theme=warning][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-warning-container, #712700));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-warning-container, #f4d3c2))}:host([toggle]:not([pressed])[theme=warning][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-warning-container, #f4d3c2))}:host([toggle][theme=warning][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-warning-container, #f4d3c2));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-warning-container, #712700))}:host(:not([toggle])[theme=warning]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-warning, #ffffff));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-warning, #d14900))}:host([toggle]:not([pressed])[theme=warning]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-warning, #d14900));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-warning-container, #f4d3c2))}:host([toggle][theme=warning]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-warning, #d14900));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-warning, #ffffff))}:host([theme=warning]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-warning, #d14900))}:host(:not([toggle])[theme=info]:is(:not([variant]),[variant=icon],[variant=outlined])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-info, #1565c0))}:host([toggle][theme=info]:is(:not([variant]),[variant=icon])) .forge-icon-button{--_icon-button-toggle-on-icon-color:var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-info, #1565c0))}:host([toggle][theme=info][variant=outlined]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-info, #1565c0));--_icon-button-outlined-toggle-on-background-color:var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-info-container, #c7daf0));--_icon-button-outlined-toggle-on-icon-color:var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-info, #1565c0))}:host(:not([toggle])[theme=info][variant=tonal]) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-info-container, #0b3768));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-info-container, #c7daf0))}:host([toggle]:not([pressed])[theme=info][variant=tonal]) .forge-icon-button{--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-info-container, #c7daf0))}:host([toggle][theme=info][variant=tonal]) .forge-icon-button{--_icon-button-tonal-toggle-on-background-color:var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-info-container, #c7daf0));--_icon-button-tonal-toggle-on-icon-color:var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-on-info-container, #0b3768))}:host(:not([toggle])[theme=info]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-on-info, #ffffff));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-info, #1565c0))}:host([toggle]:not([pressed])[theme=info]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-icon-color:var(--forge-icon-button-icon-color, var(--forge-theme-info, #1565c0));--_icon-button-background-color:var(--forge-icon-button-background-color, var(--forge-theme-info-container, #c7daf0))}:host([toggle][theme=info]:is([variant=filled],[variant=raised])) .forge-icon-button{--_icon-button-filled-toggle-on-background-color:var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-info, #1565c0));--_icon-button-filled-toggle-on-icon-color:var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-info, #ffffff))}:host([theme=info]) .forge-icon-button{--_icon-button-focus-indicator-color:var(--forge-icon-button-focus-indicator-color, var(--forge-theme-info, #1565c0))}:host([theme=app-bar]){--forge-icon-button-icon-color:var(--_app-bar-theme-foreground);--forge-icon-button-focus-indicator-color:var(--_app-bar-theme-foreground)}';
18
18
  /**
19
+ * @summary A clickable button component that displays an icon with support for different variants, themes, toggle states, and accessibility features.
20
+ *
19
21
  * @tag forge-icon-button
20
22
  *
21
23
  * @globalconfig variant
@@ -26,6 +26,8 @@ declare global {
26
26
  }
27
27
  }
28
28
  /**
29
+ * @summary A utility component that listens for keyboard shortcut combinations and triggers callbacks or events when the specified key bindings are activated.
30
+ *
29
31
  * @tag forge-keyboard-shortcut
30
32
  *
31
33
  * @event {CustomEvent<KeyboardEvent>} forge-keyboard-shortcut-activate - Event fired when the keyboard shortcut is activated.
@@ -10,6 +10,8 @@ import { KeyboardShortcutCore } from './keyboard-shortcut-core';
10
10
  import { KEYBOARD_SHORTCUT_CONSTANTS } from './keyboard-shortcut-constants';
11
11
  import { BaseComponent } from '../core/base/base-component';
12
12
  /**
13
+ * @summary A utility component that listens for keyboard shortcut combinations and triggers callbacks or events when the specified key bindings are activated.
14
+ *
13
15
  * @tag forge-keyboard-shortcut
14
16
  *
15
17
  * @event {CustomEvent<KeyboardEvent>} forge-keyboard-shortcut-activate - Event fired when the keyboard shortcut is activated.
@@ -14,7 +14,7 @@ import { setDefaultAria } from '../../constants';
14
14
  import { WithElementInternals } from '../../core/mixins/internals/with-element-internals';
15
15
  import { WithDefaultAria } from '../../core/mixins/internals/with-default-aria';
16
16
  const template = '<template><div class=\"forge-list\" part=\"root\"><div class=\"inner\"><slot></slot></div></div></template>';
17
- const styles = ':host{--_list-navlist-spacing:var(--forge-list-navlist-spacing, var(--forge-spacing-xxsmall, 4px));--_list-navlist-margin:var(--forge-list-navlist-margin, var(--forge-spacing-xxsmall, 4px) var(--forge-spacing-xsmall, 8px));--_list-navlist-height:var(--forge-list-navlist-height, 40px);--_list-navlist-padding:var(--forge-list-navlist-padding, 0 var(--forge-spacing-xsmall, 8px));--_list-navlist-shape:var(--forge-list-navlist-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_list-navlist-font-size:var(--forge-list-navlist-font-size, calc(var(--forge-typography-font-size, 1rem) * 0.875));--_list-navlist-font-weight:var(--forge-list-navlist-font-weight, 500)}:host{display:block}:host([hidden]){display:none}:host([navlist]){--forge-list-item-height:var(--_list-navlist-height);--forge-list-item-margin:var(--_list-navlist-margin);--forge-list-item-padding:var(--_list-navlist-padding);--forge-list-item-shape:var(--_list-navlist-shape);--forge-list-item-text-font-size:var(--_list-navlist-font-size);--forge-list-item-text-font-weight:var(--_list-navlist-font-weight)}:host([navlist]) .forge-list{margin-block:var(--_list-navlist-spacing)}.forge-list{--_list-spacing:var(--forge-list-spacing, 0);--_list-container-color:var(--forge-list-container-color, transparent)}.forge-list{outline:0;background-color:var(--_list-container-color);margin:0;border-radius:inherit;min-width:inherit}.inner{display:grid;gap:var(--_list-spacing);min-width:0}.inner ::slotted(*){min-width:0}';
17
+ const styles = ':host{--_list-navlist-spacing:var(--forge-list-navlist-spacing, var(--forge-spacing-xxsmall, 4px));--_list-navlist-margin:var(--forge-list-navlist-margin, var(--forge-spacing-xxsmall, 4px) var(--forge-spacing-xsmall, 8px));--_list-navlist-height:var(--forge-list-navlist-height, 40px);--_list-navlist-padding:var(--forge-list-navlist-padding, 0 var(--forge-spacing-xsmall, 8px));--_list-navlist-shape:var(--forge-list-navlist-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_list-navlist-font-size:var(--forge-list-navlist-font-size, calc(var(--forge-typography-font-size, 1rem) * 0.875));--_list-navlist-font-weight:var(--forge-list-navlist-font-weight, 500)}:host{display:block}:host([hidden]){display:none}:host([navlist]) .forge-list{margin-block:var(--_list-navlist-spacing)}:host([navlist]){--forge-list-item-height:var(--_list-navlist-height);--forge-list-item-margin:var(--_list-navlist-margin);--forge-list-item-padding:var(--_list-navlist-padding);--forge-list-item-shape:var(--_list-navlist-shape);--forge-list-item-text-font-size:var(--_list-navlist-font-size);--forge-list-item-text-font-weight:var(--_list-navlist-font-weight)}.forge-list{--_list-spacing:var(--forge-list-spacing, 0);--_list-container-color:var(--forge-list-container-color, transparent)}.forge-list{outline:0;background-color:var(--_list-container-color);margin:0;border-radius:inherit;min-width:inherit}.inner{display:grid;gap:var(--_list-spacing);min-width:0}.inner ::slotted(*){min-width:0}';
18
18
  /**
19
19
  * @tag forge-list
20
20
  *
@@ -33,7 +33,7 @@ const selectors = {
33
33
  ROOT: `.${classes.ROOT}`,
34
34
  FORM_CONTROL_LIKE: ':is([forge-list-item-interactive],forge-radio,forge-checkbox,forge-switch,input[type=checkbox],input[type=radio]):is([slot=start],[slot=end],[slot=leading],[slot=trailing]):not([forge-ignore])',
35
35
  BUTTON_LIKE: ':is(button,[role=button][tabindex]:not([tabindex=-1]),[forge-list-item-interactive]):not([forge-ignore])',
36
- IGNORE: '[forge-ignore],[data-forge-ignore]',
36
+ IGNORE: '[forge-ignore],[data-forge-ignore],[slot="additional-content"]',
37
37
  INTERNAL_ANCHOR: `#${ids.INTERNAL_ANCHOR}`,
38
38
  SLOTTED_START_END: ':is([slot=start],[slot=end],[slot=leading],[slot=trailing])'
39
39
  };
@@ -33,11 +33,13 @@ export declare class ListItemCore implements IListItemCore {
33
33
  private _mousedownListener;
34
34
  private _clickListener;
35
35
  private _keydownListener;
36
+ private _keyupListener;
36
37
  constructor(_adapter: IListItemAdapter);
37
38
  initialize(): void;
38
39
  destroy(): void;
39
40
  private _onMousedown;
40
41
  private _onKeydown;
42
+ private _onKeyup;
41
43
  private _onClick;
42
44
  private _clickInteractiveElement;
43
45
  private _onInteractiveStateChange;
@@ -21,6 +21,7 @@ export class ListItemCore {
21
21
  this._mousedownListener = this._onMousedown.bind(this);
22
22
  this._clickListener = this._onClick.bind(this);
23
23
  this._keydownListener = this._onKeydown.bind(this);
24
+ this._keyupListener = this._onKeyup.bind(this);
24
25
  }
25
26
  initialize() {
26
27
  this._adapter.initialize();
@@ -43,10 +44,22 @@ export class ListItemCore {
43
44
  }
44
45
  _onKeydown(evt) {
45
46
  const composedElements = composedPathFrom(this._adapter.hostElement, evt);
46
- const isFromStartEndSlot = composedElements.some((el) => el.matches(LIST_ITEM_CONSTANTS.selectors.SLOTTED_START_END));
47
+ const ignoredElements = composedElements.some(el => el.matches(LIST_ITEM_CONSTANTS.selectors.IGNORE));
48
+ if (ignoredElements) {
49
+ return;
50
+ }
47
51
  if (evt.key === 'Enter' || evt.key === ' ') {
48
52
  evt.stopPropagation();
53
+ const isAnchor = this._adapter.interactiveElement?.tagName === 'A';
54
+ if (!isAnchor) {
55
+ evt.preventDefault();
56
+ }
57
+ this._adapter.addHostListener('keyup', this._keyupListener, { capture: true });
49
58
  }
59
+ }
60
+ _onKeyup(evt) {
61
+ const composedElements = composedPathFrom(this._adapter.hostElement, evt);
62
+ const isFromStartEndSlot = composedElements.some((el) => el.matches(LIST_ITEM_CONSTANTS.selectors.SLOTTED_START_END));
50
63
  if (isFromStartEndSlot) {
51
64
  if (evt.key === 'Enter' || evt.key === ' ') {
52
65
  this._adapter.animateStateLayer();
@@ -56,10 +69,19 @@ export class ListItemCore {
56
69
  }
57
70
  return;
58
71
  }
59
- if (evt.key === ' ') {
60
- evt.preventDefault();
61
- this._adapter.interactiveElement?.click();
72
+ if (evt.key === ' ' || evt.key === 'Enter') {
73
+ const isAnchor = this._adapter.interactiveElement?.tagName === 'A';
74
+ if (isAnchor) {
75
+ if (evt.key === ' ') {
76
+ this._adapter.interactiveElement?.click();
77
+ }
78
+ }
79
+ else {
80
+ this._adapter.animateStateLayer();
81
+ this._onClick(evt);
82
+ }
62
83
  }
84
+ this._adapter.removeHostListener('keyup', this._keyupListener, { capture: true });
63
85
  }
64
86
  _onClick(evt) {
65
87
  const composedElements = composedPathFrom(this._adapter.hostElement, evt);
@@ -116,12 +138,13 @@ export class ListItemCore {
116
138
  if (value && !this._noninteractive) {
117
139
  this._adapter.addRootListener('mousedown', this._mousedownListener, { capture: true });
118
140
  this._adapter.addHostListener('click', this._clickListener, { capture: true });
119
- this._adapter.addHostListener('keydown', this._keydownListener);
141
+ this._adapter.addHostListener('keydown', this._keydownListener, { capture: true });
120
142
  }
121
143
  else {
122
144
  this._adapter.removeRootListener('mousedown', this._mousedownListener, { capture: true });
123
145
  this._adapter.removeHostListener('click', this._clickListener, { capture: true });
124
- this._adapter.removeHostListener('keydown', this._keydownListener);
146
+ this._adapter.removeHostListener('keydown', this._keydownListener, { capture: true });
147
+ this._adapter.removeHostListener('keyup', this._keyupListener, { capture: true });
125
148
  }
126
149
  }
127
150
  _dispatchSelectEvent() {
@@ -64,6 +64,7 @@ declare const ListItemComponent_base: import("../..").AbstractConstructor<import
64
64
  * @slot tertiary-text - The tertiary text.
65
65
  * @slot start - The start content.
66
66
  * @slot end - The end element.
67
+ * @slot additional-content - Additional content that appears below the main list item interactive area.
67
68
  *
68
69
  * @csspart root - The root container element.
69
70
  * @csspart text-container - The container for the text content.
@@ -13,7 +13,7 @@ import { FocusIndicatorComponent } from '../../focus-indicator';
13
13
  import { WithElementInternals } from '../../core/mixins/internals/with-element-internals';
14
14
  import { WithDefaultAria } from '../../core/mixins/internals/with-default-aria';
15
15
  import { BaseComponent } from '../../core/base/base-component';
16
- const template = '<template><div class=\"forge-list-item\" part=\"root\"><slot name=\"start\"><slot name=\"leading\"></slot></slot><div class=\"text-container\" part=\"text-container\"><slot></slot><slot name=\"secondary-text\"></slot><slot name=\"tertiary-text\"></slot></div><slot name=\"end\"><slot name=\"trailing\"></slot></slot></div></template>';
16
+ const template = '<template><div class=\"forge-list-item\" part=\"root\"><slot name=\"start\"><slot name=\"leading\"></slot></slot><div class=\"text-container\" part=\"text-container\"><slot></slot><slot name=\"secondary-text\"></slot><slot name=\"tertiary-text\"></slot></div><slot name=\"end\"><slot name=\"trailing\"></slot></slot></div><slot name=\"additional-content\"></slot></template>';
17
17
  const styles = ':host{--_list-item-indent:var(--forge-list-item-indent, var(--forge-spacing-xxlarge, 48px));--_list-item-dense-indent:var(--forge-list-item-dense-indent, var(--forge-spacing-xxlarge, 48px));--_list-item-disabled-cursor:var(--forge-list-item-disabled-cursor, not-allowed)}:host{display:block;outline:0}:host([hidden]){display:none}.forge-list-item{--_list-item-background:var(--forge-list-item-background, transparent);--_list-item-shape:var(--forge-list-item-shape, 0);--_list-item-padding:var(--forge-list-item-padding, 0 var(--forge-spacing-medium, 16px));--_list-item-margin:var(--forge-list-item-margin, 0);--_list-item-height:var(--forge-list-item-height, 48px);--_list-item-dense-height:var(--forge-list-item-dense-height, 32px);--_list-item-cursor:var(--forge-list-item-cursor, pointer);--_list-item-gap:var(--forge-list-item-gap, var(--forge-spacing-large, 24px));--_list-item-text-color:var(--forge-list-item-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));--_list-item-text-font-size:var(--forge-list-item-text-font-size, var(--forge-typography-body2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 1))));--_list-item-text-font-weight:var(--forge-list-item-text-font-weight, var(--forge-typography-body2-font-weight, 400));--_list-item-text-line-height:var(--forge-list-item-text-line-height, 1.5rem);--_list-item-selected-color:var(--forge-list-item-selected-color, var(--forge-theme-primary, #3f51b5));--_list-item-selected-background:var(--forge-list-item-selected-background, var(--_list-item-selected-color));--_list-item-selected-opacity:var(--forge-list-item-selected-opacity, 0.08);--_list-item-selected-start-color:var(--forge-list-item-selected-start-color, var(--_list-item-selected-color));--_list-item-selected-end-color:var(--forge-list-item-selected-end-color, var(--_list-item-selected-color));--_list-item-selected-text-color:var(--forge-list-item-selected-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));--_list-item-disabled-opacity:var(--forge-list-item-disabled-opacity, 0.38);--_list-item-one-line-height:var(--forge-list-item-one-line-height, var(--_list-item-height));--_list-item-two-line-height:var(--forge-list-item-two-line-height, var(--forge-list-item-height, 72px));--_list-item-three-line-height:var(--forge-list-item-three-line-height, var(--forge-list-item-height, 88px));--_list-item-dense-one-line-height:var(--forge-list-item-dense-one-line-height, var(--_list-item-dense-height));--_list-item-dense-two-line-height:var(--forge-list-item-dense-two-line-height, var(--forge-list-item-dense-height, 56px));--_list-item-dense-three-line-height:var(--forge-list-item-dense-three-line-height, var(--forge-list-item-dense-height, 72px));--_list-item-dense-font-size:var(--forge-list-item-dense-font-size, 0.875rem);--_list-item-dense-gap:var(--forge-list-item-dense-gap, var(--forge-spacing-xsmall, 8px));--_list-item-start-selected-color:var(--forge-list-item-start-selected-color, var(--_list-item-selected-color));--_list-item-end-selected-color:var(--forge-list-item-end-selected-color, var(--_list-item-selected-color));--_list-item-wrap-padding:var(--forge-list-item-wrap-padding, var(--forge-spacing-xsmall, 8px) var(--forge-spacing-medium, 16px))}.forge-list-item{position:relative;display:flex;gap:var(--_list-item-gap);align-items:center;box-sizing:border-box;outline:0;text-decoration:none;border-radius:var(--_list-item-shape);-webkit-tap-highlight-color:transparent;background-color:var(--_list-item-background);height:var(--_list-item-height);min-height:var(--_list-item-height);padding:var(--_list-item-padding);margin:var(--_list-item-margin)}.forge-list-item.interactive{cursor:var(--_list-item-cursor)}.forge-list-item.disabled{cursor:var(--_list-item-disabled-cursor);opacity:var(--_list-item-disabled-opacity)}.forge-list-item.disabled ::slotted(button){cursor:var(--_list-item-disabled-cursor)}.anchor{position:absolute;inset:0}:host([two-line]) .forge-list-item{height:var(--_list-item-two-line-height);min-height:var(--_list-item-two-line-height)}:host([three-line]) .forge-list-item{height:var(--_list-item-three-line-height);min-height:var(--_list-item-three-line-height)}:host([dense]) .forge-list-item{--_list-item-gap:var(--_list-item-dense-gap);height:var(--_list-item-dense-one-line-height);min-height:var(--_list-item-dense-one-line-height)}:host([dense]) .text-container{font-size:var(--_list-item-dense-font-size)}:host([dense][indented]){margin-inline-start:var(--_list-item-dense-indent)}:host([dense][two-line]) .forge-list-item{height:var(--_list-item-dense-two-line-height);min-height:var(--_list-item-dense-two-line-height)}:host([dense][three-line]) .forge-list-item{height:var(--_list-item-dense-three-line-height);min-height:var(--_list-item-dense-three-line-height)}:host([selected]) .forge-list-item{color:var(--_list-item-selected-color)}:host([selected]) .forge-list-item::before{content:\"\";position:absolute;inset:0;border-radius:inherit;opacity:var(--_list-item-selected-opacity);background-color:var(--_list-item-selected-background);pointer-events:none}:host([selected]) .forge-list-item ::slotted([slot=end]),:host([selected]) .forge-list-item ::slotted([slot=leading]),:host([selected]) .forge-list-item ::slotted([slot=start]),:host([selected]) .forge-list-item ::slotted([slot=trailing]){color:var(--_list-item-selected-color);isolation:isolate}:host([selected]) .forge-list-item ::slotted([slot=leading]),:host([selected]) .forge-list-item ::slotted([slot=start]){color:var(--_list-item-start-selected-color)}:host([selected]) .forge-list-item ::slotted([slot=end]),:host([selected]) .forge-list-item ::slotted([slot=trailing]){color:var(--_list-item-end-selected-color)}:host([selected]) .text-container{color:var(--_list-item-selected-color)}:host([selected]) forge-state-layer{--forge-state-layer-color:var(--_list-item-selected-color)}:host([indented]) .forge-list-item{margin-inline-start:var(--_list-item-indent)}.text-container{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--forge-typography-body2-font-family, var(--forge-typography-font-family, \"Roboto\", sans-serif));letter-spacing:var(--forge-typography-body2-letter-spacing, .015625em);text-transform:var(--forge-typography-body2-text-transform,inherit);text-decoration:var(--forge-typography-body2-text-decoration,inherit);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-sizing:border-box;isolation:isolate;font-size:var(--_list-item-text-font-size);font-weight:var(--_list-item-text-font-weight);line-height:var(--_list-item-text-line-height);flex:1;contain:layout}slot[name=secondary-text]::slotted(*),slot[name=tertiary-text]::slotted(*){-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--forge-typography-body1-font-family, var(--forge-typography-font-family, \"Roboto\", sans-serif));font-size:var(--forge-typography-body1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, .875)));font-weight:var(--forge-typography-body1-font-weight,400);line-height:var(--forge-typography-body1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-line-height-scale, 1.125)));letter-spacing:var(--forge-typography-body1-letter-spacing, .0357142857em);text-transform:var(--forge-typography-body1-text-transform,inherit);text-decoration:var(--forge-typography-body1-text-decoration,inherit);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--_list-item-text-color);display:block}:host([selected]) slot[name=secondary-text]::slotted(*),:host([selected]) slot[name=tertiary-text]::slotted(*){color:var(--_list-item-selected-text-color)}::slotted(:is(button:not([slot]),[forge-list-item-button])){appearance:none;cursor:var(--_list-item-cursor);border:none;padding-block:0;padding-inline:0;margin:0;box-sizing:border-box;width:100%;background:0 0;color:inherit;outline:0;font:inherit;user-select:auto;text-align:inherit;letter-spacing:inherit;word-spacing:inherit;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block}::slotted(a){outline:0;color:inherit!important;text-decoration:none!important}::slotted([slot=end]),::slotted([slot=leading]),::slotted([slot=start]),::slotted([slot=trailing]){color:var(--_list-item-text-color);display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;fill:currentColor}:host(:not([noninteractive])) ::slotted(:is(forge-checkbox,forge-radio,forge-switch):is([slot=start],[slot=end],[slot=leading],[slot=trailing]):not([forge-ignore])){--forge-focus-indicator-display:none;--forge-state-layer-display:none}:host([selected]) ::slotted([slot=leading]),:host([selected]) ::slotted([slot=start]){color:var(--_list-item-start-selected-color)}:host([selected]) ::slotted([slot=end]),:host([selected]) ::slotted([slot=trailing]){color:var(--_list-item-end-selected-color)}:host([wrap]) .forge-list-item{--_list-item-padding:var(--_list-item-wrap-padding);height:auto}:host([wrap]) .text-container{white-space:normal;overflow:visible;text-overflow:clip;line-height:normal}:host([wrap]) ::slotted(:is(button,[role=button][tabindex],[forge-list-item-button])){white-space:normal}:host([wrap]) slot[name=secondary-text]::slotted(*),:host([wrap]) slot[name=tertiary-text]::slotted(*){white-space:normal;overflow:visible;text-overflow:clip;line-height:normal}forge-focus-indicator{z-index:1;--forge-focus-indicator-shape:calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1))}forge-state-layer{border-radius:inherit}';
18
18
  /**
19
19
  * @tag forge-list-item
@@ -49,6 +49,7 @@ const styles = ':host{--_list-item-indent:var(--forge-list-item-indent, var(--fo
49
49
  * @slot tertiary-text - The tertiary text.
50
50
  * @slot start - The start content.
51
51
  * @slot end - The end element.
52
+ * @slot additional-content - Additional content that appears below the main list item interactive area.
52
53
  *
53
54
  * @csspart root - The root container element.
54
55
  * @csspart text-container - The container for the text content.
@@ -39,6 +39,10 @@ export declare const LIST_DROPDOWN_CONSTANTS: {
39
39
  classes: {
40
40
  GROUP_WRAPPER: string;
41
41
  };
42
+ selectAllOption: {
43
+ VALUE: string;
44
+ LABEL: string;
45
+ };
42
46
  };
43
47
  export type ListDropdownOptionBuilder<T = HTMLElement> = (option: IListDropdownOption, parentElement: T) => HTMLElement | string | void;
44
48
  export type ListDropdownHeaderBuilder = () => HTMLElement;
@@ -84,6 +88,8 @@ export interface IListDropdownConfig<T = any> {
84
88
  options: Array<IListDropdownOption | IListDropdownOptionGroup>;
85
89
  selectCallback: (value: T) => void;
86
90
  activeChangeCallback?: (id: string) => void;
91
+ showSelectAll?: boolean;
92
+ selectAllLabel?: string;
87
93
  closeCallback?: () => void;
88
94
  syncWidth?: boolean;
89
95
  constrainViewportWidth?: boolean;
@@ -25,10 +25,15 @@ const attributes = {
25
25
  const classes = {
26
26
  GROUP_WRAPPER: 'forge-list-dropdown__group-wrapper'
27
27
  };
28
+ const selectAllOption = {
29
+ VALUE: '__forge_select_all__',
30
+ LABEL: 'Select All'
31
+ };
28
32
  export const LIST_DROPDOWN_CONSTANTS = {
29
33
  observedAttributes,
30
34
  attributes,
31
- classes
35
+ classes,
36
+ selectAllOption
32
37
  };
33
38
  export const DEFAULT_LIST_DROPDOWN_CONFIG = {
34
39
  options: [],
@@ -97,8 +97,35 @@ export function createList(config) {
97
97
  * @param config
98
98
  */
99
99
  export function createListItems(config, listElement, options, startIndex = 0, renderSelected = true) {
100
+ // Add select all option if enabled and in multiple mode
101
+ let optionsToRender = options || config.options;
102
+ if (config.showSelectAll && config.multiple && startIndex === 0) {
103
+ const selectAllOption = {
104
+ value: LIST_DROPDOWN_CONSTANTS.selectAllOption.VALUE,
105
+ label: config.selectAllLabel || LIST_DROPDOWN_CONSTANTS.selectAllOption.LABEL
106
+ };
107
+ const dividerOption = {
108
+ value: '',
109
+ label: '',
110
+ divider: true
111
+ };
112
+ // Inject select all at the beginning
113
+ if (isListDropdownOptionType(optionsToRender, ListDropdownOptionType.Group)) {
114
+ const optionGroups = optionsToRender;
115
+ if (optionGroups.length > 0) {
116
+ optionGroups[0] = { ...optionGroups[0], options: [selectAllOption, dividerOption, ...optionGroups[0].options] };
117
+ optionsToRender = optionGroups;
118
+ }
119
+ else {
120
+ optionsToRender = [{ text: '', options: [selectAllOption, dividerOption] }];
121
+ }
122
+ }
123
+ else {
124
+ optionsToRender = [selectAllOption, dividerOption, ...optionsToRender];
125
+ }
126
+ }
100
127
  // Ensure the options are provided in the form a group (if no groups provided, then we have one anonymous group of options)
101
- const groups = getOptionsByGroup(options || config.options);
128
+ const groups = getOptionsByGroup(optionsToRender);
102
129
  const flatOptions = getFlattenedOptions(groups);
103
130
  const limitOptions = config.optionLimit ? true : false;
104
131
  let optionLimit = config.optionLimit || 0;