@tylertech/forge 3.8.0-dev.3 → 3.8.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 (78) hide show
  1. package/custom-elements.json +3948 -3215
  2. package/dist/app-bar/forge-app-bar.css +20 -11
  3. package/dist/forge.css +2 -2
  4. package/dist/lib.js +14 -14
  5. package/dist/lib.js.map +4 -4
  6. package/dist/table/forge-table.css +2 -2
  7. package/dist/vscode.css-custom-data.json +218 -208
  8. package/dist/vscode.html-custom-data.json +370 -245
  9. package/esm/app-bar/app-bar/app-bar-constants.d.ts +2 -0
  10. package/esm/app-bar/app-bar/app-bar-constants.js +2 -1
  11. package/esm/app-bar/app-bar/app-bar-core.d.ts +5 -1
  12. package/esm/app-bar/app-bar/app-bar-core.js +10 -0
  13. package/esm/app-bar/app-bar/app-bar.d.ts +9 -1
  14. package/esm/app-bar/app-bar/app-bar.js +15 -2
  15. package/esm/app-bar/help-button/app-bar-help-button.js +1 -1
  16. package/esm/app-bar/menu-button/app-bar-menu-button.js +1 -1
  17. package/esm/app-bar/notification-button/app-bar-notification-button.js +1 -1
  18. package/esm/app-bar/profile-button/app-bar-profile-button.d.ts +1 -1
  19. package/esm/app-bar/profile-button/app-bar-profile-button.js +13 -10
  20. package/esm/app-bar/search/app-bar-search.js +1 -1
  21. package/esm/autocomplete/autocomplete-core.js +5 -0
  22. package/esm/avatar/avatar.d.ts +4 -4
  23. package/esm/avatar/avatar.js +5 -6
  24. package/esm/badge/badge.d.ts +4 -3
  25. package/esm/badge/badge.js +5 -4
  26. package/esm/button/button-constants.d.ts +1 -1
  27. package/esm/button/button.js +1 -1
  28. package/esm/card/card.d.ts +4 -3
  29. package/esm/card/card.js +3 -2
  30. package/esm/core/base/base-lit-element.d.ts +9 -0
  31. package/esm/core/base/base-lit-element.js +12 -0
  32. package/esm/core/utils/lit-utils.d.ts +11 -0
  33. package/esm/core/utils/lit-utils.js +31 -0
  34. package/esm/dialog/dialog-adapter.d.ts +0 -1
  35. package/esm/dialog/dialog-adapter.js +4 -39
  36. package/esm/dialog/dialog-constants.d.ts +6 -2
  37. package/esm/dialog/dialog-constants.js +4 -4
  38. package/esm/dialog/dialog-core.d.ts +3 -3
  39. package/esm/dialog/dialog-core.js +8 -7
  40. package/esm/dialog/dialog.d.ts +3 -3
  41. package/esm/dialog/dialog.js +4 -4
  42. package/esm/icon-button/icon-button-constants.d.ts +1 -1
  43. package/esm/icon-button/icon-button.js +1 -1
  44. package/esm/key/key/key.d.ts +3 -2
  45. package/esm/key/key/key.js +3 -2
  46. package/esm/key/key-item/key-item.d.ts +3 -2
  47. package/esm/key/key-item/key-item.js +3 -2
  48. package/esm/list-dropdown/list-dropdown-aware-core.d.ts +22 -0
  49. package/esm/list-dropdown/list-dropdown-aware-core.js +30 -0
  50. package/esm/list-dropdown/list-dropdown-aware.d.ts +35 -0
  51. package/esm/list-dropdown/list-dropdown-aware.js +35 -16
  52. package/esm/list-dropdown/list-dropdown-constants.d.ts +22 -3
  53. package/esm/list-dropdown/list-dropdown-constants.js +9 -1
  54. package/esm/list-dropdown/list-dropdown-utils.js +6 -0
  55. package/esm/menu/menu-core.js +2 -0
  56. package/esm/menu/menu.js +1 -0
  57. package/esm/meter/meter/meter.d.ts +4 -2
  58. package/esm/meter/meter/meter.js +4 -2
  59. package/esm/meter/meter-group/meter-group.d.ts +3 -2
  60. package/esm/meter/meter-group/meter-group.js +3 -2
  61. package/esm/overlay/base/overlay-aware.d.ts +4 -4
  62. package/esm/overlay/base/overlay-aware.js +3 -3
  63. package/esm/select/core/base-select-core.js +5 -0
  64. package/esm/select/select/select.d.ts +25 -1
  65. package/esm/select/select/select.js +26 -1
  66. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  67. package/esm/tabs/tab-bar/tab-bar.js +1 -1
  68. package/package.json +2 -2
  69. package/sass/app-bar/app-bar/_core.scss +0 -1
  70. package/sass/app-bar/app-bar/app-bar.scss +57 -23
  71. package/sass/app-bar/forge-app-bar.scss +41 -11
  72. package/sass/app-bar/search/app-bar-search.scss +3 -0
  73. package/sass/button/button.scss +24 -0
  74. package/sass/core/styles/scrollbar/index.scss +14 -0
  75. package/sass/core/styles/tokens/app-bar/app-bar/_tokens.scss +2 -8
  76. package/sass/icon-button/icon-button.scss +8 -9
  77. package/sass/table/_core.scss +1 -1
  78. package/sass/tabs/tab-bar/tab-bar.scss +24 -0
@@ -14,7 +14,8 @@ import { FieldDensity, FieldLabelPosition } from '../../field';
14
14
  import { IWithBaseField } from '../../field/base/with-base-field';
15
15
  import { BaseSelectComponent, IBaseSelectComponent } from '../core';
16
16
  import { SelectCore } from './select-core';
17
- export interface ISelectComponent extends IWithFormAssociation, IWithFocusable, IWithLabelAwareness, IWithElementInternals, IWithDefaultAria, IWithBaseField, IBaseSelectComponent {
17
+ import { IListDropdownAware } from '../../list-dropdown/list-dropdown-aware';
18
+ export interface ISelectComponent extends IWithFormAssociation, IWithFocusable, IWithLabelAwareness, IWithElementInternals, IWithDefaultAria, IWithBaseField, IBaseSelectComponent, IListDropdownAware {
18
19
  label: string;
19
20
  placeholder: string;
20
21
  setFormValue(value: FormValue | null, state?: FormValue | null | undefined): void;
@@ -63,6 +64,20 @@ declare const SelectComponent_base: import("../../constants").AbstractConstructo
63
64
  * @property {SelectOptionBuilder} optionBuilder - Gets/sets the option builder function.
64
65
  * @property {SelectSelectedTextBuilder} selectedTextBuilder - Gets/sets the selected text builder function.
65
66
  * @property {SelectBeforeValueChangeCallback<any>} beforeValueChange - Gets/sets the before value change callback.
67
+ * @property {string | string[]; - } popupClasses - Gets/sets the list of classes to apply to the popup element.
68
+ * @property {ListDropdownHeaderBuilder} popupHeaderBuilder - Gets/sets the callback function for generating header content within the popup.
69
+ * @property {ListDropdownFooterBuilder} popupFooterBuilder - Gets/sets the callback function for generating header content within the popup.
70
+ * @property {boolean} [syncPopupWidth=false] - Gets/sets whether the popup width is synchronized with the popup target width.
71
+ * @property {number} optionLimit - Gets/sets the maximum number of options to display in the dropdown.
72
+ * @property {boolean} [observeScroll=false] - Controls the observation of scroll events on the dropdown.
73
+ * @property {number} [observeScrollThreshold=0] - The number of pixels from the bottom to trigger the scroll bottom event. Only applicable if `observeScroll` is true.
74
+ * @property {boolean} [constrainPopupWidth=true] - Gets/sets whether the popup width will be constrained to a max width of the viewport width (default: `100vw`).
75
+ * @property {boolean} [wrapOptionText=false] - Gets/sets whether the options will wrap their text or not. This only applies if `constrainPopupWidth` is `true`, if there is an explicit width set via CSS.
76
+ * @property {OverlayPlacement} [popoverPlacement="bottom"] - Gets/sets the placement of the popover.
77
+ * @property {IOverlayOffset} popoverOffset - Gets/sets the offset of the popover.
78
+ * @property {OverlayFlipState} [popoverFlip="auto"] - Gets/sets the flip state of the popover.
79
+ * @property {OverlayShiftState} [popoverShift="auto"] - Gets/sets whether the popover should shift to fit within the viewport.
80
+ * @property {PositionPlacement | null} popoverFallbackPlacements - Gets/sets the fallback placements of the popover.
66
81
  *
67
82
  * @attribute {string} label - Controls the label text.
68
83
  * @attribute {string} placeholder - Controls the placeholder text.
@@ -70,6 +85,15 @@ declare const SelectComponent_base: import("../../constants").AbstractConstructo
70
85
  * @attribute {number | number[]} selected-index - Gets/sets the selected index.
71
86
  * @attribute {boolean} multiple - Gets/sets the multiple select state.
72
87
  * @attribute {boolean} open - Gets/sets the open state.
88
+ * @attribute {boolean} [sync-popup-width=false] - Gets/sets whether the popup width is synchronized with the popup target width.
89
+ * @attribute {number} option-limit - Gets/sets the maximum number of options to display in the dropdown.
90
+ * @attribute {boolean} [observe-scroll=false] - Controls the observation of scroll events on the dropdown.
91
+ * @attribute {number} [observe-scroll-threshold=0] - The number of pixels from the bottom to trigger the scroll bottom event. Only applicable if `observeScroll` is true.
92
+ * @attribute {boolean} [wrap-option-text=false] - Gets/sets whether the options will wrap their text or not. This only applies if `constrainPopupWidth` is `true`, if there is an explicit width set via CSS.
93
+ * @attribute {OverlayPlacement} [popover-placement="bottom"] - Gets/sets the placement of the popover.
94
+ * @attribute {IOverlayOffset} popover-offset - Gets/sets the offset of the popover.
95
+ * @attribute {OverlayFlipState} [popover-flip="auto"] - Gets/sets the flip state of the popover.
96
+ * @attribute {OverlayShiftState} [popover-shift="auto"] - Gets/sets whether the popover should shift to fit within the viewport.
73
97
  *
74
98
  * @cssproperty --forge-select-placeholder-color - The color of the placeholder text.
75
99
  * @cssproperty --forge-field-background - The background of the field surface.
@@ -27,7 +27,8 @@ import { OptionGroupComponent } from '../option-group';
27
27
  import { SelectAdapter } from './select-adapter';
28
28
  import { SELECT_CONSTANTS } from './select-constants';
29
29
  import { SelectCore } from './select-core';
30
- const template = '<template><forge-field id=\"field\" popover-icon focus-indicator-allow-focus focus-indicator-focus-mode=\"focus\"><label id=\"select-label\" aria-hidden=\"true\" part=\"label\" slot=\"label\"></label><slot slot=\"start\" name=\"start\"></slot><div data-forge-field-input class=\"selected-text-container\" part=\"text-container\" aria-live=\"assertive\" aria-atomic=\"true\"><slot name=\"value\"><span id=\"selected-text\" class=\"selected-text\" part=\"text\"></span></slot></div><slot slot=\"end\" name=\"end\"></slot><slot slot=\"accessory\" name=\"accessory\"></slot><slot slot=\"support-text\" name=\"support-text\"></slot><slot slot=\"support-text-end\" name=\"support-text-end\"></slot><slot slot=\"start\" name=\"leading\"></slot><slot slot=\"end\" name=\"trailing\"></slot><slot slot=\"accessory\" name=\"addon-end\"></slot><slot slot=\"support-text\" name=\"helper-text\"></slot></forge-field></template>';
30
+ import { ListDropdownAware } from '../../list-dropdown/list-dropdown-aware';
31
+ const template = '<template><forge-field id=\"field\" popover-icon focus-indicator-allow-focus focus-indicator-focus-mode=\"focus\"><span id=\"select-label\" slot=\"label\"></span><slot slot=\"start\" name=\"start\"></slot><div data-forge-field-input class=\"selected-text-container\" part=\"text-container\" aria-live=\"assertive\" aria-atomic=\"true\"><slot name=\"value\"><span id=\"selected-text\" class=\"selected-text\" part=\"text\"></span></slot></div><slot slot=\"end\" name=\"end\"></slot><slot slot=\"accessory\" name=\"accessory\"></slot><slot slot=\"support-text\" name=\"support-text\"></slot><slot slot=\"support-text-end\" name=\"support-text-end\"></slot><slot slot=\"start\" name=\"leading\"></slot><slot slot=\"end\" name=\"trailing\"></slot><slot slot=\"accessory\" name=\"addon-end\"></slot><slot slot=\"support-text\" name=\"helper-text\"></slot></forge-field></template>';
31
32
  const styles = ':host{display:block;outline:0}:host([hidden]){display:none}forge-field{--_select-placeholder-color:var(--forge-select-placeholder-color, var(--forge-field-placeholder-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6))))}.selected-text-container{display:grid;align-items:center;cursor:pointer}.selected-text,::slotted([slot=value]){white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.selected-text:empty::before{content:attr(placeholder);color:var(--_select-placeholder-color);font-size:inherit}:host([disabled]) .selected-text-container{cursor:not-allowed}forge-field{display:contents}';
32
33
  /**
33
34
  * @tag forge-select
@@ -60,6 +61,20 @@ const styles = ':host{display:block;outline:0}:host([hidden]){display:none}forge
60
61
  * @property {SelectOptionBuilder} optionBuilder - Gets/sets the option builder function.
61
62
  * @property {SelectSelectedTextBuilder} selectedTextBuilder - Gets/sets the selected text builder function.
62
63
  * @property {SelectBeforeValueChangeCallback<any>} beforeValueChange - Gets/sets the before value change callback.
64
+ * @property {string | string[]; - } popupClasses - Gets/sets the list of classes to apply to the popup element.
65
+ * @property {ListDropdownHeaderBuilder} popupHeaderBuilder - Gets/sets the callback function for generating header content within the popup.
66
+ * @property {ListDropdownFooterBuilder} popupFooterBuilder - Gets/sets the callback function for generating header content within the popup.
67
+ * @property {boolean} [syncPopupWidth=false] - Gets/sets whether the popup width is synchronized with the popup target width.
68
+ * @property {number} optionLimit - Gets/sets the maximum number of options to display in the dropdown.
69
+ * @property {boolean} [observeScroll=false] - Controls the observation of scroll events on the dropdown.
70
+ * @property {number} [observeScrollThreshold=0] - The number of pixels from the bottom to trigger the scroll bottom event. Only applicable if `observeScroll` is true.
71
+ * @property {boolean} [constrainPopupWidth=true] - Gets/sets whether the popup width will be constrained to a max width of the viewport width (default: `100vw`).
72
+ * @property {boolean} [wrapOptionText=false] - Gets/sets whether the options will wrap their text or not. This only applies if `constrainPopupWidth` is `true`, if there is an explicit width set via CSS.
73
+ * @property {OverlayPlacement} [popoverPlacement="bottom"] - Gets/sets the placement of the popover.
74
+ * @property {IOverlayOffset} popoverOffset - Gets/sets the offset of the popover.
75
+ * @property {OverlayFlipState} [popoverFlip="auto"] - Gets/sets the flip state of the popover.
76
+ * @property {OverlayShiftState} [popoverShift="auto"] - Gets/sets whether the popover should shift to fit within the viewport.
77
+ * @property {PositionPlacement | null} popoverFallbackPlacements - Gets/sets the fallback placements of the popover.
63
78
  *
64
79
  * @attribute {string} label - Controls the label text.
65
80
  * @attribute {string} placeholder - Controls the placeholder text.
@@ -67,6 +82,15 @@ const styles = ':host{display:block;outline:0}:host([hidden]){display:none}forge
67
82
  * @attribute {number | number[]} selected-index - Gets/sets the selected index.
68
83
  * @attribute {boolean} multiple - Gets/sets the multiple select state.
69
84
  * @attribute {boolean} open - Gets/sets the open state.
85
+ * @attribute {boolean} [sync-popup-width=false] - Gets/sets whether the popup width is synchronized with the popup target width.
86
+ * @attribute {number} option-limit - Gets/sets the maximum number of options to display in the dropdown.
87
+ * @attribute {boolean} [observe-scroll=false] - Controls the observation of scroll events on the dropdown.
88
+ * @attribute {number} [observe-scroll-threshold=0] - The number of pixels from the bottom to trigger the scroll bottom event. Only applicable if `observeScroll` is true.
89
+ * @attribute {boolean} [wrap-option-text=false] - Gets/sets whether the options will wrap their text or not. This only applies if `constrainPopupWidth` is `true`, if there is an explicit width set via CSS.
90
+ * @attribute {OverlayPlacement} [popover-placement="bottom"] - Gets/sets the placement of the popover.
91
+ * @attribute {IOverlayOffset} popover-offset - Gets/sets the offset of the popover.
92
+ * @attribute {OverlayFlipState} [popover-flip="auto"] - Gets/sets the flip state of the popover.
93
+ * @attribute {OverlayShiftState} [popover-shift="auto"] - Gets/sets whether the popover should shift to fit within the viewport.
70
94
  *
71
95
  * @cssproperty --forge-select-placeholder-color - The color of the placeholder text.
72
96
  * @cssproperty --forge-field-background - The background of the field surface.
@@ -135,6 +159,7 @@ const styles = ':host{display:block;outline:0}:host([hidden]){display:none}forge
135
159
  let SelectComponent = class SelectComponent extends WithFormAssociation(WithLabelAwareness(WithFocusable(WithDefaultAria(WithElementInternals(WithBaseField((BaseSelectComponent))))))) {
136
160
  static get observedAttributes() {
137
161
  return [
162
+ ...ListDropdownAware.observedAttributes,
138
163
  ...Object.values(BASE_FIELD_CONSTANTS.observedAttributes),
139
164
  ...Object.values(SELECT_CONSTANTS.observedAttributes),
140
165
  ...Object.values(BASE_SELECT_CONSTANTS.observedAttributes)
@@ -13,7 +13,7 @@ import { SplitViewPanelCore } from './split-view-panel-core';
13
13
  import { SplitViewPanelAdapter } from './split-view-panel-adapter';
14
14
  import { IconComponent, IconRegistry } from '../../icon';
15
15
  const template = '<template><div class=\"forge-split-view-panel\" id=\"root\" part=\"root\"><div class=\"forge-split-view-panel__handle\" id=\"handle\" part=\"handle\" role=\"separator\" aria-controls=\"content\" aria-grabbed=\"false\" tabindex=\"0\"><forge-icon class=\"forge-split-view-panel__icon\" id=\"icon\" part=\"icon\"></forge-icon><forge-state-layer target=\"handle\" id=\"state-layer\" exportparts=\"surface:state-layer\"></forge-state-layer><forge-focus-indicator inward target=\"handle\" part=\"focus-indicator\"></forge-focus-indicator></div><div class=\"forge-split-view-panel__content\" id=\"content\" part=\"content\" role=\"group\"><slot></slot></div></div></template>';
16
- const styles = '.forge-split-view-panel{display:flex;width:100%;height:100%;overflow:hidden}.forge-split-view-panel__handle{color:var(--forge-theme-text-medium,rgba(0,0,0,.6));background-color:var(--forge-theme-outline,#e0e0e0);position:relative;display:flex;flex-shrink:0;justify-content:center;align-items:center;outline:0}.forge-split-view-panel__content{flex:1;overflow:hidden}.forge-split-view-panel--closed{display:none}.forge-split-view-panel--disabled #handle{pointer-events:none}.forge-split-view-panel--disabled .forge-split-view-panel__icon{display:none}.forge-split-view-panel[orientation=horizontal]{min-width:var(--forge-split-view-handle-width,8px);width:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uhgtfsn;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uhgtfsn{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;animation-name:uhgtft0;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uhgtft0{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uhgtft9;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uhgtft9{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;animation-name:uhgtfts;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uhgtfts{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:var(--forge-split-view-handle-width,8px);height:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uhgtfu1;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uhgtfu1{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uhgtfus;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uhgtfus{from{transform:none}to{transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uhgtfv4;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uhgtfv4{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uhgtfvf;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uhgtfvf{from{transform:none}to{transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){flex:1}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel{width:100%;height:100%;min-width:0;min-height:0}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel__handle{display:none}forge-focus-indicator{--forge-focus-indicator-active-width:2px}';
16
+ const styles = '.forge-split-view-panel{display:flex;width:100%;height:100%;overflow:hidden}.forge-split-view-panel__handle{color:var(--forge-theme-text-medium,rgba(0,0,0,.6));background-color:var(--forge-theme-outline,#e0e0e0);position:relative;display:flex;flex-shrink:0;justify-content:center;align-items:center;outline:0}.forge-split-view-panel__content{flex:1;overflow:hidden}.forge-split-view-panel--closed{display:none}.forge-split-view-panel--disabled #handle{pointer-events:none}.forge-split-view-panel--disabled .forge-split-view-panel__icon{display:none}.forge-split-view-panel[orientation=horizontal]{min-width:var(--forge-split-view-handle-width,8px);width:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:u910hqj;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes u910hqj{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;animation-name:u910hqz;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes u910hqz{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:u910hrq;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes u910hrq{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;animation-name:u910hrw;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes u910hrw{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:var(--forge-split-view-handle-width,8px);height:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:u910hsf;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes u910hsf{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;animation-name:u910ht3;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes u910ht3{from{transform:none}to{transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:u910htz;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes u910htz{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;animation-name:u910hul;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes u910hul{from{transform:none}to{transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){flex:1}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel{width:100%;height:100%;min-width:0;min-height:0}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel__handle{display:none}forge-focus-indicator{--forge-focus-indicator-active-width:2px}';
17
17
  import { StateLayerComponent } from '../../state-layer';
18
18
  import { FocusIndicatorComponent } from '../../focus-indicator';
19
19
  /**
@@ -17,7 +17,7 @@ import { WithElementInternals } from '../../core/mixins/internals/with-element-i
17
17
  import { WithDefaultAria } from '../../core/mixins/internals/with-default-aria';
18
18
  import { setDefaultAria } from '../../constants';
19
19
  const template = '<template><div class=\"forge-tab-bar\" part=\"container\"><div class=\"scroll-container\" part=\"scroll-container\"><slot></slot></div></div></template>';
20
- const styles = ':host{position:relative;display:block}:host([hidden]){display:none}.forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, space-between);--_tab-bar-stretch:var(--forge-tab-bar-stretch, 1);--_tab-bar-divider-color:var(--forge-tab-bar-divider-color, var(--forge-theme-outline, #e0e0e0));--_tab-bar-divider-thickness:var(--forge-tab-bar-divider-thickness, 1px)}.forge-tab-bar{position:relative;display:grid;grid-template-columns:auto 1fr auto;max-width:100%;max-height:100%;align-items:center;border-bottom:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color)}.scroll-container{position:relative;display:flex;justify-content:var(--_tab-bar-justify);align-items:flex-end;box-sizing:border-box;overflow:auto;scroll-behavior:smooth;scrollbar-width:none;grid-column:2}.scroll-container::-webkit-scrollbar{display:none}::slotted(*){flex:var(--_tab-bar-stretch);align-self:stretch}::slotted([selected]){z-index:1}forge-icon-button{--forge-icon-button-shape-squared:0px}:host([vertical]) .forge-tab-bar{grid-template-columns:none;grid-template-rows:auto 1fr auto;align-items:initial;border-bottom:none;border-right:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color);height:100%}:host([vertical]) .scroll-container{display:inline-flex;flex-direction:column;align-items:stretch;gap:0;grid-column:auto;grid-row:2}:host([vertical]) .scroll-button{justify-self:center}:host([inverted]:not([vertical])) .forge-tab-bar{border-bottom:none;border-top:variale(divider-thickness) solid var(--_tab-bar-divider-color)}:host([inverted][vertical]) .forge-tab-bar{border-bottom:none;border-top:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color)}:host([clustered]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-start);--_tab-bar-stretch:var(--forge-tab-bar-stretch, 0)}:host([clustered=start]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-start)}:host([clustered=center]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, center)}:host([clustered=end]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-end)}';
20
+ const styles = ':host{position:relative;display:block}:host([hidden]){display:none}.forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, space-between);--_tab-bar-stretch:var(--forge-tab-bar-stretch, 1);--_tab-bar-divider-color:var(--forge-tab-bar-divider-color, var(--forge-theme-outline, #e0e0e0));--_tab-bar-divider-thickness:var(--forge-tab-bar-divider-thickness, 1px)}.forge-tab-bar{position:relative;display:grid;grid-template-columns:auto 1fr auto;max-width:100%;max-height:100%;align-items:center;border-bottom:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color)}.scroll-container{position:relative;display:flex;justify-content:var(--_tab-bar-justify);align-items:flex-end;box-sizing:border-box;overflow:auto;scroll-behavior:smooth;scrollbar-width:none;grid-column:2}.scroll-container::-webkit-scrollbar{display:none}::slotted(*){flex:var(--_tab-bar-stretch);align-self:stretch}::slotted([selected]){z-index:1}forge-icon-button{--forge-icon-button-shape-squared:0px}:host([vertical]) .forge-tab-bar{grid-template-columns:none;grid-template-rows:auto 1fr auto;align-items:initial;border-bottom:none;border-right:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color);height:100%}:host([vertical]) .scroll-container{display:inline-flex;flex-direction:column;align-items:stretch;gap:0;grid-column:auto;grid-row:2}:host([vertical]) .scroll-button{justify-self:center}:host([inverted]:not([vertical])) .forge-tab-bar{border-bottom:none;border-top:variale(divider-thickness) solid var(--_tab-bar-divider-color)}:host([inverted][vertical]) .forge-tab-bar{border-bottom:none;border-top:var(--_tab-bar-divider-thickness) solid var(--_tab-bar-divider-color)}:host([clustered]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-start);--_tab-bar-stretch:var(--forge-tab-bar-stretch, 0)}:host([clustered=start]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-start)}:host([clustered=center]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, center)}:host([clustered=end]) .forge-tab-bar{--_tab-bar-justify:var(--forge-tab-bar-justify, flex-end)}:host([theme=app-bar]){--forge-tab-active-color:var(--_app-bar-theme-foreground);--forge-tab-inactive-color:var(--_app-bar-theme-foreground-muted)}:host([theme=app-bar]) forge-icon-button{--forge-icon-button-icon-color:var(--_app-bar-theme-foreground)}';
21
21
  /**
22
22
  * @tag forge-tab-bar
23
23
  *
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tylertech/forge",
3
3
  "description": "Tyler Forge™ Web Components library",
4
- "version": "3.8.0-dev.3",
4
+ "version": "3.8.0",
5
5
  "author": "Tyler Technologies, Inc.",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -21,4 +21,4 @@
21
21
  "tslib": "^2.8.1"
22
22
  },
23
23
  "customElements": "custom-elements.json"
24
- }
24
+ }
@@ -93,7 +93,6 @@
93
93
  @mixin logo {
94
94
  font-size: #{token(logo-font-size)};
95
95
  height: 1em;
96
- width: 1em;
97
96
  }
98
97
 
99
98
  @mixin elevation-raised {
@@ -17,16 +17,6 @@
17
17
  //
18
18
 
19
19
  $host-tokens: (background, foreground);
20
- // $host-theme-tokens: (
21
- // theme-primary,
22
- // theme-on-primary,
23
- // theme-text-high,
24
- // theme-text-medium,
25
- // theme-text-low,
26
- // theme-outline-high,
27
- // theme-outline-medium,
28
- // theme-outline-low
29
- // );
30
20
 
31
21
  :host {
32
22
  @include tokens($includes: $host-tokens);
@@ -44,17 +34,36 @@ $host-tokens: (background, foreground);
44
34
  // Default theme
45
35
  //
46
36
 
37
+ :host(:not([theme]):not([theme-mode='scoped'])) {
38
+ @include theme.provide(
39
+ (
40
+ primary: #{token(foreground)},
41
+ on-primary: rgba(black, color-emphasis.value(highest)),
42
+ text-high: rgba(white, color-emphasis.value(highest)),
43
+ text-medium: rgba(white, color-emphasis.value(medium)),
44
+ text-low: rgba(white, color-emphasis.value(medium-low)),
45
+ outline-high: rgba(white, color-emphasis.value(highest)),
46
+ outline-medium: rgba(white, color-emphasis.value(medium)),
47
+ outline-low: rgba(white, color-emphasis.value(medium-low))
48
+ )
49
+ );
50
+ }
51
+
52
+ :host([theme-mode='scoped']) {
53
+ .forge-app-bar {
54
+ color: inherit;
55
+
56
+ .logo-title-container {
57
+ color: #{token(foreground)};
58
+ }
59
+ }
60
+ }
61
+
47
62
  :host {
48
63
  @include provide-theme(
49
64
  (
50
- theme-primary: #{token(foreground)},
51
- theme-on-primary: #{token(background)},
52
- theme-text-high: #{token(theme-text-high)},
53
- theme-text-medium: #{token(theme-text-medium)},
54
- theme-text-low: #{token(theme-text-low)},
55
- theme-outline-high: #{token(theme-outline-high)},
56
- theme-outline-medium: #{token(theme-outline-medium)},
57
- theme-outline-low: #{token(theme-outline-low)}
65
+ theme-foreground: #{token(foreground)},
66
+ theme-foreground-muted: rgba(white, color-emphasis.value(medium))
58
67
  )
59
68
  );
60
69
  }
@@ -133,6 +142,25 @@ $host-tokens: (background, foreground);
133
142
  }
134
143
  }
135
144
 
145
+ //
146
+ // Slotted (scoped theme mode)
147
+ //
148
+ // Attempt to auto-theme any specific slotted elements directly
149
+ //
150
+
151
+ :host([theme-mode='scoped']) {
152
+ ::slotted(:where(forge-tab-bar, forge-icon-button, forge-button)) {
153
+ color: #{token(theme-foreground)};
154
+
155
+ @include tab.provide-theme(
156
+ (
157
+ active-color: #{token(theme-foreground)},
158
+ inactive-color: #{token(theme-foreground-muted)}
159
+ )
160
+ );
161
+ }
162
+ }
163
+
136
164
  //
137
165
  // Slotted - Tab bar
138
166
  //
@@ -166,6 +194,17 @@ $host-tokens: (background, foreground);
166
194
  //
167
195
 
168
196
  :host([theme='white']) {
197
+ @include override(background, white, value);
198
+ @include override(foreground, black, value);
199
+
200
+ @include provide-theme(
201
+ (
202
+ theme-foreground-muted: rgba(black, color-emphasis.value(medium))
203
+ )
204
+ );
205
+ }
206
+
207
+ :host([theme='white']:not([theme-mode='scoped'])) {
169
208
  @include theme.provide(
170
209
  (
171
210
  primary: black,
@@ -173,9 +212,4 @@ $host-tokens: (background, foreground);
173
212
  text-medium: rgba(black, color-emphasis.value(medium))
174
213
  )
175
214
  );
176
-
177
- .forge-app-bar {
178
- @include override(background, white, value);
179
- @include override(foreground, black, value);
180
- }
181
215
  }
@@ -15,18 +15,28 @@
15
15
 
16
16
  .forge-app-bar {
17
17
  @include core.tokens;
18
- @include theme.provide(
18
+
19
+ @include core.provide-theme(
19
20
  (
20
- primary: #{core.token(foreground)},
21
- on-primary: rgba(black, color-emphasis.value(highest)),
22
- text-high: rgba(white, color-emphasis.value(highest)),
23
- text-medium: rgba(white, color-emphasis.value(medium)),
24
- text-low: rgba(white, color-emphasis.value(medium-low)),
25
- outline-high: rgba(white, color-emphasis.value(highest)),
26
- outline-medium: rgba(white, color-emphasis.value(medium)),
27
- outline-low: rgba(white, color-emphasis.value(medium-low))
21
+ theme-foreground: #{core.token(foreground)},
22
+ theme-foreground-muted: rgba(white, color-emphasis.value(medium))
28
23
  )
29
24
  );
25
+
26
+ &:not(.forge-app-bar--scoped) {
27
+ @include theme.provide(
28
+ (
29
+ primary: #{core.token(foreground)},
30
+ on-primary: rgba(black, color-emphasis.value(highest)),
31
+ text-high: rgba(white, color-emphasis.value(highest)),
32
+ text-medium: rgba(white, color-emphasis.value(medium)),
33
+ text-low: rgba(white, color-emphasis.value(medium-low)),
34
+ outline-high: rgba(white, color-emphasis.value(highest)),
35
+ outline-medium: rgba(white, color-emphasis.value(medium)),
36
+ outline-low: rgba(white, color-emphasis.value(medium-low))
37
+ )
38
+ );
39
+ }
30
40
  }
31
41
 
32
42
  .forge-app-bar {
@@ -48,6 +58,16 @@
48
58
  grid-template-areas: 'start end';
49
59
  }
50
60
 
61
+ &--scoped {
62
+ color: inherit;
63
+
64
+ .forge-app-bar__logo,
65
+ .forge-app-bar__title h1,
66
+ .forge-app-bar__logo-title-container {
67
+ color: #{core.token(foreground)};
68
+ }
69
+ }
70
+
51
71
  &--raised {
52
72
  @include core.elevation-raised;
53
73
  }
@@ -79,7 +99,7 @@
79
99
  @include focus-indicator.standalone($type: inward);
80
100
  @include focus-indicator.provide-theme(
81
101
  (
82
- color: currentColor,
102
+ color: #{core.token(foreground)},
83
103
  offset-block: #{spacing.variable(xxsmall)},
84
104
  shape: #{shape.variable(medium)}
85
105
  )
@@ -96,7 +116,7 @@
96
116
  @include state-layer.standalone;
97
117
  @include state-layer.provide-theme(
98
118
  (
99
- color: currentColor
119
+ color: #{core.token(foreground)}
100
120
  )
101
121
  );
102
122
  }
@@ -143,4 +163,14 @@
143
163
  justify-content: end;
144
164
  }
145
165
  }
166
+
167
+ .forge-app-bar-theme {
168
+ color: #{core.token(theme-foreground)};
169
+
170
+ @include focus-indicator.provide-theme(
171
+ (
172
+ color: #{core.token(theme-foreground)}
173
+ )
174
+ );
175
+ }
146
176
  }
@@ -5,9 +5,12 @@
5
5
  */
6
6
  @use './core' as *;
7
7
  @use '../../focus-indicator';
8
+ @use '../app-bar';
8
9
 
9
10
  :host {
10
11
  @include host;
12
+
13
+ color: #{app-bar.token(theme-foreground)};
11
14
  }
12
15
 
13
16
  :host([hidden]) {
@@ -8,6 +8,7 @@
8
8
  @use '../state-layer';
9
9
  @use '../focus-indicator';
10
10
  @use '../circular-progress';
11
+ @use '../app-bar/app-bar';
11
12
  @use '../icon';
12
13
 
13
14
  //
@@ -132,6 +133,29 @@ forge-focus-indicator {
132
133
  @include theme(warning);
133
134
  @include theme(info);
134
135
 
136
+ //
137
+ // App bar theme
138
+ //
139
+
140
+ :host([theme='app-bar']) {
141
+ @include provide-theme(
142
+ (
143
+ text-color: #{app-bar.token(theme-foreground)},
144
+ outlined-color: #{app-bar.token(theme-foreground)},
145
+ outlined-border-color: #{app-bar.token(theme-foreground)},
146
+ link-color: #{app-bar.token(theme-foreground)}
147
+ )
148
+ );
149
+
150
+ forge-focus-indicator {
151
+ @include focus-indicator.provide-theme(
152
+ (
153
+ color: #{app-bar.token(theme-foreground)}
154
+ )
155
+ );
156
+ }
157
+ }
158
+
135
159
  //
136
160
  // Variants
137
161
  //
@@ -5,6 +5,20 @@
5
5
  */
6
6
  @use '../tokens/scrollbar/tokens';
7
7
 
8
+ ///
9
+ /// Gets a CSS custom property declaration for a specific scrollbar token with its token value as the fallback value.
10
+ ///
11
+ /// Example:
12
+ /// ```scss
13
+ /// .my-class {
14
+ /// width: #{scrollbar.variable(width)}; // => width: var(--forge-scrollbar-width, 16px);
15
+ /// }
16
+ /// ```
17
+ ///
18
+ @function variable($key) {
19
+ @return tokens.get($key);
20
+ }
21
+
8
22
  ///
9
23
  /// Provides scrollbar styles.
10
24
  ///
@@ -25,14 +25,8 @@ $tokens: (
25
25
  transition-duration: utils.module-val(app-bar, transition-duration, animation.variable(duration-short4)),
26
26
  transition-timing: utils.module-val(app-bar, transition-timing, animation.variable(easing-standard)),
27
27
  // Scoped theming tokens for app bar children to optionally inherit
28
- theme-primary: utils.module-ref(app-bar, theme-primary, foreground),
29
- theme-on-primary: utils.module-val(app-bar, theme-on-primary, rgba(black, theme.emphasis(highest))),
30
- theme-text-high: utils.module-val(app-bar, theme-text-high, rgba(white, theme.emphasis(highest))),
31
- theme-text-medium: utils.module-val(app-bar, theme-text-medium, rgba(white, theme.emphasis(medium))),
32
- theme-text-low: utils.module-val(app-bar, theme-text-low, rgba(white, theme.emphasis(medium-low))),
33
- theme-outline-high: utils.module-val(app-bar, theme-outline-high, rgba(white, theme.emphasis(highest))),
34
- theme-outline-medium: utils.module-val(app-bar, theme-outline-medium, rgba(white, theme.emphasis(medium))),
35
- theme-outline-low: utils.module-val(app-bar, theme-outline-low, rgba(white, theme.emphasis(medium-low)))
28
+ theme-foreground: utils.module-ref(app-bar, theme-foreground, foreground),
29
+ theme-foreground-muted: utils.module-val(app-bar, theme-foreground-muted, rgba(white, theme.emphasis(medium)))
36
30
  ) !default;
37
31
 
38
32
  @function get($key) {
@@ -10,6 +10,7 @@
10
10
  @use '../focus-indicator';
11
11
  @use '../badge';
12
12
  @use '../circular-progress';
13
+ @use '../app-bar/app-bar';
13
14
 
14
15
  //
15
16
  // Host
@@ -379,16 +380,14 @@ forge-state-layer {
379
380
  @include theme(info);
380
381
 
381
382
  //
382
- // Custom theme for app-bar usage only.
383
+ // App Bar Theme
383
384
  //
384
385
 
385
386
  :host([theme='app-bar']) {
386
- --forge-theme-primary: var(--forge-app-bar-theme-primary);
387
- --forge-theme-on-primary: var(--forge-app-bar-theme-on-primary);
388
- --forge-theme-text-high: var(--forge-app-bar-theme-text-high);
389
- --forge-theme-text-medium: var(--forge-app-bar-theme-text-medium);
390
- --forge-theme-text-low: var(--forge-app-bar-theme-text-low);
391
- --forge-theme-outline-high: var(--forge-app-bar-theme-outline-high);
392
- --forge-theme-outline-medium: var(--forge-app-bar-theme-outline-medium);
393
- --forge-theme-outline-low: var(--forge-app-bar-theme-outline-low);
387
+ @include provide-theme(
388
+ (
389
+ icon-color: #{app-bar.token(theme-foreground)},
390
+ focus-indicator-color: #{app-bar.token(theme-foreground)}
391
+ )
392
+ );
394
393
  }
@@ -18,7 +18,7 @@
18
18
  // The base styles for the `<table>` element.
19
19
  @mixin base {
20
20
  width: 100%;
21
- border-collapse: collapse;
21
+ border-spacing: 0;
22
22
  }
23
23
 
24
24
  // The base styles for the rows of the table.
@@ -4,7 +4,10 @@
4
4
  * License: Apache-2.0
5
5
  */
6
6
  @use './core' as *;
7
+ @use '../../app-bar/app-bar';
7
8
  @use '../../icon-button';
9
+ @use '../tab';
10
+ @use '../../core/styles/theme';
8
11
 
9
12
  //
10
13
  // Host
@@ -112,3 +115,24 @@ forge-icon-button {
112
115
  @include override(justify, flex-end, value);
113
116
  }
114
117
  }
118
+
119
+ //
120
+ // App Bar Theme
121
+ //
122
+
123
+ :host([theme='app-bar']) {
124
+ @include tab.provide-theme(
125
+ (
126
+ active-color: #{app-bar.token(theme-foreground)},
127
+ inactive-color: #{app-bar.token(theme-foreground-muted)}
128
+ )
129
+ );
130
+
131
+ forge-icon-button {
132
+ @include icon-button.provide-theme(
133
+ (
134
+ icon-color: #{app-bar.token(theme-foreground)}
135
+ )
136
+ );
137
+ }
138
+ }